freeharness 0.4.1
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/LICENSE +21 -0
- package/NOTICE +108 -0
- package/README.md +134 -0
- package/canonical/HARVEST.yaml +858 -0
- package/canonical/PROVENANCE.yaml +740 -0
- package/canonical/agents/README.md +95 -0
- package/canonical/agents/agentic-architect.md +18 -0
- package/canonical/agents/database-reviewer.md +41 -0
- package/canonical/agents/explorer-ai-engineer-analyst.md +65 -0
- package/canonical/agents/pr-reviewer.md +96 -0
- package/canonical/agents/python-reviewer.md +55 -0
- package/canonical/agents/report-formatter.md +19 -0
- package/canonical/agents/security-reviewer.md +53 -0
- package/canonical/agents/test-writer.md +34 -0
- package/canonical/commands/fh-context.md +37 -0
- package/canonical/evals/promptfoo.redteam.yaml +108 -0
- package/canonical/hooks/cost-prices.json +14 -0
- package/canonical/hooks/freeharness-auto-memory.mjs +158 -0
- package/canonical/hooks/freeharness-config-guard.mjs +162 -0
- package/canonical/hooks/freeharness-context-monitor.mjs +198 -0
- package/canonical/hooks/freeharness-converge.mjs +227 -0
- package/canonical/hooks/freeharness-cost-tracker.mjs +1027 -0
- package/canonical/hooks/freeharness-memory-guard.mjs +57 -0
- package/canonical/hooks/freeharness-output-pruner.mjs +333 -0
- package/canonical/hooks/freeharness-precompact.mjs +323 -0
- package/canonical/hooks/freeharness-repeat-tool.mjs +208 -0
- package/canonical/hooks/freeharness-security-guidance.mjs +164 -0
- package/canonical/hooks/freeharness-session-start +583 -0
- package/canonical/hooks/hooks.auto-memory.claude-code.json +16 -0
- package/canonical/hooks/hooks.claude-code.json +17 -0
- package/canonical/hooks/hooks.config-guard.claude-code.json +16 -0
- package/canonical/hooks/hooks.context-monitor.claude-code.json +15 -0
- package/canonical/hooks/hooks.converge.claude-code.json +15 -0
- package/canonical/hooks/hooks.cost-tracker.claude-code.json +37 -0
- package/canonical/hooks/hooks.memory-guard.claude-code.json +16 -0
- package/canonical/hooks/hooks.output-pruner.claude-code.json +16 -0
- package/canonical/hooks/hooks.precompact.claude-code.json +15 -0
- package/canonical/hooks/hooks.repeat-tool.claude-code.json +25 -0
- package/canonical/hooks/hooks.security-guidance.claude-code.json +16 -0
- package/canonical/mcp/servers.json +20 -0
- package/canonical/openspec/config.base.yaml +89 -0
- package/canonical/openspec/schema.spec-driven.yaml +277 -0
- package/canonical/openspec/templates/data-contract.md +36 -0
- package/canonical/openspec/templates/design.md +84 -0
- package/canonical/openspec/templates/eval-plan.md +33 -0
- package/canonical/openspec/templates/follow-ups.md +2 -0
- package/canonical/openspec/templates/proposal.md +45 -0
- package/canonical/openspec/templates/spec.md +42 -0
- package/canonical/openspec/templates/tasks.md +38 -0
- package/canonical/profiles/local-llamacpp.LOCAL-MODELS.md +47 -0
- package/canonical/profiles/local-llamacpp.json +27 -0
- package/canonical/profiles/local-ollama.json +20 -0
- package/canonical/profiles/mcp.json +91 -0
- package/canonical/rules/CLAUDE.md +78 -0
- package/canonical/rules/project-CLAUDE.template.md +62 -0
- package/canonical/rules/routing.md +20 -0
- package/canonical/rules/safety.md +41 -0
- package/canonical/settings/settings.cache-hygiene.claude-code.json +5 -0
- package/canonical/skills/agent-evaluation/SKILL.md +102 -0
- package/canonical/skills/agent-evaluation/assets/evaluation_report_template.md +206 -0
- package/canonical/skills/agent-evaluation/evals/cases.yaml +106 -0
- package/canonical/skills/agent-evaluation/references/dataset-preparation.md +351 -0
- package/canonical/skills/agent-evaluation/references/scorers-constraints.md +165 -0
- package/canonical/skills/agent-evaluation/references/scorers.md +431 -0
- package/canonical/skills/agent-evaluation/references/setup-guide.md +252 -0
- package/canonical/skills/agent-evaluation/references/tracing-integration.md +164 -0
- package/canonical/skills/agent-evaluation/references/troubleshooting.md +514 -0
- package/canonical/skills/agent-evaluation/scripts/analyze_results.py +462 -0
- package/canonical/skills/agent-evaluation/scripts/create_dataset_template.py +382 -0
- package/canonical/skills/agent-evaluation/scripts/list_datasets.py +273 -0
- package/canonical/skills/agent-evaluation/scripts/run_evaluation_template.py +309 -0
- package/canonical/skills/agent-evaluation/scripts/setup_mlflow.py +353 -0
- package/canonical/skills/agent-evaluation/scripts/utils/__init__.py +27 -0
- package/canonical/skills/agent-evaluation/scripts/utils/env_validation.py +123 -0
- package/canonical/skills/agent-evaluation/scripts/utils/tracing_utils.py +108 -0
- package/canonical/skills/agent-evaluation/scripts/validate_agent_tracing.py +148 -0
- package/canonical/skills/agent-evaluation/scripts/validate_auth.py +240 -0
- package/canonical/skills/agent-evaluation/scripts/validate_environment.py +185 -0
- package/canonical/skills/agent-evaluation/scripts/validate_tracing_runtime.py +318 -0
- package/canonical/skills/agentic-architecture/SKILL.md +41 -0
- package/canonical/skills/agentic-architecture/evals/cases.yaml +94 -0
- package/canonical/skills/agentic-architecture/reference/context-engineering.md +75 -0
- package/canonical/skills/agentic-architecture/reference/patterns.md +76 -0
- package/canonical/skills/agentic-architecture/reference/reliability-observability.md +94 -0
- package/canonical/skills/agentic-architecture/reference/review-framework.md +59 -0
- package/canonical/skills/code-review/SKILL.md +52 -0
- package/canonical/skills/code-review/evals/cases.yaml +197 -0
- package/canonical/skills/git-workflow/SKILL.md +41 -0
- package/canonical/skills/git-workflow/evals/cases.yaml +92 -0
- package/canonical/skills/local-code/SKILL.md +24 -0
- package/canonical/skills/local-code/evals/cases.yaml +85 -0
- package/canonical/skills/local-code/scripts/query_llama.py +68 -0
- package/canonical/skills/report-formatting/SKILL.md +62 -0
- package/canonical/skills/report-formatting/evals/cases.yaml +83 -0
- package/canonical/skills/report-formatting/reference/ARCHITECTURE.md +135 -0
- package/canonical/skills/report-formatting/reference/HELPERS.md +120 -0
- package/canonical/skills/report-formatting/reference/PPTX.md +136 -0
- package/canonical/skills/report-formatting/reference/RELEASE.md +99 -0
- package/canonical/skills/report-formatting/reference/TEMPLATES.md +48 -0
- package/canonical/skills/report-formatting/reference/authoring.md +66 -0
- package/canonical/skills/report-formatting/scripts/architecture-template.md +271 -0
- package/canonical/skills/report-formatting/scripts/assets/claro-logo.png +0 -0
- package/canonical/skills/report-formatting/scripts/assets/claro-wordmark.svg +1 -0
- package/canonical/skills/report-formatting/scripts/build-architecture.js +57 -0
- package/canonical/skills/report-formatting/scripts/build-md-claro.js +224 -0
- package/canonical/skills/report-formatting/scripts/build-release.js +51 -0
- package/canonical/skills/report-formatting/scripts/check-env.js +58 -0
- package/canonical/skills/report-formatting/scripts/docmodel.js +283 -0
- package/canonical/skills/report-formatting/scripts/example-build.js +119 -0
- package/canonical/skills/report-formatting/scripts/example_build_ArchitectureReview_docx.js +195 -0
- package/canonical/skills/report-formatting/scripts/example_build_ExecutiveReport_docx.js +114 -0
- package/canonical/skills/report-formatting/scripts/package.json +17 -0
- package/canonical/skills/report-formatting/scripts/pptx/example_build_StatusReport_pptx.py +223 -0
- package/canonical/skills/report-formatting/scripts/pptx/example_build_WeeklyStatus_pptx.py +245 -0
- package/canonical/skills/report-formatting/scripts/pptx/pptx_office.py +144 -0
- package/canonical/skills/report-formatting/scripts/pptx/requirements.txt +7 -0
- package/canonical/skills/report-formatting/scripts/pptx/status_report_blocks.py +193 -0
- package/canonical/skills/report-formatting/scripts/pptx/theme_claro_pptx.py +473 -0
- package/canonical/skills/report-formatting/scripts/release-template.md +80 -0
- package/canonical/skills/report-formatting/scripts/render-mermaid.js +105 -0
- package/canonical/skills/report-formatting/scripts/theme-claro.js +403 -0
- package/canonical/skills/subagent-driven-development/SKILL.md +60 -0
- package/canonical/skills/subagent-driven-development/evals/cases.yaml +208 -0
- package/canonical/skills/subagent-driven-development/reference/brief.md +91 -0
- package/canonical/skills/subagent-driven-development/reference/handoff.md +118 -0
- package/canonical/skills/subagent-driven-development/scripts/validate-handoff.mjs +850 -0
- package/canonical/skills/systematic-debugging/SKILL.md +44 -0
- package/canonical/skills/systematic-debugging/evals/cases.yaml +90 -0
- package/canonical/skills/test-driven-development/SKILL.md +42 -0
- package/canonical/skills/test-driven-development/evals/cases.yaml +86 -0
- package/canonical/skills/test-driven-development/reference/writing-good-tests.md +52 -0
- package/canonical/skills/verification-before-completion/SKILL.md +53 -0
- package/canonical/skills/verification-before-completion/evals/cases.yaml +107 -0
- package/dist/adapters/content/language-lint.d.ts +46 -0
- package/dist/adapters/content/language-lint.js +191 -0
- package/dist/adapters/harness/claude-code.d.ts +57 -0
- package/dist/adapters/harness/claude-code.js +385 -0
- package/dist/adapters/harness/index.d.ts +3 -0
- package/dist/adapters/harness/index.js +17 -0
- package/dist/adapters/harness/opencode.d.ts +7 -0
- package/dist/adapters/harness/opencode.js +166 -0
- package/dist/adapters/harness/plugin.d.ts +22 -0
- package/dist/adapters/harness/plugin.js +257 -0
- package/dist/adapters/memory/doctor.d.ts +480 -0
- package/dist/adapters/memory/doctor.js +1217 -0
- package/dist/adapters/memory/vendored.d.ts +150 -0
- package/dist/adapters/memory/vendored.js +487 -0
- package/dist/adapters/package/node.d.ts +9 -0
- package/dist/adapters/package/node.js +20 -0
- package/dist/adapters/prompt/readline.d.ts +19 -0
- package/dist/adapters/prompt/readline.js +53 -0
- package/dist/adapters/sync/diff.d.ts +43 -0
- package/dist/adapters/sync/diff.js +380 -0
- package/dist/cli/cleanup.d.ts +86 -0
- package/dist/cli/cleanup.js +382 -0
- package/dist/cli/cost.d.ts +304 -0
- package/dist/cli/cost.js +501 -0
- package/dist/cli/doctor.d.ts +205 -0
- package/dist/cli/doctor.js +654 -0
- package/dist/cli/executor.d.ts +5 -0
- package/dist/cli/executor.js +48 -0
- package/dist/cli/plugin-validate.d.ts +37 -0
- package/dist/cli/plugin-validate.js +256 -0
- package/dist/cli/prefix.d.ts +68 -0
- package/dist/cli/prefix.js +218 -0
- package/dist/cli/profile.d.ts +170 -0
- package/dist/cli/profile.js +285 -0
- package/dist/cli/runner.d.ts +10 -0
- package/dist/cli/runner.js +27 -0
- package/dist/cli/uninstall.d.ts +65 -0
- package/dist/cli/uninstall.js +147 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +989 -0
- package/dist/infra/dogfood.d.ts +31 -0
- package/dist/infra/dogfood.js +51 -0
- package/dist/infra/fsutil.d.ts +40 -0
- package/dist/infra/fsutil.js +143 -0
- package/dist/infra/manifest.d.ts +76 -0
- package/dist/infra/manifest.js +92 -0
- package/dist/infra/paths.d.ts +19 -0
- package/dist/infra/paths.js +74 -0
- package/dist/infra/routing.d.ts +4 -0
- package/dist/infra/routing.js +7 -0
- package/node_modules/@freeharness/core/dist/context.d.ts +30 -0
- package/node_modules/@freeharness/core/dist/context.js +1 -0
- package/node_modules/@freeharness/core/dist/index.d.ts +5 -0
- package/node_modules/@freeharness/core/dist/index.js +6 -0
- package/node_modules/@freeharness/core/dist/planner.d.ts +13 -0
- package/node_modules/@freeharness/core/dist/planner.js +18 -0
- package/node_modules/@freeharness/core/dist/ports.d.ts +90 -0
- package/node_modules/@freeharness/core/dist/ports.js +1 -0
- package/node_modules/@freeharness/core/dist/registry.d.ts +41 -0
- package/node_modules/@freeharness/core/dist/registry.js +124 -0
- package/node_modules/@freeharness/core/dist/tiers.d.ts +30 -0
- package/node_modules/@freeharness/core/dist/tiers.js +99 -0
- package/node_modules/@freeharness/core/package.json +34 -0
- package/node_modules/@freeharness/sdd/PROVENANCE.yaml +175 -0
- package/node_modules/@freeharness/sdd/dist/src/bin/openspec.d.ts +2 -0
- package/node_modules/@freeharness/sdd/dist/src/bin/openspec.js +166 -0
- package/node_modules/@freeharness/sdd/dist/src/index.d.ts +14 -0
- package/node_modules/@freeharness/sdd/dist/src/index.js +11 -0
- package/node_modules/@freeharness/sdd/dist/src/init.d.ts +39 -0
- package/node_modules/@freeharness/sdd/dist/src/init.js +190 -0
- package/node_modules/@freeharness/sdd/dist/src/root-resolver.d.ts +8 -0
- package/node_modules/@freeharness/sdd/dist/src/root-resolver.js +32 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/archive.d.ts +81 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/archive.js +483 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/context.d.ts +4 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/context.js +48 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.d.ts +57 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.js +279 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/instructions.d.ts +67 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/instructions.js +460 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/list.d.ts +5 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/list.js +95 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/new-change.d.ts +6 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/new-change.js +150 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/schemas.d.ts +4 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/schemas.js +23 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/shared.d.ts +56 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/shared.js +140 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/status.d.ts +8 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/status.js +85 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/validate.d.ts +6 -0
- package/node_modules/@freeharness/sdd/dist/src/shim/validate.js +229 -0
- package/node_modules/@freeharness/sdd/dist/src/validate-change.d.ts +40 -0
- package/node_modules/@freeharness/sdd/dist/src/validate-change.js +114 -0
- package/node_modules/@freeharness/sdd/dist/src/validate.d.ts +24 -0
- package/node_modules/@freeharness/sdd/dist/src/validate.js +72 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/specs-apply.d.ts +130 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/specs-apply.js +981 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-metadata.d.ts +46 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-metadata.js +128 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.d.ts +26 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.js +32 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/file-system.d.ts +50 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/file-system.js +394 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/global-config.d.ts +15 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/global-config.js +49 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/graph.d.ts +71 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/graph.js +164 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.d.ts +11 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.js +21 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/instruction-loader.d.ts +102 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/instruction-loader.js +230 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.d.ts +18 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.js +138 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/resolver.d.ts +82 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/resolver.js +333 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/schema.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/schema.js +110 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/state.d.ts +11 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/state.js +32 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/task-progress.d.ts +33 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/task-progress.js +149 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/types.d.ts +39 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/types.js +49 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/claude.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/claude.js +31 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/index.d.ts +10 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/index.js +10 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/opencode.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/opencode.js +26 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/generator.d.ts +28 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/generator.js +41 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/index.d.ts +23 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/index.js +25 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/invocation.d.ts +72 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/invocation.js +76 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/registry.d.ts +39 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/registry.js +53 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/types.d.ts +62 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/types.js +7 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/yaml.d.ts +35 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/yaml.js +47 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-references.d.ts +33 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-references.js +55 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/allowed-tools.d.ts +11 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/allowed-tools.js +11 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/skill-generation.d.ts +48 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/skill-generation.js +99 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/skill-templates.d.ts +19 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/skill-templates.js +18 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/types.d.ts +18 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/types.js +4 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/apply-change.d.ts +19 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/apply-change.js +207 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/archive-change.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/archive-change.js +409 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/bulk-archive-change.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/bulk-archive-change.js +673 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/continue-change.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/continue-change.js +230 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/explore.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/explore.js +550 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/feedback.d.ts +8 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/feedback.js +107 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/ff-change.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/ff-change.js +228 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/new-change.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/new-change.js +147 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/onboard.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/onboard.js +571 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/propose.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/propose.js +322 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/store-selection.d.ts +7 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/store-selection.js +7 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/sync-specs.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/sync-specs.js +518 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/update-change.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/update-change.js +176 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/verify-change.d.ts +9 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/verify-change.js +344 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.d.ts +39 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.js +54 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/delta-resolution.d.ts +35 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/delta-resolution.js +171 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.d.ts +27 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.js +210 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/code-fence.d.ts +14 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/code-fence.js +48 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/markdown-parser.d.ts +22 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/markdown-parser.js +186 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.d.ts +65 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.js +409 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.d.ts +55 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.js +98 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/spec-structure.d.ts +8 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/spec-structure.js +77 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/purpose-placeholder.d.ts +44 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/purpose-placeholder.js +116 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/base.schema.d.ts +12 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/base.schema.js +17 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/change.schema.d.ts +72 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/change.schema.js +30 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/index.d.ts +3 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/index.js +3 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/spec.schema.d.ts +17 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/spec.schema.js +14 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.d.ts +39 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.js +114 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.d.ts +45 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.js +105 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-numbering.d.ts +15 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-numbering.js +56 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/types.d.ts +17 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/types.js +1 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.d.ts +94 -0
- package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.js +756 -0
- package/node_modules/@freeharness/sdd/package.json +57 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/LICENSE.upstream +22 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/schema.upstream.yaml +232 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/README.md +19 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-apply-change/SKILL.md +187 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-archive-change/SKILL.md +181 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-bulk-archive-change/SKILL.md +338 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-continue-change/SKILL.md +117 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-explore/SKILL.md +342 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-ff-change/SKILL.md +116 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-new-change/SKILL.md +76 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-onboard/SKILL.md +560 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-propose/SKILL.md +162 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-sync-specs/SKILL.md +261 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-update-change/SKILL.md +90 -0
- package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-verify-change/SKILL.md +174 -0
- package/package.json +70 -0
- package/provenance/canonical.PROVENANCE.yaml +740 -0
- package/provenance/claude-mem.LICENSE.upstream +202 -0
- package/provenance/memory.PROVENANCE.yaml +399 -0
- package/provenance/sdd.PROVENANCE.yaml +175 -0
- package/vendor-licenses/caveman.LICENSE +27 -0
- package/vendor-licenses/deepseek-harness.LICENSE +21 -0
- package/vendor-licenses/ecc.LICENSE +21 -0
- package/vendor-licenses/pi.LICENSE +21 -0
- package/vendor-licenses/superpowers.LICENSE +21 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// `openspec follow-up add|list|claim` — a per-change record of items to pick up
|
|
2
|
+
// later, kept as a plain `follow-ups.md` next to the change's other artifacts and
|
|
3
|
+
// moved with it at archive.
|
|
4
|
+
//
|
|
5
|
+
// The record is data, never instructions: every reader here (readFollowUps,
|
|
6
|
+
// list, the archive notice) treats an item's text as an opaque string. No
|
|
7
|
+
// content is executed, evaluated or passed to a shell.
|
|
8
|
+
//
|
|
9
|
+
// The template lives at canonical/openspec/templates/follow-ups.md for a human
|
|
10
|
+
// reading the repo; a change's follow-ups.md is not a schema artifact (schema
|
|
11
|
+
// templates resolve through a project's installed schema directory, see
|
|
12
|
+
// vendor/openspec/engine/instruction-loader.ts), so this shim has no template
|
|
13
|
+
// copy path for it and embeds the same two header lines as a constant below.
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import { changesDirFor, printJson, resolveChangeId, taskLabel } from './shared.js';
|
|
17
|
+
const TEMPLATE = '<!-- Follow-ups for this change: one line per item, in the order they were added. -->\n' +
|
|
18
|
+
'<!-- Unclaimed: - [ ] <text> (from <task>) Claimed: - [x] <text> (from <task>) -> claimed by <change-id> -->\n';
|
|
19
|
+
// Leading whitespace and a `*` bullet are accepted so a hand-written item counts here exactly
|
|
20
|
+
// as it counts in the SessionStart pointer, which reads the same files.
|
|
21
|
+
const ITEM_LINE = /^\s*[-*]\s*\[([ xX])\]\s*(.*)$/;
|
|
22
|
+
const CLAIMED_SUFFIX = /^(.*?)\s*->\s*claimed by\s+(\S+)\s*$/;
|
|
23
|
+
const FROM_SUFFIX = /^(.*?)\s*\(from\s+([^)]+)\)\s*$/;
|
|
24
|
+
const CONTROL_CHAR = /[\x00-\x1f\x7f]/;
|
|
25
|
+
/**
|
|
26
|
+
* Rejects a `text` that would split the appended line into two item lines (a
|
|
27
|
+
* line break) or carry an unprintable byte, and an empty `text`. The written
|
|
28
|
+
* line can never be parsed back as two items.
|
|
29
|
+
*/
|
|
30
|
+
function validateFollowUpText(text) {
|
|
31
|
+
if (text.length === 0)
|
|
32
|
+
throw new Error('follow-up text cannot be empty.');
|
|
33
|
+
if (CONTROL_CHAR.test(text)) {
|
|
34
|
+
throw new Error('follow-up text cannot contain a line break or control character.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Rejects a `--from` value that is not exactly a task label as `taskLabel`
|
|
39
|
+
* (shared.ts) recognizes it: `taskLabel` extracts the leading `N.N[a]`-style
|
|
40
|
+
* id from a task description, so a `--from` value round-trips through it only
|
|
41
|
+
* when the whole value is such a label, with nothing before or after. Reusing
|
|
42
|
+
* that recognizer (rather than a private copy of its pattern) means the two
|
|
43
|
+
* never drift, and a line break or other control character never round-trips.
|
|
44
|
+
*/
|
|
45
|
+
function validateFrom(from) {
|
|
46
|
+
if (taskLabel({ description: from, line: 0 }) !== from) {
|
|
47
|
+
throw new Error(`--from '${from}' must be a task label (e.g. 6.3 or 6.3a).`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function followUpsPath(changeDir) {
|
|
51
|
+
return path.join(changeDir, 'follow-ups.md');
|
|
52
|
+
}
|
|
53
|
+
/** The change directory for an id already resolved in-flight or archived. */
|
|
54
|
+
function changeDirForResolution(projectRoot, id, resolution) {
|
|
55
|
+
const changesDir = changesDirFor(projectRoot);
|
|
56
|
+
return resolution === 'archived' ? path.join(changesDir, 'archive', id) : path.join(changesDir, id);
|
|
57
|
+
}
|
|
58
|
+
/** Archived change ids (directories under openspec/changes/archive/). */
|
|
59
|
+
function listArchivedChangeIds(projectRoot) {
|
|
60
|
+
const dir = path.join(changesDirFor(projectRoot), 'archive');
|
|
61
|
+
try {
|
|
62
|
+
return fs
|
|
63
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
64
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
65
|
+
.map((e) => e.name);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error.code === 'ENOENT')
|
|
69
|
+
return [];
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** In-flight change ids (directories under openspec/changes/, excluding archive). */
|
|
74
|
+
function listInFlightChangeIds(projectRoot) {
|
|
75
|
+
const dir = changesDirFor(projectRoot);
|
|
76
|
+
try {
|
|
77
|
+
return fs
|
|
78
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
79
|
+
.filter((e) => e.isDirectory() && e.name !== 'archive' && !e.name.startsWith('.'))
|
|
80
|
+
.map((e) => e.name);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error.code === 'ENOENT')
|
|
84
|
+
return [];
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function parseBody(body) {
|
|
89
|
+
const match = body.match(FROM_SUFFIX);
|
|
90
|
+
if (!match)
|
|
91
|
+
return { text: body, from: null };
|
|
92
|
+
return { text: match[1], from: match[2] };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Reads every item line of a change's follow-ups.md, ignoring any other line
|
|
96
|
+
* (heading, blank, comment). Index is the 1-based position among item lines in
|
|
97
|
+
* file order. Absent file -> empty list.
|
|
98
|
+
*/
|
|
99
|
+
export function readFollowUps(dir) {
|
|
100
|
+
const file = followUpsPath(dir);
|
|
101
|
+
if (!fs.existsSync(file))
|
|
102
|
+
return [];
|
|
103
|
+
const lines = fs.readFileSync(file, 'utf-8').split('\n');
|
|
104
|
+
const items = [];
|
|
105
|
+
let index = 0;
|
|
106
|
+
for (const line of lines) {
|
|
107
|
+
const match = line.match(ITEM_LINE);
|
|
108
|
+
if (!match)
|
|
109
|
+
continue;
|
|
110
|
+
index += 1;
|
|
111
|
+
const checked = match[1].toLowerCase() === 'x';
|
|
112
|
+
let body = match[2];
|
|
113
|
+
let claimedBy = null;
|
|
114
|
+
if (checked) {
|
|
115
|
+
const claim = body.match(CLAIMED_SUFFIX);
|
|
116
|
+
if (claim) {
|
|
117
|
+
body = claim[1];
|
|
118
|
+
claimedBy = claim[2];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const { text, from } = parseBody(body);
|
|
122
|
+
items.push({ index, text, from, done: checked, claimedBy });
|
|
123
|
+
}
|
|
124
|
+
return items;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Appends an unclaimed item to a change's follow-ups.md, creating the file from
|
|
128
|
+
* the template when absent. Throws when the change resolves neither in flight
|
|
129
|
+
* nor archived.
|
|
130
|
+
*/
|
|
131
|
+
export function addFollowUp(projectRoot, changeId, text, from) {
|
|
132
|
+
validateFollowUpText(text);
|
|
133
|
+
if (from !== undefined)
|
|
134
|
+
validateFrom(from);
|
|
135
|
+
const resolution = resolveChangeId(projectRoot, changeId);
|
|
136
|
+
if (!resolution) {
|
|
137
|
+
throw new Error(`Change '${changeId}' not found (neither in flight nor archived).`);
|
|
138
|
+
}
|
|
139
|
+
const dir = changeDirForResolution(projectRoot, changeId, resolution);
|
|
140
|
+
const file = followUpsPath(dir);
|
|
141
|
+
if (!fs.existsSync(file)) {
|
|
142
|
+
fs.writeFileSync(file, TEMPLATE, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
const index = readFollowUps(dir).length + 1;
|
|
145
|
+
const suffix = from ? ` (from ${from})` : '';
|
|
146
|
+
const line = `- [ ] ${text}${suffix}`;
|
|
147
|
+
const current = fs.readFileSync(file, 'utf-8');
|
|
148
|
+
const separator = current.length === 0 || current.endsWith('\n') ? '' : '\n';
|
|
149
|
+
fs.writeFileSync(file, `${current}${separator}${line}\n`, 'utf-8');
|
|
150
|
+
return { change: changeId, index };
|
|
151
|
+
}
|
|
152
|
+
/** Every open (unchecked) item of every in-flight and archived change. */
|
|
153
|
+
export function listFollowUps(projectRoot) {
|
|
154
|
+
const changesDir = changesDirFor(projectRoot);
|
|
155
|
+
const results = [];
|
|
156
|
+
const collect = (ids, base) => {
|
|
157
|
+
for (const id of ids) {
|
|
158
|
+
for (const item of readFollowUps(path.join(base, id))) {
|
|
159
|
+
// A checked item is settled even when it names no claimant; `claim` refuses it for the
|
|
160
|
+
// same reason, so the two commands never disagree about what is still open.
|
|
161
|
+
if (item.done)
|
|
162
|
+
continue;
|
|
163
|
+
results.push({ change: id, index: item.index, text: item.text, from: item.from, state: 'open' });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
collect(listInFlightChangeIds(projectRoot), changesDir);
|
|
168
|
+
collect(listArchivedChangeIds(projectRoot), path.join(changesDir, 'archive'));
|
|
169
|
+
return results;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Rewrites an item as claimed. Refuses an index without an item, an item
|
|
173
|
+
* already claimed, or a `--by` id that resolves neither in flight nor
|
|
174
|
+
* archived; every other line of the file is left byte-identical.
|
|
175
|
+
*/
|
|
176
|
+
export function claimFollowUp(projectRoot, changeId, index, byId) {
|
|
177
|
+
const resolution = resolveChangeId(projectRoot, changeId);
|
|
178
|
+
if (!resolution) {
|
|
179
|
+
throw new Error(`Change '${changeId}' not found (neither in flight nor archived).`);
|
|
180
|
+
}
|
|
181
|
+
const dir = changeDirForResolution(projectRoot, changeId, resolution);
|
|
182
|
+
const file = followUpsPath(dir);
|
|
183
|
+
if (!fs.existsSync(file)) {
|
|
184
|
+
throw new Error(`No follow-ups recorded for '${changeId}'; index ${index} does not exist.`);
|
|
185
|
+
}
|
|
186
|
+
const original = fs.readFileSync(file, 'utf-8');
|
|
187
|
+
const lines = original.split('\n');
|
|
188
|
+
let seen = 0;
|
|
189
|
+
let targetLine = -1;
|
|
190
|
+
let targetMatch = null;
|
|
191
|
+
for (let i = 0; i < lines.length; i++) {
|
|
192
|
+
const match = lines[i].match(ITEM_LINE);
|
|
193
|
+
if (!match)
|
|
194
|
+
continue;
|
|
195
|
+
seen += 1;
|
|
196
|
+
if (seen === index) {
|
|
197
|
+
targetLine = i;
|
|
198
|
+
targetMatch = match;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (targetLine === -1 || !targetMatch) {
|
|
203
|
+
throw new Error(`Follow-up ${changeId}#${index} does not exist.`);
|
|
204
|
+
}
|
|
205
|
+
const checked = targetMatch[1].toLowerCase() === 'x';
|
|
206
|
+
let body = targetMatch[2];
|
|
207
|
+
if (checked) {
|
|
208
|
+
const claim = body.match(CLAIMED_SUFFIX);
|
|
209
|
+
const claimedBy = claim ? claim[2] : 'unknown';
|
|
210
|
+
throw new Error(`Follow-up ${changeId}#${index} is already claimed by ${claimedBy}.`);
|
|
211
|
+
}
|
|
212
|
+
if (!resolveChangeId(projectRoot, byId)) {
|
|
213
|
+
throw new Error(`--by change '${byId}' not found (neither in flight nor archived).`);
|
|
214
|
+
}
|
|
215
|
+
lines[targetLine] = `- [x] ${body} -> claimed by ${byId}`;
|
|
216
|
+
fs.writeFileSync(file, lines.join('\n'), 'utf-8');
|
|
217
|
+
return { change: changeId, index, by: byId };
|
|
218
|
+
}
|
|
219
|
+
/** CLI wrapper for `openspec follow-up add <change-id> "<text>" [--from <task>]`. */
|
|
220
|
+
export function followUpAddHandler(projectRoot, changeId, text, options) {
|
|
221
|
+
try {
|
|
222
|
+
if (!changeId)
|
|
223
|
+
throw new Error('Missing required argument <change-id>.');
|
|
224
|
+
if (!text)
|
|
225
|
+
throw new Error('Missing required argument "<text>".');
|
|
226
|
+
const result = addFollowUp(projectRoot, changeId, text, options.from);
|
|
227
|
+
if (options.json) {
|
|
228
|
+
printJson({ added: true, ...result });
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
console.log(`added ${result.change}#${result.index}`);
|
|
232
|
+
return 0;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
236
|
+
return 1;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/** CLI wrapper for `openspec follow-up list [--json]`. */
|
|
240
|
+
export function followUpListHandler(projectRoot, options) {
|
|
241
|
+
const items = listFollowUps(projectRoot);
|
|
242
|
+
if (options.json) {
|
|
243
|
+
printJson(items);
|
|
244
|
+
return 0;
|
|
245
|
+
}
|
|
246
|
+
if (items.length === 0) {
|
|
247
|
+
console.log('no open follow-ups');
|
|
248
|
+
return 0;
|
|
249
|
+
}
|
|
250
|
+
for (const item of items) {
|
|
251
|
+
const suffix = item.from ? ` (from ${item.from})` : '';
|
|
252
|
+
console.log(`${item.change}#${item.index} ${item.text}${suffix}`);
|
|
253
|
+
}
|
|
254
|
+
return 0;
|
|
255
|
+
}
|
|
256
|
+
/** CLI wrapper for `openspec follow-up claim <change-id> <index> --by <change-id>`. */
|
|
257
|
+
export function followUpClaimHandler(projectRoot, changeId, indexArg, options) {
|
|
258
|
+
try {
|
|
259
|
+
if (!changeId)
|
|
260
|
+
throw new Error('Missing required argument <change-id>.');
|
|
261
|
+
const index = Number(indexArg);
|
|
262
|
+
if (!indexArg || !Number.isInteger(index) || index < 1) {
|
|
263
|
+
throw new Error('Missing or invalid <index>.');
|
|
264
|
+
}
|
|
265
|
+
if (!options.by)
|
|
266
|
+
throw new Error('Missing required option --by <change-id>.');
|
|
267
|
+
const result = claimFollowUp(projectRoot, changeId, index, options.by);
|
|
268
|
+
if (options.json) {
|
|
269
|
+
printJson({ claimed: true, ...result });
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
console.log(`claimed ${result.change}#${result.index} by ${result.by}`);
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
277
|
+
return 1;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type ArtifactInstructions } from '../../vendor/openspec/engine/index.js';
|
|
2
|
+
export interface InstructionsOptions {
|
|
3
|
+
change?: string;
|
|
4
|
+
schema?: string;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const SPECIAL_TARGETS: Set<string>;
|
|
8
|
+
export declare function instructionsHandler(projectRoot: string, artifactId: string | undefined, options: InstructionsOptions): number;
|
|
9
|
+
export declare function printInstructionsText(instructions: ArtifactInstructions, isBlocked: boolean): void;
|
|
10
|
+
interface ApplyInstructions {
|
|
11
|
+
changeName: string;
|
|
12
|
+
changeDir: string;
|
|
13
|
+
schemaName: string;
|
|
14
|
+
contextFiles: Record<string, string[]>;
|
|
15
|
+
progress: {
|
|
16
|
+
total: number;
|
|
17
|
+
complete: number;
|
|
18
|
+
remaining: number;
|
|
19
|
+
};
|
|
20
|
+
tasks: {
|
|
21
|
+
id: string;
|
|
22
|
+
description: string;
|
|
23
|
+
done: boolean;
|
|
24
|
+
}[];
|
|
25
|
+
state: 'blocked' | 'all_done' | 'ready';
|
|
26
|
+
missingArtifacts?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Every artifact still to build before apply's own gate is satisfied, in
|
|
29
|
+
* the schema's build order - the transitive closure of `apply.requires`.
|
|
30
|
+
* Computed independently of `state`: a `ready` change (apply.requires
|
|
31
|
+
* itself satisfied) can still be missing artifacts the required one
|
|
32
|
+
* transitively depends on, which `missingArtifacts` never names since it
|
|
33
|
+
* stops at the first hop apply blocks on. Present whenever non-empty.
|
|
34
|
+
*/
|
|
35
|
+
missingPrerequisites?: string[];
|
|
36
|
+
/** Non-blocking problems with the change, reported alongside the instruction. */
|
|
37
|
+
warnings?: string[];
|
|
38
|
+
instruction: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether the "Not created yet, in build order" line would repeat information
|
|
42
|
+
* the "Missing artifacts" line already gave in full.
|
|
43
|
+
*
|
|
44
|
+
* Compared as sets, not lengths: two equal-length lists naming different ids
|
|
45
|
+
* (e.g. a schema whose transitive chain swaps one artifact for another at the
|
|
46
|
+
* same depth) are NOT the same information, and a length-only compare (the
|
|
47
|
+
* prior `missingPrerequisites.length <= missingArtifacts.length`) would
|
|
48
|
+
* silently drop the second list even though it names something new.
|
|
49
|
+
* Exported for direct unit coverage of the comparison rule.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isChainAlreadyNamed(state: ApplyInstructions['state'], missingArtifacts: string[] | undefined, missingPrerequisites: string[] | undefined): boolean;
|
|
52
|
+
/** Archive-inputs brief: context and advisory guidance, both optional. */
|
|
53
|
+
export interface ArchiveInstructions {
|
|
54
|
+
changeName: string;
|
|
55
|
+
context?: string;
|
|
56
|
+
operationGuidance?: string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Builds the archive inputs: project context (`openspec/config.yaml` `context`), the
|
|
60
|
+
* project's `operations.archive.guidance`, then the schema's `archive.guidance`.
|
|
61
|
+
* @param projectRoot Project root.
|
|
62
|
+
* @param changeName Change id.
|
|
63
|
+
* @param explicitSchema `--schema` override.
|
|
64
|
+
* @returns The brief the archive skill prints.
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildArchiveInstructions(projectRoot: string, changeName: string, explicitSchema?: string): ArchiveInstructions;
|
|
67
|
+
export { SPECIAL_TARGETS };
|