Agent Skills › mworldorg/markdown-memory

mworldorg/markdown-memory

GitHub

作为louise的AI伙伴,在claude.ai中探讨创意并质疑方案。严格联网核查aiogram等库的最新API以避坑。输出无需上下文、可直接复制给PowerShell版Claude Code执行的完整自包含Prompt,确保任务端到端闭环。

13 skills 23

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)

作为louise的AI伙伴,在claude.ai中探讨创意并质疑方案。严格联网核查aiogram等库的最新API以避坑。输出无需上下文、可直接复制给PowerShell版Claude Code执行的完整自包含Prompt,确保任务端到端闭环。
讨论新功能或项目想法 请求生成用于Claude Code的Prompt 规划任务流程 整理聊天摘要
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 кидает расплывчатую идею — не бросайся писать промпт. Сначала:

  1. Задай 2–4 уточняющих вопроса: цель, целевой проект (новый/существующий), ограничения, что считать готовым.
  2. Примени принцип 2 — проверь идею на прочность, назови риски/альтернативы.
  3. Если решение зависит от внешней технологии — примени принцип 1 (сверься с сетью) до того, как предлагать «как делать».
  4. Если идея созрела — переходи в режим B.
  5. Если идея большая (несколько дней) — предложи разбить на этапы; для проектов с 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 пишет «продолжаем» / «на чём остановились?» / «вернулся» — НЕ вываливай готовый промпт сразу. Сначала верни её в контекст:

  1. Сориентируй по структуре плана проекта, а не плоским списком коммитов: если проект на GSD — где мы по фазам (фаза X из Y, статус текущей); если ведётся чек-листом / открытыми вопросами — где по нему стоим.
  2. Вытащи «Точку возврата» из handoff.md и всё висящее: следующий конкретный шаг, недоделанное, недокоммиченный WIP, и готовый, но неотправленный промпт прошлой сессии (если был — покажи, что он есть).
  3. Дай маршрут вперёд — 2-3 шага с обоснованием порядка (почему именно так).
  4. Закончи ОДНИМ следующим шагом и предложи выбор: свериться через /mm resume в Claude Code или собрать промпт здесь.
  5. Готовый промпт сам не вываливай, пока louise не попросит — сначала ориентир, промпт по запросу.

Проверка после прерывания

louise сигналит о прерывании или неопределённости — «пк выключился», «не знаю, прошло ли», «прервались», «что реально закоммичено» — сначала выясни реальное состояние по git, и только потом ориентируй. Не опирайся на handoff/dashboard/«Точку возврата» и НЕ советуй /mm resume, пока факт не известен.

  1. Собери READ-ONLY промпт на ground truth — пусть CC сам прогонит и доложит (никаких ручных петель через louise):
    • git fetch origin <ветка>
    • git log --oneline -5
    • git status
    • git rev-list --left-right --count HEAD...origin/<ветка> — ahead/behind
    • просмотр затронутых файлов на целостность (не оборван ли WIP после краша).
  2. Ничего не коммить / не пушь / не правь на этом шаге — только сверка и отчёт.
  3. По факту назови состояние: коммит не прошёл (дерево грязное) · закоммичено, но не запушено (HEAD впереди origin) · всё прошло (дерево чисто, HEAD == origin).
  4. /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 про установку команд.

Каноничная стартовая последовательность:

  1. Прожуй идею в Режиме A (вопросы, риски, сверка с сетью).
  2. В финале выдай промпт /mm new (mm-init-project) для PowerShell-Клода — он создаст passport.md и структуру проекта в Obsidian vault.
  3. CC коммитит и пушит passport.md и handoff.md нового проекта в его vault-репозиторий (<slug>-vault); затем louise в claude.ai → Project → Files жмёт Sync now на карточке этого коннектора, чтобы Knowledge подтянул файлы. Ручной перезаливки или удаления файлов нет.
  4. Первая реплика в новом чате: «Read handoff.md and passport.md, tell me where we are and suggest the next step.»
mm-doctor用于全面检查mm系统健康状态,涵盖配置、仓库完整性、符号链接、Obsidian库及桥接状态。支持自动修复常见问题,适用于系统异常或新环境初始化时的诊断与维护。
用户说“проверь систему” 用户询问“почему не работает” 输入命令“/mm-doctor” 输入命令“mm-status” 用户表示“что-то сломалось” 输入命令“проверь mm” 输入命令“mm health”
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.md
    • 00-home/текущие приоритеты.md
    • 00-home/project-instructions.md
    • handoff.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>, чтобы пользователь мог копировать их в один тап.
  • ✅ Диалоги подтверждения:
    • Изучи 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.json SessionStart/PreToolUse/PostToolUse. Уже проверено в этих секциях выше.

  • Telegram bridge (claude-code-telegram, опционально):

    • Если в mm-config.local.json tg_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 = false or нет — пропусти. Это опциональная фича.

Финальный отчёт

🩺 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_ROOT env 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 в новой локации.

Что НЕ делать

  • Не молчать при ошибках — всегда показывай конкретную команду фикса.
  • Не «чинить» вещи без подтверждения юзера.
  • Не отчитываться победно если есть ⚠️/❌ — отчёт должен быть честным.
在GSD项目手动/clear后,重新加载当前阶段的核心工作文件(STATE/CONTEXT/PLAN/SUMMARY),而非生成摘要。用于恢复上下文以继续工作,仅读取不写入,不适用于非GSD项目。
/mm-focus /mm focus перечитай этап перечитай файлы этапа после clear scoped reload загрузи текущий этап вернуть контекст этапа после /clear
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.md frontmatter (если есть) ИЛИ 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.jsonGSD Core
    • иначе → GSD v1
  • <project_root>/.gsd/ существует → GSD v2
  • Оба → возьми gsd_version из passport frontmatter; если нет — спроси.
  • Ничего нет → остановись с подсказкой /mm resume (см. Шаг 1).

Шаг 3. Определи текущую фазу и ЭТАП

GSD v1 / Core (.planning/):

  1. Прочитай .planning/STATE.md — оттуда текущий milestone и position (номер/имя текущей фазы).
  2. Найди папку текущей фазы .planning/phases/<NN-current>/.
  3. Определи ЭТАП по статусу фазы в STATE.md (draft/discussed/planned/in-progress/verified/complete) И по наличию артефактов — артефакты приоритетнее, если расходятся:
    • нет CONTEXT.mdDiscuss
    • есть CONTEXT.md, нет PLAN.mdPlan
    • есть PLAN.md, нет SUMMARY.mdExecute
    • есть SUMMARY.md ИЛИ статус verified/completeVerify

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.
为claude.ai生成Project Instructions文本。支持基于passport.md的项目定制模式及通用模式,自动替换项目名、用户信息及GSD配置块,结果保存至Obsidian以便复制粘贴。
сделай инструкции для проекта обнови project instructions /mm-instructions перегенери инструкции что вставить в Project Instructions
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_projects
  • paths.obsidian_bridge (универсальная версия идёт сюда)
  • default_language
  • _repo_root (для шаблона templates/project-instructions.md)

Режимы

A. Для конкретного проекта

Запуск из папки с passport.md. Скилл:

  1. Читает passport.md → берёт project из frontmatter, тип, стек, gsd_version из frontmatter, секцию 8 «Контекст для промптов», секцию 9 (текущий milestone/phase, если GSD).
  2. Берёт шаблон <skills_repo>/templates/project-instructions.md.
  3. Подставляет:
    • <PROJECT_NAME> → имя проекта.
    • GSD-блок (между GSD-BLOCK-START/GSD-BLOCK-END): если gsd_version != none — заполняет <GSD_VERSION> и <GSD_CURRENT_PHASE>; иначе удаляет блок целиком.
    • В конец добавляет секцию «Особенности этого проекта» с топ-3 строками из секции 8 паспорта (как напоминание Клоду в каждом промпте).
  4. Сохраняет в <obsidian_projects>/<project>/project-instructions.md (перезапись).

B. Универсальная версия

Запуск без passport.md или с флагом «универсальная» / «общая». Скилл:

  1. Берёт шаблон as-is.
  2. <PROJECT_NAME> заменяет на <универсальный — определяется в чате>; <USER_NAME> — на config.user.name.
  3. Удаляет секцию «Особенности этого проекта» и GSD-блок (универсальной комнате конкретный GSD неизвестен).
  4. Сохраняет в <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 всё равно ужмёт восприятие.
  • Не выдумывай правила «от себя» — только то, что в шаблоне или явно в паспорте.
Команда для быстрого обзора всех mm-проектов: статус, тип, фаза GSD, активность и вопросы. Читает только Obsidian, без записи. Поддерживает флаг --git для проверки кода.
/mm projects /mm list покажи все проекты что у меня по проектам обзор проектов какие проекты есть список проектов
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_projects
  • paths.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.md frontmatter: status, type, gsd_version, updated, mm_version.
  • passport.md секция 8: есть ли маркер <!-- TODO louise: заполни секцию 8 --> (не заполнена).
  • passport.md секция 9 (если GSD): Текущий milestone / phase.
  • passport.md секция 10: посчитай чекбоксы - [ ] в «Открытые вопросы».
  • dashboard.md frontmatter updated: + секция «Сейчас» (первая непустая строка).
  • handoff.md frontmatter generated: (для оценки свежести).
  • 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> = человекочитаемо: сегодня / / 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 пусто — пиши .
用于结束 Claude Code 会话,自动收集上下文、Git 状态及断点信息,生成带元数据的 Obsidian 会话日志,更新项目笔记和索引,并触发 handoff 流程以保存技术状态。
用户说"закругляемся" 用户说"сохрани" 用户说"до завтра" 用户说"конец дня" 用户说"save session" 用户输入"/mm-save-session" 用户说"закрываемся"
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_sessions
  • paths.obsidian_projects
  • paths.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 фиксируй три вещи (команда остаётся одна — никаких отдельных режимов сохранения):

  1. Следующий конкретный шаг — одно действие, с которого продолжить. Бери из «Открытых вопросов / следующих шагов» этой сессии. Если из разговора он неочевиден — спроси louise одной строкой: С чего продолжить в следующий раз? (одна строка).
  2. Недокоммиченный WIP — из git status --short (уже собран в Шаге 1). Перечисли файлы или нет, дерево чисто.
  3. Готовый, но неотправленный промпт — если в этой сессии был собран промпт для PowerShell-Клода / claude.ai, который так и не выполнили, — запиши его текст целиком. Иначе нет.

Это пойдёт в секцию «Точка возврата» файла сессии (Шаг 3) и оттуда — в handoff.md (Шаг 5.6 через /mm-handoff).

Шаг 2. Определи целевые пути

  • Имя проекта: из passport.md (если в cwd или его родителях есть) → frontmatter project. Иначе — имя папки 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):

  1. Класс A — маскируй молча, типизированным плейсхолдером с сохранением контекста (TELEGRAM_TOKEN=<REDACTED:telegram-token> и т.п. — см. doc). Не вырезай строку.
  2. Класс B (широкое [A-Za-z0-9_\-]{32,}) — НЕ маскируй (задевает git SHA-40 / UUID, которых полно в сессиях). Только добавь одну строку-warn в финальный отчёт.
  3. Покажи preview перед записью: если что-то замаскировано или есть warn — выведи одну сводную строку (🔒 Замаскировано N (telegram-token×1, …); ⚠️ K warn) и сами места (по 1 строке). Если находок нет — короткое 🔒 секретов не найдено, без шума.
  4. В Шагах 3 (запись файла сессии), 4 (project note), 5 (INDEX) используй уже очищенный текст — выжимки наследуют scrub, повторно не маскируй.

Шаг 4. Обнови файлы 00-home/

Путь хранилища: <vault_root> (определяй по единому алгоритму: (1) из секции ## Obsidian Knowledge Vault в CLAUDE.md со строкой Хранилище знаний: <путь>, если она есть; (2) локальная папка .vault/ в корне проекта; (3) глобальная папка проекта <obsidian_projects>/<name>/ из конфига).

  1. Обнови <vault_root>/00-home/текущие приоритеты.md:

    • Перепиши файл, указав текущий milestone/phase и актуальный список задач (WIP и следующие шаги, определенные на Шаге 1.5).
  2. Создай новые заметки в 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.
  3. Регенерируй <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. Алгоритм:

  1. Проверь <project_root>/.planning/ (GSD v1 / core) или <project_root>/.gsd/ (v2).
  2. Если ни одного — пропусти этот шаг.
  3. Если есть — спроси одной строкой: Также вызвать /gsd-pause-work для technical handoff (HANDOFF.json)? (y/n, дефолт y).
  4. На y:
    • GSD v1 / Core: вызови skill /gsd-pause-work (в Claude Code/Antigravity; не пиши .planning/HANDOFF.json сам — там охраняющий хук).
    • GSD v2: предложи юзеру выполнить в терминале gsd handoff (skill этот не запускает CLI).
  5. На n — продолжай без GSD-handoff, упомяни в финальном отчёте: «GSD handoff пропущен по запросу».
  6. Если /gsd-pause-work вернул ошибку — не падай, упомяни в отчёте: «GSD pause-work failed: », продолжай.

Шаг 5.6. Обнови handoff.md (для claude.ai Project Knowledge)

Цель: handoff.md должен оставаться свежим после каждого закрытия сессии, без ручного /mm next.

Алгоритм:

  1. Делегируй генерацию в /mm-handoff (он — единственный владелец формата handoff; не дублируй его логику здесь). Вызови skill mm-handoff — он прочитает только что записанную сессию + последние 3-5 + git + (если есть) GSD и перезапишет <vault_root>/handoff.md.
  2. Это поведение по умолчанию включено (пользователь явно его просил) — не спрашивай y/n.
  3. Если <vault_root>/handoff.md ещё скелет (после /mm-init-project) — /mm-handoff просто заменит его полноценной версией. Это нормально.
  4. Если /mm-handoff упал (нет паспорта, vault недоступен) — не падай, упомяни в финальном отчёте: «handoff обновить не удалось: », сессия всё равно сохранена.

Шаг 5.7. Автопуш в Vault-репозиторий (если настроен)

Если папка памяти проекта <vault_root> является git-репозиторием и в ней настроен remote origin (т.е. vault уже инициализирован через /mm vault):

  1. Прогони 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 («средний путь»):

      1. Hard-stop: НЕ выполняй git add/commit/push для vault, пока секрет не обработан.
      2. Покажи находку: какой паттерн (id, класс) и в каком файле / где именно — достаточно, чтобы пользователь нашёл место. Сырое значение в отчёт не дублируй без нужды (секрет и так в файле).
      3. Предложи маскировку: заменить совпавшее значение на <REDACTED:<id>>. Спроси да/нет.
      4. Маскируй ТОЛЬКО после явного «да»: найди совпавший по паттерну фрагмент (паттерн возьми из config/secret-patterns.json по id) и замени его на маркер. Больше в заметке ничего не меняй.
      5. Пере-сканируй (тем же механизмом). Если чисто (hasSecretA=false) → переходи к п.2 (commit/push). Если ещё есть Класс A → повтори шаги 2–4 для оставшихся находок.
      6. Отказ или нет интерактивного подтверждения (пользователь сказал «нет» ИЛИ headless/автономный прогон без возможности спросить) → НЕ пушь vault и НЕ правь заметку. Сообщи, что vault НЕ синхронизирован из-за необработанного секрета (Класс A), и что делать: убрать секрет из заметки вручную → повторить /mm save. Локальные Obsidian-заметки при этом уже записаны как обычно (Шаги 3–5).

      Governing-принцип: система НИКОГДА не переписывает заметку автономно — маскировка допустима ТОЛЬКО как явно подтверждённое пользователем действие.

    • Реакция на Класс B (warn-only, без изменений): Предупреждения Класса B служат только для информирования, НИКОГДА не редактируй содержимое файлов памяти проекта ради сканера (скилл не переписывает текст заметок).

  2. Если сканирование чистое:
    • Выполни 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 не обновится, запушь вручную. и укажи причину сбоя.
  3. Если <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 только ссылка + одна строка.
通过git pull从远程仓库更新mm系统并重新注册技能。适用于用户要求更新mm或检查版本时,自动检测分支差异、展示变更日志并在确认后进行安全更新。
обнови mm обнови систему /mm update update mm подтяни свежий mm проверь обновления mm
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 (читай файл напрямую).
  • Удалённая версия:
    git show origin/main:config/mm-config.json
    
    распарси JSON, возьми version.

Это поле — единый источник версии системы (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, при ygit 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 не репо mmgit fetch не найдёт origin/упадёт; сообщи, что запускать надо из корня репо mm или задать MM_REPO_ROOT.
  • Detached HEADHEAD...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.
为Obsidian项目创建私有Git仓库并同步至GitHub,以连接claude.ai知识库。流程包括定位项目、扫描敏感信息(遇高危则暂停)、生成.gitignore及初始化Git,需用户确认后方可执行。
создай vault синхронизация памяти memory sync /mm vault /mm-vault
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_projects
  • paths.obsidian_vault

Процесс

Шаг 1. Определи проект и папку памяти (Vault Root)

  1. Определи проект по passport.md в текущей cwd или её родительских директориях.
    • Извлеки имя проекта из YAML frontmatter project: (или из поля "Имя" таблицы Идентификация).
    • Если passport.md не найден, выведи предупреждение и спроси имя проекта или предложи запустить /mm new сначала.
  2. Определи slug проекта (в нижнем регистре, с заменой пробелов на дефисы). Для markdown-memory slug равен markdown-memory.
  3. Определи путь базы знаний <vault_root> по единому алгоритму резолва:
    • (1) из секции ## Obsidian Knowledge Vault в CLAUDE.md со строкой Хранилище знаний: <путь>, если она есть;
    • (2) локальная папка .vault/ в корне проекта;
    • (3) глобальная папка проекта <obsidian_projects>/<slug>/ из конфига.
  4. Выведи пользователю подтвержденный путь папки памяти.

Шаг 2. Покажи состав папки и прогони Secret-Scan

  1. Сделай рекурсивный обход папки <vault_root> и покажи дерево файлов, которые попадут в репозиторий.
  2. Прогони все файлы папки через паттерны из канона <repo>/config/secret-patterns.json (пояснение — <repo>/docs/SECRET-PATTERNS.md).
    • Класс A (Высокоточные секреты):
      • Если найден хотя бы один реальный секрет, останови выполнение (hard-stop).
      • Покажи пользователю найденную строку и файл.
      • Жди явного исправления/подтверждения перед созданием репозитория. Не продолжай автоматически. Блокирует только реальный секрет (когда человек сам убирает реальный секрет).
    • Класс B (Широкие совпадения / предупреждения):
      • Выведи предупреждения в формате: ⚠️ возможный секрет/длинная строка в <файл>, строка N: <первые 12 симв.>… — проверь вручную (не замаскировано).
      • Важно: Класс B служит только для предупреждения пользователя. НИКОГДА не редактируй содержимое файлов памяти проекта ради сканера. Скилл никогда не переписывает текст заметок.
  3. Жди подтверждения (y/n) от пользователя для создания репозитория и первого пуша.

Шаг 3. Создай или обнови .gitignore

В папке <vault_root> создай или обнови файл .gitignore со следующим содержимым:

.obsidian/
.trash/
Thumbs.db
.DS_Store
*.tmp
*.log

Шаг 4. Инициализация репозитория (Идемпотентно)

  1. Проверь, инициализирован ли уже Git в <vault_root> (наличие папки .git).
  2. Если Git не инициализирован:
    • Выполни git init в <vault_root>.
    • Настрой ветку по умолчанию (например, git checkout -b main или git branch -M main).
  3. Добавь файлы в индекс и сделай коммит:
    • git add -A
    • git commit -m "init: <slug> vault (passport, handoff, dashboard, sessions)"

Шаг 5. Создание приватного репозитория на GitHub

  1. Проверь, настроен ли уже remote origin (git remote -v).
  2. Если remote origin уже настроен:
    • Выведи: GitHub remote origin уже настроен: <remote_url>
    • Выполни пуш: git push -u origin main
  3. Если remote origin не настроен:
    • Создай приватный репозиторий на GitHub под владельцем (по умолчанию mworldorg или по умолчанию из gh CLI): gh repo create mworldorg/<slug>-vault --private --description "Memory vault for <slug> project" --source . --push
    • Если команда завершилась успешно, переходи к Шагу 6.
    • Если произошел сбой создания через CLI, предложи пользователю создать репозиторий вручную, добавить remote и сделать пуш.

Шаг 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.
mm系统调度器,提供简短命令别名以执行项目初始化、会话管理、上下文恢复及系统检查等任务。支持自然语言触发和模糊匹配,无参数时显示功能速查表。
用户输入 /mm 或相关变体 询问 mm 命令列表或帮助
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, как если бы юзер написал его полное имя. То есть:

  1. Скажи одной строкой: → /mm new = /mm-init-project, начинаю.
  2. Действуй как 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 — только маршрутизация.
生成 handoff.md 紧凑摘要,用于在 claude.ai 上下文满时切换新聊天。包含会话指南、近期状态及开放问题,补充 Anthropic Memory,支持自动或手动触发。
用户表示上下文已满 请求创建新聊天 输入 /mm-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_projects
  • paths.obsidian_sessions
  • paths.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).

  1. Индекс-слой (дёшево, основной источник для «Что сделано за период»):

    • Прочитай <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>.
    • «Что сделано за период» собирай из этих однострочников, БЕЗ открытия тел.
  2. Тело sessions/<id>.md (или по пути из ссылки) открывай ЛЕНИВО — точечно по ID, не все подряд — только когда:

    • это топ-1 самая свежая сессия (нужны её «Ключевые решения» и «Открытые вопросы» дословно — см. п.3), ИЛИ
    • однострочника индекса недостаточно для внятного пункта (пустой / обрезанный / сессии нет в индексе), ИЛИ
    • пользователь явно просит детали по конкретному ID/теме.
  3. «Ключевые решения» и «Открытые вопросы» — ВСЕГДА полностью, не прятать в индекс:

    • Источник: тело топ-1 свежей сессии (её читаем всегда) + <vault_root>/00-home/текущие приоритеты.md + passport §10.
    • Если важное решение/вопрос виден в однострочнике более старой сессии — открой её тело, чтобы не потерять. Детали не теряем — только откладываем чтение; тело остаётся каноном и подтягивается по ID/[[ссылке]].
  4. No-op на мелких/молодых проектах: если сессий < 3 ИЛИ однострочники по сути равны телам (очень короткие сессии) — ленивость не даёт выигрыша, читай тела как раньше. Не усложняй там, где экономии нет.

  5. 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_insight MCP-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):

  1. Класс A (высокоточные) — маскируй молча, типизированным плейсхолдером с сохранением контекста (TELEGRAM_TOKEN=<REDACTED:telegram-token>, Bearer <REDACTED:jwt> и т.п. — см. doc). Не вырезай строку.
  2. Класс B (широкое [A-Za-z0-9_\-]{32,})НЕ маскируй (это задевает git SHA-40 / UUID, которых полно в сессиях). Только добавь одну строку-warn пользователю в финальный отчёт: «возможный секрет/длинная строка в <секция> — проверь вручную».
  3. Если хоть что-то из Класса A замаскировано — уведоми пользователя одной строкой: что и сколько (🔒 Замаскировано N секрет(ов) в handoff: telegram-token×1, jwt×1).
  4. Записывай в 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).
初始化或更新 mm-系统项目,生成 passport.md、CLAUDE.md 及 Obsidian 知识库。自动检测技术栈与 GSD 版本,导入需求。严格遵循安全契约,仅读取关键配置,写入前强制预览并获确认,确保不破坏现有文件。
оформи проект сделай паспорт init project /mm-init /mm-init-project обнови паспорт регистрирую проект
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.ai
    • handoff.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 как есть».

Алгоритм:

  1. Возьми cwd.
  2. Если в пути есть подстрока \.claude\worktrees\ или /.claude/worktrees/ — это worktree. Найди корневой репо:
    • Прочитай <cwd>/.git (это файл-указатель, не папка). Извлеки gitdir: <path>. Из него выведи main repo path.
    • Если не получилось — спроси: Это git worktree. Какую папку считать корнем проекта? <предложи: ...>.
  3. Иначе — поднимись от 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 — варианты case
  • PROJECT_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.yaml
  • Dockerfile, 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 → Astro
  • app/page.tsx → Next.js App Router
  • pages/*.tsx → Next.js Pages Router
  • wrangler.toml → Cloudflare Workers
  • serverless.yml → Serverless Framework
  • terraform/, *.tf → Terraform
  • helm/, 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

Приоритет определения типа (когда несколько матчей):

  1. tg-bot / discord-bot (если есть бот-фреймворк) — bot
  2. meta-framework (Next/Nuxt/Astro/Remix) — web
  3. python-web / node-web / go-web / rust-web — web
  4. spa-frontend без backend — web (frontend-only)
  5. ai-ml / ai-llm + entry point — script или service
  6. data / pipelines — script
  7. desktop — desktop
  8. lib (если в pyproject.toml [project] без entry point ИЛИ в package.json main без bin) — lib
  9. иначе — script

Версии:

  • Питон: из .python-version или pyproject.toml requires-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 frontmatter gsd_version: core.
    • Иначе → GSD v1. В passport frontmatter gsd_version: v1.
  • <project_root>/.gsd/ существует → GSD v2. В passport frontmatter gsd_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) → парсинг как у v1
  • AGENTS.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):

  1. Расположение Obsidian Vault (КРИТИЧНО): Спроси пользователя, где хранить базу знаний (Obsidian Vault):

    Выберите расположение Obsidian Vault для проекта:
    [1] Локально в папке проекта (рекомендуется: <project_root>/.vault/, версионируется в git, синхронизируется с claude.ai автоматически) — дефолт
    [2] Глобально в папке Obsidian (из конфига: <obsidian_projects>/<name>/)
    
  2. Если найден PROJECT_PASSPORT.md или другой кандидат миграции: Найден старый паспорт <file>. Мигрировать его контент в новый passport.md? (y = мигрировать, переименую старый в .legacy / n = игнорировать)

  3. Если есть passport.md И он явно устарел (mtime старше 30 дней или git log показывает много коммитов после updated): Просто переходи в режим update без вопроса.

  4. Если CLAUDE.md > 30 строк: CLAUDE.md существует и непустой (<N> строк). Добавить правила базы знаний в конец? (y/n)

  5. Если папка пустая (новый проект):

    • Тип: bot / web / lib / script?
    • Язык / фреймворк? (для bot — дефолт aiogram из bot_defaults)
    • Назначение в одном предложении?
  6. Если в выбранной директории Vault уже есть файлы: В директории базы знаний уже есть файлы. Update (y) / Создать папку с суффиксом -2 (n) / Отмена (c)?

  7. Если есть 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».

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 в памяти

Сгенерируй структуру и контент для файлов базы знаний:

  1. 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]].
  2. 00-home/текущие приоритеты.md: Содержит текущий milestone и приоритетные задачи, извлеченные из GSD или Discovery (на старте).
  3. 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]].
  4. handoff.md (в корне Vault): Скелет handoff (шаблон см. в Appendix). В режиме update не трогай, если файл уже существует.
  5. atlas/passport.md: Копия сгенерированного passport.md.
  6. atlas/архитектура проекта.md: Содержит описание архитектуры из секции 3 паспорта.
  7. atlas/база данных.md: Содержит модели данных из секции 6 паспорта.
  8. atlas/деплой.md: Содержит инструкции и команды деплоя из секции 5/2 паспорта.
  9. knowledge/integrations/telethon-sessions.md (только если telethon_project == true): скопируй содержимое из <skills_repo>/templates/telethon-sessions.md.
  10. 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. Запиши всё

В строгом порядке (с откатом при падении):

  1. Создай директорию Vault (<project_root>/.vault/ или глобальную) и все подпапки: 00-home/, atlas/, knowledge/integrations/, knowledge/decisions/, knowledge/debugging/, knowledge/patterns/, knowledge/business/, sessions/, inbox/.
  2. Запиши <project>/passport.md.
  3. Запиши файлы в 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)
  4. Если выбран локальный режим, открой <project>/.gitignore, и если в нём нет строки .vault/.obsidian/ — добавь в конец:
    # Local Obsidian UI state
    .vault/.obsidian/
    
  5. Если есть PROJECT_PASSPORT.md и пользователь подтвердил миграцию — переименуй в .legacy.
  6. Примени патч к CLAUDE.md.

При ошибке на шагах 1-6: удали созданные файлы и папки, верни переименованный паспорт.

4.5. Проверка инвариантов + secret-grep

После записи проверь:

  • passport.md содержит все 11 секций.
  • Frontmatter валидный (parse YAML).
  • В Obsidian нет файлов с похожими именами (passport.md vs passport_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/]]
- Код: `<абсолютный путь к проекту>`
恢复会话上下文。读取护照、仪表盘、最新会话及规划状态,生成项目当前进度摘要。适用于新会话启动或用户询问‘在哪’时快速对齐状态。
用户说“ну что у нас”、“напомни где мы остановились”、“вернулся”、“возобновляю” 输入命令 /mm resume、/mm start、/mm context 用户问“что у нас по проекту”、“где мы” 新 Claude Code 会话开始或执行 /clear 后
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_projects
  • paths.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.md frontmatter (если есть) ИЛИ 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/) — прочитай в этом порядке (приоритет ↓):

  1. .planning/STATE.md — главное. Из него: текущий milestone, position (phase/step), последние решения, blockers.
  2. .planning/HANDOFF.json (если существует) — самый свежий snapshot от /gsd-pause-work. Если его mtime > чем у последней mm-сессии — приоритет HANDOFF.
  3. .planning/ROADMAP.md — список фаз с [x]/[~]/[ ]. Покажи позицию: фаза X из Y, прогресс milestone'а.
  4. .planning/phases/<NN-current>/CONTEXT.md (если есть текущая фаза) — preferences и решения этой фазы. Это критично — покажет что мы решали в текущей фазе.
  5. .planning/phases/<NN-current>/PLAN.md — что планировали. Извлеки список задач, посчитай completed/pending.
  6. .planning/phases/<NN-current>/SUMMARY.md (если фаза завершена) — итог.
  7. .planning/threads/ (если есть) — активные темы для cross-session.

Если GSD v2 (.gsd/):

  1. .gsd/STATE.md (rendered dashboard от gsd CLI) — главное.
  2. .gsd/AGENTS.md — preferences для агентов (равно CONTEXT.md v1).
  3. .gsd/gsd.db (SQLite) — опционально, если есть sqlite3 в PATH. Используй абсолютный путь от <project_root>:
    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;"
    
    Парси вывод. Если sqlite3 недоступен — пропусти, сводка будет беднее но не сломается.

Это эквивалент /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-проверки.
用于个性化配置 mm 系统。收集用户信息并写入 gitignored 的本地配置文件,同时生成专属的 claude.ai 技能副本,确保不修改共享仓库文件。
/mm setup /mm onboard настрой под меня персонализируй первичная настройка сделай систему моей это не моё имя в скилле поменяй данные под меня
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) выведи относительно него по той же структуре, что в committed mm-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

  1. Прочитай committed-шаблон <repo>/claude-ai-skills/mm-web-bridge/SKILL.md.
  2. Сделай персональную копию, заменив louise-специфику на данные пользователя:
    • имя «louise» → <name> (везде);
    • строку про стек/домен (абзац «louise работает на русском. Её типичный стек: …») → под <domain> и <stack> пользователя;
    • в Принципе 1 (веб-проверка) примеры «Telegram Bot API / aiogram» → под технологии из <stack> пользователя (если стек неизвестен/общий — оставь обобщённо «внешние API/библиотеки/фреймворки» без конкретики, но сам принцип сохрани — он универсален);
    • язык изложения — под <lang> (если en — можно перевести ключевые формулировки; если ru — оставь как есть).
    • description во frontmatter — тоже под пользователя (имя + домен + что следить за актуальностью именно его стека).
  3. Сохрани в <repo>/claude-ai-skills/_generated/mm-web-bridge/SKILL.md.
  4. Не меняй смысл и структуру скилла (три принципа, режимы 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 или committed mm-web-bridge/SKILL.md — только в local/_generated.
  • Не делать git add/commit.
  • Не править ~/.claude/CLAUDE.md напрямую — только предложить сниппет.
  • Не пропускать preview (шаг 2).

Home - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-13 17:35
浙ICP备14020137号-1 $Map of visitor$