69 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Proposal: установка DSH без зависимости от ~/.claude
Issue: #49 (роадмап порта — #48). Источники:
- `dsh/PORT.md`, разделы 3 (deferred), 5 (install), 7 (risks: «`~/.claude`
dependence»);
- issue #37/#38: runtime-отвязка skills и roles от `~/.claude` — сделана;
- ответ владельца 24.10.2026 на вопрос о источнике superpowers: «нормально так»
(явный путь/`DSH_SUPERPOWERS_SOURCE`, без вендоринга в репозиторий).
## Why
После #37/#38 DSH не зависит от `~/.claude` в runtime: bootstrap читает
`~/.dsh/skills`, роли — `~/.dsh/roles`, `--skills --roles` копируют файлы.
Осталась зависимость **на этапе установки**: `dsh/install.sh --skills` берёт
superpowers только из кэша плагина Claude Code
(`~/.claude/plugins/cache/claude-plugins-official/superpowers/*/skills`).
Практические следствия:
- на машине без Claude Code свежая установка не может поставить superpowers:
`--skills` печатает `WARN` и молча ничего не копирует, bootstrap остаётся
пустым (`superpowers bootstrap skill not found; skipping injection`);
- после отката/удаления Claude Code установка воспроизводится только из уже
лежащих копий в `~/.dsh/skills` — то есть «повторяемая установка» существует
лишь пока никто не удалил `~/.dsh`;
- acceptance порта (#48, DoD) требует пройти полный цикл в чистом проекте, где
CC-харнес не участвует, — сейчас первый шаг цикла упирается в `~/.claude`;
- в установленных инструкциях `~/.dsh/AGENTS.md` остались пути
`~/.claude/roles/<r>.md` (унаследованы из `global/CLAUDE.md`, общего с CC):
adapter и skill `role` их перекрывают, но текст путает агента и человека.
## What Changes
- **Источник superpowers задаётся при установке.** `dsh/install.sh --skills`
разрешает источник в порядке: `--superpowers-from <dir>` → `DSH_SUPERPOWERS_SOURCE`
→ пиннинг `$DSH_HOME/superpowers/skills` → (legacy) кэш Claude Code →
(legacy) `~/.claude/skills`. Явно заданный, но невалидный источник — `FAIL`,
а не тихий откат на legacy.
- **Нет источника — нет тихого WARN.** Если `~/.dsh/skills` уже содержит
`using-superpowers`, повторный `--skills` предупреждает и сохраняет копии
(идемпотентность). Если копий нет — `FAIL` с готовой командой
`git clone … ~/.dsh/superpowers`, код возврата 1. Локальные скиллы обвязки
(`role`, `sdd`) ставятся в обоих случаях.
- **`--check` показывает источник.** `ok: superpowers source (<path>)` для
явного/пиннинга, `WARN: legacy superpowers source` для `~/.claude`,
`WARN` с подсказкой, когда источника нет.
- **Legacy-пути остаются fallback'ом с предупреждением.** Runtime-порядок
`~/.dsh` → `~/.claude` не меняется; bundle один раз за процесс пишет в лог,
что bootstrap/роли взяты из legacy-источника. Удаление fallback'ов — не эта
задача (см. design, D-2).
- **Установленные инструкции DSH не ссылаются на `~/.claude`.** `install_global`
заменяет в копии `~/.claude/roles` → `~/.dsh/roles` и явно говорит, что
проектный `CLAUDE.md`/`AGENTS.md` — формат инструкций DSH, а не runtime
Claude Code. `global/CLAUDE.md` в репозитории не меняется: его читает и CC.
- **Тесты без DSH runtime.** Чистый temp `HOME` без `~/.claude`: установка с
`--superpowers-from`, bootstrap с этим HOME, `FAIL`/`WARN` при отсутствии
источника, legacy-предупреждения, содержимое `AGENTS.md`.
- **Документация.** `dsh/README.md` (quick start с получением источника,
known limits), `dsh/PORT.md` (§3, §5, §7, §8).
## Non-goals
- Вендоринг superpowers в репозиторий обвязки: апстрим живёт своей версией,
копия в репозитории стареет молча (design, D-1).
- `git clone` внутри `install.sh`: установка не должна требовать сети.
- Удаление legacy-fallback'ов из `bootstrap.js`/`index.js`: обратная
совместимость машин, где `--skills --roles` ещё не перезапускали (D-2).
- Проектный слой ролей, briefing, harness-check, harness-doctor — свои фазы #48.