@khoavu882/doflow 2.0.0-beta.5 → 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 (471) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  3. package/core/.antigravity-plugin/plugin.json +1 -2
  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/permission-audit.sh +3 -0
  9. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  10. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  11. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  12. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  13. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  14. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  15. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  16. package/core/harnesses/claude/settings/settings.json +18 -0
  17. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  18. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  19. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  20. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  21. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  22. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  23. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  24. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  25. package/core/harnesses/codex/hooks/lib.sh +44 -25
  26. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  27. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  28. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  29. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  30. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  31. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  32. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  33. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  34. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  35. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  36. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  39. package/core/harnesses/kiro/agents/doflow.json +1 -1
  40. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  41. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
  42. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
  43. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
  44. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  45. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  46. package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
  47. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
  48. package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
  49. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  50. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  51. package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
  52. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  53. package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
  54. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  55. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  56. package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
  57. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  58. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  59. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  60. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  61. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  62. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
  63. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
  64. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
  65. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  66. package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
  67. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
  68. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  69. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  70. package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
  71. package/core/harnesses/shared/locator/doflow-run +2 -3
  72. package/core/registry/advice.json +3 -3
  73. package/core/registry/assets.json +55 -82
  74. package/core/registry/capabilities.json +12 -0
  75. package/core/registry/contracts.json +58 -31
  76. package/core/registry/contribution-points.json +32 -0
  77. package/core/registry/gates.json +32 -0
  78. package/core/registry/guidance-caps.json +40 -0
  79. package/core/registry/harnesses.json +1442 -363
  80. package/core/registry/lifecycle.json +485 -304
  81. package/core/registry/mcp.json +5 -1
  82. package/core/registry/models.json +7 -1
  83. package/core/registry/package-templates/README.md +19 -0
  84. package/core/registry/package-templates/agent/files/agent.md +9 -0
  85. package/core/registry/package-templates/agent/template.json +4 -0
  86. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  87. package/core/registry/package-templates/capability-provider/template.json +11 -0
  88. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  89. package/core/registry/package-templates/debate-preset/template.json +4 -0
  90. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  91. package/core/registry/package-templates/review-preset/template.json +4 -0
  92. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  93. package/core/registry/package-templates/skill/template.json +4 -0
  94. package/core/registry/package-templates/worker/files/worker.json +92 -0
  95. package/core/registry/package-templates/worker/template.json +11 -0
  96. package/core/registry/packages/doflow/doflow-package.json +15 -0
  97. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  98. package/core/registry/protocols.json +61 -0
  99. package/core/registry/routes.json +17 -0
  100. package/core/registry/rules.json +431 -0
  101. package/core/registry/settings.json +276 -0
  102. package/core/registry/storage.json +679 -31
  103. package/core/registry/telemetry.json +236 -0
  104. package/core/registry/transcripts.json +142 -0
  105. package/core/registry/verification.json +76 -1
  106. package/core/registry/workflows.json +55 -0
  107. package/core/shared/agent-specs/core-implementer.md +3 -0
  108. package/core/shared/agent-specs/delivery-lead.md +68 -0
  109. package/core/shared/agent-specs/quality-guardian.md +5 -1
  110. package/core/shared/agent-specs/research-writer.md +10 -3
  111. package/core/shared/agent-specs/reviewer.md +53 -0
  112. package/core/shared/agent-specs/spec-analyst.md +5 -6
  113. package/core/shared/agent-specs/system-architect.md +5 -1
  114. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  115. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  116. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  117. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  118. package/core/shared/guidance/pointers/codex.md +1 -4
  119. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  120. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  121. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  122. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  123. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  124. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  125. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  126. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  127. package/core/shared/guidance/rules/RULES.md +45 -0
  128. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  129. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  130. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  131. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  132. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  133. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  134. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  135. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  136. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  137. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  138. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  139. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  140. package/core/shared/scripts/doflow/bin/doflow-run +149 -34
  141. package/core/shared/skills/do/SKILL.md +12 -10
  142. package/core/shared/skills/do/references/advice_calls.md +26 -0
  143. package/core/shared/skills/do/references/pm_routing.md +1 -2
  144. package/core/shared/skills/do/references/program_mode.md +31 -0
  145. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  146. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  147. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  148. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  149. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  150. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  151. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  152. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  153. package/core/shared/skills/do-design/SKILL.md +18 -17
  154. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  155. package/core/shared/skills/do-document/SKILL.md +11 -1
  156. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  157. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  158. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  159. package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
  160. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  161. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  162. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  163. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  164. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  165. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  166. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  167. package/core/shared/skills/do-flow/SKILL.md +8 -9
  168. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  169. package/core/shared/skills/do-git/SKILL.md +4 -0
  170. package/core/shared/skills/do-implement/SKILL.md +4 -7
  171. package/core/shared/skills/do-plan/SKILL.md +26 -15
  172. package/core/shared/skills/do-test/SKILL.md +7 -4
  173. package/core/shared/templates/doflow/constitution-template.md +9 -3
  174. package/core/shared/templates/doflow/data-model-template.md +1 -1
  175. package/core/shared/templates/doflow/design-template.md +113 -16
  176. package/core/shared/templates/doflow/plan-template.md +11 -10
  177. package/core/shared/templates/doflow/question-log-template.md +14 -2
  178. package/core/shared/templates/doflow/requirement-template.md +1 -1
  179. package/core/worker-evidence/antigravity/checks.json +14 -0
  180. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  181. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  182. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  183. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  184. package/core/worker-evidence/codex/checks.json +38 -0
  185. package/package.json +10 -6
  186. package/src/adapters/antigravity/index.js +143 -66
  187. package/src/adapters/claude/index.js +24 -4
  188. package/src/adapters/codex/agents.js +25 -15
  189. package/src/adapters/codex/index.js +48 -13
  190. package/src/adapters/codex/native-projection.js +6 -2
  191. package/src/adapters/copilot/index.js +58 -23
  192. package/src/adapters/copy-tree.js +290 -44
  193. package/src/adapters/guidance-manifest.js +71 -0
  194. package/src/adapters/guidance-pointer.js +19 -0
  195. package/src/adapters/hook-commands.js +6 -10
  196. package/src/adapters/index.js +1 -0
  197. package/src/adapters/kiro/index.js +23 -12
  198. package/src/adapters/opencode/index.js +8 -8
  199. package/src/adapters/pi/hooks.js +2 -1
  200. package/src/adapters/pi/index.js +14 -7
  201. package/src/adapters/resolve-source.js +26 -2
  202. package/src/cli/commands/install.js +2 -1
  203. package/src/cli/commands/reconcile.js +53 -9
  204. package/src/cli/commands/remove.js +2 -2
  205. package/src/cli/commands/rollback.js +6 -3
  206. package/src/cli/commands/self-update.js +18 -9
  207. package/src/cli/commands/status.js +21 -2
  208. package/src/cli/commands/ui.js +99 -0
  209. package/src/cli/commands/update.js +2 -1
  210. package/src/cli/index.js +322 -29
  211. package/src/cli/runtime-commands.js +209 -57
  212. package/src/cli/shared.js +0 -2
  213. package/src/helper/git.js +1 -1
  214. package/src/helper/guardrails.js +1 -1
  215. package/src/helper/marker-merge.js +31 -13
  216. package/src/helper/package-ids.js +37 -0
  217. package/src/helper/semver.js +94 -0
  218. package/src/install/backup.js +105 -15
  219. package/src/install/context.js +1 -1
  220. package/src/install/targets.js +31 -16
  221. package/src/lifecycle/coverage.js +20 -3
  222. package/src/lifecycle/hook-tier.js +160 -0
  223. package/src/lifecycle/index.js +412 -78
  224. package/src/lifecycle/retired-harnesses.js +318 -0
  225. package/src/lifecycle/view.js +35 -15
  226. package/src/registry/index.js +551 -26
  227. package/src/registry/worker-ids.js +45 -0
  228. package/src/release/build-package.js +0 -3
  229. package/src/release/docs-blocks.js +492 -0
  230. package/src/release/preflight.js +425 -0
  231. package/src/release/rehearse.js +401 -0
  232. package/src/release/release-workflow.js +733 -0
  233. package/src/release/sync-plugin-versions.js +43 -7
  234. package/src/runtime/advice/bench-gate.js +25 -0
  235. package/src/runtime/advice/cli.js +59 -16
  236. package/src/runtime/advice/client.js +32 -9
  237. package/src/runtime/advice/config.js +98 -133
  238. package/src/runtime/advice/doctor.js +1 -1
  239. package/src/runtime/advice/elevation.js +97 -0
  240. package/src/runtime/advice/endpoint-guard.js +9 -3
  241. package/src/runtime/advice/mode.js +37 -0
  242. package/src/runtime/advice/record.js +18 -5
  243. package/src/runtime/advice/registry.js +4 -1
  244. package/src/runtime/advice/shadow-config.js +229 -0
  245. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  246. package/src/runtime/brief-rules.js +81 -0
  247. package/src/runtime/brief-tools.js +111 -34
  248. package/src/runtime/candidate.js +20 -11
  249. package/src/runtime/capabilities/executor.js +450 -0
  250. package/src/runtime/capabilities/loopback.js +41 -0
  251. package/src/runtime/capabilities/sanitizer.js +88 -0
  252. package/src/runtime/capability-router.js +135 -3
  253. package/src/runtime/checkouts.js +73 -11
  254. package/src/runtime/claims.js +13 -7
  255. package/src/runtime/cli.js +196 -19
  256. package/src/runtime/config-home.js +42 -0
  257. package/src/runtime/context/arbitrate.js +767 -0
  258. package/src/runtime/context/delivery-store.js +4 -6
  259. package/src/runtime/context/emission-rules.js +118 -0
  260. package/src/runtime/context/identity.js +227 -0
  261. package/src/runtime/context/primary-command.js +117 -0
  262. package/src/runtime/context/primary.js +344 -0
  263. package/src/runtime/context/summary-store.js +655 -0
  264. package/src/runtime/context-pack.js +154 -78
  265. package/src/runtime/decision-register.js +13 -4
  266. package/src/runtime/dispatch/admission.js +392 -0
  267. package/src/runtime/dispatch/attempt-end.js +274 -0
  268. package/src/runtime/dispatch/command.js +628 -0
  269. package/src/runtime/dispatch/controls.js +904 -0
  270. package/src/runtime/dispatch/envelope.js +276 -0
  271. package/src/runtime/dispatch/grants.js +310 -0
  272. package/src/runtime/dispatch/integrate.js +617 -0
  273. package/src/runtime/dispatch/loop.js +1835 -0
  274. package/src/runtime/dispatch/store.js +352 -0
  275. package/src/runtime/dispatch/verify-run.js +201 -0
  276. package/src/runtime/evidence-ledger.js +34 -7
  277. package/src/runtime/failure/capture.js +3 -1
  278. package/src/runtime/failure/cli.js +25 -9
  279. package/src/runtime/failure/home.js +57 -30
  280. package/src/runtime/failure/store.js +7 -2
  281. package/src/runtime/feature-pointer.js +174 -0
  282. package/src/runtime/feature-resolve.js +13 -2
  283. package/src/runtime/fleet/command.js +77 -0
  284. package/src/runtime/fleet/projects.js +178 -0
  285. package/src/runtime/fleet/tree.js +383 -0
  286. package/src/runtime/freshness.js +33 -3
  287. package/src/runtime/git-memo.js +46 -0
  288. package/src/runtime/guidance/ablation.js +427 -0
  289. package/src/runtime/health.js +565 -17
  290. package/src/runtime/history-compactor.js +13 -3
  291. package/src/runtime/implementation-gate.js +277 -22
  292. package/src/runtime/inventory/coverage.js +1 -1
  293. package/src/runtime/inventory/index.js +1 -1
  294. package/src/runtime/inventory/precedence.js +2 -2
  295. package/src/runtime/inventory/siblings.js +6 -4
  296. package/src/runtime/knowledge/code-corpus.js +277 -0
  297. package/src/runtime/knowledge/code-lexical.js +130 -0
  298. package/src/runtime/knowledge/code-retrieval.js +307 -0
  299. package/src/runtime/knowledge/code-validation.js +106 -0
  300. package/src/runtime/knowledge/gp3-gate.js +74 -0
  301. package/src/runtime/knowledge/graph-adapter.js +288 -0
  302. package/src/runtime/knowledge/graph-fallback.js +394 -0
  303. package/src/runtime/knowledge/hybrid.js +136 -8
  304. package/src/runtime/knowledge/retrieval.js +34 -1
  305. package/src/runtime/knowledge/rtk-compress.js +77 -0
  306. package/src/runtime/knowledge/semble-bridge.py +106 -0
  307. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  308. package/src/runtime/knowledge/semble-provider.js +365 -0
  309. package/src/runtime/lifecycle/cli.js +16 -6
  310. package/src/runtime/lifecycle/event-store.js +8 -6
  311. package/src/runtime/lifecycle/followup.js +6 -1
  312. package/src/runtime/lifecycle/overview.js +24 -1
  313. package/src/runtime/lifecycle/report-store.js +8 -10
  314. package/src/runtime/lifecycle/retention.js +95 -31
  315. package/src/runtime/lifecycle/root.js +9 -1
  316. package/src/runtime/lifecycle/status.js +34 -17
  317. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  318. package/src/runtime/mask.js +134 -7
  319. package/src/runtime/mcp-consultations.js +40 -6
  320. package/src/runtime/model-router.js +79 -7
  321. package/src/runtime/models/catalogue.js +191 -0
  322. package/src/runtime/models/command.js +153 -0
  323. package/src/runtime/off-words.js +12 -0
  324. package/src/runtime/outcome.js +2 -2
  325. package/src/runtime/packages/command.js +1009 -0
  326. package/src/runtime/packages/contributions.js +116 -0
  327. package/src/runtime/packages/digest.js +132 -0
  328. package/src/runtime/packages/fetch.js +182 -0
  329. package/src/runtime/packages/grants.js +192 -0
  330. package/src/runtime/packages/index-file.js +134 -0
  331. package/src/runtime/packages/instruction.js +90 -0
  332. package/src/runtime/packages/manifest.js +331 -0
  333. package/src/runtime/packages/points.js +477 -0
  334. package/src/runtime/packages/programs.js +216 -0
  335. package/src/runtime/packages/scaffold.js +277 -0
  336. package/src/runtime/packages/source.js +90 -0
  337. package/src/runtime/packages/state.js +164 -0
  338. package/src/runtime/packages/store.js +449 -0
  339. package/src/runtime/packages/tar.js +106 -0
  340. package/src/runtime/packages/view.js +406 -0
  341. package/src/runtime/plan-check.js +59 -0
  342. package/src/runtime/plan-content.js +324 -0
  343. package/src/runtime/policy-init.js +118 -0
  344. package/src/runtime/profiles/doctor.js +96 -0
  345. package/src/runtime/profiles/resolve.js +244 -0
  346. package/src/runtime/profiles/rollback.js +254 -0
  347. package/src/runtime/profiles/sampler.js +41 -0
  348. package/src/runtime/readiness-record.js +16 -11
  349. package/src/runtime/readiness.js +46 -5
  350. package/src/runtime/research-request.js +50 -25
  351. package/src/runtime/retrieval-plan.js +10 -30
  352. package/src/runtime/retrieval-record.js +75 -5
  353. package/src/runtime/review/command.js +246 -0
  354. package/src/runtime/review/dominance.js +68 -0
  355. package/src/runtime/review/findings.js +434 -0
  356. package/src/runtime/review/identity.js +255 -0
  357. package/src/runtime/review/protocol-command.js +109 -0
  358. package/src/runtime/review/protocols.js +405 -0
  359. package/src/runtime/review/resolve-protocol.js +302 -0
  360. package/src/runtime/review/start.js +530 -0
  361. package/src/runtime/roadmap/facts.js +479 -0
  362. package/src/runtime/roadmap/gates.js +270 -0
  363. package/src/runtime/roadmap/loop.js +1636 -0
  364. package/src/runtime/roadmap/merge.js +381 -0
  365. package/src/runtime/roadmap/rows.js +1113 -0
  366. package/src/runtime/roadmap/seed.js +951 -0
  367. package/src/runtime/rules-report.js +336 -0
  368. package/src/runtime/scaffold/artifacts.js +60 -9
  369. package/src/runtime/scaffold/generate.js +21 -9
  370. package/src/runtime/settings/autopilot.js +106 -0
  371. package/src/runtime/settings/cli.js +280 -0
  372. package/src/runtime/settings/config-write.js +314 -0
  373. package/src/runtime/settings/files.js +271 -0
  374. package/src/runtime/settings/legacy.js +154 -0
  375. package/src/runtime/settings/lexical.js +56 -0
  376. package/src/runtime/settings/prepared-run.js +269 -0
  377. package/src/runtime/settings/project-layers.js +118 -0
  378. package/src/runtime/settings/refs.js +288 -0
  379. package/src/runtime/settings/registry.js +553 -0
  380. package/src/runtime/settings/resolve.js +713 -0
  381. package/src/runtime/settings/shared.js +37 -0
  382. package/src/runtime/settings/worker-billing.js +107 -0
  383. package/src/runtime/settings/write.js +269 -0
  384. package/src/runtime/slot-command.js +78 -0
  385. package/src/runtime/slots.js +671 -0
  386. package/src/runtime/source-version.js +1 -0
  387. package/src/runtime/state-root.js +217 -0
  388. package/src/runtime/storage/cli.js +12 -5
  389. package/src/runtime/storage/engine.js +9 -2
  390. package/src/runtime/storage/registry.js +14 -1
  391. package/src/runtime/storage/roots.js +66 -16
  392. package/src/runtime/storage/rules.js +82 -10
  393. package/src/runtime/storage/upkeep.js +10 -2
  394. package/src/runtime/storage/work-status.js +245 -26
  395. package/src/runtime/task-attempts.js +589 -69
  396. package/src/runtime/task-classifier.js +47 -11
  397. package/src/runtime/task-graph.js +373 -0
  398. package/src/runtime/task-run.js +778 -0
  399. package/src/runtime/task-scope.js +176 -55
  400. package/src/runtime/task-sources.js +147 -0
  401. package/src/runtime/task-state.js +374 -64
  402. package/src/runtime/team/admission.js +301 -0
  403. package/src/runtime/team/envelope.js +324 -0
  404. package/src/runtime/team/review-guard.js +156 -0
  405. package/src/runtime/trace/analyze.js +427 -0
  406. package/src/runtime/trace/baseline.js +770 -0
  407. package/src/runtime/trace/ledger.js +63 -140
  408. package/src/runtime/trace/otlp-export.js +568 -0
  409. package/src/runtime/trace/otlp-map.js +481 -0
  410. package/src/runtime/trace/spans.js +745 -0
  411. package/src/runtime/trace/telemetry.js +225 -0
  412. package/src/runtime/trace/views.js +1 -0
  413. package/src/runtime/transcripts/command.js +98 -0
  414. package/src/runtime/transcripts/cursor.js +326 -0
  415. package/src/runtime/transcripts/read.js +126 -0
  416. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  417. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  418. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  419. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  420. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  421. package/src/runtime/transcripts/registry.js +161 -0
  422. package/src/runtime/transcripts/stats.js +161 -0
  423. package/src/runtime/verification/check-key.js +628 -0
  424. package/src/runtime/verification/contract-runner.js +546 -11
  425. package/src/runtime/verification/engine.js +499 -9
  426. package/src/runtime/verification/impact.js +617 -0
  427. package/src/runtime/verification/inflight.js +205 -0
  428. package/src/runtime/verification/registry.js +176 -0
  429. package/src/runtime/verification/reuse.js +184 -0
  430. package/src/runtime/verification/telemetry-emit.js +254 -0
  431. package/src/runtime/verification/test-selection.js +67 -7
  432. package/src/runtime/worker/active.js +90 -0
  433. package/src/runtime/worker/cancel.js +222 -0
  434. package/src/runtime/worker/catalogue.js +122 -0
  435. package/src/runtime/worker/command.js +677 -0
  436. package/src/runtime/worker/evidence.js +288 -0
  437. package/src/runtime/worker/launch.js +288 -0
  438. package/src/runtime/worker/models.js +137 -0
  439. package/src/runtime/worker/parsers.js +218 -0
  440. package/src/runtime/worker/probes/index.js +706 -0
  441. package/src/runtime/worker/process-tree.js +415 -0
  442. package/src/runtime/worker/quota.js +43 -0
  443. package/src/runtime/worker/readiness.js +713 -0
  444. package/src/runtime/worker/run-store.js +166 -0
  445. package/src/runtime/worker/supervisor.js +541 -0
  446. package/src/runtime/worker/worktree-check.js +252 -0
  447. package/src/runtime/workflow-engine.js +5 -1
  448. package/src/runtime/workflow-orchestrator.js +578 -63
  449. package/src/runtime/worktree.js +149 -22
  450. package/src/state/index.js +1 -1
  451. package/src/state/lockfile.js +64 -10
  452. package/src/state/run-lock.js +1 -1
  453. package/types/node-commonjs.d.ts +106 -7
  454. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  455. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  456. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  457. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  458. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  459. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  460. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  461. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  462. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  463. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  464. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  465. package/core/shared/guidance/FLAGS.md +0 -25
  466. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  467. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  468. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  469. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  470. package/src/adapters/gemini/hooks.js +0 -251
  471. package/src/adapters/gemini/index.js +0 -429
package/README.md CHANGED
@@ -1,14 +1,13 @@
1
1
  # DoFlow
2
2
 
3
- DoFlow is a configuration layer for AI coding tools. It gives Claude Code, Codex, Gemini /
4
- Antigravity, OpenCode, Pi, GitHub Copilot CLI, and Kiro a shared set of engineering rules, reusable
5
- workflows, and safer defaults — projected from one source, so the eight never drift apart.
3
+ DoFlow is a configuration layer for AI coding tools. It gives Claude Code, Codex, Antigravity,
4
+ OpenCode, Pi, GitHub Copilot CLI, and Kiro a shared set of engineering rules, reusable
5
+ workflows, and safer defaults — projected from one source, so the seven never drift apart.
6
6
 
7
7
  ```mermaid
8
8
  flowchart LR
9
9
  R[One DoFlow source] --> C[Claude Code]
10
10
  R --> X[Codex]
11
- R --> G[Gemini CLI]
12
11
  R --> O[OpenCode]
13
12
  R --> P[Pi]
14
13
  R --> CP[Copilot CLI]
@@ -16,7 +15,6 @@ flowchart LR
16
15
  R --> A[Antigravity CLI]
17
16
  C --> H[Hooks + MCP + skills]
18
17
  X --> S[AGENTS.md + skills]
19
- G --> GM[GEMINI.md + skills]
20
18
  A --> AG[AGENTS.md + .agents tree]
21
19
  O --> S
22
20
  P --> S
@@ -29,7 +27,7 @@ flowchart LR
29
27
  | Need | DoFlow component |
30
28
  |---|---|
31
29
  | Repeatable delivery work | 13 skills, including `/do-brainstorm`, `/do-plan`, `/do-test`, and `/do-code-review` |
32
- | Specialist review | 5 agents — `spec-analyst`, `system-architect`, `core-implementer`, `quality-guardian`, `research-writer` |
30
+ | Specialist review | 7 agents — `spec-analyst`, `system-architect`, `delivery-lead`, `core-implementer`, `quality-guardian`, `reviewer`, `research-writer` |
33
31
  | Safer automation | Claude hooks block destructive commands and unfinished implementation stubs |
34
32
  | Shared standards | Rules for safety, workflow, quality, and clarification across supported tools |
35
33
  | Session continuity | Claude and Codex hooks capture lightweight Git context and compact-session summaries and deliver them on a session's first prompt |
@@ -38,7 +36,7 @@ flowchart LR
38
36
 
39
37
  1. **New to DoFlow?** Follow the [Quickstart](docs/quickstart.md).
40
38
  2. **Need installation, updates, or rollback?** Use the [Setup guide](docs/setup.md).
41
- 3. **Want to understand the moving parts?** Read the visual [Overview](docs/overview.md).
39
+ 3. **Want to understand the moving parts?** Read the visual [Overview](docs/index.md#the-component-model).
42
40
  4. **Ready to work?** Pick a task pattern from the [Guide](docs/guide.md).
43
41
  5. **Looking up a command or capability?** Open the [Reference](docs/reference.md).
44
42
 
@@ -111,16 +109,19 @@ Use `/do-flow "add a customer export"` to run the same sequence with its approva
111
109
  |---|---|
112
110
  | Claude Code | Full integration: skills, agents, hooks, MCP registration, session context, and rules |
113
111
  | Codex | `AGENTS.md`, skills at `.agents/skills/`, scripts, templates, rules, agents, hooks, and references |
114
- | Gemini CLI | `GEMINI.md`, rules, agents, modes, skills, hooks, and references |
115
- | Antigravity CLI (`agy`) | Managed `AGENTS.md` section (project), skills at `.agents/skills/`, shared agents, workspace rules at `.agents/rules/`, the spec-driven chain workflow shim, the pre-implementation-gate hook (`.agents/hooks.json`), and MCP in `.agents/mcp_config.json` / `~/.gemini/config/mcp_config.json` |
112
+ | Antigravity CLI (`agy`) | Managed `AGENTS.md` section (project), skills at `.agents/skills/`, shared agents, workspace rules at `.agents/rules/`, the spec-driven chain workflow shim, the pre-implementation-gate hook (`.agents/hooks.json`), and MCP in `.agents/mcp_config.json` / `~/.gemini/config/mcp_config.json`, and a managed guidance section in the global `~/.gemini/GEMINI.md` |
116
113
  | OpenCode | `AGENTS.md`, skills discovered at `.opencode/skills/` (project) or `~/.config/opencode/skills/` (global), and `opencode.json` configuration |
117
114
  | Pi Coding Agent | `AGENTS.md`, skills discovered at `.pi/skills/` (project) or `~/.pi/agent/skills/` (global), and MCP servers in `.pi/mcp.json` (project) or `~/.pi/agent/mcp.json` (global) |
118
115
  | GitHub Copilot CLI | `.github/copilot-instructions.md` (project scope only), skills at `.agents/skills/`, agents at `.github/agents/`, and MCP registered in `.mcp.json` |
119
116
  | Kiro | Steering files under `.kiro/steering/`, skills at `.kiro/skills/`, agents at `.kiro/agents/`, hooks at `.kiro/hooks/`, and MCP registered in `.kiro/settings/mcp.json` |
120
117
 
118
+ Content (guidance, skills, agents, MCP) goes to every harness; DoFlow's hooks, gates and bridge go
119
+ only to the harnesses the user-layer setting `hooks.harnesses` names (default `claude`, `codex`,
120
+ `antigravity`, `pi`). A harness outside the list gets content only, and the next install or update
121
+ removes the DoFlow hooks an earlier run wrote for it; an install or update warns when Claude or a
122
+ worker named in `workers.enabled` is left out. Add `kiro` to that list for its hooks.
121
123
  Codex hooks are installed as `hooks.json` but require review/trust in Codex before they run.
122
- Gemini hooks merge into a `hooks` key inside `settings.json` (never a full-file replace) and are
123
- similarly subject to Gemini's own hook trust/review gating. Kiro's hooks are not in Kiro v3's
124
+ Kiro's hooks are not in Kiro v3's
124
125
  untrusted-workspace exclusion list; an untrusted workspace asks before every shell command, and
125
126
  whether that covers hook commands is undocumented. Copilot CLI documents hooks, settings, and a
126
127
  plugin marketplace upstream; DoFlow still installs none of those there. OpenCode and Pi
package/bin/doflow.js CHANGED
@@ -5,24 +5,34 @@
5
5
  // so the `doflow` binary path and the doflow-run dispatcher seam
6
6
  // (core/shared/scripts/doflow/bin/doflow-run, which execs `node <repoRoot>/bin/doflow.js`)
7
7
  // keep resolving to this exact location.
8
- // Refuse clearly on a Node that cannot strip types: src/ is TypeScript, and without stripping
9
- // loading a .ts module dies with a SyntaxError on the first annotation. Stripping is on by
10
- // default from Node 22.18.0 / 23.6.0 and off under --no-experimental-strip-types; the range stops at
11
- // 24.3.0 because 23.6 to 24.2 print an ExperimentalWarning on every .ts load. This file stays
12
- // plain JavaScript so it can say so. Exit 2 is the doflow-run usage/resolution-error code.
8
+ // Refuse clearly on a Node below the floor, or one that cannot strip types: src/ is TypeScript, and
9
+ // without stripping loading a .ts module dies with a SyntaxError on the first annotation. The floor
10
+ // is 24.22.1, the 2026-10-21 security release of the Node 24 line (engines.node in package.json is
11
+ // the same value); stripping is on by default from there and off only under
12
+ // --no-experimental-strip-types. This file stays plain JavaScript so it can say so. Exit 2 is the
13
+ // doflow-run usage/resolution-error code.
14
+ const NODE_FLOOR_VERSION = '24.22.1';
15
+ const NODE_FLOOR = `>=${NODE_FLOOR_VERSION}`;
16
+ // A prerelease of the floor version (24.22.1-rc.1) sorts below it, as in semver; any other
17
+ // prerelease suffix is ignored, so 24.22.2-rc.1 and 24.23.0-rc.1 both pass.
18
+ const running = /^(\d+)\.(\d+)\.(\d+)(-.*)?$/.exec(String(process.versions.node)) || [];
19
+ const order = NODE_FLOOR_VERSION.split('.').reduce((result, part, i) => result || Math.sign(Number(running[i + 1] || 0) - Number(part)), 0);
20
+ const belowFloor = order < 0 || (order === 0 && Boolean(running[4]));
21
+ if (belowFloor) {
22
+ process.stderr.write(`doflow: Node ${process.versions.node} is not supported; doflow needs Node ${NODE_FLOOR} (Node 22 and Node 24 before ${NODE_FLOOR_VERSION} are no longer supported).\n`);
23
+ process.exit(2);
24
+ }
13
25
  if (!process.features || !process.features.typescript) {
14
- process.stderr.write(`doflow: Node ${process.versions.node} cannot strip TypeScript types; doflow needs Node ^22.18.0 || >=24.3.0 with type-stripping enabled (it is off under --no-experimental-strip-types, including via NODE_OPTIONS).\n`);
26
+ process.stderr.write(`doflow: Node ${process.versions.node} cannot strip TypeScript types; doflow needs Node ${NODE_FLOOR} with type-stripping enabled (it is off under --no-experimental-strip-types, including via NODE_OPTIONS).\n`);
15
27
  process.exit(2);
16
28
  }
17
29
  // Enable Node's module compile cache before any ../src require. Type stripping makes the first load
18
30
  // of each .ts module cost a transform; the cache turns that into a one-time cost per Node version
19
31
  // and file content. Called without options so an explicit NODE_COMPILE_CACHE directory is honoured
20
- // and NODE_DISABLE_COMPILE_CACHE still disables it. Best-effort: where the API is missing (older
21
- // Node) or throws, the CLI runs at today's speed.
32
+ // and NODE_DISABLE_COMPILE_CACHE still disables it. Best-effort: if it throws, the CLI runs at
33
+ // today's speed.
22
34
  const nodeModule = require('node:module');
23
- if (typeof nodeModule.enableCompileCache === 'function') {
24
- try { nodeModule.enableCompileCache(); } catch { /* best-effort */ }
25
- }
35
+ try { nodeModule.enableCompileCache(); } catch { /* best-effort */ }
26
36
  // Record an error that escapes everything, including one thrown while the CLI loads (a half-updated
27
37
  // install), before it is loaded (IC-016). The monitor only observes: Node's own crash output and
28
38
  // exit status are unchanged, and a monitor that threw would change that status to 7, hence the
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "doflow",
3
3
  "version": "1.0.0",
4
- "description": "Spec-driven engineering workflow engine, quality gates, and specialist agent personas for Google Antigravity and Gemini.",
4
+ "description": "Spec-driven engineering workflow engine, quality gates, and specialist agent personas for Google Antigravity.",
5
5
  "author": {
6
6
  "name": "DoFlow",
7
7
  "url": "https://github.com/khoavu882/do-flow"
@@ -11,7 +11,6 @@
11
11
  "license": "MIT",
12
12
  "keywords": [
13
13
  "antigravity",
14
- "gemini",
15
14
  "engineering",
16
15
  "workflows",
17
16
  "quality-gates",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doflow",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0",
4
4
  "description": "Reusable engineering workflows, quality gates, and specialist guidance for Claude Code.",
5
5
  "author": {
6
6
  "name": "DoFlow"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doflow",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0",
4
4
  "description": "Reusable engineering workflows, quality gates, and specialist guidance for Codex.",
5
5
  "author": {
6
6
  "name": "DoFlow",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doflow",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0",
4
4
  "description": "Reusable engineering workflows, quality gates, and specialist guidance for GitHub Copilot CLI.",
5
5
  "author": {
6
6
  "name": "DoFlow",
@@ -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
  # lib.sh — shared constants and helpers for session lifecycle hooks
3
4
  #
4
5
  # Usage: source "$(dirname "$0")/lib.sh"
@@ -17,13 +18,30 @@ set -euo pipefail
17
18
 
18
19
  # ── State directories ────────────────────────────────────────────────────────
19
20
 
20
- # XDG-compliant, agent-agnostic store shared by Claude Code, Codex, Gemini, etc.
21
- DOFLOW_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/doflow"
22
- STATE_DIR="$DOFLOW_HOME/session-env"
23
- SESSION_DIR="$STATE_DIR/sessions"
24
- PROJECTS_DIR="$STATE_DIR/projects"
21
+ # XDG-compliant, agent-agnostic store shared by every harness DoFlow supports, under the config home
22
+ # (doflow_config_home: an absolute XDG_CONFIG_HOME, else an absolute HOME + /.config, else none). With
23
+ # no config home every state path below is empty, sourcing this file still never exits, and each state
24
+ # function returns 0 at once: session work is skipped and a guard reaches its own decision (086 IC-010).
25
+ # BEGIN doflow-config-home v1 (rule: src/runtime/config-home.js; checked by test/guards/settings.test.js)
26
+ doflow_config_home() {
27
+ DOFLOW_HOME=""
28
+ case "${XDG_CONFIG_HOME:-}" in
29
+ /*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;;
30
+ [A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;; esac ;;
31
+ esac
32
+ case "${HOME:-}" in
33
+ /*) DOFLOW_HOME="${HOME}/.config/doflow" ;;
34
+ [A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${HOME}/.config/doflow" ;; esac ;;
35
+ esac
36
+ return 0
37
+ }
38
+ # END doflow-config-home v1
39
+ doflow_config_home
40
+ STATE_DIR="${DOFLOW_HOME:+$DOFLOW_HOME/session-env}"
41
+ SESSION_DIR="${STATE_DIR:+$STATE_DIR/sessions}"
42
+ PROJECTS_DIR="${STATE_DIR:+$STATE_DIR/projects}"
25
43
  # shellcheck disable=SC2034 # used by session-start.sh and session-end.sh which source this file
26
- SESSIONS_LOG="$DOFLOW_HOME/sessions.log"
44
+ SESSIONS_LOG="${DOFLOW_HOME:+$DOFLOW_HOME/sessions.log}"
27
45
 
28
46
  # Identifies which agent is running. Override via env var for non-Claude agents.
29
47
  export DOFLOW_AGENT="${DOFLOW_AGENT:-claude-code}"
@@ -247,6 +265,7 @@ has_uncommitted_changes() {
247
265
  # Safe to call multiple times (mkdir -p is idempotent).
248
266
  ensure_session_dir() {
249
267
  local session_id="$1"
268
+ [ -n "$SESSION_DIR" ] || return 0
250
269
  mkdir -p "$SESSION_DIR/$session_id"
251
270
  echo "$SESSION_DIR/$session_id"
252
271
  }
@@ -256,6 +275,7 @@ ensure_session_dir() {
256
275
  ensure_project_dir() {
257
276
  local cwd="$1"
258
277
  local hash
278
+ [ -n "$PROJECTS_DIR" ] || return 0
259
279
  hash=$(cwd_hash "$cwd")
260
280
  mkdir -p "$PROJECTS_DIR/$hash"
261
281
  echo "$PROJECTS_DIR/$hash"
@@ -283,22 +303,21 @@ require_jq() {
283
303
  fi
284
304
  }
285
305
 
286
- # ── Session role ──────────────────────────────────────────────────────────────
306
+ # ── Session role and identity ─────────────────────────────────────────────────
287
307
 
288
- # Print `main` or `worker` for this session, read from DOFLOW_SESSION_ROLE (matched
289
- # case-insensitively). Unset or empty is `main`; a value that is neither `main` nor
290
- # `worker` is `worker` and writes one line to stderr. A worker never writes or claims the
291
- # project's compact summary or warning. Always returns 0. bash 3.2 safe (no ${var,,}).
292
- doflow_session_role() {
293
- local role
294
- role=$(printf '%s' "${DOFLOW_SESSION_ROLE:-}" | tr '[:upper:]' '[:lower:]') || role=""
295
- case "$role" in
296
- ""|main) printf 'main\n' ;;
297
- worker) printf 'worker\n' ;;
298
- *)
299
- echo "[doflow] unknown DOFLOW_SESSION_ROLE; treating session as worker" >&2
300
- printf 'worker\n'
301
- ;;
302
- esac
303
- return 0
304
- }
308
+ # doflow_session_role comes from the shared identity.sh, its only definition (IC-009). When an
309
+ # install lacks that file, the session is a worker and the broken install is captured as
310
+ # identity-missing: a worker writes and claims nothing, so a broken install cannot leak context.
311
+ if [ -f "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh" ]; then
312
+ . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh"
313
+ else
314
+ doflow_session_role() {
315
+ local policy="${0##*/}"
316
+ policy="${policy%.sh}"
317
+ policy="${policy%.impl}"
318
+ ( . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/capture-failure.sh" \
319
+ && doflow_capture_failure "$policy" identity-missing ) >/dev/null 2>&1 || true
320
+ printf 'worker\n'
321
+ return 0
322
+ }
323
+ 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
  # permission-audit.sh — PermissionDenied hook (pure observability, no deny path)
3
4
  #
4
5
  # The decision has already been made by the time this fires; there is nothing to
@@ -27,6 +28,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
27
28
 
28
29
  # Guard: if we can't determine the session, nothing to do
29
30
  [[ -z "$SESSION_ID" ]] && exit 0
31
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
32
+ [[ -n "$SESSION_DIR" ]] || exit 0
30
33
 
31
34
  EVENT=$(json_field "$INPUT" ".hook_event_name")
32
35
  TOOL_NAME=$(json_field "$INPUT" ".tool_name")
@@ -1,12 +1,15 @@
1
1
  #!/usr/bin/env bash
2
- # post-compact.sh — PostCompact hook
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
3
+ # post-compact.sh — PostCompact hook (IC-011)
3
4
  #
4
- # Saves the AI-generated compact_summary (from stdin JSON) to a project-scoped
5
- # file. user-prompt-submit.sh reads and injects it directly on the next session's
6
- # first prompt — no manual restore command required.
5
+ # Records the AI-generated compact_summary (from stdin JSON) in the summary scope of the session
6
+ # that produced it: summaries/<worktreeKey>/<run>/<lineage>/summary.md, through
7
+ # doflow_summary_write. Rule compact-store.summary decides whether this session records at all (a
8
+ # `solo` lineage records nothing, DEC-013); rule compact-meta.meta decides whether meta.json's
9
+ # compacted_at is updated (the default main lineage only). The retired project-level summary file
10
+ # is never written.
7
11
  #
8
- # Atomic write: mktemp → populate → mv ensures readers never see partial content.
9
- # Multi-session safe: project directory is keyed by cwd hash, not session_id.
12
+ # Atomic write: the store writes a .summary.XXXXXX temp file in the scope, then renames it.
10
13
  # Must complete in <200ms. Must never exit non-zero or block.
11
14
 
12
15
  set -euo pipefail
@@ -16,11 +19,6 @@ require_jq
16
19
 
17
20
  INPUT=$(cat)
18
21
 
19
- # A worker session never writes the project's summary or metadata: they belong to the main session.
20
- if [[ "$(doflow_session_role || echo main)" == "worker" ]]; then
21
- exit 0
22
- fi
23
-
24
22
  SESSION_ID=$(json_field "$INPUT" ".session_id")
25
23
  CWD=$(json_field "$INPUT" ".cwd")
26
24
  TRIGGER=$(json_field "$INPUT" ".trigger")
@@ -33,34 +31,39 @@ COMPACT_SUMMARY=$(json_field "$INPUT" ".compact_summary")
33
31
  # injected as empty context on the next session's first prompt — useless noise, skip it.
34
32
  [[ -z "$COMPACT_SUMMARY" ]] && exit 0
35
33
 
36
- PROJECT_DIR=$(ensure_project_dir "$CWD")
34
+ # The identity, the rule table and the store come from the Canonical Policy Library. An install
35
+ # missing any of them records nothing: a broken install cannot write a summary to the wrong scope.
36
+ POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
37
+ declare -F doflow_identity >/dev/null 2>&1 || exit 0
38
+ [[ -f "$POLICIES/emission-rules.sh" && -f "$POLICIES/summary-store.sh" ]] || exit 0
39
+ # shellcheck source=/dev/null
40
+ . "$POLICIES/emission-rules.sh"
41
+ # shellcheck source=/dev/null
42
+ . "$POLICIES/summary-store.sh"
43
+
44
+ doflow_identity "$SESSION_ID" "$CWD"
45
+
46
+ DF_ACTION=skip
47
+ doflow_emission_rule compact-store.summary "$DF_ID_ROLE:$DF_ID_KIND"
48
+ [[ "$DF_ACTION" == write ]] || exit 0
37
49
 
38
50
  # Read current branch for frontmatter metadata (best-effort, empty is fine)
39
51
  BRANCH=$(run_with_timeout 5 -- git -C "$CWD" branch --show-current 2>/dev/null || echo "")
40
52
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
41
53
 
42
- # Single cleanup function covers both temp files — a second trap() call would
43
- # silently replace the first, leaving the earlier temp file unguarded on failure.
44
- TMP=""
45
- META_TMP=""
46
- _cleanup() { rm -f "$TMP" "$META_TMP" 2>/dev/null || true; }
47
- trap _cleanup EXIT
54
+ doflow_summary_write "$DF_ID_WORKTREE" "$DF_ID_RUN" "$DF_ID_LINEAGE" "${DF_ID_ATTEMPT:-}" \
55
+ "$TIMESTAMP" "$SESSION_ID" "$TRIGGER" "$BRANCH" "$DF_ID_ROLE" "$COMPACT_SUMMARY" || exit 0
48
56
 
49
- # Atomic write: write to a temp file then rename.
50
- TMP=$(mktemp "$PROJECT_DIR/.last-compact-summary.XXXXXX")
51
- cat > "$TMP" <<EOF
52
- ---
53
- compacted_at: ${TIMESTAMP}
54
- session_id: ${SESSION_ID:-unknown}
55
- trigger: ${TRIGGER:-unknown}
56
- branch: ${BRANCH:-unknown}
57
- role: main
58
- ---
57
+ DF_ACTION=skip
58
+ doflow_emission_rule compact-meta.meta "$DF_ID_ROLE:$DF_ID_KIND"
59
+ [[ "$DF_ACTION" == write ]] || exit 0
59
60
 
60
- ${COMPACT_SUMMARY}
61
- EOF
62
- mv "$TMP" "$PROJECT_DIR/last-compact-summary.md"
63
- TMP="" # already moved; _cleanup should not attempt to rm it
61
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
62
+ [[ -n "$PROJECTS_DIR" ]] || exit 0
63
+ PROJECT_DIR=$(ensure_project_dir "$CWD")
64
+ META_TMP=""
65
+ _cleanup() { rm -f "$META_TMP" 2>/dev/null || true; }
66
+ trap _cleanup EXIT
64
67
 
65
68
  # Update meta.json compacted_at (field-merge — do not overwrite other fields)
66
69
  if [[ -f "$PROJECT_DIR/meta.json" ]]; then
@@ -22,6 +22,8 @@ TOOL_NAME=$(json_field "$INPUT" ".tool_name")
22
22
 
23
23
  # Guard: if we can't determine the session, nothing to do
24
24
  [[ -z "$SESSION_ID" ]] && exit 0
25
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
26
+ [[ -n "$SESSION_DIR" ]] || exit 0
25
27
 
26
28
  FILE_PATH=$(json_field "$INPUT" ".tool_input.file_path")
27
29
 
@@ -0,0 +1,48 @@
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
3
+ # IC-005, E.1 (Claude Code 2.1.292): event gives status; duration_ms is numeric on both
4
+ # post events. Neither has a numeric exit code. Never inspect or record output/error text.
5
+ [ "${DOFLOW_TELEMETRY:-}" != off ] || exit 0
6
+ exec >/dev/null 2>&1
7
+ event=${1:-}
8
+ case "$event" in PostToolUse|PostToolUseFailure) ;; *) exit 0 ;; esac
9
+ IFS= read -r -d '' payload || true
10
+ case "$payload" in *test*|*jest*|*mocha*) ;; *) exit 0 ;; esac
11
+
12
+ # Source definitions only; no lifecycle policy, failure capture or native response runs here.
13
+ _DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) hook_dir=${_DOFLOW_SRC%/*} ;; *) hook_dir=. ;; esac
14
+ . "$hook_dir/../../.doflow/shared/hooks/bridge/bridge.sh" || exit 0
15
+
16
+ # Same project-store resolution as bridge.sh, including nested dispatch delivery directories.
17
+ # The bridge currently has no separately exported doflow_telemetry_dir helper.
18
+ if [ -n "${DOFLOW_CONFIG_DIR:-}" ]; then
19
+ d=$DOFLOW_CONFIG_DIR
20
+ else
21
+ d=${PWD:-}
22
+ case "$d" in /*) ;; *) exit 0 ;; esac
23
+ while :; do
24
+ if [ -d "$d/.doflow" ]; then
25
+ case "$d/" in */.doflow/*) ;; *) d=${d%/}/.doflow; break ;; esac
26
+ fi
27
+ [ -n "$d" ] && [ "$d" != / ] || exit 0
28
+ d=${d%/*}
29
+ done
30
+ fi
31
+ [ -d "$d/state" ] || exit 0
32
+
33
+ tuple=$(printf '%s' "$payload" | jq -c --arg harness claude --arg event "$event" \
34
+ --arg policy post-shell-observe --arg mode observe -f "$_DOFLOW_BRIDGE_DIR/envelope.jq") || exit 0
35
+ case "$tuple" in *$'\n'*|''|'{}'|'{"dft":1}') exit 0 ;; esac
36
+ class=${tuple##*\"test_class\":\"}; class=${class%%\"*}
37
+ case "$class" in test.full|test.scoped|test.other) ;; *) exit 0 ;; esac
38
+ day=${tuple:17:10}
39
+ case "$day" in [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) ;; *) exit 0 ;; esac
40
+ rest=${tuple#\{\"dft\":1,\"date\":\"??????????\",}
41
+ case "$rest" in \"timestamp\":*\}) ;; *) exit 0 ;; esac
42
+ # test_class is last in the tuple; print it explicitly so the contract guard sees the key.
43
+ rest=${rest%,\"test_class\":*}\}
44
+ [ -d "$d/state/runs/telemetry" ] || mkdir "$d/state/runs/telemetry" || exit 0
45
+ f=$d/state/runs/telemetry/$day.jsonl
46
+ [ ! -e "$f" ] || [ -f "$f" ] || exit 0
47
+ printf '{"kind":"hook","harness":"claude","event":"%s","policy":"post-shell-observe","verdict":"observe","test_class":"%s",%s\n' "$event" "$class" "$rest" >>"$f" || true
48
+ exit 0
@@ -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
  # post-tool-failure.sh — PostToolUse*Failure* hook (pure observability, no deny path)
3
4
  #
4
5
  # A failed tool call is the one outcome no other hook records. post-edit-lint.sh
@@ -25,6 +26,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
25
26
 
26
27
  # Guard: if we can't determine the session, nothing to do
27
28
  [[ -z "$SESSION_ID" ]] && exit 0
29
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
30
+ [[ -n "$SESSION_DIR" ]] || exit 0
28
31
 
29
32
  EVENT=$(json_field "$INPUT" ".hook_event_name")
30
33
  TOOL_NAME=$(json_field "$INPUT" ".tool_name")
@@ -1,12 +1,10 @@
1
1
  #!/usr/bin/env bash
2
2
  # pre-compact.sh — PreCompact hook
3
3
  #
4
- # Outputs a plain string to stdout that Claude Code passes as custom_instructions
5
- # to the compaction LLM call. This enriches the compact summary with git state
6
- # so the summary preserves branch/commit context for the next session.
7
- #
8
- # Output is a plain string — NOT JSON.
9
- # Must be under ~500 chars (Claude Code may truncate longer strings).
4
+ # Outputs plain stdout, not JSON. In Claude Code 2.1.304 and 2.1.308, this reached the
5
+ # compaction summary model as custom instructions; vendor docs are silent on
6
+ # PreCompact stdout (FU-w563w2).
7
+ # Text comes from the shared compact-text.sh (IC-001/IC-002), capped at 490 bytes.
10
8
  # Must never exit non-zero or block.
11
9
 
12
10
  set -euo pipefail
@@ -17,27 +15,25 @@ require_jq
17
15
  INPUT=$(cat)
18
16
  CWD=$(json_field "$INPUT" ".cwd")
19
17
 
20
- BRANCH=""
21
- SHA=""
22
- UNCOMMITTED=0
23
-
24
- if [[ -n "$CWD" ]] && is_git_worktree "$CWD"; then
25
- BRANCH=$(git_branch_of "$CWD" || echo "")
26
- SHA=$(git_short_sha_of "$CWD" || echo "")
27
- UNCOMMITTED=$(git_uncommitted_count_of "$CWD" || echo "0")
28
-
29
- # Last 2 commits (short SHA only for brevity) — keeps output under 500 chars
30
- RECENT=$(run_with_timeout 1 -- git -C "$CWD" log --format="%h %s" -2 2>/dev/null \
31
- | paste -sd ' | ' - || echo "")
32
-
33
- # Build output and hard-cap at 490 chars to stay within Claude Code's limit
34
- OUT=$(printf 'Include in compact summary:\n- git branch: %s sha: %s\n- recent commits: %s\n- uncommitted files: %s\n- cwd: %s\nPreserve: decisions made, files modified, open questions, planned next steps.' \
35
- "${BRANCH:-unknown}" "${SHA:-unknown}" "${RECENT:-none}" "$UNCOMMITTED" "${CWD:-unknown}")
36
- printf '%s' "${OUT:0:490}"
37
- else
38
- OUT=$(printf 'Include in compact summary:\n- cwd: %s (not a git repository)\nPreserve: decisions made, files modified, open questions, planned next steps.' \
39
- "${CWD:-unknown}")
40
- printf '%s' "${OUT:0:490}"
18
+ # Rule compact-instructions.instructions (DEC-023) decides whether this hook emits; it is
19
+ # `include` for both roles, so the output below is unchanged. The role comes from the shared
20
+ # identity.sh, read silently: this hook never wrote the role diagnostic and does not start now.
21
+ POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
22
+ [[ -f "$POLICIES/emission-rules.sh" ]] || POLICIES="$(dirname "$0")/../../shared/hooks/policies"
23
+ _DF_ROLE=worker
24
+ if declare -F _doflow_role_resolve >/dev/null 2>&1; then _doflow_role_resolve 2>/dev/null; fi
25
+ DF_ACTION=skip
26
+ if [[ -f "$POLICIES/emission-rules.sh" ]]; then
27
+ # shellcheck source=/dev/null
28
+ . "$POLICIES/emission-rules.sh"
29
+ doflow_emission_rule compact-instructions.instructions "$_DF_ROLE"
41
30
  fi
31
+ [[ "$DF_ACTION" == include ]] || exit 0
32
+
33
+ [[ -f "$POLICIES/compact-text.sh" ]] || exit 0
34
+ # shellcheck source=/dev/null
35
+ source "$POLICIES/compact-text.sh"
36
+ doflow_compact_text "$CWD"
37
+ printf '%s' "$DF_COMPACT_TEXT"
42
38
 
43
39
  exit 0
@@ -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
  # session-end.sh — SessionEnd hook
3
4
  #
4
5
  # Runs when Claude Code closes a session. Responsibilities:
@@ -23,6 +24,27 @@ CWD=$(json_field "$INPUT" ".cwd")
23
24
 
24
25
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
25
26
 
27
+ # Start storage cleanup without changing the hook's output, status, or latency.
28
+ start_storage_upkeep() {
29
+ (
30
+ SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
31
+ if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
32
+ SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
33
+ fi
34
+ if [[ -f "$SHARED_POLICY_LIB" ]]; then
35
+ source "$SHARED_POLICY_LIB"
36
+ storage_upkeep_async "$CWD"
37
+ fi
38
+ ) >/dev/null 2>&1 || true
39
+ }
40
+
41
+ # No config home (lib.sh leaves the state paths empty): no session store to write, but the
42
+ # storage upkeep still starts (086 IC-010).
43
+ if [[ -z "$STATE_DIR" ]]; then
44
+ start_storage_upkeep
45
+ exit 0
46
+ fi
47
+
26
48
  # ── 1. Log session end ────────────────────────────────────────────────────────
27
49
 
28
50
  mkdir -p "$(dirname "$SESSIONS_LOG")"
@@ -59,16 +81,7 @@ if [[ -n "$SESSION_ID" ]]; then
59
81
  rm -rf "$SESSION_PATH" 2>/dev/null || true
60
82
  fi
61
83
 
62
- (
63
- SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
64
- if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
65
- SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
66
- fi
67
- if [[ -f "$SHARED_POLICY_LIB" ]]; then
68
- source "$SHARED_POLICY_LIB"
69
- storage_upkeep_async "$CWD"
70
- fi
71
- ) >/dev/null 2>&1 || true
84
+ start_storage_upkeep
72
85
 
73
86
  # ── 4. Trim sessions.log (lock-guarded) ───────────────────────────────────────
74
87
 
@@ -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
  # skill-config-audit.sh — ConfigChange(skills) hook (pure observability, no deny path)
3
4
  #
4
5
  # Logs skill-file mutations regardless of which tool made them (a subagent's Bash heredoc-to-file
@@ -26,6 +27,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
26
27
 
27
28
  # Guard: if we can't determine the session, nothing to do
28
29
  [[ -z "$SESSION_ID" ]] && exit 0
30
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
31
+ [[ -n "$SESSION_DIR" ]] || exit 0
29
32
 
30
33
  TIMESTAMP=$(date -u +%FT%TZ)
31
34
  SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
@@ -116,6 +116,15 @@
116
116
  }
117
117
  ],
118
118
  "PostToolUse": [
119
+ {
120
+ "matcher": "Bash",
121
+ "hooks": [
122
+ {
123
+ "type": "command",
124
+ "command": "~/.claude/hooks/post-shell-observe.sh PostToolUse"
125
+ }
126
+ ]
127
+ },
119
128
  {
120
129
  "matcher": "Edit",
121
130
  "hooks": [
@@ -176,6 +185,15 @@
176
185
  }
177
186
  ],
178
187
  "PostToolUseFailure": [
188
+ {
189
+ "matcher": "Bash",
190
+ "hooks": [
191
+ {
192
+ "type": "command",
193
+ "command": "~/.claude/hooks/post-shell-observe.sh PostToolUseFailure"
194
+ }
195
+ ]
196
+ },
179
197
  {
180
198
  "matcher": ".*",
181
199
  "hooks": [
@@ -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
  # doflow-statusline — Claude Code status line fed by DoFlow's neutral state.
3
4
  #
4
5
  # Claude Code pipes one session-state JSON document to stdin; whatever this script prints becomes
@@ -4,4 +4,5 @@ developer_instructions = """
4
4
  Implement features and refactor code strictly according to approved designs and task checklists.
5
5
  Optimize algorithms, reduce complexity, and maintain polyglot code quality across the codebase.
6
6
  Ensure changes pass all existing tests and conform to language-specific standards.
7
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
7
8
  """