@khoavu882/doflow 2.0.0-beta.5 → 2.0.1

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 (494) hide show
  1. package/README.md +16 -16
  2. package/bin/doflow.js +22 -12
  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/mcp-tool-guard.sh +4 -1
  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-compact.sh +23 -27
  15. package/core/harnesses/claude/hooks/pre-implement-gate.sh +4 -1
  16. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  17. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  18. package/core/harnesses/claude/settings/settings.json +26 -9
  19. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  20. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  21. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  22. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  23. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  24. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  25. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  26. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  27. package/core/harnesses/codex/hooks/hooks.json +0 -10
  28. package/core/harnesses/codex/hooks/lib.sh +44 -25
  29. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +4 -1
  30. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  31. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  32. package/core/harnesses/codex/hooks/pre-implement-gate.sh +4 -1
  33. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  34. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  35. package/core/harnesses/copilot/hooks/doflow-lib.sh +94 -0
  36. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  39. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  40. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  41. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  42. package/core/harnesses/copilot/hooks/doflow.json +51 -0
  43. package/core/harnesses/kiro/agents/doflow.json +1 -11
  44. package/core/harnesses/kiro/hooks/doflow.json +0 -10
  45. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  46. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +8 -3
  47. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +8 -3
  48. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  49. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  50. package/core/harnesses/pi/extensions/doflow-guard.js +11 -2
  51. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +1 -2
  52. package/core/harnesses/shared/hooks/adapters/antigravity.js +1 -1
  53. package/core/harnesses/shared/hooks/bridge/bridge.sh +126 -23
  54. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  55. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  56. package/core/harnesses/shared/hooks/bridge/respond.sh +16 -2
  57. package/core/harnesses/shared/hooks/policies/capture-failure.sh +49 -16
  58. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  59. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  60. package/core/harnesses/shared/hooks/policies/deny-json.sh +20 -7
  61. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  62. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  63. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  64. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  65. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  66. package/core/harnesses/shared/hooks/policies/mcp-policy.conf +1 -1
  67. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +7 -8
  68. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +132 -57
  69. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  70. package/core/harnesses/shared/hooks/policies/stop-check.sh +27 -15
  71. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +6 -3
  72. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  73. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  74. package/core/harnesses/shared/hooks/stream-hook-runner.js +58 -20
  75. package/core/harnesses/shared/locator/doflow-run +2 -3
  76. package/core/registry/advice.json +3 -3
  77. package/core/registry/assets.json +55 -82
  78. package/core/registry/capabilities.json +12 -0
  79. package/core/registry/contracts.json +58 -31
  80. package/core/registry/contribution-points.json +35 -0
  81. package/core/registry/gates.json +32 -0
  82. package/core/registry/guidance-caps.json +40 -0
  83. package/core/registry/harnesses.json +1445 -366
  84. package/core/registry/intake.json +53 -0
  85. package/core/registry/lifecycle.json +599 -996
  86. package/core/registry/mcp.json +5 -1
  87. package/core/registry/models.json +7 -1
  88. package/core/registry/package-templates/README.md +19 -0
  89. package/core/registry/package-templates/agent/files/agent.md +9 -0
  90. package/core/registry/package-templates/agent/template.json +4 -0
  91. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  92. package/core/registry/package-templates/capability-provider/template.json +11 -0
  93. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  94. package/core/registry/package-templates/debate-preset/template.json +4 -0
  95. package/core/registry/package-templates/intake-category/files/category.json +8 -0
  96. package/core/registry/package-templates/intake-category/template.json +4 -0
  97. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  98. package/core/registry/package-templates/review-preset/template.json +4 -0
  99. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  100. package/core/registry/package-templates/skill/template.json +4 -0
  101. package/core/registry/package-templates/worker/files/worker.json +92 -0
  102. package/core/registry/package-templates/worker/template.json +11 -0
  103. package/core/registry/packages/doflow/doflow-package.json +15 -0
  104. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  105. package/core/registry/protocols.json +61 -0
  106. package/core/registry/routes.json +17 -0
  107. package/core/registry/rules.json +431 -0
  108. package/core/registry/settings.json +272 -0
  109. package/core/registry/storage.json +687 -31
  110. package/core/registry/telemetry.json +236 -0
  111. package/core/registry/transcripts.json +142 -0
  112. package/core/registry/verification.json +76 -6
  113. package/core/registry/workflows.json +55 -0
  114. package/core/shared/agent-specs/core-implementer.md +3 -0
  115. package/core/shared/agent-specs/delivery-lead.md +68 -0
  116. package/core/shared/agent-specs/quality-guardian.md +5 -1
  117. package/core/shared/agent-specs/research-writer.md +10 -3
  118. package/core/shared/agent-specs/reviewer.md +53 -0
  119. package/core/shared/agent-specs/spec-analyst.md +5 -6
  120. package/core/shared/agent-specs/system-architect.md +5 -1
  121. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  122. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  123. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  124. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  125. package/core/shared/guidance/pointers/codex.md +1 -4
  126. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  127. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  128. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  129. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  130. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  131. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  132. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  133. package/core/shared/guidance/references/ORCHESTRATION.md +3 -2
  134. package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +19 -1
  135. package/core/shared/guidance/rules/RULES.md +45 -0
  136. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  137. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  138. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  139. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  140. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  141. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  142. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  143. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  144. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  145. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  146. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  147. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +49 -5
  148. package/core/shared/scripts/doflow/bin/doflow-run +152 -34
  149. package/core/shared/skills/do/SKILL.md +14 -12
  150. package/core/shared/skills/do/references/advice_calls.md +26 -0
  151. package/core/shared/skills/do/references/pm_routing.md +1 -2
  152. package/core/shared/skills/do/references/program_mode.md +31 -0
  153. package/core/shared/skills/do-brainstorm/SKILL.md +45 -97
  154. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +36 -0
  155. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  156. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  157. package/core/shared/skills/do-code-review/SKILL.md +48 -148
  158. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  159. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  160. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  161. package/core/shared/skills/do-design/SKILL.md +23 -20
  162. package/core/shared/skills/do-diagnose/SKILL.md +18 -6
  163. package/core/shared/skills/do-document/SKILL.md +12 -1
  164. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  165. package/core/shared/skills/do-document/references/embedded-research.md +19 -7
  166. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  167. package/core/shared/skills/do-execute-plan/SKILL.md +19 -60
  168. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  169. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  170. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  171. package/core/shared/skills/do-execute-plan/references/run_position.md +16 -2
  172. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  173. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  174. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  175. package/core/shared/skills/do-flow/SKILL.md +10 -11
  176. package/core/shared/skills/do-flow/references/task_classes.md +5 -5
  177. package/core/shared/skills/do-git/SKILL.md +4 -0
  178. package/core/shared/skills/do-implement/SKILL.md +13 -14
  179. package/core/shared/skills/do-plan/SKILL.md +34 -20
  180. package/core/shared/skills/do-test/SKILL.md +7 -4
  181. package/core/shared/templates/doflow/constitution-template.md +9 -3
  182. package/core/shared/templates/doflow/data-model-template.md +1 -1
  183. package/core/shared/templates/doflow/design-template.md +113 -16
  184. package/core/shared/templates/doflow/plan-template.md +11 -10
  185. package/core/shared/templates/doflow/question-log-template.md +14 -2
  186. package/core/shared/templates/doflow/requirement-template.md +1 -1
  187. package/core/shared/workflows/do-flow-chain.md +2 -0
  188. package/core/worker-evidence/antigravity/checks.json +14 -0
  189. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  190. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  191. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  192. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  193. package/core/worker-evidence/codex/checks.json +38 -0
  194. package/package.json +10 -6
  195. package/src/adapters/antigravity/index.js +143 -66
  196. package/src/adapters/claude/index.js +46 -5
  197. package/src/adapters/codex/agents.js +25 -15
  198. package/src/adapters/codex/hooks.js +39 -3
  199. package/src/adapters/codex/index.js +61 -13
  200. package/src/adapters/codex/native-projection.js +6 -2
  201. package/src/adapters/copilot/index.js +58 -23
  202. package/src/adapters/copy-tree.js +291 -46
  203. package/src/adapters/guidance-manifest.js +71 -0
  204. package/src/adapters/guidance-pointer.js +19 -0
  205. package/src/adapters/hook-commands.js +6 -10
  206. package/src/adapters/index.js +1 -0
  207. package/src/adapters/kiro/index.js +23 -12
  208. package/src/adapters/opencode/index.js +8 -8
  209. package/src/adapters/pi/hooks.js +2 -1
  210. package/src/adapters/pi/index.js +14 -7
  211. package/src/adapters/resolve-source.js +26 -2
  212. package/src/cli/commands/install.js +2 -1
  213. package/src/cli/commands/reconcile.js +53 -9
  214. package/src/cli/commands/remove.js +2 -2
  215. package/src/cli/commands/rollback.js +6 -3
  216. package/src/cli/commands/self-update.js +18 -9
  217. package/src/cli/commands/status.js +22 -3
  218. package/src/cli/commands/ui.js +99 -0
  219. package/src/cli/commands/update.js +2 -1
  220. package/src/cli/index.js +337 -32
  221. package/src/cli/runtime-commands.js +220 -60
  222. package/src/cli/shared.js +0 -2
  223. package/src/helper/git.js +1 -1
  224. package/src/helper/guardrails.js +1 -1
  225. package/src/helper/marker-merge.js +31 -13
  226. package/src/helper/package-ids.js +37 -0
  227. package/src/helper/semver.js +94 -0
  228. package/src/install/backup.js +105 -15
  229. package/src/install/context.js +1 -1
  230. package/src/install/targets.js +31 -16
  231. package/src/lifecycle/coverage.js +4 -16
  232. package/src/lifecycle/hook-tier.js +160 -0
  233. package/src/lifecycle/index.js +412 -78
  234. package/src/lifecycle/retired-harnesses.js +318 -0
  235. package/src/lifecycle/view.js +35 -15
  236. package/src/registry/index.js +551 -26
  237. package/src/registry/worker-ids.js +45 -0
  238. package/src/release/build-package.js +0 -3
  239. package/src/release/docs-blocks.js +472 -0
  240. package/src/release/preflight.js +425 -0
  241. package/src/release/rehearse.js +401 -0
  242. package/src/release/release-workflow.js +733 -0
  243. package/src/release/sync-plugin-versions.js +43 -7
  244. package/src/runtime/advice/bench-gate.js +25 -0
  245. package/src/runtime/advice/cli.js +59 -16
  246. package/src/runtime/advice/client.js +32 -9
  247. package/src/runtime/advice/config.js +98 -133
  248. package/src/runtime/advice/doctor.js +1 -1
  249. package/src/runtime/advice/elevation.js +97 -0
  250. package/src/runtime/advice/endpoint-guard.js +9 -3
  251. package/src/runtime/advice/mode.js +37 -0
  252. package/src/runtime/advice/record.js +18 -5
  253. package/src/runtime/advice/registry.js +4 -1
  254. package/src/runtime/advice/shadow-config.js +229 -0
  255. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  256. package/src/runtime/brief-rules.js +81 -0
  257. package/src/runtime/brief-tools.js +111 -34
  258. package/src/runtime/candidate.js +20 -11
  259. package/src/runtime/capabilities/executor.js +450 -0
  260. package/src/runtime/capabilities/loopback.js +41 -0
  261. package/src/runtime/capabilities/sanitizer.js +88 -0
  262. package/src/runtime/capability-router.js +135 -3
  263. package/src/runtime/checkouts.js +73 -11
  264. package/src/runtime/claims.js +13 -7
  265. package/src/runtime/cli.js +196 -19
  266. package/src/runtime/config-home.js +42 -0
  267. package/src/runtime/context/arbitrate.js +767 -0
  268. package/src/runtime/context/delivery-store.js +4 -6
  269. package/src/runtime/context/emission-rules.js +118 -0
  270. package/src/runtime/context/identity.js +227 -0
  271. package/src/runtime/context/pointer.js +67 -12
  272. package/src/runtime/context/primary-command.js +117 -0
  273. package/src/runtime/context/primary.js +344 -0
  274. package/src/runtime/context/summary-store.js +655 -0
  275. package/src/runtime/context-pack.js +158 -79
  276. package/src/runtime/decision-register.js +13 -4
  277. package/src/runtime/dispatch/admission.js +392 -0
  278. package/src/runtime/dispatch/attempt-end.js +274 -0
  279. package/src/runtime/dispatch/command.js +628 -0
  280. package/src/runtime/dispatch/controls.js +904 -0
  281. package/src/runtime/dispatch/envelope.js +276 -0
  282. package/src/runtime/dispatch/grants.js +310 -0
  283. package/src/runtime/dispatch/integrate.js +617 -0
  284. package/src/runtime/dispatch/loop.js +1835 -0
  285. package/src/runtime/dispatch/store.js +352 -0
  286. package/src/runtime/dispatch/verify-run.js +201 -0
  287. package/src/runtime/evidence-ledger.js +52 -7
  288. package/src/runtime/failure/capture.js +3 -1
  289. package/src/runtime/failure/cli.js +25 -9
  290. package/src/runtime/failure/home.js +57 -30
  291. package/src/runtime/failure/store.js +7 -2
  292. package/src/runtime/feature-pointer.js +174 -0
  293. package/src/runtime/feature-resolve.js +13 -2
  294. package/src/runtime/fleet/command.js +77 -0
  295. package/src/runtime/fleet/projects.js +178 -0
  296. package/src/runtime/fleet/tree.js +383 -0
  297. package/src/runtime/freshness.js +33 -3
  298. package/src/runtime/git-memo.js +46 -0
  299. package/src/runtime/guidance/ablation.js +427 -0
  300. package/src/runtime/health.js +624 -18
  301. package/src/runtime/history-compactor.js +13 -3
  302. package/src/runtime/implementation-gate.js +281 -26
  303. package/src/runtime/intake/engine.js +677 -0
  304. package/src/runtime/intake/index.js +136 -0
  305. package/src/runtime/intake/manifest.js +140 -0
  306. package/src/runtime/intake/taxonomy.js +206 -0
  307. package/src/runtime/inventory/coverage.js +1 -1
  308. package/src/runtime/inventory/index.js +1 -1
  309. package/src/runtime/inventory/precedence.js +2 -2
  310. package/src/runtime/inventory/siblings.js +6 -4
  311. package/src/runtime/knowledge/code-corpus.js +277 -0
  312. package/src/runtime/knowledge/code-lexical.js +130 -0
  313. package/src/runtime/knowledge/code-retrieval.js +307 -0
  314. package/src/runtime/knowledge/code-validation.js +106 -0
  315. package/src/runtime/knowledge/gp3-gate.js +74 -0
  316. package/src/runtime/knowledge/graph-adapter.js +288 -0
  317. package/src/runtime/knowledge/graph-fallback.js +394 -0
  318. package/src/runtime/knowledge/hybrid.js +136 -8
  319. package/src/runtime/knowledge/retrieval.js +34 -1
  320. package/src/runtime/knowledge/rtk-compress.js +77 -0
  321. package/src/runtime/knowledge/semble-bridge.py +106 -0
  322. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  323. package/src/runtime/knowledge/semble-provider.js +365 -0
  324. package/src/runtime/lifecycle/cli.js +88 -10
  325. package/src/runtime/lifecycle/event-store.js +8 -6
  326. package/src/runtime/lifecycle/followup.js +38 -7
  327. package/src/runtime/lifecycle/overview.js +26 -2
  328. package/src/runtime/lifecycle/report-store.js +8 -10
  329. package/src/runtime/lifecycle/retention.js +95 -31
  330. package/src/runtime/lifecycle/root.js +9 -1
  331. package/src/runtime/lifecycle/status.js +34 -17
  332. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  333. package/src/runtime/mask.js +134 -7
  334. package/src/runtime/mcp-consultations.js +40 -6
  335. package/src/runtime/model-router.js +79 -7
  336. package/src/runtime/models/catalogue.js +191 -0
  337. package/src/runtime/models/command.js +153 -0
  338. package/src/runtime/off-words.js +12 -0
  339. package/src/runtime/outcome.js +2 -2
  340. package/src/runtime/packages/command.js +1009 -0
  341. package/src/runtime/packages/contributions.js +116 -0
  342. package/src/runtime/packages/digest.js +132 -0
  343. package/src/runtime/packages/fetch.js +182 -0
  344. package/src/runtime/packages/grants.js +192 -0
  345. package/src/runtime/packages/index-file.js +134 -0
  346. package/src/runtime/packages/instruction.js +90 -0
  347. package/src/runtime/packages/manifest.js +331 -0
  348. package/src/runtime/packages/points.js +487 -0
  349. package/src/runtime/packages/programs.js +216 -0
  350. package/src/runtime/packages/scaffold.js +277 -0
  351. package/src/runtime/packages/source.js +90 -0
  352. package/src/runtime/packages/state.js +164 -0
  353. package/src/runtime/packages/store.js +449 -0
  354. package/src/runtime/packages/tar.js +106 -0
  355. package/src/runtime/packages/view.js +406 -0
  356. package/src/runtime/plan-check.js +59 -0
  357. package/src/runtime/plan-content.js +324 -0
  358. package/src/runtime/policy-init.js +118 -0
  359. package/src/runtime/profiles/doctor.js +96 -0
  360. package/src/runtime/profiles/resolve.js +244 -0
  361. package/src/runtime/profiles/rollback.js +254 -0
  362. package/src/runtime/profiles/sampler.js +41 -0
  363. package/src/runtime/readiness-record.js +16 -11
  364. package/src/runtime/readiness.js +46 -5
  365. package/src/runtime/research-request.js +50 -25
  366. package/src/runtime/retrieval-plan.js +10 -30
  367. package/src/runtime/retrieval-record.js +75 -5
  368. package/src/runtime/review/command.js +246 -0
  369. package/src/runtime/review/dominance.js +68 -0
  370. package/src/runtime/review/findings.js +434 -0
  371. package/src/runtime/review/identity.js +255 -0
  372. package/src/runtime/review/protocol-command.js +109 -0
  373. package/src/runtime/review/protocols.js +405 -0
  374. package/src/runtime/review/resolve-protocol.js +302 -0
  375. package/src/runtime/review/start.js +530 -0
  376. package/src/runtime/roadmap/attendance.js +137 -0
  377. package/src/runtime/roadmap/facts.js +479 -0
  378. package/src/runtime/roadmap/gates.js +273 -0
  379. package/src/runtime/roadmap/loop.js +1719 -0
  380. package/src/runtime/roadmap/merge.js +390 -0
  381. package/src/runtime/roadmap/rows.js +1122 -0
  382. package/src/runtime/roadmap/seed.js +1063 -0
  383. package/src/runtime/roadmap/worktree-cleanup.js +147 -0
  384. package/src/runtime/rules-report.js +336 -0
  385. package/src/runtime/scaffold/artifacts.js +60 -9
  386. package/src/runtime/scaffold/generate.js +21 -9
  387. package/src/runtime/settings/autopilot.js +106 -0
  388. package/src/runtime/settings/cli.js +280 -0
  389. package/src/runtime/settings/config-write.js +314 -0
  390. package/src/runtime/settings/files.js +271 -0
  391. package/src/runtime/settings/legacy.js +154 -0
  392. package/src/runtime/settings/lexical.js +56 -0
  393. package/src/runtime/settings/prepared-run.js +269 -0
  394. package/src/runtime/settings/project-layers.js +118 -0
  395. package/src/runtime/settings/refs.js +288 -0
  396. package/src/runtime/settings/registry.js +553 -0
  397. package/src/runtime/settings/resolve.js +713 -0
  398. package/src/runtime/settings/shared.js +37 -0
  399. package/src/runtime/settings/worker-billing.js +107 -0
  400. package/src/runtime/settings/write.js +269 -0
  401. package/src/runtime/slot-command.js +78 -0
  402. package/src/runtime/slots.js +671 -0
  403. package/src/runtime/source-version.js +1 -0
  404. package/src/runtime/state-root.js +217 -0
  405. package/src/runtime/storage/cli.js +12 -5
  406. package/src/runtime/storage/engine.js +9 -2
  407. package/src/runtime/storage/registry.js +14 -1
  408. package/src/runtime/storage/roots.js +66 -16
  409. package/src/runtime/storage/rules.js +82 -10
  410. package/src/runtime/storage/upkeep.js +10 -2
  411. package/src/runtime/storage/work-status.js +245 -26
  412. package/src/runtime/task-attempts.js +589 -69
  413. package/src/runtime/task-classifier.js +85 -14
  414. package/src/runtime/task-graph.js +373 -0
  415. package/src/runtime/task-run.js +778 -0
  416. package/src/runtime/task-scope.js +176 -55
  417. package/src/runtime/task-sources.js +147 -0
  418. package/src/runtime/task-state.js +373 -64
  419. package/src/runtime/team/admission.js +301 -0
  420. package/src/runtime/team/envelope.js +324 -0
  421. package/src/runtime/team/review-guard.js +156 -0
  422. package/src/runtime/trace/analyze.js +427 -0
  423. package/src/runtime/trace/baseline.js +770 -0
  424. package/src/runtime/trace/ledger.js +63 -140
  425. package/src/runtime/trace/otlp-export.js +568 -0
  426. package/src/runtime/trace/otlp-map.js +481 -0
  427. package/src/runtime/trace/spans.js +745 -0
  428. package/src/runtime/trace/telemetry.js +225 -0
  429. package/src/runtime/trace/views.js +1 -0
  430. package/src/runtime/transcripts/command.js +98 -0
  431. package/src/runtime/transcripts/cursor.js +326 -0
  432. package/src/runtime/transcripts/read.js +126 -0
  433. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  434. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  435. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  436. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  437. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  438. package/src/runtime/transcripts/registry.js +161 -0
  439. package/src/runtime/transcripts/stats.js +161 -0
  440. package/src/runtime/verb-view.js +267 -0
  441. package/src/runtime/verification/check-key.js +628 -0
  442. package/src/runtime/verification/contract-runner.js +546 -11
  443. package/src/runtime/verification/engine.js +499 -54
  444. package/src/runtime/verification/impact.js +617 -0
  445. package/src/runtime/verification/inflight.js +205 -0
  446. package/src/runtime/verification/registry.js +176 -0
  447. package/src/runtime/verification/reuse.js +184 -0
  448. package/src/runtime/verification/telemetry-emit.js +254 -0
  449. package/src/runtime/verification/test-selection.js +67 -7
  450. package/src/runtime/worker/active.js +90 -0
  451. package/src/runtime/worker/cancel.js +222 -0
  452. package/src/runtime/worker/catalogue.js +122 -0
  453. package/src/runtime/worker/command.js +677 -0
  454. package/src/runtime/worker/evidence.js +288 -0
  455. package/src/runtime/worker/launch.js +256 -0
  456. package/src/runtime/worker/models.js +137 -0
  457. package/src/runtime/worker/parsers.js +218 -0
  458. package/src/runtime/worker/probes/index.js +706 -0
  459. package/src/runtime/worker/process-tree.js +415 -0
  460. package/src/runtime/worker/quota.js +43 -0
  461. package/src/runtime/worker/readiness.js +713 -0
  462. package/src/runtime/worker/run-store.js +166 -0
  463. package/src/runtime/worker/supervisor.js +541 -0
  464. package/src/runtime/worker/worktree-check.js +252 -0
  465. package/src/runtime/workflow-engine.js +5 -1
  466. package/src/runtime/workflow-orchestrator.js +610 -67
  467. package/src/runtime/worktree.js +149 -22
  468. package/src/state/index.js +1 -1
  469. package/src/state/lockfile.js +64 -10
  470. package/src/state/run-lock.js +1 -1
  471. package/types/node-commonjs.d.ts +106 -7
  472. package/core/harnesses/claude/hooks/pre-bash-guard.sh +0 -10
  473. package/core/harnesses/codex/hooks/pre-bash-guard.sh +0 -10
  474. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  475. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  476. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  477. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  478. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  479. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  480. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  481. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  482. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  483. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  484. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  485. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +0 -24
  486. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +0 -91
  487. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +0 -378
  488. package/core/shared/guidance/FLAGS.md +0 -25
  489. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  490. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  491. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  492. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  493. package/src/adapters/gemini/hooks.js +0 -251
  494. package/src/adapters/gemini/index.js +0 -429
@@ -21,6 +21,14 @@
21
21
  "Bash(git push --force*:*)",
22
22
  "Bash(git reset --hard*:*)",
23
23
  "Bash(git clean -fd*:*)"
24
+ ],
25
+ "ask": [
26
+ "Bash(git push:*)",
27
+ "Bash(git tag:*)",
28
+ "Bash(git * push:*)",
29
+ "Bash(git * tag:*)",
30
+ "Bash(git * push)",
31
+ "Bash(git * tag)"
24
32
  ]
25
33
  },
26
34
  "alwaysThinkingEnabled": true,
@@ -87,15 +95,6 @@
87
95
  }
88
96
  ],
89
97
  "PreToolUse": [
90
- {
91
- "matcher": "Bash",
92
- "hooks": [
93
- {
94
- "type": "command",
95
- "command": "~/.claude/hooks/pre-bash-guard.sh"
96
- }
97
- ]
98
- },
99
98
  {
100
99
  "matcher": "mcp__.*",
101
100
  "hooks": [
@@ -116,6 +115,15 @@
116
115
  }
117
116
  ],
118
117
  "PostToolUse": [
118
+ {
119
+ "matcher": "Bash",
120
+ "hooks": [
121
+ {
122
+ "type": "command",
123
+ "command": "~/.claude/hooks/post-shell-observe.sh PostToolUse"
124
+ }
125
+ ]
126
+ },
119
127
  {
120
128
  "matcher": "Edit",
121
129
  "hooks": [
@@ -176,6 +184,15 @@
176
184
  }
177
185
  ],
178
186
  "PostToolUseFailure": [
187
+ {
188
+ "matcher": "Bash",
189
+ "hooks": [
190
+ {
191
+ "type": "command",
192
+ "command": "~/.claude/hooks/post-shell-observe.sh PostToolUseFailure"
193
+ }
194
+ ]
195
+ },
179
196
  {
180
197
  "matcher": ".*",
181
198
  "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
  """
@@ -43,16 +43,6 @@
43
43
  }
44
44
  ],
45
45
  "PreToolUse": [
46
- {
47
- "matcher": "^Bash$",
48
- "hooks": [
49
- {
50
- "type": "command",
51
- "command": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.codex/hooks/pre-bash-guard.sh\" ] && printf '%s/.codex/hooks/pre-bash-guard.sh' \"$root\" || printf '%s/hooks/pre-bash-guard.sh' \"${CODEX_HOME:-$HOME/.codex}\")\"",
52
- "statusMessage": "Checking command safety"
53
- }
54
- ]
55
- },
56
46
  {
57
47
  "matcher": "^mcp__.*",
58
48
  "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
  # 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
@@ -3,7 +3,10 @@
3
3
  set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
5
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"}}'
6
+ # D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies.
7
+ if [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
8
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
9
+ fi
7
10
  exit 0
8
11
  fi
9
12
  doflow_bridge codex PreToolUse mcp-tool-guard
@@ -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,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
@@ -3,7 +3,10 @@
3
3
  set -uo pipefail
4
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
5
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"}}'
6
+ # D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies.
7
+ if [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
8
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
9
+ fi
7
10
  exit 0
8
11
  fi
9
12
  doflow_bridge codex PreToolUse pre-implementation-gate
@@ -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,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
  # Codex front door: subagent-audit through the shared lifecycle bridge.
3
4
  set -uo pipefail
4
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front-door helpers: translate a camelCase Copilot hook payload into the canonical
3
+ # Claude-style payload the shared lifecycle bridge and policies read, and render nothing else.
4
+ # Installed by the doflow CLI and overwritten on update; do not edit an installed copy.
5
+ #
6
+ # Payload facts are from the live capture of 2026-10-27 (Copilot CLI 1.0.103), not the docs alone:
7
+ # - camelCase fields: sessionId, toolName, toolArgs, transcriptPath, agentId, agentType, parentAgentId
8
+ # - toolArgs arrives as a JSON OBJECT for bash/skill/task and as a raw STRING for apply_patch (the
9
+ # freeform patch text). The docs type it `unknown`; this accepts an object, a JSON string and a
10
+ # raw string.
11
+ # - tool names are lowercase: bash, apply_patch, edit, task, skill
12
+
13
+ # copilot_bridge_payload <event>: native payload on stdin, canonical payload on stdout. <event> is
14
+ # the PascalCase name the bridge and policies know (PreToolUse, Stop, SessionStart, ...). When jq is
15
+ # missing or rejects the payload the original payload is printed unchanged.
16
+ # - tool_name: bash|powershell -> Bash, edit -> Edit, create -> Write, apply_patch stays; any
17
+ # other name passes through unchanged, so an unmapped tool fails open as it does without a bridge
18
+ # - tool_input: toolArgs as an object (a JSON string is parsed; any other string becomes
19
+ # {command: <string>}, which is where the shared policies read an apply_patch body); for Edit
20
+ # and Write tool_input.file_path is copied from path, filePath, filename or target_file when
21
+ # absent (only path and file_path are captured; an edit whose target is still undecodable is
22
+ # denied by the bridge, not allowed)
23
+ # - response (subagentStop) -> last_assistant_message
24
+ copilot_bridge_payload() {
25
+ local event="${1:-}" payload rewritten
26
+ payload=$(cat)
27
+ if command -v jq >/dev/null 2>&1 \
28
+ && rewritten=$(printf '%s' "$payload" | jq -c --arg event "$event" '
29
+ (.toolName // .tool_name // "") as $raw
30
+ | ($raw | ascii_downcase) as $t
31
+ | (if $t == "bash" or $t == "powershell" then "Bash"
32
+ elif $t == "edit" then "Edit"
33
+ elif $t == "create" then "Write"
34
+ else $raw end) as $name
35
+ | ((.toolArgs // .tool_input) as $a
36
+ | if $a == null then null
37
+ elif ($a | type) == "object" then $a
38
+ elif ($a | type) == "string" then ((try ($a | fromjson) catch $a) | if type == "object" then . else {command: $a} end)
39
+ else {command: ($a | tostring)} end) as $input
40
+ | (if ($name == "Edit" or $name == "Write") and ($input | type) == "object" and ($input.file_path == null) and (($input.path // $input.filePath // $input.filename // $input.target_file) != null)
41
+ then $input + {file_path: ($input.path // $input.filePath // $input.filename // $input.target_file)} else $input end) as $input
42
+ | {
43
+ hook_event_name: $event,
44
+ session_id: (.sessionId // .session_id),
45
+ cwd: .cwd,
46
+ transcript_path: (.transcriptPath // .transcript_path),
47
+ stop_hook_active: .stop_hook_active,
48
+ stop_reason: (.stopReason // .stop_reason),
49
+ source: .source,
50
+ reason: .reason,
51
+ prompt: .prompt,
52
+ initial_prompt: (.initialPrompt // .initial_prompt),
53
+ agent_id: (.agentId // .agent_id),
54
+ agent_type: (.agentType // .agent_type),
55
+ agent_name: (.agentName // .agent_name),
56
+ parent_agent_id: (.parentAgentId // .parent_agent_id),
57
+ last_assistant_message: (.response // .last_assistant_message),
58
+ tool_name: (if $raw == "" then null else $name end),
59
+ tool_input: $input,
60
+ tool_result: (.toolResult // .tool_result)
61
+ }
62
+ | with_entries(select(.value != null))
63
+ ' 2>/dev/null) \
64
+ && [ -n "$rewritten" ]; then
65
+ printf '%s\n' "$rewritten"
66
+ else
67
+ printf '%s\n' "$payload"
68
+ fi
69
+ }
70
+
71
+ # copilot_front_door <script-dir> <event> <policy> <fail>: run one shared policy through the bridge.
72
+ # <fail> is `deny` for a pre-tool policy (a missing bridge denies the tool call only under strict-1)
73
+ # or `open` for every other event.
74
+ copilot_front_door() {
75
+ local dir="$1" event="$2" policy="$3" fail="${4:-open}" raw payload bridge status=0
76
+ raw=$(cat)
77
+ if [ "$event" = Stop ] && command -v jq >/dev/null 2>&1 \
78
+ && [ -n "$(printf '%s' "$raw" | jq -r '.agentId // .agent_id // empty' 2>/dev/null)" ]; then
79
+ return 0 # a subagent's own stop; SubagentStop covers it, as it does for Claude
80
+ fi
81
+ payload=$(copilot_bridge_payload "$event" <<<"$raw")
82
+ bridge="$dir/../../.doflow/shared/hooks/bridge/bridge.sh"
83
+ # User hooks under a custom $COPILOT_HOME sit beside no .doflow; the bridge is then in $HOME/.doflow.
84
+ [ -f "$bridge" ] || bridge="${HOME:-}/.doflow/shared/hooks/bridge/bridge.sh"
85
+ if [ ! -f "$bridge" ] || ! . "$bridge" 2>/dev/null; then
86
+ # D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies a pre-tool call.
87
+ if [ "$fail" = deny ] && [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
88
+ printf '%s\n' '{"permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t copilot"}'
89
+ fi
90
+ return 0
91
+ fi
92
+ doflow_bridge copilot "$event" "$policy" <<<"$payload" || status=$?
93
+ return "$status"
94
+ }
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: mcp-tool-guard through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" PreToolUse mcp-tool-guard deny
9
+ exit $?
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: pre-implementation-gate through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" PreToolUse pre-implementation-gate deny
9
+ exit $?
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: session-context through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" SessionStart session-context open
9
+ exit $?
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: stop-check through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" Stop stop-check open
9
+ exit $?
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: subagent-audit (start) through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" SubagentStart subagent-audit open
9
+ exit $?
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ # Copilot CLI front door: subagent-audit (stop) through the shared lifecycle bridge.
3
+ set -uo pipefail
4
+ export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
5
+ here="$(cd "$(dirname "$0")" && pwd)"
6
+ # shellcheck source=doflow-lib.sh
7
+ . "$here/doflow-lib.sh"
8
+ copilot_front_door "$here" SubagentStop subagent-audit open
9
+ exit $?