@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
  # 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,5 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Claude adapter: reuse the shared session initializer with Claude attribution.
3
- set -euo pipefail
2
+ # Claude front door: session-context through the shared lifecycle bridge.
3
+ set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-claude}"
5
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/session-context.sh"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
6
+ doflow_bridge claude SessionStart session-context
7
+ exit $?
@@ -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")
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Claude adapter: reuse the shared stop-completion check with Claude attribution.
3
- set -euo pipefail
2
+ # Claude front door: stop-check through the shared lifecycle bridge.
3
+ set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-claude}"
5
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/stop-check.sh"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
6
+ doflow_bridge claude Stop stop-check
7
+ exit $?
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Claude front door: reuse the canonical subagent-audit policy with Claude attribution.
3
- # No JSON-shape translation needed — claude/codex's copies were byte-identical
4
- # (022-hooks-remaining-duplication).
5
- set -euo pipefail
2
+ # Claude front door: subagent-audit through the shared lifecycle bridge.
3
+ set -uo pipefail
6
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-claude}"
7
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/subagent-audit.sh"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
6
+ doflow_bridge claude SubagentStart subagent-audit
7
+ exit $?
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Claude front door: reuse the canonical context policy with Claude's output envelope.
3
- set -euo pipefail
2
+ # Claude front door: user-prompt-submit through the shared lifecycle bridge.
3
+ set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-claude}"
5
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/user-prompt-submit.sh"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
6
+ doflow_bridge claude UserPromptSubmit user-prompt-submit
7
+ exit $?
@@ -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
  """
@@ -0,0 +1,10 @@
1
+ name = "delivery-lead"
2
+ description = "Delivery lead that plans a feature's tasks, briefs and dispatches workers, verifies their evidence, and commits."
3
+ developer_instructions = """
4
+ Plan the tasks of one feature or package, brief each worker with goal, context, write set, rules, acceptance command and report format, and dispatch in parallel only when write sets are disjoint.
5
+ Accept a fix only with a test red on the base and green after, plus a negative control; never weaken an assertion.
6
+ Commit one logical item at a time with explicit paths; stop and return options on an unrequested contract change or a permission denial.
7
+ Write no product code and no tests yourself: workers do.
8
+ Branch on each hand-back's status: `needs-context` resend with the missing context; `blocked` stop and surface it; `done-with-concerns` verify the concerns before accepting; `done` accept.
9
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
10
+ """
@@ -1,8 +1,8 @@
1
1
  name = "quality-guardian"
2
2
  description = "Specialist quality and security engineer for automated testing, security audits, and root cause analysis."
3
- sandbox_mode = "read-only"
4
3
  developer_instructions = """
5
4
  Author and run comprehensive test suites, audit code for security vulnerabilities, and diagnose root causes.
6
5
  Verify adherence to SOLID principles, check error handling boundaries, and analyze reproduction traces.
7
6
  Stay in audit mode: do not modify business logic code directly without an approved fix plan.
7
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
8
8
  """
@@ -1,8 +1,8 @@
1
1
  name = "research-writer"
2
2
  description = "Specialist research and technical writing agent for documentation, architecture indices, and web research."
3
- sandbox_mode = "read-only"
4
3
  developer_instructions = """
5
4
  Conduct deep web research with cited sources and write comprehensive technical documentation.
6
5
  Create project architecture indices and implementation flow summaries capturing architectural trade-offs.
7
6
  Stay in documentation mode: do not modify workspace source code.
7
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
8
8
  """
@@ -0,0 +1,10 @@
1
+ name = "reviewer"
2
+ description = "Read-only reviewer of a change it did not write: evidenced defects, severity, and round-two replies."
3
+ sandbox_mode = "read-only"
4
+ developer_instructions = """
5
+ Review a change written by another agent and model; decline work your own model or agent wrote.
6
+ Back each defect with path:line plus a reproducer you ran or an exact input-to-wrong-output chain, else report it as a note; mark SOURCE or INFERENCE and severity blocker, should-fix or note.
7
+ Run tests only in a scratch copy of the reviewed head and kill every process you start.
8
+ Stay in review mode: do not modify repository files; write only your own report.
9
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
10
+ """
@@ -1,8 +1,8 @@
1
1
  name = "spec-analyst"
2
2
  description = "Specialist agent for requirements discovery, user story breakdown, and estimation."
3
- sandbox_mode = "read-only"
4
3
  developer_instructions = """
5
4
  Elicit requirements through Socratic dialogue focusing on user value and business goals.
6
5
  Decompose initiatives into user stories with testable acceptance criteria and estimate effort.
7
6
  Stay in planning mode: do not implement code or modify workspace files.
7
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
8
8
  """
@@ -1,9 +1,9 @@
1
1
  name = "system-architect"
2
2
  description = "Specialist architect agent for system design, API contracts, and infrastructure."
3
- sandbox_mode = "read-only"
4
3
  developer_instructions = """
5
4
  Design scalable systems with explicit component boundaries, interfaces, dependencies, and trade-offs.
6
5
  Evaluate architecture decisions for maintainability, resilience, operational impact, and future change.
7
6
  Document clear recommendations with alternatives and validation criteria.
8
7
  Stay in planning mode: do not implement code or modify workspace files.
8
+ End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
9
9
  """
@@ -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:-unknown}"
@@ -278,6 +296,7 @@ has_uncommitted_changes() {
278
296
  # Safe to call multiple times (mkdir -p is idempotent).
279
297
  ensure_session_dir() {
280
298
  local session_id="$1"
299
+ [ -n "$SESSION_DIR" ] || return 0
281
300
  mkdir -p "$SESSION_DIR/$session_id"
282
301
  echo "$SESSION_DIR/$session_id"
283
302
  }
@@ -287,6 +306,7 @@ ensure_session_dir() {
287
306
  ensure_project_dir() {
288
307
  local cwd="$1"
289
308
  local hash
309
+ [ -n "$PROJECTS_DIR" ] || return 0
290
310
  hash=$(cwd_hash "$cwd")
291
311
  mkdir -p "$PROJECTS_DIR/$hash"
292
312
  echo "$PROJECTS_DIR/$hash"
@@ -314,22 +334,21 @@ require_jq() {
314
334
  fi
315
335
  }
316
336
 
317
- # ── Session role ──────────────────────────────────────────────────────────────
318
-
319
- # Print `main` or `worker` for this session, read from DOFLOW_SESSION_ROLE (matched
320
- # case-insensitively). Unset or empty is `main`; a value that is neither `main` nor
321
- # `worker` is `worker` and writes one line to stderr. A worker never writes or claims the
322
- # project's compact summary or warning. Always returns 0. bash 3.2 safe (no ${var,,}).
323
- doflow_session_role() {
324
- local role
325
- role=$(printf '%s' "${DOFLOW_SESSION_ROLE:-}" | tr '[:upper:]' '[:lower:]') || role=""
326
- case "$role" in
327
- ""|main) printf 'main\n' ;;
328
- worker) printf 'worker\n' ;;
329
- *)
330
- echo "[doflow] unknown DOFLOW_SESSION_ROLE; treating session as worker" >&2
331
- printf 'worker\n'
332
- ;;
333
- esac
334
- return 0
335
- }
337
+ # ── Session role and identity ─────────────────────────────────────────────────
338
+
339
+ # doflow_session_role comes from the shared identity.sh, its only definition (IC-009). When an
340
+ # install lacks that file, the session is a worker and the broken install is captured as
341
+ # identity-missing: a worker writes and claims nothing, so a broken install cannot leak context.
342
+ if [ -f "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh" ]; then
343
+ . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh"
344
+ else
345
+ doflow_session_role() {
346
+ local policy="${0##*/}"
347
+ policy="${policy%.sh}"
348
+ policy="${policy%.impl}"
349
+ ( . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/capture-failure.sh" \
350
+ && doflow_capture_failure "$policy" identity-missing ) >/dev/null 2>&1 || true
351
+ printf 'worker\n'
352
+ return 0
353
+ }
354
+ fi
@@ -1,18 +1,10 @@
1
1
  #!/usr/bin/env bash
2
- # Codex front door: delegates the mcp-tool-guard decision to the Canonical Policy
3
- # Library, then translates it into the hookSpecificOutput.permissionDecision deny
4
- # contract this script's Codex/Claude originals both used — exit code alone is
5
- # not sufficient here, so this front door is a translator, not a bare exec
6
- # (unlike session-context/stop-check, which never need this translation).
2
+ # Codex front door: mcp-tool-guard through the shared lifecycle bridge.
7
3
  set -uo pipefail
8
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
9
-
10
- command -v jq >/dev/null 2>&1 || exit 0
11
- source "$(dirname "$0")/../../.doflow/shared/hooks/policies/deny-json.sh"
12
-
13
- POLICY="$(dirname "$0")/../../.doflow/shared/hooks/policies/mcp-tool-guard.sh"
14
- REASON=$(bash "$POLICY" 2>&1 >/dev/null)
15
- CODE=$?
16
-
17
- [ "$CODE" -ne 0 ] && emit_pretooluse_deny_nested "${REASON:-MCP tool call blocked by mcp-tool-guard}"
18
- exit 0
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
6
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
7
+ exit 0
8
+ fi
9
+ doflow_bridge codex PreToolUse mcp-tool-guard
10
+ exit $?
@@ -19,11 +19,13 @@ INPUT=$(cat)
19
19
  SESSION_ID=$(json_field "$INPUT" ".session_id")
20
20
  TOOL_NAME=$(json_field "$INPUT" ".tool_name")
21
21
 
22
- # Only handle Edit/Write (Claude, Gemini) and apply_patch (Codex's edit tool name)
22
+ # Only handle Edit/Write (Claude) and apply_patch (Codex's edit tool name)
23
23
  [[ "$TOOL_NAME" != "Edit" && "$TOOL_NAME" != "Write" && "$TOOL_NAME" != "apply_patch" ]] && exit 0
24
24
 
25
25
  # Guard: if we can't determine the session, nothing to do
26
26
  [[ -z "$SESSION_ID" ]] && exit 0
27
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
28
+ [[ -n "$SESSION_DIR" ]] || exit 0
27
29
 
28
30
  SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
29
31
 
@@ -1,18 +1,10 @@
1
1
  #!/usr/bin/env bash
2
- # Codex front door: delegates the pre-bash-guard decision to the Canonical Policy
3
- # Library, then translates it into the hookSpecificOutput.permissionDecision deny
4
- # contract this script's Codex/Claude originals both used — exit code alone is
5
- # not sufficient here, so this front door is a translator, not a bare exec
6
- # (unlike session-context/stop-check, which never need this translation).
2
+ # Codex front door: pre-bash-guard through the shared lifecycle bridge.
7
3
  set -uo pipefail
8
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
9
-
10
- command -v jq >/dev/null 2>&1 || exit 0
11
- source "$(dirname "$0")/../../.doflow/shared/hooks/policies/deny-json.sh"
12
-
13
- POLICY="$(dirname "$0")/../../.doflow/shared/hooks/policies/pre-bash-guard.sh"
14
- REASON=$(bash "$POLICY" 2>&1 >/dev/null)
15
- CODE=$?
16
-
17
- [ "$CODE" -ne 0 ] && emit_pretooluse_deny_nested "${REASON:-Command blocked by pre-bash-guard}"
18
- exit 0
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
6
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
7
+ exit 0
8
+ fi
9
+ doflow_bridge codex PreToolUse pre-bash-guard
10
+ exit $?
@@ -1,16 +1,20 @@
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
  # pre-compact.impl.sh — PreCompact hook (Codex-specific output shape)
3
4
  #
4
5
  # Codex's PreCompact output schema (codex-rs/hooks/src/schema.rs::PreCompactCommandOutputWire)
5
6
  # flattens only HookUniversalOutputWire (continue/stopReason/suppressOutput/systemMessage) and
6
7
  # rejects unknown fields — there is no additionalContext-style field for PreCompact, and the
7
- # output MUST be valid JSON, unlike Claude's PreCompact hook, which reads a plain string as
8
- # custom_instructions. This script gathers the same git-state context Claude's pre-compact.sh
9
- # does, but emits it as a JSON systemMessage instead — the closest available field, though
10
- # systemMessage's exact downstream effect on compaction content is not confirmed (Claude's
11
- # custom_instructions is fed directly to the compaction LLM call; Codex's docs do not state that
12
- # systemMessage receives the same treatment). Treat this as best-effort context surfacing, not a
13
- # guaranteed compaction-summary injection, until verified against a live Codex session.
8
+ # output MUST be valid JSON, unlike Claude's PreCompact hook, whose plain stdout was observed in
9
+ # Claude Code 2.1.304 and 2.1.308 to be read as custom_instructions, undocumented (FU-w563w2). This script
10
+ # gathers the same git-state context Claude's pre-compact.sh does, but emits it as a JSON
11
+ # systemMessage instead — the closest available field, though systemMessage's exact downstream
12
+ # effect on compaction content is not confirmed (that Claude's custom_instructions reach the
13
+ # compaction LLM call is observed in Claude Code 2.1.304 and 2.1.308, undocumented (FU-w563w2); Codex's docs
14
+ # do not state that systemMessage receives the same treatment). Treat this as best-effort context
15
+ # surfacing, not a guaranteed compaction-summary injection, until verified against a live Codex
16
+ # session.
17
+ # The shared compaction text comes from compact-text.sh (IC-001/IC-002).
14
18
  #
15
19
  # Must never exit non-zero or block (PreCompact hooks do not support a block decision in Codex).
16
20
 
@@ -22,25 +26,24 @@ require_jq
22
26
  INPUT=$(cat)
23
27
  CWD=$(json_field "$INPUT" ".cwd")
24
28
 
25
- BRANCH=""
26
- SHA=""
27
- UNCOMMITTED=0
28
-
29
- if [[ -n "$CWD" ]] && is_git_worktree "$CWD"; then
30
- BRANCH=$(git_branch_of "$CWD" || echo "")
31
- SHA=$(git_short_sha_of "$CWD" || echo "")
32
- UNCOMMITTED=$(git_uncommitted_count_of "$CWD" || echo "0")
33
- RECENT=$(run_with_timeout 1 -- git -C "$CWD" log --format="%h %s" -2 2>/dev/null | paste -sd ' | ' - || echo "")
34
-
35
- MSG=$(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.' \
36
- "${BRANCH:-unknown}" "${SHA:-unknown}" "${RECENT:-none}" "$UNCOMMITTED" "${CWD:-unknown}")
37
- else
38
- MSG=$(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}")
29
+ # Rule compact-instructions.instructions (DEC-023) decides whether this hook emits; it is
30
+ # `include` for both roles, so the output below is unchanged. The role comes from the shared
31
+ # identity.sh, read silently: this hook never wrote the role diagnostic and does not start now.
32
+ POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
33
+ [[ -f "$POLICIES/emission-rules.sh" ]] || POLICIES="$(dirname "$0")/../../shared/hooks/policies"
34
+ _DF_ROLE=worker
35
+ if declare -F _doflow_role_resolve >/dev/null 2>&1; then _doflow_role_resolve 2>/dev/null; fi
36
+ DF_ACTION=skip
37
+ if [[ -f "$POLICIES/emission-rules.sh" ]]; then
38
+ # shellcheck source=/dev/null
39
+ . "$POLICIES/emission-rules.sh"
40
+ doflow_emission_rule compact-instructions.instructions "$_DF_ROLE"
40
41
  fi
42
+ [[ "$DF_ACTION" == include ]] || exit 0
41
43
 
42
- # Hard-cap at 490 chars, matching Claude's script, before JSON-encoding.
43
- MSG="${MSG:0:490}"
44
-
45
- jq -n --arg systemMessage "$MSG" '{systemMessage: $systemMessage}'
44
+ [[ -f "$POLICIES/compact-text.sh" ]] || exit 0
45
+ # shellcheck source=/dev/null
46
+ source "$POLICIES/compact-text.sh"
47
+ doflow_compact_text "$CWD"
48
+ jq -n --arg systemMessage "$DF_COMPACT_TEXT" '{systemMessage: $systemMessage}'
46
49
  exit 0
@@ -1,19 +1,10 @@
1
1
  #!/usr/bin/env bash
2
- # Codex front door: delegates the pre-implementation-gate decision to the
3
- # Canonical Policy Library, then translates it into the
4
- # hookSpecificOutput.permissionDecision deny contract this script's Codex/Claude
5
- # originals both used — exit code alone is not sufficient here, so this front
6
- # door is a translator, not a bare exec (unlike session-context/stop-check,
7
- # which never need this translation).
2
+ # Codex front door: pre-implementation-gate through the shared lifecycle bridge.
8
3
  set -uo pipefail
9
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
10
-
11
- command -v jq >/dev/null 2>&1 || exit 0
12
- source "$(dirname "$0")/../../.doflow/shared/hooks/policies/deny-json.sh"
13
-
14
- POLICY="$(dirname "$0")/../../.doflow/shared/hooks/policies/pre-implementation-gate.sh"
15
- REASON=$(bash "$POLICY" 2>&1 >/dev/null)
16
- CODE=$?
17
-
18
- [ "$CODE" -ne 0 ] && emit_pretooluse_deny_nested "${REASON:-Implementation requires an approved plan.md}"
19
- exit 0
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
6
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
7
+ exit 0
8
+ fi
9
+ doflow_bridge codex PreToolUse pre-implementation-gate
10
+ exit $?
@@ -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:
@@ -24,6 +25,27 @@ CWD=$(json_field "$INPUT" ".cwd")
24
25
 
25
26
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
26
27
 
28
+ # Start storage cleanup without changing the hook's output, status, or latency.
29
+ start_storage_upkeep() {
30
+ (
31
+ SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
32
+ if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
33
+ SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
34
+ fi
35
+ if [[ -f "$SHARED_POLICY_LIB" ]]; then
36
+ source "$SHARED_POLICY_LIB"
37
+ storage_upkeep_async "$CWD"
38
+ fi
39
+ ) >/dev/null 2>&1 || true
40
+ }
41
+
42
+ # No config home (lib.sh leaves the state paths empty): no session store to write, but the
43
+ # storage upkeep still starts (086 IC-010).
44
+ if [[ -z "$STATE_DIR" ]]; then
45
+ start_storage_upkeep
46
+ exit 0
47
+ fi
48
+
27
49
  # ── 1. Log session end ────────────────────────────────────────────────────────
28
50
 
29
51
  mkdir -p "$(dirname "$SESSIONS_LOG")"
@@ -60,16 +82,7 @@ if [[ -n "$SESSION_ID" ]]; then
60
82
  rm -rf "$SESSION_PATH" 2>/dev/null || true
61
83
  fi
62
84
 
63
- (
64
- SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
65
- if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
66
- SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
67
- fi
68
- if [[ -f "$SHARED_POLICY_LIB" ]]; then
69
- source "$SHARED_POLICY_LIB"
70
- storage_upkeep_async "$CWD"
71
- fi
72
- ) >/dev/null 2>&1 || true
85
+ start_storage_upkeep
73
86
 
74
87
  # ── 4. Trim sessions.log (lock-guarded) ───────────────────────────────────────
75
88
 
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Codex adapter: reuse the canonical session-context policy with Codex attribution.
3
- set -euo pipefail
2
+ # Codex front door: session-context through the shared lifecycle bridge.
3
+ set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
5
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/session-context.sh"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
6
+ doflow_bridge codex SessionStart session-context
7
+ exit $?
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env bash
2
- # Codex adapter: preserve a blocking exit while returning valid Stop JSON on success.
3
- set -euo pipefail
2
+ # Codex front door: stop-check through the shared lifecycle bridge.
3
+ set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
5
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then printf '{}\n'; exit 0; fi
5
6
  rc=0
6
- bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/stop-check.sh" || rc=$?
7
- [ "$rc" -eq 2 ] && exit 2
8
- printf '{}\n'
7
+ output="$(doflow_bridge codex Stop stop-check)" || rc=$?
8
+ if [ "$rc" -eq 0 ]; then printf '%s\n' "$output"; fi
9
+ exit "$rc"
@@ -1,8 +1,20 @@
1
1
  #!/usr/bin/env bash
2
- # Codex front door: reuse the canonical subagent-audit policy with Codex attribution, then emit
3
- # the empty-JSON SubagentStop requires on success (022-hooks-remaining-duplication: claude/codex's
4
- # copies were byte-identical; only this trailing JSON requirement is Codex-specific).
5
- set -euo pipefail
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
+ # Codex front door: subagent-audit through the shared lifecycle bridge.
4
+ set -uo pipefail
6
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
7
- bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/subagent-audit.sh"
8
- printf '{}\n'
6
+ if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
7
+ payload=$(cat)
8
+ event=$(printf '%s' "$payload" | jq -r '.hook_event_name // "SubagentStart"' 2>/dev/null || printf 'SubagentStart')
9
+ has_jq=1
10
+ command -v jq >/dev/null 2>&1 || has_jq=0
11
+ rc=0
12
+ doflow_bridge codex "$event" subagent-audit <<<"$payload" || rc=$?
13
+ if [ "$has_jq" -eq 0 ]; then
14
+ printf '{}\n'
15
+ exit 0
16
+ fi
17
+ if [ "$rc" -eq 0 ]; then
18
+ case "$DF_BRIDGE_OUTCOME" in allow|advisory) printf '{}\n' ;; esac
19
+ fi
20
+ exit "$rc"