$npx -y skills add TserenTserenov/FMT-exocortex-template --skill iwe-restoreВосстановление памяти агента из exocortex-бэкапа при переезде на новое устройство. Находит DS-strategy/exocortex/, показывает что будет восстановлено, спрашивает подтверждение, копирует memory/ + CLAUDE.md + AGENTS.md, финализирует /audit-installation.
| 1 | # IWE Restore — восстановление памяти агента |
| 2 | |
| 3 | > **Когда использовать:** переехал на новый ноутбук, пересоздал workspace, потерял `memory/`. |
| 4 | > Если `memory/` уже заполнен и ты просто хочешь проверить — используй `/audit-installation`. |
| 5 | |
| 6 | Аргументы: $ARGUMENTS |
| 7 | |
| 8 | ## When to use |
| 9 | |
| 10 | Восстановление памяти агента из exocortex-бэкапа при переезде на новое устройство. Находит DS-strategy/exocortex/, показывает что будет восстановлено, спрашивает подтверждение, копирует memory/ + CLAUDE.md + AGENTS.md, финализирует /audit-installation. |
| 11 | |
| 12 | ## Обещание |
| 13 | |
| 14 | За 5 минут и одно подтверждение — восстановить память агента из GitHub-бэкапа. Агент не перезапишет ничего молча: сначала показывает что найдено, потом ждёт «да». |
| 15 | |
| 16 | --- |
| 17 | |
| 18 | ## Algorithm |
| 19 | |
| 20 | ## Шаг 1. Найти бэкап |
| 21 | |
| 22 | Определить путь к governance-репо. Приоритет: |
| 23 | |
| 24 | 1. Аргумент скилла `$ARGUMENTS` (если передан) |
| 25 | 2. Переменная окружения `$DS_STRATEGY` или `$GOVERNANCE_REPO` |
| 26 | 3. Стандартный путь `~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/` |
| 27 | 4. Поиск: `find ~/IWE -maxdepth 2 -name "exocortex" -type d 2>/dev/null` |
| 28 | |
| 29 | ```bash |
| 30 | GOVERNANCE="${1:-${DS_STRATEGY:-$HOME/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}}}" |
| 31 | EXOCORTEX="$GOVERNANCE/exocortex" |
| 32 | ``` |
| 33 | |
| 34 | Если `exocortex/` не найден → сказать: |
| 35 | |
| 36 | > «Не нашёл бэкап. Папка `exocortex/` отсутствует в `$GOVERNANCE`. Убедись, что governance-репо склонирован: `git clone <url> ~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}`. Если репо на другом пути — вызови `/iwe-restore путь/к/DS-strategy`.» |
| 37 | |
| 38 | Завершить. |
| 39 | |
| 40 | --- |
| 41 | |
| 42 | ## Шаг 2. Показать что найдено |
| 43 | |
| 44 | Собрать информацию о бэкапе: |
| 45 | |
| 46 | ```bash |
| 47 | # Список файлов в бэкапе |
| 48 | find "$EXOCORTEX" -maxdepth 1 -type f \( -name "*.md" -o -name "*.yaml" -o -name "*.yml" \) | sort |
| 49 | |
| 50 | # Дата последнего изменения самого свежего файла |
| 51 | find "$EXOCORTEX" -maxdepth 1 -type f | xargs ls -lt 2>/dev/null | head -1 |
| 52 | ``` |
| 53 | |
| 54 | Определить путь к `memory/` на текущем устройстве: |
| 55 | |
| 56 | ```bash |
| 57 | HOME_SLUG=$(echo "$HOME" | sed 's|/|-|g') |
| 58 | MEMORY_DST="$HOME/.claude/projects/${HOME_SLUG}-IWE/memory" |
| 59 | ``` |
| 60 | |
| 61 | Показать пользователю: |
| 62 | |
| 63 | ``` |
| 64 | Найден бэкап: |
| 65 | Источник: ~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/exocortex/ (N файлов, последний бэкап: ДАТА) |
| 66 | Назначение: ~/.claude/projects/.../memory/ |
| 67 | |
| 68 | Что будет восстановлено: |
| 69 | memory/: [список файлов .md и .yaml] |
| 70 | CLAUDE.md → ~/IWE/CLAUDE.md |
| 71 | AGENTS.md → ~/IWE/AGENTS.md (если есть) |
| 72 | |
| 73 | Текущее состояние memory/: |
| 74 | [пусто / N файлов уже есть] |
| 75 | ``` |
| 76 | |
| 77 | --- |
| 78 | |
| 79 | ## Шаг 3. Спросить подтверждение |
| 80 | |
| 81 | Спросить одним вопросом: |
| 82 | |
| 83 | > «Восстановить? (да / нет / показать diff)» |
| 84 | |
| 85 | - **нет** → завершить, ничего не менять. |
| 86 | - **показать diff** → перейти к Шагу 3a. |
| 87 | - **да** → перейти к Шагу 4. |
| 88 | |
| 89 | ### Шаг 3a. Diff (если запросил) |
| 90 | |
| 91 | Для каждого файла из бэкапа, который уже существует в `memory/`: |
| 92 | |
| 93 | ```bash |
| 94 | diff "$EXOCORTEX/<file>" "$MEMORY_DST/<file>" |
| 95 | ``` |
| 96 | |
| 97 | Показать расхождения кратко. После — снова спросить: «Восстановить с перезаписью? (да / пропустить существующие / нет)» |
| 98 | |
| 99 | --- |
| 100 | |
| 101 | ## Шаг 4. Восстановить |
| 102 | |
| 103 | ### 4a. Создать папку memory/ если не существует |
| 104 | |
| 105 | ```bash |
| 106 | mkdir -p "$MEMORY_DST" |
| 107 | ``` |
| 108 | |
| 109 | ### 4b. Копировать файлы памяти |
| 110 | |
| 111 | ```bash |
| 112 | rsync -av --exclude='CLAUDE.md' --exclude='AGENTS.md' \ |
| 113 | --include='*.md' --include='*.yaml' --include='*.yml' \ |
| 114 | --exclude='*' \ |
| 115 | "$EXOCORTEX/" "$MEMORY_DST/" |
| 116 | ``` |
| 117 | |
| 118 | Если пользователь выбрал «пропустить существующие» — добавить флаг `--ignore-existing`. |
| 119 | |
| 120 | ### 4c. Копировать CLAUDE.md |
| 121 | |
| 122 | > issue #217: подстановка `{{HOME_DIR}}` → `$HOME` делает восстановление ОС-агностичным |
| 123 | > (бэкап пишется на плейсхолдере в `day-close.sh`, симметрично `setup.sh`). |
| 124 | > `$HOME` стоит в replacement-части `sed s///` — экранируем `&`/`\`, иначе `$HOME` |
| 125 | > с `&` трактуется как «весь совпавший текст» и портит путь (cold-review находка). |
| 126 | |
| 127 | ```bash |
| 128 | WORKSPACE_DIR="${IWE_WORKSPACE:-$HOME/IWE}" |
| 129 | HOME_SED_SAFE=$(printf '%s' "$HOME" | sed 's/[&\]/\\&/g') |
| 130 | if [ -f "$EXOCORTEX/CLAUDE.md" ]; then |
| 131 | # Если CLAUDE.md уже есть — показать: «CLAUDE.md уже существует. Перезаписать?» |
| 132 | # При согласии: |
| 133 | sed "s|{{HOME_DIR}}|$HOME_SED_SAFE|g" "$EXOCORTEX/CLAUDE.md" > "$WORKSPACE_DIR/CLAUDE.md" |
| 134 | fi |
| 135 | ``` |
| 136 | |
| 137 | ### 4d. Копировать AGENTS.md |
| 138 | |
| 139 | ```bash |
| 140 | if [ -f "$EXOCORTEX/AGENTS.md" ]; then |
| 141 | sed "s|{{HOME_DIR}}|$HOME_SED_SAFE|g" "$EXOCORTEX/AGENTS.md" > "$WORKSPACE_DIR/AGENTS.md" |
| 142 | fi |
| 143 | ``` |
| 144 | |
| 145 | ### 4e. Отчёт |
| 146 | |
| 147 | ``` |
| 148 | Восстановлено: |
| 149 | memory/: N файлов скопировано, M пропущено |
| 150 | CLAUDE.m |