@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.3

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 (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -2
  3. package/bin/doflow.js +44 -0
  4. package/core/.antigravity-plugin/hooks.json +39 -0
  5. package/core/.antigravity-plugin/mcp_config.json +18 -0
  6. package/core/.antigravity-plugin/plugin.json +31 -0
  7. package/core/.claude-plugin/marketplace.json +20 -0
  8. package/core/.claude-plugin/plugin.json +21 -0
  9. package/core/.codex-plugin/marketplace.json +20 -0
  10. package/core/.codex-plugin/plugin.json +35 -0
  11. package/core/.plugin/plugin.json +19 -0
  12. package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
  13. package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
  14. package/core/harnesses/claude/hooks/lib.sh +304 -0
  15. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
  16. package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
  17. package/core/harnesses/claude/hooks/post-compact.sh +74 -0
  18. package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
  19. package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
  20. package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
  21. package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
  22. package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
  23. package/core/harnesses/claude/hooks/session-end.sh +89 -0
  24. package/core/harnesses/claude/hooks/session-start.sh +5 -0
  25. package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
  26. package/core/harnesses/claude/hooks/stop-check.sh +5 -0
  27. package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
  28. package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
  29. package/core/harnesses/claude/settings/keybindings.json +20 -0
  30. package/core/harnesses/claude/settings/settings.json +201 -0
  31. package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
  32. package/core/harnesses/codex/agents/core-implementer.toml +7 -0
  33. package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
  34. package/core/harnesses/codex/agents/research-writer.toml +8 -0
  35. package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
  36. package/core/harnesses/codex/agents/system-architect.toml +9 -0
  37. package/core/harnesses/codex/config/config.toml +10 -0
  38. package/core/harnesses/codex/hooks/hooks.json +122 -0
  39. package/core/harnesses/codex/hooks/lib.sh +335 -0
  40. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
  41. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
  42. package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
  43. package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
  44. package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
  45. package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
  46. package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
  47. package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
  48. package/core/harnesses/codex/hooks/session-end.sh +5 -0
  49. package/core/harnesses/codex/hooks/session-start.sh +5 -0
  50. package/core/harnesses/codex/hooks/stop-check.sh +8 -0
  51. package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
  52. package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
  53. package/core/harnesses/gemini/hooks/hooks.json +77 -0
  54. package/core/harnesses/gemini/hooks/lib.sh +302 -0
  55. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
  56. package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
  57. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
  58. package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
  59. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
  60. package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
  61. package/core/harnesses/gemini/hooks/session-end.sh +5 -0
  62. package/core/harnesses/gemini/hooks/session-start.sh +5 -0
  63. package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
  64. package/core/harnesses/kiro/agents/doflow.json +58 -0
  65. package/core/harnesses/kiro/hooks/doflow.json +53 -0
  66. package/core/harnesses/kiro/hooks/lib.sh +324 -0
  67. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
  68. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
  69. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
  70. package/core/harnesses/kiro/hooks/session-start.sh +9 -0
  71. package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
  72. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
  73. package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
  74. package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
  75. package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
  76. package/core/harnesses/shared/hooks/hooks.json +47 -0
  77. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
  78. package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
  79. package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
  80. package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
  81. package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
  82. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
  83. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
  84. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
  85. package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
  86. package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
  87. package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
  88. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
  89. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
  90. package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
  91. package/core/harnesses/shared/locator/doflow-run +87 -0
  92. package/core/registry/advice.json +101 -0
  93. package/core/registry/assets.json +792 -0
  94. package/core/registry/capabilities.json +120 -0
  95. package/core/registry/contracts.json +189 -0
  96. package/core/registry/external-tools.json +191 -0
  97. package/core/registry/harnesses.json +2062 -0
  98. package/core/registry/lifecycle.json +231 -0
  99. package/core/registry/mcp.json +18 -0
  100. package/core/registry/models.json +79 -0
  101. package/core/registry/readiness-templates.json +118 -0
  102. package/core/registry/routes.json +47 -0
  103. package/core/registry/storage.json +1057 -0
  104. package/core/registry/verification.json +258 -0
  105. package/core/registry/workflows.json +790 -0
  106. package/core/shared/agent-specs/core-implementer.md +73 -0
  107. package/core/shared/agent-specs/quality-guardian.md +28 -0
  108. package/core/shared/agent-specs/research-writer.md +31 -0
  109. package/core/shared/agent-specs/spec-analyst.md +33 -0
  110. package/core/shared/agent-specs/system-architect.md +29 -0
  111. package/core/shared/guidance/DOFLOW_CORE.md +8 -0
  112. package/core/shared/guidance/FLAGS.md +25 -0
  113. package/core/shared/guidance/PRINCIPLES.md +61 -0
  114. package/core/shared/guidance/VERSION +1 -0
  115. package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
  116. package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
  117. package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
  118. package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
  119. package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
  120. package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
  121. package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
  122. package/core/shared/guidance/pointers/claude-gemini.md +2 -0
  123. package/core/shared/guidance/pointers/codex.md +6 -0
  124. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
  125. package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
  126. package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
  127. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
  128. package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
  129. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
  130. package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
  131. package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
  132. package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
  133. package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
  134. package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
  135. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
  136. package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
  137. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
  138. package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
  139. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
  140. package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
  141. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
  142. package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
  143. package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
  144. package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
  145. package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
  146. package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
  147. package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
  148. package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
  149. package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
  150. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
  151. package/core/shared/scripts/doflow/bin/doflow-run +592 -0
  152. package/core/shared/skills/do/SKILL.md +128 -0
  153. package/core/shared/skills/do/references/estimation.md +13 -0
  154. package/core/shared/skills/do/references/pm_routing.md +25 -0
  155. package/core/shared/skills/do/references/tool_matrix.md +52 -0
  156. package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
  157. package/core/shared/skills/do-code-review/README.md +49 -0
  158. package/core/shared/skills/do-code-review/SKILL.md +333 -0
  159. package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
  160. package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
  161. package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
  162. package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
  163. package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
  164. package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
  165. package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
  166. package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
  167. package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
  168. package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
  169. package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
  170. package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
  171. package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
  172. package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
  173. package/core/shared/skills/do-code-review/content-types/config.md +83 -0
  174. package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
  175. package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
  176. package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
  177. package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
  178. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
  179. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
  180. package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
  181. package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
  182. package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
  183. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
  184. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
  185. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
  186. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
  187. package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
  188. package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
  189. package/core/shared/skills/do-code-review/languages/c.md +103 -0
  190. package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
  191. package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
  192. package/core/shared/skills/do-code-review/languages/dart.md +108 -0
  193. package/core/shared/skills/do-code-review/languages/go.md +92 -0
  194. package/core/shared/skills/do-code-review/languages/java.md +103 -0
  195. package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
  196. package/core/shared/skills/do-code-review/languages/php.md +109 -0
  197. package/core/shared/skills/do-code-review/languages/python.md +94 -0
  198. package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
  199. package/core/shared/skills/do-code-review/languages/rust.md +99 -0
  200. package/core/shared/skills/do-code-review/languages/shell.md +90 -0
  201. package/core/shared/skills/do-code-review/languages/swift.md +88 -0
  202. package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
  203. package/core/shared/skills/do-code-review/review-policy.json +47 -0
  204. package/core/shared/skills/do-code-review/rules/universal.md +49 -0
  205. package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
  206. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
  207. package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
  208. package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
  209. package/core/shared/skills/do-constitution/SKILL.md +72 -0
  210. package/core/shared/skills/do-design/SKILL.md +212 -0
  211. package/core/shared/skills/do-diagnose/SKILL.md +156 -0
  212. package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
  213. package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
  214. package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
  215. package/core/shared/skills/do-document/SKILL.md +81 -0
  216. package/core/shared/skills/do-document/references/api-reference.md +42 -0
  217. package/core/shared/skills/do-document/references/deep_research.md +18 -0
  218. package/core/shared/skills/do-document/references/embedded-research.md +11 -0
  219. package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
  220. package/core/shared/skills/do-document/references/index_generator.md +9 -0
  221. package/core/shared/skills/do-document/references/user-guide.md +22 -0
  222. package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
  223. package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
  224. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
  225. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
  226. package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
  227. package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
  228. package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
  229. package/core/shared/skills/do-flow/SKILL.md +186 -0
  230. package/core/shared/skills/do-flow/references/task_classes.md +134 -0
  231. package/core/shared/skills/do-git/SKILL.md +115 -0
  232. package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
  233. package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
  234. package/core/shared/skills/do-git/references/release-ritual.md +64 -0
  235. package/core/shared/skills/do-implement/SKILL.md +222 -0
  236. package/core/shared/skills/do-plan/SKILL.md +219 -0
  237. package/core/shared/skills/do-test/SKILL.md +113 -0
  238. package/core/shared/templates/doflow/constitution-template.md +28 -0
  239. package/core/shared/templates/doflow/data-model-template.md +169 -0
  240. package/core/shared/templates/doflow/design-template.md +193 -0
  241. package/core/shared/templates/doflow/external-contract-template.md +35 -0
  242. package/core/shared/templates/doflow/intent-template.md +45 -0
  243. package/core/shared/templates/doflow/plan-template.md +151 -0
  244. package/core/shared/templates/doflow/question-log-template.md +51 -0
  245. package/core/shared/templates/doflow/requirement-template.md +126 -0
  246. package/core/shared/templates/doflow/specs-template.md +55 -0
  247. package/core/shared/templates/doflow/state-template.md +59 -0
  248. package/core/shared/workflows/do-flow-chain.md +17 -0
  249. package/package.json +46 -4
  250. package/src/adapters/antigravity/index.ts +631 -0
  251. package/src/adapters/claude/index.ts +548 -0
  252. package/src/adapters/claude/mcp.ts +94 -0
  253. package/src/adapters/codex/agents.ts +208 -0
  254. package/src/adapters/codex/config.ts +272 -0
  255. package/src/adapters/codex/hooks.ts +203 -0
  256. package/src/adapters/codex/index.ts +707 -0
  257. package/src/adapters/codex/mcp.ts +271 -0
  258. package/src/adapters/codex/native-projection.ts +34 -0
  259. package/src/adapters/copilot/index.ts +413 -0
  260. package/src/adapters/copy-tree.ts +620 -0
  261. package/src/adapters/gemini/hooks.ts +210 -0
  262. package/src/adapters/gemini/index.ts +390 -0
  263. package/src/adapters/hook-commands.ts +60 -0
  264. package/src/adapters/index.ts +106 -0
  265. package/src/adapters/kiro/index.ts +310 -0
  266. package/src/adapters/mcp-entries.ts +331 -0
  267. package/src/adapters/opencode/index.ts +466 -0
  268. package/src/adapters/pi/index.ts +279 -0
  269. package/src/adapters/pi/json-members.ts +185 -0
  270. package/src/adapters/pi/mcp.ts +373 -0
  271. package/src/adapters/resolve-source.ts +19 -0
  272. package/src/cli/commands/install.ts +218 -0
  273. package/src/cli/commands/list-backups.ts +21 -0
  274. package/src/cli/commands/reconcile.ts +120 -0
  275. package/src/cli/commands/remove.ts +82 -0
  276. package/src/cli/commands/rollback.ts +172 -0
  277. package/src/cli/commands/self-update.ts +33 -0
  278. package/src/cli/commands/status.ts +138 -0
  279. package/src/cli/commands/tools.ts +92 -0
  280. package/src/cli/commands/update.ts +162 -0
  281. package/src/cli/index.ts +568 -0
  282. package/src/cli/runtime-commands.ts +281 -0
  283. package/src/cli/shared.ts +218 -0
  284. package/src/helper/bash-helper.ts +34 -0
  285. package/src/helper/git.ts +24 -0
  286. package/src/helper/guardrails.ts +49 -0
  287. package/src/helper/harness-paths.ts +140 -0
  288. package/src/helper/marker-merge.ts +116 -0
  289. package/src/helper/prompt.ts +61 -0
  290. package/src/helper/repo-root.ts +29 -0
  291. package/src/helper/settings-merge.ts +151 -0
  292. package/src/helper/settings-scope.ts +33 -0
  293. package/src/helper/toml.ts +244 -0
  294. package/src/install/backup-set.ts +149 -0
  295. package/src/install/backup.ts +724 -0
  296. package/src/install/context.ts +58 -0
  297. package/src/install/manifest.ts +145 -0
  298. package/src/install/mcp.ts +254 -0
  299. package/src/install/paths.ts +84 -0
  300. package/src/install/targets.ts +90 -0
  301. package/src/install/tool-lifecycle.ts +151 -0
  302. package/src/lifecycle/bash-availability.ts +25 -0
  303. package/src/lifecycle/index.ts +812 -0
  304. package/src/lifecycle/mcp-index.ts +28 -0
  305. package/src/lifecycle/policies.ts +73 -0
  306. package/src/lifecycle/view.ts +175 -0
  307. package/src/registry/index.ts +611 -0
  308. package/src/release/sync-plugin-versions.ts +66 -0
  309. package/src/runtime/advice/cli.ts +283 -0
  310. package/src/runtime/advice/client.ts +324 -0
  311. package/src/runtime/advice/config.ts +189 -0
  312. package/src/runtime/advice/doctor.ts +169 -0
  313. package/src/runtime/advice/endpoint-guard.ts +134 -0
  314. package/src/runtime/advice/kinds.ts +154 -0
  315. package/src/runtime/advice/providers/ollama-systemone.ts +209 -0
  316. package/src/runtime/advice/record.ts +166 -0
  317. package/src/runtime/advice/registry.ts +170 -0
  318. package/src/runtime/advice/strength.ts +66 -0
  319. package/src/runtime/brief-tools.ts +342 -0
  320. package/src/runtime/c4-project.ts +371 -0
  321. package/src/runtime/capability-router.ts +484 -0
  322. package/src/runtime/checkouts.ts +170 -0
  323. package/src/runtime/claims.ts +468 -0
  324. package/src/runtime/cli-result.ts +55 -0
  325. package/src/runtime/cli.ts +678 -0
  326. package/src/runtime/command-detect.ts +516 -0
  327. package/src/runtime/context-pack.ts +492 -0
  328. package/src/runtime/decision-register.ts +493 -0
  329. package/src/runtime/evidence-ledger.ts +338 -0
  330. package/src/runtime/failure/capture.ts +272 -0
  331. package/src/runtime/failure/classifier.ts +68 -0
  332. package/src/runtime/failure/cli.ts +178 -0
  333. package/src/runtime/failure/home.ts +64 -0
  334. package/src/runtime/failure/store.ts +226 -0
  335. package/src/runtime/feature-resolve.ts +79 -0
  336. package/src/runtime/freshness.ts +177 -0
  337. package/src/runtime/health.ts +863 -0
  338. package/src/runtime/history-compactor.ts +237 -0
  339. package/src/runtime/implementation-gate.ts +321 -0
  340. package/src/runtime/inventory/coverage.ts +218 -0
  341. package/src/runtime/inventory/identity.ts +65 -0
  342. package/src/runtime/inventory/index.ts +705 -0
  343. package/src/runtime/inventory/precedence.ts +134 -0
  344. package/src/runtime/inventory/read-scopes.ts +131 -0
  345. package/src/runtime/inventory/siblings.ts +192 -0
  346. package/src/runtime/knowledge/chunker.ts +124 -0
  347. package/src/runtime/knowledge/hybrid.ts +149 -0
  348. package/src/runtime/knowledge/index-store.ts +145 -0
  349. package/src/runtime/knowledge/retrieval.ts +194 -0
  350. package/src/runtime/leak-scan.ts +185 -0
  351. package/src/runtime/lifecycle/cli.ts +276 -0
  352. package/src/runtime/lifecycle/event-store.ts +340 -0
  353. package/src/runtime/lifecycle/fold.ts +353 -0
  354. package/src/runtime/lifecycle/followup.ts +432 -0
  355. package/src/runtime/lifecycle/goal.ts +249 -0
  356. package/src/runtime/lifecycle/intent-writer.ts +86 -0
  357. package/src/runtime/lifecycle/overview.ts +292 -0
  358. package/src/runtime/lifecycle/release.ts +241 -0
  359. package/src/runtime/lifecycle/report-store.ts +221 -0
  360. package/src/runtime/lifecycle/retention.ts +212 -0
  361. package/src/runtime/lifecycle/root.ts +71 -0
  362. package/src/runtime/lifecycle/status.ts +353 -0
  363. package/src/runtime/lifecycle/store-upkeep.ts +393 -0
  364. package/src/runtime/locator-resolve.ts +158 -0
  365. package/src/runtime/mask.ts +210 -0
  366. package/src/runtime/mcp-consultations.ts +412 -0
  367. package/src/runtime/mcp-reach.ts +157 -0
  368. package/src/runtime/model-router.ts +153 -0
  369. package/src/runtime/outcome.ts +467 -0
  370. package/src/runtime/reach.ts +148 -0
  371. package/src/runtime/readiness-record.ts +150 -0
  372. package/src/runtime/readiness.ts +435 -0
  373. package/src/runtime/recovery.ts +282 -0
  374. package/src/runtime/research-request.ts +231 -0
  375. package/src/runtime/retrieval-plan.ts +578 -0
  376. package/src/runtime/scaffold/artifacts.ts +217 -0
  377. package/src/runtime/scaffold/fingerprint.ts +56 -0
  378. package/src/runtime/scaffold/generate.ts +911 -0
  379. package/src/runtime/scaffold/languages.ts +245 -0
  380. package/src/runtime/storage/cli.ts +64 -0
  381. package/src/runtime/storage/engine.ts +249 -0
  382. package/src/runtime/storage/registry.ts +130 -0
  383. package/src/runtime/storage/roots.ts +63 -0
  384. package/src/runtime/storage/rules.ts +282 -0
  385. package/src/runtime/storage/upkeep.ts +243 -0
  386. package/src/runtime/storage/work-status.ts +326 -0
  387. package/src/runtime/task-attempts.ts +415 -0
  388. package/src/runtime/task-classifier.ts +550 -0
  389. package/src/runtime/task-scope.ts +130 -0
  390. package/src/runtime/task-state.ts +176 -0
  391. package/src/runtime/trace/indicators.ts +235 -0
  392. package/src/runtime/trace/ledger.ts +626 -0
  393. package/src/runtime/trace/render.ts +76 -0
  394. package/src/runtime/trace/views.ts +459 -0
  395. package/src/runtime/verification/contract-runner.ts +341 -0
  396. package/src/runtime/verification/engine.ts +1461 -0
  397. package/src/runtime/verification/registry.ts +130 -0
  398. package/src/runtime/verification/scope-bound.ts +418 -0
  399. package/src/runtime/verification/test-selection.ts +172 -0
  400. package/src/runtime/workflow-engine.ts +588 -0
  401. package/src/runtime/workflow-orchestrator.ts +953 -0
  402. package/src/runtime/worktree.ts +340 -0
  403. package/src/state/index.ts +193 -0
  404. package/src/state/lockfile.ts +136 -0
  405. package/src/state/run-lock.ts +408 -0
  406. package/types/node-commonjs.d.ts +68 -0
  407. package/types/runtime.d.ts +91 -0
@@ -0,0 +1,492 @@
1
+ 'use strict';
2
+
3
+ // TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
4
+
5
+ const { EvidenceLedger } = require('./evidence-ledger.ts');
6
+ const { ClaimsManager } = require('./claims.ts');
7
+ const { ResearchRequestStore } = require('./research-request.ts');
8
+ const { finishRuntime, usageError } = require('./cli-result.ts');
9
+ const { resolveActiveFeature } = require('./feature-resolve.ts');
10
+ const { readRegister } = require('./decision-register.ts');
11
+
12
+ const NO_DECISIONS = Object.freeze({ available: false, live: [], liveCount: 0 });
13
+
14
+ const TASK_CLASS_BUDGETS: Record<string, any> = Object.freeze({
15
+ feature: 225000,
16
+ 'dependency-change': 85000,
17
+ bug: 71000,
18
+ refactor: 71000,
19
+ documentation: 57000,
20
+ operations: 45000,
21
+ review: 42000,
22
+ research: 35302,
23
+ 'trivial-edit': 30000,
24
+ });
25
+
26
+ /**
27
+ * The live decisions of the feature the caller is working on (IC-012). The feature is resolved
28
+ * from the branch, or from `slug` when the task id is not the feature slug. A feature with no
29
+ * register or an unresolvable feature reads as "not available"; an unreadable register does too,
30
+ * with a `reason`. Neither throws: a context pack is a read, and a missing register must not stop
31
+ * a stage from getting its evidence.
32
+ * @param {{projectRoot:string, slug?:string|null}} options
33
+ * @returns {{available:boolean, live:Array<Object>, liveCount:number, reason?:string}}
34
+ */
35
+ function loadLiveDecisions({ projectRoot, slug = null }: any) {
36
+ try {
37
+ const feature = resolveActiveFeature({ projectRoot, slug });
38
+ if (feature.error) return { ...NO_DECISIONS };
39
+ let register;
40
+ try {
41
+ register = readRegister(feature.featureDir);
42
+ } catch (error: any) {
43
+ // The register exists but cannot be trusted. Stay unavailable, but say why, so a stage
44
+ // sees the corruption instead of reading "no decisions".
45
+ return { ...NO_DECISIONS, reason: `register unreadable: ${error.message}` };
46
+ }
47
+ if (!register) return { ...NO_DECISIONS };
48
+ const live = register.decisions
49
+ .filter((d: any) => d.status === 'live')
50
+ .sort((a: any, b: any) => (a.topic < b.topic ? -1 : a.topic > b.topic ? 1 : 0))
51
+ .map(({ id, topic, statement, decidedBy, stage }: any) => ({ id, topic, statement, decidedBy, stage }));
52
+ return { available: true, live, liveCount: live.length };
53
+ } catch {
54
+ return { ...NO_DECISIONS };
55
+ }
56
+ }
57
+
58
+ class ContextPackCompiler {
59
+ declare options: any;
60
+ /**
61
+ * @param {Object} [defaultOptions]
62
+ * @param {number} [defaultOptions.maxFiles=15]
63
+ * @param {number} [defaultOptions.maxClaims=20]
64
+ * @param {number} [defaultOptions.maxEvidenceItems=25]
65
+ */
66
+ constructor(defaultOptions: any = {}) {
67
+ this.options = {
68
+ maxFiles: defaultOptions.maxFiles || 15,
69
+ maxClaims: defaultOptions.maxClaims || 20,
70
+ maxEvidenceItems: defaultOptions.maxEvidenceItems || 25,
71
+ maxResearchRequests: defaultOptions.maxResearchRequests || 20,
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Compiles a ContextPack from task evidence and claims.
77
+ * @param {Object} params
78
+ * @param {string} params.taskId
79
+ * @param {string} [params.taskClass='feature']
80
+ * @param {string} [params.objective='']
81
+ * @param {Array<string>} [params.constraints=[]]
82
+ * @param {Array<string>} [params.acceptanceCriteria=[]]
83
+ * @param {Object} params.evidenceLedger
84
+ * @param {Object} params.claimsManager
85
+ * @param {Object} [budgetOverrides={}]
86
+ * @returns {Object} ContextPack
87
+ */
88
+ compileContextPack(params: any, budgetOverrides: any = {}) {
89
+ const {
90
+ taskId,
91
+ taskClass = 'feature',
92
+ objective = '',
93
+ constraints = [],
94
+ acceptanceCriteria = [],
95
+ evidenceLedger,
96
+ claimsManager,
97
+ researchRequests = [],
98
+ decisions = NO_DECISIONS,
99
+ } = params;
100
+
101
+ const limits = { ...this.options, ...budgetOverrides };
102
+
103
+ const rawClaims = claimsManager ? claimsManager.getClaims(taskId) : [];
104
+ const rawEvidence = evidenceLedger ? evidenceLedger.queryEvidence({ taskId }) : [];
105
+
106
+ // Filter claims
107
+ const supportedClaims = [];
108
+ const activeHypotheses = [];
109
+ const conflictedClaims = [];
110
+
111
+ for (const claim of rawClaims) {
112
+ if (claim.status === 'supported') {
113
+ if (supportedClaims.length < limits.maxClaims) {
114
+ supportedClaims.push({
115
+ id: claim.id,
116
+ statement: claim.statement,
117
+ evidenceIds: claim.supportingEvidence,
118
+ });
119
+ }
120
+ } else if (claim.status === 'hypothesis') {
121
+ activeHypotheses.push({
122
+ id: claim.id,
123
+ statement: claim.statement,
124
+ });
125
+ } else if (claim.status === 'conflicted') {
126
+ conflictedClaims.push({
127
+ id: claim.id,
128
+ statement: claim.statement,
129
+ supportingEvidence: claim.supportingEvidence,
130
+ contradictingEvidence: claim.contradictingEvidence,
131
+ });
132
+ }
133
+ }
134
+
135
+ // Extract relevant files and structural context from fresh evidence
136
+ const relevantFileSet = new Set();
137
+ const structuralNodes = [];
138
+ const freshEvidenceItems = [];
139
+
140
+ for (const ev of rawEvidence) {
141
+ if (ev.freshness?.status === 'FRESH') {
142
+ if (ev.locator?.file) {
143
+ relevantFileSet.add(ev.locator.file);
144
+ }
145
+ if (ev.kind === 'structural' && ev.content) {
146
+ structuralNodes.push(ev.content);
147
+ }
148
+ if (freshEvidenceItems.length < limits.maxEvidenceItems) {
149
+ freshEvidenceItems.push({
150
+ id: ev.id,
151
+ kind: ev.kind,
152
+ locator: ev.locator,
153
+ summary: typeof ev.content === 'string' ? ev.content.slice(0, 120) : null,
154
+ });
155
+ }
156
+ }
157
+ }
158
+
159
+ const relevantFiles = Array.from(relevantFileSet).slice(0, limits.maxFiles);
160
+
161
+ return {
162
+ version: 1,
163
+ taskId: taskId || 'default',
164
+ taskClass,
165
+ compiledAt: new Date().toISOString(),
166
+ objective,
167
+ constraints: [...constraints],
168
+ // Ported from `evidence/context_pack.py` (plan task B.3): the only field the Python pack
169
+ // carried that this one did not. What the task must satisfy belongs beside the evidence
170
+ // gathered to satisfy it, otherwise the verification engine has to re-read the requirement
171
+ // to find out what it is verifying against.
172
+ verificationRequirements: [...acceptanceCriteria],
173
+ claims: {
174
+ supported: supportedClaims,
175
+ hypotheses: activeHypotheses,
176
+ conflicts: conflictedClaims,
177
+ },
178
+ relevantFiles,
179
+ structuralContext: structuralNodes.slice(0, 5),
180
+ evidenceCount: freshEvidenceItems.length,
181
+ evidenceSummary: freshEvidenceItems,
182
+ researchRequests: [...researchRequests]
183
+ .sort((a, b) => Number(b.blocking && b.status !== 'ANSWERED')
184
+ - Number(a.blocking && a.status !== 'ANSWERED'))
185
+ .slice(0, limits.maxResearchRequests).map(r => ({
186
+ id: r.id, stageId: r.stageId, question: r.question, status: r.status,
187
+ blocking: r.blocking, claimId: r.claimId, evidenceIds: r.evidenceIds, gap: r.gap,
188
+ })),
189
+ decisions: {
190
+ available: decisions.available, live: [...decisions.live], liveCount: decisions.liveCount,
191
+ ...(decisions.reason ? { reason: decisions.reason } : {}),
192
+ },
193
+ budgetEnforcement: {
194
+ totalFiles: relevantFiles.length,
195
+ totalSupportedClaims: supportedClaims.length,
196
+ totalActiveHypotheses: activeHypotheses.length,
197
+ limits,
198
+ },
199
+ };
200
+ }
201
+
202
+ /**
203
+ * Formats a ContextPack into a concise markdown context block.
204
+ * @param {Object} pack
205
+ * @returns {string}
206
+ */
207
+ formatMarkdown(pack: any) {
208
+ let md = `## ContextPack: [${pack.taskClass.toUpperCase()}] ${pack.taskId}\n`;
209
+ if (pack.objective) {
210
+ md += `**Objective:** ${pack.objective}\n\n`;
211
+ }
212
+
213
+ if (pack.claims.supported.length > 0) {
214
+ md += `### Supported Facts & Invariants\n`;
215
+ for (const c of pack.claims.supported) {
216
+ md += `- ✓ ${c.statement} *(ev: ${c.evidenceIds.join(', ')})*\n`;
217
+ }
218
+ md += '\n';
219
+ }
220
+
221
+ if (pack.claims.hypotheses.length > 0) {
222
+ md += `### Active Hypotheses (Unverified)\n`;
223
+ for (const h of pack.claims.hypotheses) {
224
+ md += `- ? ${h.statement}\n`;
225
+ }
226
+ md += '\n';
227
+ }
228
+
229
+ if (pack.researchRequests.length > 0) {
230
+ md += `### Feature Research Requests\n`;
231
+ for (const r of pack.researchRequests) {
232
+ md += `- ${r.status} ${r.blocking ? '(blocking)' : '(nonblocking)'} ${r.stageId}: ${r.question}`;
233
+ if (r.gap) md += ` — ${r.gap}`;
234
+ if (r.claimId) md += ` (claim: ${r.claimId})`;
235
+ md += '\n';
236
+ }
237
+ md += '\n';
238
+ }
239
+
240
+ if (pack.decisions && pack.decisions.liveCount > 0) {
241
+ md += `### Live decisions\n`;
242
+ for (const d of pack.decisions.live) md += `- ${d.id} (${d.topic}): ${d.statement}\n`;
243
+ md += '\n';
244
+ }
245
+
246
+ if (pack.relevantFiles.length > 0) {
247
+ md += `### Relevant File Locators\n`;
248
+ for (const f of pack.relevantFiles) {
249
+ md += `- \`${f}\`\n`;
250
+ }
251
+ md += '\n';
252
+ }
253
+
254
+ return md;
255
+ }
256
+
257
+ /**
258
+ * Compiles bounded context pack payload with mandatory/optional partitioning (IC-001).
259
+ * @param {Object} options
260
+ * @param {string} options.taskId
261
+ * @param {string} [options.taskClass='feature']
262
+ * @param {number} [options.maxBytes]
263
+ * @param {string} [options.objective='']
264
+ * @param {Object} [options.mandatory]
265
+ * @param {Array<string>} [options.mandatory.acceptanceCriteria]
266
+ * @param {Array<string>} [options.mandatory.constraints]
267
+ * @param {string} [options.mandatory.verificationPlan]
268
+ * @param {Object} [options.optional]
269
+ * @param {Array<string>} [options.optional.hypotheses]
270
+ * @param {Array<string>} [options.optional.narrative]
271
+ * @param {Array<string>} [options.optional.unverifiedClaims]
272
+ * @returns {Object} ContextPackResult
273
+ */
274
+ compileBoundedContextPack(options: any = {}) {
275
+ const {
276
+ taskId = 'default',
277
+ taskClass = 'feature',
278
+ maxBytes,
279
+ objective = '',
280
+ mandatory = {},
281
+ optional = {},
282
+ } = options;
283
+
284
+ const budgetBytes = Number.isInteger(maxBytes) && maxBytes > 0
285
+ ? maxBytes
286
+ : (TASK_CLASS_BUDGETS[taskClass] || 225000);
287
+
288
+ const acceptanceCriteria = Array.isArray(mandatory.acceptanceCriteria) ? [...mandatory.acceptanceCriteria] : [];
289
+ const constraints = Array.isArray(mandatory.constraints) ? [...mandatory.constraints] : [];
290
+ const verificationPlan = typeof mandatory.verificationPlan === 'string' ? mandatory.verificationPlan : '';
291
+
292
+ // Build mandatory section payload
293
+ let mandatoryMd = `## ContextPack: [${taskClass.toUpperCase()}] ${taskId}\n`;
294
+ if (objective) {
295
+ mandatoryMd += `**Objective:** ${objective}\n\n`;
296
+ }
297
+ if (acceptanceCriteria.length > 0) {
298
+ mandatoryMd += `### Acceptance Criteria\n`;
299
+ for (const ac of acceptanceCriteria) {
300
+ mandatoryMd += `- [ ] ${ac}\n`;
301
+ }
302
+ mandatoryMd += '\n';
303
+ }
304
+ if (constraints.length > 0) {
305
+ mandatoryMd += `### Constraints\n`;
306
+ for (const c of constraints) {
307
+ mandatoryMd += `- ! ${c}\n`;
308
+ }
309
+ mandatoryMd += '\n';
310
+ }
311
+ if (verificationPlan) {
312
+ mandatoryMd += `### Verification Plan\n${verificationPlan}\n\n`;
313
+ }
314
+
315
+ const mandatoryBytes = Buffer.byteLength(mandatoryMd, 'utf8');
316
+
317
+ // Rule 1: Mandatory content is never truncated; if mandatoryBytes > budgetBytes, returns overflow: true.
318
+ if (mandatoryBytes > budgetBytes) {
319
+ const omissions = [];
320
+ const narrativeList = Array.isArray(optional.narrative) ? optional.narrative : [];
321
+ const claimsList = Array.isArray(optional.unverifiedClaims) ? optional.unverifiedClaims : [];
322
+ const hypList = Array.isArray(optional.hypotheses) ? optional.hypotheses : [];
323
+
324
+ for (let i = 0; i < narrativeList.length; i++) omissions.push({ id: `narrative-${i + 1}`, reason: 'budget-cap-exceeded' });
325
+ for (let i = 0; i < claimsList.length; i++) omissions.push({ id: `claim-${i + 1}`, reason: 'budget-cap-exceeded' });
326
+ for (let i = 0; i < hypList.length; i++) omissions.push({ id: `hypothesis-${i + 1}`, reason: 'budget-cap-exceeded' });
327
+
328
+ return {
329
+ taskId,
330
+ taskClass,
331
+ totalBytes: mandatoryBytes,
332
+ budgetBytes,
333
+ overflow: true,
334
+ mandatoryBytes,
335
+ optionalBytes: 0,
336
+ omissions,
337
+ payload: mandatoryMd,
338
+ error: `Mandatory context (${mandatoryBytes} B) exceeds budget (${budgetBytes} B)`,
339
+ };
340
+ }
341
+
342
+ // Rule 2: Optional content is trimmed in reverse priority order when mandatoryBytes + optionalBytes > budgetBytes.
343
+ // Priority order: 1. hypotheses, 2. unverifiedClaims, 3. narrative.
344
+ // Trimming in reverse priority: narrative first, then claims, then hypotheses.
345
+ const hypotheses = Array.isArray(optional.hypotheses) ? [...optional.hypotheses] : [];
346
+ const unverifiedClaims = Array.isArray(optional.unverifiedClaims) ? [...optional.unverifiedClaims] : [];
347
+ const narrative = Array.isArray(optional.narrative) ? [...optional.narrative] : [];
348
+
349
+ const keptHypotheses = [];
350
+ const keptClaims = [];
351
+ const keptNarrative = [];
352
+ const omissions = [];
353
+
354
+ const buildPayload = (hList: any, cList: any, nList: any) => {
355
+ let md = mandatoryMd;
356
+ if (hList.length > 0) {
357
+ md += `### Active Hypotheses (Unverified)\n`;
358
+ for (const h of hList) md += `- ? ${h}\n`;
359
+ md += '\n';
360
+ }
361
+ if (cList.length > 0) {
362
+ md += `### Unverified Claims\n`;
363
+ for (const c of cList) md += `- ? ${c}\n`;
364
+ md += '\n';
365
+ }
366
+ if (nList.length > 0) {
367
+ md += `### Background Narrative\n`;
368
+ for (const n of nList) md += `- ${n}\n`;
369
+ md += '\n';
370
+ }
371
+ return md;
372
+ };
373
+
374
+ // Forward trial fitting: hypotheses first
375
+ for (let i = 0; i < hypotheses.length; i++) {
376
+ const trial = [...keptHypotheses, hypotheses[i]];
377
+ const trialMd = buildPayload(trial, [], []);
378
+ if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
379
+ keptHypotheses.push(hypotheses[i]);
380
+ } else {
381
+ omissions.push({ id: `hypothesis-${i + 1}`, reason: 'budget-cap-exceeded' });
382
+ }
383
+ }
384
+
385
+ // unverifiedClaims next
386
+ for (let i = 0; i < unverifiedClaims.length; i++) {
387
+ const trial = [...keptClaims, unverifiedClaims[i]];
388
+ const trialMd = buildPayload(keptHypotheses, trial, []);
389
+ if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
390
+ keptClaims.push(unverifiedClaims[i]);
391
+ } else {
392
+ omissions.push({ id: `claim-${i + 1}`, reason: 'budget-cap-exceeded' });
393
+ }
394
+ }
395
+
396
+ // narrative next
397
+ for (let i = 0; i < narrative.length; i++) {
398
+ const trial = [...keptNarrative, narrative[i]];
399
+ const trialMd = buildPayload(keptHypotheses, keptClaims, trial);
400
+ if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
401
+ keptNarrative.push(narrative[i]);
402
+ } else {
403
+ omissions.push({ id: `narrative-${i + 1}`, reason: 'budget-cap-exceeded' });
404
+ }
405
+ }
406
+
407
+ const payload = buildPayload(keptHypotheses, keptClaims, keptNarrative);
408
+ const totalBytes = Buffer.byteLength(payload, 'utf8');
409
+ const optionalBytes = totalBytes - mandatoryBytes;
410
+
411
+ return {
412
+ taskId,
413
+ taskClass,
414
+ totalBytes,
415
+ budgetBytes,
416
+ overflow: false,
417
+ mandatoryBytes,
418
+ optionalBytes,
419
+ omissions,
420
+ payload,
421
+ };
422
+ }
423
+
424
+ /**
425
+ * Alias for compileBoundedContextPack.
426
+ */
427
+ compileBoundedPayload(options: any = {}) {
428
+ return this.compileBoundedContextPack(options);
429
+ }
430
+ }
431
+
432
+ /**
433
+ * Handles `doflow context-pack` — compile the evidence and claims recorded for a task into the
434
+ * context block a stage is handed.
435
+ *
436
+ * Exits 1 on a pack with nothing in it. An empty pack is not evidence that a task needs no
437
+ * context; it is evidence that nothing was recorded, and reporting it as success is the
438
+ * empty-contract defect in another costume.
439
+ *
440
+ * @param {Object} options
441
+ * @param {string} options.taskId
442
+ * @param {string} [options.taskClass]
443
+ * @param {string} [options.objective]
444
+ * @param {boolean} [options.json=false]
445
+ * @param {string} [options.stateRoot]
446
+ * @param {string} [options.slug] feature slug, when the task id is not the feature's own
447
+ * @returns {number} exit code
448
+ */
449
+ function handleContextPackCommand({ taskId, taskClass, objective, json = false, stateRoot, slug }: any = {}) {
450
+ const root = stateRoot || process.cwd();
451
+ const ledger = new EvidenceLedger({ repoRoot: root, slug });
452
+ ledger.load(taskId);
453
+ const claims = new ClaimsManager({ evidenceLedger: ledger, repoRoot: root, slug });
454
+ claims.load(taskId);
455
+ claims.evaluateAll();
456
+ const researchRequests = new ResearchRequestStore({ projectRoot: root, slug }).list(taskId);
457
+
458
+ const compiler = new ContextPackCompiler();
459
+ const pack = compiler.compileContextPack({
460
+ taskId,
461
+ // The library's own default. Passed through rather than substituted here so there is one
462
+ // place that decides what an unstated class means for a *label* — which is all it is in a
463
+ // pack, unlike readiness where it selects the contract.
464
+ ...(taskClass ? { taskClass } : {}),
465
+ objective: objective || '',
466
+ evidenceLedger: ledger,
467
+ claimsManager: claims,
468
+ researchRequests,
469
+ decisions: loadLiveDecisions({ projectRoot: root, slug: slug || null }),
470
+ });
471
+
472
+ const empty = pack.evidenceCount === 0
473
+ && pack.claims.supported.length === 0
474
+ && pack.claims.hypotheses.length === 0
475
+ && pack.claims.conflicts.length === 0
476
+ && pack.researchRequests.length === 0
477
+ && pack.decisions.liveCount === 0;
478
+
479
+ if (json) console.log(JSON.stringify({ ...pack, empty }, null, 2));
480
+ else {
481
+ console.log(compiler.formatMarkdown(pack));
482
+ if (empty) console.log(`_No evidence or claims are recorded for task '${taskId}'; this pack states nothing._\n`);
483
+ }
484
+ return finishRuntime(empty ? 1 : 0);
485
+ }
486
+
487
+ module.exports = {
488
+ ContextPackCompiler,
489
+ TASK_CLASS_BUDGETS,
490
+ handleContextPackCommand,
491
+ loadLiveDecisions,
492
+ };