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

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 (409) 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 +1061 -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 +48 -4
  250. package/src/adapters/antigravity/index.js +631 -0
  251. package/src/adapters/claude/index.js +548 -0
  252. package/src/adapters/claude/mcp.js +94 -0
  253. package/src/adapters/codex/agents.js +208 -0
  254. package/src/adapters/codex/config.js +272 -0
  255. package/src/adapters/codex/hooks.js +203 -0
  256. package/src/adapters/codex/index.js +707 -0
  257. package/src/adapters/codex/mcp.js +271 -0
  258. package/src/adapters/codex/native-projection.js +34 -0
  259. package/src/adapters/copilot/index.js +413 -0
  260. package/src/adapters/copy-tree.js +620 -0
  261. package/src/adapters/gemini/hooks.js +210 -0
  262. package/src/adapters/gemini/index.js +390 -0
  263. package/src/adapters/hook-commands.js +60 -0
  264. package/src/adapters/index.js +106 -0
  265. package/src/adapters/kiro/index.js +310 -0
  266. package/src/adapters/mcp-entries.js +331 -0
  267. package/src/adapters/opencode/index.js +466 -0
  268. package/src/adapters/pi/index.js +279 -0
  269. package/src/adapters/pi/json-members.js +185 -0
  270. package/src/adapters/pi/mcp.js +373 -0
  271. package/src/adapters/resolve-source.js +19 -0
  272. package/src/cli/commands/install.js +218 -0
  273. package/src/cli/commands/list-backups.js +21 -0
  274. package/src/cli/commands/reconcile.js +120 -0
  275. package/src/cli/commands/remove.js +82 -0
  276. package/src/cli/commands/rollback.js +172 -0
  277. package/src/cli/commands/self-update.js +33 -0
  278. package/src/cli/commands/status.js +138 -0
  279. package/src/cli/commands/tools.js +92 -0
  280. package/src/cli/commands/update.js +162 -0
  281. package/src/cli/index.js +568 -0
  282. package/src/cli/runtime-commands.js +281 -0
  283. package/src/cli/shared.js +218 -0
  284. package/src/helper/bash-helper.js +34 -0
  285. package/src/helper/git.js +24 -0
  286. package/src/helper/guardrails.js +49 -0
  287. package/src/helper/harness-paths.js +140 -0
  288. package/src/helper/marker-merge.js +116 -0
  289. package/src/helper/prompt.js +61 -0
  290. package/src/helper/repo-root.js +29 -0
  291. package/src/helper/settings-merge.js +151 -0
  292. package/src/helper/settings-scope.js +33 -0
  293. package/src/helper/toml.js +244 -0
  294. package/src/install/backup-set.js +149 -0
  295. package/src/install/backup.js +724 -0
  296. package/src/install/context.js +58 -0
  297. package/src/install/manifest.js +145 -0
  298. package/src/install/mcp.js +254 -0
  299. package/src/install/paths.js +84 -0
  300. package/src/install/targets.js +90 -0
  301. package/src/install/tool-lifecycle.js +151 -0
  302. package/src/lifecycle/bash-availability.js +25 -0
  303. package/src/lifecycle/index.js +812 -0
  304. package/src/lifecycle/mcp-index.js +28 -0
  305. package/src/lifecycle/policies.js +73 -0
  306. package/src/lifecycle/view.js +175 -0
  307. package/src/registry/index.js +611 -0
  308. package/src/release/build-package.js +91 -0
  309. package/src/release/changelog-section.js +70 -0
  310. package/src/release/sync-plugin-versions.js +66 -0
  311. package/src/runtime/advice/cli.js +283 -0
  312. package/src/runtime/advice/client.js +324 -0
  313. package/src/runtime/advice/config.js +189 -0
  314. package/src/runtime/advice/doctor.js +169 -0
  315. package/src/runtime/advice/endpoint-guard.js +134 -0
  316. package/src/runtime/advice/kinds.js +154 -0
  317. package/src/runtime/advice/providers/ollama-systemone.js +209 -0
  318. package/src/runtime/advice/record.js +166 -0
  319. package/src/runtime/advice/registry.js +170 -0
  320. package/src/runtime/advice/strength.js +66 -0
  321. package/src/runtime/brief-tools.js +342 -0
  322. package/src/runtime/c4-project.js +371 -0
  323. package/src/runtime/capability-router.js +484 -0
  324. package/src/runtime/checkouts.js +170 -0
  325. package/src/runtime/claims.js +468 -0
  326. package/src/runtime/cli-result.js +55 -0
  327. package/src/runtime/cli.js +678 -0
  328. package/src/runtime/command-detect.js +516 -0
  329. package/src/runtime/context-pack.js +492 -0
  330. package/src/runtime/decision-register.js +493 -0
  331. package/src/runtime/evidence-ledger.js +338 -0
  332. package/src/runtime/failure/capture.js +272 -0
  333. package/src/runtime/failure/classifier.js +68 -0
  334. package/src/runtime/failure/cli.js +178 -0
  335. package/src/runtime/failure/home.js +64 -0
  336. package/src/runtime/failure/store.js +226 -0
  337. package/src/runtime/feature-resolve.js +79 -0
  338. package/src/runtime/freshness.js +177 -0
  339. package/src/runtime/health.js +863 -0
  340. package/src/runtime/history-compactor.js +237 -0
  341. package/src/runtime/implementation-gate.js +321 -0
  342. package/src/runtime/inventory/coverage.js +218 -0
  343. package/src/runtime/inventory/identity.js +65 -0
  344. package/src/runtime/inventory/index.js +705 -0
  345. package/src/runtime/inventory/precedence.js +134 -0
  346. package/src/runtime/inventory/read-scopes.js +131 -0
  347. package/src/runtime/inventory/siblings.js +192 -0
  348. package/src/runtime/knowledge/chunker.js +124 -0
  349. package/src/runtime/knowledge/hybrid.js +149 -0
  350. package/src/runtime/knowledge/index-store.js +145 -0
  351. package/src/runtime/knowledge/retrieval.js +194 -0
  352. package/src/runtime/leak-scan.js +185 -0
  353. package/src/runtime/lifecycle/cli.js +276 -0
  354. package/src/runtime/lifecycle/event-store.js +340 -0
  355. package/src/runtime/lifecycle/fold.js +353 -0
  356. package/src/runtime/lifecycle/followup.js +432 -0
  357. package/src/runtime/lifecycle/goal.js +249 -0
  358. package/src/runtime/lifecycle/intent-writer.js +86 -0
  359. package/src/runtime/lifecycle/overview.js +292 -0
  360. package/src/runtime/lifecycle/release.js +241 -0
  361. package/src/runtime/lifecycle/report-store.js +221 -0
  362. package/src/runtime/lifecycle/retention.js +212 -0
  363. package/src/runtime/lifecycle/root.js +71 -0
  364. package/src/runtime/lifecycle/status.js +353 -0
  365. package/src/runtime/lifecycle/store-upkeep.js +393 -0
  366. package/src/runtime/locator-resolve.js +158 -0
  367. package/src/runtime/mask.js +210 -0
  368. package/src/runtime/mcp-consultations.js +412 -0
  369. package/src/runtime/mcp-reach.js +157 -0
  370. package/src/runtime/model-router.js +153 -0
  371. package/src/runtime/outcome.js +467 -0
  372. package/src/runtime/reach.js +148 -0
  373. package/src/runtime/readiness-record.js +150 -0
  374. package/src/runtime/readiness.js +435 -0
  375. package/src/runtime/recovery.js +282 -0
  376. package/src/runtime/research-request.js +231 -0
  377. package/src/runtime/retrieval-plan.js +578 -0
  378. package/src/runtime/scaffold/artifacts.js +217 -0
  379. package/src/runtime/scaffold/fingerprint.js +56 -0
  380. package/src/runtime/scaffold/generate.js +911 -0
  381. package/src/runtime/scaffold/languages.js +245 -0
  382. package/src/runtime/storage/cli.js +64 -0
  383. package/src/runtime/storage/engine.js +249 -0
  384. package/src/runtime/storage/registry.js +130 -0
  385. package/src/runtime/storage/roots.js +63 -0
  386. package/src/runtime/storage/rules.js +282 -0
  387. package/src/runtime/storage/upkeep.js +243 -0
  388. package/src/runtime/storage/work-status.js +326 -0
  389. package/src/runtime/task-attempts.js +415 -0
  390. package/src/runtime/task-classifier.js +550 -0
  391. package/src/runtime/task-scope.js +130 -0
  392. package/src/runtime/task-state.js +176 -0
  393. package/src/runtime/trace/indicators.js +235 -0
  394. package/src/runtime/trace/ledger.js +626 -0
  395. package/src/runtime/trace/render.js +76 -0
  396. package/src/runtime/trace/views.js +459 -0
  397. package/src/runtime/verification/contract-runner.js +341 -0
  398. package/src/runtime/verification/engine.js +1461 -0
  399. package/src/runtime/verification/registry.js +130 -0
  400. package/src/runtime/verification/scope-bound.js +418 -0
  401. package/src/runtime/verification/test-selection.js +172 -0
  402. package/src/runtime/workflow-engine.js +588 -0
  403. package/src/runtime/workflow-orchestrator.js +953 -0
  404. package/src/runtime/worktree.js +340 -0
  405. package/src/state/index.js +193 -0
  406. package/src/state/lockfile.js +136 -0
  407. package/src/state/run-lock.js +408 -0
  408. package/types/node-commonjs.d.ts +68 -0
  409. package/types/runtime.d.ts +91 -0
@@ -0,0 +1,218 @@
1
+ 'use strict';
2
+
3
+ // TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
4
+
5
+ /**
6
+ * C6 — repair-coverage annotator (FR-006, design §3 C6, entity `REPAIR_COVERAGE`).
7
+ *
8
+ * States which of the report's findings the existing repair path can actually act on. That set is
9
+ * narrower than the set of findings, and the difference is not self-evident:
10
+ *
11
+ * $ doflow status -g → 321 pending changes across 8 harnesses
12
+ * $ doflow reconcile -g --dry-run → 10 drifts for 1 harness
13
+ *
14
+ * Both numbers are internally consistent. `status` reads the ledger, which records what DoFlow
15
+ * owns; `reconcile` (`src/cli/commands/reconcile.js`) derives its target set from `doflow.lock`,
16
+ * which records what an install *chose*. The lock accumulates: each run keeps every pin whose
17
+ * harness the ledger still holds (`src/lifecycle/view.js#lockDocument`). A harness the ledger holds
18
+ * and the lock lacks — one installed before any lock recorded it — is still outside the repair
19
+ * path, and `reconcile` names it rather than converging it. A user must not be able to read the
20
+ * report and reasonably conclude a remedy exists where none does — that is the whole of FR-006.
21
+ *
22
+ * Three rules this module holds to:
23
+ *
24
+ * 1. **Coverage is computed against the lock's targets, never the ledger's.** The ledger is what
25
+ * produced the findings; the lock is what bounds the remedy. Measuring against the ledger would
26
+ * reproduce the over-claim this component exists to prevent.
27
+ * 2. **A scope with no lock has zero repair coverage, not full coverage.** `reconcile` short-
28
+ * circuits on `!lock || !lock.targets.length` and does nothing at all in that scope. An absent
29
+ * pin is the weakest possible coverage, not an unrestricted one; getting this backwards would
30
+ * be the worst failure this module could have.
31
+ * 3. **This module states the gap. It never repairs, and it never recommends widening the lock** —
32
+ * `reconcile` names a harness the ledger holds and the lock lacks, and a later `doflow install`
33
+ * or `doflow update -t <harness>` is what pins it.
34
+ *
35
+ * Granularity and its ceiling: `reconcile` filters by harness (`lock.targets.map(e => e.harness)`)
36
+ * and then re-plans that harness in full with `force: true`; it does not consult `lock.assets`. So
37
+ * harness-plus-scope is exactly the grain at which the repair path's reach is decidable, and this
38
+ * module uses no finer one. Within that grain the result is an **upper bound**: a finding on a
39
+ * pinned harness is one `reconcile` will look at, not one it is guaranteed to heal — a plan
40
+ * conflict or an unmet prerequisite is reported by `reconcile` rather than converged. Narrowing
41
+ * that would require running the lifecycle plan, which is not a read this component owns.
42
+ *
43
+ * Read-only and synchronous throughout (NFR-001). `repairCoverage` is pure; `readScopeLocks` is the
44
+ * one function that touches disk, kept separate so a caller can supply lock documents from anywhere.
45
+ */
46
+
47
+ const os = require('node:os');
48
+ const { readLock } = require('../../state/lockfile.js');
49
+
50
+ /** The scopes a report is assembled from. Mirrors `readScopes`'s pair; a finding naming anything
51
+ * else is a caller bug and is reported as such rather than silently counted either way. */
52
+ const SCOPES = ['global', 'project'];
53
+
54
+ /** The only repair path this component knows how to measure. A finding whose `repairPath` is not
55
+ * this value is out of reach whatever the lock says — `reconcile` converges a scope onto its own
56
+ * pin and nothing else: it does not delete a rival copy at the other scope, does not remove an
57
+ * unmanaged file, and cannot establish a harness's undocumented precedence. */
58
+ const RECONCILE = 'reconcile';
59
+
60
+ /** Why a finding is not repairable. Exported so a renderer can be exhaustive over the set rather
61
+ * than matching string literals that drift. */
62
+ const REPAIR_REASONS = Object.freeze({
63
+ /** The finding's scope has no lock, or a lock pinning no targets — `reconcile` does nothing there. */
64
+ SCOPE_NOT_PINNED: 'scope-not-pinned',
65
+ /** The scope is pinned, but not for this harness. The 321-versus-10 case. */
66
+ HARNESS_NOT_PINNED: 'harness-not-pinned',
67
+ /** The finding names a remedy that is not the repair path — manual action, research, an install. */
68
+ OUTSIDE_REPAIR_PATH: 'outside-repair-path',
69
+ /** The finding names no remedy at all. Counted unrepairable, because FR-006 forbids over-claiming
70
+ * and an unstated path is not evidence of a reachable one. */
71
+ REPAIR_PATH_UNSTATED: 'repair-path-unstated',
72
+ /** The finding names a scope that is neither global nor project. */
73
+ UNKNOWN_SCOPE: 'unknown-scope',
74
+ });
75
+
76
+ /**
77
+ * @typedef {Object} Finding One entry of the set whose repairability is being measured.
78
+ * @property {string} [id] The logical-asset identity the finding attaches to, echoed back.
79
+ * @property {string} harness The harness the finding belongs to.
80
+ * @property {'global'|'project'} scope The scope whose copy the remedy would have to change.
81
+ * @property {string} [repairPath] The remedy's path. `'reconcile'` means the existing repair
82
+ * command; anything else, including absence, means this component cannot claim a remedy for it.
83
+ */
84
+
85
+ /**
86
+ * @typedef {Object} ScopeCoverage Per-scope pin state and its share of the counts.
87
+ * @property {'global'|'project'} scope
88
+ * @property {'absent'|'empty'|'present'} lock Whether a lock exists, exists but pins no target, or
89
+ * pins at least one. `reconcile` treats the first two identically; they are kept distinct here
90
+ * because they mean different things to a reader — never installed in this scope versus pinned
91
+ * down to nothing.
92
+ * @property {boolean} pinned True only for `lock: 'present'`. Rule 2 above.
93
+ * @property {string[]} targets The harnesses the lock pins, in the lock's own order.
94
+ * @property {number} findings How many of the findings named this scope.
95
+ * @property {number} repairable How many of those the repair path can act on.
96
+ */
97
+
98
+ /**
99
+ * @typedef {Object} RepairCoverage The `REPAIR_COVERAGE` entity.
100
+ * @property {number} findings Total findings considered.
101
+ * @property {number} repairable How many the existing repair path can act on.
102
+ * @property {number} unrepairable The remainder — the number FR-006 exists to surface.
103
+ * @property {boolean} complete Whether every finding is repairable. Vacuously true for no findings.
104
+ * @property {{global: ScopeCoverage, project: ScopeCoverage}} scopes
105
+ * @property {Object<string, number>} reasons Count per `REPAIR_REASONS` value; absent reasons are
106
+ * omitted rather than reported as zero.
107
+ * @property {Array<{id: string|null, harness: string|null, scope: string|null, repairable: boolean,
108
+ * reason: string|null}>} details One row per finding, input order preserved.
109
+ * @property {string} summary One legible sentence stating the gap.
110
+ */
111
+
112
+ /** The harnesses a lock document pins, and how it pins them. Mirrors `reconcile`'s own reading:
113
+ * a missing lock and a lock with an empty `targets` array are equally unable to repair anything. */
114
+ function scopePin(scope , lock ) {
115
+ const targets = Array.isArray(lock?.targets)
116
+ ? lock.targets.map((entry ) => entry?.harness).filter((harness ) => typeof harness === 'string' && harness !== '')
117
+ : [];
118
+ const state = !lock ? 'absent' : (targets.length === 0 ? 'empty' : 'present');
119
+ return { scope, lock: state, pinned: state === 'present', targets, findings: 0, repairable: 0 };
120
+ }
121
+
122
+ /** Decide one finding against the pins. Repair-path reach is tested before lock reach: a finding
123
+ * no command performs is unreachable for a more fundamental reason than a narrow pin, and naming
124
+ * the pin would imply widening it is the fix. */
125
+ function classify(finding , pins ) {
126
+ const pin = pins[finding?.scope];
127
+ if (!pin) return { repairable: false, reason: REPAIR_REASONS.UNKNOWN_SCOPE };
128
+ const declared = finding.repairPath;
129
+ if (typeof declared !== 'string' || declared === '') {
130
+ return { repairable: false, reason: REPAIR_REASONS.REPAIR_PATH_UNSTATED };
131
+ }
132
+ if (declared !== RECONCILE) return { repairable: false, reason: REPAIR_REASONS.OUTSIDE_REPAIR_PATH };
133
+ if (!pin.pinned) return { repairable: false, reason: REPAIR_REASONS.SCOPE_NOT_PINNED };
134
+ if (!pin.targets.includes(finding.harness)) {
135
+ return { repairable: false, reason: REPAIR_REASONS.HARNESS_NOT_PINNED };
136
+ }
137
+ return { repairable: true, reason: null };
138
+ }
139
+
140
+ /** One sentence a reader meets before the detail, so the gap cannot be missed by someone who does
141
+ * not read the counts. States what is repairable and by what; never suggests a way to widen it. */
142
+ function summarize(total , repairable ) {
143
+ if (total === 0) return 'No findings — repair coverage does not arise.';
144
+ if (repairable === total) {
145
+ return `All ${total} finding(s) are repairable by \`doflow reconcile\`.`;
146
+ }
147
+ return `${repairable} of ${total} finding(s) are repairable by \`doflow reconcile\`; `
148
+ + `${total - repairable} have no available remedy from it.`;
149
+ }
150
+
151
+ /**
152
+ * Read both scopes' lock documents. The one impure function here, separated so `repairCoverage`
153
+ * stays pure and testable without a filesystem.
154
+ *
155
+ * @param {Object} options
156
+ * @param {string} options.projectRoot Root of the project scope.
157
+ * @param {string} [options.homeDir] Root of the global scope. Unlike the lifecycle view (design
158
+ * R7), the lockfile reader takes this as a parameter, so a hermetic test needs no home-directory
159
+ * relocation here.
160
+ * @param {Object} [io]
161
+ * @param {Object} [io.fsImpl] Filesystem implementation, threaded to `readLock`.
162
+ * @returns {{global: Object|null, project: Object|null}} A lock document per scope, or `null` where
163
+ * no lock exists — which is the state rule 2 turns into zero coverage, not full coverage.
164
+ * @throws when a lock file exists but cannot be parsed or validated. Propagated deliberately:
165
+ * `reconcile` would fail on the same document, so guessing its reach would be fiction.
166
+ */
167
+ function readScopeLocks({ projectRoot, homeDir = os.homedir() } , { fsImpl } = {}) {
168
+ return {
169
+ global: readLock({ scope: 'global', homeDir }, { fsImpl }),
170
+ project: readLock({ scope: 'project', projectRoot }, { fsImpl }),
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Compare the report's findings against what the locks pin.
176
+ *
177
+ * @param {Object} options
178
+ * @param {Finding[]} [options.findings] The findings the report makes.
179
+ * @param {{global?: Object|null, project?: Object|null}} [options.locks] Lock documents per scope,
180
+ * as `readScopeLocks` returns them. A missing or `null` entry is an unpinned scope.
181
+ * @returns {RepairCoverage}
182
+ */
183
+ function repairCoverage({ findings = [], locks = {} } = {}) {
184
+ const rows = Array.isArray(findings) ? findings : [];
185
+ const pins = Object.fromEntries(SCOPES.map((scope) => [scope, scopePin(scope, locks?.[scope] ?? null)]));
186
+
187
+ const reasons = {};
188
+ const details = rows.map((finding ) => {
189
+ const { repairable, reason } = classify(finding, pins);
190
+ const pin = pins[finding?.scope];
191
+ if (pin) {
192
+ pin.findings += 1;
193
+ if (repairable) pin.repairable += 1;
194
+ }
195
+ if (reason) reasons[reason] = (reasons[reason] ?? 0) + 1;
196
+ return {
197
+ id: finding?.id ?? null,
198
+ harness: finding?.harness ?? null,
199
+ scope: finding?.scope ?? null,
200
+ repairable,
201
+ reason,
202
+ };
203
+ });
204
+
205
+ const repairable = details.filter((row ) => row.repairable).length;
206
+ return {
207
+ findings: details.length,
208
+ repairable,
209
+ unrepairable: details.length - repairable,
210
+ complete: repairable === details.length,
211
+ scopes: pins,
212
+ reasons,
213
+ details,
214
+ summary: summarize(details.length, repairable),
215
+ };
216
+ }
217
+
218
+ module.exports = { repairCoverage, readScopeLocks, REPAIR_REASONS, SCOPES };
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ // TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
4
+
5
+ /**
6
+ * The cross-scope logical-asset identity (design C3, contract IC-004).
7
+ *
8
+ * Two recorded resources describe the same logical asset when two parts agree: the harness, and the
9
+ * ownership identity the adapter recorded for that resource. That pair is not a new key — it is the
10
+ * stored ownership key (`src/state/index.js#ownershipKey`, five components) with its two
11
+ * scope-bearing components dropped: the `scope`, which names itself, and the absolute `target`,
12
+ * which differs between a global and a project copy of the same asset by construction. So this is a
13
+ * projection of a key the ledger already holds, not a value reconstructed from a path; nothing is
14
+ * resolved, matched or inferred, and the stored key itself is untouched.
15
+ *
16
+ * Three properties make the ownership identity sufficient, and each is enforced rather than
17
+ * observed:
18
+ * - **Mandatory** — `src/lifecycle/index.js` throws on an adapter change carrying no
19
+ * `ownershipIdentity`, so every recorded resource has one.
20
+ * - **Scope-free** — every adapter composes it from the harness id, a role, and a discriminator
21
+ * drawn from the source tree; never from a destination path or a scope name. An adapter whose
22
+ * destination root varies by scope therefore still records the same identity at both scopes.
23
+ * - **Discriminating within a single file** — the several managed entries inside one Codex
24
+ * `config.toml` carry different ownership identities, so they stay several logical assets
25
+ * instead of collapsing into one.
26
+ *
27
+ * The registry asset id is deliberately *not* part of the key: an ownership identity naming a
28
+ * copy-tree entry already embeds the asset id, and one naming an in-place edit is already unique to
29
+ * its harness role, so including it would make identity depend on a registry lookup that can fail
30
+ * for no gain in discrimination. It stays a reported field on every entry.
31
+ *
32
+ * Two alternatives were available and are not sufficient (IC-004):
33
+ * - The recorded `identity` field (source-relative) is absent on a small number of resources, so
34
+ * it cannot key every row. It is a different field from `ownershipIdentity`, and unrelated here.
35
+ * - The destination path taken relative to the harness's registry-declared native directory — the
36
+ * basis this contract carried until it was revised — is total only over assets copied into a
37
+ * native directory. The three assets that edit a region of a user-owned file or write at the
38
+ * harness config root (`guidance.core`, `guidance.codex-pointer`, `claude.settings`) declare no
39
+ * native directory at all, so that derivation returned nothing for exactly the instruction files
40
+ * most likely to differ between scopes.
41
+ */
42
+
43
+ /**
44
+ * Derives the IC-004 cross-scope logical-asset identity for one recorded resource.
45
+ *
46
+ * @param {Object} resource a recorded resource, as read from a neutral ledger: at minimum
47
+ * `{ harness, ownershipIdentity }`. `scope` and `target` are deliberately not read — they are the
48
+ * two components the projection drops. `assetId` is not read either (see the header).
49
+ * @returns {string|null} a stable key equal for two resources with the same harness and ownership
50
+ * identity; `null` when either component is missing or empty. A harness id never contains a space,
51
+ * so joining on one is injective over the pair. The fail-closed branch is reachable despite the
52
+ * lifecycle boundary enforcing `ownershipIdentity` on write, because a ledger is a JSON file a
53
+ * user can hand-edit. `null` is a signal to the caller to report the row as unresolved, never a
54
+ * value to join or compare against another `null`.
55
+ */
56
+ function deriveAssetIdentity(resource ) {
57
+ if (!resource || typeof resource !== 'object') return null;
58
+ const { harness, ownershipIdentity } = resource;
59
+ if (typeof harness !== 'string' || harness === '') return null;
60
+ if (typeof ownershipIdentity !== 'string' || ownershipIdentity === '') return null;
61
+
62
+ return [harness, ownershipIdentity].join(' ');
63
+ }
64
+
65
+ module.exports = { deriveAssetIdentity };