Andrey Epifancev 7db024ccf5 chore(openspec): archive dsh-openspec (#42)
Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-24 20:00:24 +04:00

7.1 KiB
Raw Blame History

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.md MUST иметь 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