Compare commits
6 Commits
e31921b7a7
...
805077902d
| Author | SHA1 | Date | |
|---|---|---|---|
| 805077902d | |||
| 0ed7060116 | |||
| 3806b0407b | |||
| dc2cd0e522 | |||
| a1f12fcdd4 | |||
| aabf8da806 |
@@ -12,7 +12,7 @@ The `wiki-maintainer` skill enforces the workflow and file formats. This file ov
|
|||||||
- `entities/` — discrete things this project tracks. Reserved for future use (individual skills if they accumulate non-obvious context, tools we adopt).
|
- `entities/` — discrete things this project tracks. Reserved for future use (individual skills if they accumulate non-obvious context, tools we adopt).
|
||||||
- `concepts/` — design decisions, technical gotchas, refactor notes. Most pages live here.
|
- `concepts/` — design decisions, technical gotchas, refactor notes. Most pages live here.
|
||||||
- `packages/` — currently empty. Would be used if we extract a package (e.g. a CLI) from this repo.
|
- `packages/` — currently empty. Would be used if we extract a package (e.g. a CLI) from this repo.
|
||||||
- `sources/` — one summary per ingested external doc; carries `ingested:` and `raw_path:` frontmatter.
|
- `summaries/` — one summary per ingested external doc; carries `ingested:` and `raw_path:` frontmatter.
|
||||||
- `overview.md` — single project-wide overview. Read this first if new to the repo.
|
- `overview.md` — single project-wide overview. Read this first if new to the repo.
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever
|
|||||||
|
|
||||||
<!-- (none yet) -->
|
<!-- (none yet) -->
|
||||||
|
|
||||||
## Sources
|
## Summaries
|
||||||
|
|
||||||
<!-- (none yet) -->
|
<!-- (none yet) -->
|
||||||
- [pi-extension-headless-ritual.md](concepts/pi-extension-headless-ritual.md) — agent_end (not agent_settled) for followUp injection; mode guard (`print` not hasUI); loop-guard flag-before-send; opt-in mirrors skill
|
- [pi-extension-headless-ritual.md](concepts/pi-extension-headless-ritual.md) — agent_end (not agent_settled) for followUp injection; mode guard (`print` not hasUI); loop-guard flag-before-send; opt-in mirrors skill
|
||||||
|
|||||||
BIN
dist/mappa-brainstorm-promote.skill
vendored
BIN
dist/mappa-brainstorm-promote.skill
vendored
Binary file not shown.
@@ -1,466 +1,247 @@
|
|||||||
---
|
---
|
||||||
name: mappa-brainstorm-promote
|
name: mappa-brainstorm-promote
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.5.0
|
version: 1.6.0
|
||||||
description: >
|
description: >
|
||||||
Finalize a matured brainstorm buffer on the boss's desk
|
Finalize a matured brainstorm buffer (mappa entity type=brainstorm, status=buffer):
|
||||||
(~/projects/.workshop/.brainstorm/): ask routing (workshop-meta → local
|
read buffer → choose target project → promote via mcp__mappa__brainstorm_promote
|
||||||
.wiki/concepts/, domain → target project wiki via knowledge_ingest,
|
(atomic buffer → wiki-страница в target + archive, решение 7) → extract
|
||||||
mappa-service → mappa-борд (create — карв-аут без лиза wiki:2660), skill →
|
action-items into target tasks (mcp__mappa__task_create, карв-аут) → review
|
||||||
claude-skills skeleton),
|
umbrella → covering letter. Общий механизм mappa, как task.create/wiki.create —
|
||||||
extract action-items into target .tasks, create pointers + review umbrella
|
никакой workshop-специфики. Старое имя — триггер-синоним:
|
||||||
for impl tasks, archive the buffer. Старое имя — триггер-синоним:
|
workshop-promote-brainstorm. Triggers (user): «промоутни брейнсторм»,
|
||||||
workshop-promote-brainstorm. Location-agnostic: fires from ANY folder; all
|
«finalize <topic>», «выкати в вики», «promote <topic>».
|
||||||
paths resolve to ~/projects/.workshop/ regardless of CWD. Triggers (user):
|
|
||||||
«промоутни брейнсторм», «finalize <topic>», «выкати в вики», «promote
|
|
||||||
<topic>».
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# mappa-brainstorm-promote
|
# mappa-brainstorm-promote
|
||||||
|
|
||||||
Финализация созревшего брейнсторм-буфера на столе босса (`~/projects/.workshop/`) — **процедура** (линейная: от чтения буфера до архивации), не цикл в смысле повторения: запускается явно на финальном буфере и доводит его до конца (промоушен + таски + архив). В форкфлоу встаёт между работой (`mappa-task-work`) и финишем (`mappa-closing-ritual`). Четыре ветки маршрутизации:
|
Финализация созревшего брейнсторм-буфера, который живёт **как mappa-сущность
|
||||||
|
типа `brainstorm`** (status=buffer). Это общий механизм mappa — ровно как
|
||||||
|
`task.create` или `wiki.create`: буфер существует в mappa, скил доводит его до
|
||||||
|
конца (промоут контента в вики + action-items тасками). Никакой
|
||||||
|
workshop-специфики: скил триггерится из любой папки, работает с brainstorm-
|
||||||
|
сущностями любого проекта.
|
||||||
|
|
||||||
> **Location-agnostic.** Скил триггерится из любой папки — босс-штормы
|
Процедура линейная (от чтения буфера до промоута и тасок), не цикл: запускается
|
||||||
> происходят где угодно, запись живёт на столе. Все относительные пути ниже
|
явно на финальном буфере и доводит его до конца. В форкфлоу встаёт между
|
||||||
> (`.brainstorm/`, `.archive/`, `.wiki/`, `index.md`) разрешаются относительно
|
работой (`mappa-task-work`) и финишем (`mappa-closing-ritual`).
|
||||||
> `~/projects/.workshop/` **независимо от CWD**; git-команды явно указывают
|
|
||||||
> `-C ~/projects/.workshop`.
|
|
||||||
|
|
||||||
- **workshop-meta** → локальный `.wiki/concepts/` (методология самой зоны).
|
**Промоут контента — всегда через `mcp__mappa__brainstorm_promote`:**
|
||||||
- **domain** → глобал через `mcp__projects-meta__knowledge_ingest` в `~/projects/<proj>/.wiki/`.
|
атомарно создаёт wiki-страницу (slug из буфера, body сохраняется) в проекте из
|
||||||
- **mappa-service** → сервисные борды (mappa, .common, …): таски/вики-сущности через `mcp__mappa__task_create`/`wiki_create` (**create — карв-аут без лиза**, wiki:2660; update — version+409); pointers-таска НЕ нужна, если спека уже в вики проекта (wiki:NNNN); review-umbrella — сервисная таска; covering-письмо в инбокс цели.
|
вызова и переводит буфер в `archive` (номер/slug стабильны, решение 20; рёбра
|
||||||
- **skill** → `~/projects/claude-skills/skills/<name>/SKILL.md` (только шапка + пустой каркас тела, локальный коммит без push/install/build-hermes).
|
parent_of, событие `brainstorm.promoted`). Никаких файловых каналов. Action-items
|
||||||
|
уходят тасками в target-проект через `mcp__mappa__task_create` (карв-аут без
|
||||||
Буфер уезжает в `.archive/`. Action-items уходят тасками в target-проект. **Всегда, при любом маршруте, в воркшоп-вики остаётся summary-страница.**
|
лиза, #1054; последовательно, не батчем).
|
||||||
|
|
||||||
## When to use
|
## When to use
|
||||||
|
|
||||||
- «промоутни брейнсторм», «finalize <topic>», «выкати в вики», «promote <topic>».
|
- «промоутни брейнсторм», «finalize <topic>», «выкати в вики», «promote
|
||||||
- Пользователь явно ссылается на `.workshop/.brainstorm/<topic>.md` как на готовый к промоушену.
|
<topic>».
|
||||||
|
- Пользователь ссылается на brainstorm-сущность (brainstorm:N) или на тему
|
||||||
|
буфера, который созрел и готов к промоушену.
|
||||||
|
|
||||||
## Inputs
|
## Inputs
|
||||||
|
|
||||||
- Путь `.brainstorm/<topic>.md` или просто `<topic>`.
|
- Brainstorm-реф `brainstorm:N` или `<topic>` (slug/тема буфера) + project (если
|
||||||
- Для skill-ветки дополнительно: `<name>` нового скила (если не указан — спросить, предложить производное от topic).
|
буфер не в текущем проекте — спросить).
|
||||||
|
- Для skill-ветки дополнительно: `<name>` нового скила (если не указан —
|
||||||
|
спросить, предложить производное от topic).
|
||||||
|
|
||||||
## Decision flow
|
## Decision flow
|
||||||
|
|
||||||
```
|
```
|
||||||
.brainstorm/<topic>.md
|
brainstorm-сущность в mappa (type=brainstorm, status=buffer)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
read + summarize (1–2 paragraphs)
|
find + read (entity_search type=brainstorm → entity_get полный body)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
ask: workshop-meta or domain or skill?
|
ask: target project (куда промоутить)
|
||||||
│ │ │
|
│
|
||||||
│ ▼ ▼
|
├── обычный проект → brainstorm_promote(project=<target>)
|
||||||
│ ask: target proj ask: <name> + check
|
│ → wiki-страница (спека) в вики target
|
||||||
│ │ ~/projects/claude-skills/
|
│
|
||||||
│ ┌─────┴─────┐ skills/<name>/ NOT exists
|
└── skill → dialog: description (trigger contract)
|
||||||
│ ▼ ▼ │
|
→ preview + confirm
|
||||||
│ file channel service channel │
|
→ mkdir + Write SKILL.md (каркас) в ~/projects/skills/
|
||||||
│ (.tasks/) (mappa-борд) │
|
→ git add + commit (local, no push/install)
|
||||||
│ │ │ │
|
|
||||||
│ ▼ ▼ ▼
|
|
||||||
│ knowledge_ingest mcp__mappa__wiki_create dialog: description (trigger contract)
|
|
||||||
│ │ (карв-аут, wiki:2660) │
|
|
||||||
│ │ │ ▼
|
|
||||||
│ │ │ preview + confirm
|
|
||||||
│ │ │ │
|
|
||||||
│ │ │ ▼
|
|
||||||
│ │ │ mkdir + Write SKILL.md
|
|
||||||
│ │ │ (header + empty 6-section skeleton)
|
|
||||||
│ │ │ │
|
|
||||||
│ │ │ ▼
|
|
||||||
│ │ │ git add + commit in claude-skills/
|
|
||||||
│ │ │ (local, no push, no install.sh, no build-hermes)
|
|
||||||
│ │ │ │
|
|
||||||
└────────┴───────────┴─────────────────┘
|
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
parse action-items + (for skill: prepend 3 baselines)
|
parse action-items from buffer body
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
for each: tasks_create (ПОСЛЕДОВАТЕЛЬНО, не батчем)
|
for each: mcp__mappa__task_create (ПОСЛЕДОВАТЕЛЬНО, не батчем)
|
||||||
[file: mcp__projects-meta__tasks_create | service: mcp__mappa__task_create]
|
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
if domain && N≥1: tasks_create [<topic>-review] (blocked-by impl)
|
review-umbrella: mcp__mappa__task_create (blocked, blocker=impl#)
|
||||||
if service: review-umbrella — сервисная таска (blocked, blocker=impl#)
|
|
||||||
if skill: tasks_create [<name>-review] (blocked-by impl, behavioral smoke-test)
|
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
covering-письмо в инбокс цели (оба канала; канон mappa-delegation)
|
covering-письмо: mcp__mappa__inbox_send (канон mappa-delegation)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
Write .wiki/concepts/<topic>.md ← ВСЕГДА, любой маршрут
|
финальный отчёт (wiki:NNNN — спека, brainstorm:N — архив, таски)
|
||||||
(summary: решения, куда промочено, задачи, ссылки)
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
git -C ~/projects/.workshop mv .brainstorm/<topic>.md .archive/<date>-<topic>.md
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
append to .wiki/log.md
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Steps
|
## Steps
|
||||||
|
|
||||||
1. **Прочитать `.brainstorm/<topic>.md`.** Показать summary (≤2 абзаца).
|
1. **Найти буфер в mappa.** `mcp__mappa__entity_search(type='brainstorm',
|
||||||
|
project=<проект>, q=<topic>)` → в результатах brainstorm:N + **internal id**.
|
||||||
2. **Спросить тип:**
|
Прочитать полный буфер: `mcp__mappa__entity_get(id=<internal id>)` — тело =
|
||||||
- **workshop-meta** — методология самой workshop-зоны: ретро дистилляции, паттерны, апгрейды скилов зоны.
|
running record (frontmatter + раунды).
|
||||||
- **domain** — доменное содержимое для какого-то целевого проекта.
|
|
||||||
- **skill** — методология общего назначения, оформляется как скил в `~/projects/claude-skills/`.
|
Если буфера нет в mappa — создать brainstorm-сущность через
|
||||||
|
`mcp__mappa__brainstorm_create` (или HTTP `POST /entities` type=brainstorm,
|
||||||
3. **Если domain:**
|
контракт решения 7/#1054). Не изобретать файловые буферы.
|
||||||
- Спросить целевой проект (имя папки в `~/projects/`).
|
|
||||||
- Валидация: вызвать `mcp__projects-meta__meta_status`, убедиться что проект известен; иначе — abort с сообщением «зарегистрируй проект через setup-projects-meta».
|
2. **Показать summary буфера (≤2 абзаца).**
|
||||||
- **Определить канал борда:** есть ли у проекта файловая доска `.tasks/STATUS.md` (file channel) или борд живёт в mappa-сущностях (service channel — сервисные проекты: mappa, .common, …). Проверка: файл `.tasks/STATUS.md` в чек-ауте (file) против `mcp__mappa__task_list(project=<proj>)` / `entity_search` (service). Если файловой доски нет, а mappa-сущности есть → **service channel**.
|
|
||||||
|
3. **Спросить target-проект** — куда промоутить контент. По умолчанию — проект,
|
||||||
4. **Если domain + service channel (mappa-борд, fold-in 1):**
|
где буфер живёт (брейншторм ведут там, где тема релевантна). Проверить, что
|
||||||
- **Create — карв-аут, лиз НЕ нужен** (wiki:2660): `task_create`/`wiki_create`
|
проект существует в mappa: `mcp__mappa__entity_search` type=project
|
||||||
без claim_token (интерактивный контракт, поллер вне mappa).
|
(или `mcp__mappa__entity_search` с q=<имя проекта>). Если нет — abort с
|
||||||
- **Спека → вики-сущность:** `mcp__mappa__wiki_create(project, slug, body)` (или `wiki_update(project, id, version, …)`, если страница уже есть). Если спека уже в вики проекта (wiki:NNNN) — не дублировать, описание импл-тасок ссылается на неё. **Frontmatter-summary (wiki:2661):** при создании пиши `summary:` одной строкой в frontmatter — карточки `wiki.search` и поиск по вики читают его.
|
сообщением.
|
||||||
- **Pointers-таска НЕ нужна**, если спека уже в вики проекта — дыра pointers закрыта инлайн (описание импл-тасок прямо ссылается на спеку).
|
|
||||||
- **Импл-таски:** `mcp__mappa__task_create(project, slug, title, description, status='ready')` — **ПОСЛЕДОВАТЕЛЬНО, не батчем** (см. NB в шаге 7).
|
4. **Если target = skill (пользователь хочет оформить как скил):**
|
||||||
- **Review-umbrella:** сервисная таска `mcp__mappa__task_create(status='blocked', blocker=<номера импл-тасок>)`.
|
- Спросить `<name>` нового скила (если не указан) — валидный slug
|
||||||
- **Covering-письмо:** `mcp__mappa__inbox_send(project=<target>, from=<своя>, subject='Промоушен <topic>: таски <#N>…', body=<перечень>).` — канон mappa-delegation: таска на борде не пингует живую сессию.
|
(`[a-z0-9-]+`).
|
||||||
|
- Валидация (порядок важен): сначала проверить, что `~/projects/skills/`
|
||||||
5. **Если skill:**
|
сам репозиторий существует. Если нет — **abort** с сообщением «клонируй
|
||||||
- Спросить `<name>` нового скила (если не указан) — валидный slug (`[a-z0-9-]+`).
|
skills через update-skills или вручную».
|
||||||
- Валидация: `~/projects/claude-skills/skills/<name>/` НЕ должна существовать. Если существует — **abort** с сообщением «скил `<name>` уже существует, обновляйся обычным маршрутом в `claude-skills/`, этот скил не для апдейтов».
|
- Затем: `~/projects/skills/skills/<name>/` НЕ должна существовать.
|
||||||
- Валидация: `~/projects/claude-skills/` сам репозиторий существует. Если нет — abort с сообщением «клонируй claude-skills/ через update-claude-skills или вручную».
|
Если существует — **abort** с сообщением «скил `<name>` уже существует,
|
||||||
|
обновляйся обычным маршрутом в `~/projects/skills/`, этот скил не для
|
||||||
6. **Парсинг action-items:**
|
апдейтов».
|
||||||
- regex по строкам вида `- [ ] ...`, `- [ ]`, секции после `## Следующие шаги`/`## TODO`/`## Next steps`/`## Action items`.
|
- Двухпроходной каркас: диалог по `description` (триггер-контракт активации:
|
||||||
- Показать список, дать редактировать/удалять/добавлять.
|
минимум 2-3 фразы, пары русский/английский; что делает; антипаттерны) →
|
||||||
- Если 0 action-items — продолжить, не блокировать.
|
preview + confirm → `Write` каркаса (шапка + 6 пустых секций) → локальный
|
||||||
|
`git commit` в `~/projects/skills/`. **Без** install.sh, push,
|
||||||
7. **Промоушен контента:**
|
build-hermes — это в baseline-тасках шага 7. Тело каркаса дописывается
|
||||||
|
вторым проходом глазами (вне scope этого скила).
|
||||||
- **workshop-meta:** `Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
|
||||||
|
5. **Промоут контента (всегда через `brainstorm_promote`, решение 7):**
|
||||||
```yaml
|
|
||||||
---
|
`mcp__mappa__brainstorm_promote(project=<target>, brainstorm_id=<internal id>)`
|
||||||
date: <YYYY-MM-DD>
|
|
||||||
source: .brainstorm/<topic>.md
|
- Атомарно: buffer → wiki-страница (slug из буфера, body сохраняется, рёбра
|
||||||
status: promoted
|
parent_of buffer→wiki и refs→buffer) + буфер → `archive` + значимое событие
|
||||||
type: workshop-meta
|
`brainstorm.promoted`.
|
||||||
---
|
- **Frontmatter-summary (wiki:2661):** убедиться, что в теле буфера есть
|
||||||
```
|
`summary:` одной строкой в frontmatter — карточки `wiki.search` читают его.
|
||||||
|
Если нет — дописать через `mcp__mappa__brainstorm_update` (PATCH
|
||||||
Тело — содержимое буфера (можно слегка причесать заголовки, секции типа TODO убрать — они уже сепарированы в action-items).
|
/brainstorm/:id, title/body/status, optimistic version+409) перед промоутом.
|
||||||
|
- Повторный промоут архивированного буфера → ошибка (one-shot, идемпотентно
|
||||||
- **domain:** `mcp__projects-meta__knowledge_ingest` с параметрами:
|
через статус). Сверить `brainstorm_id` (internal) из шага 1.
|
||||||
- `project: <target>`
|
- Если `brainstorm_promote` упал (конфликт версии, 409) → retry со свежим
|
||||||
- `path: concepts/<topic>.md` (внутри target wiki)
|
internal id; при стабильном отказе — abort до создания тасок.
|
||||||
- `content: <тело буфера с frontmatter>`
|
|
||||||
|
6. **Парсинг action-items:** regex по строкам вида `- [ ] ...` в теле буфера,
|
||||||
Если `knowledge_ingest` падает → abort до tasks_create и до `git mv`. Сообщить пользователю.
|
секции после `## Следующие шаги`/`## TODO`/`## Next steps`/
|
||||||
|
`## Action items`. Показать список, дать редактировать/удалять/добавлять.
|
||||||
- **skill:** двухпроходной.
|
Если 0 action-items — продолжить, не блокировать.
|
||||||
|
|
||||||
**Проход первый (этот скил):**
|
7. **Создание тасок:**
|
||||||
|
|
||||||
1. **Диалог по `description`** — поведенческий контракт активации скила. Показать пользователю summary буфера и спросить:
|
> **NB:** таски создавать **ПОСЛЕДОВАТЕЛЬНО**, не батчем. Один
|
||||||
- На каких триггер-фразах скил должен активироваться? (минимум 2-3, лучше — пары русский/английский)
|
> `task_create` → дождаться ответа → следующий.
|
||||||
- Что скил делает в одном предложении?
|
|
||||||
- Когда скил **не должен** активироваться (антипаттерны)?
|
- **Обычный target:** для каждого action-item —
|
||||||
|
`mcp__mappa__task_create(project=<target>, slug=<kebab>, title, description,
|
||||||
Из ответов собрать `description` строкой ~200-400 символов в стиле существующих скилов (см. `~/projects/claude-skills/skills/*/SKILL.md` для примеров).
|
status='ready')`. Create — карв-аут, лиз не нужен (wiki:2660/#1054).
|
||||||
|
Описание импл-таски ссылается на спеку (wiki:NNNN из шага 5).
|
||||||
2. **Preview + confirm** (обязательно):
|
- **Skill:** три baseline-таски в `project='skills'`:
|
||||||
```
|
- `[<name>-install]` — запустить `install.sh` в `~/projects/skills/`,
|
||||||
Писать в: ~/projects/claude-skills/skills/<name>/SKILL.md
|
проверить активацию в новой сессии.
|
||||||
Frontmatter: name=<name>, version=0.1.0, description=<...>
|
- `[<name>-hermes-mapping]` — запись в `~/projects/skills/hermes/mapping.yaml`
|
||||||
Body: пустой каркас с заголовками
|
(режим `auto` для стилевых, `pending` если трогает тулы/окружение).
|
||||||
When to use / Inputs / Steps / Failure modes / Side effects / What NOT to do
|
- `[<name>-test-trigger]` — прогнать триггер-фразы из description:
|
||||||
Коммит: feat(skills): add <name> v0.1.0 (promoted from .workshop/.brainstorm/<topic>.md)
|
активируется на своих, не активируется на 2-3 близких чужих.
|
||||||
Без: install.sh, push, build-hermes (это в созданных тасках)
|
Плюс content-таски из буфера (если были) — тоже в `project='skills'`,
|
||||||
ОК?
|
slug-prefix `<name>-`.
|
||||||
```
|
- Если N-я таска упала — продолжить остальные, в конце сообщить какие
|
||||||
|
созданы / какие нет. Запомнить slug'и для review-umbrella.
|
||||||
3. После confirm:
|
|
||||||
- `mkdir -p ~/projects/claude-skills/skills/<name>/`
|
8. **Review-umbrella (для target с импл-тасками и для skill — всегда):**
|
||||||
- `Write` файла `~/projects/claude-skills/skills/<name>/SKILL.md`:
|
|
||||||
|
`mcp__mappa__task_create(project=<target>, slug=<topic>-review,
|
||||||
```markdown
|
status='blocked', blocker=<номера импл-тасок через запятую>, description=<чек-лист>)`
|
||||||
---
|
|
||||||
name: <name>
|
- **Кто делает:** не имплементер. Следующая сессия в этом проекте (другая
|
||||||
version: 0.1.0
|
модель / другой день / другой агент) с чистым контекстом. «Я только что
|
||||||
description: <вписанный пользователем триггер-контракт>
|
это написал» bias = главный риск.
|
||||||
---
|
- Чек-лист: прочитать спеку (wiki:NNNN из шага 5), `git log` shipped-коммитов,
|
||||||
|
для каждой импл-таски прогнать тесты и сверить с acceptance criteria,
|
||||||
# <name>
|
findings → follow-up tasks через `task_create`.
|
||||||
|
- Закрытие: все findings зафайлены ИЛИ ревьюер подтвердил «нет findings»
|
||||||
<одно-два предложения что скил делает — из диалога>
|
в close-note.
|
||||||
|
- Если review-таска упала — сообщить, **продолжить** к шагу 9 (промоут уже
|
||||||
## When to use
|
сделан, буфер в archive).
|
||||||
|
|
||||||
<пусто, дописывается во втором проходе>
|
9. **Covering-письмо в инбокс цели (канон mappa-delegation).** Таска на борде
|
||||||
|
не пингует живую сессию, письмо = пинг + контекст:
|
||||||
## Inputs
|
|
||||||
|
`mcp__mappa__inbox_send(project=<target>, from=<своя папка>, subject='Промоушен
|
||||||
<пусто>
|
<topic>: таски <#N…>', body=<перечень + wiki:NNNN спека>)`
|
||||||
|
|
||||||
## Steps
|
10. **Финальный отчёт пользователю:**
|
||||||
|
- Куда промочено: `wiki:NNNN` (спека в вики target).
|
||||||
<пусто>
|
- Архив: `brainstorm:N` (status=archive, номер стабилен).
|
||||||
|
- Какие таски созданы (ref, title, проект).
|
||||||
## Failure modes
|
- **Для skill:** напомнить про второй проход «доведём `<name>`».
|
||||||
|
|
||||||
<пусто>
|
|
||||||
|
|
||||||
## Side effects
|
|
||||||
|
|
||||||
<пусто>
|
|
||||||
|
|
||||||
## What NOT to do
|
|
||||||
|
|
||||||
<пусто>
|
|
||||||
```
|
|
||||||
|
|
||||||
- В `~/projects/claude-skills/`: `git -C ~/projects/claude-skills add skills/<name>/SKILL.md && git -C ~/projects/claude-skills commit -m "feat(skills): add <name> v0.1.0 (promoted from ~/projects/.workshop/.brainstorm/<topic>.md)"`.
|
|
||||||
- **STOP.** Не запускать `install.sh`. Не делать `git push`. Не править `hermes/mapping.yaml`. Это всё уйдёт тасками на шаге 7.
|
|
||||||
|
|
||||||
**Проход второй** — пользователь явно зовёт «доведём `<name>`» в этой же или следующей сессии. Источник лежит в `.archive/<date>-<topic>.md`, тело каркаса дописывается глазами. Вне scope этого скила.
|
|
||||||
|
|
||||||
8. **Создание тасок:**
|
|
||||||
|
|
||||||
> **NB (2026-08-24, инцидент mappa-skill-suite):** таски создавать **ПОСЛЕДОВАТЕЛЬНО**, не батчем и не параллельно. Параллельный `tasks_create` → гонка на sha-CAS общего счётчика (agenda-репо): часть тасок падает с PushRejected (при промоуте mappa-skill-suite 6/7 упали, повторены последовательно). Один `tasks_create` → дождаться ответа → следующий.
|
|
||||||
|
|
||||||
- **domain (mandatory pre-impl) — `[<topic>-pointers]`:** **первой** создать таску, заполняющую `.wiki/CLAUDE.md` Domain conventions у target-проекта пойнтерами на спецификацию. Без неё импл-таски будут подняты со stub'ом в Domain conventions, и следующий агент попадёт в дыру: dense `where_stopped` one-liner + пустой stub = угадывание порогов / таксономий / pipeline-этапов. Параметры:
|
|
||||||
|
|
||||||
- `target_project: <target>`
|
|
||||||
- `slug: <topic>-pointers`
|
|
||||||
- `status: ready`
|
|
||||||
- `description:` шаблон ниже
|
|
||||||
- `next_action:` готовый блок текста для копирования в `.wiki/CLAUDE.md` (шаблон ниже)
|
|
||||||
|
|
||||||
Description-шаблон:
|
|
||||||
|
|
||||||
```
|
|
||||||
Bootstrap-pointers для design <topic>. Pre-fills target's `.wiki/CLAUDE.md`
|
|
||||||
Domain conventions ссылками на спецификацию. Дизайн не лежит в этом репо —
|
|
||||||
только pointer-stub. Без этой таски следующий агент попадёт в дыру:
|
|
||||||
where_stopped one-liner + пустой Domain conventions stub = угадывание
|
|
||||||
порогов / таксономий / pipeline-этапов вместо чтения готовых решений.
|
|
||||||
|
|
||||||
**Кто делает:** любой следующий агент в этом проекте. Это первая по
|
|
||||||
приоритету таска промоушена — все остальные импл-таски ссылаются на
|
|
||||||
pointers через .wiki/CLAUDE.md.
|
|
||||||
```
|
|
||||||
|
|
||||||
Next-action шаблон (pre-filled, копировать дословно — подменив `<topic>` и `<YYYY-MM-DD>`):
|
|
||||||
|
|
||||||
```
|
|
||||||
В `.wiki/CLAUDE.md` секции "Domain conventions" вставить блок (или заменить
|
|
||||||
дефолтный setup-wiki stub):
|
|
||||||
|
|
||||||
### Mandatory: read design context before implementation
|
|
||||||
|
|
||||||
Before picking up any task in `.tasks/`, load the full design context. It
|
|
||||||
does **not** live in this repo — only pointers do. Sources, in order:
|
|
||||||
|
|
||||||
1. **Global wiki design (canonical):** `mcp__projects-meta__knowledge_get`
|
|
||||||
с `slug = "concepts/<topic>"`. Architecture decisions, contracts, scope.
|
|
||||||
2. **Brainstorm process trace (rationale):**
|
|
||||||
`~/projects/.workshop/.archive/<YYYY-MM-DD>-<topic>.md`.
|
|
||||||
Why each decision was made, what was rejected and why, anti-patterns.
|
|
||||||
3. **Local `overview.md`** — thin summary of (1), used as quick orientation
|
|
||||||
only — never as the source of truth.
|
|
||||||
|
|
||||||
Do **not** invent thresholds, taxonomies, container topology, or pipeline
|
|
||||||
stages from task `where_stopped` lines alone — those are pointers, not
|
|
||||||
specifications.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Закоммитить: `wiki(claude): add design-context pointers for <topic>`.
|
|
||||||
```
|
|
||||||
|
|
||||||
Конкретные значения, которые промоутер должен подставить **заранее** в
|
|
||||||
текст next_action перед `tasks_create`:
|
|
||||||
|
|
||||||
- `<topic>` — тема промоушена (тот же slug, что используется в `concepts/<topic>.md` и в `.archive/<YYYY-MM-DD>-<topic>.md`).
|
|
||||||
- `<YYYY-MM-DD>` — сегодняшняя дата (та же, что в шаге 9 архивации).
|
|
||||||
|
|
||||||
Если `tasks_create` для `<topic>-pointers` упала → **abort** до content-тасок и до review. Без pointers оставшиеся таски бесполезны: импл-агент будет угадывать. Сообщить пользователю, буфер оставить на месте.
|
|
||||||
|
|
||||||
- **workshop-meta / domain (content):** для каждого action-item:
|
|
||||||
- `mcp__projects-meta__tasks_create` с `project: <target>` (для domain) или с `project: <inferred>` (для workshop-meta — спросить пользователя если неоднозначно).
|
|
||||||
- Title — первая строка action-item; description — остальное.
|
|
||||||
|
|
||||||
- **skill:** **всегда** добавляются три baseline-таски в `project: claude-skills`:
|
|
||||||
- `[<name>-install]` — запустить `install.sh` в `~/projects/claude-skills/`, проверить что скил активируется в новой сессии, сделать `/reload-plugins`.
|
|
||||||
- `[<name>-hermes-mapping]` — добавить запись в `~/projects/claude-skills/hermes/mapping.yaml`. Режим: `auto` если скил чисто стилевой / response-style, `pending` если скил трогает инструменты или окружение (требует отдельного аудита).
|
|
||||||
- `[<name>-test-trigger]` — прогнать триггер-фразы из `description` на тестовом буфере: убедиться что активируется на своих фразах И не активируется на 2-3 близких чужих (false-positive check).
|
|
||||||
|
|
||||||
Плюс content-таски из самого буфера (если были) — также в `project: claude-skills`, slug-prefix `<name>-`.
|
|
||||||
|
|
||||||
- Если N-я таска упала — продолжить остальные, в конце сообщить какие созданы / какие нет.
|
|
||||||
- Запомнить slug'и созданных импл-тасок для шага 9.
|
|
||||||
|
|
||||||
9. **Review-чекпоинт.** Создаётся всегда для skill-промоушена; для domain-промоушена — только если N≥1 импл-тасок; для workshop-meta или N=0 (domain) — skip с пометкой в логе.
|
|
||||||
|
|
||||||
- **domain (N≥1):**
|
|
||||||
- `mcp__projects-meta__tasks_create`:
|
|
||||||
- `target_project: <target>`
|
|
||||||
- `slug: <topic>-review`
|
|
||||||
- `status: blocked`
|
|
||||||
- `blocker:` `«bootstrap: <topic>-pointers; impl-tasks: <номера #n через запятую>»` — блокеры по номерам (номер = машинный ключ; слаги оставить в скобках для читаемости).
|
|
||||||
- `description:` шаблон ниже.
|
|
||||||
- `next_action:` «Дождаться 🟢 у всех blocker-тасок (включая `<topic>-pointers` — без него pointers в `.wiki/CLAUDE.md` не залиты, и review будет читать stub). Прочитать спецификацию (см. путь в description). Для каждой импл-таски: `git show <commit>`, прогнать тесты в её scope'е, сверить с acceptance criteria. Findings → новые follow-up tasks через `mcp__projects-meta__tasks_create`.»
|
|
||||||
|
|
||||||
Description-шаблон (domain):
|
|
||||||
|
|
||||||
```
|
|
||||||
Code-review checkpoint для брейнсторма <topic> (промоушен <YYYY-MM-DD>).
|
|
||||||
|
|
||||||
**Спецификация:** <путь к промоушенному design-документу — concepts/<topic>.md в target-wiki>.
|
|
||||||
**Pre-impl bootstrap:** `<topic>-pointers` (заполнил `.wiki/CLAUDE.md` Domain conventions — без него review бы читал stub).
|
|
||||||
**Импл-таски (review против их acceptance criteria):** <номера #n из шага 9, слаги в скобках>.
|
|
||||||
|
|
||||||
**Кто делает:** **не имплементер.** Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск.
|
|
||||||
|
|
||||||
**Чек-лист ревью:**
|
|
||||||
- Прочитать спецификацию (acceptance criteria каждой импл-таски).
|
|
||||||
- `git log --oneline` shipped-коммитов (по slug или scope в commit-message).
|
|
||||||
- Для каждой импл-таски: прогнать соответствующие тесты, реально проверить что они доходят до своих веток (не coverage-illusion).
|
|
||||||
- Сверить дизайн-decisions со shipped-кодом (signature, params, error-paths, безопасность).
|
|
||||||
- Findings — отдельные follow-up tasks (`<topic>-<gap>-fix` или подобное) через `tasks_create`.
|
|
||||||
|
|
||||||
**Закрытие:** только когда все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» в close-note.
|
|
||||||
```
|
|
||||||
|
|
||||||
- **skill:**
|
|
||||||
- `mcp__projects-meta__tasks_create`:
|
|
||||||
- `target_project: claude-skills`
|
|
||||||
- `slug: <name>-review`
|
|
||||||
- `status: blocked`
|
|
||||||
- `blocker:` `«impl-tasks: <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls если были]»` — номера `#n` из шага 9 (слаги в скобках для читаемости).
|
|
||||||
- `description:` шаблон ниже.
|
|
||||||
- `next_action:` «Дождаться 🟢 у baseline-тасок. Прогнать поведенческий smoke-test (см. чек-лист в description). Findings → follow-up tasks через `tasks_create`.»
|
|
||||||
|
|
||||||
Description-шаблон (skill):
|
|
||||||
|
|
||||||
```
|
|
||||||
Skill-review checkpoint для <name> (промоушен <YYYY-MM-DD>).
|
|
||||||
|
|
||||||
**Источник дизайна:** .workshop/.archive/<YYYY-MM-DD>-<topic>.md.
|
|
||||||
**Импл-таски:** <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls] — номера #n из шага 9.
|
|
||||||
|
|
||||||
**Кто делает:** **не имплементер.** Другая сессия / другой день / другой агент. Identity-not-location: ревьюер работает в любой папке, где есть доступ к файлам (см. `.workshop/.wiki/concepts/workshop-architecture.md` §5.1).
|
|
||||||
|
|
||||||
**Поведенческий smoke-test (это и есть acceptance):**
|
|
||||||
- Скил активируется в чистой сессии на каждой триггер-фразе из `description` (русский И английский варианты).
|
|
||||||
- Скил **не** активируется на 2-3 близких но не своих фразах из соседних доменов (false-positive check).
|
|
||||||
- Каждый шаг секции `Steps` отрабатывает на тестовом буфере без ошибок.
|
|
||||||
- `Failure modes` уводят в abort, не в частичный успех с грязным состоянием.
|
|
||||||
- `What NOT to do` соответствует реальности — нет дыры между правилом и реализацией.
|
|
||||||
|
|
||||||
Findings — обычные follow-up tasks (`<name>-<gap>-fix` или подобное) через `tasks_create` в `claude-skills`.
|
|
||||||
|
|
||||||
**Закрытие:** только когда все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» в close-note.
|
|
||||||
|
|
||||||
**NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера. Если ревью требует правок — правит владелец, бампит он же.
|
|
||||||
```
|
|
||||||
|
|
||||||
- Если `tasks_create` review-таски упала — сообщить пользователю, **продолжить** к шагу 11 (архивация буфера). Review-таску можно создать вручную позже из `.archive/<date>-<topic>.md`.
|
|
||||||
|
|
||||||
- **domain (service channel):** review-umbrella — **сервисная таска**: `mcp__mappa__task_create(project=<target>, slug=<topic>-review, status='blocked', blocker=<номера импл-тасок через запятую>, description=<шаблон domain выше, спека = wiki:NNNN в вики проекта>)` — create = карв-аут (без лиза). Pointers-таска отсутствует (спека в вики).
|
|
||||||
|
|
||||||
**Covering-письмо в инбокс цели (оба канала; канон mappa-delegation).** После создания тасок — `inbox_send` получателю-проекту: таска на борде не пингует живую сессию, письмо = пинг + контекст. File channel: `mcp__mappa__inbox_send(project=<target>, from=<своя>, subject='[event: created] <topic> — <N> тасок', body=<перечень: #N slug> )`. Service channel: то же, но `from` = своя папка (или сервисный адрес) и тело ссылается на wiki:NNNN-спеку.
|
|
||||||
|
|
||||||
10. **Workshop-wiki summary (обязательно для всех маршрутов):**
|
|
||||||
|
|
||||||
`Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
date: <YYYY-MM-DD>
|
|
||||||
source: .brainstorm/<topic>.md → .archive/<YYYY-MM-DD>-<topic>.md
|
|
||||||
status: promoted
|
|
||||||
type: workshop-meta
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
Содержание (≤60 строк):
|
|
||||||
- **Что решили** — ключевые решения раундов (не пересказ, а outcomes).
|
|
||||||
- **Куда промочено** — полный путь: target-wiki / claude-skills / local concepts.
|
|
||||||
- **Задачи** — перечень slug'ов, созданных в шаге 7.
|
|
||||||
- **Ссылки** — архив буфера + связанные концепты в workshop-вики + глобальная вики.
|
|
||||||
|
|
||||||
Для **workshop-meta**: summary — сокращение полного контента (который уже в `.wiki/concepts/<topic>.md` шага 6); если шаг 6 уже записал туда полный файл — шаг 9 его дополняет секцией «Куда промочено / Задачи» или пропускается (не дублировать).
|
|
||||||
|
|
||||||
Затем обновить `index.md` — добавить строку в нужную секцию.
|
|
||||||
|
|
||||||
Если `Write` упал → сообщить, **не блокировать** архивацию (summary менее критична чем content-промоушен).
|
|
||||||
|
|
||||||
11. **Архивация:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git -C ~/projects/.workshop mv .brainstorm/<topic>.md .archive/<YYYY-MM-DD>-<topic>.md
|
|
||||||
```
|
|
||||||
|
|
||||||
**Только** если шаги 6 и 7 прошли (или прошли с допустимым partial — пользователь подтвердил). Иначе — оставить буфер на месте, чтобы можно было ретраиить.
|
|
||||||
|
|
||||||
12. **Лог:** дописать в `.wiki/log.md`:
|
|
||||||
|
|
||||||
```
|
|
||||||
<date> promoted <topic> → <destination> [created N tasks in <proj>]
|
|
||||||
```
|
|
||||||
|
|
||||||
Для skill — `<destination>` = `claude-skills/skills/<name>/SKILL.md (skeleton)`.
|
|
||||||
|
|
||||||
13. **Финальный отчёт пользователю:**
|
|
||||||
- Куда промочено (полный путь).
|
|
||||||
- Какие таски созданы (id, title, проект).
|
|
||||||
- Куда уехал исходник.
|
|
||||||
- **Для skill:** напомнить что нужен второй проход «доведём `<name>`» для дописывания тела каркаса.
|
|
||||||
|
|
||||||
## Failure modes
|
## Failure modes
|
||||||
|
|
||||||
- `.brainstorm/<topic>.md` отсутствует → abort.
|
- Буфер не найден в mappa (нет brainstorm-сущности) → abort, сообщить: создать
|
||||||
- `mcp__projects-meta` недоступен → abort до записей.
|
через `brainstorm_create` (шаг 1) или HTTP POST /entities.
|
||||||
- Целевой проект (для domain) не найден в `meta_status` → abort.
|
- `entity_search`/`entity_get` упал (API-ошибка, не пустой результат) → abort
|
||||||
- `knowledge_ingest` упал → abort до `tasks_create` и `git mv`. Буфер остаётся.
|
с текстом ошибки; не создавать буфер по догадке.
|
||||||
- **Service channel:** create упал (гонка счётчика/переходный период) → **повторить последовательно**, не батчем; при стабильном отказе — abort до архивации.
|
- Target-проект не существует в mappa → abort до промоута.
|
||||||
- **Service channel:** спека уже существует в вики проекта (wiki:NNNN) → не дублировать `wiki_create`, ссылаться на неё.
|
- `brainstorm_promote` упал (409 версия / стабильный отказ) → retry со свежим
|
||||||
- **domain:** `tasks_create` для `[<topic>-pointers]` упал → **abort** до content-тасок и до review-таски. Без pointers оставшиеся таски бесполезны (агент будет угадывать). Сообщить пользователю; буфер оставить на месте для retry.
|
internal id; при повторном отказе — abort до создания тасок. Буфер остаётся
|
||||||
- `tasks_create` упал на N-й content-таске → продолжить остальные. Сообщить partial. **Не делать** `git mv` без подтверждения пользователя.
|
в buffer — ретраится позже.
|
||||||
- `tasks_create` упал на review-таске (шаг 8) → не блокировать; перейти к архивации, сообщить пользователю чтобы создал вручную из `.archive/`.
|
- Буфер уже `archive` (повторный вызов) → abort: промоут one-shot,
|
||||||
- **Skill:** `~/projects/claude-skills/` не существует → abort с сообщением «клонируй через update-claude-skills или вручную».
|
идемпотентность через статус (решение 7).
|
||||||
- **Skill:** `~/projects/claude-skills/skills/<name>/` уже существует → abort с сообщением «скил уже существует, обновляйся обычным маршрутом в `claude-skills/`».
|
- `task_create` упал на N-й content-таске → продолжить остальные, сообщить
|
||||||
- **Skill:** пользователь не подтвердил preview перед записью → abort, состояние не меняется.
|
partial. Промоут уже сделан — буфер не откатывается.
|
||||||
- **Skill:** локальный `git commit` в `claude-skills/` упал (например, не настроен user.email) → файл остаётся, сообщить пользователю что коммит нужно сделать руками; **не** делать `git mv` буфера до подтверждения.
|
- `task_create` review-umbrella упал → не блокировать, сообщить пользователю
|
||||||
|
(создать вручную из шага 8).
|
||||||
|
- `inbox_send` (covering-письмо) упал → промоут и таски не откатываются;
|
||||||
|
сообщить пользователю, письмо можно отправить позже (промоут уже виден
|
||||||
|
в графе/инбоксе цели).
|
||||||
|
- **Skill:** `~/projects/skills/` не существует → abort.
|
||||||
|
- **Skill:** `~/projects/skills/skills/<name>/` уже существует → abort.
|
||||||
|
- **Skill:** пользователь не подтвердил preview → abort, состояние не меняется.
|
||||||
|
- **Skill:** локальный `git commit` в `~/projects/skills/` упал → файл остаётся,
|
||||||
|
сообщить что коммит нужно сделать руками; промоут буфера не блокируется.
|
||||||
|
|
||||||
## Side effects
|
## Side effects
|
||||||
|
|
||||||
- **Всегда (любой маршрут):** создаёт summary-страницу `.wiki/concepts/<topic>.md` в `.workshop/` + добавляет строку в `index.md`.
|
- **Всегда:** `brainstorm_promote` — атомарно wiki-страница в target + буфер →
|
||||||
- **workshop-meta:** summary IS контент (шаг 6 записывает полное тело; шаг 9 дополняет секцию «задачи/ссылки» или пропускается если уже полный).
|
`archive` + рёбра parent_of (wiki→buffer, refs→buffer) + событие
|
||||||
- **domain:** создаёт запись в target-wiki через MCP (`mcp__projects-meta__knowledge_ingest`).
|
`brainstorm.promoted`.
|
||||||
- **domain (service channel):** создаёт спека-сущность в вики mappa-проекта (`mcp__mappa__wiki_create`, карв-аут wiki:2660); импл-таски + review-umbrella — сервисные таски (`mcp__mappa__task_create`, карв-аут); covering-письмо в инбокс цели (`inbox_send`). Pointers-таска НЕ создаётся (спека уже в вики).
|
- **Обычный target:** спека-страница в вики целевого проекта (с
|
||||||
- **domain:** создаёт также **mandatory pre-impl** таску `[<topic>-pointers]` в target — pre-filled блок текста для `.wiki/CLAUDE.md` Domain conventions (ссылки на global wiki slug + workshop archive trace + local overview.md). Без неё последующий импл-агент попадает в дыру: where_stopped one-liner + пустой Domain conventions stub.
|
frontmatter-summary, wiki:2661) + импл-таски + review-umbrella + covering-письмо.
|
||||||
- **skill:** создаёт `~/projects/claude-skills/skills/<name>/SKILL.md` — **только шапка + пустой каркас**. Локальный коммит в `claude-skills/`. **Без** установки, push, или build-hermes — это всё в созданных baseline-тасках.
|
- **Skill:** каркас `~/projects/skills/skills/<name>/SKILL.md` (только шапка +
|
||||||
- Создаёт N тасок в target `.tasks/` через MCP.
|
пустой 6-секционный каркас) + локальный коммит в `~/projects/skills/`.
|
||||||
- Для domain (N≥1) или skill: создаёт зонтичную review-таску (status=blocked, blocker=impl-slugs; для domain — также включает `<topic>-pointers`) в том же target.
|
**Без** install.sh, push, build-hermes — это в baseline-тасках.
|
||||||
- Перемещает `.brainstorm/<topic>.md` → `.archive/<date>-<topic>.md`.
|
- Создаёт N тасок в target через `mcp__mappa__task_create` (карв-аут).
|
||||||
- Аппендит строку в `.wiki/log.md`.
|
- Создаёт review-umbrella таску (status=blocked, blocker=impl#).
|
||||||
- **Семвер скилов:** при target=skill промоутер записывает `version: 0.1.0` в шапку. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила. При попытке промоушена в существующий скил — abort (см. Failure modes).
|
- Отправляет covering-письмо в инбокс target.
|
||||||
|
|
||||||
## What NOT to do
|
## What NOT to do
|
||||||
|
|
||||||
- Не писать доменное содержимое в локальный `.wiki/concepts/` (правило #1 из `.workshop/CLAUDE.md`). Summary-страница шага 11 — это trace/навигация, не domain-контент.
|
- **Не использовать файловые каналы** — буфер живёт в mappa brainstorm-сущности,
|
||||||
- Не пропускать шаг 9 (workshop-wiki summary) — именно так следующая сессия узнаёт что буфер был и куда ушёл.
|
никаких `.brainstorm/`/`.archive/` записей.
|
||||||
- Не делать `git mv` буфера до успеха promotion+tasks.
|
- **Не использовать `mcp__projects-meta__tasks_create` / `knowledge_ingest` /
|
||||||
- Не удалять буфер вместо `git mv` — теряется история.
|
`knowledge_promote`** — файловые каналы выпилены. Таски —
|
||||||
- **Skill:** не пытаться автоматически переформатировать тело буфера в каркас `Steps`/`Failure modes`/etc. — это поведенческий контракт, не косметика. Каркас остаётся пустым; тело дописывается во втором проходе глазами.
|
`mcp__mappa__task_create`, вики — `brainstorm_promote` (контент) +
|
||||||
- **Skill:** не запускать `install.sh`. Не делать `git push` в `claude-skills/`. Не править `hermes/mapping.yaml`. Не запускать `build-hermes.py`. Это работа baseline-тасок, не промоутера.
|
`wiki_create`/`wiki_update` (доп. страницы).
|
||||||
- **Skill:** не бампить `version` после первой записи (это работа владельца `claude-skills/`).
|
- Не делать `git mv` буфера в архив — промоут архивирует сам.
|
||||||
- **Skill:** не промоутить в существующий скил (см. Failure modes — abort).
|
- Не удалять буфер вместо промоута — теряется граф-история (parent_of, refs).
|
||||||
- **Skill:** не пропускать обязательный preview + confirm перед `Write` — действие выходит за пределы мастерской, изменяет соседний репозиторий.
|
- Не батчить `task_create` (гонка; инцидент 2026-08-24: 6/7 упали) — только
|
||||||
- **Service channel:** не батчить `task_create` (гонка sha-CAS счётчика, инцидент 2026-08-24: 6/7 упали) — только последовательно. Create — карв-аут, лиз не нужен.
|
последовательно.
|
||||||
- **Service channel:** не плодить pointers-таску, если спека уже в вики проекта (wiki:NNNN) — описание импл-тасок ссылается на неё инлайн.
|
- Не забывать covering-письмо — таска на борде не пингует живую сессию.
|
||||||
- **Service channel:** не забывать covering-письмо в инбокс цели — таска на борде не пингует живую сессию.
|
- **Skill:** не переформатировать тело буфера в каркас автоматически — тело
|
||||||
|
дописывается вторым проходом глазами.
|
||||||
|
- **Skill:** не запускать `install.sh`, не делать push, не править
|
||||||
|
`hermes/mapping.yaml` — это baseline-таски.
|
||||||
|
- **Skill:** не промоутить в существующий скил (abort).
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mappa-knowledge
|
name: mappa-knowledge
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.3.0
|
version: 1.4.0
|
||||||
description: >
|
description: >
|
||||||
Цикл работы со знаниями проекта в Mappa (Karpathy LLM Wiki, канал =
|
Цикл работы со знаниями проекта в Mappa (Karpathy LLM Wiki, канал =
|
||||||
mappa-сущности): ingest → query → lint + граф-слой для
|
mappa-сущности): ingest → query → lint + граф-слой для
|
||||||
@@ -42,7 +42,7 @@ README/ADR (не персистентная база знаний), проект
|
|||||||
|
|
||||||
## Три слоя (не смешивать)
|
## Три слоя (не смешивать)
|
||||||
|
|
||||||
1. **Raw-источники** — `sources/<slug>` страницы. Иммутабельны: читай, не
|
1. **Raw-источники** — `summaries/<slug>` страницы. Иммутабельны: читай, не
|
||||||
редактируй (единственное исключение — блок-цитата `> Status` по явной
|
редактируй (единственное исключение — блок-цитата `> Status` по явной
|
||||||
просьбе пользователя).
|
просьбе пользователя).
|
||||||
2. **Вики** — остальные страницы (entities/concepts/packages/contradictions/open-questions/overview).
|
2. **Вики** — остальные страницы (entities/concepts/packages/contradictions/open-questions/overview).
|
||||||
@@ -101,7 +101,7 @@ per-type рефы полными именами (`[[task:N]]`/`[[inbox:N]]`).
|
|||||||
|
|
||||||
1. Прочитай источник полностью.
|
1. Прочитай источник полностью.
|
||||||
2. Извлеки: entities, concepts, packages, кросс-резы.
|
2. Извлеки: entities, concepts, packages, кросс-резы.
|
||||||
3. Создай `sources/<slug>` — одну страницу-резюме на источник (~50–150 строк;
|
3. Создай `summaries/<slug>` — одну страницу-резюме на источник (~50–150 строк;
|
||||||
ссылку на raw клади в frontmatter `raw_path` + `ingested:`).
|
ссылку на raw клади в frontmatter `raw_path` + `ingested:`).
|
||||||
4. Для каждой затронутой страницы:
|
4. Для каждой затронутой страницы:
|
||||||
- есть → обнови (`wiki_update(project, id, body, version)` — version свежая
|
- есть → обнови (`wiki_update(project, id, body, version)` — version свежая
|
||||||
@@ -195,7 +195,7 @@ updated: 2026-08-24
|
|||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
Страницы `sources/` дополнительно несут `ingested: YYYY-MM-DD` и `raw_path: …`.
|
Страницы `summaries/` дополнительно несут `ingested: YYYY-MM-DD` и `raw_path: …`.
|
||||||
`contradictions/` — `status: open | resolved | accepted-divergence` и `affects:`.
|
`contradictions/` — `status: open | resolved | accepted-divergence` и `affects:`.
|
||||||
`open-questions/` — `status: open | answered | obsolete` и `touches:`.
|
`open-questions/` — `status: open | answered | obsolete` и `touches:`.
|
||||||
|
|
||||||
@@ -203,7 +203,7 @@ updated: 2026-08-24
|
|||||||
|
|
||||||
- `kebab-case`, **только латиница**. Кириллицу/др. скрипты транслитерируй
|
- `kebab-case`, **только латиница**. Кириллицу/др. скрипты транслитерируй
|
||||||
(`план переписывания` → `ozon-client-rewrite`). Оригинальный title — в H1 и frontmatter.
|
(`план переписывания` → `ozon-client-rewrite`). Оригинальный title — в H1 и frontmatter.
|
||||||
- `entities/<name>`, `concepts/<name>`, `packages/<name>`, `sources/<slug>`,
|
- `entities/<name>`, `concepts/<name>`, `packages/<name>`, `summaries/<slug>`,
|
||||||
`contradictions/<slug>`, `open-questions/<slug>`.
|
`contradictions/<slug>`, `open-questions/<slug>`.
|
||||||
|
|
||||||
### Оп-лог — таблица `logs`, не страница
|
### Оп-лог — таблица `logs`, не страница
|
||||||
@@ -224,7 +224,7 @@ level/since/component/entity, retention 14d). Ручную `log`-страниц
|
|||||||
|
|
||||||
| Ситуация | Что трогаем |
|
| Ситуация | Что трогаем |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Ingest одного документа | `sources/<slug>` (новая) + 3–15 entities/concepts/packages (+ опционально `index`) |
|
| Ingest одного документа | `summaries/<slug>` (новая) + 3–15 entities/concepts/packages (+ опционально `index`) |
|
||||||
| Query | (чтение) + возможно новая страница |
|
| Query | (чтение) + возможно новая страница |
|
||||||
| Query реляционный | graph_* (BFS), не чтение |
|
| Query реляционный | graph_* (BFS), не чтение |
|
||||||
| Lint | (чтение) + graph_backlinks/stats для сирот |
|
| Lint | (чтение) + graph_backlinks/stats для сирот |
|
||||||
@@ -232,8 +232,8 @@ level/since/component/entity, retention 14d). Ручную `log`-страниц
|
|||||||
|
|
||||||
## Частые ошибки
|
## Частые ошибки
|
||||||
|
|
||||||
- **Правка `sources/`.** Нельзя. Только статус-блок по явной просьбе.
|
- **Правка `summaries/`.** Нельзя. Только статус-блок по явной просьбе.
|
||||||
- **Дамп сырья в `sources/`.** Резюме — это резюме. Ссылайся на raw, не копируй.
|
- **Дамп сырья в `summaries/`.** Резюме — это резюме. Ссылайся на raw, не копируй.
|
||||||
- **Молчаливые перезаписи.** Новый источник противоречит странице — пометь
|
- **Молчаливые перезаписи.** Новый источник противоречит странице — пометь
|
||||||
блоком `> **Противоречие:**`; не затирай.
|
блоком `> **Противоречие:**`; не затирай.
|
||||||
- **Нарративный оп-лог.** Не веди его руками: сервис пишет logs сам (admin.logs).
|
- **Нарративный оп-лог.** Не веди его руками: сервис пишет logs сам (admin.logs).
|
||||||
@@ -253,7 +253,7 @@ level/since/component/entity, retention 14d). Ручную `log`-страниц
|
|||||||
## Red flags
|
## Red flags
|
||||||
|
|
||||||
- Реляционный вопрос → читаешь страницу вместо `graph_*`.
|
- Реляционный вопрос → читаешь страницу вместо `graph_*`.
|
||||||
- Правка `sources/` или молчаливая перезапись противоречия.
|
- Правка `summaries/` или молчаливая перезапись противоречия.
|
||||||
- Wiki-мутация update без version (last-write-wins) или create с выдуманным claim.
|
- Wiki-мутация update без version (last-write-wins) или create с выдуманным claim.
|
||||||
- Нарративный оп-лог руками.
|
- Нарративный оп-лог руками.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: project-bootstrap
|
name: project-bootstrap
|
||||||
author: ours
|
author: ours
|
||||||
version: 2.1.0
|
version: 2.2.0
|
||||||
description: >
|
description: >
|
||||||
Initializes or upgrades a project in the current folder: git, .gitignore, README.md,
|
Initializes or upgrades a project in the current folder: git, .gitignore, README.md,
|
||||||
.wiki/ using Karpathy's method, .tasks/ for task tracking, AGENTS.md (canon) with
|
.wiki/ using Karpathy's method, .tasks/ for task tracking, AGENTS.md (canon) with
|
||||||
@@ -198,7 +198,7 @@ v2 (mappa wiki-тулы). Файловый `.wiki/` — только для пр
|
|||||||
entities/ ← entity pages (people, services, modules) — empty .gitkeep
|
entities/ ← entity pages (people, services, modules) — empty .gitkeep
|
||||||
concepts/ ← concept / design decision pages — empty .gitkeep
|
concepts/ ← concept / design decision pages — empty .gitkeep
|
||||||
packages/ ← package pages — empty .gitkeep
|
packages/ ← package pages — empty .gitkeep
|
||||||
sources/ ← one summary per ingested source — empty .gitkeep
|
summaries/ ← one summary per ingested source (LLM, raw_path) — empty .gitkeep
|
||||||
```
|
```
|
||||||
|
|
||||||
Page-level workflow (ingest, query, lint) and file formats are owned by the
|
Page-level workflow (ingest, query, lint) and file formats are owned by the
|
||||||
@@ -223,7 +223,7 @@ file overrides the skill where they conflict.
|
|||||||
- `entities/` — discrete things the project tracks (people, services, modules).
|
- `entities/` — discrete things the project tracks (people, services, modules).
|
||||||
- `concepts/` — recurring ideas, design decisions, gotchas.
|
- `concepts/` — recurring ideas, design decisions, gotchas.
|
||||||
- `packages/` — code packages this project produces or consumes.
|
- `packages/` — code packages this project produces or consumes.
|
||||||
- `sources/` — one summary page per ingested external doc; frontmatter carries `ingested:` and `raw_path:`.
|
- `summaries/` — one summary page per ingested external doc; frontmatter carries `ingested:` and `raw_path:`.
|
||||||
- `overview.md` — single project-wide overview.
|
- `overview.md` — single project-wide overview.
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
@@ -298,7 +298,7 @@ Parseable: `grep "^## \[" .wiki/log.md | tail -20`.
|
|||||||
|
|
||||||
**Immutable.** Read, never edit. The only allowed modification is appending a `> Status:` blockquote when the user explicitly asks for a status audit.
|
**Immutable.** Read, never edit. The only allowed modification is appending a `> Status:` blockquote when the user explicitly asks for a status audit.
|
||||||
|
|
||||||
Place raw inputs here — articles, transcripts, PDFs, screenshots — exactly as they came in. The agent reads from `raw/`, writes summaries into `../sources/`, and never modifies raw files.
|
Place raw inputs here — articles, transcripts, PDFs, screenshots — exactly as they came in. The agent reads from `raw/`, writes summaries into `../summaries/`, and never modifies raw files.
|
||||||
|
|
||||||
For large or path-sensitive sources that live outside the repo, register them here:
|
For large or path-sensitive sources that live outside the repo, register them here:
|
||||||
|
|
||||||
@@ -307,7 +307,7 @@ For large or path-sensitive sources that live outside the repo, register them he
|
|||||||
\`\`\`
|
\`\`\`
|
||||||
```
|
```
|
||||||
|
|
||||||
The empty subdirectories (`entities/`, `concepts/`, `packages/`, `sources/`)
|
The empty subdirectories (`entities/`, `concepts/`, `packages/`, `summaries/`)
|
||||||
each get a `.gitkeep` so git tracks them.
|
each get a `.gitkeep` so git tracks them.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: using-markitdown
|
name: using-markitdown
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.0.1
|
version: 1.1.0
|
||||||
description: Use when capturing external content into a markdown-based knowledge base, wiki `raw/` directory, or any pipeline that must preserve the source's full text — for web pages, PDFs, DOCX/PPTX/XLSX, EPUB, CSV/JSON/XML, ZIP archives, images (with OCR/EXIF), audio (with transcription), or YouTube URLs. Also use when WebFetch returned an LLM-summarized version but the raw content is what's needed.
|
description: Use when capturing external content into a markdown-based knowledge base, wiki `raw/` directory, or any pipeline that must preserve the source's full text — for web pages, PDFs, DOCX/PPTX/XLSX, EPUB, CSV/JSON/XML, ZIP archives, images (with OCR/EXIF), audio (with transcription), or YouTube URLs. Also use when WebFetch returned an LLM-summarized version but the raw content is what's needed.
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ No mount caveats: the CLI is a normal local process. The old Docker `-v` mount t
|
|||||||
1. markitdown "https://example.com/foo.pdf" -o .wiki/raw/<slug>.md (kebab-case, Latin only)
|
1. markitdown "https://example.com/foo.pdf" -o .wiki/raw/<slug>.md (kebab-case, Latin only)
|
||||||
2. Inspect the head of the result. If it looks like a sign-in/cookie/consent page, abort — ask the user for an alternative (manual save, paste, authenticated source).
|
2. Inspect the head of the result. If it looks like a sign-in/cookie/consent page, abort — ask the user for an alternative (manual save, paste, authenticated source).
|
||||||
3. Register the new file in .wiki/raw/README.md.
|
3. Register the new file in .wiki/raw/README.md.
|
||||||
4. Hand off to the wiki ingest workflow (creates sources/<slug>.md summary + entity/concept updates).
|
4. Hand off to the wiki ingest workflow (creates summaries/<slug>.md summary + entity/concept updates).
|
||||||
```
|
```
|
||||||
|
|
||||||
For a huge (book-length) document, write straight to a file with `-o` and summarize *from the saved file* — do not pipe the whole markdown through working context.
|
For a huge (book-length) document, write straight to a file with `-o` and summarize *from the saved file* — do not pipe the whole markdown through working context.
|
||||||
@@ -63,7 +63,7 @@ For a huge (book-length) document, write straight to a file with `-o` and summar
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Output is a Google/Microsoft sign-in page in some random language | URI behind auth wall | Ask user to export the content manually (Save as PDF, copy-paste) and put it in `raw/` |
|
| Output is a Google/Microsoft sign-in page in some random language | URI behind auth wall | Ask user to export the content manually (Save as PDF, copy-paste) and put it in `raw/` |
|
||||||
| Output is mostly nav/cookie banner text | Site is JS-rendered or anti-bot | Try the cached or print URL; or ask user for HTML export |
|
| Output is mostly nav/cookie banner text | Site is JS-rendered or anti-bot | Try the cached or print URL; or ask user for HTML export |
|
||||||
| Output lacks images / diagrams | Markdown is text-only by design | Save the original asset separately under `raw/assets/`; reference it from the `sources/` summary |
|
| Output lacks images / diagrams | Markdown is text-only by design | Save the original asset separately under `raw/assets/`; reference it from the `summaries/` summary |
|
||||||
| `markitdown: command not found` | CLI not on `PATH` | Confirm with `markitdown --version` (expect `markitdown 0.1.6`); install with `pip install markitdown[all]` if missing |
|
| `markitdown: command not found` | CLI not on `PATH` | Confirm with `markitdown --version` (expect `markitdown 0.1.6`); install with `pip install markitdown[all]` if missing |
|
||||||
| Huge output (book-length) | Whole document converted in one call | Use `-o <file>` to save raw, then summarize *from the saved file* — do not hold the entire markdown in working context |
|
| Huge output (book-length) | Whole document converted in one call | Use `-o <file>` to save raw, then summarize *from the saved file* — do not hold the entire markdown in working context |
|
||||||
|
|
||||||
|
|||||||
@@ -118,9 +118,9 @@ permission to plan, not to commit.
|
|||||||
| `mcp__projects-meta__tasks_update` | `target_project`, `slug` + ≥1 mutable field | Sha-based optimistic lock; 422 on conflict |
|
| `mcp__projects-meta__tasks_update` | `target_project`, `slug` + ≥1 mutable field | Sha-based optimistic lock; 422 on conflict |
|
||||||
| `mcp__projects-meta__tasks_close` | `target_project`, `slug` (+ opt `note`) | Marks task 🟢 done with identity-footer |
|
| `mcp__projects-meta__tasks_close` | `target_project`, `slug` (+ opt `note`) | Marks task 🟢 done with identity-footer |
|
||||||
| `mcp__projects-meta__knowledge_ingest` | `target_project`, `type`, `slug`, `body` | Three commits: `<type>/<slug>.md` + `index.md` + `log.md` |
|
| `mcp__projects-meta__knowledge_ingest` | `target_project`, `type`, `slug`, `body` | Three commits: `<type>/<slug>.md` + `index.md` + `log.md` |
|
||||||
| `mcp__projects-meta__knowledge_promote` | `target_project`, `slug`, `body` | Move `raw/<slug>.md` → `sources/<slug>.md` |
|
| `mcp__projects-meta__knowledge_promote` | `target_project`, `slug`, `body` | Move `raw/<slug>.md` → `summaries/<slug>.md` |
|
||||||
|
|
||||||
`type` ∈ `entities` / `concepts` / `packages` / `sources` / `raw`.
|
`type` ∈ `entities` / `concepts` / `packages` / `summaries` / `raw`.
|
||||||
`target_project` = Gitea repo name, or `_meta` (meta-tasks / meta-wiki repos
|
`target_project` = Gitea repo name, or `_meta` (meta-tasks / meta-wiki repos
|
||||||
from `auth.toml`).
|
from `auth.toml`).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: using-projects-meta
|
name: using-projects-meta
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.2.0
|
version: 1.3.0
|
||||||
description: Use when working across multiple projects on one or many machines — cross-project task aggregation (`mcp__projects-meta__tasks_*`), shared Gitea-backed wiki query / ingest (`mcp__projects-meta__knowledge_*`), or sync diagnostics (`mcp__projects-meta__meta_status`). Triggers on phrases like "across all projects", "what's on the boards", "check shared wiki", "search projects-wiki", "ingest into shared wiki", "что у меня на досках", "по всем проектам", "общая вики", "cross-project status", or any time the user wants to see / mutate state in another repo than the current cwd. v1.1.0 mandates a Step 0 freshness gate (probe `meta_status`, sync if stale, pull `projects-wiki` before shared-wiki writes) — see SKILL body. Mutation tools require two-step preview → confirm. Skip for the **current** project's tasks/wiki — those live on disk in `.tasks/` / `.wiki/`.
|
description: Use when working across multiple projects on one or many machines — cross-project task aggregation (`mcp__projects-meta__tasks_*`), shared Gitea-backed wiki query / ingest (`mcp__projects-meta__knowledge_*`), or sync diagnostics (`mcp__projects-meta__meta_status`). Triggers on phrases like "across all projects", "what's on the boards", "check shared wiki", "search projects-wiki", "ingest into shared wiki", "что у меня на досках", "по всем проектам", "общая вики", "cross-project status", or any time the user wants to see / mutate state in another repo than the current cwd. v1.1.0 mandates a Step 0 freshness gate (probe `meta_status`, sync if stale, pull `projects-wiki` before shared-wiki writes) — see SKILL body. Mutation tools require two-step preview → confirm. Skip for the **current** project's tasks/wiki — those live on disk in `.tasks/` / `.wiki/`.
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ description: Use when working across multiple projects on one or many machines
|
|||||||
`projects-meta-mcp` is a local stdio MCP server. Two responsibilities:
|
`projects-meta-mcp` is a local stdio MCP server. Two responsibilities:
|
||||||
|
|
||||||
1. **Cross-project task aggregation** — parses `.tasks/STATUS.md` from every repo on the user's Gitea, caches them in `~/.cache/projects-mcp/tasks.json`. Read tools (`tasks_aggregate`, `tasks_search`, `tasks_get`) hit the cache. Mutations (`tasks_create`, `tasks_update`, `tasks_close`) commit back to Gitea with sha-based optimistic lock.
|
1. **Cross-project task aggregation** — parses `.tasks/STATUS.md` from every repo on the user's Gitea, caches them in `~/.cache/projects-mcp/tasks.json`. Read tools (`tasks_aggregate`, `tasks_search`, `tasks_get`) hit the cache. Mutations (`tasks_create`, `tasks_update`, `tasks_close`) commit back to Gitea with sha-based optimistic lock.
|
||||||
2. **Shared knowledge wiki** — single Gitea repo (`projects-wiki`) cloned at `~/projects/projects-wiki/` with content at `~/projects/projects-wiki/.wiki/`, structured as packages / concepts / entities / sources / raw. `knowledge_search` + `knowledge_get` for queries, `knowledge_ingest` + `knowledge_promote` for writes.
|
2. **Shared knowledge wiki** — single Gitea repo (`projects-wiki`) cloned at `~/projects/projects-wiki/` with content at `~/projects/projects-wiki/.wiki/`, structured as packages / concepts / entities / summaries / raw. `knowledge_search` + `knowledge_get` for queries, `knowledge_ingest` + `knowledge_promote` for writes.
|
||||||
|
|
||||||
Source of truth: Gitea (`https://git.kzntsv.site`, owner `OpeItcLoc03`). Cache and clone are local convenience.
|
Source of truth: Gitea (`https://git.kzntsv.site`, owner `OpeItcLoc03`). Cache and clone are local convenience.
|
||||||
|
|
||||||
@@ -140,8 +140,8 @@ Use MCP only for **other** projects, **other** machines, or **shared** wiki cont
|
|||||||
| `mcp__projects-meta__tasks_create` | `target_project`, `slug`, `description`, `next_action` (+ opt `where_stopped`, `status`, `blocker`, `branch`, `source_project`) | Append block to `<target>/.tasks/STATUS.md` via Gitea commit |
|
| `mcp__projects-meta__tasks_create` | `target_project`, `slug`, `description`, `next_action` (+ opt `where_stopped`, `status`, `blocker`, `branch`, `source_project`) | Append block to `<target>/.tasks/STATUS.md` via Gitea commit |
|
||||||
| `mcp__projects-meta__tasks_update` | `target_project`, `slug` + ≥1 of `where_stopped` / `next_action` / `blocker` / `branch` / `description` / `status` | Sha-based optimistic lock; 422 on conflict |
|
| `mcp__projects-meta__tasks_update` | `target_project`, `slug` + ≥1 of `where_stopped` / `next_action` / `blocker` / `branch` / `description` / `status` | Sha-based optimistic lock; 422 on conflict |
|
||||||
| `mcp__projects-meta__tasks_close` | `target_project`, `slug` (+ opt `note`) | Sets task to 🟢 done; appends identity-footer |
|
| `mcp__projects-meta__tasks_close` | `target_project`, `slug` (+ opt `note`) | Sets task to 🟢 done; appends identity-footer |
|
||||||
| `mcp__projects-meta__knowledge_ingest` | `target_project`, `type`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Three commits: `<type>/<slug>.md` + `index.md` + `log.md`. `type` ∈ entities / concepts / packages / sources / raw |
|
| `mcp__projects-meta__knowledge_ingest` | `target_project`, `type`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Three commits: `<type>/<slug>.md` + `index.md` + `log.md`. `type` ∈ entities / concepts / packages / summaries / raw |
|
||||||
| `mcp__projects-meta__knowledge_promote` | `target_project`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Move `raw/<slug>.md` → `sources/<slug>.md` with auto `raw_path` link |
|
| `mcp__projects-meta__knowledge_promote` | `target_project`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Move `raw/<slug>.md` → `summaries/<slug>.md` with auto `raw_path` link |
|
||||||
|
|
||||||
`target_project` is **qualified** `<owner>/<repo>` (e.g. `victor/books`, `OpeItcLoc03/skills`), or the literal `agenda` for the cross-project meta-board (resolves via `agenda_tasks_repo` in `auth.toml`). Bare names (`books`) are rejected with a hint to use the qualified form. Cross-cutting design: shared wiki → `concepts/projects-meta-multi-owner`.
|
`target_project` is **qualified** `<owner>/<repo>` (e.g. `victor/books`, `OpeItcLoc03/skills`), or the literal `agenda` for the cross-project meta-board (resolves via `agenda_tasks_repo` in `auth.toml`). Bare names (`books`) are rejected with a hint to use the qualified form. Cross-cutting design: shared wiki → `concepts/projects-meta-multi-owner`.
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ User: "close `[projects-meta-skills]` in skills"
|
|||||||
| Acting on a stale `tasks_aggregate` without checking `meta_status` | Step 0 — Freshness gate is mandatory. If `cache_age_minutes` > 10 (or errors > 0), run `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js` first. |
|
| Acting on a stale `tasks_aggregate` without checking `meta_status` | Step 0 — Freshness gate is mandatory. If `cache_age_minutes` > 10 (or errors > 0), run `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js` first. |
|
||||||
| Skipping `git -C ~/projects/projects-wiki pull` before `knowledge_ingest` / `knowledge_promote` | sha-based optimistic lock will reject the commit (422) and the failure is opaque. Pull is unconditional for shared-wiki writes — fast-forward is a no-op when current. |
|
| Skipping `git -C ~/projects/projects-wiki pull` before `knowledge_ingest` / `knowledge_promote` | sha-based optimistic lock will reject the commit (422) and the failure is opaque. Pull is unconditional for shared-wiki writes — fast-forward is a no-op when current. |
|
||||||
| Treating sync 401/403 as "MCP is fine, the page just doesn't exist yet" | 401/403 means the Gitea token is dead. Stop, tell the user to rotate `gitea_token` in `~/.config/projects-mcp/auth.toml`. Never guess on stale data. |
|
| Treating sync 401/403 as "MCP is fine, the page just doesn't exist yet" | 401/403 means the Gitea token is dead. Stop, tell the user to rotate `gitea_token` in `~/.config/projects-mcp/auth.toml`. Never guess on stale data. |
|
||||||
| Calling `knowledge_ingest` with the wrong `type` | `type` must be one of `entities` / `concepts` / `packages` / `sources` / `raw`. Mis-typed pages land in the wrong section and break `index.md`. |
|
| Calling `knowledge_ingest` with the wrong `type` | `type` must be one of `entities` / `concepts` / `packages` / `summaries` / `raw`. Mis-typed pages land in the wrong section and break `index.md`. |
|
||||||
| Vague `knowledge_search` queries ("auth", "config") | Specific multi-word queries return targeted snippets; vague ones return noise. |
|
| Vague `knowledge_search` queries ("auth", "config") | Specific multi-word queries return targeted snippets; vague ones return noise. |
|
||||||
| Forgetting `domain="all"` when searching across families | Default `domain` is auto-detected from cwd; use `"all"` if the wiki page lives in a different family. |
|
| Forgetting `domain="all"` when searching across families | Default `domain` is auto-detected from cwd; use `"all"` if the wiki page lives in a different family. |
|
||||||
| Passing bare project name (`target_project: "books"`) to mutation tools | v2.x rejects bare names. Use qualified `<owner>/<repo>` (e.g. `victor/books`, `OpeItcLoc03/skills`). Literal `agenda` is the only exception (cross-project meta-board). |
|
| Passing bare project name (`target_project: "books"`) to mutation tools | v2.x rejects bare names. Use qualified `<owner>/<repo>` (e.g. `victor/books`, `OpeItcLoc03/skills`). Literal `agenda` is the only exception (cross-project meta-board). |
|
||||||
|
|||||||
Reference in New Issue
Block a user