11 KiB
Spec Delta: dsh-superpowers-git
Purpose
dsh/install.sh --skills получает superpowers из git сам: первый запуск —
клон, следующие — обновление до последнего коммита default-ветки. Явные
источники остаются приоритетнее и не ходят в сеть; ~/.claude — по-прежнему
legacy-fallback с предупреждением.
ADDED Requirements
Requirement: Свежий superpowers из git
dsh/install.sh --skills MUST получать superpowers-скиллы из git, когда явный
источник не задан: клонировать при отсутствии клона и обновлять при каждом
следующем запуске.
- Репозиторий по умолчанию —
https://github.com/obra/superpowers;$DSH_SUPERPOWERS_REPOMUST переопределять его (зеркала, локальные репозитории в тестах) и MUST применяться к уже существующему клону: передfetchURLoriginприводится к заданному репозиторию. - Клон —
git clone --depth 1 <repo> $DSH_HOME/superpowers. - Обновление —
git -C $DSH_HOME/superpowers fetch --depth 1 originиgit reset --hard FETCH_HEAD; рабочее дерево управляемое, локальные правки там не сохраняются. - После клона/обновления источником MUST считаться
$DSH_HOME/superpowers/skills(или сам каталог), только если в нём естьusing-superpowers/SKILL.md. - Вывод
--skillsMUST называть источник и git-версию:(source: <path>, git <short-sha>). --checkMUST NOT выполнять сетевые операции: он показывает состояние существующего клона (ok: superpowers source (<path>, git <sha>)) и не создаёт$DSH_HOME/superpowers.
Scenario: Первый запуск клонирует источник
- WHEN
$DSH_HOME/superpowersотсутствует,DSH_SUPERPOWERS_REPOуказывает на репозиторий superpowers - THEN
--skillsклонирует его в$DSH_HOME/superpowers, копирует скиллы в$DSH_HOME/skillsи печатаетgit <sha>
Scenario: Повторный запуск обновляет клон
- WHEN клон уже есть, а в источнике появился новый коммит со скиллом
- THEN повторный
--skillsобновляет клон до нового коммита, и новый скилл оказывается в$DSH_HOME/skills
Scenario: Нет сети, клон есть
- WHEN обновление клона не удалось (недоступный репозиторий), но
$DSH_HOME/superpowersсодержитusing-superpowers/SKILL.md - THEN
--skillsпечатаетWARN, использует кэш, копирует скиллы и завершается кодом 0
Scenario: Нет сети и нет клона
- WHEN клонирование не удалось, клона и других источников нет,
$DSH_HOME/skillsпуст - THEN
--skillsпечатаетFAILс репозиторием и подсказкой--superpowers-from, код 1; недоклонированный каталог не остаётся на диске
Scenario: Ручная копия без git
- WHEN
$DSH_HOME/superpowersсуществует, не является git-клоном и содержитusing-superpowers/SKILL.md - THEN каталог используется как есть,
--skillsпечатаетWARNо том, что он не будет обновляться
Scenario: --check не ходит в сеть
- WHEN клон существует, а
DSH_SUPERPOWERS_REPOуказывает на недоступный репозиторий - THEN
--checkпечатаетok: superpowers source (<path>, git <sha>), завершается без сетевых ошибок и ничего не клонирует
MODIFIED Requirements
Requirement: Источник superpowers задаётся при установке
dsh/install.sh --skills SHALL разрешать источник superpowers-скиллов в
порядке приоритета.
- Порядок:
--superpowers-from <dir>→$DSH_SUPERPOWERS_SOURCE→ git-клон$DSH_HOME/superpowers(обновить существующий или склонировать из$DSH_SUPERPOWERS_REPO/https://github.com/obra/superpowers) → legacy-кэш Claude Code → legacy~/.claude/skills. - Для явного источника (
--superpowers-from,$DSH_SUPERPOWERS_SOURCE) допускаются обе формы: корень superpowers (естьskills/using-superpowers/SKILL.md) или сам каталогskills; сеть при явном источнике MUST NOT использоваться. - Явно заданный, но невалидный источник MUST приводить к
FAILи коду возврата 1: тихий откат на git/legacy запрещён. - Копирование MUST быть заменой каталога назначения (
rm -rf+cp -R), а не симлинком:~/.dsh/skillsне должен зависеть от каталога-источника.
Scenario: Явный источник без ~/.claude
- WHEN
HOME— пустой temp-каталог без~/.claude, а--superpowers-fromуказывает на каталог superpowers - THEN
--skillsкопирует скиллы в$DSH_HOME/skills, печатает источник и завершается кодом 0
Scenario: Переменная окружения вместо флага
- WHEN задан
DSH_SUPERPOWERS_SOURCE=<dir>и флаг--superpowers-fromне передан - THEN источник берётся из переменной; поведение совпадает с флагом
Scenario: Флаг важнее переменной
- WHEN заданы и
--superpowers-from, иDSH_SUPERPOWERS_SOURCE - THEN используется каталог из флага
Scenario: Невалидный явный источник
- WHEN
--superpowers-fromуказывает на каталог безusing-superpowers/SKILL.md - THEN
--skillsпечатаетFAILс ожидаемой структурой и завершается кодом 1, ничего не копируя из git/legacy-источников
Scenario: Явный источник не трогает git
- WHEN
--superpowers-fromзадан, а$DSH_HOME/superpowersотсутствует - THEN
--skillsне создаёт$DSH_HOME/superpowers
Requirement: Отсутствие источника не бывает тихим
Если источник superpowers не найден, --skills MUST различать первичную и
повторную установку и MUST NOT завершаться успехом молча.
- Если
$DSH_HOME/skills/using-superpowers/SKILL.mdуже существует —WARN«источник не найден, копии сохранены» и код 0 (идемпотентный повтор). - Если копий нет —
FAILс репозиторием ($DSH_SUPERPOWERS_REPO) и подсказкой--superpowers-from <dir>; код возврата 1. - Локальные скиллы обвязки (
dsh/skills/*:role,sdd) MUST ставиться в обоих случаях: они не зависят от superpowers.
Scenario: Первая установка без источника
- WHEN
HOMEпуст,$DSH_HOME/skillsне существует, git-источник недоступен и других источников нет - THEN
--skillsпечатаетFAIL, код 1, но$DSH_HOME/skills/role/SKILL.mdи$DSH_HOME/skills/sdd/SKILL.mdна месте
Scenario: Повторная установка без источника
- WHEN
$DSH_HOME/skills/using-superpowers/SKILL.mdуже есть, источника нет - THEN
--skillsпечатаетWARN, код 0, установленные скиллы не удалены
Requirement: ~/.claude — только legacy-fallback с предупреждением
superpowers-скиллы и роли MUST иметь рабочий путь ~/.dsh; пути ~/.claude
SHALL оставаться fallback'ом для машин, где --skills --roles ещё не
перезапускали, и MUST сопровождаться предупреждением.
- Установка: legacy-кэш Claude Code и
~/.claude/skillsдопустимы как источник, но--skillsпечатаетWARN: legacy superpowers sourceс подсказкой на git-источник или--superpowers-from. --check: legacy-источник —WARN, git-клон/явный источник —ok, отсутствие —WARNс подсказкой, невалидный явный источник —FAILи код 1.- Runtime: bootstrap и резолвер ролей сохраняют порядок
~/.dsh→~/.claude, но при выборе legacy-пути один раз за процесс пишут в лог предупреждение. - Удаление fallback'ов — отдельное изменение; в этом change они не удаляются.
Scenario: Legacy-кэш как источник установки
- WHEN в
HOMEесть только кэш Claude Code с superpowers,$DSH_HOMEпуст, git-источник недоступен - THEN
--skillsкопирует скиллы и печатаетWARN: legacy superpowers source
Scenario: Runtime-предупреждение
- WHEN bootstrap резолвит
using-superpowersиз~/.claude/... - THEN в лог один раз за процесс попадает предупреждение с предложением
выполнить
dsh/install.sh --skills
Scenario: ~/.dsh приоритетнее
- WHEN существуют и
~/.dsh/skills/using-superpowers/SKILL.md, и legacy-копия - THEN используется
~/.dsh, предупреждения нет