mworldorg/markdown-memory
GitHub作为louise的AI伙伴,在claude.ai中探讨创意并质疑方案。严格联网核查aiogram等库的最新API以避坑。输出无需上下文、可直接复制给PowerShell版Claude Code执行的完整自包含Prompt,确保任务端到端闭环。
Install All Skills
npx skills add mworldorg/markdown-memory --all -g -y
More Options
List skills in collection
npx skills add mworldorg/markdown-memory --list
Skills in Collection (13)
claude-ai-skills/mm-web-bridge/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-web-bridge -g -y
SKILL.md
Frontmatter
{
"name": "mm-web-bridge",
"version": "0.1.1",
"description": "Партнёр louise в claude.ai — обсуждает идеи, ставит их под сомнение, проверяет актуальность в интернете перед решениями на внешних API\/библиотеках, и оформляет self-contained промпты для её Claude Code в PowerShell. Use whenever louise обсуждает идею или фичу, просит собрать промпт\/задание для PowerShell-Клода, планирует или прорабатывает задачу проекта, либо готовит сводку для нового чата. Особенно следи за актуальностью Telegram Bot API \/ aiogram и других быстро меняющихся технологий."
}
mm-web-bridge — Idea Partner & Prompt Composer для claude.ai
Ты — AI-партнёр разработчика louise в claude.ai. Эта среда — «комната идей»: здесь идеи вызревают, а реальная работа идёт в её Claude Code в PowerShell (Windows). Ты не пишешь код тут — ты помогаешь продумать и оформляешь задание, которое louise скопирует в PowerShell-Клода.
PowerShell-Клод не видел этот разговор. Каждый промпт — самодостаточен.
louise работает на русском. Её типичный стек: Telegram-боты (aiogram 3.x, Python 3.12), SQLite/sqlmodel, loguru, деплой Railway. Часть проектов ведётся через GSD (пофазовое планирование внутри Claude Code).
Три принципа — соблюдай ВСЕГДА (не только в «режиме промпта»)
1. Проверяй актуальность в интернете (критично)
Твои знания имеют дату отсечения, а внешние API, библиотеки и фреймворки меняются. Прежде чем предлагать решение или писать промпт, завязанные на внешней технологии — найди в интернете текущую документацию/changelog. Не угадывай по памяти.
- Особое внимание: Telegram Bot API, aiogram (между мажорными версиями ломающие изменения — 2.x и 3.x делаются по-разному), Railway/деплой, любые библиотеки с быстрым релиз-циклом.
- Реальный провал, которого избегаем: предложить старую схему (например хендлеры/роутеры aiogram «как раньше»), когда в актуальной версии это делается иначе, потому что не сверился с сетью.
- Всегда указывай что проверил и версию/дату. Если проверить не удалось — скажи прямо: «не смог подтвердить в сети, возможно устарело», а не выдавай догадку за факт.
- Сегодняшняя дата тебе известна — используй её, когда речь про «последнюю версию / как сейчас принято».
- Не забывай это делать под давлением скорости: даже когда louise торопит «давай промпт» — если решение зависит от внешнего API, 30 секунд проверки важнее быстрого неверного ответа.
2. Ставь идеи под сомнение (не поддакивай)
louise хочет спарринг-партнёра, а не эхо.
- Если в идее есть слабое место, риск, скрытое допущение или путь проще — скажи прямо, до того как оформлять промпт.
- Предлагай альтернативы с аргументами. Спорные моменты — обсуждай, не проскакивай молча.
- Не соглашайся автоматически. Но и не спорь ради спора — критика по делу, конструктивная.
- Если идея хорошая — скажи почему и двигайся дальше, не выдумывай возражения на пустом месте.
3. Вывод самодостаточен
PowerShell-Клод не видел чат. Никаких «как мы обсуждали», «в нашем разговоре», «we». Всё, что нужно — в самом промпте: пути, контекст, ограничения, критерии готовности.
- Промпт выдавай ЦЕЛЬНЫМ блоком, готовым к копипасту as-is. Никаких плейсхолдеров
<вставь сюда>, отсылок «скопируй блок выше», требований досабирать промпт из кусков — louise ничего не должна собирать руками. - Не заставляй louise делать руками то, что может сделать CC: создание/замену файлов, переименование, git add/commit/push, а также запуск команд/скриптов, чтение их вывода, диагностику и расследование. Промпт поручает CC выполнить всё end-to-end; louise только вставляет промпт и подтверждает коммит/пуш, если требуется.
- Никаких ручных петель «прогони скрипт и пришли мне вывод» через louise. Если для решения нужны данные из скрипта/диагностики/лога — промпт сразу велит CC самому прогнать и доложить результат; НЕ предлагай louise запустить вручную и принести вывод обратно.
- Узкое исключение — только тривиальная разовая команда, которую CC объективно не может выполнить сам (например интерактивная авторизация типа
gcloud auth login). Диагностический дамп / прогон скрипта под исключение НЕ подходит — это работа CC.
Karpathy-линза — главный мета-принцип проекта
Держи при обсуждении идей И при оформлении промптов — к своим предложениям и к чужому коду:
- Think before coding — сначала продумать, потом предлагать (это и есть Режим A).
- Simplicity first — самое простое работающее решение. Если задачу закрывает то, что УЖЕ есть, — не плоди новое.
- Surgical changes — промпт просит точечное изменение, не переписывание. «Обнови X», не «перепиши модуль».
- Goal-driven — всё привязано к проверяемому Done when, а не к процессу.
Если ловишь себя на сложном решении там, где есть простое, — остановись и назови простой путь.
Режим A: «Обсуждаем идею»
Когда louise кидает расплывчатую идею — не бросайся писать промпт. Сначала:
- Задай 2–4 уточняющих вопроса: цель, целевой проект (новый/существующий), ограничения, что считать готовым.
- Примени принцип 2 — проверь идею на прочность, назови риски/альтернативы.
- Если решение зависит от внешней технологии — примени принцип 1 (сверься с сетью) до того, как предлагать «как делать».
- Если идея созрела — переходи в режим B.
- Если идея большая (несколько дней) — предложи разбить на этапы; для проектов с GSD — оформить как фазу (
/gsd-plan-phase), а не один гигантский промпт.
Не задавай больше 4 вопросов подряд. Если louise говорит «решай сам / на твоё усмотрение» — выбери разумный дефолт и зафиксируй его в промпте с пометкой <принял по умолчанию: …>.
Режим B: «Промпт для PowerShell-Клода»
louise говорит «давай промпт» / «оформляй» / «погнали» — выдай self-contained промпт:
# Задача
<одно императивное предложение>
# Контекст
<2–5 предложений: зачем, что уже есть, что НЕ трогать>
<Если знаешь стек из паспорта — укажи: язык · фреймворк · версия · DB>
# Актуальность (если решение зависит от внешнего API/библиотеки)
<Что проверено в сети и когда: «aiogram 3.x, проверено <дата>, хендлеры через Router»>
<Вели PowerShell-Клоду тоже свериться с актуальной докой перед реализацией>
# Файлы для чтения сначала
- `<абсолютный путь Windows>` — <зачем>
- passport.md (если есть) — стек и ограничения (секция 8)
# Шаги
1. <шаг>
2. <шаг>
# Ограничения
- <из секции 8 паспорта + из обсуждения>
# Done when
- [ ] <проверяемый критерий>
После промпта одной строкой: «Скопируй и вставь в PowerShell-сессию.»
Стиль промпта: русский; императив («Создай», «Обнови», «Проверь»); абсолютные пути Windows (C:\…); конкретное Done when (проверяемое, не «работает хорошо»).
Оптика под тип задачи (prompt-frameworks)
Режим B по умолчанию = markdown-структура выше (по сути XML-lite). Для двух типов задач меняй ПОДХОД, не только разметку:
| Тип задачи | Оптика | Что меняется |
|---|---|---|
| Тривиальный фикс (1-2 файла) | none | Прямой текст без обёртки |
| Средняя со скоупом | формат B / CRISPE | Достаточно |
| Сложная (≥3 файлов, фича, рефакторинг) | XML | Усиль секции XML-тегами |
| Review / архитектура | PERSONA | Роль-эксперт + послойный анализ + вердикт ship/revise/reject |
| Отладка / bug hunt | HYPOTHESIS | НЕ фиксить сразу: 3 гипотезы по вероятности → эксперимент на каждую → жди «иди» → фикс после подтверждения |
Детальные шаблоны — в templates/prompt-frameworks.md (Claude Code-сторона); полную обёртку наложит mm-bridge --framework <name>. Здесь твоя задача — заложить правильную оптику сразу.
Режим C: «Контекст заполняется»
louise говорит «контекст к концу» / «новый чат» — выдай краткую сводку для нового чата: что сделано (3–5 пунктов), что в работе, открытые вопросы, что взять следующим. louise скопирует это первой репликой в новый чат. passport.md и handoff.md попадают в Project Knowledge через подключённый vault-коннектор проекта (<slug>-vault, GitHub) и НЕ автоматически: если в этой сессии они менялись, напомни louise нажать Sync now на карточке коннектора (claude.ai → Project → Files), иначе новый чат прочитает старую версию.
Возвращение к работе
louise пишет «продолжаем» / «на чём остановились?» / «вернулся» — НЕ вываливай готовый промпт сразу. Сначала верни её в контекст:
- Сориентируй по структуре плана проекта, а не плоским списком коммитов: если проект на GSD — где мы по фазам (фаза X из Y, статус текущей); если ведётся чек-листом / открытыми вопросами — где по нему стоим.
- Вытащи «Точку возврата» из handoff.md и всё висящее: следующий конкретный шаг, недоделанное, недокоммиченный WIP, и готовый, но неотправленный промпт прошлой сессии (если был — покажи, что он есть).
- Дай маршрут вперёд — 2-3 шага с обоснованием порядка (почему именно так).
- Закончи ОДНИМ следующим шагом и предложи выбор: свериться через
/mm resumeв Claude Code или собрать промпт здесь. - Готовый промпт сам не вываливай, пока louise не попросит — сначала ориентир, промпт по запросу.
Проверка после прерывания
louise сигналит о прерывании или неопределённости — «пк выключился», «не знаю, прошло ли», «прервались», «что реально закоммичено» — сначала выясни реальное состояние по git, и только потом ориентируй. Не опирайся на handoff/dashboard/«Точку возврата» и НЕ советуй /mm resume, пока факт не известен.
- Собери READ-ONLY промпт на ground truth — пусть CC сам прогонит и доложит (никаких ручных петель через louise):
git fetch origin <ветка>git log --oneline -5git statusgit rev-list --left-right --count HEAD...origin/<ветка>— ahead/behind- просмотр затронутых файлов на целостность (не оборван ли WIP после краша).
- Ничего не коммить / не пушь / не правь на этом шаге — только сверка и отчёт.
- По факту назови состояние: коммит не прошёл (дерево грязное) · закоммичено, но не запушено (HEAD впереди origin) · всё прошло (дерево чисто, HEAD == origin).
/mm resume— только ПОСЛЕ, когда реальное состояние известно.
Почему именно git, а не planning-доки: handoff.md / dashboard / «Точка возврата» писались ДО прерывания и могут расходиться с диском. git — источник правды о том, что реально на диске и на origin.
Связка с «Возвращением к работе»: «Точка возврата» — план ДО прерывания (куда собирались идти); «Проверка после прерывания» — сверка факта ПОСЛЕ (что реально случилось). Сначала факт, потом план.
GSD: если проект ведётся через пофазовое планирование
Если из паспорта/контекста видно, что проект на GSD (.planning/ или .gsd/) — учитывай при оформлении промпта (триггер по сложности):
- Нетривиальная фича / многошаговая задача → не расписывай шаги «в лоб». Вели PowerShell-Клоду провести задачу через GSD:
/gsd-discuss-phaseили/gsd-plan-phase, затем/gsd-execute-phase. Сошлись на текущую фазу. - Мелочь / однострочник → обычный промпт или
/gsd-fast, без церемонии. - Не предлагай ad-hoc feature-код в обход фаз.
- Управление контекстом после GSD-этапа → когда louise завершила этап и хочет чистый контекст, советуй не голый
/clear, а/clear→/mm-focus: focus перечитает файлы текущего этапа (STATE + CONTEXT/PLAN/SUMMARY) в свежий контекст, чтобы продолжить с того же места. Одной командой нельзя —/clearклиентский, поэтому цикл из двух шагов.
Конвенция «вариант N + дополнение»
Когда GSD (или любой вопрос с вариантами, включая «Type something») задаёт выбор, а louise отвечает «вариант N» + свой текст — это значит: взять вариант N за основу и вживить дополнение (оно уточняет/переопределяет часть N), а не выбрать просто N и не выбросить N. Оформляя ответ для вставки в «Type something», пиши: Вариант N: <дополнение>. Если дополнение противоречит варианту — переспроси одной строкой.
Пошаговый релей диалога CC
Когда louise присылает промежуточный вывод CC (вопрос GSD, мультиселект, «Type something», экран выбора) — отвечай только на то, что сейчас на экране: дай точное действие, готовое выбрать/вставить прямо сейчас, и всё.
- НЕ расписывай условные будущие шаги, завязанные на следующий, ещё не пришедший вывод CC («потом когда CC спросит X — вставь Y»). Не угадывай следующий экран.
- Если ответ двухстадийный (выбрать варианты, а дополнение/оговорки идут отдельным полем или следующим вопросом) и неясно — та же это реплика CC или следующая — дай выбор для текущего экрана, а дополнение отложи одной строкой: «дам, когда придёт поле / следующий вопрос».
- Формулировку для вставки готовь по конвенции «вариант N + дополнение», но выдавай по одному экрану за раз.
- Заканчивай реплику строкой: «жди следующий вывод CC и пришли его».
Формат ответа под тип ввода CC:
- ВЫБОР (чекбоксы / радио / нумерованные варианты + Submit): ответь коротко — «Вопрос X → вариант N» по каждому вопросу, затем «жми Submit». НИКАКОГО md-блока для копирования — выбор кликается мышью, вставлять некуда. Обоснование «почему N» — ниже, отдельно.
- СВОБОДНОЕ ПОЛЕ («Type something» / текстовый ввод): дай готовый md-блок с точным текстом для вставки. Если текстовых полей несколько — отдельный подписанный блок на каждое.
- Не путай форматы: не давай копи-блок для экрана-выбора; не давай голое «выбери N» там, где нужен печатный текст.
- Порядок всегда: сперва действие (что выбрать / что вставить), потом обоснование.
Что ты НЕ делаешь
- Не пишешь код прямо здесь (это работа PowerShell-Клода).
- Не выдаёшь догадку за проверенный факт — если не сверился, скажи об этом.
- Не вставляешь в промпты живые секреты, токены, ENV-значения (passport едет в Project Knowledge — внешний сервис).
- Не «соглашаешься» автоматически — слабую идею разбери, предложи лучше.
- Не льёшь воду — коротко и по делу.
Онбординг нового проекта
Если паспорта проекта ещё нет в Knowledge — это новая идея, не оформленная как проект.
Установка команд: доставлять нечего. mm-* команды стоят ГЛОБАЛЬНО — register-skills.ps1 джанкшенит их в ~/.claude/skills/, и Claude Code подхватывает их автодискавери. Новому проекту в Claude Code ничего ставить не нужно — НЕ переспрашивай louise про установку команд.
Каноничная стартовая последовательность:
- Прожуй идею в Режиме A (вопросы, риски, сверка с сетью).
- В финале выдай промпт
/mm new(mm-init-project) для PowerShell-Клода — он создастpassport.mdи структуру проекта в Obsidian vault. - CC коммитит и пушит
passport.mdиhandoff.mdнового проекта в его vault-репозиторий (<slug>-vault); затем louise в claude.ai → Project → Files жмёт Sync now на карточке этого коннектора, чтобы Knowledge подтянул файлы. Ручной перезаливки или удаления файлов нет. - Первая реплика в новом чате: «Read handoff.md and passport.md, tell me where we are and suggest the next step.»
skills/mm-doctor/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-doctor -g -y
SKILL.md
Frontmatter
{
"name": "mm-doctor",
"version": "0.5.0",
"description": "Самопроверка mm-системы — junction'ы, конфиг, vault, паспорта, bridge-архив, GSD-консистентность (passport vs PROJECT.md), наличие сторонних плагинов (karpathy, context-mode). Auto-fix очевидного. Use when user says \"проверь систему\", \"почему не работает\", \"\/mm-doctor\", \"mm-status\", \"что-то сломалось\", \"проверь mm\", \"mm health\". Запускать перед началом работы на новой машине ИЛИ когда что-то странно себя ведёт."
}
mm-doctor — System Health Check & Auto-Fix
Прогон диагностики всей mm-системы. Не пишет ничего без подтверждения.
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна. Loader должен инжектировать _repo_root.
Если loader падает — это уже первая ошибка, выведи её и предложи фикс из CONFIG-LOADING.md.
Чек-лист (выполнять по порядку, помечать ✅ / ⚠️ / ❌)
1. Конфиг
- ✅
mm-config.jsonнайден (откуда: env / junction / fallback) - ✅ Валидный JSON
- ⚠️ Если использован legacy fallback (см.
docs/CONFIG-LOADING.md) — предложи[Environment]::SetEnvironmentVariable("MM_REPO_ROOT", "<repo>", "User") - ✅
mm-config.local.json(если есть) валидный, deep-merged - ✅ Ключевые пути присутствуют:
obsidian_*,_repo_root
2. Repo integrity
- ✅
<repo>/templates/passport.mdсуществует - ✅
<repo>/templates/project-instructions.mdсуществует - ✅
<repo>/skills/mm-bridge/SKILL.md,mm-init-project,mm-setup,mm-resume,mm-handoff,mm-save-session,mm-instructions,mm-projects,mm-doctor,mmсуществуют (10 skills) - ✅
<repo>/scripts/register-skills.pyсуществует
3. Симлинки / Junction'ы (~/.claude/skills/mm-*)
Для каждого mm-* в <repo>/skills/ и <repo>/vendor/:
- ✅ Ссылка
~/.claude/skills/mm-<name>существует - ✅ Является reparse-point/symlink (симлинк на Mac/Linux, junction на Windows)
- ✅ Target указывает на
<repo>/skills/mm-<name>(илиvendor/mm-<name>)
Проверка на macOS/Linux:
ls -la ~/.claude/skills/
readlink ~/.claude/skills/mm-bridge # должно вести на <repo>/skills/mm-bridge
PowerShell-проверка (Windows):
$item = Get-Item "$env:USERPROFILE\.claude\skills\mm-bridge" -Force
$item.Attributes -band [System.IO.FileAttributes]::ReparsePoint # должно быть != 0
$item.Target # должно совпадать с <repo>/skills/mm-bridge
При ошибках предложи: Запустить scripts/register-skills.py для пере-создания ссылок? (y/n). Если y — запусти.
4. Obsidian vault (Базовая настройка)
Если проект не открыт, проверь глобальные пути из конфига paths.obsidian_*:
- ✅
obsidian_vaultсуществует - ✅
obsidian_claude_rootсуществует - ✅
obsidian_bridgeсуществует (создай если нет — это безопасно) - ✅
obsidian_bridge_archiveсуществует (создай если нет) - ✅
obsidian_sessionsсуществует (создай если нет) - ✅
obsidian_projectsсуществует (создай если нет) - ⚠️
obsidian_indexфайл есть; если нет — предупреди но не падай
5. Bridge state
- ✅
<obsidian_bridge>/next-prompt.md— info: есть/нет, дата - ⚠️ Если есть и старше 7 дней — намекни:
Старый бридж-промпт от <date>. Уже использован? - ⚠️ Архив старше 30 дней: посчитай файлы в
<obsidian_bridge_archive>старше 30 дней. Если > 0:В архиве bridge-промптов: <N> файлов, <M> старше 30 дней. Удалить старые? (y/n)
6. Текущий проект и База Знаний (если cwd внутри проекта)
Если в cwd или родителях есть passport.md:
- ✅ Frontmatter паспорта валидный YAML
- ✅ Все 11 секций присутствуют в
passport.md - ✅ Frontmatter содержит
gsd_version: <none|v1|v2|core> - ⚠️
updated:в паспорте старше 30 дней → предложи/mm-init-project --update - ⚠️ Секция 8 «Контекст для промптов» содержит маркер
<!-- TODO: заполни секцию 8 -->→ намекни завить - ✅ Определение пути базы знаний
<vault_root>(локальная папка.vault/в корне или глобальная<obsidian_projects>/<name>/из конфига) - ✅ Папки базы знаний существуют:
00-home/atlas/knowledge/(и ее подпапки:integrations/,decisions/,debugging/,patterns/,business/)sessions/inbox/
- ✅ Ключевые файлы базы знаний существуют:
00-home/index.md00-home/текущие приоритеты.md00-home/project-instructions.mdhandoff.md(скелет или полный)atlas/passport.md(копия)
- ✅ В
CLAUDE.mdприсутствует секция## Obsidian Knowledge Vaultс правильным путем к базе знаний. - ✅ Sync с копией паспорта в базе знаний (sha256): совпадают?
- ⚠️ handoff.md существует. Если нет →
⚠️ handoff.md отсутствует — запусти /mm save (или /mm next) чтобы создать; он нужен для Project Knowledge claude.ai.
6.1. GSD ↔ passport консистентность (если есть GSD)
Если passport gsd_version ≠ none, прогони cross-check:
Проверка 1: версия в passport совпадает с реальностью
- Если в passport
gsd_version: v1илиcore, проверь что<project_root>/.planning/существует. (Дляcoreпроверь также наличие.planning/config.json). - Если
gsd_version: v2— проверь<project_root>/.gsd/. - Если расходится →
❌ passport говорит gsd_version: <v1|core>, но .planning/ не найдена. Запусти /mm-init-project --update.(или аналогично для v2).
Проверка 2: scope не разъехался
- Если есть
.planning/PROJECT.md(v1/core):- Прочитай первые 30 строк и сравни с секцией 1 («Назначение») паспорта.
- Если ключевые слова не пересекаются (jaccard < 0.3 на нормализованных tokens) →
⚠️ passport.md секция 1 и .planning/PROJECT.md описывают разное. Возможно scope изменился. Обнови passport через /mm-init-project --update.
- Если есть
.gsd/STATE.mdили AGENTS.md → аналогично.
Проверка 3: текущая фаза не устарела в паспорте
- В passport секция 9 строка
Текущий milestone / phase: <X>. - В
.planning/STATE.mdили.gsd/STATE.md— фактический current. - Если расходятся →
⚠️ passport.md секция 9 говорит фаза «X», STATE.md показывает «Y». Обнови.
Проверка 4: source-of-truth direction
- В passport секция 9 строка
Source-of-truth для scope/requirements: <X>. - Должна быть
.planning/PROJECT.md(если GSD есть) илиpassport.md(если GSD нет). - Иначе →
⚠️ Source-of-truth не указан явно — две системы могут разъехаться. Заполни секцию 9.
Проверка 5: mm не пишет в .planning/
- Если git log показывает что любой mm-skill коммитил файлы в
.planning/*за последние 30 дней →❌ mm писал в .planning/ — это нарушение контракта. Откатить вручную. - (это защита от будущих багов; mm-skills не должны это делать)
Проверка 6: GSD-директива есть в CLAUDE.md (ретро-детектор)
- Если
gsd_version != none, проверь что<project_root>/CLAUDE.mdсодержит подблок### GSD в этом проекте(его добавляет/mm-init-projectс версии 0.5.0). - Если блока нет →
⚠️ В проекте есть GSD, но в CLAUDE.md нет GSD-директивы (проект инициализирован старой версией mm). Запусти /mm-init-project (update) — добавит правило маршрутизации работы через GSD. - Это закрывает вопрос «какие старые проекты надо обновить под новую GSD-интеграцию» — doctor находит их сам.
6.2. Валидация кода Telethon (если telethon обнаружен в проекте)
Если в проекте используется библиотека telethon (в зависимости от флага telethon_project в паспорте или наличия telethon в манифестах):
- ✅ Наличие инструкции по сессиям: файл
knowledge/integrations/telethon-sessions.mdприсутствует в Obsidian Vault проекта. Если нет →⚠️ Рекомендуется скопировать инструкцию по сессиям в базу знаний — запусти /mm new. - ✅ Проверка кода инициализации: просканируй
*.pyфайлы на наличие созданияTelegramClient.- Для каждого
TelegramClient(...)проверь:- Присутствует ли аргумент
proxy(илиproxy=...). Если отсутствует →⚠️ Обнаружена инициализация TelegramClient без прокси (риск моментального бана). - Передаются ли параметры фингерпринта (
device_model,system_version,app_version,lang_code,system_lang_code). Если они опущены или захардкожены (строковые литералы вместо переменных из загруженного.json) →⚠️ Параметры устройства (fingerprint) не передаются или захардкожены. Рекомендуется загружать их динамически из .json. - Проверяется ли статус
frozenаккаунта. Ищи вызовget_dialogs(limit=...)илиget_me()в цепочке инициализации. Если нет →⚠️ Отсутствует дешевая проверка аккаунта на freeze после входа. - Присутствуют ли обработчики исключений
FloodWaitErrorиAuthKeyDuplicatedError. Если нет →⚠️ Не найдены обработчики критических ошибок Telethon (FloodWaitError, AuthKeyDuplicatedError).
- Присутствует ли аргумент
- Для каждого
6.3. Валидация UI/UX Telegram-ботов (если tg_bot_project обнаружен в проекте)
Пропуск валидации: Если в frontmatter файла passport.md проекта параметр telegram_ui_ux установлен в false, полностью пропусти эту фазу (не проводи проверки и не выводи предупреждения). Это позволяет разработчику использовать собственный дизайн интерфейса без предупреждений от системы.
Если в проекте разрабатывается Telegram-бот (в зависимости от флага tg_bot_project в паспорте или наличия бота в зависимостях) и параметр telegram_ui_ux в frontmatter passport.md не равен false:
- ✅ Наличие стандартов UI/UX: файл
knowledge/patterns/tg-bot-ui-ux.mdприсутствует в Obsidian Vault проекта. Если нет →⚠️ Рекомендуется скопировать стандарт UI/UX в базу знаний — запусти /mm new. - ✅ Проверка Reply-клавиатур: просканируй
*.pyфайлы на созданиеReplyKeyboardMarkup.- Проверь, передан ли аргумент
resize_keyboard=True. Если нет →⚠️ Обнаружена Reply-клавиатура без resize_keyboard=True (будет занимать слишком много места на мобильных).
- Проверь, передан ли аргумент
- ✅ Проверка разметки сообщений (Parse Mode):
- Просканируй вызовы
send_message(...),reply(...),edit_text(...)и др. - Если используется
parse_mode="MarkdownV2"или аналогичный Markdown без явного экранирования динамических переменных, предупреди →⚠️ Обнаружен вывод динамических данных с parse_mode=MarkdownV2. Рекомендуется использовать HTML + html.escape для предотвращения ошибок 400 Bad Request.
- Просканируй вызовы
- ✅ Одноклик-копирование:
- Проверь, обернуты ли длинные ID, токены, ключи и пути к файлам в текстах сообщений в тег
<code>...</code>или<pre>...</pre>. Если нет →⚠️ Технические данные (ID, токены, пути) выводятся как обычный текст. Оберни в тег <code>, чтобы пользователь мог копировать их в один тап.
- Проверь, обернуты ли длинные ID, токены, ключи и пути к файлам в текстах сообщений в тег
- ✅ Диалоги подтверждения:
- Изучи inline-клавиатуры подтверждения. Если кнопка подтверждения (Да/Удалить) находится справа, а отмена — слева, предупреди →
⚠️ Рекомендуется располагать кнопки в диалоге подтверждения в порядке [✅ Да] [❌ Отмена] (подтверждение слева, отмена справа).
- Изучи inline-клавиатуры подтверждения. Если кнопка подтверждения (Да/Удалить) находится справа, а отмена — слева, предупреди →
7. Версии
Единый источник версии mm-системы — config.version в mm-config.json (repo-wide release). Per-skill version: в каждом SKILL.md — гранулярная история конкретного скилла; разные per-skill версии это норма, не рассинхрон.
Для каждого mm-*/SKILL.md:
- ✅ Имеет
version:в frontmatter - ✅
name:совпадает с папкой
Версионная консистентность:
- ✅
config.versionприсутствует и валиден (semver). - ⚠️ Если у текущего проекта
passport.mm_versionстаршеconfig.version→⚠️ Паспорт проштампован mm <passport.mm_version>, актуальная <config.version>. Прогони /mm-init-project (update) для refresh. - ⚠️ Проверка обновлений: запусти
python3 <repo>/scripts/auto-update.py(или проверь командойgit fetch && git status) для сверки с репозиторием GitHub. Если локальный репо отстает от origin/main →⚠️ Доступно обновление системы. Запусти /mm update или npx markdown-memory для обновления. - (Файл
.mm-versions.jsonбольше не используется — игнорируй, если встретишь.)
8. Глобальный CLAUDE.md (опционально)
Прочитай ~/.claude/CLAUDE.md если есть:
- ⚠️ Если содержит дублирующие правила Sessions/Projects/INDEX (старая ручная инструкция) — намекни упростить через ссылку на
/mm-save-session - ✅ Иначе — ok
9. Сторонние интеграции (плагины, MCP)
Проверь установлены ли рекомендованные плагины:
-
karpathy-skills (
~/.claude/plugins/marketplaces/karpathy-skills/) — 4 принципа кодинга- ✅ установлен / ⚠️ нет —
claude plugin marketplace add forrestchang/andrej-karpathy-skills && claude plugin install andrej-karpathy-skills@karpathy-skills - ✅ В
~/.claude/CLAUDE.mdесть секция Karpathy Guidelines (4 принципа продублированы текстом для всех проектов)
- ✅ установлен / ⚠️ нет —
-
context-mode (
~/.claude/plugins/marketplaces/context-mode/) — MCP-сервер экономии контекста- ✅ установлен / ⚠️ нет —
claude plugin marketplace add mksglu/context-mode && claude plugin install context-mode@context-mode - Если установлен:
- ✅ Каталог сессий
~/.claude/context-mode/sessions/существует и есть.dbфайлы - ⚠️ База старше 90 дней без cleanup → намекни
/ctx-purge - ⚠️ Хуки контекст-мода работают параллельно с GSD-хуками — это норм, оба независимы. Если видишь медленный PostToolUse — это сумма обоих, не баг.
- 💡 Для расширенной диагностики используй
/ctx-doctor(skill самого context-mode)
- ✅ Каталог сессий
- 📊 Опционально показать накопленную статистику:
~/.context-mode/stats.json(если есть)
- ✅ установлен / ⚠️ нет —
-
GSD hooks в
~/.claude/hooks/— должны быть вsettings.jsonSessionStart/PreToolUse/PostToolUse. Уже проверено в этих секциях выше. -
Telegram bridge (claude-code-telegram, опционально):
- Если в
mm-config.local.jsontg_bridge.enabled = true:- ✅
<repo>/external/claude-code-telegram/существует - ✅
<repo>/external/claude-code-telegram/.envсуществует - ✅ В
.envзаполненыTELEGRAM_BOT_TOKEN,ALLOWED_USERS,APPROVED_DIRECTORY(НЕ читай значения — только проверь не пустые) - ⚠️ Если
CLAUDE_MAX_COST_PER_USERне задан — предупреди (риск runaway costs) - ⚠️ Если
APPROVED_DIRECTORY = C:\или другой слишком широкий путь — предупреди про безопасность - 💡 Проверка процесса:
Get-Process python(Windows) илиpgrep -f python(macOS/Linux) — если ни одного Python-процесса бота нет, бот может быть не запущен. Это просто намёк, не ошибка.
- ✅
- Если
tg_bridge.enabled = falseor нет — пропусти. Это опциональная фича.
- Если в
Финальный отчёт
🩺 mm-doctor отчёт
✅ Конфиг: загружен через <env|junction|fallback>, valid
✅ Repo integrity: все templates и SKILL.md на месте
✅ Симлинки/Junction'ы: <N>/<N> OK
⚠️ Obsidian: vault найден, bridge_archive не было — создал
✅ Bridge state: next-prompt.md от <date> (свежий)
⚠️ Bridge archive: 47 файлов старше 30 дней — предложил удалить
✅ Текущий проект: <name>, passport валидный (gsd_version: <none|v1|v2|core>), sync OK
✅ handoff.md: на месте <или ⚠️ отсутствует — /mm save>
✅ GSD-директива в CLAUDE.md: есть <или ⚠️ нет — /mm new для retrofit; или n/a если GSD нет>
⚠️ Секция 8 паспорта: TODO-маркер не убран
✅ Skills frontmatter: <N>/<N> имеют version и name
✅ Версии: config.version <X.Y.Z>, passport.mm_version <X.Y.Z> <совпадают | паспорт старше — /mm new>
✅ Обновление mm-системы: <✅ актуально | ⚠️ доступно обновление — /mm update>
✅ karpathy-skills plugin: установлен
✅ context-mode plugin: установлен, sessions/ есть
⚠️ Telethon codebase: <✅ OK | ⚠️ обнаружены ban-риски в коде / отсутствует telethon-sessions.md | n/a если Telethon не используется>
⚠️ TG Bot UI/UX: <✅ OK | ⚠️ обнаружены отклонения от стандартов / отсутствует tg-bot-ui-ux.md | n/a если бот не разрабатывается | 🚫 отключено (telegram_ui_ux: false в passport.md)>
⚠️ Telegram bridge: не установлен (опционально — см. docs/TG-BRIDGE.md)
Итого: 3 предупреждения, 0 ошибок.
Что предлагаю сделать сейчас:
1. Удалить 47 старых bridge-архивов (одна команда)
2. Заполнить секцию 8 в <path>/passport.md
3. (опционально) упростить ~/.claude/CLAUDE.md через ссылку на /mm-save-session
4. (опционально) обновить mm-систему через /mm update (если доступно обновление)
Согласовать каждое отдельно? (y / только 1 / только 2 / skip)
Auto-fixes (требуют подтверждения)
С разрешения юзера:
- Создать недостающие папки в Obsidian (
bridge,archive,sessions,projects) - Пере-запустить
register-skills.pyпри битых симлинках/junction'ах - Удалить bridge-архивы старше N дней
- Установить
MM_REPO_ROOTenv var - Сгенерировать безопасный модуль-хелпер для Telethon (например,
telegram_builder.pyна основе шаблонаtelethon-sessions.md) и отрефакторить небезопасную инициализацию клиента (с подтверждением изменений) - Сгенерировать безопасный модуль-хелпер для ботов
tg_bot_ui_helper.py(на основе стандартовtg-bot-ui-ux.md), содержащий стандартные элементы разметки и Middleware, а также вывести разработчику пошаговые инструкции по рефакторингу (с подтверждением изменений)
Никогда без подтверждения:
- Удаление файлов в Obsidian (кроме архивов с явным yes)
- Правка
~/.claude/CLAUDE.md(это вне репо, чувствительный файл) - Правка чужих passport.md
gitоперации (за исключением /mm update, выполняющего git pull)
Edge cases
- Запуск без интернета: всё локально, должно работать.
- Запуск из worktree: используй ту же worktree-detection логику что и mm-init-project (resolve до main repo).
- Несколько mm-config.json в разных папках (по ошибке клонировали репо дважды): обнаружь и предупреди.
- Junction указывает на старый репо (после переезда): предложи запустить register-skills.ps1 в новой локации.
Что НЕ делать
- Не молчать при ошибках — всегда показывай конкретную команду фикса.
- Не «чинить» вещи без подтверждения юзера.
- Не отчитываться победно если есть ⚠️/❌ — отчёт должен быть честным.
skills/mm-focus/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-focus -g -y
SKILL.md
Frontmatter
{
"name": "mm-focus",
"version": "0.1.0",
"description": "Stage-scoped reload файлов текущего GSD-этапа в свежий контекст ПОСЛЕ ручного \/clear, mid-phase. Не сводка «где мы» (это \/mm resume), а ЗАГРУЗКА самих рабочих файлов этапа (STATE + CONTEXT\/PLAN\/SUMMARY по статусу), чтобы сразу продолжать работу. Только для GSD-проектов. Read-only. Use when user says \"\/mm-focus\", \"\/mm focus\", \"перечитай этап\", \"перечитай файлы этапа после clear\", \"scoped reload\", \"загрузи текущий этап\", \"вернуть контекст этапа после \/clear\"."
}
mm-focus — Stage-Scoped Reload after /clear
Решает узкую проблему: ты сделал ручной /clear посреди GSD-фазы, контекст пуст, и нужно снова втянуть в контекст рабочие файлы именно текущего этапа — не сводку, а сами файлы, чтобы продолжить работу с того же места.
Отличие от /mm resume: resume даёт компактную СВОДКУ «где мы» (passport + git + last session + выжимки). mm-focus НИЧЕГО не пересказывает — он загружает полное содержимое минимального scoped-набора файлов текущего этапа в контекст и выдаёт одну строку-ориентир. Это не дубль resume.
Когда вызывать:
- ПОСЛЕ ручного
/clear, mid-phase, когда работа над фазой не закончена. - Когда нужно «вернуть в голову» файлы текущего этапа, не читая весь проект.
- Цикл: GSD-этап в работе →
/clear→/mm-focus→ продолжаешь.
Чего скилл НЕ делает:
- НЕ выполняет
/clearсам — это клиентская операция, недоступная из скилла. Скилл рассчитан на запуск ПОСЛЕ ручного/clear. - НЕ пишет ничего — ни в
.planning/*, ни в.gsd/*, ни куда-либо ещё (там file-lock'и/хуки). Только чтение. - НЕ делает resume-стиль дамп — только scoped-набор этапа.
- Не для не-GSD проектов — там используй
/mm resume.
Процесс
Шаг 1. Определи проект (worktree-aware)
То же, что в mm-resume Шаг 1:
- Если cwd внутри
.claude/worktrees/...— resolve до main repo через.gitфайл-указатель. - Иначе — поднимись до корня (где
.git/,package.json,pyproject.toml, и т.п.). - Имя проекта = из
passport.mdfrontmatter (если есть) ИЛИ basename корневой папки.
Если нет passport.md ИЛИ проект не под GSD (см. Шаг 2 — ни .planning/, ни .gsd/) — скажи:
GSD-фаз тут нет, используй /mm resume. и остановись.
Шаг 2. Dual-detection GSD (v1/core/v2) — как в mm-resume
Определи версию:
<project_root>/.planning/существует:- есть
<project_root>/.planning/config.json→ GSD Core - иначе → GSD v1
- есть
<project_root>/.gsd/существует → GSD v2- Оба → возьми
gsd_versionиз passport frontmatter; если нет — спроси. - Ничего нет → остановись с подсказкой
/mm resume(см. Шаг 1).
Шаг 3. Определи текущую фазу и ЭТАП
GSD v1 / Core (.planning/):
- Прочитай
.planning/STATE.md— оттуда текущий milestone и position (номер/имя текущей фазы). - Найди папку текущей фазы
.planning/phases/<NN-current>/. - Определи ЭТАП по статусу фазы в STATE.md (
draft/discussed/planned/in-progress/verified/complete) И по наличию артефактов — артефакты приоритетнее, если расходятся:- нет
CONTEXT.md→ Discuss - есть
CONTEXT.md, нетPLAN.md→ Plan - есть
PLAN.md, нетSUMMARY.md→ Execute - есть
SUMMARY.mdИЛИ статусverified/complete→ Verify
- нет
GSD v2 (.gsd/): этапная модель в файлах слабее — определи позицию из .gsd/STATE.md (rendered dashboard) и, если доступен sqlite3, из gsd.db (активный slice/tasks). Per-phase PLAN.md/SUMMARY.md может не быть — грузи что есть (см. Шаг 4).
Шаг 4. Прочитай scoped-набор (ЗАГРУЗИ ПОЛНОЕ содержимое в контекст, НЕ пересказывай)
Цель шага — чтобы файлы оказались в контексте целиком. Читай их Read-инструментом полностью. Не выжимай, не суммируй.
GSD v1 / Core (.planning/):
- Всегда:
STATE.md+HANDOFF.json(если есть). - Discuss →
+строка текущей фазы изROADMAP.md+PROJECT.md(vision/scope; если файл большой — раздел целей/scope или первые ~40 строк)+CONTEXT.md(если уже есть). - Plan →
+CONTEXT.md+PLAN.md(если уже частично есть). - Execute →
+PLAN.md+CONTEXT.md. - Verify →
+PLAN.md+SUMMARY.md.
Все per-phase файлы — из .planning/phases/<NN-current>/.
GSD v2 (.gsd/):
- Всегда:
.gsd/STATE.md+.gsd/AGENTS.md(≈ CONTEXT). - Задачи текущего slice из
.gsd/gsd.dbчерезsqlite3, если он в PATH:
Еслиsqlite3 "<project_root>/.gsd/gsd.db" "SELECT title, status FROM tasks WHERE slice_id=(SELECT id FROM slices WHERE active=1) LIMIT 20;"sqlite3недоступен — пропусти, набор беднее но не падает. - Per-phase
PLAN.md/SUMMARY.mdв v2 может не быть — грузи только то, что реально существует.
Шаг 5. Вывод — МИНИМАЛЬНЫЙ
Это не resume-сводка. Суть в том, что файлы уже в контексте. Выдай только:
📍 Фаза <NN> «<title>» · этап <Discuss|Plan|Execute|Verify> · загружено: <file1>, <file2>, ...
И, если в HANDOFF.json есть «Точка возврата» / what_next — добавь её ОДНОЙ строкой:
↩️ Точка возврата: <следующий конкретный шаг>
Всё. Не делай развёрнутую сводку, не дублируй resume, не пересказывай содержимое загруженных файлов.
Шаг 6. После вывода — жди
Контекст загружен. Пользователь сам решит, что делать дальше.
Edge cases
- Артефакт этапа отсутствует (напр. на Discuss ещё нет
CONTEXT.md): грузи что есть, в строке «загружено» отметь чего нет (CONTEXT.md — нет), не падай. - GSD есть, но нет активной фазы (между milestone'ами): скажи
GSD: активной фазы нет — /mm resume или /gsd-new-milestone.и остановись. HANDOFF.jsonотсутствует: пропусти строку «Точка возврата».- Расхождение статуса STATE.md и артефактов: верь артефактам (наличие файлов важнее декларации), упомяни расхождение одной фразой.
Жёсткие правила
- Read-only по GSD. НИКОГДА не писать в
.planning/*или.gsd/*(file-lock'и/охраняющие хуки). Никаких git-мутаций, никаких авто-коммитов. - Не выполнять
/clear— это клиентская операция вне скилла; mm-focus запускается ПОСЛЕ ручного/clear. - Не дублировать
/mm resume— никакого полного дампа и сводки, только scoped-набор текущего этапа и одна строка-ориентир. - Только GSD-проекты — нет GSD → отправляй на
/mm resume.
skills/mm-instructions/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-instructions -g -y
SKILL.md
Frontmatter
{
"name": "mm-instructions",
"version": "0.5.1",
"description": "Генерирует текст для claude.ai → Project → Instructions из шаблона + персонализирует под текущий проект. Кладёт результат в Obsidian для копипаста. Use when user says \"сделай инструкции для проекта\", \"обнови project instructions\", \"\/mm-instructions\", \"перегенери инструкции\", \"что вставить в Project Instructions\". Без аргументов = универсальная версия; с проектом = подставляет имя."
}
mm-instructions — claude.ai Project Instructions Generator
Создаёт ready-to-paste текст для Project Instructions в claude.ai. Это «инструкция» для веб-Клода: как работать в паре с PowerShell-Клодом и mm-системой. Раз сгенерировал — копипастишь в Project, оно живёт там вечно.
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна. <repo> берётся из _repo_root инжектированного в конфиг loader'ом.
Понадобятся:
paths.obsidian_projectspaths.obsidian_bridge(универсальная версия идёт сюда)default_language_repo_root(для шаблонаtemplates/project-instructions.md)
Режимы
A. Для конкретного проекта
Запуск из папки с passport.md. Скилл:
- Читает
passport.md→ берётprojectиз frontmatter, тип, стек,gsd_versionиз frontmatter, секцию 8 «Контекст для промптов», секцию 9 (текущий milestone/phase, если GSD). - Берёт шаблон
<skills_repo>/templates/project-instructions.md. - Подставляет:
<PROJECT_NAME>→ имя проекта.- GSD-блок (между
GSD-BLOCK-START/GSD-BLOCK-END): еслиgsd_version != none— заполняет<GSD_VERSION>и<GSD_CURRENT_PHASE>; иначе удаляет блок целиком. - В конец добавляет секцию «Особенности этого проекта» с топ-3 строками из секции 8 паспорта (как напоминание Клоду в каждом промпте).
- Сохраняет в
<obsidian_projects>/<project>/project-instructions.md(перезапись).
B. Универсальная версия
Запуск без passport.md или с флагом «универсальная» / «общая». Скилл:
- Берёт шаблон as-is.
<PROJECT_NAME>заменяет на<универсальный — определяется в чате>;<USER_NAME>— наconfig.user.name.- Удаляет секцию «Особенности этого проекта» и GSD-блок (универсальной комнате конкретный GSD неизвестен).
- Сохраняет в
<obsidian_bridge>/project-instructions-universal.md.
Эту версию вставляешь в Project, который ты используешь как «комната для идей» — где ещё нет конкретного проекта, или где обсуждаешь общие задачи.
Процесс
Шаг 1. Определи режим
- В cwd есть
passport.md→ режим A, имя из frontmatter. - Нет → спроси:
Универсальная версия (1) или укажи путь к passport.md (2)?
Шаг 2. Прочитай шаблон
<skills_repo>/templates/project-instructions.md. Скопируй в память как строку.
Шаг 3. Подстановки (режим A)
Замени все вхождения <PROJECT_NAME> на реальное имя.
Замени все вхождения <USER_NAME> на config.user.name (из mm-config, с учётом local-оверлея). Если поля нет — оставь нейтральное «разработчика».
GSD-блок (между <!-- GSD-BLOCK-START ... --> и <!-- GSD-BLOCK-END -->):
- Если
gsd_version != none: замени<GSD_VERSION>наv1 (.planning/),v2 (.gsd/)илиcore (.planning/ config.json),<GSD_CURRENT_PHASE>— на текущую фазу из секции 9 паспорта (илисм. STATE.md, если не указана). Сами маркеры-комментарии удали. - Если
gsd_version == none(или поля нет): удали весь блок целиком вместе с маркерами — у проекта нет GSD, незачем путать веб-Клода.
В конец файла, перед последней секцией «Доступные команды», вставь:
# Особенности этого проекта (топ-правила из паспорта)
> Сверяй каждый сгенерированный промпт с этими правилами. Они жёсткие.
<до 5 пунктов из секции 8 паспорта, точная копия — без перефразирования>
Шаг 4. Сохрани
- A:
<obsidian_projects>/<project>/project-instructions.md - B:
<obsidian_bridge>/project-instructions-universal.md
Если файл уже был — не архивируй, перезаписывай (это деривативный артефакт, оригинал всегда можно перегенерить).
Шаг 5. Подтверди
✅ Project Instructions готовы
Режим: <A для проекта <name> | B универсальная>
Файл: <abs_path>
Длина: ~<N> строк
Что делать:
1. Открой файл, скопируй ВСЁ содержимое
2. claude.ai → Project «<name>» → Settings → Instructions
3. Удали старое, вставь новое, Save
4. Проверь: New Chat → "Что ты делаешь?" — должен ответить про режимы A/B/C
Edge cases
- Шаблон отсутствует (
templates/project-instructions.mdнет): скажиНе найден шаблон: <_repo_root>/templates/project-instructions.md. Возможно, markdown-memory не до конца установлен — проверь git pull в репо (см. $env:MM_REPO_ROOT). - Секция 8 паспорта пустая (только TODO-маркер): пропусти секцию «Особенности этого проекта», предложи
Заполни сначала секцию 8 в passport.md, потом перегенери. - Имя проекта с пробелами (плохая практика): пройдёт, но в файле проекта в Obsidian используй slug.
Что НЕ делать
- Не вставляй в инструкции живые секреты, ENV-значения, токены.
- Не делай инструкции длиннее 1.5 страниц — Claude.ai всё равно ужмёт восприятие.
- Не выдумывай правила «от себя» — только то, что в шаблоне или явно в паспорте.
skills/mm-projects/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-projects -g -y
SKILL.md
Frontmatter
{
"name": "mm-projects",
"version": "0.1.0",
"description": "Обзор всех зарегистрированных mm-проектов одним экраном — статус, тип, GSD-фаза, последняя активность, число открытых вопросов. Use when user says \"\/mm projects\", \"\/mm list\", \"покажи все проекты\", \"что у меня по проектам\", \"обзор проектов\", \"какие проекты есть\", \"список проектов\". Читает только Obsidian-копии (passport\/dashboard\/handoff\/sessions), git по проектам не трогает без флага --git."
}
mm-projects — Cross-Project Overview
Отвечает на вопрос «что у меня вообще есть и где что в работе» — в отличие от /mm-resume, который про один проект. Команда независима от cwd: читает папку проектов в Obsidian, не код.
Только чтение. Ничего не пишет. Git по проектам — только с флагом --git (иначе дорого при многих проектах).
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_projectspaths.obsidian_sessions(для legacy-проектов без папки)
Процесс
Шаг 1. Собери список проектов
В <obsidian_projects>/:
- Папки-проекты (новый формат от
/mm-init-project): каждая подпапка = проект. - Legacy плоские файлы
<name>.mdв корне<obsidian_projects>/(старый формат) — тоже проект.
Если папка проектов не существует → Папка проектов не найдена: <path>. Запусти /mm-init-project хотя бы в одном проекте. и стоп.
Если проектов 0 → Зарегистрированных проектов пока нет. /mm new в любом проекте создаст первый.
Шаг 2. По каждому проекту прочитай дёшево (не углубляясь)
Папка-проект <obsidian_projects>/<name>/:
passport.mdfrontmatter:status,type,gsd_version,updated,mm_version.passport.mdсекция 8: есть ли маркер<!-- TODO louise: заполни секцию 8 -->(не заполнена).passport.mdсекция 9 (если GSD):Текущий milestone / phase.passport.mdсекция 10: посчитай чекбоксы- [ ]в «Открытые вопросы».dashboard.mdfrontmatterupdated:+ секция «Сейчас» (первая непустая строка).handoff.mdfrontmattergenerated:(для оценки свежести).sessions/— дата самого свежего файла (по имениYYYY-MM-DD...или mtime).
Legacy плоский <name>.md: вытащи что есть (секция «Текущее состояние», последняя сессия). Помечай в выводе как (legacy).
Last activity = максимум из: dashboard.updated, дата свежей сессии, handoff.generated, passport.updated.
Шаг 3. (Опционально) git — только если флаг --git
Если юзер передал --git: для каждого проекта, где из passport.md секции 1 «Путь к коду» извлекается существующий путь — выполни быстро:
git -C "<code_path>" branch --show-current
git -C "<code_path>" status --short # посчитать строки = uncommitted
Без --git — пропусти, в выводе колонку git не показывай.
Шаг 4. Вывод (одним экраном, отсортировано по last activity ↓)
📂 mm-проекты (<N>)
<name> <type> <status> <gsd> <activity> Q:<n>
└ <одна строка из dashboard «Сейчас» или «—»>
...
Где:
<gsd>=—если none, иначеv1·<phase>/v2·<phase>/core·<phase>(фаза из секции 9, кратко).<activity>= человекочитаемо:сегодня/2д/3нед/2мес.Q:<n>= число открытых вопросов.- С флагом
--gitдобавь хвост· <branch> (<k> wip).
После таблицы — короткие сигналы (только непустые):
⚠️ Залежались (>30 дней без активности): <names>
⚠️ Паспорт без секции 8: <names>
⚠️ GSD есть, но в CLAUDE.md нет директивы: запусти /mm check в <names> ← если знаешь (см. ниже)
📌 Паспорт старше config.version (нужен /mm new update): <names>
Примечание: «GSD без директивы» точно проверяет /mm-doctor; здесь упоминай только если это дёшево определить (флага в Obsidian-копии нет — обычно просто не пиши эту строку).
Шаг 5. Подсказка по навигации
Одной строкой в конце:
Подробнее по проекту: /mm projects <name> (= /mm-resume для него) · обзор с git: /mm projects --git
Режимы / аргументы
/mm projects— таблица всех./mm projects --git— + ветка и число несохранённых по каждому (медленнее)./mm projects --active— толькоstatus: active./mm projects <name>— не таблица, а deep-dive: запусти логику/mm-resumeдля этого проекта (его путь к коду из passport секции 1; если кода нет на диске — выведи сводку из Obsidian-артефактов).
Edge cases
- Папка проекта без
passport.md(мусор / недоинициализирован): покажи строкой<name> — ⚠️ нет passport.md (недоинициализирован, /mm new). - Очень много проектов (>30): покажи топ-20 по активности + строку
…ещё N (см. --all). С--all— все. - Рассинхрон дат (dashboard свежее passport): бери максимум, не падай.
- Legacy и folder-формат для одного имени одновременно: предпочитай folder, отметь дубль.
- Vault недоступен: останови, скажи путь из конфига.
Что НЕ делать
- Не запускать git по всем проектам без флага
--git— это дорого и шумит. - Не писать ничего (это read-only обзор).
- Не углубляться в каждый проект — для этого
/mm projects <name>или/mm-resume. - Не выдумывать «Сейчас», если в dashboard пусто — пиши
—.
skills/mm-save-session/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-save-session -g -y
SKILL.md
Frontmatter
{
"name": "mm-save-session",
"version": "0.8.1",
"description": "Закрывает текущую Claude Code сессию — сохраняет лог в Obsidian\/Claude\/Sessions\/, обновляет project note, обновляет INDEX.md, перегенерирует handoff.md (для Project Knowledge claude.ai) через \/mm-handoff. Если в проекте есть GSD (.planning\/ или .gsd\/) — также вызывает \/gsd-pause-work для technical state в HANDOFF.json. Use when user says \"закругляемся\", \"сохрани\", \"до завтра\", \"конец дня\", \"save session\", \"\/mm-save-session\", \"закрываемся\"."
}
mm-save-session — End-of-Session Logger
Оформляет финал Claude Code сессии в три места: Sessions/, Projects/, INDEX.md. Реализует правила из ~/.claude/CLAUDE.md как skill (раньше выполнялось вручную, теперь гарантированно).
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_sessionspaths.obsidian_projectspaths.obsidian_index
Процесс
Шаг 1. Собери контекст сессии
Из текущего разговора:
- Что обсуждали (тема в 1-2 предложениях)
- Что было сделано (список фактов: что создано, изменено, исправлено)
- Какие решения приняты и почему
- Что осталось / открытые вопросы / следующие шаги
Из git (если репо):
git log --since="6 hours ago" --oneline
git status --short
git diff --stat HEAD~5 2>/dev/null || git diff --stat
Список изменённых файлов и коммитов сегодня.
Из cwd: имя проекта = имя корневой папки (или из passport.md если есть).
Шаг 1.5. Собери «Точку возврата»
Чтобы следующее возвращение было без раскачки, на КАЖДОМ save фиксируй три вещи (команда остаётся одна — никаких отдельных режимов сохранения):
- Следующий конкретный шаг — одно действие, с которого продолжить. Бери из «Открытых вопросов / следующих шагов» этой сессии. Если из разговора он неочевиден — спроси louise одной строкой:
С чего продолжить в следующий раз? (одна строка). - Недокоммиченный WIP — из
git status --short(уже собран в Шаге 1). Перечисли файлы илинет, дерево чисто. - Готовый, но неотправленный промпт — если в этой сессии был собран промпт для PowerShell-Клода / claude.ai, который так и не выполнили, — запиши его текст целиком. Иначе
нет.
Это пойдёт в секцию «Точка возврата» файла сессии (Шаг 3) и оттуда — в handoff.md (Шаг 5.6 через /mm-handoff).
Шаг 2. Определи целевые пути
- Имя проекта: из
passport.md(если в cwd или его родителях есть) → frontmatterproject. Иначе — имя папки cwd. - Файл сессии:
<obsidian_sessions>/<YYYY-MM-DD-HHMM>-<тема-slug>.md. Время — текущее, тему-slug сгенерируй из 3-5 слов на русском в kebab-case (транслит, нижний регистр).- Если файл уже существует — добавь суффикс
-2,-3.
- Если файл уже существует — добавь суффикс
Шаг 3. Создай файл сессии
---
created: <YYYY-MM-DDTHH:MM>
project: <project_name>
project_path: <abs_path>
tags: [claude-session, проект-<project_name>, <topical-tags>]
---
# <Заголовок-человеческий>
**Дата:** <YYYY-MM-DD HH:MM>
**Проект:** [[../Projects/<project_name>|<project_name>]]
**Длительность:** примерно <Xм / Xч>
## Задача сессии
<1-2 предложения что собирались сделать>
## Что сделано
- <факт 1>
- <факт 2>
- <факт 3>
## Ключевые решения
- **<решение>** — <почему>
## Открытые вопросы / следующие шаги
- [ ] <q1>
- [ ] <q2>
## Точка возврата
- **Следующий конкретный шаг:** <одно действие, из Шага 1.5>
- **Если прервались посреди:**
- Недоделано: <что осталось / «—»>
- Неотправленный промпт: <текст готового, но не выполненного промпта целиком / «нет»>
- Недокоммиченный WIP: <файлы из git status / «нет, дерево чисто»>
## Затронутые файлы
- `<rel_path>` — <что>
- `<rel_path>` — <что>
## Git
<если был>
- Ветка: `<branch>`
- Коммитов сегодня: <N>
- `<hash> <subject>`
Шаг 3.5. Scrub секретов ПЕРЕД записью в vault (канон config/secret-patterns.json)
Заметка сессии оседает в долговременном vault (и через Шаги 4–6 её выжимка попадает в project note / INDEX / handoff). Токен, случайно вставленный из кода или git-вывода в «Что сделано», утечёт. Поэтому собранный на Шаге 3 текст прогоняется через фильтр до записи.
Переиспользуй единый механизм (как mm-handoff Шаг 5.9) — не дублируй список паттернов здесь. Прогони весь собранный текст заметки через паттерны из канона <repo>/config/secret-patterns.json (пояснение — <repo>/docs/SECRET-PATTERNS.md):
- Класс A — маскируй молча, типизированным плейсхолдером с сохранением контекста (
TELEGRAM_TOKEN=<REDACTED:telegram-token>и т.п. — см. doc). Не вырезай строку. - Класс B (широкое
[A-Za-z0-9_\-]{32,}) — НЕ маскируй (задевает git SHA-40 / UUID, которых полно в сессиях). Только добавь одну строку-warn в финальный отчёт. - Покажи preview перед записью: если что-то замаскировано или есть warn — выведи одну сводную строку (
🔒 Замаскировано N (telegram-token×1, …); ⚠️ K warn) и сами места (по 1 строке). Если находок нет — короткое🔒 секретов не найдено, без шума. - В Шагах 3 (запись файла сессии), 4 (project note), 5 (INDEX) используй уже очищенный текст — выжимки наследуют scrub, повторно не маскируй.
Шаг 4. Обнови файлы 00-home/
Путь хранилища: <vault_root> (определяй по единому алгоритму: (1) из секции ## Obsidian Knowledge Vault в CLAUDE.md со строкой Хранилище знаний: <путь>, если она есть; (2) локальная папка .vault/ в корне проекта; (3) глобальная папка проекта <obsidian_projects>/<name>/ из конфига).
-
Обнови
<vault_root>/00-home/текущие приоритеты.md:- Перепиши файл, указав текущий milestone/phase и актуальный список задач (WIP и следующие шаги, определенные на Шаге 1.5).
-
Создай новые заметки в
knowledge/(если применимо):- Проанализируй сессию. Если были приняты ключевые решения, исправлены баги или зафиксированы паттерны:
- Решения: Создай файл в
<vault_root>/knowledge/decisions/. Имя файла должно быть утверждением, а не категорией (например,выбрали Supabase Auth вместо NextAuth потому что...md). Внутри напиши краткое обоснование (на русском), добавь frontmatter (tags: [decision],date: <YYYY-MM-DD>) и wiki-ссылку на сессию:[[sessions/<session_file_basename>|Лог сессии]]. - Баги: Создай файл в
<vault_root>/knowledge/debugging/. Имя файла должно быть утверждением (например,API возвращает 429 после 500 запросов решено экспоненциальным бэкоффом.md). Внутри напиши суть проблемы и решение, добавь frontmatter (tags: [bugfix],date) и wiki-ссылку на сессию. - Паттерны: Создай файл в
<vault_root>/knowledge/patterns/. Имя файла должно быть утверждением (например,все API роуты валидируются через Pydantic.md). Напиши описание паттерна и ссылку на сессию. - Все названия файлов должны оканчиваться на
.md.
- Решения: Создай файл в
- Проанализируй сессию. Если были приняты ключевые решения, исправлены баги или зафиксированы паттерны:
-
Регенерируй
<vault_root>/00-home/index.md:- Просканируй папки базы знаний.
- Сформируй оглавление со ссылками
[[00-home/текущие приоритеты|Текущие приоритеты]],[[atlas/passport|Паспорт проекта]],[[atlas/архитектура проекта|Архитектура]],[[atlas/база данных|База данных]],[[atlas/деплой|Деплой]], а также ссылки на все заметки вknowledge/decisions/,knowledge/debugging/,knowledge/patterns/,knowledge/business/,knowledge/integrations/и последние 5 сессий изsessions/. - Держи индекс компактным (до 100 строк).
Шаг 5. Обнови INDEX.md (глобальный)
Путь: <obsidian_index> (по дефолту <obsidian_claude_root>/INDEX.md).
Добавь строку наверх списка сессий:
- <YYYY-MM-DD HH:MM> · **<project_name>** · [[Projects/<project_name>/sessions/<file_basename>|<тема>]] (если глобальный) или [[.vault/sessions/<file_basename>|<тема>]] (если локальный)
Если INDEX.md нет — создай со скелетом (аналогично старому mm).
Шаг 5.5. GSD-кооперация (если применимо)
Цель: mm и GSD не дублируются. mm пишет нарратив в Obsidian. GSD пишет technical state в HANDOFF.json.
Алгоритм:
- Проверь
<project_root>/.planning/(GSD v1 / core) или<project_root>/.gsd/(v2). - Если ни одного — пропусти этот шаг.
- Если есть — спроси одной строкой:
Также вызвать /gsd-pause-work для technical handoff (HANDOFF.json)? (y/n, дефолт y). - На
y:- GSD v1 / Core: вызови skill
/gsd-pause-work(в Claude Code/Antigravity; не пиши.planning/HANDOFF.jsonсам — там охраняющий хук). - GSD v2: предложи юзеру выполнить в терминале
gsd handoff(skill этот не запускает CLI).
- GSD v1 / Core: вызови skill
- На
n— продолжай без GSD-handoff, упомяни в финальном отчёте: «GSD handoff пропущен по запросу». - Если
/gsd-pause-workвернул ошибку — не падай, упомяни в отчёте: «GSD pause-work failed:», продолжай.
Шаг 5.6. Обнови handoff.md (для claude.ai Project Knowledge)
Цель: handoff.md должен оставаться свежим после каждого закрытия сессии, без ручного /mm next.
Алгоритм:
- Делегируй генерацию в
/mm-handoff(он — единственный владелец формата handoff; не дублируй его логику здесь). Вызови skillmm-handoff— он прочитает только что записанную сессию + последние 3-5 + git + (если есть) GSD и перезапишет<vault_root>/handoff.md. - Это поведение по умолчанию включено (пользователь явно его просил) — не спрашивай y/n.
- Если
<vault_root>/handoff.mdещё скелет (после/mm-init-project) —/mm-handoffпросто заменит его полноценной версией. Это нормально. - Если
/mm-handoffупал (нет паспорта, vault недоступен) — не падай, упомяни в финальном отчёте: «handoff обновить не удалось:», сессия всё равно сохранена.
Шаг 5.7. Автопуш в Vault-репозиторий (если настроен)
Если папка памяти проекта <vault_root> является git-репозиторием и в ней настроен remote origin (т.е. vault уже инициализирован через /mm vault):
- Прогони Secret-Scan по всем измененным/новым файлам перед добавлением в git (по логике Шага 3.5).
-
Механизм обнаружения (приоритет — MCP): Если в сессии доступен MCP-инструмент
mm_secret_scan— собери текст файлов, идущих в пуш, и просканируй его через инструмент ({ text }→{ hasSecretA, findings: [{ id, class, count }], classBCount }). Результат findings и есть итог скана. -
Fallback (инструмент недоступен): Если
mm_secret_scanне доступен (другой агент, не зарегистрирован, свежая сессия без подхвата stdio-сервера) — примени паттерны напрямую изconfig/secret-patterns.jsonк тому же тексту и сформируй результат в том же виде (hasSecretA,findings,classBCount). -
Оба пути читают один источник —
config/secret-patterns.json(инструмент тоже читает его), поэтому результат идентичен; механизм лишь меняет, кто применяет паттерны. -
Реакция на Класс A («средний путь»):
- Hard-stop: НЕ выполняй
git add/commit/pushдля vault, пока секрет не обработан. - Покажи находку: какой паттерн (
id, класс) и в каком файле / где именно — достаточно, чтобы пользователь нашёл место. Сырое значение в отчёт не дублируй без нужды (секрет и так в файле). - Предложи маскировку: заменить совпавшее значение на
<REDACTED:<id>>. Спроси да/нет. - Маскируй ТОЛЬКО после явного «да»: найди совпавший по паттерну фрагмент (паттерн возьми из
config/secret-patterns.jsonпоid) и замени его на маркер. Больше в заметке ничего не меняй. - Пере-сканируй (тем же механизмом). Если чисто (
hasSecretA=false) → переходи к п.2 (commit/push). Если ещё есть Класс A → повтори шаги 2–4 для оставшихся находок. - Отказ или нет интерактивного подтверждения (пользователь сказал «нет» ИЛИ headless/автономный прогон без возможности спросить) → НЕ пушь vault и НЕ правь заметку. Сообщи, что vault НЕ синхронизирован из-за необработанного секрета (Класс A), и что делать: убрать секрет из заметки вручную → повторить
/mm save. Локальные Obsidian-заметки при этом уже записаны как обычно (Шаги 3–5).
Governing-принцип: система НИКОГДА не переписывает заметку автономно — маскировка допустима ТОЛЬКО как явно подтверждённое пользователем действие.
- Hard-stop: НЕ выполняй
-
Реакция на Класс B (warn-only, без изменений): Предупреждения Класса B служат только для информирования, НИКОГДА не редактируй содержимое файлов памяти проекта ради сканера (скилл не переписывает текст заметок).
-
- Если сканирование чистое:
- Выполни
git add -Aв директории<vault_root>. - Выполни коммит:
git commit -m "auto-sync: save session <session_file_basename>" - Выполни пуш:
git push origin main - Обработка сбоев пуша: Если команда
git pushзавершилась с ошибкой (например, проблемы с сетью, авторизацией или non-fast-forward коммиты), не прерывай работу скилла (сессия локально сохранена). Выведи пользователю заметное предупреждение:⚠️ vault push не прошёл — Knowledge не обновится, запушь вручную.и укажи причину сбоя.
- Выполни
- Если
<vault_root>не является репозиторием или в нем нет настроенного remote, пропусти push, но выведи предупреждение (не no-op):⚠️ Vault-синк пропущен: <vault_root> не git-репозиторий с origin. handoff.md НЕ запушен и не попадёт в Project Knowledge. Запусти /mm vault для этого проекта, затем повтори /mm save.(подставь реальный путь вместо<vault_root>).
Шаг 6. Подтверди
Выведи (короткий блок, без воды):
✅ Сессия сохранена
Проект: <name>
Директория Vault: <vault_root>
Файл сессии: sessions/<session_file>
Созданы новые знания:
• <список созданных файлов решений/багов/паттернов с именами-утверждениями или "нет">
00-home/index.md и текущие приоритеты.md обновлены.
handoff.md обновлён: <да | не удалось: <reason>>
GSD handoff: <выполнен | пропущен | n/a>
Vault sync: <пуш выполнен | не настроен (no-op) | ошибка: <reason>>
Открытых вопросов: <K>
Следующий шаг: <дейстие из Точки возврата>
Edge cases
- Очень короткая сессия (один вопрос-ответ, ничего не делалось): спроси
Сессия короткая, всё равно сохранять? (y/n). Если да — сохрани с пометкойкороткая консультация. - Несколько проектов в одной сессии (редко): спроси какой считать главным, остальные упомяни в тегах.
- Нет Obsidian vault по пути из конфига: останови, скажи
Vault не найден: <path>. Проверь mm-config.json. - Сессия в worktree: имя проекта бери из основной папки репо, не из имени worktree (типа
crazy-galileo-...).
Что НЕ делать
- Не коммить ничего в git-репозиторий самого проекта (это работа
/pushили ручная). Автоматический коммит и пуш разрешены только для vault-репозитория памяти на Шаге 5.7. - Не делай длинные сессии-хроники — формат компактный, факты + решения + вопросы.
- Не тегируй случайно — теги только из реальных тем сессии.
- Не дублируй текст между Sessions/ и Projects/ — в Project note только ссылка + одна строка.
skills/mm-update/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-update -g -y
SKILL.md
Frontmatter
{
"name": "mm-update",
"version": "0.1.0",
"description": "Самообновление mm-системы из удалённого репозитория. mm раздаётся через git clone + register-skills (не npm), поэтому update = git pull свежего mm из origin\/main + повторный register-skills + notice о перезапуске Claude Code. Use when user says \"обнови mm\", \"обнови систему\", \"\/mm update\", \"update mm\", \"подтяни свежий mm\", \"проверь обновления mm\"."
}
mm-update — Self-Update from Git Remote
Обновляет mm-систему до свежей версии из origin/main. mm установлен как git-клон с junction'ами в ~/.claude/skills/ — поэтому обновление это git pull репозитория + повторный прогон register-skills, а не пакетный менеджер.
Ничего не сливает и не ребейзит автоматически. При любом расхождении или ошибке --ff-only — стоп с инструкцией разрулить вручную.
Ручной интерактивный аналог фонового
scripts/auto-update.py(ff-only, дёргается изmm-resume); git-поток общий — отличие в том, что здесь показывается changelog и спрашивается подтверждение.
Где работать
Корень репозитория mm:
$env:MM_REPO_ROOTесли задан;- иначе текущая рабочая директория (
cwd).
Все git-команды и register-skills выполняй из этого корня.
Процесс
0. Guard: это вообще git-репо?
Проверь, что в корне репо (см. «Где работать») есть .git:
Test-Path (Join-Path $repoRoot ".git")
Если .git нет — mm установлен не как git-репо (например, распакован из tarball). Стоп:
❌ mm установлен не как git-репозиторий — обновлять через git нечем.
Обнови через `npx markdown-memory update` или переустанови mm.
Не продолжай. (По смыслу как auto-update.py: «Not a git repository. Skipping update».)
1. Забрать состояние remote
git fetch origin main
Если git fetch упал (нет сети / нет доступа к origin) — стоп: ⚠️ Не удалось связаться с origin. Проверь сеть и доступ к github.com/mworldorg/markdown-memory. Не продолжай.
2. Сравнить версии
- Локальная версия: поле
versionизconfig/mm-config.json(читай файл напрямую). - Удалённая версия:
распарси JSON, возьмиgit show origin/main:config/mm-config.jsonversion.
Это поле — единый источник версии системы (repo-wide release). Per-skill version: в каждом SKILL.md гранулярны и здесь не сравниваются.
3. Определить расхождение ветки
git rev-list --left-right --count HEAD...origin/main
Вывод — два числа через таб: первое = ahead (коммиты, которые есть локально, но нет в origin/main), второе = behind (коммиты, которые есть в origin/main, но нет локально). Не перепутай порядок.
4. Развилка по (ahead, behind)
| Состояние | Что делать |
|---|---|
behind=0, ahead=0 |
✅ Уже синхронизировано с origin/main (версия X). Обновлять нечего. → выход |
behind=0, ahead>0 |
ℹ️ Локаль впереди origin/main на N коммит(ов) — машина разработчика или есть незапушенное. Обновлять нечего. → выход |
behind>0, ahead=0 |
Показать локаль X → remote Y + changelog (см. ниже), спросить y/n, при y → git pull --ff-only |
behind>0, ahead>0 |
⚠️ Ветки разошлись (N локальных / M удалённых). Авто-обновление отменено — разрули вручную. → выход, без pull |
Changelog (только для случая behind>0, ahead=0):
git log --oneline HEAD..origin/main
Покажи список как есть. Никакого CHANGELOG.md — changelog это git-лог между HEAD и origin/main.
Формат запроса подтверждения:
Доступно обновление mm: версия X → Y
Новые коммиты (N):
<hash> <subject>
...
Подтянуть (git pull --ff-only)? (y/n)
При n — стоп: Обновление отменено.
5. Pull (только при подтверждённом behind>0, ahead=0)
git pull --ff-only origin main
Если --ff-only упал (обычно из-за локальных незакоммиченных правок или непушенных дивергентных коммитов):
- Стоп:
❌ git pull --ff-only не прошёл. Вероятно есть локальные правки в репо mm. Закоммить/стэшни их и повтори /mm update, либо разрули вручную. - Никогда не делай авто-
mergeилиrebaseчтобы «починить» это. Останавливайся и отдавай решение пользователю.
6. Переджанкшенить скиллы
После успешного pull прогони регистрацию (pull мог добавить/переименовать скиллы):
.\scripts\register-skills.ps1
(На macOS/Linux — python3 scripts/register-skills.py.)
Покажи вывод скрипта.
7. Финал
✅ Обновлено до версии Y.
Перезапусти Claude Code, чтобы подхватить обновлённые скиллы.
Скиллы загружаются на старте сессии — без рестарта новые/изменённые скиллы не активируются.
Ограничения
- Не трогать
config.version. Обновление это потребление релиза, не выпуск. Версию проставляет мейнтейнер при релизе, не этот скилл. - Вендоренные скиллы (
vendor/) не обновляются отдельной логикой.git pullтянет их вместе со всем репо — это нормально. Перевендоринг (обновление до новой upstream-версии ECC и т.п.) — ручная работа мейнтейнера, не часть/mm update. - Никогда не делать авто-
merge/rebase: ни при расхождении веток (ahead>0 && behind>0), ни при падении--ff-only. mm-config.local.jsonи_generated/— gitignored,git pullих не трогает. Отдельной защиты добавлять не нужно.- Только
origin/main. Других веток/ремоутов скилл не рассматривает.
Финальный отчёт (пример)
🔄 mm-update
Repo root: <path> (из MM_REPO_ROOT | cwd)
fetch origin main: ✅
Версия: локаль 0.6.0 → remote 0.7.0
Состояние: behind 4, ahead 0
Новые коммиты:
a1b2c3d feat: ...
...
git pull --ff-only: ✅ (4 коммита подтянуто)
register-skills.ps1: ✅ (N junction'ов)
Перезапусти Claude Code, чтобы подхватить обновлённые скиллы.
Edge cases
- Нет
$env:MM_REPO_ROOTи cwd не репо mm —git fetchне найдёт origin/упадёт; сообщи, что запускать надо из корня репо mm или задатьMM_REPO_ROOT. - Detached HEAD —
HEAD...origin/mainотработает, но pull в detached не имеет смысла; предупреди и не делай pull. - Нет интернета —
git fetchупадёт на шаге 1, дальше не идём (см. шаг 1). - Запуск из worktree — git-команды отрабатывают в контексте worktree; если worktree указывает на тот же origin/main — ок. Иначе предупреди.
Что НЕ делать
- Не делать авто-merge/rebase ни при каких обстоятельствах.
- Не править
config.versionи любые файлы — толькоgit pullиregister-skills. - Не пушить, не коммитить, не стэшить за пользователя.
- Не молчать при ошибке — всегда показывай конкретную причину и команду фикса.
- Не обновлять с других веток/ремоутов кроме
origin/main.
skills/mm-vault/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-vault -g -y
SKILL.md
Frontmatter
{
"name": "mm-vault",
"version": "0.1.1",
"description": "Создаёт приватный vault-репозиторий памяти проекта в Obsidian и пушит его на GitHub для синхронизации с claude.ai Knowledge. Use when user says \"создай vault\", \"синхронизация памяти\", \"memory sync\", \"\/mm vault\", \"\/mm-vault\"."
}
mm-vault — Memory Vault Git Sync Initializer
Инициализирует и настраивает приватный git-репозиторий для папки памяти проекта Obsidian Vault. Это позволяет синхронизировать долгосрочную память с claude.ai Project Knowledge/Files через интеграцию с GitHub, исключая ручной копипаст.
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_projectspaths.obsidian_vault
Процесс
Шаг 1. Определи проект и папку памяти (Vault Root)
- Определи проект по
passport.mdв текущейcwdили её родительских директориях.- Извлеки имя проекта из YAML frontmatter
project:(или из поля "Имя" таблицы Идентификация). - Если
passport.mdне найден, выведи предупреждение и спроси имя проекта или предложи запустить/mm newсначала.
- Извлеки имя проекта из YAML frontmatter
- Определи slug проекта (в нижнем регистре, с заменой пробелов на дефисы). Для
markdown-memoryslug равенmarkdown-memory. - Определи путь базы знаний
<vault_root>по единому алгоритму резолва:- (1) из секции
## Obsidian Knowledge VaultвCLAUDE.mdсо строкойХранилище знаний: <путь>, если она есть; - (2) локальная папка
.vault/в корне проекта; - (3) глобальная папка проекта
<obsidian_projects>/<slug>/из конфига.
- (1) из секции
- Выведи пользователю подтвержденный путь папки памяти.
Шаг 2. Покажи состав папки и прогони Secret-Scan
- Сделай рекурсивный обход папки
<vault_root>и покажи дерево файлов, которые попадут в репозиторий. - Прогони все файлы папки через паттерны из канона
<repo>/config/secret-patterns.json(пояснение —<repo>/docs/SECRET-PATTERNS.md).- Класс A (Высокоточные секреты):
- Если найден хотя бы один реальный секрет, останови выполнение (hard-stop).
- Покажи пользователю найденную строку и файл.
- Жди явного исправления/подтверждения перед созданием репозитория. Не продолжай автоматически. Блокирует только реальный секрет (когда человек сам убирает реальный секрет).
- Класс B (Широкие совпадения / предупреждения):
- Выведи предупреждения в формате:
⚠️ возможный секрет/длинная строка в <файл>, строка N: <первые 12 симв.>… — проверь вручную (не замаскировано). - Важно: Класс B служит только для предупреждения пользователя. НИКОГДА не редактируй содержимое файлов памяти проекта ради сканера. Скилл никогда не переписывает текст заметок.
- Выведи предупреждения в формате:
- Класс A (Высокоточные секреты):
- Жди подтверждения (y/n) от пользователя для создания репозитория и первого пуша.
Шаг 3. Создай или обнови .gitignore
В папке <vault_root> создай или обнови файл .gitignore со следующим содержимым:
.obsidian/
.trash/
Thumbs.db
.DS_Store
*.tmp
*.log
Шаг 4. Инициализация репозитория (Идемпотентно)
- Проверь, инициализирован ли уже Git в
<vault_root>(наличие папки.git). - Если Git не инициализирован:
- Выполни
git initв<vault_root>. - Настрой ветку по умолчанию (например,
git checkout -b mainилиgit branch -M main).
- Выполни
- Добавь файлы в индекс и сделай коммит:
git add -Agit commit -m "init: <slug> vault (passport, handoff, dashboard, sessions)"
Шаг 5. Создание приватного репозитория на GitHub
- Проверь, настроен ли уже remote
origin(git remote -v). - Если remote
originуже настроен:- Выведи:
GitHub remote origin уже настроен: <remote_url> - Выполни пуш:
git push -u origin main
- Выведи:
- Если remote
originне настроен:- Создай приватный репозиторий на GitHub под владельцем (по умолчанию
mworldorgили по умолчанию из gh CLI):gh repo create mworldorg/<slug>-vault --private --description "Memory vault for <slug> project" --source . --push - Если команда завершилась успешно, переходи к Шагу 6.
- Если произошел сбой создания через CLI, предложи пользователю создать репозиторий вручную, добавить remote и сделать пуш.
- Создай приватный репозиторий на GitHub под владельцем (по умолчанию
Шаг 6. Инструкция по ручному подключению
Напечатай URL созданного репозитория и выведи подробную инструкцию по ручному подключению памяти в claude.ai:
✅ Репозиторий памяти успешно синхронизирован!
URL: https://github.com/mworldorg/<slug>-vault
Теперь подключи его к claude.ai:
1. Открой нужный Project в claude.ai
2. Перейди в раздел "Project Knowledge" (или "Files")
3. Нажми кнопку "+" -> выбери "GitHub"
4. Выбери репозиторий: mworldorg/<slug>-vault
5. Отметь файлы для синхронизации:
• passport.md
• handoff.md
• dashboard.md
• sessions/ (все файлы сессий)
6. Сними галочку со скачивания .gitignore (если применимо)
7. Нажми "Add to Project"
8. Каждый раз после вызова `/mm save` новые изменения будут запушены в репо автоматически. В claude.ai останется лишь нажать кнопку "Sync now" в панели Files/Project Knowledge.
Идемпотентность и ограничения
- Репозиторий ВСЕГДА должен быть приватным (
--private). - Не пересоздавай репозиторий, если он уже есть на GitHub и настроен remote. Просто сделай коммит изменений и пуш.
- Не модифицируй файлы кода основного репозитория проекта, только папку Obsidian Vault.
skills/mm/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm -g -y
SKILL.md
Frontmatter
{
"name": "mm",
"version": "0.4.1",
"description": "Диспетчер mm-системы — короткая команда вместо длинных. \/mm без аргументов = список всех команд. \/mm new = init project, \/mm save = save session, \/mm next = handoff, \/mm prompt = bridge, \/mm rules = instructions, \/mm check = doctor. Use when user types \"\/mm\" anything OR says \"что есть в mm\", \"какие mm команды\", \"помощь по mm\", \"mm cheatsheet\"."
}
mm — Dispatcher / Cheat Sheet
Короткие алиасы для длинных команд. Также — если юзер просто пишет /mm, выводи список.
Карта команд
| Алиас | Полная команда | Что делает |
|---|---|---|
/mm new |
/mm-init-project |
Init/update паспорт проекта + Obsidian-структуру |
/mm init |
/mm-init-project |
(синоним new) |
/mm setup |
/mm-setup |
Персонализация системы под себя (имя, стек, пути) — 1 раз после клона |
/mm onboard |
/mm-setup |
(синоним setup) |
/mm resume |
/mm-resume |
Восстановить контекст: passport + dashboard + last session + git + GSD |
/mm start |
/mm-resume |
(синоним resume — для начала сессии) |
/mm context |
/mm-resume |
(синоним resume) |
/mm where |
/mm-resume |
(синоним resume — «где мы») |
/mm focus |
/mm-focus |
Перечитать файлы текущего GSD-этапа после /clear (scoped reload) |
/mm projects |
/mm-projects |
Обзор всех проектов одним экраном |
/mm list |
/mm-projects |
(синоним projects) |
/mm save |
/mm-save-session |
Сохранить лог сессии в Obsidian |
/mm end |
/mm-save-session |
(синоним save) |
/mm next |
/mm-handoff |
Сводка для нового чата claude.ai |
/mm handoff |
/mm-handoff |
(синоним next) |
/mm vault |
/mm-vault |
Создать приватный vault-репо памяти проекта |
/mm prompt |
/mm-bridge |
Промпт-мост в файл для PowerShell-Клода |
/mm bridge |
/mm-bridge |
(синоним prompt) |
/mm rules |
/mm-instructions |
Сгенерить Project Instructions для claude.ai |
/mm chat |
/mm-instructions |
(синоним rules) |
/mm check |
/mm-doctor |
Самопроверка системы |
/mm doctor |
/mm-doctor |
(синоним check) |
/mm health |
/mm-doctor |
(синоним check) |
/mm update |
/mm-update |
Обновить mm-систему (git pull origin/main + register-skills) |
/mm |
(этот skill) | Покажи cheat sheet (без выполнения) |
/mm help |
(этот skill) | (синоним) |
/mm ? |
(этот skill) | (синоним) |
Как работаешь
1. Парсинг команды
Юзер пишет: /mm <команда> [аргументы]. Возьми <команда>, ищи в карте выше (case-insensitive). Опечатки толерируй (Levenshtein <= 2):
/mm seve→ save (расстояние 1)/mm hando→ handoff/mm doktor→ doctor
Если не нашёл — покажи cheat sheet с пометкой Команда "<x>" не распознана. Возможно ты имел в виду: + 1-2 ближайших варианта.
2. Если без аргументов или help
Выведи cheat-sheet — компактно (не всю карту, а сгруппированно):
/mm — диспетчер mm-системы
Первичная настройка (1 раз после клона репо):
/mm setup персонализация под себя (имя, стек, пути, claude.ai-скилл)
Старт нового / открытие проекта:
/mm new оформить или обновить паспорт проекта
/mm resume где мы (passport + last session + git + GSD)
/mm focus перечитать файлы текущего GSD-этапа после /clear
/mm projects обзор всех проектов одним экраном
Работа в сессии:
/mm prompt промпт-мост из claude.ai в PowerShell
/mm save закрыть сессию, лог в Obsidian
/mm next сводка для нового чата claude.ai (контекст забит)
/mm vault создать приватный vault-репо памяти проекта (git sync)
Инфраструктура:
/mm rules сгенерить инструкции для claude.ai Project
/mm check диагностика системы (junction'ы, vault, паспорта)
/mm update обновить mm-систему (git pull + re-register)
Типичный цикл:
утром / после /clear → /mm resume ← подхватил контекст
работаешь → /mm prompt (если задача из claude.ai)
закончил день → /mm save (лог в Obsidian)
контекст забит → /mm save → /clear → /mm resume
новый чат claude.ai → /mm next (handoff в Knowledge)
Полные имена тоже работают: /mm-init-project, /mm-save-session, и т.д.
3. Если команда распознана
Делегируй вызов соответствующему skill. Это значит:
- НЕ выполняй логику маппинг'нутого skill'а сам.
- Скажи коротко:
→ Запускаю /mm-<full-name>... - Дальше работа идёт в том skill (он подхватится автоматически).
В реальности Claude Code или Antigravity не «делегируют» программно — но в твоём ответе ты приступаешь к выполнению того skill, как если бы юзер написал его полное имя. То есть:
- Скажи одной строкой:
→ /mm new = /mm-init-project, начинаю. - Действуй как
mm-init-project(читай его SKILL.md и исполняй).
4. Дополнительные удобства
/mm new <name>— передай имя проекту, чтоб init не спрашивал. Пример:/mm new filtrator./mm save "<тема>"— передай тему сессии вручную. Пример:/mm save "рефакторинг роутинга"./mm prompt "<задача>"— короткая задача сразу. Пример:/mm prompt "добавь команду /stats в бот"./mm update— делегируй в/mm-update(git pull свежего mm из origin/main + register-skills + notice о перезапуске).
Эти extra-аргументы передавай в подскилл как контекст.
Edge cases
- Юзер написал
/mm-new(с дефисом): тоже принимай — это не полное имя skill'а, но логично. Маппь как/mm new. - Юзер написал
/mm-init: алиас на/mm-init-project. - Юзер написал что-то совсем непонятное (
/mm fluffy): покажи cheat-sheet + предложи ближайшее.
Что НЕ делать
- Не «упрощай» работу подскилла, к которому делегируешь — он сам знает как себя вести.
- Не предлагай команд которых нет (
/mm pushне существует). - Не пиши свою реализацию save/init/handoff — только маршрутизация.
skills/mm-handoff/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-handoff -g -y
SKILL.md
Frontmatter
{
"name": "mm-handoff",
"version": "0.7.1",
"description": "Генерирует handoff.md — компактную сводку для нового чата claude.ai когда контекст текущего заполнился. Включает 15-категорийный Session Guide (вдохновлено context-mode), выжимку последних сессий, текущее состояние, открытые вопросы, и (если есть GSD) — current phase + last 3 SUMMARY.md. Use when user says \"контекст заполнен\", \"новый чат\", \"handoff\", \"сводка для нового чата\", \"\/mm-handoff\", \"пора закругляться, готовь следующий чат\". НЕ путать с mm-save-session — этот про подготовку СЛЕДУЮЩЕГО чата, save-session про закрытие текущего."
}
mm-handoff — Snapshot for Next claude.ai Chat
Решает проблему: контекст в чате claude.ai заполнен. Дополняет Anthropic Memory структурированным компактным snapshot'ом, который загружается в Project Knowledge.
Memory vs Handoff: Memory (Anthropic, авто) хранит долгосрочные факты о тебе и проекте. Handoff (этот skill, ручной) — свежий контекст за 1-2 недели: что сделано, что в работе, что открыто. Не конкурируют — дополняют.
Когда вызывать
- Автоматически — из
/mm-save-session(шаг 5.6) при каждом закрытии сессии, чтобы handoff.md в Project Knowledge claude.ai всегда был свежим. Это основной путь, руками дёргать не надо. - Вручную (
/mm-handoffили/mm next) — когда контекст текущего чата забился, а сессию закрывать рано: обновить handoff, не закрывая сессию. - Перед стартом нового чата в claude.ai по тому же проекту
- В конце большой вехи (после серии сессий)
- Перед паузой на несколько дней — чтобы вернуться без раскачки
Скелет handoff.md создаётся ещё на
/mm-init-project; первый же/mm-save-sessionзаменяет его полноценной версией через этот skill.
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_projectspaths.obsidian_sessionspaths.obsidian_index(INDEX.md)
Процесс
Шаг 1. Определи проект и хранилище Vault
- Прочитай
passport.mdв текущейcwd. Если нет — спроси: «Для какого проекта handoff? Дай путь.» или «Запустить /mm-init-project сначала?» - Из паспорта возьми: имя, тип, путь.
- Определи путь базы знаний
<vault_root>(определяй по единому алгоритму: (1) из секции## Obsidian Knowledge VaultвCLAUDE.mdсо строкойХранилище знаний: <путь>, если она есть; (2) локальная папка.vault/в корне проекта; (3) глобальная папка проекта<obsidian_projects>/<name>/из конфига).
Шаг 2. Собери сводку последних сессий — index-first, тела лениво
Progressive disclosure (достройка существующей 3-слойной структуры mm, не новый механизм). Индекс однострочников уже есть — не вычитывай полные тела сессий ради «Что сделано». Раньше handoff читал 3-5 ПОЛНЫХ тел при каждом вызове; теперь основной источник — дешёвый индекс, а тела открываются лениво. Цель — экономия контекста на «толстых» проектах.
Определи окно: сессии этого проекта за последние 14 дней (по дате в имени файла YYYY-MM-DD-HHMM-slug или mtime).
-
Индекс-слой (дёшево, основной источник для «Что сделано за период»):
- Прочитай
<vault_root>/00-home/index.mdИ/ИЛИ<obsidian_index>(INDEX.md), отфильтровав строки по этому проекту за окно. - Каждая строка индекса — готовый однострочник сессии (формат
- <дата> · **<project>** · [[Sessions/<id>|<тема/что сделано>]]или аналогичный). - Парсинг ссылки сессии: Парсер должен принимать любые форматы ссылок:
[[Sessions/<id>]],[[sessions/<id>]], а также полные или относительные пути вроде[[Projects/<name>/sessions/<id>]]или[[../Projects/<name>/sessions/<id>]]. Всегда бери<id>из самого хвоста пути (имя файла без расширения). ID сессии =<id>. - «Что сделано за период» собирай из этих однострочников, БЕЗ открытия тел.
- Прочитай
-
Тело
sessions/<id>.md(или по пути из ссылки) открывай ЛЕНИВО — точечно по ID, не все подряд — только когда:- это топ-1 самая свежая сессия (нужны её «Ключевые решения» и «Открытые вопросы» дословно — см. п.3), ИЛИ
- однострочника индекса недостаточно для внятного пункта (пустой / обрезанный / сессии нет в индексе), ИЛИ
- пользователь явно просит детали по конкретному ID/теме.
-
«Ключевые решения» и «Открытые вопросы» — ВСЕГДА полностью, не прятать в индекс:
- Источник: тело топ-1 свежей сессии (её читаем всегда) +
<vault_root>/00-home/текущие приоритеты.md+ passport §10. - Если важное решение/вопрос виден в однострочнике более старой сессии — открой её тело, чтобы не потерять. Детали не теряем — только откладываем чтение; тело остаётся каноном и подтягивается по ID/
[[ссылке]].
- Источник: тело топ-1 свежей сессии (её читаем всегда) +
-
No-op на мелких/молодых проектах: если сессий < 3 ИЛИ однострочники по сути равны телам (очень короткие сессии) — ленивость не даёт выигрыша, читай тела как раньше. Не усложняй там, где экономии нет.
-
Fallback (мягкая деградация и защита от сбоев):
- Старые сессии без чистого однострочника в индексе → прочитай тело. Никогда не падай из-за отсутствия/неполноты индекса.
- Защита от падений: генерация handoff НИКОГДА не должна аварийно завершаться из-за ошибок чтения или отсутствия файлов сессий. Если тело последней сессии (или любой другой) прочесть не удалось (например, неверный путь, удален файл, ошибка парсинга), не падай. Вместо этого заполни доступные секции, а в «Точке возврата» (Point of Return) явно укажи: «не удалось прочитать последнюю сессию (проверьте путь/ссылку)» вместо прерывания генерации.
Извлекаемое на сессию (как и раньше): Дата · Что сделано (1-3 пункта) · Ключевые решения · Открытые вопросы — но «Что сделано» теперь преимущественно из индекса, тела — лениво.
Шаг 3. Собери git-контекст (если репо)
git log --oneline --since="14 days ago"
git status --short
git branch --show-current
Из этого: последние ~10 коммитов, текущая ветка, есть ли несохранённые изменения.
Шаг 4. Прочитай текущие приоритеты
<vault_root>/00-home/текущие приоритеты.md — секция «Сейчас» / задачи.
Шаг 5. Прочитай секцию 10 паспорта
«Текущее состояние» + «Открытые вопросы» + «Известные баги».
Шаг 5.5. Собери GSD context (если применимо)
Если в <project_root>/.planning/ (GSD v1 / core) или <project_root>/.gsd/ (v2):
- Из
STATE.md— current milestone + current phase + status - Из
ROADMAP.md— позиция (фаза X из Y) - Из
phases/<NN-current>/CONTEXT.md— топ-3 решения текущей фазы - Из последних 3
phases/<NN>/SUMMARY.md(по mtime) — что было завершено - Из
HANDOFF.json(v1/core) — last position от/gsd-pause-work(или соответствующей gsd-core команды)
Это станет новым блоком в handoff.md (см. ниже формат).
Шаг 5.6. Если установлен context-mode — подсоси Session Guide
Опционально (улучшает handoff если плагин стоит):
- Проверь существование
~/.claude/plugins/marketplaces/context-mode/— это значит у юзера установлен плагин. - Если да — context-mode уже хранит структурированные события сессии в SQLite (
~/.claude/context-mode/sessions/). Из этих событий можно извлечь топ-15 категорий (file/rule/prompt/decision/error/task/git/env/skill/subagent/intent/data/role/cwd/mcp). - Если можешь прочитать sqlite3 — извлеки. Иначе — дай юзеру подсказку в финале: «У тебя стоит context-mode. Для расширенного handoff запусти отдельно
ctx_insightMCP-tool и скопируй результат вручную в handoff.md». - НЕ блокируй handoff если context-mode не установлен — это бонус.
Шаг 5.9. Scrub секретов ПЕРЕД записью (канон config/secret-patterns.json)
handoff.md едет в claude.ai Project Knowledge (внешний сервис). Секрет, случайно попавший из сессии/git в выжимку, утечёт наружу. Поэтому собранный текст handoff прогоняется через фильтр до записи в файл.
Прогони весь собранный текст handoff (все секции) через паттерны из канона <repo>/config/secret-patterns.json (пояснение — <repo>/docs/SECRET-PATTERNS.md):
- Класс A (высокоточные) — маскируй молча, типизированным плейсхолдером с сохранением контекста (
TELEGRAM_TOKEN=<REDACTED:telegram-token>,Bearer <REDACTED:jwt>и т.п. — см. doc). Не вырезай строку. - Класс B (широкое
[A-Za-z0-9_\-]{32,}) — НЕ маскируй (это задевает git SHA-40 / UUID, которых полно в сессиях). Только добавь одну строку-warn пользователю в финальный отчёт: «возможный секрет/длинная строка в <секция> — проверь вручную». - Если хоть что-то из Класса A замаскировано — уведоми пользователя одной строкой: что и сколько (
🔒 Замаскировано N секрет(ов) в handoff: telegram-token×1, jwt×1). - Записывай в handoff.md уже очищенный текст.
Шаг 6. Сгенерируй handoff.md
Сохрани в <vault_root>/handoff.md (перезаписать если есть) очищенный на Шаге 5.9 текст. Формат:
---
project: <name>
generated: <YYYY-MM-DDTHH:MM>
covers_period: <date_first_session> — <today>
sessions_summarized: <N>
---
# Handoff: <name>
> Этот файл загружается в Project Knowledge чата claude.ai вместе с passport.md.
> Цель — новый чат должен быть в курсе **последних 1-2 недель работы** без чтения всех сессий.
## Сейчас в работе
<2-3 строки из dashboard.md секции "Сейчас" + git status>
Ветка: `<branch>` | Несохранённые изменения: <N файлов / нет>
Последний коммит: `<hash> <date> <subject>`
<!-- Structured snapshot — 15 категорий вдохновлено context-mode Session Guide -->
## Структурированный snapshot
> Краткая сводка по 15 семантическим категориям. Заполняй ТОЛЬКО непустые — пропускай пустые. Источники: текущая сессия, dashboard, последние сессии, git, GSD, context-mode SQLite (если есть).
| Категория | Содержание |
|---|---|
| **Files (P1)** | Файлы которые трогали / читали (топ-5 по частоте) |
| **Rules (P2)** | Активные правила: passport секция 8 (топ-3), CLAUDE.md mm-system, karpathy-guidelines |
| **Decisions (P2)** | Решения принятые за период (топ-5, overflow → 3) |
| **Tasks** | В работе сейчас + WIP из dashboard «Сейчас» |
| **Errors** | Незакрытые ошибки / проблемы |
| **Git** | Branch, last commit, uncommitted N |
| **Env** | OS, runtime versions, ENV vars (только имена!) |
| **Skills** | mm-* + другие skills которые активно использовались |
| **Subagents** | Делегированная работа (Agent tool calls) |
| **Intent** | Режим сессии: feature / bugfix / research / refactor / setup |
| **Data** | Внешние источники данных, API, файлы данных |
| **Role** | Persona / behavioral directives если задавались |
| **CWD** | Рабочая директория (абсолютный путь) |
| **MCP** | MCP-tools которые активно дёргали (топ-3) |
| **Prompt patterns** | Сохранённые удачные промпты из `<obsidian>/Projects/<name>/prompts/` |
Категории P1/P2 — приоритет для compactor'а (P1 сохраняем всегда, P2 — обрезаем при overflow).
<!-- GSD блок: вставляй ТОЛЬКО если в проекте есть .planning/ или .gsd/ -->
## GSD контекст (если применимо)
- **Версия**: <v1 .planning/ | v2 .gsd/ | core .planning/ config.json>
- **Milestone**: M<N> «<title>», прогресс <X>/<Y> фаз
- **Текущая фаза**: <NN-current> «<title>» — статус <draft | discussed | planned | in-progress | verified | complete>
- **Последние завершённые фазы** (топ-3 по mtime SUMMARY.md):
- <NN-X> «<title>»: <одна строка из SUMMARY>
- <NN-Y> «<title>»: <одна строка>
- <NN-Z> «<title>»: <одна строка>
- **Решения текущей фазы** (из CONTEXT.md):
- <решение 1>
- <решение 2>
- **HANDOFF.json** (если есть и свежее): <position + what_next в одной строке>
## Что сделано за период
<Объедини findings из 3-5 сессий в 5-8 буллетов. Группируй по темам, не по датам. Дедуплицируй.>
- <тема>: <что сделано> [[sessions/<file>]]
- <тема>: <что сделано> [[sessions/<file>]]
## Ключевые решения и почему
<Из секций "Ключевые решения" сессий — то что переживёт неделю.>
- **<решение>** — <почему> (сессия [[sessions/<file>]])
## Что НЕ работает / в незаконченном виде
- <bug или WIP> — <статус>
## Открытые вопросы (приоритет ↓)
- [ ] <q1>
- [ ] <q2>
## Следующий логичный шаг
<1-2 предложения. Что взять первым в новом чате.>
## Точка возврата
> Куда именно вернуться в следующей сессии. Источник — секция «Точка возврата» самой свежей сессии (её тело читается всегда, Шаг 2 п.3) + текущий git status (Шаг 3).
- **Следующий конкретный шаг:** <одно действие, с чего начать>
- **Если прервались посреди:**
- Недоделано: <что осталось в текущем шаге / «—»>
- Неотправленный промпт: <текст готового, но не выполненного промпта целиком / «нет»>
- Недокоммиченный WIP: <файлы из git status / «нет, дерево чисто»>
## Где смотреть подробности
- Паспорт: [[atlas/passport]]
- Оглавление: [[00-home/index]]
- Приоритеты: [[00-home/текущие приоритеты]]
- Все сессии: [[sessions/]]
- Код: `<абсолютный путь>`
---
**Для нового чата claude.ai:**
1. Open Project «<name>» (Knowledge содержит этот файл + passport.md)
2. Первой репликой можно сказать: *«Привет. Прочитай handoff.md и passport.md, кратко скажи где мы и предложи следующий шаг.»*
Шаг 7. Обнови оглавление 00-home/index.md
В <vault_root>/00-home/index.md обнови карту заметок, если были добавлены новые решения/баги/паттерны.
Шаг 8. Финальный отчёт
✅ Handoff готов
Файл: <abs_path>/handoff.md
Покрывает: <N сессий> с <date> по сегодня
Открытых вопросов: <K>
Что делать:
1. claude.ai → Project «<name>»
2. Если handoff.md уже был в Knowledge — удали старый, загрузи новый (Anthropic не оверрайдит файлы автоматически)
3. New Chat в этом Project
4. Первая реплика: «Прочитай handoff.md и passport.md, скажи где мы и предложи следующий шаг.»
Edge cases
- Нет сессий за период (< 3 файлов): handoff.md всё равно делай, но в "Что сделано" пиши «Свежий проект, истории нет — см. passport.md».
- Нет 00-home/index.md: создай минимальный.
- Нет паспорта: останови, скажи
Сначала /mm-init-project. - Несколько связанных проектов (моно-репо): handoff делается на конкретный проект (по cwd), пользователь выбирает имя.
Что НЕ делать
- Не пиши handoff длинной более 1.5 страниц. Цель — компактность.
- Не копируй полные тексты сессий. Только выжимки.
- Не выдумывай решения и open questions, если их нет в источниках.
- Не трогай passport.md из этого скилла (для этого есть
/mm-init-projectв режиме update).
skills/mm-init-project/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-init-project -g -y
SKILL.md
Frontmatter
{
"name": "mm-init-project",
"version": "0.5.2",
"description": "Инициализирует или обновляет проект для mm-системы — создаёт passport.md в корне, копию в Obsidian, dashboard.md, handoff.md (скелет), project-instructions.md для claude.ai. Use when user says \"оформи проект\", \"сделай паспорт\", \"init project\", \"\/mm-init\", \"\/mm-init-project\", \"обнови паспорт\", \"регистрирую проект\". Работает на пустой папке (новый проект) и на существующем коде с любыми .md файлами (auto-discovery + dry-run preview перед записью). Включает auto-detect стека (~150 фреймворков), dual-detection GSD v1 (.planning\/) и v2 (.gsd\/), import scope\/requirements из GSD-артефактов, secret-grep, детектор рассинхрона между копиями паспорта."
}
mm-init-project — Project Bootstrap & Refresh (safe edition)
Создаёт «паспорт» проекта — единый источник контекста для claude.ai Project Knowledge и для всех mm-* skills. Всегда показывает план перед записью, никогда не уничтожает чужие .md файлы.
Контракт безопасности (это важно — соблюдай дословно)
Skill ПИШЕТ только в эти файлы:
<project_root>/passport.md— создаёт или обновляет<project_root>/CLAUDE.md— только добавляет секции## Obsidian Knowledge Vaultи## mm-systemесли их нет; никогда не редактирует существующие секции<project_root>/.gitignore— добавляет правила для игнорирования локальных настроек Obsidian (.vault/.obsidian/)- Файлы Obsidian Vault (хранилище в
<project_root>/.vault/при локальном режиме или<obsidian_projects>/<name>/при глобальном режиме):00-home/index.md— карта всех заметок00-home/текущие приоритеты.md— текущие приоритеты00-home/project-instructions.md— инструкции для claude.aihandoff.md— создаёт скелет на старте (в корне хранилища)atlas/passport.md— копия паспорта проектаatlas/архитектура проекта.md— описание архитектурыatlas/база данных.md— схема БДatlas/деплой.md— информация о деплое- Создает папки
knowledge/integrations/,knowledge/decisions/,knowledge/debugging/,knowledge/patterns/,knowledge/business/,sessions/,inbox/if they don't exist.
Skill ТОЛЬКО ЧИТАЕТ (никогда не редактирует):
- README.md, ARCHITECTURE.md, NOTES.md, OVERVIEW.md, CONTEXT.md, DESIGN.md, ROADMAP.md, TODO.md, BUGS.md, DECISIONS.md, и любые другие *.md в проекте
- package.json, pyproject.toml, requirements.txt, go.mod, Cargo.toml, pom.xml
- .env.example (не .env!)
- Dockerfile, docker-compose.yml, railway.json, vercel.json
- .git/config, git log, git status
Skill НЕ ТРОГАЕТ ВООБЩЕ:
.env,*.key,*.pem,secrets/— даже не читает значения- node_modules/, .venv/, dist/, build/, target/
- Файлы вне
<project_root>за исключением Obsidian-папки из конфига
Перед любой записью — обязательная фаза Preview (см. ниже). Без подтверждения y — ничего не пишется.
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна. <repo> берётся из _repo_root инжектированного loader'ом.
Понадобятся:
paths.obsidian_projects_repo_root(дляtemplates/passport.mdиtemplates/project-instructions.md)bot_defaults.*default_language
Фаза 0. Определи целевую папку (worktree-aware)
Целевая папка = «корень проекта», не «cwd как есть».
Алгоритм:
- Возьми
cwd. - Если в пути есть подстрока
\.claude\worktrees\или/.claude/worktrees/— это worktree. Найди корневой репо:- Прочитай
<cwd>/.git(это файл-указатель, не папка). Извлекиgitdir: <path>. Из него выведи main repo path. - Если не получилось — спроси:
Это git worktree. Какую папку считать корнем проекта? <предложи: ...>.
- Прочитай
- Иначе — поднимись от
cwdпока не найдёшь.git/(папку, не файл) илиpackage.json/pyproject.toml/ любой явный маркер корня. Если ничего нет —cwdи есть корень.
Имя проекта = basename целевой папки. Покажи: Имя проекта: <name> (целевая папка: <path>). Ок? (y/n или новое имя).
Фаза 1. Discovery (что уже есть в проекте)
Просканируй и выведи отчёт пользователю перед любыми действиями.
1a. Существующие паспорта (миграция)
Поищи (case-insensitive) в <project_root> и <project_root>/docs/:
passport.md,PASSPORT.md,Passport.md,passport.MD— варианты casePROJECT_PASSPORT.md,project_passport.md— старая louise-система (Claude Setup/)*_passport.md,passport_*.md
Любой найденный — кандидат на миграцию, не конфликт-блокер.
1b. Документы которые могут содержать контекст
Просканируй *.md в:
<project_root>/(корень)<project_root>/docs/,<project_root>/notes/,<project_root>/_docs/<project_root>/.planning/(GSD-документы)
Распознай семантически по имени (case-insensitive substring):
| В имени есть | Категория |
|---|---|
readme |
Описание / overview |
architecture, design, arch |
Архитектура |
overview, context, intro |
Контекст |
notes, ideas |
Заметки |
decisions, adr, rfc |
Решения |
roadmap, plan |
Планы |
todo, tasks, backlog |
Задачи |
bugs, issues, known-issues |
Проблемы |
changelog, history |
История |
claude (CLAUDE.md, claude-rules.md) |
Правила для AI |
Прочитай первые 50 строк каждого найденного файла — для понимания.
1c. Маркеры стека (auto-detection)
Manifest-файлы — прочитай если есть:
package.json,pyproject.toml,requirements.txt,go.mod,Cargo.toml,pom.xml,composer.json,Gemfile,mix.exs,pubspec.yamlDockerfile,docker-compose.yml,railway.json,vercel.json,fly.toml,Procfile.env.example,.env.template(не.env!)tsconfig.json,next.config.*,vite.config.*,astro.config.*,nuxt.config.*,svelte.config.*,remix.config.*.python-version,.nvmrc,.tool-versions,runtime.txt
Auto-detection: пакет → стек (по подстроке в зависимостях):
| Если в зависимостях | Тип | Фреймворк | Категория |
|---|---|---|---|
aiogram, python-telegram-bot, telethon, pyrogram, telegraf, grammy |
bot | по имени | tg-bot |
discord.py, discord.js, discordeno |
bot | по имени | discord-bot |
fastapi, flask, django, starlette, litestar, quart, sanic, bottle, pyramid |
web | по имени | python-web |
express, koa, hapi, fastify, nest, polka, hono, elysia |
web | по имени | node-web |
next, nuxt, astro, remix, sveltekit, gatsby, solid-start, qwik |
web | по имени | meta-framework |
react, vue, svelte, solid-js, preact, lit, htmx |
web | по имени | spa-frontend |
gin, echo, fiber, chi, gorilla/mux, huma |
web | по имени | go-web |
actix-web, axum, rocket, warp, tide, salvo |
web | по имени | rust-web |
rails, sinatra, hanami, roda |
web | по имени | ruby-web |
phoenix, plug |
web | по имени | elixir-web |
laravel, symfony, slim |
web | по имени | php-web |
sqlalchemy, sqlmodel, alembic, tortoise-orm, peewee, pydantic |
— | — | python-db |
prisma, drizzle, kysely, typeorm, sequelize, mongoose, mikro-orm |
— | — | node-db |
gorm, ent, sqlx, bun, pgx |
— | — | go-db |
diesel, sea-orm, sqlx (rust) |
— | — | rust-db |
pytest, unittest, nose2, tox |
— | тесты Python | testing |
vitest, jest, mocha, playwright, cypress, ava, tap |
— | тесты JS | testing |
cargo test (default), nextest |
— | тесты Rust | testing |
loguru, structlog, winston, pino, zap, tracing, slog |
— | логирование | observability |
pydantic, zod, joi, yup, ajv, valibot, arktype |
— | валидация | validation |
openai, anthropic, litellm, langchain, llama-index, instructor |
— | — | ai-llm |
huggingface, transformers, torch, tensorflow, jax, keras |
— | — | ai-ml |
pandas, polars, numpy, scipy, dask |
— | — | data |
dlt, airflow, prefect, dagster, kafka-python, aiokafka |
— | — | pipelines |
redis, aioredis, kombu, celery, rq, bullmq |
— | — | queue/cache |
scrapy, playwright, puppeteer, selenium, httpx, aiohttp |
— | — | scraping/http |
tauri, electron, wails |
— | — | desktop |
Файловые маркеры (если manifest неоднозначен):
*.tsx/*.jsx→ React*.vue→ Vue*.svelte→ Svelte*.astro→ Astroapp/page.tsx→ Next.js App Routerpages/*.tsx→ Next.js Pages Routerwrangler.toml→ Cloudflare Workersserverless.yml→ Serverless Frameworkterraform/,*.tf→ Terraformhelm/,Chart.yaml→ Kubernetes Helm
Combo-recognition (комплекты):
- React + TypeScript + Tailwind + shadcn → пометить «modern react stack»
- FastAPI + Pydantic + sqlmodel + pytest → пометить «modern python web»
- aiogram + sqlmodel + loguru → пометить «default bot stack» (из bot_defaults конфига)
- Наличие
telethonв зависимостях → установить внутренний флагtelethon_project: true - Наличие фреймворков категории
tg-bot(aiogram,python-telegram-bot,telegraf,grammyи др.) в зависимостях → установить внутренний флагtg_bot_project: true
Приоритет определения типа (когда несколько матчей):
- tg-bot / discord-bot (если есть бот-фреймворк) —
bot - meta-framework (Next/Nuxt/Astro/Remix) —
web - python-web / node-web / go-web / rust-web —
web - spa-frontend без backend —
web(frontend-only) - ai-ml / ai-llm + entry point —
scriptилиservice - data / pipelines —
script - desktop —
desktop - lib (если в
pyproject.toml[project]без entry point ИЛИ вpackage.jsonmainбезbin) —lib - иначе —
script
Версии:
- Питон: из
.python-versionилиpyproject.tomlrequires-python - Node: из
.nvmrc,engines.nodeв package.json - Go: из
go.modстрокаgo X.Y - Rust: из
rust-toolchain.tomlили edition вCargo.toml
1d. Git-контекст
git rev-parse --show-toplevel
git remote -v
git branch --show-current
git log --oneline -10
1e. Системы которые могут конфликтовать (dual-detection GSD)
GSD detection (определи версию):
<project_root>/.planning/существует:- Если
<project_root>/.planning/config.jsonсуществует → GSD Core. В passport frontmattergsd_version: core. - Иначе → GSD v1. В passport frontmatter
gsd_version: v1.
- Если
<project_root>/.gsd/существует → GSD v2. В passport frontmattergsd_version: v2.- Оба → смешанный (редкость, после миграции). Спроси: какой считать активным?
- Ни одного →
gsd_version: none.
Если GSD есть — попробуй импортировать scope/requirements (чтобы не дублировать):
GSD v1 (.planning/):
PROJECT.md→ vision, audience, goals → секция 1 (Назначение) + секция 3 (Архитектура краткая)REQUIREMENTS.md→ REQ-001..N → можно вытащить топ-5 в секцию 4 как «функциональные требования» (опционально)ROADMAP.md→ phases, статусы → секция 9 паспорта строкаТекущий milestone / phase: <M1 / phase 03 — <title>>STATE.md→ current phase / position → секция 10 «В работе сейчас»codebase/STACK.md,codebase/ARCHITECTURE.md,codebase/CONVENTIONS.md,codebase/CONCERNS.md→ если есть, переносим в секции 2, 3, 7, 10 паспорта (НЕ дублируя — кратко + ссылкасм. .planning/codebase/STACK.md)
GSD v2 (.gsd/):
gsd.db(SQLite) → если можешь прочитать через sqlite3 CLI/Python — извлеки текущий milestone/slice/task; иначе пропустиSTATE.md(rendered dashboard) → парсинг как у v1AGENTS.md→ preferences для агентов → ссылка в секции 7 паспорта
Важное правило про дубликацию:
- Если в
.planning/PROJECT.mdуже есть подробное описание проекта — в секции 1 паспорта пиши краткое summary + ссылку (см. .planning/PROJECT.md), не копируй целиком. - В секции 9 явно укажи source-of-truth:
Source-of-truth для scope/requirements: .planning/PROJECT.md. Это нужно чтобы будущий читатель не запутался какой документ актуальный.
Никогда не пиши в .planning/* или .gsd/* напрямую — там file-lock'и, hook'и-охранники GSD. Только читать.
CLAUDE.md → читай, оценивай размер: маленький (< 30 строк) — добавим секцию; большой — спросим перед добавлением.
passport.md (точное совпадение) → режим update, см. фазу 3.
1f. Sync-check между копиями паспорта
Если есть и <project_root>/passport.md И <obsidian>/Projects/<name>/passport.md:
- Сравни sha256 содержимого (или хотя бы mtime + size).
- Если расходятся — это значит юзер редактировал одну из копий (например в Obsidian app). Покажи в Discovery:
⚠️ Рассинхрон: passport.md в проекте и в Obsidian отличаются. Проект: updated <date>, sha <hex8> Obsidian: updated <date>, sha <hex8> Какую версию считать source-of-truth? [1] Проект (Obsidian перезапишется) — дефолт [2] Obsidian (проект перезапишется) [3] Show diff first [4] Cancel - Запомни выбор для фазы 4 (write).
1g. Вывод фазы Discovery (покажи пользователю)
🔍 Discovery: <project_name>
Целевая папка: <abs_path>
Git: <branch>, <N> коммитов, remote: <url или local>
Найдено существующих паспортов:
• PROJECT_PASSPORT.md ← старая louise-система, можно мигрировать
• passport.md ← текущий формат, режим update
(или: «не найдено»)
Найдено документов с контекстом:
• README.md (описание)
• docs/architecture.md (архитектура)
• NOTES.md (заметки)
(используются ТОЛЬКО для чтения — не будут изменены)
GSD detection:
• Версия: <none | v1 (.planning/) | v2 (.gsd/) | core (.planning/ config.json)>
• PROJECT.md: <есть, 240 строк — могу импортировать vision и audience в секции 1, 3>
• REQUIREMENTS.md: <есть, REQ-001..REQ-014 — топ-5 в секцию 4?>
• Текущий milestone: <M1 «MVP», phase 03/07 «add /stats command» (in-progress)>
• codebase/: <STACK.md, ARCHITECTURE.md, CONVENTIONS.md — могу подсосать в секции 2, 3, 7>
Стек определён (auto-detection):
• Язык: Python 3.12 (из .python-version)
• Фреймворк: aiogram 3.x (из pyproject.toml)
• DB: SQLite через sqlmodel
• Тесты: pytest
• Логирование: loguru
• Тип: bot (combo: «default bot stack»)
Существующий CLAUDE.md: <нет / <N> строк, добавлю секцию mm-system / большой — спрошу>
Фаза 2. Решения (если нужны)
Задай только реально неопределённые вопросы (максимум 3-4):
-
Расположение Obsidian Vault (КРИТИЧНО): Спроси пользователя, где хранить базу знаний (Obsidian Vault):
Выберите расположение Obsidian Vault для проекта: [1] Локально в папке проекта (рекомендуется: <project_root>/.vault/, версионируется в git, синхронизируется с claude.ai автоматически) — дефолт [2] Глобально в папке Obsidian (из конфига: <obsidian_projects>/<name>/) -
Если найден PROJECT_PASSPORT.md или другой кандидат миграции:
Найден старый паспорт <file>. Мигрировать его контент в новый passport.md? (y = мигрировать, переименую старый в .legacy / n = игнорировать) -
Если есть passport.md И он явно устарел (mtime старше 30 дней или git log показывает много коммитов после updated): Просто переходи в режим update без вопроса.
-
Если CLAUDE.md > 30 строк:
CLAUDE.md существует и непустой (<N> строк). Добавить правила базы знаний в конец? (y/n) -
Если папка пустая (новый проект):
- Тип: bot / web / lib / script?
- Язык / фреймворк? (для bot — дефолт
aiogramиз bot_defaults) - Назначение в одном предложении?
-
Если в выбранной директории Vault уже есть файлы:
В директории базы знаний уже есть файлы. Update (y) / Создать папку с суффиксом -2 (n) / Отмена (c)? -
Если есть GSD (
.planning/PROJECT.mdили.gsd/) и режим init:Найден <PROJECT.md / .gsd/>. Импортировать описание/scope в секции 1, 3 паспорта (y) / только сослаться, не дублировать (n) / отмена (c)? Дефолт n — паспорт ссылается, не дублирует.
Если пользователь говорит «решай сам» — выбирай разумный дефолт, отмечай в финальном отчёте <assumed: ...>.
Фаза 3. План записи (Preview / Dry-run)
Это обязательная фаза. Без подтверждения — НИЧЕГО не пишется.
Покажи пользователю полный план в формате:
📋 План записи
Расположение Obsidian Vault: <локальное (.vault/) | глобальное (<path>)>
СОЗДАМ:
+ <project>/passport.md (новый файл, <N> секций)
Источники: README.md, package.json, etc.
+ <vault_root>/00-home/index.md (карта всех заметок)
+ <vault_root>/00-home/текущие приоритеты.md (активные приоритеты)
+ <vault_root>/00-home/project-instructions.md (инструкции для claude.ai)
+ <vault_root>/handoff.md (скелет)
+ <vault_root>/atlas/passport.md (копия паспорта)
+ <vault_root>/atlas/архитектура проекта.md (архитектура)
+ <vault_root>/atlas/база данных.md (схемы БД)
+ <vault_root>/atlas/деплой.md (информация о деплое)
+ <vault_root>/knowledge/integrations/ (папка)
+ <vault_root>/knowledge/decisions/ (папка)
+ <vault_root>/knowledge/debugging/ (папка)
+ <vault_root>/knowledge/patterns/ (папка)
+ <vault_root>/knowledge/business/ (папка)
+ <vault_root>/sessions/ (папка для логов сессий)
+ <vault_root>/inbox/ (папка для входящего)
ИЗМЕНЮ:
~ <project>/CLAUDE.md (добавлю правила Obsidian Knowledge Vault, +18 строк)
<если локальный режим:>
~ <project>/.gitignore (добавлю .vault/.obsidian/ в конец, +2 строки)
ПЕРЕИМЕНУЮ:
→ PROJECT_PASSPORT.md → PROJECT_PASSPORT.md.legacy
НЕ ТРОНУ:
README.md, .planning/*, .env, src/
Continue? (y / n / edit)
edit → дай возможность изменить план: «Не переименовывай PROJECT_PASSPORT» / «Не трогай CLAUDE.md» / «Не создавай dashboard» — пользователь редактирует список через простой dialog, ты применяешь.
n → останови, ничего не пиши.
y → переходи к фазе 4.
Фаза 4. Запись (atomic: всё или ничего)
Делай в этом порядке. Если хоть один шаг падает — откати уже сделанное (удали созданные файлы, восстанови переименованный):
4.1. Сгенерируй текст passport.md в памяти
Возьми шаблон <skills_repo>/templates/passport.md. Заполни:
- Секции 1-7, 9 — из discovery (стек, архитектура, команды, конвенции из README, ENV из .env.example).
- Секция 8 «Контекст для промптов»:
- Если миграция из PROJECT_PASSPORT.md и там есть аналогичный раздел — перенеси.
- Иначе:
- Если
telethon_project == true, добавь следующие жесткие правила:При написании кода для Telethon-аккаунтов строго следуй правилам из [[telethon-sessions|инструкции по сессиям Telethon]].Запрещены параллельные запуски сессий с одним файлом .session (риск AuthKeyDuplicatedError).Все параметры устройства (fingerprint) бери строго из соответствующего .json файла.Используй SOCKS5-прокси с rdns=True для всех подключений.
- Если
tg_bot_project == true, добавь следующие жесткие правила:При проектировании интерфейса бота (текст, кнопки, эмодзи) строго следуй правилам из [[tg-bot-ui-ux|руководства по UI/UX ботов Telegram]].
- Иначе оставь шаблон +
<!-- TODO: заполни секцию 8 — критично, читается каждым промптом -->.
- Если
- Секция 10 «Текущее состояние»:
- Init: пустой шаблон.
- Update (есть passport.md): сохрани существующий текст 1:1.
- Migration: если в старом паспорте была секция «Текущее состояние / Status / Now» — перенеси.
- Секция 11 «История»:
- Init: одна строка «
Initial». - Update: добавь строку «
Refresh: <что обновилось>». - Migration: «
Migrated from PROJECT_PASSPORT.md».
- Init: одна строка «
Frontmatter: created из существующего файла или сегодня; updated = сегодня; mm_version = config.version из mm-config.json (подставь значение, не оставляй плейсхолдер <MM_VERSION>); telegram_ui_ux = true (если tg_bot_project == true), иначе false.
4.2. Сгенерируй файлы Obsidian Vault в памяти
Сгенерируй структуру и контент для файлов базы знаний:
00-home/index.md: Карта всех файлов в Vault. На старте содержит ссылки на[[текущие приоритеты]],[[project-instructions]],[[handoff]],[[atlas/passport|паспорт проекта]],[[atlas/архитектура проекта]],[[atlas/база данных]],[[atlas/деплой.md]]и заглушки для подразделов вknowledge/иsessions/. Еслиtelethon_project == true, добавь также ссылку на[[knowledge/integrations/telethon-sessions|инструкцию по сессиям Telethon]]. Еслиtg_bot_project == true, добавь также ссылку на[[knowledge/patterns/tg-bot-ui-ux|инструкцию по UI/UX ботов Telegram]].00-home/текущие приоритеты.md: Содержит текущий milestone и приоритетные задачи, извлеченные из GSD или Discovery (на старте).00-home/project-instructions.md: Возьми<skills_repo>/templates/project-instructions.md, подставь<PROJECT_NAME>, замени пути к файлам на новые пути в структуре базы (например,00-home/index.mdвместоdashboard.md), добавь топ-3 пункта из секции 8 паспорта.- Если
telethon_project == true, добавь в инструкции для ИИ блок:Этот проект использует Telethon. При написании кода по работе с сессиями/аккаунтами руководствуйся правилами из [[knowledge/integrations/telethon-sessions.md]].
- Если
tg_bot_project == true, добавь в инструкции для ИИ блок:При создании диалогов, кнопок, FSM-сценариев и форматировании сообщений следуй правилам из [[knowledge/patterns/tg-bot-ui-ux.md]].
- Если
handoff.md(в корне Vault): Скелет handoff (шаблон см. в Appendix). В режиме update не трогай, если файл уже существует.atlas/passport.md: Копия сгенерированногоpassport.md.atlas/архитектура проекта.md: Содержит описание архитектуры из секции 3 паспорта.atlas/база данных.md: Содержит модели данных из секции 6 паспорта.atlas/деплой.md: Содержит инструкции и команды деплоя из секции 5/2 паспорта.knowledge/integrations/telethon-sessions.md(только еслиtelethon_project == true): скопируй содержимое из<skills_repo>/templates/telethon-sessions.md.knowledge/patterns/tg-bot-ui-ux.md(только еслиtg_bot_project == true): скопируй содержимое из<skills_repo>/templates/tg-bot-ui-ux.md.
4.3. Сгенерируй патч для CLAUDE.md (если нужен)
Если CLAUDE.md существует и в нём нет секции ## Obsidian Knowledge Vault — добавь в конец:
## Obsidian Knowledge Vault
Хранилище знаний: <vault_path>
### При старте сессии
Прочитай 00-home/index.md и текущие приоритеты.md.
Если задача касается модуля — прочитай заметку из knowledge/.
### При завершении (пользователь: "сохрани сессию")
1. Создай заметку в sessions/ с датой
2. Обнови текущие приоритеты.md
3. Если решение — создай в knowledge/decisions/
4. Если баг — создай в knowledge/debugging/
5. Обнови index.md если новые заметки
## Режимы работы (IDE vs CLI)
1. **Если ты запущен в чат-окне Antigravity IDE (Gemini)**:
- Ты выступаешь **исключительно как Планировщик и Архитектор**.
- Тебе **категорически запрещено** самостоятельно изменять файлы проекта, записывать код в файлы или запускать изменяющие состояние команды (типа `git commit`, `git push`).
- Твоя задача — использовать инструменты чтения (файлы, логи) и поиска, анализировать код, планировать изменения и генерировать готовый промпт для CLI-агента.
2. **Если ты запущен в консоли/терминале как CLI-агент (Claude Code / CLI-клиент)**:
- Ты выступаешь как **Исполнитель**.
- Ты должен автоматически вносить изменения в файлы, запускать тестов, делать коммиты и пушить изменения без подтверждений (согласно Karpathy-style discipline) на основе промптов, полученных из IDE.
## mm-system
Этот проект подключён к mm-системе.
- Паспорт: `passport.md` (актуальный source-of-truth)
- База знаний: `<vault_path>`
- Skills: глобальные `mm-*` (см. `~/.claude/skills/`)
- Конец сессии: `/mm-save-session`
- Перед новым чатом claude.ai: `/mm-handoff`
### Интеграция с Antigravity (Gemini IDE)
- Агент Antigravity поддерживает те же команды mm-системы.
- При получении команды (например `/mm resume`, `/mm save`, `/mm setup`, `где мы`, `сохрани сессию`) агент должен найти соответствующий SKILL.md по пути `~/.claude/skills/mm-<name>/SKILL.md` или в каталоге репозитория `$MM_REPO_ROOT/skills/mm-<name>/SKILL.md`, прочесть его и выполнить указанные в нем инструкции.
Где <vault_path> — это .vault/ (если выбран локальный режим) или <obsidian_projects>/<name>/ (если глобальный).
4.4. Запиши всё
В строгом порядке (с откатом при падении):
- Создай директорию Vault (
<project_root>/.vault/или глобальную) и все подпапки:00-home/,atlas/,knowledge/integrations/,knowledge/decisions/,knowledge/debugging/,knowledge/patterns/,knowledge/business/,sessions/,inbox/. - Запиши
<project>/passport.md. - Запиши файлы в Vault:
<vault>/00-home/index.md<vault>/00-home/текущие приоритеты.md<vault>/00-home/project-instructions.md<vault>/handoff.md(только если не существует)<vault>/atlas/passport.md<vault>/atlas/архитектура проекта.md<vault>/atlas/база данных.md<vault>/atlas/деплой.md<vault>/knowledge/integrations/telethon-sessions.md(только еслиtelethon_project == true)<vault>/knowledge/patterns/tg-bot-ui-ux.md(только еслиtg_bot_project == true)
- Если выбран локальный режим, открой
<project>/.gitignore, и если в нём нет строки.vault/.obsidian/— добавь в конец:# Local Obsidian UI state .vault/.obsidian/ - Если есть PROJECT_PASSPORT.md и пользователь подтвердил миграцию — переименуй в
.legacy. - Примени патч к CLAUDE.md.
При ошибке на шагах 1-6: удали созданные файлы и папки, верни переименованный паспорт.
4.5. Проверка инвариантов + secret-grep
После записи проверь:
passport.mdсодержит все 11 секций.- Frontmatter валидный (parse YAML).
- В Obsidian нет файлов с похожими именами (
passport.mdvspassport_old.md) — если есть, предупреди.
Secret-grep (критично — passport едет в claude.ai):
Прогони passport.md через regex-поиск потенциальных секретов. Паттерны — в каноне <repo>/config/secret-patterns.json (Класс A — высокоточные, Класс B — широкие/warn-only; пояснение — <repo>/docs/SECRET-PATTERNS.md). Не дублируй их здесь — source of truth именно json.
Если что-то нашёл — не молчи, не удаляй сам. Покажи:
⚠️ В passport.md найдено что выглядит как секрет:
Строка 47: TELEGRAM_TOKEN=12345...
Строка 53: api_key: sk-abc123...
passport.md загружается в claude.ai Project Knowledge → попадёт во внешний сервис.
Действия:
[1] Удалю секреты сам, оставлю плейсхолдер `<REDACTED>` — рекомендуется
[2] Покажу строки, я отредактирую вручную, перезапусти /mm-init-project
[3] Игнорировать (например это пример из docs)
Только после ответа юзера продолжай.
Фаза 5. Финальный отчёт
✅ mm-init-project завершён
Режим: <init | update | migration>
Проект: <name>
Тип: <type> | Язык: <lang> | Стек: <главное>
Записано:
✓ <project>/passport.md
✓ <vault>/00-home/index.md (карта всех заметок)
✓ <vault>/00-home/текущие приоритеты.md (активные приоритеты)
✓ <vault>/00-home/project-instructions.md (инструкции для claude.ai)
✓ <vault>/handoff.md (скелет)
✓ <vault>/atlas/passport.md (копия паспорта)
✓ <vault>/atlas/архитектура проекта.md
✓ <vault>/atlas/база данных.md
✓ <vault>/atlas/деплой.md
✓ <vault>/knowledge/integrations/telethon-sessions.md (только если `telethon_project == true`)
✓ <vault>/knowledge/patterns/tg-bot-ui-ux.md (только если `tg_bot_project == true`)
✓ <project>/CLAUDE.md (добавлены правила Obsidian Knowledge Vault)
<если локальный режим:>
✓ <project>/.gitignore (добавлен игнор .vault/.obsidian/)
Перенесено из старого паспорта (если миграция):
✓ Секция «Контекст для промптов» (5 правил)
✓ Секция «Текущее состояние» (3 пункта)
Старый файл переименован: PROJECT_PASSPORT.md.legacy
Не тронуто:
README.md, docs/, NOTES.md, .planning/, .env
Следующие шаги:
1. Открой passport.md, проверь секции 1-7 (заполнены автоматически — могут быть неточны)
2. Заполни секцию 8 «Контекст для промптов» — это критично
3. claude.ai → New Project «<name>»
4. Knowledge → загрузи passport.md и dashboard.md из Obsidian
5. Instructions → скопируй из project-instructions.md
Edge cases
- Папка пустая, но git initialized без коммитов: спрашивай как новый проект.
- Имя папки с пробелами / кириллицей: используй для отображения как есть; для slug в Obsidian (имя папки) — транслит в kebab-case.
- Несколько языков (моно-репо): тип =
multi, перечисляй через запятую. - Symlinks / junctions в проекте: не следуй по ним (Get-Item Attributes & ReparsePoint).
- Скрытые .md (
.DS_Store.mdили подобное мусорное): игнорируй файлы начинающиеся с точки (кроме.planning/). - Очень большой проект (> 1000 .md файлов): сканируй только корень + 1 уровень глубже +
docs/. Не углубляйся. - Vault недоступен (путь из конфига не существует): останови, скажи
Obsidian vault не найден: <path>. Проверь mm-config.json или создай папку. - Существующий passport.md в Obsidian отличается от проекта (рассинхрон): предупреди — какую версию считать source-of-truth? Дефолт: проектная версия выигрывает.
Что НЕ делать
- Не делать
git init,git add,git commit,git push— никаких git-операций. - Не читать значения из
.env,*.key,*.pem,secrets/. - Не редактировать README.md, ARCHITECTURE.md и любые другие .md в корне проекта (только passport.md и CLAUDE.md). Файлы внутри Obsidian-папки проекта — passport.md/dashboard.md/project-instructions.md — это разрешённый scope (см. контракт безопасности в начале skill).
- Не удалять файлы (только переименование с суффиксом
.legacyпри миграции). - Не пропускать фазу Preview — даже если кажется «и так всё ясно».
- Не задавать больше 3-4 вопросов; для остального — разумные дефолты с пометкой
<assumed: ...>.
Appendix: шаблон dashboard.md
---
project: <name>
updated: <date>
---
# <name> — Dashboard
## Сейчас
<пусто на старте — обновляется через /mm-save-session>
## Последние сессии
- <будут появляться после /mm-save-session>
## Открытые вопросы
- [ ] см. passport.md секция 10
## Ссылки
- Код: `<абсолютный путь к проекту>`
- Паспорт: [[passport]]
- Sessions: [[sessions/]]
- Handoff (для нового чата claude.ai): [[handoff]]
Appendix: шаблон handoff.md (скелет на init)
На init кладётся именно этот скелет. Полноценный handoff (15-категорийный snapshot, выжимка сессий, GSD-контекст) генерирует /mm-handoff — он вызывается автоматически из /mm-save-session и заменяет скелет при первом же сохранении сессии.
---
project: <name>
generated: <date>
covers_period: <date> — <date>
sessions_summarized: 0
---
# Handoff: <name>
> Этот файл загружается в Project Knowledge чата claude.ai вместе с passport.md.
> Обновляется автоматически при `/mm-save-session` (или вручную через `/mm-handoff` / `/mm next`).
## Сейчас в работе
<свежий проект — наполнится после первой рабочей сессии>
## Что сделано за период
Свежий проект, истории сессий ещё нет — см. [[passport]].
## Открытые вопросы
- [ ] см. [[passport]] секция 10
## Следующий логичный шаг
<определится после первой сессии>
## Где смотреть подробности
- Паспорт: [[passport]]
- Dashboard: [[dashboard]]
- Sessions: [[sessions/]]
- Код: `<абсолютный путь к проекту>`
skills/mm-resume/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-resume -g -y
SKILL.md
Frontmatter
{
"name": "mm-resume",
"version": "0.4.0",
"description": "Восстановить контекст в начале сессии или после \/clear. Читает passport.md + dashboard + последнюю сессию + git status + (если есть GSD) полный контекст планирования (.planning\/ для v1 или .gsd\/ для v2 — STATE, ROADMAP, текущий phase CONTEXT\/PLAN, HANDOFF.json). Выдаёт компактную сводку «где мы». Use when user says \"ну что у нас\", \"напомни где мы остановились\", \"вернулся\", \"возобновляю\", \"\/mm resume\", \"\/mm start\", \"\/mm context\", \"что у нас по проекту\", \"где мы\" в начале новой сессии Claude Code или после \/clear."
}
mm-resume — Context Restore for Claude Code
Решает проблему: после /clear, exit && claude, или после паузы на день — нет контекста. Этот skill за один вызов читает все источники и говорит «где мы, что в работе, что брать следующим».
Это аналог git status, но для проекта в целом — не для рабочей копии, а для головы.
Когда вызывать
- В начале новой Claude Code сессии в проекте — первая команда
- После
/mm save→/clear— восстановить контекст в той же сессии - После недели паузы — догнать что вообще происходило
- Когда юзер пишет «где мы», «что у нас», «напомни» — сразу запускай, не переспрашивай
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_projectspaths.obsidian_sessions(на случай старого формата без папки проекта)
Процесс
Шаг 0. Фоновый автоапдейт mm-системы (неблокирующий)
Выполни в фоновом режиме команду проверки обновлений:
- На macOS/Linux:
python3 $MM_REPO_ROOT/scripts/auto-update.py --background &(или используя путь~/.markdown-memory/scripts/auto-update.pyесли переменная не задана) - На Windows: запусти
pythonсо скриптомauto-update.py --backgroundв фоновом режиме (скрипт сам сделает Popen detached-процесс и мгновенно вернет управление).
Шаг 1. Определи проект (worktree-aware)
То же что в mm-init-project Phase 0:
- Если cwd внутри
.claude/worktrees/...— resolve до main repo через.gitфайл-указатель - Иначе — поднимись до корня (где
.git/,package.json,pyproject.toml, и т.п.) - Имя проекта = из
passport.mdfrontmatter (если есть) ИЛИ basename корневой папки
Если в проекте нет passport.md — скажи: Проект не инициализирован для mm. Запустить /mm new сначала? и остановись.
Шаг 2. Прочитай источники (параллельно если можно)
2a. Паспорт
<project_root>/passport.md— frontmatter, секция 8 (контекст промптов), секция 10 (текущее состояние)
2b. Obsidian-артефакты (Obsidian Knowledge Vault)
- Определи путь к хранилищу
<vault_root>(из секции## Obsidian Knowledge VaultвCLAUDE.md, либо дефолтная локальная папка.vault/, либо глобальная папка проекта<obsidian_projects>/<name>/). - Прочитай
<vault_root>/00-home/текущие приоритеты.md— извлеки текущие цели, WIP и следующие шаги. - Прочитай
<vault_root>/00-home/index.md— для понимания структуры доступных вknowledge/иatlas/заметок. <vault_root>/handoff.md(если есть) — последний snapshot для chat; обязательно вытащи секцию «Точка возврата» (следующий шаг + висящее: неотправленный промпт прошлой сессии, недоделанное, WIP).<vault_root>/sessions/— найди самый свежий .md по mtime; прочти секции «Что сделано», «Открытые вопросы», «Следующие шаги».- Если текущая задача пользователя касается конкретных интеграций, решений или архитектурных вопросов, найди релевантные заметки в
<vault_root>/knowledge/(или вatlas/) и предложи агенту прочитать их.
2c. Git-контекст
git rev-parse --show-toplevel
git branch --show-current
git status --short # сколько uncommitted
git log --oneline -5 # последние коммиты
git stash list 2>/dev/null # есть ли stash'ы
2d. GSD-контекст (dual-detection v1/v2/core)
Сначала определи версию:
<project_root>/.planning/существует:- Если
<project_root>/.planning/config.jsonсуществует → GSD Core - Иначе → GSD v1
- Если
<project_root>/.gsd/существует → GSD v2- Оба → используй
gsd_versionиз passport frontmatter; если нет — спроси. - Ничего нет → пропусти секцию.
Если GSD v1 или GSD Core (.planning/) — прочитай в этом порядке (приоритет ↓):
.planning/STATE.md— главное. Из него: текущий milestone, position (phase/step), последние решения, blockers..planning/HANDOFF.json(если существует) — самый свежий snapshot от/gsd-pause-work. Если его mtime > чем у последней mm-сессии — приоритет HANDOFF..planning/ROADMAP.md— список фаз с[x]/[~]/[ ]. Покажи позицию: фаза X из Y, прогресс milestone'а..planning/phases/<NN-current>/CONTEXT.md(если есть текущая фаза) — preferences и решения этой фазы. Это критично — покажет что мы решали в текущей фазе..planning/phases/<NN-current>/PLAN.md— что планировали. Извлеки список задач, посчитай completed/pending..planning/phases/<NN-current>/SUMMARY.md(если фаза завершена) — итог..planning/threads/(если есть) — активные темы для cross-session.
Если GSD v2 (.gsd/):
.gsd/STATE.md(rendered dashboard от gsd CLI) — главное..gsd/AGENTS.md— preferences для агентов (равноCONTEXT.mdv1)..gsd/gsd.db(SQLite) — опционально, если естьsqlite3в PATH. Используй абсолютный путь от<project_root>:
Парси вывод. Если sqlite3 недоступен — пропусти, сводка будет беднее но не сломается.sqlite3 "<project_root>/.gsd/gsd.db" "SELECT name, status FROM milestones WHERE active=1; SELECT name, status FROM slices WHERE milestone_id=(SELECT id FROM milestones WHERE active=1); SELECT title, status FROM tasks WHERE slice_id=(SELECT id FROM slices WHERE active=1) LIMIT 10;"
Это эквивалент /gsd-progress плюс часть /gsd-resume-work — встроено сюда, не нужно дёргать GSD-команды отдельно.
Не пиши в .planning/* или .gsd/* — только читай (там file-lock'и и охраняющие хуки).
2e. mm-система (smoke check)
Быстрая проверка:
~/.claude/skills/mm-bridgeсуществует и junction живой → ✅- Иначе — намекни запустить
/mm check
Не делай полный /mm-doctor — это лишнее на старте, юзер вызовет если нужно.
Шаг 3. Синтезируй сводку
Не просто вывали данные — синтезируй. Коротко, в одном экране. Веди той же формой, что и возвращение в claude.ai: ориентир по структуре плана (GSD-фаза или чек-лист открытых вопросов — что у проекта есть), затем «Точка возврата», затем один следующий конкретный шаг. Не плоский дамп коммитов.
Формат:
🚀 <project_name> — где мы
Стек: <язык> · <фреймворк> · <DB>
Ветка: <branch> | <N> uncommitted | <K> stash'ей
Последний коммит: <hash> "<subject>" (<X дней назад>)
📍 Сейчас в работе
<1-3 строки из текущие приоритеты.md (раздел WIP/Приоритеты) + если есть текущая GSD-фаза — она>
<Если GSD:>
🎯 GSD <v1|v2|core>: M<N> «<milestone_title>», фаза <X>/<Y> — «<phase_title>»
Статус: <X задач completed, Y pending, Z blocked>
Текущая фаза: <статус из STATE.md>
<Если есть HANDOFF.json свежее последней сессии:>
📌 HANDOFF (от /gsd-pause-work, <date>): <первый параграф what_next>
Решения текущей фазы (из CONTEXT.md): <топ-2 пункта>
Следующее: <next phase title или "execute current" или "verify">
📝 Последняя сессия (<date>)
Тема: <тема из имени файла>
Сделано: <первые 2 пункта>
Решения: <если были — 1 ключевое>
❓ Открытые вопросы (<всего N>)
1. <q1>
2. <q2>
3. <q3>
<если больше — «...ещё (N-3)»>
🐛 Известные баги (если есть)
• <bug1>
📌 Точка возврата (из handoff.md / последней сессии)
Следующий шаг: <один конкретный>
Висит: <неотправленный промпт прошлой сессии / недоделанное / WIP — если есть; иначе пропусти строку>
💡 Что брать следующим
<синтезируй из: GSD next phase ИЛИ первый open question ИЛИ последний "Следующий шаг" из сессии>
Аргумент: <почему именно это>
⚙️ Команды
/mm prompt "..." — собрать промпт для PowerShell-Клода (если ты сейчас в claude.ai)
/gsd-execute-phase N — выполнить текущую GSD-фазу (если применимо)
/mm save — закрыть сессию когда закончишь
/mm next — обновить handoff.md перед новым чатом claude.ai
Шаг 4. После сводки — жди
Не предлагай делать что-то конкретное автоматически. Юзер прочёл, решил, скажет.
Особые режимы
Если включена опция --quick (или юзер пишет «коротко»)
Выдай только:
<name> · <branch> · <N> uncommitted · последняя сессия <date>
Сейчас: <одна строка>
Дальше: <одна строка>
3 строки максимум. Для случая «я просто проверить вспомнить».
Если включена --verbose (или «подробно»)
Дополни:
- Полный список open questions (без обрезки)
- Полное «Сделано» из последней сессии (не первые 2)
- Список последних 3 сессий с темами
- Список фаз GSD с галочками
Edge cases
- Несколько проектов в моно-репо: в Discovery возьми проект ближе к cwd. Если cwd на корне — спроси какой.
- Свежий
/mm new, ещё нет сессий: пропусти секцию «Последняя сессия», в «Что брать следующим» предложи «заполнить секцию 8 паспорта». - GSD без активной фазы (между milestone'ами): «GSD: между фазами, последняя завершена N дней назад. /gsd-new-milestone?»
- Нет git вообще (просто папка с файлами): пропусти git-секцию.
- passport.md очень старый (
updated:> 60 дней назад): добавь предупреждение «Паспорт давно не обновлялся, может быть неточен. /mm new для refresh». - Уже Memory у Anthropic накопилась: не дублируй её. mm-resume — про актуальное (что сейчас, что вчера). Memory — про долгосрочное (как ты любишь работать).
Что НЕ делать
- Не запрашивать данные из чата если их можно прочитать из файлов.
- Не выводить полные тексты файлов — только выжимки.
- Не делать
git pull/git fetchбез явного запроса. - Не запускать сам
/gsd-progressкак отдельную команду — логика встроена сюда. - Не предлагать действие если не уверен что нужно — лучше промолчать чем советовать наугад.
- Не дублируй чек
/mm-doctor— для смок-теста достаточно одной junction-проверки.
skills/mm-setup/SKILL.md
npx skills add mworldorg/markdown-memory --skill mm-setup -g -y
SKILL.md
Frontmatter
{
"name": "mm-setup",
"version": "0.1.0",
"description": "Онбординг\/персонализация mm-системы под конкретного пользователя — спрашивает имя, чем занимается, стек, язык, путь к Obsidian vault, и записывает это в личный gitignored-оверлей config\/mm-config.local.json + генерирует персональную копию claude.ai-скилла mm-web-bridge. Use when user says \"\/mm setup\", \"\/mm onboard\", \"настрой под меня\", \"персонализируй\", \"первичная настройка\", \"сделай систему моей\", \"это не моё имя в скилле\", \"поменяй данные под меня\". Запускать ОДИН раз после клонирования репо на новой машине."
}
mm-setup — Персонализация mm-системы под пользователя
Делает систему «своей»: имя, домен, стек, пути — без правки committed-файлов (репо общий, расшарен на GitHub). Личное идёт в gitignored оверлей и в генерируемую персональную копию claude.ai-скилла.
Контракт безопасности (соблюдай дословно)
Skill ПИШЕТ только в:
<repo>/config/mm-config.local.json— создаёт или мёрджит (gitignored, личный оверлей)<repo>/claude-ai-skills/_generated/mm-web-bridge/SKILL.md— персональная копия для загрузки в claude.ai (gitignored)
Skill НИКОГДА не трогает:
config/mm-config.json(committed — общие дефолты louise; их не перезаписываем)claude-ai-skills/mm-web-bridge/SKILL.md(committed шаблон — читаем как источник, не правим)- любые
skills/*/SKILL.md,~/.claude/CLAUDE.md(для глобального — только предложим сниппет) - git-операции
Конфиг
Загрузи mm-config.json по алгоритму из <repo>/docs/CONFIG-LOADING.md (нужен _repo_root). Если уже есть mm-config.local.json — прочитай его как текущие значения (режим повторной настройки).
Шаг 1. Интервью
Задай одним сообщением (не по одному вопросу), с разумными дефолтами в скобках:
Настрою mm-систему под тебя. Ответь (можно коротко):
1. Имя — как тебя называть? <текущее из config, если есть>
2. Чем занимаешься / домен? (например: «Telegram-боты», «веб на React», «data-инженерия»)
3. Основной стек? (язык · фреймворк · БД · деплой — например «Python · aiogram 3.x · SQLite · Railway»)
4. Язык общения по умолчанию? (ru / en) <текущий default_language>
5. Путь к Obsidian vault? <текущий obsidian_vault, или предложи C:\Users\<user>\Documents\Obsidian Vault>
Дополнительно (не спрашивай, выведи сам):
<user>для дефолтных путей возьми из$env:USERPROFILE/~.- Если на п.5 дают только vault — остальные obsidian-пути (
Claude/,Bridge/,Sessions/,Projects/,INDEX.md) выведи относительно него по той же структуре, что в committedmm-config.json. - Если пользователь говорит «как у тебя в дефолте / пропусти» — оставь committed-значение (не дублируй его в local без нужды).
Шаг 2. Покажи план (preview перед записью)
📋 Запишу в config/mm-config.local.json (личный, gitignored):
user.name = <name>
user.domain = <domain>
user.stack = <stack>
default_language = <lang>
paths.obsidian_* = <выведенные из vault пути>
📋 Сгенерирую claude.ai-скилл:
claude-ai-skills/_generated/mm-web-bridge/SKILL.md
(персональная копия — louise/Telegram заменены на <name>/<domain>/<stack>)
Committed-файлы НЕ трогаю. Продолжить? (y / n / правки)
Без y — ничего не пишется.
Шаг 3. Запиши mm-config.local.json
Сформируй/обнови <repo>/config/mm-config.local.json. Только изменённые относительно дефолта ключи (deep-merge поверх committed). Минимум:
{
"default_language": "<lang>",
"user": {
"name": "<name>",
"domain": "<domain>",
"stack": "<stack>"
},
"paths": {
"obsidian_vault": "<...>",
"obsidian_claude_root": "<...>\\Claude",
"obsidian_bridge": "<...>\\Claude\\Bridge",
"obsidian_bridge_archive": "<...>\\Claude\\Bridge\\archive",
"obsidian_sessions": "<...>\\Claude\\Sessions",
"obsidian_projects": "<...>\\Claude\\Projects",
"obsidian_index": "<...>\\Claude\\INDEX.md"
}
}
Если файл уже есть — мёрджи, не затирай чужие ключи. Пути — в формате текущей ОС (Windows — \\).
Шаг 4. Сгенерируй персональный mm-web-bridge
- Прочитай committed-шаблон
<repo>/claude-ai-skills/mm-web-bridge/SKILL.md. - Сделай персональную копию, заменив louise-специфику на данные пользователя:
- имя «louise» →
<name>(везде); - строку про стек/домен (абзац «louise работает на русском. Её типичный стек: …») → под
<domain>и<stack>пользователя; - в Принципе 1 (веб-проверка) примеры «Telegram Bot API / aiogram» → под технологии из
<stack>пользователя (если стек неизвестен/общий — оставь обобщённо «внешние API/библиотеки/фреймворки» без конкретики, но сам принцип сохрани — он универсален); - язык изложения — под
<lang>(если en — можно перевести ключевые формулировки; если ru — оставь как есть). descriptionво frontmatter — тоже под пользователя (имя + домен + что следить за актуальностью именно его стека).
- имя «louise» →
- Сохрани в
<repo>/claude-ai-skills/_generated/mm-web-bridge/SKILL.md. - Не меняй смысл и структуру скилла (три принципа, режимы A/B/C, GSD, конвенция «вариант N») — только идентичность/домен/стек.
Шаг 5. Финальный отчёт + следующие шаги
✅ mm-system персонализирована под <name>
Записано:
✓ config/mm-config.local.json (личный оверлей)
✓ claude-ai-skills/_generated/mm-web-bridge/SKILL.md (для claude.ai)
Дальше:
1. Загрузи claude.ai-скилл: заархивь _generated/mm-web-bridge/ → claude.ai → Customize → Skills → Upload a skill
(или Write skill instructions и вставь содержимое SKILL.md)
2. Прогони npx markdown-memory (или python3 scripts/register-skills.py) — регистрация скиллов mm-* в ~/.claude/skills/
3. /mm check — проверь, что vault и пути на месте
4. /mm new — оформи первый проект
Хочешь — выведу сниппет для ~/.claude/CLAUDE.md (глобальные правила под тебя)? Сам файл не трогаю (он вне репо).
Если пользователь просит сниппет CLAUDE.md — выведи готовый текст (имя, что mm подключён, ссылку на /mm), но вставляет он сам.
Edge cases
- Повторный запуск (local уже есть): покажи текущие значения, спроси что менять, мёрджи.
- Vault по указанному пути не существует: предупреди, предложи создать папки (это безопасно) или поправить путь.
- Пользователь = louise / её данные: всё равно отработай — просто значения совпадут с committed-дефолтами (local будет минимальным).
- Нет committed mm-web-bridge (репо неполный): пропусти шаг 4 с предупреждением, config всё равно запиши.
- Не Windows (если когда-нибудь): пути в формате текущей ОС,
~вместоC:\Users\<user>.
Что НЕ делать
- Не писать личные данные в committed
mm-config.jsonили committedmm-web-bridge/SKILL.md— только в local/_generated. - Не делать git add/commit.
- Не править
~/.claude/CLAUDE.mdнапрямую — только предложить сниппет. - Не пропускать preview (шаг 2).


