| name | sdd:sync |
| workflow_step | 2 |
| description | Инициализация и синхронизация субмодулей. Вызывать после клонирования репы (субмодули ещё не инициализированы), после изменения веток в manifest.yaml, или когда submodule пути показывают detached HEAD.
|
sdd:sync — синхронизация субмодулей
Вход
Нет обязательных параметров. Опционально: PATH=<submodule-path> для обновления одного субмодуля.
Алгоритм
Шаг 0: проверка git-репозитория
git rev-parse --git-dir 2>/dev/null
Если команда завершается с ненулевым кодом — остановить выполнение:
ERROR: not a git repository.
Clone first: git clone <repo-url> && cd <repo-dir>
Дальнейшие шаги не выполняются.
Режим 1: Полная синхронизация (без PATH)
-
Определить состояние субмодулей:
git submodule status
- Если строки начинаются с
- → субмодули не инициализированы
- Если строки начинаются с
+ или пустой → инициализированы, но могут быть устаревшими
- Если строки начинаются с
U → merge-конфликт
-
Если обнаружены неинициализированные субмодули:
make setup
(выполняет git submodule update --init --recursive + настройку hooks)
-
В любом случае синхронизировать все субмодули до версий из .gitmodules:
git submodule update --remote --merge
-
Проверить результат:
git submodule status
Убедиться, что нет строк с - или U.
Режим 2: Один субмодуль (с PATH)
git submodule update --remote --merge -- <PATH>
После — показать статус только для указанного субмодуля.
Обработка особых случаев
При каждом stop-условии ниже — перед выводом сообщения пользователю записать error-лог через Bash tool:
TS=$(date +%Y%m%dT%H%M%S)
mkdir -p ".logs/sync"
cat > ".logs/sync/sync-${TS}-error.md" << 'EOF'
---
skill: sdd:sync
timestamp: <TS>
---
- **step:** <шаг, где произошла ошибка>
**what:** <текст ошибки>
**why:** <ожидалось / получено>
**reproduce:** <точная Bash-команда или входные данные>
EOF
- not a git repository: остановиться на шаге 0 с сообщением
ERROR: not a git repository и инструкцией по клонированию. make setup не вызывать.
- detached HEAD: после
git submodule update --remote --merge субмодуль должен быть на ветке из .gitmodules. Если detached HEAD сохраняется — предложить git -C <path> checkout <branch>.
- Merge-конфликт (U): не пытаться разрешить автоматически; показать инструкцию по ручному разрешению.
- Ошибка сети: показать ошибку. Определить хост репозитория через
git remote get-url origin, извлечь hostname и предложить ssh -T git@<hostname> для проверки SSH-доступа. Если remote недоступен или URL не в SSH-формате — предложить проверить сетевой доступ к хосту репозитория.
Вывод
Статус субмодулей: X инициализированы, Y не инициализированы
Выполняю: make setup ← (только если есть неинициализированные)
Выполняю: git submodule update --remote --merge
OK: все субмодули синхронизированы
Post-completion hook
После успешного завершения синхронизации автоматически запусти скилл sdd:audit — без дополнительного запроса пользователя. При ошибке (make завершился с ненулевым кодом, merge-конфликт, недоступность сети, detached HEAD) sdd:audit NOT вызывается.