From 8213ff750a98fecf1ca36e5b10ec3c7c8684b1a8 Mon Sep 17 00:00:00 2001 From: creator Date: Mon, 20 Apr 2026 14:10:04 +0300 Subject: [PATCH] claude: sync ucnl-market-memory and obsidian-memory skills - rewrite ucnl-market-memory/SKILL.md with final layout (accounts/products/campaigns/markets + insights/conversations/inbox), extended frontmatter (sensitive flag), domain routing table with border examples - refresh obsidian-memory/SKILL.md with the same domain-routing section placed at top, matching examples, and updated description with negative trigger --- obsidian-memory/SKILL.md | 63 ++++---- ucnl-market-memory/SKILL.md | 295 +++++++++++++++++++----------------- 2 files changed, 187 insertions(+), 171 deletions(-) diff --git a/obsidian-memory/SKILL.md b/obsidian-memory/SKILL.md index e603e40..0e59feb 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 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`. +description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for personal and R&D projects of Arthur Abelentsev. 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-trademark, homework-*, 1c-, pcb-*, obsidian, claude-skills), or whenever a substantive insight, decision, or fact surfaces that's worth preserving between sessions. Covers personal context, infrastructure (gitea/traefik/mikrotik/xray), embedded firmware, PCB design, 1C consulting for any client, R&D on UCN products (acoustics, firmware, algorithms), legal/trademark work, travel, vehicle/hardware, and general life. 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. Do NOT trigger for UCN marketing/sales commercial work (clients, distributors, quotes, exhibitions, pricing, product marketing for uWave/Zima2/uSpeak) — that is handled by a separate ucnl-market-memory skill and a separate repo (ucnlmarket/ucnl-market-memory). --- # obsidian-memory @@ -9,6 +9,32 @@ description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.gol Vault — обычный git-репо в Gitea, хранит markdown-заметки с YAML-frontmatter. Claude читает и пишет заметки через Gitea REST API. +## Разграничение доменов — прочитать первым + +У пользователя **два репо памяти** с жёстким разделением: + +| Домен | Репо | Скилл | +|---|---|---| +| Личные проекты Артура, инфраструктура, embedded, 1С-консалтинг (любые клиенты), R&D по UCN-продуктам, legal/trademark, быт | `creator/obsidian-vault` | **этот скилл** | +| Маркетинг и продажи UCN (клиенты, дистрибьюторы, выставки, КП, экспорт, product marketing uWave/Zima2/uSpeak/USBL) | `ucnlmarket/ucnl-market-memory` | `ucnl-market-memory` | + +**Правило жёсткое:** материалы из одного домена НЕ попадают в репо +другого. Если тема пограничная — спросить пользователя, не додумывать. + +**Примеры границы:** + +| Запрос | Куда | +|---|---| +| «Прошивка uWave — обновить через STM32CubeProg» | R&D → **этот скилл** | +| «Письмо Mavi Marine по срокам поставки» | sales UCN → `ucnl-market-memory` | +| «Расчёт TDOA для uWave USBL» | R&D/алгоритмы → **этот скилл** | +| «Слайд для INNOPROM KSA 2026» | маркетинг UCN → `ucnl-market-memory` | +| «ТЗ на 1С для Teplovin» | 1С не-UCN → **этот скилл** | +| «Скидка дистрибьютору X» | sales UCN → `ucnl-market-memory` | + +«UCN как клиент внутреннего 1С-проекта» — дефолт этот скилл (технический +слой), но с коммерческой частью (бюджет, контракт) — уточнить. + ## Where things live - **Gitea:** `https://git.h3fq32.golive.ru` @@ -20,26 +46,6 @@ 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 ``` @@ -134,7 +140,9 @@ sources: # опционально: откуда знание Если разговор касается проекта/системы/темы, по которым у пользователя может быть накопленный контекст: -1. **Поиск по теме.** Content-поиск по vault через API: +1. **Проверить домен.** Если это маркетинг/продажи UCN — СТОП, + переключиться на `ucnl-market-memory` skill. +2. **Поиск по теме.** Content-поиск по vault через API: ``` GET /api/v1/repos/creator/obsidian-vault/search?q=&type=code ``` @@ -143,10 +151,10 @@ sources: # опционально: откуда знание ``` GET /api/v1/repos/creator/obsidian-vault/contents/claude/memory/projects ``` -2. **Читаем top-3..5 самых релевантных.** Приоритет: свежесть (`updated`), +3. **Читаем top-3..5 самых релевантных.** Приоритет: свежесть (`updated`), явный `project` match, высокий `relevance`. Исключить `private: true` из ответов (но прочитать можно). -3. **Использовать контекст** в ответе естественно, без меты про «я +4. **Использовать контекст** в ответе естественно, без меты про «я нашёл заметку...». ### 2. Когда НЕ искать @@ -156,6 +164,7 @@ sources: # опционально: откуда знание - Разговорная болтовня, приветствия - Одноразовые операции - Вопросы, где пользователь сам дал весь нужный контекст в сообщении +- Темы маркетинга/продаж UCN — это не сюда ### 3. В процессе разговора @@ -301,7 +310,5 @@ curl -sS -X POST -H "Authorization: token $TOKEN" \ и не упоминать. - **Честно флагить противоречия** между тем что в vault и что говорит пользователь, не исправляя молча. -- **Не трогать чужой домен.** UCN sales/marketing → только в - `ucnlmarket/ucnl-market-memory` через skill `ucnl-market-memory`. - Никогда не дублировать материалы между vault'ами — это не sync, - это один источник истины на домен. +- **Не писать в `ucnlmarket/ucnl-market-memory` из этого контекста.** + Если тема всплыла UCN-sales — переключиться на `ucnl-market-memory` skill. diff --git a/ucnl-market-memory/SKILL.md b/ucnl-market-memory/SKILL.md index 46d0c51..0ad6e48 100644 --- a/ucnl-market-memory/SKILL.md +++ b/ucnl-market-memory/SKILL.md @@ -1,14 +1,42 @@ --- 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. +description: Protocol for using ucnlmarket/ucnl-market-memory (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for marketing and sales projects of Laboratory of Underwater Communication and Navigation (UCN / UnaVLab). Trigger when the conversation is about UCN commercial matters — clients, distributors, leads, RFQs, quotes (КП), export deals, exhibitions/trade shows (INNOPROM, Oceanology, etc.), product marketing for uWave / Zima2 / uSpeak / USBL / Piket / Scout, pricing and discount schemes, market analysis (India, Saudi Arabia, Europe, ME), competitor positioning (HiPAP, Sonardyne, EvoLogics, iXblue), trademark/brand work tied to commercial use (iSPEAK, uSpeak), distribution channels, or any sales/marketing insight about UCN products. Also trigger on mentions of ucnlmarket org, ucnl-market-memory repo, or team members Dmitry Zaitsev (d.zaitsev) / Victoria Vinogradova (v.vinogradova) in commercial context. Do NOT trigger for: technical/engineering work on UCN products (firmware, acoustics, R&D), personal projects, infrastructure, 1C consulting for non-UCN clients, or casual chat — those go through obsidian-memory skill or require no memory lookup. --- # ucnl-market-memory Протокол работы с `ucnlmarket/ucnl-market-memory` как долговременной -памятью по маркетингу и продажам Лаборатории подводной связи и навигации -(UCN / UnaVLab). Репо — обычный git в Gitea, хранит markdown-заметки -с YAML-frontmatter. Claude читает и пишет через Gitea REST API. +памятью для всего что касается **маркетинга и продаж UCN / UnaVLab**. + +Репо — обычный git в Gitea, хранит markdown-заметки с YAML-frontmatter. +Claude читает и пишет через Gitea REST API. Два человека — Дмитрий +Зайцев (`d.zaitsev`) и Виктория Виноградова (`v.vinogradova`) — также +работают с репо напрямую через web UI и git. + +## Разграничение доменов — критично + +У пользователя **два репо памяти** с жёстким разделением: + +| Домен | Репо | Скилл | +|---|---|---| +| Маркетинг и продажи UCN (клиенты, дистрибьюторы, выставки, КП, экспорт, product marketing uWave/Zima2/uSpeak/USBL) | `ucnlmarket/ucnl-market-memory` | **этот скилл** | +| Личные проекты Артура, инфраструктура, embedded, 1С-консалтинг, R&D по UCN-продуктам, прочее | `creator/obsidian-vault` | `obsidian-memory` | + +**Правило жёсткое:** материалы из одного домена НЕ попадают в репо +другого. Если тема пограничная (1С-внедрение в UCN как клиенте, где +есть и коммерческий, и технический аспект) — спросить пользователя, +не додумывать. + +**Примеры границы:** + +| Запрос | Куда | +|---|---| +| «Напиши письмо Mavi Marine по поводу сроков поставки» | sales → этот скилл | +| «Прошивка uWave — как обновить через STM32CubeProg» | R&D → `obsidian-memory` | +| «Подготовь слайд для INNOPROM KSA 2026» | маркетинг → этот скилл | +| «Расчёт TDOA для uWave USBL» | R&D/алгоритмы → `obsidian-memory` | +| «ТЗ на 1С-внедрение для Teplovin» | 1С-консалтинг не-UCN → `obsidian-memory` | +| «Скидка дистрибьютору X на линейку Y» | sales → этот скилл (вероятно `sensitive: true`) | ## Where things live @@ -18,79 +46,56 @@ description: Protocol for using `ucnlmarket/ucnl-market-memory` (Gitea repo at h - **Visibility:** private (видят только члены org `ucnlmarket`) - **Access:** `bash_tool` + `curl` с `Authorization: token $GITEA_TOKEN` -Токен должен быть в окружении (`$GITEA_TOKEN`) или в сессионном -контексте. Если нет — один раз попросить у пользователя. +Токен — тот же что для `obsidian-memory` (он от пользователя `creator` +со scope `write:repository`, доступа к этому приватному репо хватает, +т.к. `creator` — owner организации). -## Пользователи репо - -- **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 +## Repo 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!) +├── accounts/ клиенты, дистрибьюторы, лиды — .md +├── products/ продуктовые линейки (uwave, zima2, uspeak, usbl, …) +├── campaigns/ маркетинговые активности, выставки +├── markets/ региональные рынки (india, saudi-arabia, europe) +├── facts.md стабильные факты (append-only секциями) +├── preferences.md стиль КП, tone of voice, терминология +└── pricing.md прайсы, скидки, Incoterms (sensitive: true) -insights/ dated observations: YYYY-MM-DD-.md -conversations/ session summaries: YYYY-MM-DD-.md -inbox/ drafts, disputed entries, for review +insights/ YYYY-MM-DD-.md — датированные наблюдения +conversations/ YYYY-MM-DD-.md — выжимки сессий +inbox/ черновики и спорные записи на ревью ``` -Структура плоская — нет префикса `claude/` как в obsidian-vault, -потому что **весь репо — Claude-память**. Здесь нет пользовательских -«сырых» папок типа `00-inbox` или `10-projects`. +**Принцип `accounts` vs `markets`:** +- `accounts/` — конкретная компания (есть имя, ИНН/ID, контакты, история). +- `markets/` — регион/страна/сегмент (India, Saudi Arabia, offshore-Europe) — + нормы, законы, пошлины, конкуренты, предпочитаемые каналы. -### accounts/ vs markets/ - -- **accounts/** — про конкретную компанию (Mavi Marine, М.Видео, Elcom): - имя, контакты, история отношений, этапы сделок. -- **markets/** — про регион/страну/сегмент (India, Saudi Arabia, - European offshore): нормы, пошлины, каналы, общие тренды конкуренции. +**Принцип `campaigns` vs `insights`:** +- `campaigns/` — запланированная/идущая активность с целями и ресурсами. +- `insights/` — разовое наблюдение (услышали на выставке; конкурент + выпустил Y; клиент отказался по причине Z). ## Frontmatter ```yaml --- type: account | product | campaign | market | insight | conversation | fact | preference -slug: # = имя файла без .md -account: # опц., ссылка на accounts/.md -product: # опц., ссылка на products/.md +slug: # совпадает с именем файла без .md +account: # опц., ссылка на accounts/.md +product: # опц., ссылка на products/.md market: # опц., ссылка на markets/.md -campaign: # опц., ссылка на campaigns/.md -tags: [, ] # свободная форма, kebab-case +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 +relevance: 0.0-1.0 # важность для ранжирования confidence: low | medium | high -stage: lead | qualified | proposal | won | lost | closed # для accounts, опц. -private: false # true → не цитировать в ответах -sensitive: false # true → не передавать во внешние API, не экспортировать +stage: lead | qualified | proposal | won | lost | closed # для accounts, опц. +private: false # true → не цитировать, не упоминать +sensitive: false # true → не во внешние API, не в экспорты sources: - conversation: 2026-04-20- - email: @@ -98,68 +103,64 @@ sources: --- ``` -### `private: true` +**`private: true`** — читать для контекста можно, в ответах не цитировать, +не упоминать о наличии. -Читать для контекста можно — в ответах не цитировать, наличие заметки -не упоминать. - -### `sensitive: true` - -**Сильнее private.** Содержимое таких заметок: -- Не передавать во внешние API (web search, AI-ассистенты других вендоров). -- Не включать в экспорты и сводки за пределы команды. -- Не цитировать в query к web_search — перефразировать без конкретики. -- Применяется к: прайсам, схемам скидок, маржи, условиям контрактов, - ИНН/паспортным данным контрагентов, внутренним конкурентным - наблюдениям, переговорным позициям. +**`sensitive: true`** — сильнее: не передавать содержимое во внешние API +(web_search, AI-ассистенты сторонних вендоров), не включать в экспорты, +не показывать людям без явной проверки. Применяется к коммерческой +конфиденциальной информации (скидки, маржа, закрытые условия). ## Protocol -### 1. В начале разговора по UCN sales/marketing +### 1. В начале разговора по маркетингу/продажам UCN -1. **Content-поиск** по vault: +1. **Content-поиск** по репо: ``` GET /api/v1/repos/ucnlmarket/ucnl-market-memory/search?q=&type=code ``` -2. **Листинг** релевантной папки (`accounts/`, `products/`, `campaigns/`, - `markets/`) по имени упомянутой сущности. -3. **Читаем top 3–5** релевантных заметок. Приоритет: явный slug-match, +2. **Листинг релевантной папки** (accounts/products/campaigns/markets) + по имени упомянутой сущности. +3. **Читаем top 3–5** самых релевантных. Приоритет: явный match по slug, свежесть `updated`, высокий `relevance`. Исключить `private: true` - из цитирования. -4. **Использовать контекст** естественно, без «я нашёл заметку…». + из ответов. +4. **Использовать контекст** естественно, без мета-комментариев + «я нашёл заметку…». ### 2. Когда НЕ искать -- Общетеоретические вопросы об акустике/позиционировании без привязки - к коммерции — это через `obsidian-memory` или из общих знаний. -- Одноразовые справочные вопросы. -- Пользователь сам дал весь контекст в сообщении. +- Одноразовые справочные вопросы без контекста клиента/продукта. +- Технические/R&D вопросы по UCN-продуктам — это `obsidian-memory`. +- Разговоры где пользователь сам дал весь нужный контекст в сообщении. -### 3. В процессе разговора +### 3. В процессе -- `[[wiki-links]]` на существующие заметки при упоминании сущностей. -- Противоречия между vault и репликой пользователя — флагить явно, - не исправлять тихо. -- Если инфо пришло от `v.vinogradova` (записи с `author: v.vinogradova`), - а сейчас диалог с `creator` — можно упомянуть источник при необходимости - («по заметке Виктории от DATE, …»). +- При упоминании сущностей, имеющих свою заметку — `[[wiki-links]]` + в новых заметках (пригодится для Obsidian-навигации). +- Противоречия «память ↔ текущее сообщение» — честно флагить, не тихо + исправлять. +- Обращать внимание на автора последней записи: `d.zaitsev` и + `v.vinogradova` — живые коллеги, у них свой фронт работ; Claude + не переписывает их заметки молча, лучше дополнить отдельной записью + со ссылкой. ### 4. В конце разговора — что и куда сохранять -| Что | Куда | +| Что появилось | Куда | |---|---| -| Наблюдение про конкретного клиента | `memory/accounts/.md` (обновить) или `insights/YYYY-MM-DD-.md` (разовое) | +| Значимое про конкретного клиента | `memory/accounts/.md` (update) или `insights/YYYY-MM-DD-.md` | | Новая позиция в продуктовой линейке | `memory/products/.md` | -| Запуск кампании, участие в выставке | `memory/campaigns/.md` | -| Сдвиг в региональном рынке | `memory/markets/.md` | -| Изменение в прайсе / скидках | `memory/pricing.md` (помнить про `sensitive: true`) | -| Новое предпочтение по стилю/терминологии | `memory/preferences.md` | +| Запуск кампании / выставка | `memory/campaigns/.md` | +| Изменения на региональном рынке | `memory/markets/.md` | +| Изменение в прайсе | `memory/pricing.md` (sensitive!) | +| Предпочтение команды | `memory/preferences.md` | | Стабильный факт общего характера | `memory/facts.md` (append в секцию) | -| Выжимка сессии | `conversations/YYYY-MM-DD-.md` | +| Выжимка беседы | `conversations/YYYY-MM-DD-.md` | | Сомневаюсь куда | `inbox/` + явная пометка пользователю | -**Критерий записи:** «если через полгода другой Claude прочитает — даст -ли это ему что-то полезное?». Если нет — не писать. +**Не писать ради галочки.** Лучше 0 файлов, чем пять пустословных. +Критерий: «если через полгода Claude или Дмитрий/Виктория прочитают +эту заметку — даст ли она что-то?». ## Gitea REST API — шпаргалка @@ -168,92 +169,100 @@ GITEA=https://git.h3fq32.golive.ru REPO=ucnlmarket/ucnl-market-memory TOKEN=$GITEA_TOKEN -# ── READ ──────────────────────────────────────────────────────────────── +# ── READ ──────────────────────────────────────────────────────────── +# Файл (raw) 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" + "$GITEA/api/v1/repos/$REPO/search?q=mumbai+usbl&type=code" +# Tree (целиком) curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/git/trees/main?recursive=true" -# ── WRITE (create) ────────────────────────────────────────────────────── +# ── WRITE ─────────────────────────────────────────────────────────── +# Create (POST). Поле "content" (не content_base64!) 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) ────────────────────────────────────────────────────── + "$GITEA/api/v1/repos/$REPO/contents/memory/accounts/new.md" \ + -d "{\"message\":\"claude: save — new lead\",\"content\":\"$content_b64\",\"branch\":\"main\"}" +# Update (PUT, нужен sha) sha=$(curl -sS -H "Authorization: token $TOKEN" \ - "$GITEA/api/v1/repos/$REPO/contents/memory/accounts/mavi-marine.md?ref=main" \ + "$GITEA/api/v1/repos/$REPO/contents/memory/facts.md?ref=main" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['sha'])") -content_b64=$(base64 -w0 /tmp/mavi-new.md) +content_b64=$(base64 -w0 /tmp/facts-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) ─────────────────────────────────────────────────────── + "$GITEA/api/v1/repos/$REPO/contents/memory/facts.md" \ + -d "{\"message\":\"claude: update facts\",\"content\":\"$content_b64\",\"sha\":\"$sha\",\"branch\":\"main\"}" +# 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", + "message": "claude: session — mavi RFQ update", "files": [ - {"operation":"create","path":"conversations/2026-04-20-innoprom-ksa.md","content":""}, - {"operation":"update","path":"memory/campaigns/innoprom-ksa-2026.md","content":"","sha":""} + {"operation":"create","path":"conversations/2026-04-20-mavi-rfq.md","content":""}, + {"operation":"update","path":"memory/accounts/mavi-marine.md","content":"","sha":""} ] }' ``` -## Gotchas +## Gotchas (общие с obsidian-memory, напомним) -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-заметки в поисковый запрос. Перефразировать. +1. **`content`, не `content_base64`.** Иначе файл нулевого размера. +2. **URL-encode путей** с пробелами/кириллицей. +3. **`PUT` требует `sha`** текущей версии файла. +4. **`sensitive: true` — не подсвечивать во внешних поисках.** Если + Claude собирается делать web_search на основе данных из sensitive- + заметки (например, искать что-то по номенклатуре цены) — формулировать + запросы так, чтобы не утекали конкретные цифры и условия. -## Commit messages +## Commit message format -Префикс `claude:` для всех коммитов Claude: +Префикс `claude:` для коммитов Claude: - `claude: save <тема>` — новая заметка - `claude: update <путь> — <что>` — правка - `claude: merge <откуда> → <куда>` — переорганизация +Позволяет Дмитрию и Виктории фильтровать изменения от Claude +(`git log --grep "^claude:"`). + ## 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). +- Всё ASCII-kebab-case. Русские имена → транслит или англ.: `мави-марин` → `mavi-marine`. +- `YYYY-MM-DD-.md` для датированных (insights/, conversations/). +- slug в `accounts/` = официальное short name компании, однозначно. +- Slug продукта = продуктовый код UCN: `uwave`, `zima2`, `uspeak`, не `usbl-system-v2`. ## Boundaries -- **Не трогать `creator/obsidian-vault`** — это другой домен, другой skill. -- **Не дублировать** материалы между репо. Один источник истины на тему. -- **Не цитировать `private: true`** в ответах. -- **Не передавать `sensitive: true`** во внешние API. -- **Не удалять файлы без явной команды пользователя.** Устаревшее — - `private: true` или перенести в `inbox/` с пометкой. -- **Честно флагить противоречия** между памятью и тем что говорит - пользователь сейчас. -- **Respect multi-user:** если запись сделал другой член команды - (`author: v.vinogradova`) — не переписывать её силой, можно добавить - свою заметку рядом или в `inbox/` с предложением. +- **Не писать в `obsidian-vault` из этого контекста.** Если тема явно + про R&D/embedded/инфраструктуру — сказать пользователю и переключиться + (или спросить). +- **Не удалять чужие заметки.** Если есть сомнение в актуальности — + `private: true` или обсудить. +- **Не обходить `sensitive: true`.** Не цитировать наружу, не включать + в материалы для третьих сторон. +- **Конфликты между заметками `d.zaitsev` и `v.vinogradova`** — флагить + пользователю, не разруливать самостоятельно. + +## Контакты команды + +- **Дмитрий Зайцев** (`d.zaitsev`, d.zaitsev@unavlab.com) — член команды + `members`, write-доступ. +- **Виктория Виноградова** (`v.vinogradova`, v.vinogradova@unavlab.com) — + член команды `members`, write-доступ. +- **Артур (`creator`)** — owner организации `ucnlmarket`, admin.