Install
$ agentstack add skill-mworldorg-markdown-memory-mm-save-session ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
mm-save-session — End-of-Session Logger
Оформляет финал Claude Code сессии в три места: Sessions/, Projects/, INDEX.md. Реализует правила из ~/.claude/CLAUDE.md как skill (раньше выполнялось вручную, теперь гарантированно).
Конфиг
Загрузи mm-config.json по алгоритму из /docs/CONFIG-LOADING.md. Поддержка mm-config.local.json overlay обязательна.
Понадобятся:
paths.obsidian_sessionspaths.obsidian_projectspaths.obsidian_index
Процесс
Шаг 1. Собери контекст сессии
Из текущего разговора:
- Что обсуждали (тема в 1-2 предложениях)
- Что было сделано (список фактов: что создано, изменено, исправлено)
- Какие решения приняты и почему
- Что осталось / открытые вопросы / следующие шаги
Из git (если репо):
git log --since="6 hours ago" --oneline
git status --short
git diff --stat HEAD~5 2>/dev/null || git diff --stat
Список изменённых файлов и коммитов сегодня.
Из cwd: имя проекта = имя корневой папки (или из passport.md если есть).
Шаг 1.5. Собери «Точку возврата»
Чтобы следующее возвращение было без раскачки, на КАЖДОМ save фиксируй три вещи (команда остаётся одна — никаких отдельных режимов сохранения):
- Следующий конкретный шаг — одно действие, с которого продолжить. Бери из «Открытых вопросов / следующих шагов» этой сессии. Если из разговора он неочевиден — спроси louise одной строкой:
С чего продолжить в следующий раз? (одна строка). - Недокоммиченный WIP — из
git status --short(уже собран в Шаге 1). Перечисли файлы илинет, дерево чисто. - Готовый, но неотправленный промпт — если в этой сессии был собран промпт для PowerShell-Клода / claude.ai, который так и не выполнили, — запиши его текст целиком. Иначе
нет.
Это пойдёт в секцию «Точка возврата» файла сессии (Шаг 3) и оттуда — в handoff.md (Шаг 5.6 через /mm-handoff).
Шаг 2. Определи целевые пути
- Имя проекта: из
passport.md(если в cwd или его родителях есть) → frontmatterproject. Иначе — имя папки cwd. - Файл сессии:
/-.md. Время — текущее, тему-slug сгенерируй из 3-5 слов на русском в kebab-case (транслит, нижний регистр). - Если файл уже существует — добавь суффикс
-2,-3.
Шаг 3. Создай файл сессии
---
created:
project:
project_path:
tags: [claude-session, проект-, ]
---
#
**Дата:**
**Проект:** [[../Projects/|]]
**Длительность:** примерно
## Задача сессии
## Что сделано
-
-
-
## Ключевые решения
- **** —
## Открытые вопросы / следующие шаги
- [ ]
- [ ]
## Точка возврата
- **Следующий конкретный шаг:**
- **Если прервались посреди:**
- Недоделано:
- Неотправленный промпт:
- Недокоммиченный WIP:
## Затронутые файлы
- `` —
- `` —
## Git
- Ветка: ``
- Коммитов сегодня:
- ` `
Шаг 3.5. Scrub секретов ПЕРЕД записью в vault (канон config/secret-patterns.json)
> Заметка сессии оседает в долговременном vault (и через Шаги 4–6 её выжимка попадает в project note / INDEX / handoff). Токен, случайно вставленный из кода или git-вывода в «Что сделано», утечёт. Поэтому собранный на Шаге 3 текст прогоняется через фильтр до записи.
Переиспользуй единый механизм (как mm-handoff Шаг 5.9) — не дублируй список паттернов здесь. Прогони весь собранный текст заметки через паттерны из канона /config/secret-patterns.json (пояснение — /docs/SECRET-PATTERNS.md):
- Класс A — маскируй молча, типизированным плейсхолдером с сохранением контекста (
TELEGRAM_TOKEN=и т.п. — см. doc). Не вырезай строку. - Класс B (широкое
[A-Za-z0-9_\-]{32,}) — НЕ маскируй (задевает git SHA-40 / UUID, которых полно в сессиях). Только добавь одну строку-warn в финальный отчёт. - Покажи preview перед записью: если что-то замаскировано или есть warn — выведи одну сводную строку (
🔒 Замаскировано N (telegram-token×1, …); ⚠️ K warn) и сами места (по 1 строке). Если находок нет — короткое🔒 секретов не найдено, без шума. - В Шагах 3 (запись файла сессии), 4 (project note), 5 (INDEX) используй уже очищенный текст — выжимки наследуют scrub, повторно не маскируй.
Шаг 4. Обнови файлы 00-home/
Путь хранилища: ` (определяй по единому алгоритму: (1) из секции ## Obsidian Knowledge Vault в CLAUDE.md со строкой Хранилище знаний: , если она есть; (2) локальная папка .vault/ в корне проекта; (3) глобальная папка проекта //` из конфига).
- Обнови
/00-home/текущие приоритеты.md:
- Перепиши файл, указав текущий milestone/phase и актуальный список задач (WIP и следующие шаги, определенные на Шаге 1.5).
- Создай новые заметки в
knowledge/(если применимо):
- Проанализируй сессию. Если были приняты ключевые решения, исправлены баги или зафиксированы паттерны:
- Решения: Создай файл в
/knowledge/decisions/. Имя файла должно быть утверждением, а не категорией (например,выбрали Supabase Auth вместо NextAuth потому что...md). Внутри напиши краткое обоснование (на русском), добавь frontmatter (tags: [decision],date:) и wiki-ссылку на сессию:[[sessions/|Лог сессии]]. - Баги: Создай файл в
/knowledge/debugging/. Имя файла должно быть утверждением (например,API возвращает 429 после 500 запросов решено экспоненциальным бэкоффом.md). Внутри напиши суть проблемы и решение, добавь frontmatter (tags: [bugfix],date) и wiki-ссылку на сессию. - Паттерны: Создай файл в
/knowledge/patterns/. Имя файла должно быть утверждением (например,все API роуты валидируются через Pydantic.md). Напиши описание паттерна и ссылку на сессию. - Все названия файлов должны оканчиваться на
.md.
- Регенерируй
/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 (глобальный)
Путь: ` (по дефолту /INDEX.md`). Добавь строку наверх списка сессий:
- · **** · [[Projects//sessions/|]] (если глобальный) или [[.vault/sessions/|]] (если локальный)
Если INDEX.md нет — создай со скелетом (аналогично старому mm).
Шаг 5.5. GSD-кооперация (если применимо)
Цель: mm и GSD не дублируются. mm пишет нарратив в Obsidian. GSD пишет technical state в HANDOFF.json. Алгоритм:
- Проверь
/.planning/(GSD v1 / core) или/.gsd/(v2). - Если ни одного — пропусти этот шаг.
- Если есть — спроси одной строкой:
Также вызвать /gsd-pause-work для technical handoff (HANDOFF.json)? (y/n, дефолт y). - На
y:
- GSD v1 / Core: вызови skill
/gsd-pause-work(в Claude Code/Antigravity; не пиши.planning/HANDOFF.jsonсам — там охраняющий хук). - GSD v2: предложи юзеру выполнить в терминале
gsd handoff(skill этот не запускает CLI).
- На
n— продолжай без GSD-handoff, упомяни в финальном отчёте: «GSD handoff пропущен по запросу». - Если
/gsd-pause-workвернул ошибку — не падай, упомяни в отчёте: «GSD pause-work failed: », продолжай.
Шаг 5.6. Обнови handoff.md (для claude.ai Project Knowledge)
Цель: handoff.md должен оставаться свежим после каждого закрытия сессии, без ручного /mm next.
Алгоритм:
- Делегируй генерацию в
/mm-handoff(он — единственный владелец формата handoff; не дублируй его логику здесь). Вызови skillmm-handoff— он прочитает только что записанную сессию + последние 3-5 + git + (если есть) GSD и перезапишет/handoff.md. - Это поведение по умолчанию включено (пользователь явно его просил) — не спрашивай y/n.
- Если
/handoff.mdещё скелет (после/mm-init-project) —/mm-handoffпросто заменит его полноценной версией. Это нормально. - Если
/mm-handoffупал (нет паспорта, vault недоступен) — не падай, упомяни в финальном отчёте: «handoff обновить не удалось: », сессия всё равно сохранена.
Шаг 5.7. Автопуш в Vault-репозиторий (если настроен)
Если папка памяти проекта ` является git-репозиторием и в ней настроен remote origin (т.е. vault уже инициализирован через /mm vault`):
- Прогони Secret-Scan по всем измененным/новым файлам перед добавлением в git (по логике Шага 3.5).
- Механизм обнаружения (приоритет — MCP): Если в сессии доступен MCP-инструмент
mm_secret_scan— собери текст файлов, идущих в пуш, и просканируй его через инструмент ({ text }→{ hasSecretA, findings: [{ id, class, count }], classBCount }). Результат findings и есть итог скана. - Fallback (инструмент недоступен): Если
mm_secret_scanне доступен (другой агент, не зарегистрирован, свежая сессия без подхвата stdio-сервера) — примени паттерны напрямую изconfig/secret-patterns.jsonк тому же тексту и сформируй результат в том же виде (hasSecretA,findings,classBCount). - Оба пути читают один источник —
config/secret-patterns.json(инструмент тоже читает его), поэтому результат идентичен; механизм лишь меняет, кто применяет паттерны. - Реакция на Класс A («средний путь»):
- Hard-stop: НЕ выполняй
git add/commit/pushдля vault, пока секрет не обработан. - Покажи находку: какой паттерн (
id, класс) и в каком файле / где именно — достаточно, чтобы пользователь нашёл место. Сырое значение в отчёт не дублируй без нужды (секрет и так в файле). - Предложи маскировку: заменить совпавшее значение на
>. Спроси да/нет. - Маскируй ТОЛЬКО после явного «да»: найди совпавший по паттерну фрагмент (паттерн возьми из
config/secret-patterns.jsonпоid) и замени его на маркер. Больше в заметке ничего не меняй. - Пере-сканируй (тем же механизмом). Если чисто (
hasSecretA=false) → переходи к п.2 (commit/push). Если ещё есть Класс A → повтори шаги 2–4 для оставшихся находок. - Отказ или нет интерактивного подтверждения (пользователь сказал «нет» ИЛИ headless/автономный прогон без возможности спросить) → НЕ пушь vault и НЕ правь заметку. Сообщи, что vault НЕ синхронизирован из-за необработанного секрета (Класс A), и что делать: убрать секрет из заметки вручную → повторить
/mm save. Локальные Obsidian-заметки при этом уже записаны как обычно (Шаги 3–5).
Governing-принцип: система НИКОГДА не переписывает заметку автономно — маскировка допустима ТОЛЬКО как явно подтверждённое пользователем действие.
- Реакция на Класс B (warn-only, без изменений): Предупреждения Класса B служат только для информирования, НИКОГДА не редактируй содержимое файлов памяти проекта ради сканера (скилл не переписывает текст заметок).
- Если сканирование чистое:
- Выполни
git add -Aв директории ``. - Выполни коммит:
git commit -m "auto-sync: save session " - Выполни пуш:
git push origin main - Обработка сбоев пуша: Если команда
git pushзавершилась с ошибкой (например, проблемы с сетью, авторизацией или non-fast-forward коммиты), не прерывай работу скилла (сессия локально сохранена). Выведи пользователю заметное предупреждение:⚠️ vault push не прошёл — Knowledge не обновится, запушь вручную.и укажи причину сбоя.
- Если `
не является репозиторием или в нем нет настроенного remote, пропусти push, но **выведи предупреждение** (не no-op):⚠️ Vault-синк пропущен: не git-репозиторий с origin. handoff.md НЕ запушен и не попадёт в Project Knowledge. Запусти /mm vault для этого проекта, затем повтори /mm save.(подставь реальный путь вместо`).
Шаг 6. Подтверди
Выведи (короткий блок, без воды):
✅ Сессия сохранена
Проект:
Директория Vault:
Файл сессии: sessions/
Созданы новые знания:
•
00-home/index.md и текущие приоритеты.md обновлены.
handoff.md обновлён: >
GSD handoff:
Vault sync: >
Открытых вопросов:
Следующий шаг:
Edge cases
- Очень короткая сессия (один вопрос-ответ, ничего не делалось): спроси
Сессия короткая, всё равно сохранять? (y/n). Если да — сохрани с пометкойкороткая консультация. - Несколько проектов в одной сессии (редко): спроси какой считать главным, остальные упомяни в тегах.
- Нет Obsidian vault по пути из конфига: останови, скажи
Vault не найден: . Проверь mm-config.json. - Сессия в worktree: имя проекта бери из основной папки репо, не из имени worktree (типа
crazy-galileo-...).
Что НЕ делать
- Не коммить ничего в git-репозиторий самого проекта (это работа
/pushили ручная). Автоматический коммит и пуш разрешены только для vault-репозитория памяти на Шаге 5.7. - Не делай длинные сессии-хроники — формат компактный, факты + решения + вопросы.
- Не тегируй случайно — теги только из реальных тем сессии.
- Не дублируй текст между Sessions/ и Projects/ — в Project note только ссылка + одна строка.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: mworldorg
- Source: mworldorg/markdown-memory
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.