claude: add ucnl-market-memory skill; domain-route obsidian-memory
- Новый skill ucnl-market-memory для репо ucnlmarket/ucnl-market-memory (маркетинг и продажи UCN) - В obsidian-memory добавлено domain routing: личное → obsidian-vault, UCN sales/marketing → ucnl-market-memory - Description обоих skills обновлены для корректного triggering - README верхнего уровня обновлён
This commit is contained in:
@@ -9,8 +9,9 @@ Custom skills for Claude.ai (claude.ai → Settings → Skills).
|
||||
| **bulletproof** | 12-stage adaptive dev workflow (research → deploy). Adapted for Python/Docker/Traefik/MikroTik/embedded stacks, Gitea CI/CD, SonarQube. Based on Bulletproof v5.0 by Artemiy Miller. |
|
||||
| **embedded-firmware-engineer** | Bare-metal & RTOS firmware: ESP32/ESP-IDF, STM32 HAL/LL, Nordic nRF, FreeRTOS, Zephyr. NASA/JPL Power of Ten rules, banned functions, DMA/cache coherence, GPIO policy, watchdog strategy, brown-out testing. |
|
||||
| **my-python-senior** | Senior-level Python engineer for systems, containers, LLM workflows, networking, and file processing. |
|
||||
| **obsidian-memory** | Protocol for using `creator/obsidian-vault` (Gitea repo) as Claude's long-term memory. Vault layout, frontmatter conventions, Gitea REST API mechanics, write-permission boundaries. |
|
||||
| **obsidian-memory** | Protocol for using `creator/obsidian-vault` (Gitea repo) as Claude's long-term memory for the user's **personal** projects (infra, embedded, 1C-consulting, lotus-eletre, etc.). Vault layout, frontmatter conventions, Gitea REST API mechanics, write-permission boundaries, domain routing vs `ucnl-market-memory`. |
|
||||
| **pcb-ai-engineer** | Code-driven schematic & PCB design using Circuit-Synth (Python) → KiCad → Altium. Universal STM-family abstraction with `family → package → pinmap → capabilities` data model. |
|
||||
| **ucnl-market-memory** | Protocol for using `ucnlmarket/ucnl-market-memory` (Gitea repo) as Claude's long-term memory for **UCN marketing and sales** (clients, distributors, leads, trade shows, pricing, uWave/Zima2/uSpeak/USBL product marketing, export deals, regional markets). Multi-user (creator / d.zaitsev / v.vinogradova). `sensitive: true` flag for commercial data. Strict domain routing vs `obsidian-memory`. |
|
||||
|
||||
## Structure
|
||||
|
||||
@@ -37,13 +38,15 @@ claude-skills/
|
||||
│ └── systems.md
|
||||
├── obsidian-memory/
|
||||
│ └── SKILL.md
|
||||
└── pcb-ai-engineer/
|
||||
├── SKILL.md
|
||||
├── main.py
|
||||
├── mcu_core.py
|
||||
├── mcu_db.py
|
||||
├── mcu_peripherals.py
|
||||
└── power.py
|
||||
├── pcb-ai-engineer/
|
||||
│ ├── SKILL.md
|
||||
│ ├── main.py
|
||||
│ ├── mcu_core.py
|
||||
│ ├── mcu_db.py
|
||||
│ ├── mcu_peripherals.py
|
||||
│ └── power.py
|
||||
└── ucnl-market-memory/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: obsidian-memory
|
||||
description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory. Trigger when the user references past work ("my X project", "we decided Y", "remember that..."), asks Claude to remember/save/update/forget something, mentions a project by name (lotus-eletre, uspeak, homework-*, 1c-*, pcb-*, obsidian, claude-skills), or whenever a substantive insight, decision, or fact surfaces that's worth preserving between sessions. Also covers answering non-trivial project questions that benefit from previously stored context. Describes vault layout, frontmatter conventions, Gitea REST API mechanics (read/list/search/create/update), naming rules, and write permissions. Do NOT trigger for simple one-off technical questions or casual chat that doesn't involve the user's ongoing projects or personal context.
|
||||
description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for the user's PERSONAL projects (infrastructure, embedded, 1C-consulting, lotus-eletre, uspeak trademark, homework-*, claude-skills, etc.). Trigger when the user references past work ("my X project", "we decided Y", "remember that..."), asks Claude to remember/save/update/forget something, mentions a personal project by name, or whenever a substantive insight, decision, or fact surfaces that's worth preserving between sessions. Also covers answering non-trivial project questions that benefit from previously stored context. Describes vault layout, frontmatter conventions, Gitea REST API mechanics (read/list/search/create/update), naming rules, and write permissions. Do NOT trigger for simple one-off technical questions or casual chat that doesn't involve the user's ongoing projects or personal context. Do NOT trigger for UCN marketing/sales topics — clients, distributors, leads, trade shows (INNOPROM etc.), pricing/КП, product marketing for uWave/Zima2/uSpeak/USBL product lines, export deals, regional markets — those belong to the separate `ucnl-market-memory` skill and its own vault `ucnlmarket/ucnl-market-memory`.
|
||||
---
|
||||
|
||||
# obsidian-memory
|
||||
@@ -20,6 +20,26 @@ Claude читает и пишет заметки через Gitea REST API.
|
||||
Если ни там, ни там его нет — попросить пользователя один раз в начале,
|
||||
в последующих вызовах использовать.
|
||||
|
||||
## Domain routing — жёсткое правило
|
||||
|
||||
Есть **два независимых vault'а**, каждый под свою область:
|
||||
|
||||
| Домен | Vault | Skill |
|
||||
|---|---|---|
|
||||
| Личное: infra, embedded, 1С-консалтинг не-UCN, lotus-eletre, uspeak-trademark, homework-*, claude-skills, быт | `creator/obsidian-vault` | **этот** (`obsidian-memory`) |
|
||||
| Маркетинг и продажи UCN: клиенты, дистрибьюторы, лиды, выставки, КП, экспорт, продуктовый маркетинг uWave/Zima2/uSpeak/USBL | `ucnlmarket/ucnl-market-memory` | `ucnl-market-memory` |
|
||||
|
||||
Содержимое одного домена **не попадает** во второй vault. Пограничные
|
||||
случаи (например, внедрение 1С для самой UCN как клиента) — спрашивать
|
||||
у пользователя явно, не угадывать. По умолчанию: техническая сторона
|
||||
(BSL-код, архитектура, миграция) → obsidian-vault; коммерческая
|
||||
сторона (стоимость контракта, отношения с заказчиком, внутренние
|
||||
условия) → ucnl-market-memory.
|
||||
|
||||
Если пользователь говорит «запомни что uWave продаётся Mavi Marine
|
||||
за X» — это UCN sales, сюда писать нельзя. Если говорит «на моём
|
||||
Bambu Lab ASA печатается при 260°C» — это личное, не в ucnl-market-memory.
|
||||
|
||||
## Vault layout
|
||||
|
||||
```
|
||||
@@ -281,3 +301,7 @@ curl -sS -X POST -H "Authorization: token $TOKEN" \
|
||||
и не упоминать.
|
||||
- **Честно флагить противоречия** между тем что в vault и что говорит
|
||||
пользователь, не исправляя молча.
|
||||
- **Не трогать чужой домен.** UCN sales/marketing → только в
|
||||
`ucnlmarket/ucnl-market-memory` через skill `ucnl-market-memory`.
|
||||
Никогда не дублировать материалы между vault'ами — это не sync,
|
||||
это один источник истины на домен.
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
---
|
||||
name: ucnl-market-memory
|
||||
description: Protocol for using `ucnlmarket/ucnl-market-memory` (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for MARKETING AND SALES of Лаборатория подводной связи и навигации (UCN / UnaVLab). Trigger when the conversation is about UCN commercial activity — clients, distributors, resellers, leads, trade shows (INNOPROM, Saudi Arabia, India), commercial proposals (КП), pricing and discounts, export deals, product marketing for the product lines uWave / Zima2 / uSpeak / ЮСПИК / USBL / Piket / Otzvuk-NV / Scout, regional markets (India, Saudi Arabia, Middle East, Europe), competitors (Kongsberg HiPAP, Sonardyne, EvoLogics), contracts with Mavi Marine, М.Видео/iSPEAK, trademark coexistence, customs/export licensing. Also trigger when the user mentions UCN-commercial projects by name or asks Claude to "remember", "save", or "recall" anything related to selling UCN products. Describes vault layout, frontmatter conventions, Gitea REST API access, domain-routing rules, and multi-user (Claude + д.зайцев + в.виноградова + creator) collaboration. Do NOT trigger for the user's PERSONAL projects (infrastructure, embedded, 1C-consulting for non-UCN clients, lotus-eletre, personal 3D-printing, etc.) — those belong to the separate `obsidian-memory` skill and its vault `creator/obsidian-vault`. Do NOT trigger for purely technical questions about acoustic-positioning theory unrelated to commercial context.
|
||||
---
|
||||
|
||||
# ucnl-market-memory
|
||||
|
||||
Протокол работы с `ucnlmarket/ucnl-market-memory` как долговременной
|
||||
памятью по маркетингу и продажам Лаборатории подводной связи и навигации
|
||||
(UCN / UnaVLab). Репо — обычный git в Gitea, хранит markdown-заметки
|
||||
с YAML-frontmatter. Claude читает и пишет через Gitea REST API.
|
||||
|
||||
## Where things live
|
||||
|
||||
- **Gitea:** `https://git.h3fq32.golive.ru`
|
||||
- **Repo:** `ucnlmarket/ucnl-market-memory`
|
||||
- **Branch:** `main`
|
||||
- **Visibility:** private (видят только члены org `ucnlmarket`)
|
||||
- **Access:** `bash_tool` + `curl` с `Authorization: token $GITEA_TOKEN`
|
||||
|
||||
Токен должен быть в окружении (`$GITEA_TOKEN`) или в сессионном
|
||||
контексте. Если нет — один раз попросить у пользователя.
|
||||
|
||||
## Пользователи репо
|
||||
|
||||
- **creator** (Артур) — owner org, admin
|
||||
- **d.zaitsev** (Дмитрий Зайцев) — member, write (restricted user)
|
||||
- **v.vinogradova** (Виктория Виноградова) — member, write (restricted user)
|
||||
- **claude** — пишет через токен `creator` или свой сервисный
|
||||
|
||||
**Мульти-пользовательность:** в отличие от `obsidian-vault` (один
|
||||
пользователь), с этим репо могут независимо работать Артур, Дмитрий,
|
||||
Виктория. Поэтому в frontmatter обязательное поле `author` — чтобы
|
||||
понимать кто внёс запись и к кому идти за уточнением.
|
||||
|
||||
## Domain routing — жёсткое правило
|
||||
|
||||
| Домен | Vault | Skill |
|
||||
|---|---|---|
|
||||
| UCN sales/marketing: клиенты, дистрибьюторы, лиды, выставки, КП, экспорт, продуктовый маркетинг | `ucnlmarket/ucnl-market-memory` | **этот** (`ucnl-market-memory`) |
|
||||
| Личное: infra, embedded, 1С-консалтинг не-UCN, lotus-eletre, быт | `creator/obsidian-vault` | `obsidian-memory` |
|
||||
|
||||
Один домен — один источник истины. Не дублировать материалы в оба
|
||||
репо. Пограничные случаи (например, 1С-внедрение для самой UCN) —
|
||||
спрашивать у пользователя, не угадывать.
|
||||
|
||||
## Vault layout
|
||||
|
||||
```
|
||||
memory/
|
||||
├── accounts/ clients/distributors/leads: <slug>.md
|
||||
├── products/ product lines: uwave.md, zima2.md, uspeak.md, usbl-piket.md, …
|
||||
├── campaigns/ campaigns, trade shows: innoprom-ksa-2026.md, …
|
||||
├── markets/ regional markets: india.md, saudi-arabia.md, europe.md, …
|
||||
├── facts.md stable general facts (append-only sections)
|
||||
├── preferences.md team style, tone-of-voice, terminology
|
||||
└── pricing.md pricing, discounts (sensitive: true!)
|
||||
|
||||
insights/ dated observations: YYYY-MM-DD-<slug>.md
|
||||
conversations/ session summaries: YYYY-MM-DD-<slug>.md
|
||||
inbox/ drafts, disputed entries, for review
|
||||
```
|
||||
|
||||
Структура плоская — нет префикса `claude/` как в obsidian-vault,
|
||||
потому что **весь репо — Claude-память**. Здесь нет пользовательских
|
||||
«сырых» папок типа `00-inbox` или `10-projects`.
|
||||
|
||||
### accounts/ vs markets/
|
||||
|
||||
- **accounts/** — про конкретную компанию (Mavi Marine, М.Видео, Elcom):
|
||||
имя, контакты, история отношений, этапы сделок.
|
||||
- **markets/** — про регион/страну/сегмент (India, Saudi Arabia,
|
||||
European offshore): нормы, пошлины, каналы, общие тренды конкуренции.
|
||||
|
||||
## Frontmatter
|
||||
|
||||
```yaml
|
||||
---
|
||||
type: account | product | campaign | market | insight | conversation | fact | preference
|
||||
slug: <kebab-case-id> # = имя файла без .md
|
||||
account: <slug> # опц., ссылка на accounts/<slug>.md
|
||||
product: <slug> # опц., ссылка на products/<slug>.md
|
||||
market: <slug> # опц., ссылка на markets/<slug>.md
|
||||
campaign: <slug> # опц., ссылка на campaigns/<slug>.md
|
||||
tags: [<tag1>, <tag2>] # свободная форма, kebab-case
|
||||
author: claude | d.zaitsev | v.vinogradova | creator
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
relevance: 0.0-1.0
|
||||
confidence: low | medium | high
|
||||
stage: lead | qualified | proposal | won | lost | closed # для accounts, опц.
|
||||
private: false # true → не цитировать в ответах
|
||||
sensitive: false # true → не передавать во внешние API, не экспортировать
|
||||
sources:
|
||||
- conversation: 2026-04-20-<slug>
|
||||
- email: <msg-id>
|
||||
- url: https://…
|
||||
---
|
||||
```
|
||||
|
||||
### `private: true`
|
||||
|
||||
Читать для контекста можно — в ответах не цитировать, наличие заметки
|
||||
не упоминать.
|
||||
|
||||
### `sensitive: true`
|
||||
|
||||
**Сильнее private.** Содержимое таких заметок:
|
||||
- Не передавать во внешние API (web search, AI-ассистенты других вендоров).
|
||||
- Не включать в экспорты и сводки за пределы команды.
|
||||
- Не цитировать в query к web_search — перефразировать без конкретики.
|
||||
- Применяется к: прайсам, схемам скидок, маржи, условиям контрактов,
|
||||
ИНН/паспортным данным контрагентов, внутренним конкурентным
|
||||
наблюдениям, переговорным позициям.
|
||||
|
||||
## Protocol
|
||||
|
||||
### 1. В начале разговора по UCN sales/marketing
|
||||
|
||||
1. **Content-поиск** по vault:
|
||||
```
|
||||
GET /api/v1/repos/ucnlmarket/ucnl-market-memory/search?q=<keyword>&type=code
|
||||
```
|
||||
2. **Листинг** релевантной папки (`accounts/`, `products/`, `campaigns/`,
|
||||
`markets/`) по имени упомянутой сущности.
|
||||
3. **Читаем top 3–5** релевантных заметок. Приоритет: явный slug-match,
|
||||
свежесть `updated`, высокий `relevance`. Исключить `private: true`
|
||||
из цитирования.
|
||||
4. **Использовать контекст** естественно, без «я нашёл заметку…».
|
||||
|
||||
### 2. Когда НЕ искать
|
||||
|
||||
- Общетеоретические вопросы об акустике/позиционировании без привязки
|
||||
к коммерции — это через `obsidian-memory` или из общих знаний.
|
||||
- Одноразовые справочные вопросы.
|
||||
- Пользователь сам дал весь контекст в сообщении.
|
||||
|
||||
### 3. В процессе разговора
|
||||
|
||||
- `[[wiki-links]]` на существующие заметки при упоминании сущностей.
|
||||
- Противоречия между vault и репликой пользователя — флагить явно,
|
||||
не исправлять тихо.
|
||||
- Если инфо пришло от `v.vinogradova` (записи с `author: v.vinogradova`),
|
||||
а сейчас диалог с `creator` — можно упомянуть источник при необходимости
|
||||
(«по заметке Виктории от DATE, …»).
|
||||
|
||||
### 4. В конце разговора — что и куда сохранять
|
||||
|
||||
| Что | Куда |
|
||||
|---|---|
|
||||
| Наблюдение про конкретного клиента | `memory/accounts/<slug>.md` (обновить) или `insights/YYYY-MM-DD-<slug>.md` (разовое) |
|
||||
| Новая позиция в продуктовой линейке | `memory/products/<slug>.md` |
|
||||
| Запуск кампании, участие в выставке | `memory/campaigns/<slug>.md` |
|
||||
| Сдвиг в региональном рынке | `memory/markets/<slug>.md` |
|
||||
| Изменение в прайсе / скидках | `memory/pricing.md` (помнить про `sensitive: true`) |
|
||||
| Новое предпочтение по стилю/терминологии | `memory/preferences.md` |
|
||||
| Стабильный факт общего характера | `memory/facts.md` (append в секцию) |
|
||||
| Выжимка сессии | `conversations/YYYY-MM-DD-<slug>.md` |
|
||||
| Сомневаюсь куда | `inbox/` + явная пометка пользователю |
|
||||
|
||||
**Критерий записи:** «если через полгода другой Claude прочитает — даст
|
||||
ли это ему что-то полезное?». Если нет — не писать.
|
||||
|
||||
## Gitea REST API — шпаргалка
|
||||
|
||||
```bash
|
||||
GITEA=https://git.h3fq32.golive.ru
|
||||
REPO=ucnlmarket/ucnl-market-memory
|
||||
TOKEN=$GITEA_TOKEN
|
||||
|
||||
# ── READ ────────────────────────────────────────────────────────────────
|
||||
|
||||
curl -sS -H "Authorization: token $TOKEN" \
|
||||
"$GITEA/api/v1/repos/$REPO/raw/memory/accounts/mavi-marine.md"
|
||||
|
||||
curl -sS -H "Authorization: token $TOKEN" \
|
||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts?ref=main"
|
||||
|
||||
curl -sS -H "Authorization: token $TOKEN" \
|
||||
"$GITEA/api/v1/repos/$REPO/search?q=mumbai+uwave&type=code"
|
||||
|
||||
curl -sS -H "Authorization: token $TOKEN" \
|
||||
"$GITEA/api/v1/repos/$REPO/git/trees/main?recursive=true"
|
||||
|
||||
# ── WRITE (create) ──────────────────────────────────────────────────────
|
||||
|
||||
content_b64=$(base64 -w0 /tmp/note.md)
|
||||
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/new-lead.md" \
|
||||
-d "{\"message\":\"claude: добавил лид из Мумбая\",\"content\":\"$content_b64\",\"branch\":\"main\"}"
|
||||
|
||||
# ── WRITE (update) ──────────────────────────────────────────────────────
|
||||
|
||||
sha=$(curl -sS -H "Authorization: token $TOKEN" \
|
||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/mavi-marine.md?ref=main" \
|
||||
| python3 -c "import sys,json; print(json.load(sys.stdin)['sha'])")
|
||||
content_b64=$(base64 -w0 /tmp/mavi-new.md)
|
||||
curl -sS -X PUT -H "Authorization: token $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/mavi-marine.md" \
|
||||
-d "{\"message\":\"claude: обновил mavi-marine — PO подтверждён\",\"content\":\"$content_b64\",\"sha\":\"$sha\",\"branch\":\"main\"}"
|
||||
|
||||
# ── WRITE (batch) ───────────────────────────────────────────────────────
|
||||
|
||||
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
"$GITEA/api/v1/repos/$REPO/contents" \
|
||||
-d '{
|
||||
"branch": "main",
|
||||
"message": "claude: session summary — INNOPROM KSA",
|
||||
"files": [
|
||||
{"operation":"create","path":"conversations/2026-04-20-innoprom-ksa.md","content":"<b64>"},
|
||||
{"operation":"update","path":"memory/campaigns/innoprom-ksa-2026.md","content":"<b64>","sha":"<prev>"}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
## Gotchas
|
||||
|
||||
1. **`content`, не `content_base64`.** В `POST /contents` и batch —
|
||||
поле именно `content`. Иначе файл нулевого размера.
|
||||
2. **URL-encode путей.** Кириллица/пробелы → percent-encode.
|
||||
3. **`PUT` требует `sha` текущей версии.** Забыл — 409 Conflict.
|
||||
4. **Ветка `main` существует с первого коммита** (репо был инициализирован
|
||||
с `auto_init: true`).
|
||||
5. **Rate limit.** Batch лучше N одиночных запросов — один коммит
|
||||
в истории, дешевле по HTTP.
|
||||
6. **`sensitive: true` + web_search.** Не класть конкретику из
|
||||
sensitive-заметки в поисковый запрос. Перефразировать.
|
||||
|
||||
## Commit messages
|
||||
|
||||
Префикс `claude:` для всех коммитов Claude:
|
||||
- `claude: save <тема>` — новая заметка
|
||||
- `claude: update <путь> — <что>` — правка
|
||||
- `claude: merge <откуда> → <куда>` — переорганизация
|
||||
|
||||
## Naming
|
||||
|
||||
- ASCII-kebab-case. Кириллица → транслит или англ.: `мави-марин` → `mavi-marine`.
|
||||
- `YYYY-MM-DD-<slug>.md` для `insights/`, `conversations/`.
|
||||
- slug в `accounts/` = однозначный short name компании.
|
||||
- slug в `products/` = внутреннее имя продуктовой линейки (uwave, zima2, uspeak).
|
||||
- slug в `markets/` = ISO-сокращение или общепринятое имя (india, ksa, uae, eu).
|
||||
|
||||
## Boundaries
|
||||
|
||||
- **Не трогать `creator/obsidian-vault`** — это другой домен, другой skill.
|
||||
- **Не дублировать** материалы между репо. Один источник истины на тему.
|
||||
- **Не цитировать `private: true`** в ответах.
|
||||
- **Не передавать `sensitive: true`** во внешние API.
|
||||
- **Не удалять файлы без явной команды пользователя.** Устаревшее —
|
||||
`private: true` или перенести в `inbox/` с пометкой.
|
||||
- **Честно флагить противоречия** между памятью и тем что говорит
|
||||
пользователь сейчас.
|
||||
- **Respect multi-user:** если запись сделал другой член команды
|
||||
(`author: v.vinogradova`) — не переписывать её силой, можно добавить
|
||||
свою заметку рядом или в `inbox/` с предложением.
|
||||
Reference in New Issue
Block a user