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.
Files changed (375) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +108 -0
  3. package/README.md +134 -0
  4. package/canonical/HARVEST.yaml +858 -0
  5. package/canonical/PROVENANCE.yaml +740 -0
  6. package/canonical/agents/README.md +95 -0
  7. package/canonical/agents/agentic-architect.md +18 -0
  8. package/canonical/agents/database-reviewer.md +41 -0
  9. package/canonical/agents/explorer-ai-engineer-analyst.md +65 -0
  10. package/canonical/agents/pr-reviewer.md +96 -0
  11. package/canonical/agents/python-reviewer.md +55 -0
  12. package/canonical/agents/report-formatter.md +19 -0
  13. package/canonical/agents/security-reviewer.md +53 -0
  14. package/canonical/agents/test-writer.md +34 -0
  15. package/canonical/commands/fh-context.md +37 -0
  16. package/canonical/evals/promptfoo.redteam.yaml +108 -0
  17. package/canonical/hooks/cost-prices.json +14 -0
  18. package/canonical/hooks/freeharness-auto-memory.mjs +158 -0
  19. package/canonical/hooks/freeharness-config-guard.mjs +162 -0
  20. package/canonical/hooks/freeharness-context-monitor.mjs +198 -0
  21. package/canonical/hooks/freeharness-converge.mjs +227 -0
  22. package/canonical/hooks/freeharness-cost-tracker.mjs +1027 -0
  23. package/canonical/hooks/freeharness-memory-guard.mjs +57 -0
  24. package/canonical/hooks/freeharness-output-pruner.mjs +333 -0
  25. package/canonical/hooks/freeharness-precompact.mjs +323 -0
  26. package/canonical/hooks/freeharness-repeat-tool.mjs +208 -0
  27. package/canonical/hooks/freeharness-security-guidance.mjs +164 -0
  28. package/canonical/hooks/freeharness-session-start +583 -0
  29. package/canonical/hooks/hooks.auto-memory.claude-code.json +16 -0
  30. package/canonical/hooks/hooks.claude-code.json +17 -0
  31. package/canonical/hooks/hooks.config-guard.claude-code.json +16 -0
  32. package/canonical/hooks/hooks.context-monitor.claude-code.json +15 -0
  33. package/canonical/hooks/hooks.converge.claude-code.json +15 -0
  34. package/canonical/hooks/hooks.cost-tracker.claude-code.json +37 -0
  35. package/canonical/hooks/hooks.memory-guard.claude-code.json +16 -0
  36. package/canonical/hooks/hooks.output-pruner.claude-code.json +16 -0
  37. package/canonical/hooks/hooks.precompact.claude-code.json +15 -0
  38. package/canonical/hooks/hooks.repeat-tool.claude-code.json +25 -0
  39. package/canonical/hooks/hooks.security-guidance.claude-code.json +16 -0
  40. package/canonical/mcp/servers.json +20 -0
  41. package/canonical/openspec/config.base.yaml +89 -0
  42. package/canonical/openspec/schema.spec-driven.yaml +277 -0
  43. package/canonical/openspec/templates/data-contract.md +36 -0
  44. package/canonical/openspec/templates/design.md +84 -0
  45. package/canonical/openspec/templates/eval-plan.md +33 -0
  46. package/canonical/openspec/templates/follow-ups.md +2 -0
  47. package/canonical/openspec/templates/proposal.md +45 -0
  48. package/canonical/openspec/templates/spec.md +42 -0
  49. package/canonical/openspec/templates/tasks.md +38 -0
  50. package/canonical/profiles/local-llamacpp.LOCAL-MODELS.md +47 -0
  51. package/canonical/profiles/local-llamacpp.json +27 -0
  52. package/canonical/profiles/local-ollama.json +20 -0
  53. package/canonical/profiles/mcp.json +91 -0
  54. package/canonical/rules/CLAUDE.md +78 -0
  55. package/canonical/rules/project-CLAUDE.template.md +62 -0
  56. package/canonical/rules/routing.md +20 -0
  57. package/canonical/rules/safety.md +41 -0
  58. package/canonical/settings/settings.cache-hygiene.claude-code.json +5 -0
  59. package/canonical/skills/agent-evaluation/SKILL.md +102 -0
  60. package/canonical/skills/agent-evaluation/assets/evaluation_report_template.md +206 -0
  61. package/canonical/skills/agent-evaluation/evals/cases.yaml +106 -0
  62. package/canonical/skills/agent-evaluation/references/dataset-preparation.md +351 -0
  63. package/canonical/skills/agent-evaluation/references/scorers-constraints.md +165 -0
  64. package/canonical/skills/agent-evaluation/references/scorers.md +431 -0
  65. package/canonical/skills/agent-evaluation/references/setup-guide.md +252 -0
  66. package/canonical/skills/agent-evaluation/references/tracing-integration.md +164 -0
  67. package/canonical/skills/agent-evaluation/references/troubleshooting.md +514 -0
  68. package/canonical/skills/agent-evaluation/scripts/analyze_results.py +462 -0
  69. package/canonical/skills/agent-evaluation/scripts/create_dataset_template.py +382 -0
  70. package/canonical/skills/agent-evaluation/scripts/list_datasets.py +273 -0
  71. package/canonical/skills/agent-evaluation/scripts/run_evaluation_template.py +309 -0
  72. package/canonical/skills/agent-evaluation/scripts/setup_mlflow.py +353 -0
  73. package/canonical/skills/agent-evaluation/scripts/utils/__init__.py +27 -0
  74. package/canonical/skills/agent-evaluation/scripts/utils/env_validation.py +123 -0
  75. package/canonical/skills/agent-evaluation/scripts/utils/tracing_utils.py +108 -0
  76. package/canonical/skills/agent-evaluation/scripts/validate_agent_tracing.py +148 -0
  77. package/canonical/skills/agent-evaluation/scripts/validate_auth.py +240 -0
  78. package/canonical/skills/agent-evaluation/scripts/validate_environment.py +185 -0
  79. package/canonical/skills/agent-evaluation/scripts/validate_tracing_runtime.py +318 -0
  80. package/canonical/skills/agentic-architecture/SKILL.md +41 -0
  81. package/canonical/skills/agentic-architecture/evals/cases.yaml +94 -0
  82. package/canonical/skills/agentic-architecture/reference/context-engineering.md +75 -0
  83. package/canonical/skills/agentic-architecture/reference/patterns.md +76 -0
  84. package/canonical/skills/agentic-architecture/reference/reliability-observability.md +94 -0
  85. package/canonical/skills/agentic-architecture/reference/review-framework.md +59 -0
  86. package/canonical/skills/code-review/SKILL.md +52 -0
  87. package/canonical/skills/code-review/evals/cases.yaml +197 -0
  88. package/canonical/skills/git-workflow/SKILL.md +41 -0
  89. package/canonical/skills/git-workflow/evals/cases.yaml +92 -0
  90. package/canonical/skills/local-code/SKILL.md +24 -0
  91. package/canonical/skills/local-code/evals/cases.yaml +85 -0
  92. package/canonical/skills/local-code/scripts/query_llama.py +68 -0
  93. package/canonical/skills/report-formatting/SKILL.md +62 -0
  94. package/canonical/skills/report-formatting/evals/cases.yaml +83 -0
  95. package/canonical/skills/report-formatting/reference/ARCHITECTURE.md +135 -0
  96. package/canonical/skills/report-formatting/reference/HELPERS.md +120 -0
  97. package/canonical/skills/report-formatting/reference/PPTX.md +136 -0
  98. package/canonical/skills/report-formatting/reference/RELEASE.md +99 -0
  99. package/canonical/skills/report-formatting/reference/TEMPLATES.md +48 -0
  100. package/canonical/skills/report-formatting/reference/authoring.md +66 -0
  101. package/canonical/skills/report-formatting/scripts/architecture-template.md +271 -0
  102. package/canonical/skills/report-formatting/scripts/assets/claro-logo.png +0 -0
  103. package/canonical/skills/report-formatting/scripts/assets/claro-wordmark.svg +1 -0
  104. package/canonical/skills/report-formatting/scripts/build-architecture.js +57 -0
  105. package/canonical/skills/report-formatting/scripts/build-md-claro.js +224 -0
  106. package/canonical/skills/report-formatting/scripts/build-release.js +51 -0
  107. package/canonical/skills/report-formatting/scripts/check-env.js +58 -0
  108. package/canonical/skills/report-formatting/scripts/docmodel.js +283 -0
  109. package/canonical/skills/report-formatting/scripts/example-build.js +119 -0
  110. package/canonical/skills/report-formatting/scripts/example_build_ArchitectureReview_docx.js +195 -0
  111. package/canonical/skills/report-formatting/scripts/example_build_ExecutiveReport_docx.js +114 -0
  112. package/canonical/skills/report-formatting/scripts/package.json +17 -0
  113. package/canonical/skills/report-formatting/scripts/pptx/example_build_StatusReport_pptx.py +223 -0
  114. package/canonical/skills/report-formatting/scripts/pptx/example_build_WeeklyStatus_pptx.py +245 -0
  115. package/canonical/skills/report-formatting/scripts/pptx/pptx_office.py +144 -0
  116. package/canonical/skills/report-formatting/scripts/pptx/requirements.txt +7 -0
  117. package/canonical/skills/report-formatting/scripts/pptx/status_report_blocks.py +193 -0
  118. package/canonical/skills/report-formatting/scripts/pptx/theme_claro_pptx.py +473 -0
  119. package/canonical/skills/report-formatting/scripts/release-template.md +80 -0
  120. package/canonical/skills/report-formatting/scripts/render-mermaid.js +105 -0
  121. package/canonical/skills/report-formatting/scripts/theme-claro.js +403 -0
  122. package/canonical/skills/subagent-driven-development/SKILL.md +60 -0
  123. package/canonical/skills/subagent-driven-development/evals/cases.yaml +208 -0
  124. package/canonical/skills/subagent-driven-development/reference/brief.md +91 -0
  125. package/canonical/skills/subagent-driven-development/reference/handoff.md +118 -0
  126. package/canonical/skills/subagent-driven-development/scripts/validate-handoff.mjs +850 -0
  127. package/canonical/skills/systematic-debugging/SKILL.md +44 -0
  128. package/canonical/skills/systematic-debugging/evals/cases.yaml +90 -0
  129. package/canonical/skills/test-driven-development/SKILL.md +42 -0
  130. package/canonical/skills/test-driven-development/evals/cases.yaml +86 -0
  131. package/canonical/skills/test-driven-development/reference/writing-good-tests.md +52 -0
  132. package/canonical/skills/verification-before-completion/SKILL.md +53 -0
  133. package/canonical/skills/verification-before-completion/evals/cases.yaml +107 -0
  134. package/dist/adapters/content/language-lint.d.ts +46 -0
  135. package/dist/adapters/content/language-lint.js +191 -0
  136. package/dist/adapters/harness/claude-code.d.ts +57 -0
  137. package/dist/adapters/harness/claude-code.js +385 -0
  138. package/dist/adapters/harness/index.d.ts +3 -0
  139. package/dist/adapters/harness/index.js +17 -0
  140. package/dist/adapters/harness/opencode.d.ts +7 -0
  141. package/dist/adapters/harness/opencode.js +166 -0
  142. package/dist/adapters/harness/plugin.d.ts +22 -0
  143. package/dist/adapters/harness/plugin.js +257 -0
  144. package/dist/adapters/memory/doctor.d.ts +480 -0
  145. package/dist/adapters/memory/doctor.js +1217 -0
  146. package/dist/adapters/memory/vendored.d.ts +150 -0
  147. package/dist/adapters/memory/vendored.js +487 -0
  148. package/dist/adapters/package/node.d.ts +9 -0
  149. package/dist/adapters/package/node.js +20 -0
  150. package/dist/adapters/prompt/readline.d.ts +19 -0
  151. package/dist/adapters/prompt/readline.js +53 -0
  152. package/dist/adapters/sync/diff.d.ts +43 -0
  153. package/dist/adapters/sync/diff.js +380 -0
  154. package/dist/cli/cleanup.d.ts +86 -0
  155. package/dist/cli/cleanup.js +382 -0
  156. package/dist/cli/cost.d.ts +304 -0
  157. package/dist/cli/cost.js +501 -0
  158. package/dist/cli/doctor.d.ts +205 -0
  159. package/dist/cli/doctor.js +654 -0
  160. package/dist/cli/executor.d.ts +5 -0
  161. package/dist/cli/executor.js +48 -0
  162. package/dist/cli/plugin-validate.d.ts +37 -0
  163. package/dist/cli/plugin-validate.js +256 -0
  164. package/dist/cli/prefix.d.ts +68 -0
  165. package/dist/cli/prefix.js +218 -0
  166. package/dist/cli/profile.d.ts +170 -0
  167. package/dist/cli/profile.js +285 -0
  168. package/dist/cli/runner.d.ts +10 -0
  169. package/dist/cli/runner.js +27 -0
  170. package/dist/cli/uninstall.d.ts +65 -0
  171. package/dist/cli/uninstall.js +147 -0
  172. package/dist/index.d.ts +8 -0
  173. package/dist/index.js +989 -0
  174. package/dist/infra/dogfood.d.ts +31 -0
  175. package/dist/infra/dogfood.js +51 -0
  176. package/dist/infra/fsutil.d.ts +40 -0
  177. package/dist/infra/fsutil.js +143 -0
  178. package/dist/infra/manifest.d.ts +76 -0
  179. package/dist/infra/manifest.js +92 -0
  180. package/dist/infra/paths.d.ts +19 -0
  181. package/dist/infra/paths.js +74 -0
  182. package/dist/infra/routing.d.ts +4 -0
  183. package/dist/infra/routing.js +7 -0
  184. package/node_modules/@freeharness/core/dist/context.d.ts +30 -0
  185. package/node_modules/@freeharness/core/dist/context.js +1 -0
  186. package/node_modules/@freeharness/core/dist/index.d.ts +5 -0
  187. package/node_modules/@freeharness/core/dist/index.js +6 -0
  188. package/node_modules/@freeharness/core/dist/planner.d.ts +13 -0
  189. package/node_modules/@freeharness/core/dist/planner.js +18 -0
  190. package/node_modules/@freeharness/core/dist/ports.d.ts +90 -0
  191. package/node_modules/@freeharness/core/dist/ports.js +1 -0
  192. package/node_modules/@freeharness/core/dist/registry.d.ts +41 -0
  193. package/node_modules/@freeharness/core/dist/registry.js +124 -0
  194. package/node_modules/@freeharness/core/dist/tiers.d.ts +30 -0
  195. package/node_modules/@freeharness/core/dist/tiers.js +99 -0
  196. package/node_modules/@freeharness/core/package.json +34 -0
  197. package/node_modules/@freeharness/sdd/PROVENANCE.yaml +175 -0
  198. package/node_modules/@freeharness/sdd/dist/src/bin/openspec.d.ts +2 -0
  199. package/node_modules/@freeharness/sdd/dist/src/bin/openspec.js +166 -0
  200. package/node_modules/@freeharness/sdd/dist/src/index.d.ts +14 -0
  201. package/node_modules/@freeharness/sdd/dist/src/index.js +11 -0
  202. package/node_modules/@freeharness/sdd/dist/src/init.d.ts +39 -0
  203. package/node_modules/@freeharness/sdd/dist/src/init.js +190 -0
  204. package/node_modules/@freeharness/sdd/dist/src/root-resolver.d.ts +8 -0
  205. package/node_modules/@freeharness/sdd/dist/src/root-resolver.js +32 -0
  206. package/node_modules/@freeharness/sdd/dist/src/shim/archive.d.ts +81 -0
  207. package/node_modules/@freeharness/sdd/dist/src/shim/archive.js +483 -0
  208. package/node_modules/@freeharness/sdd/dist/src/shim/context.d.ts +4 -0
  209. package/node_modules/@freeharness/sdd/dist/src/shim/context.js +48 -0
  210. package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.d.ts +57 -0
  211. package/node_modules/@freeharness/sdd/dist/src/shim/follow-up.js +279 -0
  212. package/node_modules/@freeharness/sdd/dist/src/shim/instructions.d.ts +67 -0
  213. package/node_modules/@freeharness/sdd/dist/src/shim/instructions.js +460 -0
  214. package/node_modules/@freeharness/sdd/dist/src/shim/list.d.ts +5 -0
  215. package/node_modules/@freeharness/sdd/dist/src/shim/list.js +95 -0
  216. package/node_modules/@freeharness/sdd/dist/src/shim/new-change.d.ts +6 -0
  217. package/node_modules/@freeharness/sdd/dist/src/shim/new-change.js +150 -0
  218. package/node_modules/@freeharness/sdd/dist/src/shim/schemas.d.ts +4 -0
  219. package/node_modules/@freeharness/sdd/dist/src/shim/schemas.js +23 -0
  220. package/node_modules/@freeharness/sdd/dist/src/shim/shared.d.ts +56 -0
  221. package/node_modules/@freeharness/sdd/dist/src/shim/shared.js +140 -0
  222. package/node_modules/@freeharness/sdd/dist/src/shim/status.d.ts +8 -0
  223. package/node_modules/@freeharness/sdd/dist/src/shim/status.js +85 -0
  224. package/node_modules/@freeharness/sdd/dist/src/shim/validate.d.ts +6 -0
  225. package/node_modules/@freeharness/sdd/dist/src/shim/validate.js +229 -0
  226. package/node_modules/@freeharness/sdd/dist/src/validate-change.d.ts +40 -0
  227. package/node_modules/@freeharness/sdd/dist/src/validate-change.js +114 -0
  228. package/node_modules/@freeharness/sdd/dist/src/validate.d.ts +24 -0
  229. package/node_modules/@freeharness/sdd/dist/src/validate.js +72 -0
  230. package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/specs-apply.d.ts +130 -0
  231. package/node_modules/@freeharness/sdd/dist/vendor/openspec/apply/specs-apply.js +981 -0
  232. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-metadata.d.ts +46 -0
  233. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-metadata.js +128 -0
  234. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.d.ts +26 -0
  235. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/change-status-policy.js +32 -0
  236. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/file-system.d.ts +50 -0
  237. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/file-system.js +394 -0
  238. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/global-config.d.ts +15 -0
  239. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/global-config.js +49 -0
  240. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/graph.d.ts +71 -0
  241. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/graph.js +164 -0
  242. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.d.ts +11 -0
  243. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/index.js +21 -0
  244. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/instruction-loader.d.ts +102 -0
  245. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/instruction-loader.js +230 -0
  246. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.d.ts +18 -0
  247. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/outputs.js +138 -0
  248. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/resolver.d.ts +82 -0
  249. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/resolver.js +333 -0
  250. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/schema.d.ts +12 -0
  251. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/schema.js +110 -0
  252. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/state.d.ts +11 -0
  253. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/state.js +32 -0
  254. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/task-progress.d.ts +33 -0
  255. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/task-progress.js +149 -0
  256. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/types.d.ts +39 -0
  257. package/node_modules/@freeharness/sdd/dist/vendor/openspec/engine/types.js +49 -0
  258. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/claude.d.ts +12 -0
  259. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/claude.js +31 -0
  260. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/index.d.ts +10 -0
  261. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/index.js +10 -0
  262. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/opencode.d.ts +12 -0
  263. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/adapters/opencode.js +26 -0
  264. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/generator.d.ts +28 -0
  265. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/generator.js +41 -0
  266. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/index.d.ts +23 -0
  267. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/index.js +25 -0
  268. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/invocation.d.ts +72 -0
  269. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/invocation.js +76 -0
  270. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/registry.d.ts +39 -0
  271. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/registry.js +53 -0
  272. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/types.d.ts +62 -0
  273. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/types.js +7 -0
  274. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/yaml.d.ts +35 -0
  275. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-generation/yaml.js +47 -0
  276. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-references.d.ts +33 -0
  277. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/command-references.js +55 -0
  278. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/allowed-tools.d.ts +11 -0
  279. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/allowed-tools.js +11 -0
  280. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/skill-generation.d.ts +48 -0
  281. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/shared/skill-generation.js +99 -0
  282. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/skill-templates.d.ts +19 -0
  283. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/skill-templates.js +18 -0
  284. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/types.d.ts +18 -0
  285. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/types.js +4 -0
  286. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/apply-change.d.ts +19 -0
  287. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/apply-change.js +207 -0
  288. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/archive-change.d.ts +12 -0
  289. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/archive-change.js +409 -0
  290. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/bulk-archive-change.d.ts +9 -0
  291. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/bulk-archive-change.js +673 -0
  292. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/continue-change.d.ts +9 -0
  293. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/continue-change.js +230 -0
  294. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/explore.d.ts +12 -0
  295. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/explore.js +550 -0
  296. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/feedback.d.ts +8 -0
  297. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/feedback.js +107 -0
  298. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/ff-change.d.ts +12 -0
  299. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/ff-change.js +228 -0
  300. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/new-change.d.ts +9 -0
  301. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/new-change.js +147 -0
  302. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/onboard.d.ts +9 -0
  303. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/onboard.js +571 -0
  304. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/propose.d.ts +12 -0
  305. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/propose.js +322 -0
  306. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/store-selection.d.ts +7 -0
  307. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/store-selection.js +7 -0
  308. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/sync-specs.d.ts +9 -0
  309. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/sync-specs.js +518 -0
  310. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/update-change.d.ts +9 -0
  311. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/update-change.js +176 -0
  312. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/verify-change.d.ts +9 -0
  313. package/node_modules/@freeharness/sdd/dist/vendor/openspec/generation/templates/workflows/verify-change.js +344 -0
  314. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.d.ts +39 -0
  315. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/constants.js +54 -0
  316. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/delta-resolution.d.ts +35 -0
  317. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/delta-resolution.js +171 -0
  318. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.d.ts +27 -0
  319. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/change-parser.js +210 -0
  320. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/code-fence.d.ts +14 -0
  321. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/code-fence.js +48 -0
  322. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/markdown-parser.d.ts +22 -0
  323. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/markdown-parser.js +186 -0
  324. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.d.ts +65 -0
  325. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-blocks.js +409 -0
  326. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.d.ts +55 -0
  327. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/requirement-text.js +98 -0
  328. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/spec-structure.d.ts +8 -0
  329. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/parsers/spec-structure.js +77 -0
  330. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/purpose-placeholder.d.ts +44 -0
  331. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/purpose-placeholder.js +116 -0
  332. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/base.schema.d.ts +12 -0
  333. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/base.schema.js +17 -0
  334. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/change.schema.d.ts +72 -0
  335. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/change.schema.js +30 -0
  336. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/index.d.ts +3 -0
  337. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/index.js +3 -0
  338. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/spec.schema.d.ts +17 -0
  339. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/schemas/spec.schema.js +14 -0
  340. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.d.ts +39 -0
  341. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/spec-discovery.js +114 -0
  342. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.d.ts +45 -0
  343. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-lines.js +105 -0
  344. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-numbering.d.ts +15 -0
  345. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/task-numbering.js +56 -0
  346. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/types.d.ts +17 -0
  347. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/types.js +1 -0
  348. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.d.ts +94 -0
  349. package/node_modules/@freeharness/sdd/dist/vendor/openspec/validation/validator.js +756 -0
  350. package/node_modules/@freeharness/sdd/package.json +57 -0
  351. package/node_modules/@freeharness/sdd/vendor/openspec/LICENSE.upstream +22 -0
  352. package/node_modules/@freeharness/sdd/vendor/openspec/assets/schema.upstream.yaml +232 -0
  353. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/README.md +19 -0
  354. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-apply-change/SKILL.md +187 -0
  355. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-archive-change/SKILL.md +181 -0
  356. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-bulk-archive-change/SKILL.md +338 -0
  357. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-continue-change/SKILL.md +117 -0
  358. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-explore/SKILL.md +342 -0
  359. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-ff-change/SKILL.md +116 -0
  360. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-new-change/SKILL.md +76 -0
  361. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-onboard/SKILL.md +560 -0
  362. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-propose/SKILL.md +162 -0
  363. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-sync-specs/SKILL.md +261 -0
  364. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-update-change/SKILL.md +90 -0
  365. package/node_modules/@freeharness/sdd/vendor/openspec/assets/skills/openspec-verify-change/SKILL.md +174 -0
  366. package/package.json +70 -0
  367. package/provenance/canonical.PROVENANCE.yaml +740 -0
  368. package/provenance/claude-mem.LICENSE.upstream +202 -0
  369. package/provenance/memory.PROVENANCE.yaml +399 -0
  370. package/provenance/sdd.PROVENANCE.yaml +175 -0
  371. package/vendor-licenses/caveman.LICENSE +27 -0
  372. package/vendor-licenses/deepseek-harness.LICENSE +21 -0
  373. package/vendor-licenses/ecc.LICENSE +21 -0
  374. package/vendor-licenses/pi.LICENSE +21 -0
  375. 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 };