# DSH role loader — план Ветка: `feat/39-dsh-role-loader` (issue #39). Спека/дизайн: `dsh/PORT.md`. ## Цель Дать модели DSH штатный способ загрузить роль: skill `role`, который читает `~/.dsh/roles/.md`. `/role` остаётся пользовательской командой; глобальные инструкции больше не требуют от модели вызвать slash-команду. ## Scope 1. `dsh/skills/role/SKILL.md` — model-invocable инструкция: определить роль, прочитать файл, объявить роль, следовать процессу. 2. `dsh/install.sh --skills`: копировать локальные `dsh/skills/*` в `$DSH_HOME/skills` вместе с superpowers. 3. `install_global`: adapter-строка «модель использует skill `role`; `/role` — пользовательская команда». 4. Тесты: наличие/содержимое skill, install-копирование, `--check`. 5. README/PORT. ## Non-goals - Кастомный `ctx.tools.register('role')` — отдельный вариант, если skill окажется недостаточно. - Автоматическая инъекция роли в `agent/pre-step` — возможный следующий шаг. - Изменение `global/CLAUDE.md` (он общий с Claude Code и ограничен 3 КБ). ## Задачи - [x] **Task 1: skill `role`** - Create: `dsh/skills/role/SKILL.md` - Frontmatter: `name: role`, description для каталога. - Body: роль из первого сообщения; пути `~/.dsh/roles`, `~/.claude/roles`, repo `roles/`; прочитать файл; объявить «Роль: ; если не так — скажи». - Не вызывать `/role`; это команда пользователя. - [x] **Task 2: install.sh** - Modify: `dsh/install.sh` - `install_local_skills()` копирует `$ROOT/dsh/skills/*` в `$DSH_HOME/skills`. - `--skills` вызывает superpowers + local; `--all` уже включает. - `check` проверяет `$DSH_HOME/skills/role/SKILL.md`. - `install_global` добавляет adapter-строку про skill `role`. - [x] **Task 3: тесты** - Modify: `dsh/tests/install.test.mjs` — role skill скопирован. - Add: `dsh/tests/role-skill.test.mjs` — frontmatter, пути, запрет `/role`. - [x] **Task 4: docs** - Modify: `dsh/README.md`, `dsh/PORT.md` — skill `role` vs `/role`. - [x] **Task 5: проверки и коммит** - `bash dsh/tests/run.sh` - `bash tests/run.sh` - Commit, push, PR #40 (base main). ## Acceptance Свежая сессия DSH, «Let's make a react todo list»: - модель вызывает `skill({name:"role"})`; - читает `~/.dsh/roles/dev.md`; - объявляет роль и следует процессу, без ручного `/role`.