From 9a2414def341d4af95c9459d4fadf101af8def33 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 20 Apr 2026 11:07:04 +0000 Subject: [PATCH] claude: add ucnl-market-memory skill; domain-route obsidian-memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Новый 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 верхнего уровня обновлён --- README.md | 19 +-- obsidian-memory/SKILL.md | 26 +++- ucnl-market-memory/SKILL.md | 259 ++++++++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+), 9 deletions(-) create mode 100644 ucnl-market-memory/SKILL.md diff --git a/README.md b/README.md index 0f1c7b3..378fccf 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/obsidian-memory/SKILL.md b/obsidian-memory/SKILL.md index 6875ab2..e603e40 100644 --- a/obsidian-memory/SKILL.md +++ b/obsidian-memory/SKILL.md @@ -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, + это один источник истины на домен. diff --git a/ucnl-market-memory/SKILL.md b/ucnl-market-memory/SKILL.md new file mode 100644 index 0000000..46d0c51 --- /dev/null +++ b/ucnl-market-memory/SKILL.md @@ -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: .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-.md +conversations/ session summaries: YYYY-MM-DD-.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: # = имя файла без .md +account: # опц., ссылка на accounts/.md +product: # опц., ссылка на products/.md +market: # опц., ссылка на markets/.md +campaign: # опц., ссылка на campaigns/.md +tags: [, ] # свободная форма, 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- + - email: + - 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=&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/.md` (обновить) или `insights/YYYY-MM-DD-.md` (разовое) | +| Новая позиция в продуктовой линейке | `memory/products/.md` | +| Запуск кампании, участие в выставке | `memory/campaigns/.md` | +| Сдвиг в региональном рынке | `memory/markets/.md` | +| Изменение в прайсе / скидках | `memory/pricing.md` (помнить про `sensitive: true`) | +| Новое предпочтение по стилю/терминологии | `memory/preferences.md` | +| Стабильный факт общего характера | `memory/facts.md` (append в секцию) | +| Выжимка сессии | `conversations/YYYY-MM-DD-.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":""}, + {"operation":"update","path":"memory/campaigns/innoprom-ksa-2026.md","content":"","sha":""} + ] + }' +``` + +## 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-.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/` с предложением.