7.1 KiB
Spec Delta: dsh-openspec
Purpose
Слой OpenSpec в DeepSeek Harness: скиллы воркфлоу (propose → apply → archive →
sync) и их установка в проект. В Claude Code эти скиллы генерирует
openspec init --tools claude в .claude/skills; в DSH тот же генератор с
адаптером agents кладёт их в .agents/skills, который DSH читает как
проектный корень скиллов. Обвязка не переписывает воркфлоу: она ставит
адаптер, проверяет его и описывает цикл.
ADDED Requirements
Requirement: Скиллы OpenSpec живут в проекте
Воркфлоу OpenSpec SHALL поставляться проектными скиллами в .agents/skills,
созданными генератором openspec init --tools agents, и MUST NOT копироваться
в глобальный ~/.dsh/skills.
- Набор:
openspec-propose,openspec-apply-change,openspec-archive-change,openspec-explore,openspec-sync-specs,openspec-update-change. - Каждый
SKILL.mdMUST иметь frontmatter сname, совпадающим с именем каталога, иdescription, по которому модель отличает propose от archive. - Источник истины — CLI
openspecпроекта:openspec updateобновляет скиллы, ручные правки в них не переживают обновление.
Scenario: Проект с agents-адаптером
- WHEN в проекте выполнено
openspec init --tools agents - THEN в
.agents/skills/лежат шесть каталоговopenspec-*сSKILL.md, аopenspec list --jsonвозвращает ненулевойroot
Scenario: DSH видит проектные скиллы
- WHEN DSH-сессия стартует с cwd в проекте, где есть
.agents/skills/openspec-* - THEN каталог скиллов сессии содержит эти шесть имён, и их можно вызвать
инструментом
skill
Scenario: Глобальная копия не создаётся
- WHEN выполнено
bash dsh/install.sh --skills - THEN в
~/.dsh/skillsнет каталоговopenspec-*: они остаются проектными
Scenario: Два адаптера в одном проекте
- WHEN проект инициализирован с
--tools claude, затем с--tools agents - THEN
.claude/skillsи.claude/commandsостаются без изменений, а.agents/skillsдобавляется рядом
Requirement: Цикл change без Claude Code
В DSH-сессии MUST проходиться полный цикл OpenSpec без Claude Code: создание change, артефакты по инструкциям CLI, строгая валидация и архив.
- Создание:
openspec new change <имя>. - Артефакты:
openspec status --change <имя> --jsonиopenspec instructions <artifact> --change <имя> --json; агент пишетproposal.md,specs/<capability>/spec.md,design.md,tasks.md. - Проверка:
openspec validate <имя> --strict. - Архив:
openspec archive <имя> -y(без интерактивных подтверждений), спеки обновляются вopenspec/specs/.
Scenario: Архив неинтерактивен
- WHEN change валиден и все задачи
tasks.mdотмечены выполненными - THEN
openspec archive <имя> -yзавершается кодом 0, создаётopenspec/changes/archive/<дата>-<имя>/и обновляет основную спеку
Scenario: Невалидный change останавливает архив
- WHEN в change нет ни одной дельты и в
.openspec.yamlне стоитskip_specs: true - THEN
openspec validate --strictзавершается ненулевым кодом, и архив не выполняется
Requirement: Проверка установки
dsh/install.sh --check SHALL сообщать состояние слоя OpenSpec: наличие CLI,
версию и наличие agents-скиллов в репозитории обвязки; отсутствие CLI MUST быть
предупреждением, а не отказом, потому что остальная обвязка от OpenSpec не
зависит.
Scenario: CLI установлен, скиллы на месте
- WHEN
openspecесть вPATHи.agents/skills/openspec-propose/SKILL.mdсуществует - THEN
--checkпечатаетok: openspec <версия>иok: openspec agents skills
Scenario: CLI отсутствует
- WHEN
openspecнет вPATH - THEN
--checkпечатаетWARNс подсказкой установить CLI и продолжает проверку остальных пунктов; код возврата не меняется из-за одного OpenSpec
Requirement: Установка в проект
bash dsh/install.sh --openspec SHALL добавлять agents-адаптер в текущий проект
вызовом openspec init --tools agents, MUST быть идемпотентной и MUST NOT
создавать OpenSpec-корень там, где его нет.
Scenario: Проект уже использует OpenSpec
- WHEN cwd — проект с каталогом
openspec/, вызван--openspec - THEN скиллы появляются в
.agents/skills, повторный вызов не дублирует и не ломает существующие файлы
Scenario: Проект без OpenSpec
- WHEN cwd — проект без
openspec/, вызван--openspec - THEN скрипт отказывается с сообщением
openspec init --tools agents, ничего не создаёт и завершается ненулевым кодом
Requirement: Вход в DSH — скиллы, не команды
Слой OpenSpec MUST NOT добавлять слэш-команды в бандл: единственная команда
обвязки остаётся /role. Модель вызывает воркфлоу скиллом по description
(«openspec propose», «openspec archive»).
Scenario: Команды бандла не изменились
- WHEN установлен бандл этой версии
- THEN список команд содержит
/roleи не содержит/openspecи/opsx
Scenario: Роль и bootstrap работают как раньше
- WHEN в проекте с
.agents/skillsзагружается рольdev - THEN
skill roleи bootstrap-маркер ведут себя так же, как без OpenSpec