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,105 @@
|
|
|
1
|
+
// Reconstructed minimal slice of upstream @fission-ai/openspec@1.8.0
|
|
2
|
+
// src/utils/task-progress.ts
|
|
3
|
+
// Only `parseTaskLines` (and its `ParsedTask` shape) is reproduced here: it is
|
|
4
|
+
// the single dependency `task-numbering.ts` has on task-progress. The rest of
|
|
5
|
+
// task-progress (schema/artifact-graph-driven task-file resolution, progress
|
|
6
|
+
// counting, unreadable-file tracking) is out of the change-validation slice and
|
|
7
|
+
// is deliberately NOT vendored. The regex and semantics below are faithful to
|
|
8
|
+
// upstream so task-numbering behaves identically.
|
|
9
|
+
/**
|
|
10
|
+
* A Markdown task line: a `-`/`*` bullet carrying a `[ ]` or `[x]` checkbox.
|
|
11
|
+
*
|
|
12
|
+
* Leading whitespace is allowed so nested sub-tasks count like their parents.
|
|
13
|
+
* Deliberately unanchored at the end: `.` does not match `\r`, so writing the
|
|
14
|
+
* description group as `(.*)$` would reject every line of a CRLF tasks.md.
|
|
15
|
+
*/
|
|
16
|
+
const TASK_LINE_PATTERN = /^\s*[-*]\s*\[([\sxX])\]\s*(.*)/;
|
|
17
|
+
/**
|
|
18
|
+
* Parses every task line in a tasks file, in document order. Every line matching
|
|
19
|
+
* the pattern counts, wherever it sits (inside a code fence, HTML comment, or an
|
|
20
|
+
* indented block), matching upstream.
|
|
21
|
+
*/
|
|
22
|
+
export function parseTaskLines(content) {
|
|
23
|
+
const tasks = [];
|
|
24
|
+
for (const line of content.split('\n')) {
|
|
25
|
+
const match = line.match(TASK_LINE_PATTERN);
|
|
26
|
+
if (match) {
|
|
27
|
+
tasks.push({ done: match[1].toLowerCase() === 'x', description: match[2].trim() });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return tasks;
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// FreeHarness V4-P4 (4.5): per-task annotation lines. Not in upstream.
|
|
34
|
+
//
|
|
35
|
+
// The FreeHarness tasks template allows optional lines under a task that name
|
|
36
|
+
// how to verify it, which interfaces it touches, its write boundary, its
|
|
37
|
+
// dependencies and, when the task is resolved outside this change, its
|
|
38
|
+
// disposition:
|
|
39
|
+
//
|
|
40
|
+
// - [ ] 2.1 Implement the parser
|
|
41
|
+
// Verify: node --test test/parser.test.ts
|
|
42
|
+
// Interfaces: parseTaskLines(content)
|
|
43
|
+
// Boundary: packages/sdd/vendor/openspec/validation/
|
|
44
|
+
// Depends: 1.2
|
|
45
|
+
// Disposition: moved other-change
|
|
46
|
+
//
|
|
47
|
+
// They carry no checkbox, so `parseTaskLines` above never counts them; this
|
|
48
|
+
// section only makes the convention explicit (one place defines the keys) and
|
|
49
|
+
// attaches the annotations to the task they follow for readers such as the
|
|
50
|
+
// converge hook and the subagent-driven-development briefs.
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/** The annotation keys the tasks template documents. */
|
|
53
|
+
export const TASK_ANNOTATION_KEYS = ['Verify', 'Interfaces', 'Boundary', 'Depends', 'Disposition'];
|
|
54
|
+
// The trailing `\s*` absorbs the `\r` of a CRLF file, which `.` never matches, the same way
|
|
55
|
+
// TASK_LINE_PATTERN above drops its end anchor; without it no annotation of such a file parses.
|
|
56
|
+
const TASK_ANNOTATION_PATTERN = /^\s*(Verify|Interfaces|Boundary|Depends|Disposition):\s*(.*)\s*$/;
|
|
57
|
+
/**
|
|
58
|
+
* True when the line is one of the documented annotation lines. Such a line is
|
|
59
|
+
* never a task, whatever precedes it.
|
|
60
|
+
*/
|
|
61
|
+
export function isTaskAnnotationLine(line) {
|
|
62
|
+
return TASK_ANNOTATION_PATTERN.test(line);
|
|
63
|
+
}
|
|
64
|
+
/** Splits a `Disposition:` value into its leading kind token and the rest. */
|
|
65
|
+
function parseDisposition(value) {
|
|
66
|
+
const match = value.match(/^(\S+)\s*(.*)$/);
|
|
67
|
+
return match ? { kind: match[1], target: match[2].trim() } : { kind: '', target: '' };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parses task lines and attaches the annotation lines that directly follow each
|
|
71
|
+
* task (blank lines and non-annotation prose end the run). The task count is
|
|
72
|
+
* exactly `parseTaskLines(content).length`.
|
|
73
|
+
*/
|
|
74
|
+
export function parseAnnotatedTaskLines(content) {
|
|
75
|
+
const tasks = [];
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
let current;
|
|
78
|
+
for (let i = 0; i < lines.length; i++) {
|
|
79
|
+
const line = lines[i];
|
|
80
|
+
const task = line.match(TASK_LINE_PATTERN);
|
|
81
|
+
if (task) {
|
|
82
|
+
current = {
|
|
83
|
+
done: task[1].toLowerCase() === 'x',
|
|
84
|
+
description: task[2].trim(),
|
|
85
|
+
line: i + 1,
|
|
86
|
+
annotations: {},
|
|
87
|
+
disposition: null,
|
|
88
|
+
};
|
|
89
|
+
tasks.push(current);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const annotation = line.match(TASK_ANNOTATION_PATTERN);
|
|
93
|
+
if (annotation && current) {
|
|
94
|
+
const key = annotation[1];
|
|
95
|
+
const value = annotation[2].trim();
|
|
96
|
+
current.annotations[key] = value;
|
|
97
|
+
if (key === 'Disposition')
|
|
98
|
+
current.disposition = parseDisposition(value);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// A blank line or any other prose ends the annotation run.
|
|
102
|
+
current = undefined;
|
|
103
|
+
}
|
|
104
|
+
return tasks;
|
|
105
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface TaskNumberingDocument {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface TaskNumberingIssue {
|
|
6
|
+
path: string;
|
|
7
|
+
line: number;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Finds ambiguous task references across the task files tracked by a change.
|
|
12
|
+
* Numbering is interpreted only inside `## N.` groups. Unnumbered sections,
|
|
13
|
+
* unnumbered tasks, and files without numbered groups are intentionally ignored.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findTaskNumberingIssues(documents: readonly TaskNumberingDocument[]): TaskNumberingIssue[];
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { parseTaskLines } from './task-lines.js';
|
|
2
|
+
const LEVEL_TWO_HEADING = /^ {0,3}##(?!#)(?:[ \t]+|[ \t]*\r?$)/;
|
|
3
|
+
const NUMBERED_GROUP_HEADING = /^ {0,3}##[ \t]+(\d+)\.(?:[ \t]|\r?$)/;
|
|
4
|
+
const TASK_ID = /^(\d+(?:\.\d+)+(?:[A-Za-z]+)?)(?=\s|$)/;
|
|
5
|
+
/**
|
|
6
|
+
* Finds ambiguous task references across the task files tracked by a change.
|
|
7
|
+
* Numbering is interpreted only inside `## N.` groups. Unnumbered sections,
|
|
8
|
+
* unnumbered tasks, and files without numbered groups are intentionally ignored.
|
|
9
|
+
*/
|
|
10
|
+
export function findTaskNumberingIssues(documents) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const firstLocationById = new Map();
|
|
13
|
+
for (const document of documents) {
|
|
14
|
+
const lines = document.content.split('\n');
|
|
15
|
+
if (!lines.some((line) => NUMBERED_GROUP_HEADING.test(line)))
|
|
16
|
+
continue;
|
|
17
|
+
let currentGroup;
|
|
18
|
+
lines.forEach((line, index) => {
|
|
19
|
+
if (LEVEL_TWO_HEADING.test(line)) {
|
|
20
|
+
currentGroup = line.match(NUMBERED_GROUP_HEADING)?.[1];
|
|
21
|
+
}
|
|
22
|
+
if (currentGroup === undefined)
|
|
23
|
+
return;
|
|
24
|
+
const task = parseTaskLines(line)[0];
|
|
25
|
+
const id = task?.description.match(TASK_ID)?.[1];
|
|
26
|
+
if (!id)
|
|
27
|
+
return;
|
|
28
|
+
const lineNumber = index + 1;
|
|
29
|
+
const taskGroup = id.split('.')[0];
|
|
30
|
+
const normalizedTaskGroup = taskGroup.replace(/^0+(?=\d)/, '');
|
|
31
|
+
const normalizedCurrentGroup = currentGroup.replace(/^0+(?=\d)/, '');
|
|
32
|
+
if (normalizedTaskGroup !== normalizedCurrentGroup) {
|
|
33
|
+
issues.push({
|
|
34
|
+
path: document.path,
|
|
35
|
+
line: lineNumber,
|
|
36
|
+
message: `Task "${id}" is under group ${currentGroup}, but its leading number points to group ${taskGroup}. Move it to group ${taskGroup} or renumber it.`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const firstLocation = firstLocationById.get(id);
|
|
40
|
+
if (firstLocation !== undefined) {
|
|
41
|
+
const firstDeclaration = firstLocation.path === document.path
|
|
42
|
+
? `on line ${firstLocation.line}`
|
|
43
|
+
: `in ${firstLocation.path} on line ${firstLocation.line}`;
|
|
44
|
+
issues.push({
|
|
45
|
+
path: document.path,
|
|
46
|
+
line: lineNumber,
|
|
47
|
+
message: `Task ID "${id}" is duplicated; it was first declared ${firstDeclaration}.`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
firstLocationById.set(id, { path: document.path, line: lineNumber });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return issues;
|
|
56
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ValidationLevel = 'ERROR' | 'WARNING' | 'INFO';
|
|
2
|
+
export interface ValidationIssue {
|
|
3
|
+
level: ValidationLevel;
|
|
4
|
+
path: string;
|
|
5
|
+
message: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
column?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ValidationReport {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
issues: ValidationIssue[];
|
|
12
|
+
summary: {
|
|
13
|
+
errors: number;
|
|
14
|
+
warnings: number;
|
|
15
|
+
info: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ValidationReport, ValidationIssue } from './types.js';
|
|
2
|
+
export declare class Validator {
|
|
3
|
+
private strictMode;
|
|
4
|
+
constructor(strictMode?: boolean);
|
|
5
|
+
validateSpec(filePath: string): Promise<ValidationReport>;
|
|
6
|
+
/**
|
|
7
|
+
* Validate spec content from a string (used for pre-write validation of rebuilt specs)
|
|
8
|
+
*/
|
|
9
|
+
validateSpecContent(specName: string, content: string): Promise<ValidationReport>;
|
|
10
|
+
/**
|
|
11
|
+
* Validate the change proposal document (Why / What Changes prose + the
|
|
12
|
+
* top-level ChangeSchema). Delta-level checks live in
|
|
13
|
+
* `validateChangeDeltaSpecs`. This is the non-blocking proposal-level pass
|
|
14
|
+
* archive uses; TRIMMED here to drop the skip_specs marker awareness.
|
|
15
|
+
*/
|
|
16
|
+
validateChange(filePath: string): Promise<ValidationReport>;
|
|
17
|
+
/**
|
|
18
|
+
* Validate delta-formatted spec files under a change directory.
|
|
19
|
+
* Enforces:
|
|
20
|
+
* - At least one delta across all files
|
|
21
|
+
* - ADDED/MODIFIED: each requirement has at least one scenario; missing
|
|
22
|
+
* English SHALL/MUST keywords are guidance unless strict mode is enabled
|
|
23
|
+
* - REMOVED: names only; no scenario/description required
|
|
24
|
+
* - RENAMED: pairs well-formed
|
|
25
|
+
* - No duplicates within sections; no cross-section conflicts per spec
|
|
26
|
+
*
|
|
27
|
+
* When `options.mainSpecsDir` is given, MODIFIED blocks are also checked
|
|
28
|
+
* against the current main specs for the scenario loss archive refuses to
|
|
29
|
+
* apply (#1477). When `options.projectRoot` is given, the change's tasks.md is
|
|
30
|
+
* checked for ambiguous task numbering (#1520).
|
|
31
|
+
*/
|
|
32
|
+
validateChangeDeltaSpecs(changeDir: string, options?: {
|
|
33
|
+
mainSpecsDir?: string;
|
|
34
|
+
projectRoot?: string;
|
|
35
|
+
}): Promise<ValidationReport>;
|
|
36
|
+
/**
|
|
37
|
+
* Task-numbering check, reconstructed minimally for this slice. Upstream
|
|
38
|
+
* resolves the schema's tracked task files (artifact graph) and gates the
|
|
39
|
+
* check to the built-in spec-driven schema; here we read the change's
|
|
40
|
+
* top-level tasks.md — the spec-driven schema's `apply.tracks` target — and
|
|
41
|
+
* run the identical `findTaskNumberingIssues` analysis.
|
|
42
|
+
*/
|
|
43
|
+
private collectTaskNumberingIssues;
|
|
44
|
+
/**
|
|
45
|
+
* Report MODIFIED requirements whose block omits a scenario the main spec
|
|
46
|
+
* still carries. Uses the same comparison archive applies, so validate can
|
|
47
|
+
* only report what archive would refuse.
|
|
48
|
+
*
|
|
49
|
+
* Silent when the main spec or the requirement header is absent: applying a
|
|
50
|
+
* MODIFIED against a base that is not there yet is a different failure (a
|
|
51
|
+
* sister change still in flight is the legitimate case), and archive is the
|
|
52
|
+
* gate for it. A spec that exists but cannot be read is not absent, though —
|
|
53
|
+
* archive aborts on it, so reporting it beats calling the change valid.
|
|
54
|
+
*/
|
|
55
|
+
private findScenarioLossIssues;
|
|
56
|
+
private convertZodErrors;
|
|
57
|
+
private applySpecRules;
|
|
58
|
+
private applyChangeRules;
|
|
59
|
+
private enrichTopLevelError;
|
|
60
|
+
private extractNameFromPath;
|
|
61
|
+
/**
|
|
62
|
+
* Dry-run archive's merge builder without writing its result. Reusing the
|
|
63
|
+
* builder preserves its already-synced delta rules instead of duplicating them.
|
|
64
|
+
* INFO leaves the verdict unchanged: a missing target can be a typo or a
|
|
65
|
+
* requirement introduced by a sibling change that has not archived yet.
|
|
66
|
+
* This does not run archive's later merged-spec validation or retirement checks.
|
|
67
|
+
*/
|
|
68
|
+
findArchiveBlockers(changeDir: string, mainSpecsDir: string, alreadyReportedPaths: string[]): Promise<ValidationIssue[]>;
|
|
69
|
+
/**
|
|
70
|
+
* FreeHarness addition: MODIFIED / REMOVED / RENAMED headers absent from the
|
|
71
|
+
* current main spec (delta-resolution.ts). ERROR in strict mode, WARNING
|
|
72
|
+
* otherwise: the default verdict tolerates a sister change still in flight,
|
|
73
|
+
* strict does not. The change's parent directory is the changes root, which
|
|
74
|
+
* is where the ADDED-elsewhere attribution looks.
|
|
75
|
+
*/
|
|
76
|
+
private findUnresolvedHeaderIssues;
|
|
77
|
+
private createReport;
|
|
78
|
+
isValid(report: ValidationReport): boolean;
|
|
79
|
+
private extractRequirementText;
|
|
80
|
+
private containsShallOrMust;
|
|
81
|
+
/**
|
|
82
|
+
* Build a message for a requirement block whose body lacks SHALL/MUST.
|
|
83
|
+
*
|
|
84
|
+
* When the SHALL/MUST keyword already appears in the requirement header (e.g.
|
|
85
|
+
* `### Requirement: The system SHALL ...`) the original generic error
|
|
86
|
+
* ("must contain SHALL or MUST") is confusing because the keyword is visibly
|
|
87
|
+
* present in the spec. Per the OpenSpec conventions the keyword has to live
|
|
88
|
+
* on the requirement body line (the line right after the header), so we point
|
|
89
|
+
* the author at that exact fix when the keyword is found in the header only.
|
|
90
|
+
*/
|
|
91
|
+
private buildMissingShallOrMustMessage;
|
|
92
|
+
private countScenarios;
|
|
93
|
+
private formatSectionList;
|
|
94
|
+
}
|