# 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/.md` (унаследованы из `global/CLAUDE.md`, общего с CC): adapter и skill `role` их перекрывают, но текст путает агента и человека. ## What Changes - **Источник superpowers задаётся при установке.** `dsh/install.sh --skills` разрешает источник в порядке: `--superpowers-from ` → `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 ()` для явного/пиннинга, `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.