$npx -y skills add mworldorg/markdown-memory --skill mm-projectsОбзор всех зарегистрированных mm-проектов одним экраном — статус, тип, GSD-фаза, последняя активность, число открытых вопросов. Use when user says "/mm projects", "/mm list", "покажи все проекты", "что у меня по проектам", "обзор проектов", "какие проекты есть", "список проектов"
| 1 | # mm-projects — Cross-Project Overview |
| 2 | |
| 3 | Отвечает на вопрос «что у меня вообще есть и где что в работе» — в отличие от `/mm-resume`, который про **один** проект. Команда независима от cwd: читает папку проектов в Obsidian, не код. |
| 4 | |
| 5 | **Только чтение.** Ничего не пишет. Git по проектам — только с флагом `--git` (иначе дорого при многих проектах). |
| 6 | |
| 7 | ## Конфиг |
| 8 | |
| 9 | Загрузи `mm-config.json` по алгоритму из `<repo>/docs/CONFIG-LOADING.md`. Поддержка `mm-config.local.json` overlay обязательна. |
| 10 | |
| 11 | Понадобятся: |
| 12 | - `paths.obsidian_projects` |
| 13 | - `paths.obsidian_sessions` (для legacy-проектов без папки) |
| 14 | |
| 15 | ## Процесс |
| 16 | |
| 17 | ### Шаг 1. Собери список проектов |
| 18 | |
| 19 | В `<obsidian_projects>/`: |
| 20 | - **Папки-проекты** (новый формат от `/mm-init-project`): каждая подпапка = проект. |
| 21 | - **Legacy плоские файлы** `<name>.md` в корне `<obsidian_projects>/` (старый формат) — тоже проект. |
| 22 | |
| 23 | Если папка проектов не существует → `Папка проектов не найдена: <path>. Запусти /mm-init-project хотя бы в одном проекте.` и стоп. |
| 24 | Если проектов 0 → `Зарегистрированных проектов пока нет. /mm new в любом проекте создаст первый.` |
| 25 | |
| 26 | ### Шаг 2. По каждому проекту прочитай дёшево (не углубляясь) |
| 27 | |
| 28 | Папка-проект `<obsidian_projects>/<name>/`: |
| 29 | - `passport.md` frontmatter: `status`, `type`, `gsd_version`, `updated`, `mm_version`. |
| 30 | - `passport.md` секция 8: есть ли маркер `<!-- TODO louise: заполни секцию 8 -->` (не заполнена). |
| 31 | - `passport.md` секция 9 (если GSD): `Текущий milestone / phase`. |
| 32 | - `passport.md` секция 10: посчитай чекбоксы `- [ ]` в «Открытые вопросы». |
| 33 | - `dashboard.md` frontmatter `updated:` + секция «Сейчас» (первая непустая строка). |
| 34 | - `handoff.md` frontmatter `generated:` (для оценки свежести). |
| 35 | - `sessions/` — дата самого свежего файла (по имени `YYYY-MM-DD...` или mtime). |
| 36 | |
| 37 | Legacy плоский `<name>.md`: вытащи что есть (секция «Текущее состояние», последняя сессия). Помечай в выводе как `(legacy)`. |
| 38 | |
| 39 | **Last activity** = максимум из: `dashboard.updated`, дата свежей сессии, `handoff.generated`, `passport.updated`. |
| 40 | |
| 41 | ### Шаг 3. (Опционально) git — только если флаг `--git` |
| 42 | |
| 43 | Если юзер передал `--git`: для каждого проекта, где из `passport.md` секции 1 «Путь к коду» извлекается существующий путь — выполни быстро: |
| 44 | ```bash |
| 45 | git -C "<code_path>" branch --show-current |
| 46 | git -C "<code_path>" status --short # посчитать строки = uncommitted |
| 47 | ``` |
| 48 | Без `--git` — пропусти, в выводе колонку git не показывай. |
| 49 | |
| 50 | ### Шаг 4. Вывод (одним экраном, отсортировано по last activity ↓) |
| 51 | |
| 52 | ``` |
| 53 | 📂 mm-проекты (<N>) |
| 54 | |
| 55 | <name> <type> <status> <gsd> <activity> Q:<n> |
| 56 | └ <одна строка из dashboard «Сейчас» или «—»> |
| 57 | ... |
| 58 | |
| 59 | ``` |
| 60 | Где: |
| 61 | - `<gsd>` = `—` если none, иначе `v1·<phase>` / `v2·<phase>` / `core·<phase>` (фаза из секции 9, кратко). |
| 62 | - `<activity>` = человекочитаемо: `сегодня` / `2д` / `3нед` / `2мес`. |
| 63 | - `Q:<n>` = число открытых вопросов. |
| 64 | - С флагом `--git` добавь хвост ` · <branch> (<k> wip)`. |
| 65 | |
| 66 | После таблицы — короткие сигналы (только непустые): |
| 67 | ``` |
| 68 | ⚠️ Залежались (>30 дней без активности): <names> |
| 69 | ⚠️ Паспорт без секции 8: <names> |
| 70 | ⚠️ GSD есть, но в CLAUDE.md нет директивы: запусти /mm check в <names> ← если знаешь (см. ниже) |
| 71 | 📌 Паспорт старше config.version (нужен /mm new update): <names> |
| 72 | ``` |
| 73 | Примечание: «GSD без директивы» точно проверяет `/mm-doctor`; здесь упоминай только если это дёшево определить (флага в Obsidian-копии нет — обычно просто не пиши эту строку). |
| 74 | |
| 75 | ### Шаг 5. Подсказка по навигации |
| 76 | |
| 77 | Одной строкой в конце: |
| 78 | ``` |
| 79 | Подробнее по проекту: /mm projects <name> (= /mm-resume для него) · обзор с git: /mm projects --git |
| 80 | ``` |
| 81 | |
| 82 | ## Режимы / аргументы |
| 83 | |
| 84 | - **`/mm projects`** — таблица всех. |
| 85 | - **`/mm projects --git`** — + ветка и число несохранённых по каждому (медленнее). |
| 86 | - **`/mm projects --active`** — только `status: active`. |
| 87 | - **`/mm projects <name>`** — не таблица, а deep-dive: запусти логику `/mm-resume` для этого проекта (его путь к коду из passport секции 1; если кода нет на диске — выведи сводку из Obsidian-артефактов). |
| 88 | |
| 89 | ## Edge cases |
| 90 | |
| 91 | - **Папка проекта без `passport.md`** (мусор / недоинициализирован): покажи строкой `<name> — ⚠️ нет passport.md (недоинициализирован, /mm new)`. |
| 92 | - **Очень много проектов** (>30): покажи топ-20 по активности + строку `…ещё N (см. --all)`. С `--all` — все. |
| 93 | - **Рассинхрон дат** (dashboard свежее passport): бери максимум, не падай. |
| 94 | - **Legacy и folder-формат для одного имени одновременно**: предпочитай folder, отметь дубль. |
| 95 | - **Vault недоступен**: останови, скажи путь из конфига. |
| 96 | |
| 97 | ## Что НЕ делать |
| 98 | |
| 99 | - Не запускать git по всем проектам без флага `--git` — это дорого и шумит. |
| 100 | - Не писать ничего (это read-only обзор). |
| 101 | - Не у |