@khoavu882/doflow 2.0.0-beta.4 → 2.0.0

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 (497) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  3. package/core/.antigravity-plugin/plugin.json +1 -3
  4. package/core/.claude-plugin/plugin.json +1 -1
  5. package/core/.codex-plugin/plugin.json +1 -1
  6. package/core/.plugin/plugin.json +1 -1
  7. package/core/harnesses/claude/hooks/lib.sh +43 -24
  8. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +7 -17
  9. package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
  10. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  11. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  12. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  13. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  14. package/core/harnesses/claude/hooks/pre-bash-guard.sh +7 -17
  15. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  16. package/core/harnesses/claude/hooks/pre-implement-gate.sh +7 -18
  17. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  18. package/core/harnesses/claude/hooks/session-start.sh +5 -3
  19. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  20. package/core/harnesses/claude/hooks/stop-check.sh +5 -3
  21. package/core/harnesses/claude/hooks/subagent-audit.sh +5 -5
  22. package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -3
  23. package/core/harnesses/claude/settings/settings.json +18 -0
  24. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  25. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  26. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  27. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  28. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  29. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  30. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  31. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  32. package/core/harnesses/codex/hooks/lib.sh +44 -25
  33. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +7 -15
  34. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  35. package/core/harnesses/codex/hooks/pre-bash-guard.sh +7 -15
  36. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  37. package/core/harnesses/codex/hooks/pre-implement-gate.sh +7 -16
  38. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  39. package/core/harnesses/codex/hooks/session-start.sh +5 -3
  40. package/core/harnesses/codex/hooks/stop-check.sh +6 -5
  41. package/core/harnesses/codex/hooks/subagent-audit.sh +18 -6
  42. package/core/harnesses/codex/hooks/user-prompt-submit.sh +5 -4
  43. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  44. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  45. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  46. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  47. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  48. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  49. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  50. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  51. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  52. package/core/harnesses/kiro/agents/doflow.json +1 -1
  53. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  54. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +21 -5
  55. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +21 -5
  56. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +21 -5
  57. package/core/harnesses/kiro/hooks/session-start.sh +12 -5
  58. package/core/harnesses/kiro/hooks/stop-check.sh +22 -30
  59. package/core/harnesses/pi/extensions/doflow-guard.js +167 -0
  60. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +27 -12
  61. package/core/harnesses/shared/hooks/adapters/antigravity.js +14 -57
  62. package/core/harnesses/shared/hooks/bridge/bridge.sh +277 -0
  63. package/core/harnesses/shared/hooks/bridge/envelope.jq +129 -0
  64. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  65. package/core/harnesses/shared/hooks/bridge/respond.sh +70 -0
  66. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  67. package/core/harnesses/shared/hooks/policies/capture-failure.sh +51 -16
  68. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  69. package/core/harnesses/shared/hooks/policies/contract.sh +78 -0
  70. package/core/harnesses/shared/hooks/policies/deny-json.sh +35 -9
  71. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  72. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  73. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  74. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  75. package/core/harnesses/shared/hooks/policies/lib.sh +65 -40
  76. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +48 -35
  77. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +284 -33
  78. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +180 -110
  79. package/core/harnesses/shared/hooks/policies/session-context.sh +66 -7
  80. package/core/harnesses/shared/hooks/policies/stop-check.sh +61 -23
  81. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +39 -6
  82. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  83. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +97 -159
  84. package/core/harnesses/shared/hooks/stream-hook-runner.js +114 -187
  85. package/core/harnesses/shared/locator/doflow-run +2 -3
  86. package/core/registry/advice.json +3 -3
  87. package/core/registry/assets.json +72 -80
  88. package/core/registry/capabilities.json +12 -0
  89. package/core/registry/contracts.json +60 -33
  90. package/core/registry/contribution-points.json +32 -0
  91. package/core/registry/gates.json +32 -0
  92. package/core/registry/guidance-caps.json +40 -0
  93. package/core/registry/harnesses.json +1542 -277
  94. package/core/registry/lifecycle.json +2837 -37
  95. package/core/registry/mcp.json +5 -1
  96. package/core/registry/models.json +7 -1
  97. package/core/registry/package-templates/README.md +19 -0
  98. package/core/registry/package-templates/agent/files/agent.md +9 -0
  99. package/core/registry/package-templates/agent/template.json +4 -0
  100. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  101. package/core/registry/package-templates/capability-provider/template.json +11 -0
  102. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  103. package/core/registry/package-templates/debate-preset/template.json +4 -0
  104. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  105. package/core/registry/package-templates/review-preset/template.json +4 -0
  106. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  107. package/core/registry/package-templates/skill/template.json +4 -0
  108. package/core/registry/package-templates/worker/files/worker.json +92 -0
  109. package/core/registry/package-templates/worker/template.json +11 -0
  110. package/core/registry/packages/doflow/doflow-package.json +15 -0
  111. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  112. package/core/registry/protocols.json +61 -0
  113. package/core/registry/routes.json +17 -0
  114. package/core/registry/rules.json +431 -0
  115. package/core/registry/settings.json +276 -0
  116. package/core/registry/storage.json +701 -30
  117. package/core/registry/telemetry.json +236 -0
  118. package/core/registry/transcripts.json +142 -0
  119. package/core/registry/verification.json +76 -1
  120. package/core/registry/workflows.json +55 -0
  121. package/core/shared/agent-specs/core-implementer.md +3 -0
  122. package/core/shared/agent-specs/delivery-lead.md +68 -0
  123. package/core/shared/agent-specs/quality-guardian.md +5 -1
  124. package/core/shared/agent-specs/research-writer.md +10 -3
  125. package/core/shared/agent-specs/reviewer.md +53 -0
  126. package/core/shared/agent-specs/spec-analyst.md +5 -6
  127. package/core/shared/agent-specs/system-architect.md +5 -1
  128. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  129. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  130. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  131. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  132. package/core/shared/guidance/pointers/codex.md +1 -4
  133. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  134. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  135. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  136. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  137. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  138. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  139. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  140. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  141. package/core/shared/guidance/rules/RULES.md +45 -0
  142. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  143. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  144. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  145. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  146. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  147. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  148. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  149. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  150. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  151. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  152. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  153. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  154. package/core/shared/scripts/doflow/bin/doflow-run +154 -35
  155. package/core/shared/skills/do/SKILL.md +12 -10
  156. package/core/shared/skills/do/references/advice_calls.md +26 -0
  157. package/core/shared/skills/do/references/pm_routing.md +1 -2
  158. package/core/shared/skills/do/references/program_mode.md +31 -0
  159. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  160. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  161. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  162. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  163. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  164. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  165. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  166. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  167. package/core/shared/skills/do-design/SKILL.md +24 -23
  168. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  169. package/core/shared/skills/do-document/SKILL.md +11 -1
  170. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  171. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  172. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  173. package/core/shared/skills/do-execute-plan/SKILL.md +17 -59
  174. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  175. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  176. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +28 -1
  177. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  178. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  179. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  180. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  181. package/core/shared/skills/do-flow/SKILL.md +8 -9
  182. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  183. package/core/shared/skills/do-git/SKILL.md +4 -0
  184. package/core/shared/skills/do-implement/SKILL.md +7 -9
  185. package/core/shared/skills/do-plan/SKILL.md +29 -19
  186. package/core/shared/skills/do-test/SKILL.md +7 -4
  187. package/core/shared/templates/doflow/constitution-template.md +9 -3
  188. package/core/shared/templates/doflow/data-model-template.md +1 -1
  189. package/core/shared/templates/doflow/design-template.md +113 -16
  190. package/core/shared/templates/doflow/plan-template.md +11 -10
  191. package/core/shared/templates/doflow/question-log-template.md +14 -2
  192. package/core/shared/templates/doflow/requirement-template.md +1 -1
  193. package/core/worker-evidence/antigravity/checks.json +14 -0
  194. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  195. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  196. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  197. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  198. package/core/worker-evidence/codex/checks.json +38 -0
  199. package/package.json +10 -6
  200. package/src/adapters/antigravity/index.js +226 -113
  201. package/src/adapters/claude/index.js +39 -5
  202. package/src/adapters/codex/agents.js +25 -15
  203. package/src/adapters/codex/hooks.js +40 -5
  204. package/src/adapters/codex/index.js +100 -22
  205. package/src/adapters/codex/native-projection.js +6 -2
  206. package/src/adapters/copilot/index.js +58 -23
  207. package/src/adapters/copy-tree.js +294 -48
  208. package/src/adapters/guidance-manifest.js +71 -0
  209. package/src/adapters/guidance-pointer.js +19 -0
  210. package/src/adapters/hook-commands.js +6 -10
  211. package/src/adapters/index.js +1 -0
  212. package/src/adapters/kiro/index.js +38 -13
  213. package/src/adapters/opencode/index.js +8 -8
  214. package/src/adapters/pi/hooks.js +120 -0
  215. package/src/adapters/pi/index.js +48 -16
  216. package/src/adapters/resolve-source.js +26 -2
  217. package/src/cli/commands/install.js +3 -2
  218. package/src/cli/commands/reconcile.js +53 -9
  219. package/src/cli/commands/remove.js +2 -2
  220. package/src/cli/commands/rollback.js +6 -3
  221. package/src/cli/commands/self-update.js +18 -9
  222. package/src/cli/commands/status.js +21 -2
  223. package/src/cli/commands/ui.js +99 -0
  224. package/src/cli/commands/update.js +3 -2
  225. package/src/cli/index.js +338 -33
  226. package/src/cli/runtime-commands.js +243 -52
  227. package/src/cli/shared.js +0 -2
  228. package/src/helper/git.js +1 -1
  229. package/src/helper/guardrails.js +1 -1
  230. package/src/helper/marker-merge.js +31 -13
  231. package/src/helper/package-ids.js +37 -0
  232. package/src/helper/semver.js +94 -0
  233. package/src/install/backup.js +105 -15
  234. package/src/install/context.js +1 -1
  235. package/src/install/targets.js +31 -16
  236. package/src/lifecycle/coverage.js +74 -0
  237. package/src/lifecycle/hook-step.js +61 -0
  238. package/src/lifecycle/hook-tier.js +160 -0
  239. package/src/lifecycle/index.js +434 -86
  240. package/src/lifecycle/retired-harnesses.js +318 -0
  241. package/src/lifecycle/view.js +35 -15
  242. package/src/registry/index.js +686 -32
  243. package/src/registry/worker-ids.js +45 -0
  244. package/src/release/build-package.js +0 -3
  245. package/src/release/docs-blocks.js +492 -0
  246. package/src/release/preflight.js +425 -0
  247. package/src/release/rehearse.js +401 -0
  248. package/src/release/release-workflow.js +733 -0
  249. package/src/release/sync-plugin-versions.js +43 -7
  250. package/src/runtime/advice/bench-gate.js +25 -0
  251. package/src/runtime/advice/cli.js +59 -16
  252. package/src/runtime/advice/client.js +32 -9
  253. package/src/runtime/advice/config.js +98 -133
  254. package/src/runtime/advice/doctor.js +1 -1
  255. package/src/runtime/advice/elevation.js +97 -0
  256. package/src/runtime/advice/endpoint-guard.js +9 -3
  257. package/src/runtime/advice/mode.js +37 -0
  258. package/src/runtime/advice/record.js +18 -5
  259. package/src/runtime/advice/registry.js +4 -1
  260. package/src/runtime/advice/shadow-config.js +229 -0
  261. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  262. package/src/runtime/brief-rules.js +81 -0
  263. package/src/runtime/brief-tools.js +111 -34
  264. package/src/runtime/candidate.js +514 -0
  265. package/src/runtime/capabilities/executor.js +450 -0
  266. package/src/runtime/capabilities/loopback.js +41 -0
  267. package/src/runtime/capabilities/sanitizer.js +88 -0
  268. package/src/runtime/capability-router.js +135 -3
  269. package/src/runtime/checkouts.js +73 -11
  270. package/src/runtime/claims.js +27 -12
  271. package/src/runtime/cli-result.js +11 -4
  272. package/src/runtime/cli.js +221 -277
  273. package/src/runtime/config-home.js +42 -0
  274. package/src/runtime/context/arbitrate.js +767 -0
  275. package/src/runtime/context/budget.js +203 -0
  276. package/src/runtime/context/compose.js +1367 -0
  277. package/src/runtime/context/delivery-store.js +100 -0
  278. package/src/runtime/context/emission-rules.js +118 -0
  279. package/src/runtime/context/identity.js +227 -0
  280. package/src/runtime/context/mandatory.js +594 -0
  281. package/src/runtime/context/pointer.js +142 -0
  282. package/src/runtime/context/primary-command.js +117 -0
  283. package/src/runtime/context/primary.js +344 -0
  284. package/src/runtime/context/summary-store.js +655 -0
  285. package/src/runtime/context-pack.js +1106 -245
  286. package/src/runtime/decision-register.js +13 -4
  287. package/src/runtime/dispatch/admission.js +392 -0
  288. package/src/runtime/dispatch/attempt-end.js +274 -0
  289. package/src/runtime/dispatch/command.js +628 -0
  290. package/src/runtime/dispatch/controls.js +904 -0
  291. package/src/runtime/dispatch/envelope.js +276 -0
  292. package/src/runtime/dispatch/grants.js +310 -0
  293. package/src/runtime/dispatch/integrate.js +617 -0
  294. package/src/runtime/dispatch/loop.js +1835 -0
  295. package/src/runtime/dispatch/store.js +352 -0
  296. package/src/runtime/dispatch/verify-run.js +201 -0
  297. package/src/runtime/evidence-fields.js +39 -0
  298. package/src/runtime/evidence-ledger.js +41 -7
  299. package/src/runtime/failure/capture.js +3 -1
  300. package/src/runtime/failure/cli.js +25 -9
  301. package/src/runtime/failure/home.js +57 -30
  302. package/src/runtime/failure/store.js +7 -2
  303. package/src/runtime/feature-pointer.js +174 -0
  304. package/src/runtime/feature-resolve.js +13 -2
  305. package/src/runtime/fleet/command.js +77 -0
  306. package/src/runtime/fleet/projects.js +178 -0
  307. package/src/runtime/fleet/tree.js +383 -0
  308. package/src/runtime/freshness.js +77 -10
  309. package/src/runtime/git-memo.js +46 -0
  310. package/src/runtime/guidance/ablation.js +427 -0
  311. package/src/runtime/health.js +565 -17
  312. package/src/runtime/history-compactor.js +13 -3
  313. package/src/runtime/implementation-gate.js +277 -22
  314. package/src/runtime/inventory/coverage.js +1 -1
  315. package/src/runtime/inventory/index.js +1 -1
  316. package/src/runtime/inventory/precedence.js +2 -2
  317. package/src/runtime/inventory/siblings.js +6 -4
  318. package/src/runtime/knowledge/code-corpus.js +277 -0
  319. package/src/runtime/knowledge/code-lexical.js +130 -0
  320. package/src/runtime/knowledge/code-retrieval.js +307 -0
  321. package/src/runtime/knowledge/code-validation.js +106 -0
  322. package/src/runtime/knowledge/gp3-gate.js +74 -0
  323. package/src/runtime/knowledge/graph-adapter.js +288 -0
  324. package/src/runtime/knowledge/graph-fallback.js +394 -0
  325. package/src/runtime/knowledge/hybrid.js +136 -8
  326. package/src/runtime/knowledge/retrieval.js +34 -1
  327. package/src/runtime/knowledge/rtk-compress.js +77 -0
  328. package/src/runtime/knowledge/semble-bridge.py +106 -0
  329. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  330. package/src/runtime/knowledge/semble-provider.js +365 -0
  331. package/src/runtime/lifecycle/cli.js +16 -6
  332. package/src/runtime/lifecycle/event-store.js +8 -6
  333. package/src/runtime/lifecycle/followup.js +6 -1
  334. package/src/runtime/lifecycle/overview.js +24 -1
  335. package/src/runtime/lifecycle/report-store.js +8 -10
  336. package/src/runtime/lifecycle/retention.js +95 -31
  337. package/src/runtime/lifecycle/root.js +9 -1
  338. package/src/runtime/lifecycle/status.js +34 -17
  339. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  340. package/src/runtime/mask.js +134 -7
  341. package/src/runtime/mcp-consultations.js +40 -6
  342. package/src/runtime/model-router.js +79 -7
  343. package/src/runtime/models/catalogue.js +191 -0
  344. package/src/runtime/models/command.js +153 -0
  345. package/src/runtime/off-words.js +12 -0
  346. package/src/runtime/outcome.js +3 -3
  347. package/src/runtime/packages/command.js +1009 -0
  348. package/src/runtime/packages/contributions.js +116 -0
  349. package/src/runtime/packages/digest.js +132 -0
  350. package/src/runtime/packages/fetch.js +182 -0
  351. package/src/runtime/packages/grants.js +192 -0
  352. package/src/runtime/packages/index-file.js +134 -0
  353. package/src/runtime/packages/instruction.js +90 -0
  354. package/src/runtime/packages/manifest.js +331 -0
  355. package/src/runtime/packages/points.js +477 -0
  356. package/src/runtime/packages/programs.js +216 -0
  357. package/src/runtime/packages/scaffold.js +277 -0
  358. package/src/runtime/packages/source.js +90 -0
  359. package/src/runtime/packages/state.js +164 -0
  360. package/src/runtime/packages/store.js +449 -0
  361. package/src/runtime/packages/tar.js +106 -0
  362. package/src/runtime/packages/view.js +406 -0
  363. package/src/runtime/plan-check.js +59 -0
  364. package/src/runtime/plan-content.js +324 -0
  365. package/src/runtime/policy-init.js +118 -0
  366. package/src/runtime/profiles/doctor.js +96 -0
  367. package/src/runtime/profiles/resolve.js +244 -0
  368. package/src/runtime/profiles/rollback.js +254 -0
  369. package/src/runtime/profiles/sampler.js +41 -0
  370. package/src/runtime/readiness-record.js +16 -11
  371. package/src/runtime/readiness.js +127 -16
  372. package/src/runtime/research-request.js +50 -25
  373. package/src/runtime/retrieval-plan.js +402 -73
  374. package/src/runtime/retrieval-record.js +293 -0
  375. package/src/runtime/review/command.js +246 -0
  376. package/src/runtime/review/dominance.js +68 -0
  377. package/src/runtime/review/findings.js +434 -0
  378. package/src/runtime/review/identity.js +255 -0
  379. package/src/runtime/review/protocol-command.js +109 -0
  380. package/src/runtime/review/protocols.js +405 -0
  381. package/src/runtime/review/resolve-protocol.js +302 -0
  382. package/src/runtime/review/start.js +530 -0
  383. package/src/runtime/roadmap/facts.js +479 -0
  384. package/src/runtime/roadmap/gates.js +270 -0
  385. package/src/runtime/roadmap/loop.js +1636 -0
  386. package/src/runtime/roadmap/merge.js +381 -0
  387. package/src/runtime/roadmap/rows.js +1113 -0
  388. package/src/runtime/roadmap/seed.js +951 -0
  389. package/src/runtime/rules-report.js +336 -0
  390. package/src/runtime/scaffold/artifacts.js +63 -9
  391. package/src/runtime/scaffold/generate.js +21 -9
  392. package/src/runtime/settings/autopilot.js +106 -0
  393. package/src/runtime/settings/cli.js +280 -0
  394. package/src/runtime/settings/config-write.js +314 -0
  395. package/src/runtime/settings/files.js +271 -0
  396. package/src/runtime/settings/legacy.js +154 -0
  397. package/src/runtime/settings/lexical.js +56 -0
  398. package/src/runtime/settings/prepared-run.js +269 -0
  399. package/src/runtime/settings/project-layers.js +118 -0
  400. package/src/runtime/settings/refs.js +288 -0
  401. package/src/runtime/settings/registry.js +553 -0
  402. package/src/runtime/settings/resolve.js +713 -0
  403. package/src/runtime/settings/shared.js +37 -0
  404. package/src/runtime/settings/worker-billing.js +107 -0
  405. package/src/runtime/settings/write.js +269 -0
  406. package/src/runtime/slot-command.js +78 -0
  407. package/src/runtime/slots.js +671 -0
  408. package/src/runtime/source-version.js +290 -0
  409. package/src/runtime/state-root.js +217 -0
  410. package/src/runtime/storage/cli.js +12 -5
  411. package/src/runtime/storage/engine.js +9 -2
  412. package/src/runtime/storage/registry.js +14 -1
  413. package/src/runtime/storage/roots.js +66 -16
  414. package/src/runtime/storage/rules.js +82 -10
  415. package/src/runtime/storage/upkeep.js +10 -2
  416. package/src/runtime/storage/work-status.js +245 -26
  417. package/src/runtime/task-attempts.js +589 -69
  418. package/src/runtime/task-classifier.js +47 -11
  419. package/src/runtime/task-graph.js +373 -0
  420. package/src/runtime/task-run.js +778 -0
  421. package/src/runtime/task-scope.js +202 -56
  422. package/src/runtime/task-sources.js +147 -0
  423. package/src/runtime/task-state.js +440 -65
  424. package/src/runtime/team/admission.js +301 -0
  425. package/src/runtime/team/envelope.js +324 -0
  426. package/src/runtime/team/review-guard.js +156 -0
  427. package/src/runtime/trace/analyze.js +427 -0
  428. package/src/runtime/trace/baseline.js +770 -0
  429. package/src/runtime/trace/ledger.js +63 -140
  430. package/src/runtime/trace/otlp-export.js +568 -0
  431. package/src/runtime/trace/otlp-map.js +481 -0
  432. package/src/runtime/trace/spans.js +745 -0
  433. package/src/runtime/trace/telemetry.js +225 -0
  434. package/src/runtime/trace/views.js +1 -0
  435. package/src/runtime/transcripts/command.js +98 -0
  436. package/src/runtime/transcripts/cursor.js +326 -0
  437. package/src/runtime/transcripts/read.js +126 -0
  438. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  439. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  440. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  441. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  442. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  443. package/src/runtime/transcripts/registry.js +161 -0
  444. package/src/runtime/transcripts/stats.js +161 -0
  445. package/src/runtime/verification/check-key.js +628 -0
  446. package/src/runtime/verification/contract-runner.js +546 -11
  447. package/src/runtime/verification/engine.js +499 -9
  448. package/src/runtime/verification/impact.js +617 -0
  449. package/src/runtime/verification/inflight.js +205 -0
  450. package/src/runtime/verification/registry.js +176 -0
  451. package/src/runtime/verification/reuse.js +184 -0
  452. package/src/runtime/verification/telemetry-emit.js +254 -0
  453. package/src/runtime/verification/test-selection.js +67 -7
  454. package/src/runtime/worker/active.js +90 -0
  455. package/src/runtime/worker/cancel.js +222 -0
  456. package/src/runtime/worker/catalogue.js +122 -0
  457. package/src/runtime/worker/command.js +677 -0
  458. package/src/runtime/worker/evidence.js +288 -0
  459. package/src/runtime/worker/launch.js +288 -0
  460. package/src/runtime/worker/models.js +137 -0
  461. package/src/runtime/worker/parsers.js +218 -0
  462. package/src/runtime/worker/probes/index.js +706 -0
  463. package/src/runtime/worker/process-tree.js +415 -0
  464. package/src/runtime/worker/quota.js +43 -0
  465. package/src/runtime/worker/readiness.js +713 -0
  466. package/src/runtime/worker/run-store.js +166 -0
  467. package/src/runtime/worker/supervisor.js +541 -0
  468. package/src/runtime/worker/worktree-check.js +252 -0
  469. package/src/runtime/workflow-engine.js +5 -1
  470. package/src/runtime/workflow-orchestrator.js +578 -63
  471. package/src/runtime/worktree.js +149 -22
  472. package/src/state/index.js +1 -1
  473. package/src/state/lockfile.js +64 -10
  474. package/src/state/run-lock.js +1 -1
  475. package/types/node-commonjs.d.ts +106 -7
  476. package/core/.antigravity-plugin/hooks.json +0 -39
  477. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  478. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  479. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -21
  480. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  481. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -21
  482. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  483. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -22
  484. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  485. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  486. package/core/harnesses/gemini/hooks/session-start.sh +0 -5
  487. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  488. package/core/harnesses/shared/hooks/adapters/arg-fields.js +0 -19
  489. package/core/harnesses/shared/hooks/adapters/gemini.js +0 -114
  490. package/core/harnesses/shared/hooks/hooks.json +0 -47
  491. package/core/shared/guidance/FLAGS.md +0 -25
  492. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  493. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  494. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  495. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  496. package/src/adapters/gemini/hooks.js +0 -210
  497. package/src/adapters/gemini/index.js +0 -390
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # do-paths.sh — deterministic path/feature resolver for the doflow chain.
3
4
  #
4
5
  # Emits a single JSON object describing the ACTIVE feature so doflow skills
@@ -34,6 +35,9 @@ mode="json"
34
35
  require=""
35
36
  slug_override=""
36
37
  prev=""
38
+ # Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
39
+ _da="$(dirname "$0")/do-args.sh"
40
+ if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--slug" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
37
41
  for arg in "$@"; do
38
42
  case "$arg" in
39
43
  --json) mode="json" ;;
@@ -160,6 +164,31 @@ if [ -n "$feature_slug" ]; then
160
164
  fi
161
165
  fi
162
166
 
167
+ # ── main checkout (IC-005) ────────────────────────────────────────────────────
168
+ # Prints the main working tree's path when this checkout is a linked worktree of it, else nothing.
169
+ # Same rule as the pre-implementation gate's checkouts(): the first `git worktree list --porcelain`
170
+ # entry; a bare main, a main whose directory is gone and a DoFlow sandbox (.doflow-worktree-base at
171
+ # the current checkout's root) never count. Read-only.
172
+ main_checkout() {
173
+ [ "$is_git_repo" = true ] || return 0
174
+ [ -e "$repo_root/.doflow-worktree-base" ] && return 0
175
+ local list first bare=false line here main_real
176
+ list="$(git -C "$repo_root" worktree list --porcelain 2>/dev/null)" || return 0
177
+ first=""
178
+ while IFS= read -r line; do
179
+ case "$line" in
180
+ "worktree "*) [ -n "$first" ] && break; first="${line#worktree }" ;;
181
+ bare) bare=true ;;
182
+ esac
183
+ done <<< "$list"
184
+ [ -n "$first" ] && [ "$bare" = false ] || return 0
185
+ main_real="$(cd -P "$first" 2>/dev/null && pwd)" || return 0
186
+ here="$(cd -P "$repo_root" 2>/dev/null && pwd)" || return 0
187
+ [ "$main_real" = "$here" ] && return 0
188
+ printf '%s' "$main_real"
189
+ }
190
+
191
+ feature_root="$repo_root"
163
192
  feature_dir=""; requirement=""; design=""; specs=""; data_model=""; plan=""; state=""; audit=""
164
193
  decisions=""; decisions_register=""; has_decisions=false
165
194
  has_requirement=false; has_design=false; has_plan=false; has_specs=false; has_data_model=false
@@ -167,7 +196,14 @@ layout="legacy"
167
196
  intention_next_round=""; design_next_round=""; plan_next_round=""
168
197
  if [ -n "$feature_slug" ]; then
169
198
  feature_dir="$specs_rel/$feature_slug"
170
- abs="$repo_root/$feature_dir"
199
+ # The checkout that holds the folder: this one when it has it, else the main checkout when a linked
200
+ # worktree does not, else this one (a new feature). The artifact flags and round scans below read
201
+ # that checkout; every emitted path stays relative to repo_root.
202
+ if [ ! -d "$repo_root/$feature_dir" ]; then
203
+ main_root="$(main_checkout)"
204
+ if [ -n "$main_root" ] && [ -d "$main_root/$feature_dir" ]; then feature_root="$main_root"; fi
205
+ fi
206
+ abs="$feature_root/$feature_dir"
171
207
  state="$feature_dir/state.md"; audit="$feature_dir/audit.md"
172
208
  decisions="$feature_dir/decisions.md"; decisions_register="$feature_dir/decisions/register.json"
173
209
  [ -f "$abs/decisions/register.json" ] && has_decisions=true
@@ -280,7 +316,7 @@ if [ "$require" = "feature" ] && [ -z "$feature_slug" ]; then
280
316
  '{error:"ambiguous-feature",
281
317
  branch:(if $branch=="" then null else $branch end),
282
318
  candidate_slugs:$candidate_slugs,
283
- hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one via AskUserQuestion, then re-run with --slug=<chosen>"}'
319
+ hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one with the user question tool, then re-run with --slug=<chosen>"}'
284
320
  else
285
321
  jq -n --arg branch "$branch" \
286
322
  '{error:"no-active-feature",
@@ -293,6 +329,7 @@ fi
293
329
  # ── emit resolver JSON ────────────────────────────────────────────────────────
294
330
  jq -n \
295
331
  --arg repo_root "$repo_root" \
332
+ --arg feature_root "$feature_root" \
296
333
  --argjson is_git_repo "$is_git_repo" \
297
334
  --arg branch "$branch" \
298
335
  --arg feature_slug "$feature_slug" \
@@ -314,6 +351,7 @@ jq -n \
314
351
  --arg branch_class "$branch_class" \
315
352
  '{
316
353
  repo_root: $repo_root,
354
+ feature_root: $feature_root,
317
355
  is_git_repo: $is_git_repo,
318
356
  branch: (if $branch=="" then null else $branch end),
319
357
  feature_slug: (if $feature_slug=="" then null else $feature_slug end),
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # do-prereqs.sh — doflow implement-phase prerequisite gate (prompt-level PRIMARY).
3
4
  #
4
5
  # Called as step 1 of /do-execute-plan. With --require-plan it exits 2 (and prints an
@@ -48,7 +49,7 @@ if [ "$require_plan" = true ]; then
48
49
  if [ -z "$slug" ]; then
49
50
  if [ "$candidate_slugs" != "[]" ]; then
50
51
  echo "$json" | jq '{ok:false, error:"ambiguous-feature", candidate_slugs:.candidate_slugs,
51
- hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one via AskUserQuestion, then re-run do-prereqs.sh --require-plan --slug=<chosen>"}'
52
+ hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one with the user question tool, then re-run do-prereqs.sh --require-plan --slug=<chosen>"}'
52
53
  else
53
54
  echo "$json" | jq '{ok:false, error:"no-active-feature", hint:"run /do-brainstorm to start a feature"}'
54
55
  fi
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # do-review-package.sh — write one commit range's review package to a file.
3
4
  #
4
5
  # Commit list, stat summary, and the diff with extended context, in one file a
@@ -25,6 +26,9 @@
25
26
  set -uo pipefail
26
27
 
27
28
  task_id=""; base=""; head_ref=""; slug_override=""
29
+ # Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
30
+ _da="$(dirname "$0")/do-args.sh"
31
+ if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--task --base --head --slug" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
28
32
  for arg in "$@"; do
29
33
  case "$arg" in
30
34
  --task=*) task_id="${arg#--task=}" ;;
@@ -10,7 +10,7 @@
10
10
  # requirements requirement.md §3 FR detail for the FRs the task's [US#] traces
11
11
  # why requirement.md §2 story text for that [US#]
12
12
  # global constraints requirement.md §4 — ALL NFR detail; NFRs bind every task
13
- # component boundary design.md §3 detail for components serving those FRs
13
+ # component boundary design.md "Components & Boundaries" detail for components serving those FRs
14
14
  # verification bar plan.md §7 rows for those FRs + the phase's Checkpoints line
15
15
  # interface contracts specs.md §1 in full — only when the resolver reports has_specs
16
16
  #
@@ -28,8 +28,9 @@
28
28
  # task line's `owner:` and `tier:`, calls the dispatcher once per brief and writes the block plus
29
29
  # the `*-brief.json` record (IC-018) beside the brief. It names no tool, provider, server or tier.
30
30
  # It fails open (IC-019): a missing dispatcher, a non-zero exit or output that is not the expected
31
- # JSON gives a "Not generated" line and a static report-format block, a `missing[]` note, no
32
- # record, and the exit status the brief would otherwise have had.
31
+ # JSON gives a "Not generated" line, the must-carry rules (read from the rule ledger,
32
+ # `core/registry/rules.json`, whatever the task line's owner) and a static report-format block, a
33
+ # `missing[]` note, no record, and the exit status the brief would otherwise have had.
33
34
  #
34
35
  # Usage:
35
36
  # do-task-brief.sh --task=<id> [--harness=<id>] [--slug=<slug>] [--json]
@@ -47,6 +48,9 @@ slug_override=""
47
48
  harness=""
48
49
  mode=""
49
50
 
51
+ # Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
52
+ _da="$(dirname "$0")/do-args.sh"
53
+ if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--task --group --tasks --slug --harness" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
50
54
  for arg in "$@"; do
51
55
  case "$arg" in
52
56
  --task=*)
@@ -192,7 +196,7 @@ task_field() { # task_field <task line> <name>
192
196
  }
193
197
 
194
198
  # Sets bt_md and bt_record on success, bt_reason on every failure; never exits.
195
- bt_call() { # bt_call <owner> <tier> <heading level> <task ids>
199
+ bt_verb() { # bt_verb <owner> <tier> <heading level> <task ids>
196
200
  bt_md=""; bt_record=""; bt_reason=""
197
201
  local dispatcher="$script_dir/../bin/doflow-run" out rc
198
202
  if [ -z "$1" ]; then bt_reason="the task line names no owner"; return 0; fi
@@ -210,7 +214,43 @@ bt_call() { # bt_call <owner> <tier> <heading level> <task ids>
210
214
  return 0
211
215
  }
212
216
 
213
- # The block for the brief: the verb's markdown, or the static fallback (no tool names).
217
+ # The registry file `core/registry/<name>` of the runtime this script belongs to: next to the checkout or
218
+ # projected runtime found above this script, else the global projected runtime. Empty when none exists.
219
+ registry_file() { # registry_file <name>
220
+ local d="$script_dir" c
221
+ while [ -n "$d" ] && [ "$d" != "/" ]; do
222
+ for c in "$d/core/registry/$1" "$d/runtime/core/registry/$1"; do
223
+ if [ -f "$c" ]; then printf '%s' "$c"; return 0; fi
224
+ done
225
+ d="$(dirname "$d")"
226
+ done
227
+ c="${HOME:-}/.doflow/runtime/core/registry/$1"
228
+ if [ -f "$c" ]; then printf '%s' "$c"; fi
229
+ return 0
230
+ }
231
+
232
+ # Sets bt_rules to the "Rules that apply to you" block (the mustCarry lines of the rule ledger, as
233
+ # src/runtime/brief-rules.js renders them) when the verb did not produce the brief block, which
234
+ # already carries it; names the reason in missing[] when the ledger cannot be read. Never exits.
235
+ bt_rules_load() { # bt_rules_load <heading level>
236
+ bt_rules=""
237
+ [ -z "$bt_md" ] || return 0
238
+ local h="##" file lines
239
+ [ "$1" = "3" ] && h="###"
240
+ file="$(registry_file rules.json)"
241
+ if [ -z "$file" ]; then missing+=("brief-rules: core/registry/rules.json is missing"); return 0; fi
242
+ lines="$(jq -r 'if (.mustCarry | type) == "array" and (.mustCarry | length) > 0 and (.mustCarry | all(type == "string")) then .mustCarry[] | "- " + . else empty end' "$file" 2>/dev/null)"
243
+ if [ -z "$lines" ]; then missing+=("brief-rules: core/registry/rules.json has no mustCarry array"); return 0; fi
244
+ bt_rules="$(printf '%s Rules that apply to you\n\n%s\n' "$h" "$lines")"
245
+ }
246
+
247
+ # The tier and tools block, the rules and the report format the task line's owner and tier give.
248
+ bt_call() { # bt_call <owner> <tier> <heading level> <task ids>
249
+ bt_verb "$@"
250
+ bt_rules_load "$3"
251
+ }
252
+
253
+ # The block for the brief: the verb's markdown, or the rules and the static fallback (no tool names).
214
254
  bt_emit() { # bt_emit <heading level>
215
255
  local h="##" who="your report"
216
256
  if [ "$1" = "3" ]; then h="###"; who="each task's report"; fi
@@ -218,9 +258,11 @@ bt_emit() { # bt_emit <heading level>
218
258
  printf '%s\n' "$bt_md"
219
259
  return 0
220
260
  fi
261
+ [ -z "$bt_rules" ] || printf '%s\n\n' "$bt_rules"
221
262
  printf '%s Tier and tools\n\nNot generated: %s. Name the tier and tools in the dispatch.\n\n' "$h" "$bt_reason"
222
- printf '%s Report format\n\nEnd %s with one line naming every tool and MCP server you used:\n' "$h" "$who"
263
+ printf '%s Report format\n\nPut one line naming every tool and MCP server you used just before the final status line:\n' "$h"
223
264
  printf '%s\n' '`Tools used: <name>[=used|nothing-usable|unavailable|skipped:<reason>], ...`'
265
+ printf 'End %s with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.\n' "$who"
224
266
  }
225
267
 
226
268
  # Writes the record beside the brief with its tasks filled in; sets record_out to its path, or to ""
@@ -286,8 +328,8 @@ if [ "$mode" = "task" ]; then
286
328
  components=""
287
329
  if [ -n "$frs" ] && [ -f "$des_abs" ]; then
288
330
  components="$(for fr in $frs; do
289
- section "$des_abs" '^## 3[.]' | awk -F'|' -v fr="$fr" '
290
- /^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
331
+ section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
332
+ /^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
291
333
  done | sort -u)"
292
334
  fi
293
335
 
@@ -342,7 +384,7 @@ if [ "$mode" = "task" ]; then
342
384
  echo "## Component boundary"
343
385
  echo
344
386
  printf '%s\n' "$components" | while read -r cmp; do
345
- [ -n "$cmp" ] && detail_for "$des_abs" '^## 3[.]' "$cmp"
387
+ [ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
346
388
  done
347
389
  echo
348
390
  fi
@@ -352,7 +394,7 @@ if [ "$mode" = "task" ]; then
352
394
  echo
353
395
  # §1 IN FULL, deliberately unfiltered: an IC-### entry carries no FR or component
354
396
  # linkage field, so there is nothing to filter it by the way "component boundary"
355
- # above filters design.md §3 rows on the FRs they name.
397
+ # above filters design.md Components & Boundaries rows on the FRs they name.
356
398
  section "$specs_abs" '^## 1[.]' | awk 'NF { p = 1 } p'
357
399
  echo
358
400
  fi
@@ -457,8 +499,8 @@ else
457
499
  # Union of components serving those FRs
458
500
  if [ -n "$all_frs" ] && [ -f "$des_abs" ]; then
459
501
  all_comps_raw="$(for fr in $all_frs; do
460
- section "$des_abs" '^## 3[.]' | awk -F'|' -v fr="$fr" '
461
- /^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
502
+ section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
503
+ /^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
462
504
  done | sort -u)"
463
505
  fi
464
506
 
@@ -490,8 +532,8 @@ else
490
532
  t_comps=""
491
533
  if [ -n "$t_frs" ] && [ -f "$des_abs" ]; then
492
534
  t_comps="$(for fr in $t_frs; do
493
- section "$des_abs" '^## 3[.]' | awk -F'|' -v fr="$fr" '
494
- /^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
535
+ section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
536
+ /^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
495
537
  done | sort -u)"
496
538
  fi
497
539
 
@@ -541,7 +583,7 @@ else
541
583
  echo "## Component boundary"
542
584
  echo
543
585
  printf '%s\n' "$t_comps" | while read -r cmp; do
544
- [ -n "$cmp" ] && detail_for "$des_abs" '^## 3[.]' "$cmp"
586
+ [ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
545
587
  done
546
588
  echo
547
589
  fi
@@ -590,7 +632,7 @@ else
590
632
  echo "### Component boundary"
591
633
  echo
592
634
  printf '%s\n' "$all_comps_raw" | while read -r cmp; do
593
- [ -n "$cmp" ] && detail_for "$des_abs" '^## 3[.]' "$cmp"
635
+ [ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
594
636
  done
595
637
  echo
596
638
  fi
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # render-audit.sh — projects the orchestrator's own journal into a human-readable audit.md.
3
4
  #
4
5
  # audit.md is generated, never hand-authored: this script deterministically OVERWRITES it in full
@@ -76,13 +77,36 @@ fi
76
77
  [ "$rc" -eq 0 ] || note "resolver-error"
77
78
 
78
79
  repo_root=$(printf '%s' "$resolved_json" | jq -r '.repo_root // empty')
80
+ feature_root=$(printf '%s' "$resolved_json" | jq -r '.feature_root // empty')
81
+ [ -n "$feature_root" ] || feature_root="$repo_root"
79
82
  feature_slug=$(printf '%s' "$resolved_json" | jq -r '.feature_slug // empty')
80
83
  audit_rel=$(printf '%s' "$resolved_json" | jq -r '.audit // empty')
81
84
  [ -n "$feature_slug" ] || note "no-active-feature"
82
85
 
83
86
  # WorkflowOrchestrator's own stateDir/runFile convention (workflow-orchestrator.ts):
84
87
  # stateDir = <root>/.doflow/state/orchestration ; runFile = <stateDir>/<taskId>.json
85
- journal_file="$repo_root/.doflow/state/orchestration/$feature_slug.json"
88
+ #
89
+ # The run is read from the MAIN checkout first (IC-004): a linked worktree's task records live there.
90
+ # Main is the first `git worktree list --porcelain` entry, the pre-implementation gate's rule: a bare
91
+ # main, a vanished main and a DoFlow sandbox (.doflow-worktree-base at this checkout's root) do not
92
+ # count. Main holding no copy, or this being the main checkout, falls back to this checkout's own.
93
+ main_checkout() {
94
+ [ -e "$repo_root/.doflow-worktree-base" ] && return 0
95
+ local list first="" is_bare=false line
96
+ list="$(git -C "$repo_root" worktree list --porcelain 2>/dev/null)" || return 0
97
+ while IFS= read -r line; do
98
+ case "$line" in
99
+ "worktree "*) [ -n "$first" ] && break; first="${line#worktree }" ;;
100
+ bare) is_bare=true ;;
101
+ esac
102
+ done <<< "$list"
103
+ [ -n "$first" ] && [ "$is_bare" = false ] && cd -P "$first" 2>/dev/null && pwd
104
+ return 0
105
+ }
106
+ journal_rel=".doflow/state/orchestration/$feature_slug.json"
107
+ journal_file="$repo_root/$journal_rel"
108
+ main_root="$(main_checkout)"
109
+ if [ -n "$main_root" ] && [ -f "$main_root/$journal_rel" ]; then journal_file="$main_root/$journal_rel"; fi
86
110
  [ -f "$journal_file" ] || note "no orchestration run recorded yet"
87
111
 
88
112
  jq -e '.history | type == "array"' "$journal_file" >/dev/null 2>&1 || note "journal-unreadable"
@@ -93,7 +117,7 @@ jq -e '.history | type == "array"' "$journal_file" >/dev/null 2>&1 || note "jour
93
117
  # reading it from the resolver rather than recomputing it here still means a future resolver change
94
118
  # has one place to land, not two that can drift apart.
95
119
  [ -n "$audit_rel" ] || note "resolver-missing-audit-path"
96
- audit_file="$repo_root/$audit_rel"
120
+ audit_file="$feature_root/$audit_rel"
97
121
 
98
122
  # Render to a temp file first, then move it into place. `>"$audit_file"` truncates the target
99
123
  # before the group runs, and with no `-e` a mid-stream jq abort (a malformed or hand-corrupted
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # render-diagrams.sh — renders a chain artifact's fenced mermaid blocks to image files.
3
4
  #
4
5
  # A FAITHFUL render: the same nodes, the same edges, the same labels. The committed markdown is the
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # render-puml.sh — renders a feature's authored PlantUML sources and projects them into its artifact.
3
4
  #
4
5
  # ONE verb doing BOTH derived views, deliberately (035 design R6): reading the source once means the
@@ -150,7 +151,7 @@ for src in "${sources[@]}"; do
150
151
  fi
151
152
  fi
152
153
 
153
- # One source feeds design.md §2's inline block; the others render only to images.
154
+ # One source feeds design.md System Overview (C4)'s inline block; the others render only to images.
154
155
  if [ "$src" = "$block_src" ]; then
155
156
  # stdout only is the block: the splice writes it into authored prose, so anything the projector
156
157
  # (or Node) prints on stderr, an ExperimentalWarning for one, must never become part of it.
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
2
3
  # validate-artifacts.sh — advisory consistency checker for doflow chain artifacts.
3
4
  #
4
5
  # Checks that an artifact's index tables agree with the detail beside them. This is a CONSISTENCY
@@ -18,6 +19,9 @@
18
19
  # unknown a line outside History, comments and code fences cites a DEC-### that is not in the
19
20
  # feature's decision register. Inert without a register.
20
21
  # rollup plan.md's phase rollup counts match its task checklist
22
+ # task-graph plan.md's task lines parse as the task-attempt ledger reads them: one finding per
23
+ # problem the read-only `plan-check` verb reports. Fail-soft: with the dispatcher,
24
+ # node or jq unavailable it prints one `note:` line on stderr and adds no finding.
21
25
  #
22
26
  # Grammar (see guidance/references/ARTIFACT_FORMAT.md) — deliberately prefix-agnostic, so
23
27
  # FR/NFR/C/D/A and any future prefix work with no change here:
@@ -81,10 +85,10 @@ refuse_invalid_slug() {
81
85
  }
82
86
 
83
87
  # ── locate targets ────────────────────────────────────────────────────────────────────────────
88
+ script_dir="$(cd "$(dirname "$0")" && pwd)"
84
89
  if [ "${#targets[@]}" -eq 0 ]; then
85
90
  command -v jq >/dev/null 2>&1 || note "jq-absent"
86
91
 
87
- script_dir="$(cd "$(dirname "$0")" && pwd)"
88
92
  RESOLVER="$script_dir/do-paths.sh"
89
93
  [ -f "$RESOLVER" ] || RESOLVER="${DOFLOW_CONFIG_DIR:+$DOFLOW_CONFIG_DIR/scripts/doflow/bash/do-paths.sh}"
90
94
  [ -f "$RESOLVER" ] || note "resolver-absent"
@@ -95,7 +99,9 @@ if [ "${#targets[@]}" -eq 0 ]; then
95
99
  [ "$rc" -eq 2 ] && refuse_invalid_slug "$json"
96
100
  [ "$rc" -eq 0 ] || note "resolver-error"
97
101
 
98
- root=$(printf '%s' "$json" | jq -r '.repo_root // empty')
102
+ # The feature folder's checkout: a linked worktree that has not yet got the folder reads it from
103
+ # main. Resolvers from before feature_root exist carry only repo_root, which is then the answer.
104
+ root=$(printf '%s' "$json" | jq -r '.feature_root // .repo_root // empty')
99
105
  [ -n "$(printf '%s' "$json" | jq -r '.feature_slug // empty')" ] || note "no-active-feature"
100
106
 
101
107
  # data-model.md is a default target only for a feature that has a decision register, so a folder
@@ -110,7 +116,6 @@ if [ "${#targets[@]}" -eq 0 ]; then
110
116
  elif command -v jq >/dev/null 2>&1; then
111
117
  # Explicit paths skip discovery, but the stale rule still needs the feature's register. Resolve
112
118
  # quietly: any failure here only leaves the rule inert, never changes what was asked for.
113
- script_dir="$(cd "$(dirname "$0")" && pwd)"
114
119
  RESOLVER="$script_dir/do-paths.sh"
115
120
  [ -f "$RESOLVER" ] || RESOLVER="${DOFLOW_CONFIG_DIR:+$DOFLOW_CONFIG_DIR/scripts/doflow/bash/do-paths.sh}"
116
121
  json=""
@@ -121,7 +126,7 @@ elif command -v jq >/dev/null 2>&1; then
121
126
  [ "$rc" -eq 2 ] && refuse_invalid_slug "$json"
122
127
  [ "$rc" -eq 0 ] || json=""
123
128
  fi
124
- root=$(printf '%s' "$json" | jq -r '.repo_root // empty' 2>/dev/null)
129
+ root=$(printf '%s' "$json" | jq -r '.feature_root // .repo_root // empty' 2>/dev/null)
125
130
  fi
126
131
 
127
132
  # ── decision register (stale rule) ──────────────────────────────────────────────────────────────
@@ -155,6 +160,41 @@ if [ -n "$feat_abs" ] && [ "$(printf '%s' "$json" | jq -r '.has_decisions // fal
155
160
  fi
156
161
  fi
157
162
 
163
+ # ── task-graph rule ───────────────────────────────────────────────────────────────────────────
164
+ # Asks the plan-check verb about one plan.md and leaves its problems in tg_out as
165
+ # `rule<TAB>id<TAB>message` records, the shape awk's finding() prints. It sets a global rather than
166
+ # printing, so the once-per-run note flag survives the call. A plan-check that cannot answer adds
167
+ # no finding: it prints one `note:` line per run on stderr instead. `plan-unreadable` adds nothing
168
+ # either; the unreadable-file finding already says the file was not checked.
169
+ tg_noted=0
170
+ tg_note() {
171
+ [ "$tg_noted" -eq 1 ] && return 0
172
+ tg_noted=1
173
+ printf 'note: plan-check unavailable (%s); the task-graph rule did not run\n' "$1" >&2
174
+ }
175
+ tg_out=""
176
+ task_graph_findings() { # task_graph_findings <plan file>
177
+ local dispatcher="$script_dir/../bin/doflow-run" tg
178
+ tg_out=""
179
+ command -v jq >/dev/null 2>&1 || { tg_note "jq-absent"; return 0; }
180
+ [ -f "$dispatcher" ] || { tg_note "dispatcher-absent"; return 0; }
181
+ tg=$(bash "$dispatcher" plan-check "$1" --json </dev/null 2>/dev/null)
182
+ if ! printf '%s' "$tg" | jq -e 'type == "object" and has("ok")' >/dev/null 2>&1; then
183
+ tg_note "no-json-from-plan-check"; return 0
184
+ fi
185
+ [ "$(printf '%s' "$tg" | jq -r '.error // empty')" = "plan-unreadable" ] && return 0
186
+ # jq prints `id<TAB>message`; awk adds the rule through the same finding() shape the checks use.
187
+ tg_out=$(printf '%s' "$tg" | jq -r '
188
+ .problems[]?
189
+ | [(if (.ids // [] | length) > 0 then (.ids | join(",")) else "-" end),
190
+ (.kind
191
+ + (if has("value") then " '"'"'" + (.value | tostring) + "'"'"'"
192
+ elif (.via // [] | length) > 0 then " via " + (.via | join(", "))
193
+ else "" end))]
194
+ | map(gsub("[\t\r\n]"; " ")) | join("\t")' 2>/dev/null \
195
+ | awk -F'\t' 'function finding(rule, id, msg) { print rule "\t" id "\t" msg } { finding("task-graph", $1, $2) }') || tg_out=""
196
+ }
197
+
158
198
  # ── check each target ─────────────────────────────────────────────────────────────────────────
159
199
  # Findings accumulate as: <file>\t<rule>\t<id>\t<message>
160
200
  findings=""
@@ -481,6 +521,10 @@ for f in "${targets[@]}"; do
481
521
  findings="${findings}${f}"$'\t'"io"$'\t'"-"$'\t'"could not be parsed (awk exit ${awk_status}) — this file was NOT checked"$'\n'
482
522
  continue
483
523
  fi
524
+ if [ "$(basename "$f")" = "plan.md" ]; then
525
+ task_graph_findings "$f"
526
+ [ -n "$tg_out" ] && out="${out:+$out$'\n'}$tg_out"
527
+ fi
484
528
  if [ -n "$out" ]; then
485
529
  while IFS= read -r line; do
486
530
  [ -n "$line" ] && findings="${findings}${f}"$'\t'"${line}"$'\n'