@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,6 +1,7 @@
1
1
  #!/usr/bin/env bash
2
- # Codex front door: reuse the canonical context policy with the Codex output envelope.
3
- # The shared policy selects Codex's hookSpecificOutput shape from this attribution.
4
- set -euo pipefail
2
+ # Codex front door: user-prompt-submit through the shared lifecycle bridge.
3
+ set -uo pipefail
5
4
  export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
6
- 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 codex UserPromptSubmit user-prompt-submit
7
+ exit $?
@@ -0,0 +1,93 @@
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, as Copilot's
73
+ # preToolUse hooks are fail-closed on a non-zero exit anyway) 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
+ if [ "$fail" = deny ]; then
87
+ printf '%s\n' '{"permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t copilot"}'
88
+ fi
89
+ return 0
90
+ fi
91
+ doflow_bridge copilot "$event" "$policy" <<<"$payload" || status=$?
92
+ return "$status"
93
+ }
@@ -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-bash-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 pre-bash-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 $?
@@ -0,0 +1,57 @@
1
+ {
2
+ "version": 1,
3
+ "hooks": {
4
+ "sessionStart": [
5
+ {
6
+ "type": "command",
7
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-session-start.sh\" ] && printf '%s/.github/hooks/doflow-session-start.sh' \"$root\" || printf '%s/hooks/doflow-session-start.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
8
+ "cwd": ".",
9
+ "timeoutSec": 10
10
+ }
11
+ ],
12
+ "preToolUse": [
13
+ {
14
+ "type": "command",
15
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-pre-implement-gate.sh\" ] && printf '%s/.github/hooks/doflow-pre-implement-gate.sh' \"$root\" || printf '%s/hooks/doflow-pre-implement-gate.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
16
+ "cwd": ".",
17
+ "timeoutSec": 20
18
+ },
19
+ {
20
+ "type": "command",
21
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-pre-bash-guard.sh\" ] && printf '%s/.github/hooks/doflow-pre-bash-guard.sh' \"$root\" || printf '%s/hooks/doflow-pre-bash-guard.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
22
+ "cwd": ".",
23
+ "timeoutSec": 20
24
+ },
25
+ {
26
+ "type": "command",
27
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-mcp-tool-guard.sh\" ] && printf '%s/.github/hooks/doflow-mcp-tool-guard.sh' \"$root\" || printf '%s/hooks/doflow-mcp-tool-guard.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
28
+ "cwd": ".",
29
+ "timeoutSec": 20
30
+ }
31
+ ],
32
+ "agentStop": [
33
+ {
34
+ "type": "command",
35
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-stop-check.sh\" ] && printf '%s/.github/hooks/doflow-stop-check.sh' \"$root\" || printf '%s/hooks/doflow-stop-check.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
36
+ "cwd": ".",
37
+ "timeoutSec": 30
38
+ }
39
+ ],
40
+ "subagentStart": [
41
+ {
42
+ "type": "command",
43
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-subagent-start.sh\" ] && printf '%s/.github/hooks/doflow-subagent-start.sh' \"$root\" || printf '%s/hooks/doflow-subagent-start.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
44
+ "cwd": ".",
45
+ "timeoutSec": 10
46
+ }
47
+ ],
48
+ "subagentStop": [
49
+ {
50
+ "type": "command",
51
+ "bash": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.github/hooks/doflow-subagent-stop.sh\" ] && printf '%s/.github/hooks/doflow-subagent-stop.sh' \"$root\" || printf '%s/hooks/doflow-subagent-stop.sh' \"${COPILOT_HOME:-$HOME/.copilot}\")\"",
52
+ "cwd": ".",
53
+ "timeoutSec": 10
54
+ }
55
+ ]
56
+ }
57
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "doflow",
3
3
  "description": "DoFlow main session: spec-driven delivery with lifecycle hooks and specialist dispatch",
4
- "prompt": "You are the DoFlow main session. Follow the DoFlow steering files under .kiro/steering (principles, rules, the spec-driven chain) and the skills under .kiro/skills. Dispatch specialist work by role to core-implementer, quality-guardian, spec-analyst, system-architect or research-writer, and keep decisions, verification and records in this session.\n",
4
+ "prompt": "You are the DoFlow main session. Follow the DoFlow steering files under .kiro/steering (principles, rules, the spec-driven chain) and the skills under .kiro/skills. Dispatch specialist work by role to core-implementer, delivery-lead, quality-guardian, reviewer, spec-analyst, system-architect or research-writer, and keep decisions, verification and records in this session.\n",
5
5
  "tools": [
6
6
  "*"
7
7
  ],
@@ -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}"
@@ -246,6 +264,7 @@ cwd_hash() {
246
264
  # Safe to call multiple times (mkdir -p is idempotent).
247
265
  ensure_session_dir() {
248
266
  local session_id="$1"
267
+ [ -n "$SESSION_DIR" ] || return 0
249
268
  mkdir -p "$SESSION_DIR/$session_id"
250
269
  echo "$SESSION_DIR/$session_id"
251
270
  }
@@ -255,6 +274,7 @@ ensure_session_dir() {
255
274
  ensure_project_dir() {
256
275
  local cwd="$1"
257
276
  local hash
277
+ [ -n "$PROJECTS_DIR" ] || return 0
258
278
  hash=$(cwd_hash "$cwd")
259
279
  mkdir -p "$PROJECTS_DIR/$hash"
260
280
  echo "$PROJECTS_DIR/$hash"
@@ -1,9 +1,25 @@
1
1
  #!/usr/bin/env bash
2
- # Kiro adapter: reuse the canonical mcp-tool-guard policy with Kiro attribution.
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
+ # Kiro front door: mcp-tool-guard through the shared lifecycle bridge.
3
4
  set -euo pipefail
4
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-kiro}"
6
+ here="$(dirname "$0")"
5
7
  # shellcheck source=lib.sh
6
- source "$(dirname "$0")/lib.sh"
7
- # Translate Kiro's payload (tool names, KIRO_SESSION_ID, assistant_response) to the canonical one.
8
- payload=$(kiro_bridge_payload)
9
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/mcp-tool-guard.sh" <<<"$payload"
8
+ source "$here/lib.sh"
9
+ raw=$(cat)
10
+ payload=$(kiro_bridge_payload <<<"$raw")
11
+ event="PreToolUse"
12
+ if command -v jq >/dev/null 2>&1; then event=$(printf '%s' "$raw" | jq -r '.hook_event_name // "PreToolUse"' 2>/dev/null) || event="PreToolUse"; fi
13
+ bridge="$here/../../.doflow/shared/hooks/bridge/bridge.sh"
14
+ if [ ! -f "$bridge" ]; then
15
+ printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2
16
+ exit 2
17
+ fi
18
+ . "$bridge" 2>/dev/null || { printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2; exit 2; }
19
+ if doflow_bridge kiro "$event" mcp-tool-guard <<<"$payload"; then
20
+ status=0
21
+ else
22
+ status=$?
23
+ fi
24
+ if [ "$status" -eq 2 ]; then printf '\n' >&2; fi
25
+ exit "$status"
@@ -1,9 +1,25 @@
1
1
  #!/usr/bin/env bash
2
- # Kiro adapter: reuse the canonical pre-bash-guard policy with Kiro attribution.
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
+ # Kiro front door: pre-bash-guard through the shared lifecycle bridge.
3
4
  set -euo pipefail
4
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-kiro}"
6
+ here="$(dirname "$0")"
5
7
  # shellcheck source=lib.sh
6
- source "$(dirname "$0")/lib.sh"
7
- # Translate Kiro's payload (tool names, KIRO_SESSION_ID, assistant_response) to the canonical one.
8
- payload=$(kiro_bridge_payload)
9
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/pre-bash-guard.sh" <<<"$payload"
8
+ source "$here/lib.sh"
9
+ raw=$(cat)
10
+ payload=$(kiro_bridge_payload <<<"$raw")
11
+ event="PreToolUse"
12
+ if command -v jq >/dev/null 2>&1; then event=$(printf '%s' "$raw" | jq -r '.hook_event_name // "PreToolUse"' 2>/dev/null) || event="PreToolUse"; fi
13
+ bridge="$here/../../.doflow/shared/hooks/bridge/bridge.sh"
14
+ if [ ! -f "$bridge" ]; then
15
+ printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2
16
+ exit 2
17
+ fi
18
+ . "$bridge" 2>/dev/null || { printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2; exit 2; }
19
+ if doflow_bridge kiro "$event" pre-bash-guard <<<"$payload"; then
20
+ status=0
21
+ else
22
+ status=$?
23
+ fi
24
+ if [ "$status" -eq 2 ]; then printf '\n' >&2; fi
25
+ exit "$status"
@@ -1,9 +1,25 @@
1
1
  #!/usr/bin/env bash
2
- # Kiro adapter: reuse the canonical pre-implementation-gate policy with Kiro attribution.
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
+ # Kiro front door: pre-implementation-gate through the shared lifecycle bridge.
3
4
  set -euo pipefail
4
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-kiro}"
6
+ here="$(dirname "$0")"
5
7
  # shellcheck source=lib.sh
6
- source "$(dirname "$0")/lib.sh"
7
- # Translate Kiro's payload (tool names, KIRO_SESSION_ID, assistant_response) to the canonical one.
8
- payload=$(kiro_bridge_payload)
9
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/pre-implementation-gate.sh" <<<"$payload"
8
+ source "$here/lib.sh"
9
+ raw=$(cat)
10
+ payload=$(kiro_bridge_payload <<<"$raw")
11
+ event="PreToolUse"
12
+ if command -v jq >/dev/null 2>&1; then event=$(printf '%s' "$raw" | jq -r '.hook_event_name // "PreToolUse"' 2>/dev/null) || event="PreToolUse"; fi
13
+ bridge="$here/../../.doflow/shared/hooks/bridge/bridge.sh"
14
+ if [ ! -f "$bridge" ]; then
15
+ printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2
16
+ exit 2
17
+ fi
18
+ . "$bridge" 2>/dev/null || { printf '%s\n' '[doflow] shared hooks lack the bridge; run: doflow update -t kiro' >&2; exit 2; }
19
+ if doflow_bridge kiro "$event" pre-implementation-gate <<<"$payload"; then
20
+ status=0
21
+ else
22
+ status=$?
23
+ fi
24
+ if [ "$status" -eq 2 ]; then printf '\n' >&2; fi
25
+ exit "$status"
@@ -1,9 +1,16 @@
1
1
  #!/usr/bin/env bash
2
- # Kiro adapter: reuse the canonical session-context policy with Kiro attribution.
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
+ # Kiro front door: session-context through the shared lifecycle bridge.
3
4
  set -euo pipefail
4
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-kiro}"
6
+ here="$(dirname "$0")"
5
7
  # shellcheck source=lib.sh
6
- source "$(dirname "$0")/lib.sh"
7
- # Translate Kiro's payload (tool names, KIRO_SESSION_ID, assistant_response) to the canonical one.
8
- payload=$(kiro_bridge_payload)
9
- exec bash "$(dirname "$0")/../../.doflow/shared/hooks/policies/session-context.sh" <<<"$payload"
8
+ source "$here/lib.sh"
9
+ raw=$(cat)
10
+ payload=$(kiro_bridge_payload <<<"$raw")
11
+ event="SessionStart"
12
+ if command -v jq >/dev/null 2>&1; then event=$(printf '%s' "$raw" | jq -r '.hook_event_name // "SessionStart"' 2>/dev/null) || event="SessionStart"; fi
13
+ bridge="$here/../../.doflow/shared/hooks/bridge/bridge.sh"
14
+ if [ ! -f "$bridge" ]; then exit 0; fi
15
+ . "$bridge" 2>/dev/null || exit 0
16
+ doflow_bridge kiro "$event" session-context <<<"$payload"
@@ -1,43 +1,35 @@
1
1
  #!/usr/bin/env bash
2
- # Kiro adapter: run the canonical stop-check policy and translate its verdict to the Kiro engine.
3
- #
4
- # The policy exits 2 to deny the stop. Kiro engines read a Stop hook differently:
5
- # - Kiro CLI V3 / IDE (payload carries session_id): exit 0 finishes the turn; exit 0 with stdout
6
- # JSON {"decision":"block","reason":"..."} starts another turn with that reason; exit 1 also
7
- # starts another turn; other codes finish without forwarding output. Exit 2 does NOT block.
8
- # So a policy deny becomes the JSON block on stdout with exit 0.
9
- # - Kiro CLI 2.x (payload has no session_id): exit 0 succeeded, any other code shows stderr to the
10
- # user as a warning. A policy deny is passed through as stderr with exit 2.
11
- # Every other policy outcome exits 0, never 1: V3 treats exit 1 as "continue another turn".
12
- # The policy blocks a given message once, so the continuation turn is not blocked again.
13
- # Docs: https://kiro.dev/docs/hooks/types/ , https://kiro.dev/docs/cli/v3/hooks-migration/
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
+ # Kiro Stop front door: translate the native payload, then render the bridge verdict for its engine.
14
4
  set -uo pipefail
15
5
  export DOFLOW_AGENT="${DOFLOW_AGENT:-kiro}"
16
6
  here="$(dirname "$0")"
17
7
  # shellcheck source=lib.sh
18
8
  source "$here/lib.sh"
19
- set +e # lib.sh enables errexit; the policy exit code is handled explicitly below
20
-
21
9
  raw=$(cat)
22
- # Translate Kiro's payload (tool names, KIRO_SESSION_ID, assistant_response) to the canonical one.
23
10
  payload=$(kiro_bridge_payload <<<"$raw")
24
-
25
- # V3 and the IDE send session_id in the payload; 2.x does not (the bridge injects it from the env).
26
11
  raw_sid=""
12
+ event="Stop"
27
13
  if command -v jq >/dev/null 2>&1; then
28
14
  raw_sid=$(printf '%s' "$raw" | jq -r '.session_id // empty' 2>/dev/null) || raw_sid=""
15
+ event=$(printf '%s' "$raw" | jq -r '.hook_event_name // "Stop"' 2>/dev/null) || event="Stop"
29
16
  fi
30
-
31
- # Capture the policy's stderr (stdout discarded) and its exit code without a temp file.
32
- errtext=$(bash "$here/../../.doflow/shared/hooks/policies/stop-check.sh" <<<"$payload" 2>&1 >/dev/null)
33
- rc=$?
34
-
35
- if [ "$rc" -eq 2 ]; then
36
- if [ -n "$raw_sid" ] && command -v jq >/dev/null 2>&1; then
37
- jq -n --arg reason "$errtext" '{decision: "block", reason: $reason}'
38
- exit 0
39
- fi
40
- printf '%s\n' "$errtext" >&2
41
- exit 2
17
+ if [ -n "$raw_sid" ]; then
18
+ export DOFLOW_KIRO_ENGINE=v3
19
+ else
20
+ export DOFLOW_KIRO_ENGINE=2x
42
21
  fi
43
- exit 0
22
+ bridge="$here/../../.doflow/shared/hooks/bridge/bridge.sh"
23
+ if [ ! -f "$bridge" ]; then exit 0; fi
24
+ . "$bridge" 2>/dev/null || exit 0
25
+ exec 4>&1
26
+ if bridge_stderr=$(doflow_bridge kiro "$event" stop-check <<<"$payload" 2>&1 1>&4); then
27
+ status=0
28
+ else
29
+ status=$?
30
+ fi
31
+ exec 4>&-
32
+ if [ "$status" -eq 2 ] && [ "$DOFLOW_KIRO_ENGINE" = 2x ]; then
33
+ printf '%s\n' "$bridge_stderr" >&2
34
+ fi
35
+ exit "$status"