sauron-cli 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.js +8 -8
- package/package.json +1 -1
- package/templates/.agents/rules/memory.md +68 -68
- package/templates/.agents/skills/wiki/SKILL.md +14 -14
- package/55ea973d-e255-4f08-a313-a5d68243bd2d.png +0 -0
- package/OpenSpec-main/.actrc +0 -1
- package/OpenSpec-main/.changeset/README.md +0 -97
- package/OpenSpec-main/.changeset/config.json +0 -15
- package/OpenSpec-main/.coderabbit.yaml +0 -11
- package/OpenSpec-main/.devcontainer/README.md +0 -92
- package/OpenSpec-main/.devcontainer/devcontainer.json +0 -68
- package/OpenSpec-main/.github/CODEOWNERS +0 -2
- package/OpenSpec-main/.github/workflows/README.md +0 -20
- package/OpenSpec-main/.github/workflows/ci.yml +0 -346
- package/OpenSpec-main/.github/workflows/release-prepare.yml +0 -60
- package/OpenSpec-main/CHANGELOG.md +0 -594
- package/OpenSpec-main/LICENSE +0 -22
- package/OpenSpec-main/MAINTAINERS.md +0 -17
- package/OpenSpec-main/README.md +0 -206
- package/OpenSpec-main/README_OLD.md +0 -475
- package/OpenSpec-main/assets/openspec_bg.png +0 -0
- package/OpenSpec-main/assets/openspec_dashboard.png +0 -0
- package/OpenSpec-main/assets/openspec_pixel_dark.svg +0 -89
- package/OpenSpec-main/assets/openspec_pixel_light.svg +0 -89
- package/OpenSpec-main/bin/openspec.js +0 -5
- package/OpenSpec-main/build.js +0 -31
- package/OpenSpec-main/eslint.config.js +0 -42
- package/OpenSpec-main/flake.lock +0 -27
- package/OpenSpec-main/flake.nix +0 -114
- package/OpenSpec-main/openspec/changes/IMPLEMENTATION_ORDER.md +0 -68
- package/OpenSpec-main/openspec/changes/add-artifact-regeneration-support/proposal.md +0 -136
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/proposal.md +0 -93
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-creation/spec.md +0 -15
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-stacking-workflow/spec.md +0 -65
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/cli-change/spec.md +0 -27
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/openspec-conventions/spec.md +0 -29
- package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/tasks.md +0 -39
- package/OpenSpec-main/openspec/changes/add-global-install-scope/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/add-global-install-scope/design.md +0 -161
- package/OpenSpec-main/openspec/changes/add-global-install-scope/proposal.md +0 -101
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/ai-tool-paths/spec.md +0 -35
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-config/spec.md +0 -21
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-init/spec.md +0 -28
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-update/spec.md +0 -34
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/command-generation/spec.md +0 -22
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/global-config/spec.md +0 -24
- package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/installation-scope/spec.md +0 -71
- package/OpenSpec-main/openspec/changes/add-global-install-scope/tasks.md +0 -61
- package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/proposal.md +0 -45
- package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/specs/developer-qa-workflow/spec.md +0 -49
- package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/proposal.md +0 -111
- package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-init/spec.md +0 -121
- package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-update/spec.md +0 -48
- package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/tasks.md +0 -53
- package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/design.md +0 -86
- package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/proposal.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/specs/cli-update/spec.md +0 -59
- package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/tasks.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/specs/cli-list/spec.md +0 -69
- package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/tasks.md +0 -26
- package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/design.md +0 -64
- package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/proposal.md +0 -18
- package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/tasks.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/design.md +0 -104
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/proposal.md +0 -30
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/specs/cli-init/spec.md +0 -148
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/tasks.md +0 -38
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/proposal.md +0 -24
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/specs/openspec-conventions/spec.md +0 -120
- package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/tasks.md +0 -38
- package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/specs/openspec-docs/README.md +0 -472
- package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/tasks.md +0 -9
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/proposal.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/specs/cli-archive/spec.md +0 -111
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/tasks.md +0 -44
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/proposal.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/specs/cli-diff/spec.md +0 -77
- package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/tasks.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/design.md +0 -56
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/proposal.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-change/spec.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-list/spec.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/tasks.md +0 -34
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-change/spec.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-show/spec.md +0 -83
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-spec/spec.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/tasks.md +0 -142
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/specs/cli-archive/spec.md +0 -191
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/tasks.md +0 -57
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/design.md +0 -45
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/proposal.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/specs/cli-spec/spec.md +0 -43
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/tasks.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/design.md +0 -104
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/proposal.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-archive/spec.md +0 -18
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-diff/spec.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/tasks.md +0 -59
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/proposal.md +0 -93
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-archive/spec.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-diff/spec.md +0 -45
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/openspec-conventions/spec.md +0 -101
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/tasks.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/design.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/proposal.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/cli-list/spec.md +0 -57
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/openspec-conventions/spec.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/tasks.md +0 -27
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-change/spec.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-spec/spec.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-validate/spec.md +0 -149
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/tasks.md +0 -81
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/proposal.md +0 -40
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/specs/cli-update/spec.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/tasks.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/specs/cli-validate/spec.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/tasks.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/proposal.md +0 -36
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/specs/openspec-conventions/spec.md +0 -192
- package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/tasks.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/proposal.md +0 -38
- package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/specs/cli-view/spec.md +0 -109
- package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/tasks.md +0 -47
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/proposal.md +0 -28
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-init/spec.md +0 -71
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-update/spec.md +0 -41
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/tasks.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/proposal.md +0 -35
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/specs/cli-init/spec.md +0 -45
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/tasks.md +0 -16
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/proposal.md +0 -119
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-init/spec.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-update/spec.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/tasks.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/proposal.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/tasks.md +0 -9
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/proposal.md +0 -78
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/tasks.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/specs/cli-init/spec.md +0 -92
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/tasks.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/proposal.md +0 -81
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/tasks.md +0 -37
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/specs/cli-view/spec.md +0 -9
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/tasks.md +0 -8
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/proposal.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-init/spec.md +0 -40
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-update/spec.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/openspec-conventions/spec.md +0 -27
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/tasks.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/design.md +0 -130
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/proposal.md +0 -117
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/tasks.md +0 -69
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/proposal.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/specs/cli-validate/spec.md +0 -9
- package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/tasks.md +0 -11
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-init/spec.md +0 -56
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-update/spec.md +0 -41
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/tasks.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-init/spec.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-update/spec.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/tasks.md +0 -30
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/proposal.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-init/spec.md +0 -43
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-update/spec.md +0 -27
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/tasks.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/proposal.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/specs/cli-init/spec.md +0 -39
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/tasks.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/proposal.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-init/spec.md +0 -42
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-update/spec.md +0 -27
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/tasks.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/proposal.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/specs/cli-validate/spec.md +0 -39
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/tasks.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/proposal.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/specs/docs-agent-instructions/spec.md +0 -33
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/tasks.md +0 -11
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/tasks.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/proposal.md +0 -14
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/specs/cli-init/spec.md +0 -10
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/tasks.md +0 -8
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/proposal.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-init/spec.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-update/spec.md +0 -10
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/tasks.md +0 -11
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/proposal.md +0 -49
- package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/tasks.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/proposal.md +0 -17
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/specs/cli-update/spec.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/tasks.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/proposal.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/specs/cli-init/spec.md +0 -97
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/tasks.md +0 -19
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/specs/cli-init/spec.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/tasks.md +0 -7
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/proposal.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-init/spec.md +0 -54
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-update/spec.md +0 -54
- package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/tasks.md +0 -11
- package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/design.md +0 -525
- package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/proposal.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/specs/cli-completion/spec.md +0 -300
- package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/tasks.md +0 -81
- package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/design.md +0 -105
- package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/specs/global-config/spec.md +0 -76
- package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/tasks.md +0 -26
- package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/design.md +0 -89
- package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/proposal.md +0 -60
- package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/specs/cli-config/spec.md +0 -213
- package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/tasks.md +0 -28
- package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/proposal.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/specs/cli-completion/spec.md +0 -328
- package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/tasks.md +0 -49
- package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/design.md +0 -197
- package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/proposal.md +0 -18
- package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/specs/artifact-graph/spec.md +0 -103
- package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/tasks.md +0 -61
- package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/design.md +0 -74
- package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/proposal.md +0 -45
- package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/specs/change-creation/spec.md +0 -63
- package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/tasks.md +0 -30
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/design.md +0 -112
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/proposal.md +0 -33
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/specs/cli-artifact-workflow/spec.md +0 -153
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/tasks.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/design.md +0 -149
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/specs/instruction-loader/spec.md +0 -70
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/tasks.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/design.md +0 -129
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/specs/artifact-graph/spec.md +0 -49
- package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/tasks.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/design.md +0 -151
- package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/proposal.md +0 -101
- package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-artifact-workflow/spec.md +0 -109
- package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-view/spec.md +0 -60
- package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/tasks.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/proposal.md +0 -11
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-init/spec.md +0 -105
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-update/spec.md +0 -92
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/tasks.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/proposal.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-init/spec.md +0 -105
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-update/spec.md +0 -92
- package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/tasks.md +0 -13
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/proposal.md +0 -26
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/tasks.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/design.md +0 -147
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/proposal.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/specs/cli-artifact-workflow/spec.md +0 -98
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/tasks.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/design.md +0 -77
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/proposal.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/specs/specs-sync-skill/spec.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/tasks.md +0 -40
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/proposal.md +0 -138
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/specs/cli-artifact-workflow/spec.md +0 -60
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/tasks.md +0 -35
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/design.md +0 -84
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/proposal.md +0 -28
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/specs/opsx-archive-skill/spec.md +0 -122
- package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/tasks.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/design.md +0 -94
- package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/specs/nix-flake-support/spec.md +0 -79
- package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/tasks.md +0 -65
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/design.md +0 -117
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/proposal.md +0 -23
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/specs/flake-update-script/spec.md +0 -93
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/tasks.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/design.md +0 -175
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/proposal.md +0 -37
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/global-config/spec.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/telemetry/spec.md +0 -116
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/tasks.md +0 -47
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/proposal.md +0 -16
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-init/spec.md +0 -75
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-update/spec.md +0 -56
- package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/tasks.md +0 -6
- package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/design.md +0 -206
- package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/proposal.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/specs/ci-nix-validation/spec.md +0 -104
- package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/tasks.md +0 -49
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/README.md +0 -3
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/design.md +0 -70
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/proposal.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/specs/no-changes.md +0 -9
- package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/tasks.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/proposal.md +0 -20
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/specs/cli-feedback/spec.md +0 -188
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/tasks.md +0 -30
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/design.md +0 -115
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/proposal.md +0 -27
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/specs/opsx-onboard-skill/spec.md +0 -162
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/tasks.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/design.md +0 -96
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/proposal.md +0 -48
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/specs/opsx-verify-skill/spec.md +0 -190
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/tasks.md +0 -15
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/design.md +0 -193
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/proposal.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/cli-init/spec.md +0 -176
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/legacy-cleanup/spec.md +0 -158
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/tasks.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/design.md +0 -144
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/proposal.md +0 -36
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/ai-tool-paths/spec.md +0 -63
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/cli-artifact-workflow/spec.md +0 -60
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/command-generation/spec.md +0 -98
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/tasks.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/design.md +0 -665
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/proposal.md +0 -774
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/config-loading/spec.md +0 -119
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/context-injection/spec.md +0 -51
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/rules-injection/spec.md +0 -99
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/schema-resolution/spec.md +0 -83
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/tasks.md +0 -72
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/design.md +0 -117
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/proposal.md +0 -167
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/specs/schema-resolution/spec.md +0 -88
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/tasks.md +0 -28
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/design.md +0 -113
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/proposal.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-fork-command/spec.md +0 -66
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-init-command/spec.md +0 -71
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-validate-command/spec.md +0 -86
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-which-command/spec.md +0 -65
- package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/tasks.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/README.md +0 -3
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/design.md +0 -85
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/proposal.md +0 -38
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/ai-tool-paths/spec.md +0 -12
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/cli-init/spec.md +0 -37
- package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/tasks.md +0 -22
- package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/design.md +0 -208
- package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/proposal.md +0 -142
- package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/openspec-conventions/spec.md +0 -29
- package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/workspace-foundation/spec.md +0 -199
- package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/tasks.md +0 -56
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/design.md +0 -356
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/proposal.md +0 -128
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/cli-artifact-workflow/spec.md +0 -24
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-foundation/spec.md +0 -35
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-links/spec.md +0 -356
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/tasks.md +0 -121
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/design.md +0 -266
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/proposal.md +0 -65
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-foundation/spec.md +0 -76
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-open/spec.md +0 -199
- package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/tasks.md +0 -89
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/design.md +0 -242
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/proposal.md +0 -78
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/artifact-graph/spec.md +0 -36
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/change-creation/spec.md +0 -42
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-artifact-workflow/spec.md +0 -100
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-config/spec.md +0 -55
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-update/spec.md +0 -21
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/openspec-conventions/spec.md +0 -32
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/schema-resolution/spec.md +0 -25
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-change-planning/spec.md +0 -67
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-links/spec.md +0 -163
- package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/tasks.md +0 -133
- package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/design.md +0 -48
- package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/proposal.md +0 -26
- package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/specs/command-generation/spec.md +0 -63
- package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/tasks.md +0 -19
- package/OpenSpec-main/openspec/changes/graceful-status-no-changes/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/graceful-status-no-changes/design.md +0 -38
- package/OpenSpec-main/openspec/changes/graceful-status-no-changes/proposal.md +0 -25
- package/OpenSpec-main/openspec/changes/graceful-status-no-changes/specs/graceful-status-empty/spec.md +0 -27
- package/OpenSpec-main/openspec/changes/graceful-status-no-changes/tasks.md +0 -16
- package/OpenSpec-main/openspec/changes/schema-alias-support/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/schema-alias-support/proposal.md +0 -28
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/design.md +0 -288
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/proposal.md +0 -202
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-init/spec.md +0 -199
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-update/spec.md +0 -177
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/profiles/spec.md +0 -142
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md +0 -42
- package/OpenSpec-main/openspec/changes/simplify-skill-installation/tasks.md +0 -132
- package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/design.md +0 -149
- package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/proposal.md +0 -47
- package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/specs/template-artifact-pipeline/spec.md +0 -89
- package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/tasks.md +0 -41
- package/OpenSpec-main/openspec/changes/workspace-agent-guidance/.openspec.yaml +0 -2
- package/OpenSpec-main/openspec/changes/workspace-agent-guidance/proposal.md +0 -100
- package/OpenSpec-main/openspec/changes/workspace-apply-repo-slice/proposal.md +0 -58
- package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/HISTORICAL_DIRECTION.md +0 -511
- package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.md +0 -266
- package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/README.md +0 -107
- package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/START_HERE.md +0 -105
- package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/proposal.md +0 -62
- package/OpenSpec-main/openspec/changes/workspace-verify-and-archive/proposal.md +0 -57
- package/OpenSpec-main/openspec/config.yaml +0 -36
- package/OpenSpec-main/openspec/explorations/explore-workflow-ux.md +0 -116
- package/OpenSpec-main/openspec/explorations/workspace-architecture.md +0 -857
- package/OpenSpec-main/openspec/explorations/workspace-roadmap.md +0 -367
- package/OpenSpec-main/openspec/explorations/workspace-user-journeys.md +0 -2259
- package/OpenSpec-main/openspec/explorations/workspace-ux-simplification.md +0 -491
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/.initiative.yaml +0 -27
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/README.md +0 -33
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/decisions.md +0 -204
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/direction.md +0 -447
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/questions.md +0 -23
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/roadmap.md +0 -759
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/tasks.md +0 -308
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.md +0 -154
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.md +0 -90
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.md +0 -44
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.md +0 -68
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.md +0 -80
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.md +0 -23
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.md +0 -43
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.md +0 -85
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.md +0 -17
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.md +0 -77
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.md +0 -198
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.md +0 -14
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.md +0 -99
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.md +0 -236
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.md +0 -21
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.md +0 -97
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.md +0 -333
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.md +0 -29
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.md +0 -97
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.md +0 -184
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.md +0 -27
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.md +0 -239
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.md +0 -279
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.md +0 -22
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.md +0 -64
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.md +0 -106
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.md +0 -141
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.md +0 -22
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md +0 -430
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.md +0 -43
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/notes.md +0 -289
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/plan.md +0 -39
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/tasks.md +0 -8
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/evidence.md +0 -45
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/plan.md +0 -150
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/tasks.md +0 -23
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/evidence.md +0 -25
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/plan.md +0 -98
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/tasks.md +0 -25
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/plan.md +0 -37
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/tasks.md +0 -9
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/evidence.md +0 -140
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/plan.md +0 -344
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/tasks.md +0 -39
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/plan.md +0 -26
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/tasks.md +0 -7
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/plan.md +0 -25
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/tasks.md +0 -7
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/evidence.md +0 -397
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/plan.md +0 -180
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/tasks.md +0 -28
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/plan.md +0 -62
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/tasks.md +0 -16
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.md +0 -47
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.md +0 -90
- package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.md +0 -18
- package/OpenSpec-main/openspec/specs/ai-tool-paths/spec.md +0 -63
- package/OpenSpec-main/openspec/specs/artifact-graph/spec.md +0 -165
- package/OpenSpec-main/openspec/specs/change-creation/spec.md +0 -108
- package/OpenSpec-main/openspec/specs/ci-nix-validation/spec.md +0 -107
- package/OpenSpec-main/openspec/specs/cli-archive/spec.md +0 -210
- package/OpenSpec-main/openspec/specs/cli-artifact-workflow/spec.md +0 -398
- package/OpenSpec-main/openspec/specs/cli-change/spec.md +0 -92
- package/OpenSpec-main/openspec/specs/cli-completion/spec.md +0 -432
- package/OpenSpec-main/openspec/specs/cli-config/spec.md +0 -318
- package/OpenSpec-main/openspec/specs/cli-feedback/spec.md +0 -193
- package/OpenSpec-main/openspec/specs/cli-init/spec.md +0 -269
- package/OpenSpec-main/openspec/specs/cli-list/spec.md +0 -103
- package/OpenSpec-main/openspec/specs/cli-show/spec.md +0 -86
- package/OpenSpec-main/openspec/specs/cli-spec/spec.md +0 -88
- package/OpenSpec-main/openspec/specs/cli-update/spec.md +0 -229
- package/OpenSpec-main/openspec/specs/cli-validate/spec.md +0 -219
- package/OpenSpec-main/openspec/specs/cli-view/spec.md +0 -129
- package/OpenSpec-main/openspec/specs/command-generation/spec.md +0 -97
- package/OpenSpec-main/openspec/specs/config-loading/spec.md +0 -122
- package/OpenSpec-main/openspec/specs/context-injection/spec.md +0 -53
- package/OpenSpec-main/openspec/specs/docs-agent-instructions/spec.md +0 -62
- package/OpenSpec-main/openspec/specs/global-config/spec.md +0 -101
- package/OpenSpec-main/openspec/specs/instruction-loader/spec.md +0 -70
- package/OpenSpec-main/openspec/specs/legacy-cleanup/spec.md +0 -163
- package/OpenSpec-main/openspec/specs/openspec-conventions/spec.md +0 -556
- package/OpenSpec-main/openspec/specs/opsx-archive-skill/spec.md +0 -128
- package/OpenSpec-main/openspec/specs/opsx-onboard-skill/spec.md +0 -167
- package/OpenSpec-main/openspec/specs/opsx-verify-skill/spec.md +0 -189
- package/OpenSpec-main/openspec/specs/rules-injection/spec.md +0 -102
- package/OpenSpec-main/openspec/specs/schema-fork-command/spec.md +0 -71
- package/OpenSpec-main/openspec/specs/schema-init-command/spec.md +0 -76
- package/OpenSpec-main/openspec/specs/schema-resolution/spec.md +0 -201
- package/OpenSpec-main/openspec/specs/schema-validate-command/spec.md +0 -91
- package/OpenSpec-main/openspec/specs/schema-which-command/spec.md +0 -70
- package/OpenSpec-main/openspec/specs/specs-sync-skill/spec.md +0 -72
- package/OpenSpec-main/openspec/specs/telemetry/spec.md +0 -122
- package/OpenSpec-main/openspec/specs/workspace-change-planning/spec.md +0 -71
- package/OpenSpec-main/openspec/specs/workspace-foundation/spec.md +0 -279
- package/OpenSpec-main/openspec/specs/workspace-links/spec.md +0 -529
- package/OpenSpec-main/openspec/specs/workspace-open/spec.md +0 -205
- package/OpenSpec-main/openspec-parallel-merge-plan.md +0 -98
- package/OpenSpec-main/package-lock.json +0 -4978
- package/OpenSpec-main/package.json +0 -84
- package/OpenSpec-main/pnpm-lock.yaml +0 -3187
- package/OpenSpec-main/schemas/spec-driven/schema.yaml +0 -153
- package/OpenSpec-main/schemas/spec-driven/templates/design.md +0 -19
- package/OpenSpec-main/schemas/spec-driven/templates/proposal.md +0 -23
- package/OpenSpec-main/schemas/spec-driven/templates/spec.md +0 -8
- package/OpenSpec-main/schemas/spec-driven/templates/tasks.md +0 -9
- package/OpenSpec-main/schemas/workspace-planning/schema.yaml +0 -72
- package/OpenSpec-main/schemas/workspace-planning/templates/design.md +0 -33
- package/OpenSpec-main/schemas/workspace-planning/templates/proposal.md +0 -28
- package/OpenSpec-main/schemas/workspace-planning/templates/spec.md +0 -9
- package/OpenSpec-main/schemas/workspace-planning/templates/tasks.md +0 -15
- package/OpenSpec-main/scripts/README.md +0 -37
- package/OpenSpec-main/scripts/pack-version-check.mjs +0 -111
- package/OpenSpec-main/scripts/postinstall.js +0 -83
- package/OpenSpec-main/scripts/test-postinstall.sh +0 -57
- package/OpenSpec-main/scripts/update-flake.sh +0 -128
- package/OpenSpec-main/test/cli-e2e/basic.test.ts +0 -205
- package/OpenSpec-main/test/commands/artifact-workflow.test.ts +0 -1063
- package/OpenSpec-main/test/commands/change-initiative-link.test.ts +0 -532
- package/OpenSpec-main/test/commands/change.interactive-show.test.ts +0 -45
- package/OpenSpec-main/test/commands/change.interactive-validate.test.ts +0 -48
- package/OpenSpec-main/test/commands/completion.test.ts +0 -278
- package/OpenSpec-main/test/commands/config-profile.test.ts +0 -532
- package/OpenSpec-main/test/commands/config.test.ts +0 -285
- package/OpenSpec-main/test/commands/context-store.test.ts +0 -692
- package/OpenSpec-main/test/commands/feedback.test.ts +0 -429
- package/OpenSpec-main/test/commands/initiative.test.ts +0 -907
- package/OpenSpec-main/test/commands/schema.test.ts +0 -467
- package/OpenSpec-main/test/commands/show.test.ts +0 -123
- package/OpenSpec-main/test/commands/spec.interactive-show.test.ts +0 -44
- package/OpenSpec-main/test/commands/spec.interactive-validate.test.ts +0 -44
- package/OpenSpec-main/test/commands/spec.test.ts +0 -324
- package/OpenSpec-main/test/commands/validate.enriched-output.test.ts +0 -49
- package/OpenSpec-main/test/commands/validate.test.ts +0 -147
- package/OpenSpec-main/test/commands/workspace-initiative-open.test.ts +0 -638
- package/OpenSpec-main/test/commands/workspace-open.test.ts +0 -123
- package/OpenSpec-main/test/commands/workspace.interactive.test.ts +0 -696
- package/OpenSpec-main/test/commands/workspace.test.ts +0 -1812
- package/OpenSpec-main/test/core/archive.test.ts +0 -869
- package/OpenSpec-main/test/core/artifact-graph/graph.test.ts +0 -268
- package/OpenSpec-main/test/core/artifact-graph/instruction-loader.test.ts +0 -609
- package/OpenSpec-main/test/core/artifact-graph/outputs.test.ts +0 -175
- package/OpenSpec-main/test/core/artifact-graph/resolver.test.ts +0 -651
- package/OpenSpec-main/test/core/artifact-graph/schema.test.ts +0 -207
- package/OpenSpec-main/test/core/artifact-graph/state.test.ts +0 -174
- package/OpenSpec-main/test/core/artifact-graph/workflow.integration.test.ts +0 -182
- package/OpenSpec-main/test/core/available-tools.test.ts +0 -167
- package/OpenSpec-main/test/core/collections/initiatives/operations.test.ts +0 -342
- package/OpenSpec-main/test/core/collections/initiatives/resolution.test.ts +0 -21
- package/OpenSpec-main/test/core/collections/initiatives/schema.test.ts +0 -201
- package/OpenSpec-main/test/core/collections/initiatives/templates.test.ts +0 -74
- package/OpenSpec-main/test/core/collections/runtime.test.ts +0 -214
- package/OpenSpec-main/test/core/command-generation/adapters.test.ts +0 -710
- package/OpenSpec-main/test/core/command-generation/generator.test.ts +0 -110
- package/OpenSpec-main/test/core/command-generation/registry.test.ts +0 -108
- package/OpenSpec-main/test/core/command-generation/types.test.ts +0 -79
- package/OpenSpec-main/test/core/commands/change-command.list.test.ts +0 -76
- package/OpenSpec-main/test/core/commands/change-command.show-validate.test.ts +0 -111
- package/OpenSpec-main/test/core/completions/command-registry.test.ts +0 -201
- package/OpenSpec-main/test/core/completions/completion-provider.test.ts +0 -288
- package/OpenSpec-main/test/core/completions/generators/bash-generator.test.ts +0 -586
- package/OpenSpec-main/test/core/completions/generators/fish-generator.test.ts +0 -549
- package/OpenSpec-main/test/core/completions/generators/powershell-generator.test.ts +0 -621
- package/OpenSpec-main/test/core/completions/generators/zsh-generator.test.ts +0 -425
- package/OpenSpec-main/test/core/completions/installers/bash-installer.test.ts +0 -484
- package/OpenSpec-main/test/core/completions/installers/fish-installer.test.ts +0 -321
- package/OpenSpec-main/test/core/completions/installers/powershell-installer.test.ts +0 -824
- package/OpenSpec-main/test/core/completions/installers/zsh-installer.test.ts +0 -750
- package/OpenSpec-main/test/core/config-schema.test.ts +0 -340
- package/OpenSpec-main/test/core/context-store/foundation.test.ts +0 -364
- package/OpenSpec-main/test/core/context-store/registry.test.ts +0 -599
- package/OpenSpec-main/test/core/converters/json-converter.test.ts +0 -184
- package/OpenSpec-main/test/core/global-config.test.ts +0 -371
- package/OpenSpec-main/test/core/init.test.ts +0 -786
- package/OpenSpec-main/test/core/legacy-cleanup.test.ts +0 -1162
- package/OpenSpec-main/test/core/list.test.ts +0 -165
- package/OpenSpec-main/test/core/migration.test.ts +0 -150
- package/OpenSpec-main/test/core/parsers/change-parser.test.ts +0 -52
- package/OpenSpec-main/test/core/parsers/markdown-parser.test.ts +0 -355
- package/OpenSpec-main/test/core/parsers/requirement-blocks.test.ts +0 -46
- package/OpenSpec-main/test/core/planning-home.test.ts +0 -120
- package/OpenSpec-main/test/core/profile-sync-drift.test.ts +0 -92
- package/OpenSpec-main/test/core/profiles.test.ts +0 -63
- package/OpenSpec-main/test/core/project-config.test.ts +0 -610
- package/OpenSpec-main/test/core/shared/skill-generation.test.ts +0 -301
- package/OpenSpec-main/test/core/shared/tool-detection.test.ts +0 -333
- package/OpenSpec-main/test/core/templates/skill-templates-parity.test.ts +0 -172
- package/OpenSpec-main/test/core/update.test.ts +0 -1810
- package/OpenSpec-main/test/core/validation.enriched-messages.test.ts +0 -74
- package/OpenSpec-main/test/core/validation.test.ts +0 -680
- package/OpenSpec-main/test/core/view.test.ts +0 -129
- package/OpenSpec-main/test/core/workspace/foundation.test.ts +0 -694
- package/OpenSpec-main/test/core/workspace/legacy-state.test.ts +0 -221
- package/OpenSpec-main/test/core/workspace/skills.test.ts +0 -69
- package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/proposal.md +0 -7
- package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/specs/alpha/spec.md +0 -8
- package/OpenSpec-main/test/fixtures/tmp-init/openspec/specs/alpha/spec.md +0 -12
- package/OpenSpec-main/test/helpers/path-env.ts +0 -26
- package/OpenSpec-main/test/helpers/run-cli.ts +0 -150
- package/OpenSpec-main/test/prompts/searchable-multi-select.test.ts +0 -220
- package/OpenSpec-main/test/specs/source-specs-normalization.test.ts +0 -63
- package/OpenSpec-main/test/telemetry/config.test.ts +0 -298
- package/OpenSpec-main/test/telemetry/index.test.ts +0 -219
- package/OpenSpec-main/test/utils/change-metadata.test.ts +0 -368
- package/OpenSpec-main/test/utils/change-utils.test.ts +0 -201
- package/OpenSpec-main/test/utils/command-references.test.ts +0 -83
- package/OpenSpec-main/test/utils/file-system.test.ts +0 -322
- package/OpenSpec-main/test/utils/interactive.test.ts +0 -125
- package/OpenSpec-main/test/utils/marker-updates.test.ts +0 -448
- package/OpenSpec-main/test/utils/shell-detection.test.ts +0 -185
- package/OpenSpec-main/vitest.config.ts +0 -47
- package/OpenSpec-main/vitest.setup.ts +0 -15
- package/Scanner CLI Inteligente para Projetos.md +0 -433
|
@@ -1,1063 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { promises as fs } from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import os from 'os';
|
|
5
|
-
import { runCLI } from '../helpers/run-cli.js';
|
|
6
|
-
import { FileSystemUtils } from '../../src/utils/file-system.js';
|
|
7
|
-
|
|
8
|
-
describe('artifact-workflow CLI commands', () => {
|
|
9
|
-
let tempDir: string;
|
|
10
|
-
let changesDir: string;
|
|
11
|
-
|
|
12
|
-
const canonical = (targetPath: string): string => FileSystemUtils.canonicalizeExistingPath(targetPath);
|
|
13
|
-
|
|
14
|
-
beforeEach(async () => {
|
|
15
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'openspec-artifact-workflow-'));
|
|
16
|
-
changesDir = path.join(tempDir, 'openspec', 'changes');
|
|
17
|
-
await fs.mkdir(changesDir, { recursive: true });
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
afterEach(async () => {
|
|
21
|
-
if (tempDir) {
|
|
22
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Gets combined output from CLI result (ora outputs to stdout).
|
|
28
|
-
*/
|
|
29
|
-
function getOutput(result: { stdout: string; stderr: string }): string {
|
|
30
|
-
return result.stdout + result.stderr;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Normalizes path separators to forward slashes for cross-platform assertions.
|
|
35
|
-
*/
|
|
36
|
-
function normalizePaths(str: string): string {
|
|
37
|
-
return str.replace(/\\/g, '/');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Creates a test change with the specified artifacts completed.
|
|
42
|
-
* Note: An "active" change requires at least a proposal.md file to be detected.
|
|
43
|
-
* If no artifacts are specified, we create an empty proposal to make it detectable.
|
|
44
|
-
*/
|
|
45
|
-
async function createTestChange(
|
|
46
|
-
changeName: string,
|
|
47
|
-
artifacts: ('proposal' | 'design' | 'specs' | 'tasks')[] = []
|
|
48
|
-
): Promise<string> {
|
|
49
|
-
const changeDir = path.join(changesDir, changeName);
|
|
50
|
-
await fs.mkdir(changeDir, { recursive: true });
|
|
51
|
-
|
|
52
|
-
// Always create proposal.md for the change to be detected as active
|
|
53
|
-
// Content varies based on whether 'proposal' is in artifacts list
|
|
54
|
-
const proposalContent = artifacts.includes('proposal')
|
|
55
|
-
? '## Why\nTest proposal content that is long enough.\n\n## What Changes\n- **test:** Something'
|
|
56
|
-
: '## Why\nMinimal proposal.\n\n## What Changes\n- **test:** Placeholder';
|
|
57
|
-
await fs.writeFile(path.join(changeDir, 'proposal.md'), proposalContent);
|
|
58
|
-
|
|
59
|
-
if (artifacts.includes('design')) {
|
|
60
|
-
await fs.writeFile(path.join(changeDir, 'design.md'), '# Design\n\nTechnical design.');
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (artifacts.includes('specs')) {
|
|
64
|
-
// specs artifact uses glob pattern "specs/*.md" - files directly in specs/ directory
|
|
65
|
-
const specsDir = path.join(changeDir, 'specs');
|
|
66
|
-
await fs.mkdir(specsDir, { recursive: true });
|
|
67
|
-
await fs.writeFile(path.join(specsDir, 'test-spec.md'), '## Purpose\nTest spec.');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (artifacts.includes('tasks')) {
|
|
71
|
-
await fs.writeFile(path.join(changeDir, 'tasks.md'), '## Tasks\n- [ ] Task 1');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return changeDir;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
describe('status command', () => {
|
|
78
|
-
it('shows status for scaffolded change without proposal.md', async () => {
|
|
79
|
-
// Create empty change directory (no proposal.md)
|
|
80
|
-
const changeDir = path.join(changesDir, 'scaffolded-change');
|
|
81
|
-
await fs.mkdir(changeDir, { recursive: true });
|
|
82
|
-
|
|
83
|
-
const result = await runCLI(['status', '--change', 'scaffolded-change'], { cwd: tempDir });
|
|
84
|
-
expect(result.exitCode).toBe(0);
|
|
85
|
-
expect(result.stdout).toContain('scaffolded-change');
|
|
86
|
-
expect(result.stdout).toContain('0/4 artifacts complete');
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('shows status for a change with proposal only', async () => {
|
|
90
|
-
// createTestChange always creates proposal.md, so this has 1 artifact complete
|
|
91
|
-
await createTestChange('minimal-change');
|
|
92
|
-
|
|
93
|
-
const result = await runCLI(['status', '--change', 'minimal-change'], { cwd: tempDir });
|
|
94
|
-
expect(result.exitCode).toBe(0);
|
|
95
|
-
expect(result.stdout).toContain('minimal-change');
|
|
96
|
-
expect(result.stdout).toContain('spec-driven');
|
|
97
|
-
expect(result.stdout).toContain('1/4 artifacts complete');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('shows status for a change with proposal and design', async () => {
|
|
101
|
-
await createTestChange('partial-change', ['proposal', 'design']);
|
|
102
|
-
|
|
103
|
-
const result = await runCLI(['status', '--change', 'partial-change'], { cwd: tempDir });
|
|
104
|
-
expect(result.exitCode).toBe(0);
|
|
105
|
-
expect(result.stdout).toContain('2/4 artifacts complete');
|
|
106
|
-
expect(result.stdout).toContain('[x]');
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it('outputs JSON when --json flag is used', async () => {
|
|
110
|
-
await createTestChange('json-change', ['proposal', 'design']);
|
|
111
|
-
|
|
112
|
-
const result = await runCLI(['status', '--change', 'json-change', '--json'], {
|
|
113
|
-
cwd: tempDir,
|
|
114
|
-
});
|
|
115
|
-
expect(result.exitCode).toBe(0);
|
|
116
|
-
expect(result.stderr).toBe('');
|
|
117
|
-
|
|
118
|
-
const json = JSON.parse(result.stdout);
|
|
119
|
-
expect(json.changeName).toBe('json-change');
|
|
120
|
-
expect(json.schemaName).toBe('spec-driven');
|
|
121
|
-
expect(json.isComplete).toBe(false);
|
|
122
|
-
expect(Array.isArray(json.artifacts)).toBe(true);
|
|
123
|
-
expect(json.artifacts).toHaveLength(4);
|
|
124
|
-
|
|
125
|
-
const proposalArtifact = json.artifacts.find((a: any) => a.id === 'proposal');
|
|
126
|
-
expect(proposalArtifact.status).toBe('done');
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('shows complete status when all artifacts are done', async () => {
|
|
130
|
-
await createTestChange('complete-change', ['proposal', 'design', 'specs', 'tasks']);
|
|
131
|
-
|
|
132
|
-
const result = await runCLI(['status', '--change', 'complete-change'], { cwd: tempDir });
|
|
133
|
-
expect(result.exitCode).toBe(0);
|
|
134
|
-
expect(result.stdout).toContain('4/4 artifacts complete');
|
|
135
|
-
expect(result.stdout).toContain('All artifacts complete!');
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('exits gracefully when no changes exist', async () => {
|
|
139
|
-
const result = await runCLI(['status'], { cwd: tempDir });
|
|
140
|
-
expect(result.exitCode).toBe(0);
|
|
141
|
-
expect(result.stdout).toContain('No active changes');
|
|
142
|
-
expect(result.stdout).toContain('openspec new change');
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it('exits gracefully with JSON when no changes exist', async () => {
|
|
146
|
-
const result = await runCLI(['status', '--json'], { cwd: tempDir });
|
|
147
|
-
expect(result.exitCode).toBe(0);
|
|
148
|
-
|
|
149
|
-
const json = JSON.parse(result.stdout);
|
|
150
|
-
expect(json.changes).toEqual([]);
|
|
151
|
-
expect(json.message).toBe('No active changes.');
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('errors when --change is missing and lists available changes', async () => {
|
|
155
|
-
await createTestChange('some-change');
|
|
156
|
-
|
|
157
|
-
const result = await runCLI(['status'], { cwd: tempDir });
|
|
158
|
-
expect(result.exitCode).toBe(1);
|
|
159
|
-
const output = getOutput(result);
|
|
160
|
-
expect(output).toContain('Missing required option --change');
|
|
161
|
-
expect(output).toContain('some-change');
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('errors for unknown change name and lists available changes', async () => {
|
|
165
|
-
await createTestChange('existing-change');
|
|
166
|
-
|
|
167
|
-
const result = await runCLI(['status', '--change', 'nonexistent'], { cwd: tempDir });
|
|
168
|
-
expect(result.exitCode).toBe(1);
|
|
169
|
-
const output = getOutput(result);
|
|
170
|
-
expect(output).toContain("Change 'nonexistent' not found");
|
|
171
|
-
expect(output).toContain('existing-change');
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('supports --schema option', async () => {
|
|
175
|
-
await createTestChange('schema-change');
|
|
176
|
-
|
|
177
|
-
const result = await runCLI(['status', '--change', 'schema-change', '--schema', 'spec-driven'], {
|
|
178
|
-
cwd: tempDir,
|
|
179
|
-
});
|
|
180
|
-
expect(result.exitCode).toBe(0);
|
|
181
|
-
expect(result.stdout).toContain('spec-driven');
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('errors for unknown schema', async () => {
|
|
185
|
-
await createTestChange('test-change');
|
|
186
|
-
|
|
187
|
-
const result = await runCLI(['status', '--change', 'test-change', '--schema', 'unknown'], {
|
|
188
|
-
cwd: tempDir,
|
|
189
|
-
});
|
|
190
|
-
expect(result.exitCode).toBe(1);
|
|
191
|
-
const output = getOutput(result);
|
|
192
|
-
expect(output).toContain("Schema 'unknown' not found");
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it('rejects path traversal in change name', async () => {
|
|
196
|
-
const result = await runCLI(['status', '--change', '../foo'], { cwd: tempDir });
|
|
197
|
-
expect(result.exitCode).toBe(1);
|
|
198
|
-
const output = getOutput(result);
|
|
199
|
-
expect(output).toContain('Invalid change name');
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('rejects absolute path in change name', async () => {
|
|
203
|
-
const result = await runCLI(['status', '--change', '/etc/passwd'], { cwd: tempDir });
|
|
204
|
-
expect(result.exitCode).toBe(1);
|
|
205
|
-
const output = getOutput(result);
|
|
206
|
-
expect(output).toContain('Invalid change name');
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('rejects slashes in change name', async () => {
|
|
210
|
-
const result = await runCLI(['status', '--change', 'foo/bar'], { cwd: tempDir });
|
|
211
|
-
expect(result.exitCode).toBe(1);
|
|
212
|
-
const output = getOutput(result);
|
|
213
|
-
expect(output).toContain('Invalid change name');
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
describe('instructions command', () => {
|
|
218
|
-
it('shows instructions for proposal on scaffolded change', async () => {
|
|
219
|
-
// Create empty change directory (no proposal.md)
|
|
220
|
-
const changeDir = path.join(changesDir, 'scaffolded-change');
|
|
221
|
-
await fs.mkdir(changeDir, { recursive: true });
|
|
222
|
-
|
|
223
|
-
const result = await runCLI(['instructions', 'proposal', '--change', 'scaffolded-change'], {
|
|
224
|
-
cwd: tempDir,
|
|
225
|
-
});
|
|
226
|
-
expect(result.exitCode).toBe(0);
|
|
227
|
-
expect(result.stdout).toContain('<artifact id="proposal"');
|
|
228
|
-
expect(result.stdout).toContain('proposal.md');
|
|
229
|
-
expect(result.stdout).toContain('<template>');
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('shows instructions for design artifact', async () => {
|
|
233
|
-
await createTestChange('instr-change');
|
|
234
|
-
|
|
235
|
-
const result = await runCLI(['instructions', 'design', '--change', 'instr-change'], {
|
|
236
|
-
cwd: tempDir,
|
|
237
|
-
});
|
|
238
|
-
expect(result.exitCode).toBe(0);
|
|
239
|
-
expect(result.stdout).toContain('<artifact id="design"');
|
|
240
|
-
expect(result.stdout).toContain('design.md');
|
|
241
|
-
expect(result.stdout).toContain('<template>');
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('shows blocked warning for artifact with unmet dependencies', async () => {
|
|
245
|
-
// tasks depends on design and specs, which are not done yet
|
|
246
|
-
await createTestChange('blocked-change');
|
|
247
|
-
|
|
248
|
-
const result = await runCLI(['instructions', 'tasks', '--change', 'blocked-change'], {
|
|
249
|
-
cwd: tempDir,
|
|
250
|
-
});
|
|
251
|
-
expect(result.exitCode).toBe(0);
|
|
252
|
-
expect(result.stdout).toContain('<warning>');
|
|
253
|
-
expect(result.stdout).toContain('status="missing"');
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
it('outputs JSON for instructions', async () => {
|
|
257
|
-
await createTestChange('json-instr', ['proposal']);
|
|
258
|
-
|
|
259
|
-
const result = await runCLI(['instructions', 'design', '--change', 'json-instr', '--json'], {
|
|
260
|
-
cwd: tempDir,
|
|
261
|
-
});
|
|
262
|
-
expect(result.exitCode).toBe(0);
|
|
263
|
-
expect(result.stderr).toBe('');
|
|
264
|
-
|
|
265
|
-
const json = JSON.parse(result.stdout);
|
|
266
|
-
expect(json.artifactId).toBe('design');
|
|
267
|
-
expect(json.outputPath).toContain('design.md');
|
|
268
|
-
expect(typeof json.template).toBe('string');
|
|
269
|
-
expect(Array.isArray(json.dependencies)).toBe(true);
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
it('errors when artifact argument is missing', async () => {
|
|
273
|
-
await createTestChange('test-change');
|
|
274
|
-
|
|
275
|
-
const result = await runCLI(['instructions', '--change', 'test-change'], { cwd: tempDir });
|
|
276
|
-
expect(result.exitCode).toBe(1);
|
|
277
|
-
const output = getOutput(result);
|
|
278
|
-
expect(output).toContain('Missing required argument <artifact>');
|
|
279
|
-
expect(output).toContain('Valid artifacts');
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('errors for unknown artifact', async () => {
|
|
283
|
-
await createTestChange('test-change');
|
|
284
|
-
|
|
285
|
-
const result = await runCLI(['instructions', 'unknown-artifact', '--change', 'test-change'], {
|
|
286
|
-
cwd: tempDir,
|
|
287
|
-
});
|
|
288
|
-
expect(result.exitCode).toBe(1);
|
|
289
|
-
const output = getOutput(result);
|
|
290
|
-
expect(output).toContain("Artifact 'unknown-artifact' not found");
|
|
291
|
-
expect(output).toContain('Valid artifacts');
|
|
292
|
-
});
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
describe('templates command', () => {
|
|
296
|
-
it('shows template paths for default schema', async () => {
|
|
297
|
-
const result = await runCLI(['templates'], { cwd: tempDir });
|
|
298
|
-
expect(result.exitCode).toBe(0);
|
|
299
|
-
expect(result.stdout).toContain('Schema: spec-driven');
|
|
300
|
-
expect(result.stdout).toContain('proposal:');
|
|
301
|
-
expect(result.stdout).toContain('design:');
|
|
302
|
-
expect(result.stdout).toContain('specs:');
|
|
303
|
-
expect(result.stdout).toContain('tasks:');
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it('shows template paths for specified schema', async () => {
|
|
307
|
-
const result = await runCLI(['templates', '--schema', 'spec-driven'], { cwd: tempDir });
|
|
308
|
-
expect(result.exitCode).toBe(0);
|
|
309
|
-
expect(result.stdout).toContain('Schema: spec-driven');
|
|
310
|
-
expect(result.stdout).toContain('proposal:');
|
|
311
|
-
expect(result.stdout).toContain('design:');
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('outputs JSON mapping of templates', async () => {
|
|
315
|
-
const result = await runCLI(['templates', '--json'], { cwd: tempDir });
|
|
316
|
-
expect(result.exitCode).toBe(0);
|
|
317
|
-
expect(result.stderr).toBe('');
|
|
318
|
-
|
|
319
|
-
const json = JSON.parse(result.stdout);
|
|
320
|
-
expect(json.proposal).toBeDefined();
|
|
321
|
-
expect(json.proposal.path).toContain('proposal.md');
|
|
322
|
-
expect(json.proposal.source).toBe('package');
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it('errors for unknown schema', async () => {
|
|
326
|
-
const result = await runCLI(['templates', '--schema', 'nonexistent'], { cwd: tempDir });
|
|
327
|
-
expect(result.exitCode).toBe(1);
|
|
328
|
-
const output = getOutput(result);
|
|
329
|
-
expect(output).toContain("Schema 'nonexistent' not found");
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
describe('new change command', () => {
|
|
334
|
-
it('creates a new change directory', async () => {
|
|
335
|
-
const result = await runCLI(['new', 'change', 'my-new-feature'], { cwd: tempDir });
|
|
336
|
-
expect(result.exitCode).toBe(0);
|
|
337
|
-
const output = getOutput(result);
|
|
338
|
-
expect(output).toContain("Created change 'my-new-feature'");
|
|
339
|
-
|
|
340
|
-
const changeDir = path.join(changesDir, 'my-new-feature');
|
|
341
|
-
const stat = await fs.stat(changeDir);
|
|
342
|
-
expect(stat.isDirectory()).toBe(true);
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it('creates workspace-planning changes under the workspace root without touching linked repos', async () => {
|
|
346
|
-
const workspaceEnv = {
|
|
347
|
-
XDG_DATA_HOME: path.join(tempDir, 'data'),
|
|
348
|
-
XDG_CONFIG_HOME: path.join(tempDir, 'config'),
|
|
349
|
-
OPEN_SPEC_INTERACTIVE: '0',
|
|
350
|
-
OPENSPEC_TELEMETRY: '0',
|
|
351
|
-
};
|
|
352
|
-
const api = path.join(tempDir, 'linked-api');
|
|
353
|
-
await fs.mkdir(path.join(api, 'openspec', 'specs'), { recursive: true });
|
|
354
|
-
const apiEntriesBefore = (await fs.readdir(api)).sort();
|
|
355
|
-
|
|
356
|
-
const setup = await runCLI(
|
|
357
|
-
[
|
|
358
|
-
'workspace',
|
|
359
|
-
'setup',
|
|
360
|
-
'--no-interactive',
|
|
361
|
-
'--json',
|
|
362
|
-
'--name',
|
|
363
|
-
'platform',
|
|
364
|
-
'--link',
|
|
365
|
-
`api=${api}`,
|
|
366
|
-
],
|
|
367
|
-
{ cwd: tempDir, env: workspaceEnv }
|
|
368
|
-
);
|
|
369
|
-
expect(setup.exitCode).toBe(0);
|
|
370
|
-
const workspaceRoot = JSON.parse(setup.stdout).workspace.root;
|
|
371
|
-
|
|
372
|
-
const create = await runCLI(
|
|
373
|
-
[
|
|
374
|
-
'new',
|
|
375
|
-
'change',
|
|
376
|
-
'cross-repo-login',
|
|
377
|
-
'--goal',
|
|
378
|
-
'Unify login across API and web',
|
|
379
|
-
'--areas',
|
|
380
|
-
'api',
|
|
381
|
-
],
|
|
382
|
-
{ cwd: workspaceRoot, env: workspaceEnv }
|
|
383
|
-
);
|
|
384
|
-
expect(create.exitCode).toBe(0);
|
|
385
|
-
const createOutput = getOutput(create);
|
|
386
|
-
expect(createOutput).toContain('workspace change');
|
|
387
|
-
expect(normalizePaths(createOutput)).toContain('changes/cross-repo-login');
|
|
388
|
-
|
|
389
|
-
const changeDir = path.join(workspaceRoot, 'changes', 'cross-repo-login');
|
|
390
|
-
const metadata = await fs.readFile(path.join(changeDir, '.openspec.yaml'), 'utf-8');
|
|
391
|
-
expect(metadata).toContain('schema: workspace-planning');
|
|
392
|
-
expect(metadata).toContain('goal: Unify login across API and web');
|
|
393
|
-
expect(metadata).toContain('affected_areas:');
|
|
394
|
-
expect(metadata).toContain('- api');
|
|
395
|
-
expect((await fs.readdir(api)).sort()).toEqual(apiEntriesBefore);
|
|
396
|
-
await expect(fs.stat(path.join(api, 'openspec', 'changes'))).rejects.toMatchObject({
|
|
397
|
-
code: 'ENOENT',
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
it('resolves nested workspace-planning specs as workspace-scoped paths', async () => {
|
|
402
|
-
const workspaceEnv = {
|
|
403
|
-
XDG_DATA_HOME: path.join(tempDir, 'data'),
|
|
404
|
-
XDG_CONFIG_HOME: path.join(tempDir, 'config'),
|
|
405
|
-
OPEN_SPEC_INTERACTIVE: '0',
|
|
406
|
-
OPENSPEC_TELEMETRY: '0',
|
|
407
|
-
};
|
|
408
|
-
const api = path.join(tempDir, 'linked-api');
|
|
409
|
-
await fs.mkdir(api, { recursive: true });
|
|
410
|
-
|
|
411
|
-
const setup = await runCLI(
|
|
412
|
-
[
|
|
413
|
-
'workspace',
|
|
414
|
-
'setup',
|
|
415
|
-
'--no-interactive',
|
|
416
|
-
'--json',
|
|
417
|
-
'--name',
|
|
418
|
-
'platform',
|
|
419
|
-
'--link',
|
|
420
|
-
`api=${api}`,
|
|
421
|
-
],
|
|
422
|
-
{ cwd: tempDir, env: workspaceEnv }
|
|
423
|
-
);
|
|
424
|
-
expect(setup.exitCode).toBe(0);
|
|
425
|
-
const workspaceRoot = JSON.parse(setup.stdout).workspace.root;
|
|
426
|
-
|
|
427
|
-
const create = await runCLI(
|
|
428
|
-
['new', 'change', 'nested-workspace-spec', '--goal', 'Plan API login', '--areas', 'api'],
|
|
429
|
-
{ cwd: workspaceRoot, env: workspaceEnv }
|
|
430
|
-
);
|
|
431
|
-
expect(create.exitCode).toBe(0);
|
|
432
|
-
|
|
433
|
-
const changeDir = path.join(workspaceRoot, 'changes', 'nested-workspace-spec');
|
|
434
|
-
const specPath = path.join(changeDir, 'specs', 'api', 'login', 'spec.md');
|
|
435
|
-
await fs.mkdir(path.dirname(specPath), { recursive: true });
|
|
436
|
-
await fs.writeFile(
|
|
437
|
-
specPath,
|
|
438
|
-
'## ADDED Requirements\n\n### Requirement: API login\n\n#### Scenario: Valid login\n- **WHEN** credentials are valid\n- **THEN** login succeeds\n'
|
|
439
|
-
);
|
|
440
|
-
|
|
441
|
-
const status = await runCLI(['status', '--change', 'nested-workspace-spec', '--json'], {
|
|
442
|
-
cwd: workspaceRoot,
|
|
443
|
-
env: workspaceEnv,
|
|
444
|
-
});
|
|
445
|
-
expect(status.exitCode).toBe(0);
|
|
446
|
-
const statusJson = JSON.parse(status.stdout);
|
|
447
|
-
expect(statusJson.schemaName).toBe('workspace-planning');
|
|
448
|
-
expect(statusJson.planningHome.kind).toBe('workspace');
|
|
449
|
-
expect(statusJson.affectedAreas.known).toEqual(['api']);
|
|
450
|
-
expect(statusJson.actionContext).toEqual(
|
|
451
|
-
expect.objectContaining({
|
|
452
|
-
mode: 'workspace-planning',
|
|
453
|
-
sourceOfTruth: 'workspace-local',
|
|
454
|
-
allowedEditRoots: [],
|
|
455
|
-
constraints: expect.arrayContaining([
|
|
456
|
-
'Treat workspace-local planning artifacts as compatibility context for this local view.',
|
|
457
|
-
'Use initiatives for durable coordination when initiative context exists.',
|
|
458
|
-
'Treat linked repos and folders as context until an explicit edit root is selected.',
|
|
459
|
-
]),
|
|
460
|
-
})
|
|
461
|
-
);
|
|
462
|
-
expect(statusJson.actionContext.constraints).not.toContain(
|
|
463
|
-
'Use workspace-level planning artifacts as the source of truth.'
|
|
464
|
-
);
|
|
465
|
-
expect(statusJson.artifactPaths.specs.existingOutputPaths).toEqual([canonical(specPath)]);
|
|
466
|
-
|
|
467
|
-
const instructions = await runCLI(
|
|
468
|
-
['instructions', 'specs', '--change', 'nested-workspace-spec', '--json'],
|
|
469
|
-
{ cwd: workspaceRoot, env: workspaceEnv }
|
|
470
|
-
);
|
|
471
|
-
expect(instructions.exitCode).toBe(0);
|
|
472
|
-
const instructionsJson = JSON.parse(instructions.stdout);
|
|
473
|
-
expect(instructionsJson.planningHome.kind).toBe('workspace');
|
|
474
|
-
expect(normalizePaths(instructionsJson.resolvedOutputPath)).toContain(
|
|
475
|
-
'changes/nested-workspace-spec/specs/**/*.md'
|
|
476
|
-
);
|
|
477
|
-
expect(instructionsJson.existingOutputPaths).toEqual([canonical(specPath)]);
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
it('creates README.md when --description is provided', async () => {
|
|
481
|
-
const result = await runCLI(
|
|
482
|
-
['new', 'change', 'described-feature', '--description', 'This is a test feature'],
|
|
483
|
-
{ cwd: tempDir }
|
|
484
|
-
);
|
|
485
|
-
expect(result.exitCode).toBe(0);
|
|
486
|
-
|
|
487
|
-
const readmePath = path.join(changesDir, 'described-feature', 'README.md');
|
|
488
|
-
const content = await fs.readFile(readmePath, 'utf-8');
|
|
489
|
-
expect(content).toContain('described-feature');
|
|
490
|
-
expect(content).toContain('This is a test feature');
|
|
491
|
-
});
|
|
492
|
-
|
|
493
|
-
it('errors for invalid change name with spaces', async () => {
|
|
494
|
-
const result = await runCLI(['new', 'change', 'invalid name'], { cwd: tempDir });
|
|
495
|
-
expect(result.exitCode).toBe(1);
|
|
496
|
-
const output = getOutput(result);
|
|
497
|
-
expect(output).toContain('Error');
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
it('errors for duplicate change name', async () => {
|
|
501
|
-
await createTestChange('existing-change');
|
|
502
|
-
|
|
503
|
-
const result = await runCLI(['new', 'change', 'existing-change'], { cwd: tempDir });
|
|
504
|
-
expect(result.exitCode).toBe(1);
|
|
505
|
-
const output = getOutput(result);
|
|
506
|
-
expect(output).toContain('exists');
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
it('errors when name argument is missing', async () => {
|
|
510
|
-
const result = await runCLI(['new', 'change'], { cwd: tempDir });
|
|
511
|
-
expect(result.exitCode).toBe(1);
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
describe('instructions apply command', () => {
|
|
516
|
-
it('shows apply instructions for spec-driven schema with tasks', async () => {
|
|
517
|
-
await createTestChange('apply-change', ['proposal', 'design', 'specs', 'tasks']);
|
|
518
|
-
|
|
519
|
-
const result = await runCLI(['instructions', 'apply', '--change', 'apply-change'], {
|
|
520
|
-
cwd: tempDir,
|
|
521
|
-
});
|
|
522
|
-
expect(result.exitCode).toBe(0);
|
|
523
|
-
expect(result.stdout).toContain('## Apply: apply-change');
|
|
524
|
-
expect(result.stdout).toContain('Schema: spec-driven');
|
|
525
|
-
expect(result.stdout).toContain('### Context Files');
|
|
526
|
-
expect(result.stdout).toContain('### Instruction');
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it('shows blocked state when required artifacts are missing', async () => {
|
|
530
|
-
// Only create proposal - missing tasks (required by spec-driven apply block)
|
|
531
|
-
await createTestChange('blocked-apply', ['proposal']);
|
|
532
|
-
|
|
533
|
-
const result = await runCLI(['instructions', 'apply', '--change', 'blocked-apply'], {
|
|
534
|
-
cwd: tempDir,
|
|
535
|
-
});
|
|
536
|
-
expect(result.exitCode).toBe(0);
|
|
537
|
-
expect(result.stdout).toContain('Blocked');
|
|
538
|
-
expect(result.stdout).toContain('Missing artifacts: tasks');
|
|
539
|
-
});
|
|
540
|
-
|
|
541
|
-
it('outputs JSON for apply instructions', async () => {
|
|
542
|
-
await createTestChange('json-apply', ['proposal', 'design', 'specs', 'tasks']);
|
|
543
|
-
|
|
544
|
-
const result = await runCLI(
|
|
545
|
-
['instructions', 'apply', '--change', 'json-apply', '--json'],
|
|
546
|
-
{ cwd: tempDir }
|
|
547
|
-
);
|
|
548
|
-
expect(result.exitCode).toBe(0);
|
|
549
|
-
expect(result.stderr).toBe('');
|
|
550
|
-
|
|
551
|
-
const json = JSON.parse(result.stdout);
|
|
552
|
-
const expectedProposalPath = canonical(path.join(changesDir, 'json-apply', 'proposal.md'));
|
|
553
|
-
const expectedSpecPath = canonical(path.join(changesDir, 'json-apply', 'specs', 'test-spec.md'));
|
|
554
|
-
expect(json.changeName).toBe('json-apply');
|
|
555
|
-
expect(json.schemaName).toBe('spec-driven');
|
|
556
|
-
expect(json.state).toBe('ready');
|
|
557
|
-
expect(json.contextFiles).toBeDefined();
|
|
558
|
-
expect(typeof json.contextFiles).toBe('object');
|
|
559
|
-
expect(json.contextFiles.proposal).toEqual([expectedProposalPath]);
|
|
560
|
-
expect(json.contextFiles.specs).toEqual([expectedSpecPath]);
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
it('resolves single-star glob artifacts consistently between status and apply', async () => {
|
|
564
|
-
const schemaDir = path.join(tempDir, 'openspec', 'schemas', 'glob-test');
|
|
565
|
-
const templatesDir = path.join(schemaDir, 'templates');
|
|
566
|
-
await fs.mkdir(templatesDir, { recursive: true });
|
|
567
|
-
|
|
568
|
-
await fs.writeFile(
|
|
569
|
-
path.join(schemaDir, 'schema.yaml'),
|
|
570
|
-
`name: glob-test
|
|
571
|
-
version: 1
|
|
572
|
-
description: Test schema for single-star globs
|
|
573
|
-
artifacts:
|
|
574
|
-
- id: specs
|
|
575
|
-
generates: specs/*/spec.md
|
|
576
|
-
description: Nested specs
|
|
577
|
-
template: spec.md
|
|
578
|
-
requires: []
|
|
579
|
-
apply:
|
|
580
|
-
requires: [specs]
|
|
581
|
-
instruction: Ready when specs exist.
|
|
582
|
-
`
|
|
583
|
-
);
|
|
584
|
-
await fs.writeFile(path.join(templatesDir, 'spec.md'), '# Spec\n');
|
|
585
|
-
|
|
586
|
-
const changeDir = path.join(changesDir, 'single-star-glob');
|
|
587
|
-
const specPath = path.join(changeDir, 'specs', 'single-star-glob', 'spec.md');
|
|
588
|
-
await fs.mkdir(path.dirname(specPath), { recursive: true });
|
|
589
|
-
await fs.writeFile(path.join(changeDir, '.openspec.yaml'), 'schema: glob-test\n');
|
|
590
|
-
await fs.writeFile(specPath, '# Nested spec\n');
|
|
591
|
-
|
|
592
|
-
const statusResult = await runCLI(['status', '--change', 'single-star-glob', '--json'], {
|
|
593
|
-
cwd: tempDir,
|
|
594
|
-
});
|
|
595
|
-
expect(statusResult.exitCode).toBe(0);
|
|
596
|
-
const statusJson = JSON.parse(statusResult.stdout);
|
|
597
|
-
expect(statusJson.artifacts).toEqual([
|
|
598
|
-
{
|
|
599
|
-
id: 'specs',
|
|
600
|
-
outputPath: 'specs/*/spec.md',
|
|
601
|
-
status: 'done',
|
|
602
|
-
},
|
|
603
|
-
]);
|
|
604
|
-
|
|
605
|
-
const applyResult = await runCLI(
|
|
606
|
-
['instructions', 'apply', '--change', 'single-star-glob', '--json'],
|
|
607
|
-
{ cwd: tempDir }
|
|
608
|
-
);
|
|
609
|
-
expect(applyResult.exitCode).toBe(0);
|
|
610
|
-
const applyJson = JSON.parse(applyResult.stdout);
|
|
611
|
-
const resolvedSpecPath = canonical(specPath);
|
|
612
|
-
expect(applyJson.state).toBe('ready');
|
|
613
|
-
expect(applyJson.missingArtifacts).toBeUndefined();
|
|
614
|
-
expect(applyJson.contextFiles).toEqual({
|
|
615
|
-
specs: [resolvedSpecPath],
|
|
616
|
-
});
|
|
617
|
-
});
|
|
618
|
-
|
|
619
|
-
it('shows schema instruction from apply block', async () => {
|
|
620
|
-
await createTestChange('instr-apply', ['proposal', 'design', 'specs', 'tasks']);
|
|
621
|
-
|
|
622
|
-
const result = await runCLI(['instructions', 'apply', '--change', 'instr-apply'], {
|
|
623
|
-
cwd: tempDir,
|
|
624
|
-
});
|
|
625
|
-
expect(result.exitCode).toBe(0);
|
|
626
|
-
// Should show the instruction from spec-driven schema apply block
|
|
627
|
-
expect(result.stdout).toContain('work through pending tasks');
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
it('shows all_done state when all tasks are complete', async () => {
|
|
631
|
-
const changeDir = await createTestChange('done-apply', [
|
|
632
|
-
'proposal',
|
|
633
|
-
'design',
|
|
634
|
-
'specs',
|
|
635
|
-
'tasks',
|
|
636
|
-
]);
|
|
637
|
-
// Overwrite tasks with all completed
|
|
638
|
-
await fs.writeFile(
|
|
639
|
-
path.join(changeDir, 'tasks.md'),
|
|
640
|
-
'## Tasks\n- [x] Task 1\n- [x] Task 2'
|
|
641
|
-
);
|
|
642
|
-
|
|
643
|
-
const result = await runCLI(['instructions', 'apply', '--change', 'done-apply'], {
|
|
644
|
-
cwd: tempDir,
|
|
645
|
-
});
|
|
646
|
-
expect(result.exitCode).toBe(0);
|
|
647
|
-
expect(result.stdout).toContain('complete ✓');
|
|
648
|
-
expect(result.stdout).toContain('ready to be archived');
|
|
649
|
-
});
|
|
650
|
-
|
|
651
|
-
it('uses spec-driven schema apply configuration', async () => {
|
|
652
|
-
// Create a spec-driven style change with all artifacts
|
|
653
|
-
await createTestChange('apply-schema-test', ['proposal', 'design', 'specs', 'tasks']);
|
|
654
|
-
|
|
655
|
-
const result = await runCLI(
|
|
656
|
-
['instructions', 'apply', '--change', 'apply-schema-test', '--schema', 'spec-driven'],
|
|
657
|
-
{ cwd: tempDir }
|
|
658
|
-
);
|
|
659
|
-
expect(result.exitCode).toBe(0);
|
|
660
|
-
expect(result.stdout).toContain('Schema: spec-driven');
|
|
661
|
-
});
|
|
662
|
-
|
|
663
|
-
it('spec-driven schema uses apply block configuration', async () => {
|
|
664
|
-
// Verify that spec-driven schema uses its apply block (requires: [tasks])
|
|
665
|
-
await createTestChange('apply-config-test', ['proposal', 'design', 'specs', 'tasks']);
|
|
666
|
-
|
|
667
|
-
const result = await runCLI(
|
|
668
|
-
['instructions', 'apply', '--change', 'apply-config-test', '--json'],
|
|
669
|
-
{ cwd: tempDir }
|
|
670
|
-
);
|
|
671
|
-
expect(result.exitCode).toBe(0);
|
|
672
|
-
|
|
673
|
-
const json = JSON.parse(result.stdout);
|
|
674
|
-
// spec-driven schema has apply block with requires: [tasks], so should be ready
|
|
675
|
-
expect(json.schemaName).toBe('spec-driven');
|
|
676
|
-
expect(json.state).toBe('ready');
|
|
677
|
-
});
|
|
678
|
-
|
|
679
|
-
it('fallback: requires all artifacts when schema has no apply block', async () => {
|
|
680
|
-
// Create a minimal schema without an apply block in user schemas dir
|
|
681
|
-
const userDataDir = path.join(tempDir, 'user-data');
|
|
682
|
-
const noApplySchemaDir = path.join(userDataDir, 'openspec', 'schemas', 'no-apply');
|
|
683
|
-
const templatesDir = path.join(noApplySchemaDir, 'templates');
|
|
684
|
-
await fs.mkdir(templatesDir, { recursive: true });
|
|
685
|
-
|
|
686
|
-
// Minimal schema with 2 artifacts, no apply block
|
|
687
|
-
const schemaContent = `
|
|
688
|
-
name: no-apply
|
|
689
|
-
version: 1
|
|
690
|
-
description: Test schema without apply block
|
|
691
|
-
artifacts:
|
|
692
|
-
- id: first
|
|
693
|
-
generates: first.md
|
|
694
|
-
description: First artifact
|
|
695
|
-
template: first.md
|
|
696
|
-
requires: []
|
|
697
|
-
- id: second
|
|
698
|
-
generates: second.md
|
|
699
|
-
description: Second artifact
|
|
700
|
-
template: second.md
|
|
701
|
-
requires: [first]
|
|
702
|
-
`;
|
|
703
|
-
await fs.writeFile(path.join(noApplySchemaDir, 'schema.yaml'), schemaContent);
|
|
704
|
-
await fs.writeFile(path.join(templatesDir, 'first.md'), '# First\n');
|
|
705
|
-
await fs.writeFile(path.join(templatesDir, 'second.md'), '# Second\n');
|
|
706
|
-
|
|
707
|
-
// Create a change with only the first artifact (missing second)
|
|
708
|
-
const changeDir = path.join(changesDir, 'no-apply-test');
|
|
709
|
-
await fs.mkdir(changeDir, { recursive: true });
|
|
710
|
-
await fs.writeFile(path.join(changeDir, 'first.md'), '# First artifact content');
|
|
711
|
-
|
|
712
|
-
// Run with XDG_DATA_HOME pointing to our temp user data dir
|
|
713
|
-
const result = await runCLI(
|
|
714
|
-
['instructions', 'apply', '--change', 'no-apply-test', '--schema', 'no-apply', '--json'],
|
|
715
|
-
{
|
|
716
|
-
cwd: tempDir,
|
|
717
|
-
env: { XDG_DATA_HOME: userDataDir },
|
|
718
|
-
}
|
|
719
|
-
);
|
|
720
|
-
expect(result.exitCode).toBe(0);
|
|
721
|
-
|
|
722
|
-
const json = JSON.parse(result.stdout);
|
|
723
|
-
// Without apply block, fallback requires ALL artifacts - second is missing
|
|
724
|
-
expect(json.schemaName).toBe('no-apply');
|
|
725
|
-
expect(json.state).toBe('blocked');
|
|
726
|
-
expect(json.missingArtifacts).toContain('second');
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
it('fallback: ready when all artifacts exist for schema without apply block', async () => {
|
|
730
|
-
// Create a minimal schema without an apply block
|
|
731
|
-
const userDataDir = path.join(tempDir, 'user-data-2');
|
|
732
|
-
const noApplySchemaDir = path.join(userDataDir, 'openspec', 'schemas', 'no-apply-full');
|
|
733
|
-
const templatesDir = path.join(noApplySchemaDir, 'templates');
|
|
734
|
-
await fs.mkdir(templatesDir, { recursive: true });
|
|
735
|
-
|
|
736
|
-
const schemaContent = `
|
|
737
|
-
name: no-apply-full
|
|
738
|
-
version: 1
|
|
739
|
-
description: Test schema without apply block
|
|
740
|
-
artifacts:
|
|
741
|
-
- id: only
|
|
742
|
-
generates: only.md
|
|
743
|
-
description: Only artifact
|
|
744
|
-
template: only.md
|
|
745
|
-
requires: []
|
|
746
|
-
`;
|
|
747
|
-
await fs.writeFile(path.join(noApplySchemaDir, 'schema.yaml'), schemaContent);
|
|
748
|
-
await fs.writeFile(path.join(templatesDir, 'only.md'), '# Only\n');
|
|
749
|
-
|
|
750
|
-
// Create a change with the artifact present
|
|
751
|
-
const changeDir = path.join(changesDir, 'no-apply-full-test');
|
|
752
|
-
await fs.mkdir(changeDir, { recursive: true });
|
|
753
|
-
await fs.writeFile(path.join(changeDir, 'only.md'), '# Content');
|
|
754
|
-
|
|
755
|
-
const result = await runCLI(
|
|
756
|
-
['instructions', 'apply', '--change', 'no-apply-full-test', '--schema', 'no-apply-full', '--json'],
|
|
757
|
-
{
|
|
758
|
-
cwd: tempDir,
|
|
759
|
-
env: { XDG_DATA_HOME: userDataDir },
|
|
760
|
-
}
|
|
761
|
-
);
|
|
762
|
-
expect(result.exitCode).toBe(0);
|
|
763
|
-
|
|
764
|
-
const json = JSON.parse(result.stdout);
|
|
765
|
-
// All artifacts exist, should be ready with default instruction
|
|
766
|
-
expect(json.schemaName).toBe('no-apply-full');
|
|
767
|
-
expect(json.state).toBe('ready');
|
|
768
|
-
expect(json.instruction).toContain('All required artifacts complete');
|
|
769
|
-
});
|
|
770
|
-
});
|
|
771
|
-
|
|
772
|
-
describe('help text', () => {
|
|
773
|
-
it('status command help shows description', async () => {
|
|
774
|
-
const result = await runCLI(['status', '--help']);
|
|
775
|
-
expect(result.exitCode).toBe(0);
|
|
776
|
-
expect(result.stdout).toContain('Display artifact completion status');
|
|
777
|
-
});
|
|
778
|
-
|
|
779
|
-
it('instructions command help shows description', async () => {
|
|
780
|
-
const result = await runCLI(['instructions', '--help']);
|
|
781
|
-
expect(result.exitCode).toBe(0);
|
|
782
|
-
expect(result.stdout).toContain('Output enriched instructions');
|
|
783
|
-
});
|
|
784
|
-
|
|
785
|
-
it('templates command help shows description', async () => {
|
|
786
|
-
const result = await runCLI(['templates', '--help']);
|
|
787
|
-
expect(result.exitCode).toBe(0);
|
|
788
|
-
expect(result.stdout).toContain('Show resolved template paths');
|
|
789
|
-
});
|
|
790
|
-
|
|
791
|
-
it('new command help shows description', async () => {
|
|
792
|
-
const result = await runCLI(['new', '--help']);
|
|
793
|
-
expect(result.exitCode).toBe(0);
|
|
794
|
-
expect(result.stdout).toContain('Create new items');
|
|
795
|
-
});
|
|
796
|
-
});
|
|
797
|
-
|
|
798
|
-
describe('experimental command (deprecated alias for init)', () => {
|
|
799
|
-
it('shows deprecation notice', async () => {
|
|
800
|
-
const result = await runCLI(['experimental', '--tool', 'claude'], { cwd: tempDir });
|
|
801
|
-
// May succeed or fail depending on setup, but should show deprecation notice
|
|
802
|
-
const output = getOutput(result);
|
|
803
|
-
expect(output).toContain('deprecated');
|
|
804
|
-
});
|
|
805
|
-
|
|
806
|
-
it('errors for unknown tool', async () => {
|
|
807
|
-
const result = await runCLI(['experimental', '--tool', 'unknown-tool'], {
|
|
808
|
-
cwd: tempDir,
|
|
809
|
-
});
|
|
810
|
-
expect(result.exitCode).toBe(1);
|
|
811
|
-
const output = getOutput(result);
|
|
812
|
-
expect(output).toContain('Invalid tool(s): unknown-tool');
|
|
813
|
-
});
|
|
814
|
-
|
|
815
|
-
it('errors for tool without skillsDir', async () => {
|
|
816
|
-
// Using 'agents' which doesn't have skillsDir configured
|
|
817
|
-
const result = await runCLI(['experimental', '--tool', 'agents'], {
|
|
818
|
-
cwd: tempDir,
|
|
819
|
-
});
|
|
820
|
-
expect(result.exitCode).toBe(1);
|
|
821
|
-
const output = getOutput(result);
|
|
822
|
-
expect(output).toContain('Invalid tool(s): agents');
|
|
823
|
-
});
|
|
824
|
-
|
|
825
|
-
it('creates skills for Claude tool', async () => {
|
|
826
|
-
const result = await runCLI(['experimental', '--tool', 'claude'], {
|
|
827
|
-
cwd: tempDir,
|
|
828
|
-
});
|
|
829
|
-
expect(result.exitCode).toBe(0);
|
|
830
|
-
const output = normalizePaths(getOutput(result));
|
|
831
|
-
expect(output).toContain('Claude Code');
|
|
832
|
-
expect(output).toContain('.claude/');
|
|
833
|
-
|
|
834
|
-
// Verify skill files were created
|
|
835
|
-
const skillFile = path.join(tempDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
|
|
836
|
-
const stat = await fs.stat(skillFile);
|
|
837
|
-
expect(stat.isFile()).toBe(true);
|
|
838
|
-
});
|
|
839
|
-
|
|
840
|
-
it('creates skills for Cursor tool', async () => {
|
|
841
|
-
const result = await runCLI(['experimental', '--tool', 'cursor'], {
|
|
842
|
-
cwd: tempDir,
|
|
843
|
-
});
|
|
844
|
-
expect(result.exitCode).toBe(0);
|
|
845
|
-
const output = normalizePaths(getOutput(result));
|
|
846
|
-
expect(output).toContain('Cursor');
|
|
847
|
-
expect(output).toContain('.cursor/');
|
|
848
|
-
|
|
849
|
-
// Verify skill files were created
|
|
850
|
-
const skillFile = path.join(tempDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
|
|
851
|
-
const stat = await fs.stat(skillFile);
|
|
852
|
-
expect(stat.isFile()).toBe(true);
|
|
853
|
-
|
|
854
|
-
// Verify commands were created with Cursor format
|
|
855
|
-
const commandFile = path.join(tempDir, '.cursor', 'commands', 'opsx-explore.md');
|
|
856
|
-
const content = await fs.readFile(commandFile, 'utf-8');
|
|
857
|
-
expect(content).toContain('name: /opsx-explore');
|
|
858
|
-
});
|
|
859
|
-
|
|
860
|
-
it('creates skills for Windsurf tool', async () => {
|
|
861
|
-
const result = await runCLI(['experimental', '--tool', 'windsurf'], {
|
|
862
|
-
cwd: tempDir,
|
|
863
|
-
});
|
|
864
|
-
expect(result.exitCode).toBe(0);
|
|
865
|
-
const output = normalizePaths(getOutput(result));
|
|
866
|
-
expect(output).toContain('Windsurf');
|
|
867
|
-
expect(output).toContain('.windsurf/');
|
|
868
|
-
|
|
869
|
-
// Verify skill files were created
|
|
870
|
-
const skillFile = path.join(tempDir, '.windsurf', 'skills', 'openspec-explore', 'SKILL.md');
|
|
871
|
-
const stat = await fs.stat(skillFile);
|
|
872
|
-
expect(stat.isFile()).toBe(true);
|
|
873
|
-
});
|
|
874
|
-
});
|
|
875
|
-
|
|
876
|
-
describe('project config integration', () => {
|
|
877
|
-
describe('new change uses config schema', () => {
|
|
878
|
-
it('creates change with schema from project config', async () => {
|
|
879
|
-
// Create project config with spec-driven schema
|
|
880
|
-
// Note: changesDir is already at tempDir/openspec/changes (created in beforeEach)
|
|
881
|
-
await fs.writeFile(
|
|
882
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
883
|
-
'schema: spec-driven\n'
|
|
884
|
-
);
|
|
885
|
-
|
|
886
|
-
// Create a new change without specifying schema
|
|
887
|
-
const result = await runCLI(['new', 'change', 'test-change'], { cwd: tempDir, timeoutMs: 30000 });
|
|
888
|
-
expect(result.exitCode).toBe(0);
|
|
889
|
-
|
|
890
|
-
// Verify the change was created with spec-driven schema
|
|
891
|
-
const metadataPath = path.join(changesDir, 'test-change', '.openspec.yaml');
|
|
892
|
-
const metadata = await fs.readFile(metadataPath, 'utf-8');
|
|
893
|
-
expect(metadata).toContain('schema: spec-driven');
|
|
894
|
-
}, 60000);
|
|
895
|
-
|
|
896
|
-
it('CLI schema overrides config schema', async () => {
|
|
897
|
-
// Create project config with spec-driven schema
|
|
898
|
-
// Note: openspec directory already exists (from changesDir creation in beforeEach)
|
|
899
|
-
await fs.writeFile(
|
|
900
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
901
|
-
'schema: spec-driven\n'
|
|
902
|
-
);
|
|
903
|
-
|
|
904
|
-
// Create change with explicit schema
|
|
905
|
-
const result = await runCLI(
|
|
906
|
-
['new', 'change', 'override-test', '--schema', 'spec-driven'],
|
|
907
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
908
|
-
);
|
|
909
|
-
expect(result.exitCode).toBe(0);
|
|
910
|
-
|
|
911
|
-
// Verify the change uses the CLI-specified schema
|
|
912
|
-
const metadataPath = path.join(changesDir, 'override-test', '.openspec.yaml');
|
|
913
|
-
const metadata = await fs.readFile(metadataPath, 'utf-8');
|
|
914
|
-
expect(metadata).toContain('schema: spec-driven');
|
|
915
|
-
}, 60000);
|
|
916
|
-
});
|
|
917
|
-
|
|
918
|
-
describe('instructions command with config', () => {
|
|
919
|
-
it('injects context and rules from config into instructions', async () => {
|
|
920
|
-
// Create project config with context and rules
|
|
921
|
-
// Note: openspec directory already exists (from changesDir creation in beforeEach)
|
|
922
|
-
await fs.writeFile(
|
|
923
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
924
|
-
`schema: spec-driven
|
|
925
|
-
context: |
|
|
926
|
-
Tech stack: TypeScript, React
|
|
927
|
-
API style: RESTful
|
|
928
|
-
rules:
|
|
929
|
-
proposal:
|
|
930
|
-
- Include rollback plan
|
|
931
|
-
- Identify affected teams
|
|
932
|
-
`
|
|
933
|
-
);
|
|
934
|
-
|
|
935
|
-
// Create a test change
|
|
936
|
-
await createTestChange('config-test');
|
|
937
|
-
|
|
938
|
-
// Get instructions for proposal
|
|
939
|
-
const result = await runCLI(
|
|
940
|
-
['instructions', 'proposal', '--change', 'config-test'],
|
|
941
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
942
|
-
);
|
|
943
|
-
expect(result.exitCode).toBe(0);
|
|
944
|
-
|
|
945
|
-
// Verify context is injected
|
|
946
|
-
expect(result.stdout).toContain('Tech stack: TypeScript, React');
|
|
947
|
-
expect(result.stdout).toContain('API style: RESTful');
|
|
948
|
-
|
|
949
|
-
// Verify rules are injected for proposal
|
|
950
|
-
expect(result.stdout).toContain('Include rollback plan');
|
|
951
|
-
expect(result.stdout).toContain('Identify affected teams');
|
|
952
|
-
}, 60000);
|
|
953
|
-
|
|
954
|
-
it('does not inject rules for non-matching artifact', async () => {
|
|
955
|
-
// Create project config with rules only for proposal
|
|
956
|
-
// Note: openspec directory already exists (from changesDir creation in beforeEach)
|
|
957
|
-
await fs.writeFile(
|
|
958
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
959
|
-
`schema: spec-driven
|
|
960
|
-
rules:
|
|
961
|
-
proposal:
|
|
962
|
-
- Include rollback plan
|
|
963
|
-
`
|
|
964
|
-
);
|
|
965
|
-
|
|
966
|
-
// Create a test change
|
|
967
|
-
await createTestChange('non-matching-test');
|
|
968
|
-
|
|
969
|
-
// Get instructions for design (not proposal)
|
|
970
|
-
const result = await runCLI(
|
|
971
|
-
['instructions', 'design', '--change', 'non-matching-test'],
|
|
972
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
973
|
-
);
|
|
974
|
-
expect(result.exitCode).toBe(0);
|
|
975
|
-
|
|
976
|
-
// Verify rules are NOT injected for design
|
|
977
|
-
expect(result.stdout).not.toContain('Include rollback plan');
|
|
978
|
-
}, 60000);
|
|
979
|
-
});
|
|
980
|
-
|
|
981
|
-
describe('backwards compatibility', () => {
|
|
982
|
-
it('existing changes work without config file', async () => {
|
|
983
|
-
// Create change without any config file
|
|
984
|
-
await createTestChange('no-config-change', ['proposal']);
|
|
985
|
-
|
|
986
|
-
// Status command should work
|
|
987
|
-
const statusResult = await runCLI(
|
|
988
|
-
['status', '--change', 'no-config-change'],
|
|
989
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
990
|
-
);
|
|
991
|
-
expect(statusResult.exitCode).toBe(0);
|
|
992
|
-
expect(statusResult.stdout).toContain('no-config-change');
|
|
993
|
-
expect(statusResult.stdout).toContain('spec-driven'); // Default schema
|
|
994
|
-
|
|
995
|
-
// Instructions command should work
|
|
996
|
-
const instrResult = await runCLI(
|
|
997
|
-
['instructions', 'design', '--change', 'no-config-change'],
|
|
998
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
999
|
-
);
|
|
1000
|
-
expect(instrResult.exitCode).toBe(0);
|
|
1001
|
-
expect(instrResult.stdout).toContain('<artifact');
|
|
1002
|
-
}, 60000);
|
|
1003
|
-
|
|
1004
|
-
it('changes with metadata work without config file', async () => {
|
|
1005
|
-
// Create change with explicit schema in metadata
|
|
1006
|
-
const changeDir = await createTestChange('metadata-only-change');
|
|
1007
|
-
await fs.writeFile(
|
|
1008
|
-
path.join(changeDir, '.openspec.yaml'),
|
|
1009
|
-
'schema: spec-driven\ncreated: "2025-01-05"\n'
|
|
1010
|
-
);
|
|
1011
|
-
|
|
1012
|
-
// Status should use schema from metadata
|
|
1013
|
-
const result = await runCLI(
|
|
1014
|
-
['status', '--change', 'metadata-only-change'],
|
|
1015
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
1016
|
-
);
|
|
1017
|
-
expect(result.exitCode).toBe(0);
|
|
1018
|
-
expect(result.stdout).toContain('spec-driven');
|
|
1019
|
-
}, 60000);
|
|
1020
|
-
});
|
|
1021
|
-
|
|
1022
|
-
describe('config changes reflected immediately', () => {
|
|
1023
|
-
it('config changes are reflected without restart', async () => {
|
|
1024
|
-
// Create initial config
|
|
1025
|
-
// Note: openspec directory already exists (from changesDir creation in beforeEach)
|
|
1026
|
-
await fs.writeFile(
|
|
1027
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
1028
|
-
`schema: spec-driven
|
|
1029
|
-
context: Initial context
|
|
1030
|
-
`
|
|
1031
|
-
);
|
|
1032
|
-
|
|
1033
|
-
// Create a test change
|
|
1034
|
-
await createTestChange('immediate-test');
|
|
1035
|
-
|
|
1036
|
-
// Get instructions - should have initial context
|
|
1037
|
-
const result1 = await runCLI(
|
|
1038
|
-
['instructions', 'proposal', '--change', 'immediate-test'],
|
|
1039
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
1040
|
-
);
|
|
1041
|
-
expect(result1.exitCode).toBe(0);
|
|
1042
|
-
expect(result1.stdout).toContain('Initial context');
|
|
1043
|
-
|
|
1044
|
-
// Update config
|
|
1045
|
-
await fs.writeFile(
|
|
1046
|
-
path.join(tempDir, 'openspec', 'config.yaml'),
|
|
1047
|
-
`schema: spec-driven
|
|
1048
|
-
context: Updated context
|
|
1049
|
-
`
|
|
1050
|
-
);
|
|
1051
|
-
|
|
1052
|
-
// Get instructions again - should have updated context
|
|
1053
|
-
const result2 = await runCLI(
|
|
1054
|
-
['instructions', 'proposal', '--change', 'immediate-test'],
|
|
1055
|
-
{ cwd: tempDir, timeoutMs: 30000 }
|
|
1056
|
-
);
|
|
1057
|
-
expect(result2.exitCode).toBe(0);
|
|
1058
|
-
expect(result2.stdout).toContain('Updated context');
|
|
1059
|
-
expect(result2.stdout).not.toContain('Initial context');
|
|
1060
|
-
}, 60000);
|
|
1061
|
-
});
|
|
1062
|
-
});
|
|
1063
|
-
});
|