$npx -y skills add mworldorg/markdown-memory --skill mm-updateСамообновление mm-системы из удалённого репозитория. mm раздаётся через git clone + register-skills (не npm), поэтому update = git pull свежего mm из origin/main + повторный register-skills + notice о перезапуске Claude Code. Use when user says "обнови mm", "обнови систему", "/mm
| 1 | # mm-update — Self-Update from Git Remote |
| 2 | |
| 3 | Обновляет mm-систему до свежей версии из `origin/main`. mm установлен как git-клон с junction'ами в `~/.claude/skills/` — поэтому обновление это `git pull` репозитория + повторный прогон `register-skills`, а не пакетный менеджер. |
| 4 | |
| 5 | Ничего не сливает и не ребейзит автоматически. При любом расхождении или ошибке `--ff-only` — стоп с инструкцией разрулить вручную. |
| 6 | |
| 7 | > Ручной интерактивный аналог фонового `scripts/auto-update.py` (ff-only, дёргается из `mm-resume`); git-поток общий — отличие в том, что здесь показывается changelog и спрашивается подтверждение. |
| 8 | |
| 9 | ## Где работать |
| 10 | |
| 11 | Корень репозитория mm: |
| 12 | - `$env:MM_REPO_ROOT` если задан; |
| 13 | - иначе текущая рабочая директория (`cwd`). |
| 14 | |
| 15 | Все git-команды и `register-skills` выполняй из этого корня. |
| 16 | |
| 17 | ## Процесс |
| 18 | |
| 19 | ### 0. Guard: это вообще git-репо? |
| 20 | |
| 21 | Проверь, что в корне репо (см. «Где работать») есть `.git`: |
| 22 | ```powershell |
| 23 | Test-Path (Join-Path $repoRoot ".git") |
| 24 | ``` |
| 25 | Если `.git` нет — mm установлен не как git-репо (например, распакован из tarball). Стоп: |
| 26 | ``` |
| 27 | ❌ mm установлен не как git-репозиторий — обновлять через git нечем. |
| 28 | Обнови через `npx markdown-memory update` или переустанови mm. |
| 29 | ``` |
| 30 | Не продолжай. (По смыслу как `auto-update.py`: «Not a git repository. Skipping update».) |
| 31 | |
| 32 | ### 1. Забрать состояние remote |
| 33 | |
| 34 | ```powershell |
| 35 | git fetch origin main |
| 36 | ``` |
| 37 | |
| 38 | Если `git fetch` упал (нет сети / нет доступа к origin) — стоп: `⚠️ Не удалось связаться с origin. Проверь сеть и доступ к github.com/mworldorg/markdown-memory.` Не продолжай. |
| 39 | |
| 40 | ### 2. Сравнить версии |
| 41 | |
| 42 | - **Локальная версия:** поле `version` из `config/mm-config.json` (читай файл напрямую). |
| 43 | - **Удалённая версия:** |
| 44 | ```powershell |
| 45 | git show origin/main:config/mm-config.json |
| 46 | ``` |
| 47 | распарси JSON, возьми `version`. |
| 48 | |
| 49 | Это поле — единый источник версии системы (repo-wide release). Per-skill `version:` в каждом `SKILL.md` гранулярны и здесь не сравниваются. |
| 50 | |
| 51 | ### 3. Определить расхождение ветки |
| 52 | |
| 53 | ```powershell |
| 54 | git rev-list --left-right --count HEAD...origin/main |
| 55 | ``` |
| 56 | |
| 57 | Вывод — два числа через таб: **первое = ahead** (коммиты, которые есть локально, но нет в origin/main), **второе = behind** (коммиты, которые есть в origin/main, но нет локально). Не перепутай порядок. |
| 58 | |
| 59 | ### 4. Развилка по (ahead, behind) |
| 60 | |
| 61 | | Состояние | Что делать | |
| 62 | |---|---| |
| 63 | | `behind=0, ahead=0` | `✅ Уже синхронизировано с origin/main (версия X). Обновлять нечего.` → выход | |
| 64 | | `behind=0, ahead>0` | `ℹ️ Локаль впереди origin/main на N коммит(ов) — машина разработчика или есть незапушенное. Обновлять нечего.` → выход | |
| 65 | | `behind>0, ahead=0` | Показать `локаль X → remote Y` + changelog (см. ниже), спросить `y/n`, при `y` → `git pull --ff-only` | |
| 66 | | `behind>0, ahead>0` | `⚠️ Ветки разошлись (N локальных / M удалённых). Авто-обновление отменено — разрули вручную.` → выход, **без pull** | |
| 67 | |
| 68 | **Changelog** (только для случая `behind>0, ahead=0`): |
| 69 | ```powershell |
| 70 | git log --oneline HEAD..origin/main |
| 71 | ``` |
| 72 | Покажи список как есть. Никакого `CHANGELOG.md` — changelog это git-лог между HEAD и origin/main. |
| 73 | |
| 74 | Формат запроса подтверждения: |
| 75 | ``` |
| 76 | Доступно обновление mm: версия X → Y |
| 77 | Новые коммиты (N): |
| 78 | <hash> <subject> |
| 79 | ... |
| 80 | Подтянуть (git pull --ff-only)? (y/n) |
| 81 | ``` |
| 82 | |
| 83 | При `n` — стоп: `Обновление отменено.` |
| 84 | |
| 85 | ### 5. Pull (только при подтверждённом `behind>0, ahead=0`) |
| 86 | |
| 87 | ```powershell |
| 88 | git pull --ff-only origin main |
| 89 | ``` |
| 90 | |
| 91 | Если `--ff-only` упал (обычно из-за локальных незакоммиченных правок или непушенных дивергентных коммитов): |
| 92 | - Стоп: `❌ git pull --ff-only не прошёл. Вероятно есть локальные правки в репо mm. Закоммить/стэшни их и повтори /mm update, либо разрули вручную.` |
| 93 | - **Никогда** не делай авто-`merge` или `rebase` чтобы «починить» это. Останавливайся и отдавай решение пользователю. |
| 94 | |
| 95 | ### 6. Переджанкшенить скиллы |
| 96 | |
| 97 | После успешного pull прогони регистрацию (pull мог добавить/переименовать скиллы): |
| 98 | ```powershell |
| 99 | .\scripts\register-skills.ps1 |
| 100 | ``` |
| 101 | (На macOS/Linux — `python3 scripts/register-skills.py`.) |
| 102 | |
| 103 | Покажи вывод скрипта. |
| 104 | |
| 105 | ### 7. Финал |
| 106 | |
| 107 | ``` |
| 108 | ✅ Обновлено до версии Y. |
| 109 | Перезапусти Claude Code, чтобы подхватить обновлённые скиллы. |
| 110 | ``` |
| 111 | |
| 112 | Скиллы загружаются на старте сессии — без рестарта новые/изменённые скиллы не активируются. |
| 113 | |
| 114 | ## Ограничения |
| 115 | |
| 116 | - **Не трогать `config.version`.** Обновление это потребление релиза, не выпуск. Версию проставляет мейнтейнер при релизе, не этот скилл. |
| 117 | - **Вендоренные скиллы (`vendor/`) не обновляются отдельной логикой.** `git pull` тянет их вместе со всем репо — это нормально. Перевендоринг (обновление до новой upstream-версии ECC и т.п.) — ручная работа мейнтейнера, не часть `/mm update`. |
| 118 | - **Никогда** не делать авто-`merge`/`rebase`: ни при расх |