@khoavu882/doflow 2.0.0-beta.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  3. package/core/.antigravity-plugin/plugin.json +1 -2
  4. package/core/.claude-plugin/plugin.json +1 -1
  5. package/core/.codex-plugin/plugin.json +1 -1
  6. package/core/.plugin/plugin.json +1 -1
  7. package/core/harnesses/claude/hooks/lib.sh +43 -24
  8. package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
  9. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  10. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  11. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  12. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  13. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  14. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  15. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  16. package/core/harnesses/claude/settings/settings.json +18 -0
  17. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  18. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  19. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  20. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  21. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  22. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  23. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  24. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  25. package/core/harnesses/codex/hooks/lib.sh +44 -25
  26. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  27. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  28. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  29. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  30. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  31. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  32. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  33. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  34. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  35. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  36. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  39. package/core/harnesses/kiro/agents/doflow.json +1 -1
  40. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  41. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
  42. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
  43. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
  44. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  45. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  46. package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
  47. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
  48. package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
  49. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  50. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  51. package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
  52. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  53. package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
  54. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  55. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  56. package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
  57. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  58. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  59. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  60. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  61. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  62. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
  63. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
  64. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
  65. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  66. package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
  67. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
  68. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  69. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  70. package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
  71. package/core/harnesses/shared/locator/doflow-run +2 -3
  72. package/core/registry/advice.json +3 -3
  73. package/core/registry/assets.json +55 -82
  74. package/core/registry/capabilities.json +12 -0
  75. package/core/registry/contracts.json +58 -31
  76. package/core/registry/contribution-points.json +32 -0
  77. package/core/registry/gates.json +32 -0
  78. package/core/registry/guidance-caps.json +40 -0
  79. package/core/registry/harnesses.json +1442 -363
  80. package/core/registry/lifecycle.json +485 -304
  81. package/core/registry/mcp.json +5 -1
  82. package/core/registry/models.json +7 -1
  83. package/core/registry/package-templates/README.md +19 -0
  84. package/core/registry/package-templates/agent/files/agent.md +9 -0
  85. package/core/registry/package-templates/agent/template.json +4 -0
  86. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  87. package/core/registry/package-templates/capability-provider/template.json +11 -0
  88. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  89. package/core/registry/package-templates/debate-preset/template.json +4 -0
  90. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  91. package/core/registry/package-templates/review-preset/template.json +4 -0
  92. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  93. package/core/registry/package-templates/skill/template.json +4 -0
  94. package/core/registry/package-templates/worker/files/worker.json +92 -0
  95. package/core/registry/package-templates/worker/template.json +11 -0
  96. package/core/registry/packages/doflow/doflow-package.json +15 -0
  97. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  98. package/core/registry/protocols.json +61 -0
  99. package/core/registry/routes.json +17 -0
  100. package/core/registry/rules.json +431 -0
  101. package/core/registry/settings.json +276 -0
  102. package/core/registry/storage.json +679 -31
  103. package/core/registry/telemetry.json +236 -0
  104. package/core/registry/transcripts.json +142 -0
  105. package/core/registry/verification.json +76 -1
  106. package/core/registry/workflows.json +55 -0
  107. package/core/shared/agent-specs/core-implementer.md +3 -0
  108. package/core/shared/agent-specs/delivery-lead.md +68 -0
  109. package/core/shared/agent-specs/quality-guardian.md +5 -1
  110. package/core/shared/agent-specs/research-writer.md +10 -3
  111. package/core/shared/agent-specs/reviewer.md +53 -0
  112. package/core/shared/agent-specs/spec-analyst.md +5 -6
  113. package/core/shared/agent-specs/system-architect.md +5 -1
  114. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  115. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  116. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  117. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  118. package/core/shared/guidance/pointers/codex.md +1 -4
  119. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  120. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  121. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  122. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  123. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  124. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  125. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  126. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  127. package/core/shared/guidance/rules/RULES.md +45 -0
  128. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  129. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  130. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  131. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  132. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  133. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  134. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  135. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  136. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  137. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  138. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  139. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  140. package/core/shared/scripts/doflow/bin/doflow-run +149 -34
  141. package/core/shared/skills/do/SKILL.md +12 -10
  142. package/core/shared/skills/do/references/advice_calls.md +26 -0
  143. package/core/shared/skills/do/references/pm_routing.md +1 -2
  144. package/core/shared/skills/do/references/program_mode.md +31 -0
  145. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  146. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  147. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  148. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  149. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  150. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  151. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  152. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  153. package/core/shared/skills/do-design/SKILL.md +18 -17
  154. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  155. package/core/shared/skills/do-document/SKILL.md +11 -1
  156. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  157. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  158. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  159. package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
  160. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  161. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  162. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  163. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  164. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  165. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  166. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  167. package/core/shared/skills/do-flow/SKILL.md +8 -9
  168. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  169. package/core/shared/skills/do-git/SKILL.md +4 -0
  170. package/core/shared/skills/do-implement/SKILL.md +4 -7
  171. package/core/shared/skills/do-plan/SKILL.md +26 -15
  172. package/core/shared/skills/do-test/SKILL.md +7 -4
  173. package/core/shared/templates/doflow/constitution-template.md +9 -3
  174. package/core/shared/templates/doflow/data-model-template.md +1 -1
  175. package/core/shared/templates/doflow/design-template.md +113 -16
  176. package/core/shared/templates/doflow/plan-template.md +11 -10
  177. package/core/shared/templates/doflow/question-log-template.md +14 -2
  178. package/core/shared/templates/doflow/requirement-template.md +1 -1
  179. package/core/worker-evidence/antigravity/checks.json +14 -0
  180. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  181. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  182. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  183. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  184. package/core/worker-evidence/codex/checks.json +38 -0
  185. package/package.json +10 -6
  186. package/src/adapters/antigravity/index.js +143 -66
  187. package/src/adapters/claude/index.js +24 -4
  188. package/src/adapters/codex/agents.js +25 -15
  189. package/src/adapters/codex/index.js +48 -13
  190. package/src/adapters/codex/native-projection.js +6 -2
  191. package/src/adapters/copilot/index.js +58 -23
  192. package/src/adapters/copy-tree.js +290 -44
  193. package/src/adapters/guidance-manifest.js +71 -0
  194. package/src/adapters/guidance-pointer.js +19 -0
  195. package/src/adapters/hook-commands.js +6 -10
  196. package/src/adapters/index.js +1 -0
  197. package/src/adapters/kiro/index.js +23 -12
  198. package/src/adapters/opencode/index.js +8 -8
  199. package/src/adapters/pi/hooks.js +2 -1
  200. package/src/adapters/pi/index.js +14 -7
  201. package/src/adapters/resolve-source.js +26 -2
  202. package/src/cli/commands/install.js +2 -1
  203. package/src/cli/commands/reconcile.js +53 -9
  204. package/src/cli/commands/remove.js +2 -2
  205. package/src/cli/commands/rollback.js +6 -3
  206. package/src/cli/commands/self-update.js +18 -9
  207. package/src/cli/commands/status.js +21 -2
  208. package/src/cli/commands/ui.js +99 -0
  209. package/src/cli/commands/update.js +2 -1
  210. package/src/cli/index.js +322 -29
  211. package/src/cli/runtime-commands.js +209 -57
  212. package/src/cli/shared.js +0 -2
  213. package/src/helper/git.js +1 -1
  214. package/src/helper/guardrails.js +1 -1
  215. package/src/helper/marker-merge.js +31 -13
  216. package/src/helper/package-ids.js +37 -0
  217. package/src/helper/semver.js +94 -0
  218. package/src/install/backup.js +105 -15
  219. package/src/install/context.js +1 -1
  220. package/src/install/targets.js +31 -16
  221. package/src/lifecycle/coverage.js +20 -3
  222. package/src/lifecycle/hook-tier.js +160 -0
  223. package/src/lifecycle/index.js +412 -78
  224. package/src/lifecycle/retired-harnesses.js +318 -0
  225. package/src/lifecycle/view.js +35 -15
  226. package/src/registry/index.js +551 -26
  227. package/src/registry/worker-ids.js +45 -0
  228. package/src/release/build-package.js +0 -3
  229. package/src/release/docs-blocks.js +492 -0
  230. package/src/release/preflight.js +425 -0
  231. package/src/release/rehearse.js +401 -0
  232. package/src/release/release-workflow.js +733 -0
  233. package/src/release/sync-plugin-versions.js +43 -7
  234. package/src/runtime/advice/bench-gate.js +25 -0
  235. package/src/runtime/advice/cli.js +59 -16
  236. package/src/runtime/advice/client.js +32 -9
  237. package/src/runtime/advice/config.js +98 -133
  238. package/src/runtime/advice/doctor.js +1 -1
  239. package/src/runtime/advice/elevation.js +97 -0
  240. package/src/runtime/advice/endpoint-guard.js +9 -3
  241. package/src/runtime/advice/mode.js +37 -0
  242. package/src/runtime/advice/record.js +18 -5
  243. package/src/runtime/advice/registry.js +4 -1
  244. package/src/runtime/advice/shadow-config.js +229 -0
  245. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  246. package/src/runtime/brief-rules.js +81 -0
  247. package/src/runtime/brief-tools.js +111 -34
  248. package/src/runtime/candidate.js +20 -11
  249. package/src/runtime/capabilities/executor.js +450 -0
  250. package/src/runtime/capabilities/loopback.js +41 -0
  251. package/src/runtime/capabilities/sanitizer.js +88 -0
  252. package/src/runtime/capability-router.js +135 -3
  253. package/src/runtime/checkouts.js +73 -11
  254. package/src/runtime/claims.js +13 -7
  255. package/src/runtime/cli.js +196 -19
  256. package/src/runtime/config-home.js +42 -0
  257. package/src/runtime/context/arbitrate.js +767 -0
  258. package/src/runtime/context/delivery-store.js +4 -6
  259. package/src/runtime/context/emission-rules.js +118 -0
  260. package/src/runtime/context/identity.js +227 -0
  261. package/src/runtime/context/primary-command.js +117 -0
  262. package/src/runtime/context/primary.js +344 -0
  263. package/src/runtime/context/summary-store.js +655 -0
  264. package/src/runtime/context-pack.js +154 -78
  265. package/src/runtime/decision-register.js +13 -4
  266. package/src/runtime/dispatch/admission.js +392 -0
  267. package/src/runtime/dispatch/attempt-end.js +274 -0
  268. package/src/runtime/dispatch/command.js +628 -0
  269. package/src/runtime/dispatch/controls.js +904 -0
  270. package/src/runtime/dispatch/envelope.js +276 -0
  271. package/src/runtime/dispatch/grants.js +310 -0
  272. package/src/runtime/dispatch/integrate.js +617 -0
  273. package/src/runtime/dispatch/loop.js +1835 -0
  274. package/src/runtime/dispatch/store.js +352 -0
  275. package/src/runtime/dispatch/verify-run.js +201 -0
  276. package/src/runtime/evidence-ledger.js +34 -7
  277. package/src/runtime/failure/capture.js +3 -1
  278. package/src/runtime/failure/cli.js +25 -9
  279. package/src/runtime/failure/home.js +57 -30
  280. package/src/runtime/failure/store.js +7 -2
  281. package/src/runtime/feature-pointer.js +174 -0
  282. package/src/runtime/feature-resolve.js +13 -2
  283. package/src/runtime/fleet/command.js +77 -0
  284. package/src/runtime/fleet/projects.js +178 -0
  285. package/src/runtime/fleet/tree.js +383 -0
  286. package/src/runtime/freshness.js +33 -3
  287. package/src/runtime/git-memo.js +46 -0
  288. package/src/runtime/guidance/ablation.js +427 -0
  289. package/src/runtime/health.js +565 -17
  290. package/src/runtime/history-compactor.js +13 -3
  291. package/src/runtime/implementation-gate.js +277 -22
  292. package/src/runtime/inventory/coverage.js +1 -1
  293. package/src/runtime/inventory/index.js +1 -1
  294. package/src/runtime/inventory/precedence.js +2 -2
  295. package/src/runtime/inventory/siblings.js +6 -4
  296. package/src/runtime/knowledge/code-corpus.js +277 -0
  297. package/src/runtime/knowledge/code-lexical.js +130 -0
  298. package/src/runtime/knowledge/code-retrieval.js +307 -0
  299. package/src/runtime/knowledge/code-validation.js +106 -0
  300. package/src/runtime/knowledge/gp3-gate.js +74 -0
  301. package/src/runtime/knowledge/graph-adapter.js +288 -0
  302. package/src/runtime/knowledge/graph-fallback.js +394 -0
  303. package/src/runtime/knowledge/hybrid.js +136 -8
  304. package/src/runtime/knowledge/retrieval.js +34 -1
  305. package/src/runtime/knowledge/rtk-compress.js +77 -0
  306. package/src/runtime/knowledge/semble-bridge.py +106 -0
  307. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  308. package/src/runtime/knowledge/semble-provider.js +365 -0
  309. package/src/runtime/lifecycle/cli.js +16 -6
  310. package/src/runtime/lifecycle/event-store.js +8 -6
  311. package/src/runtime/lifecycle/followup.js +6 -1
  312. package/src/runtime/lifecycle/overview.js +24 -1
  313. package/src/runtime/lifecycle/report-store.js +8 -10
  314. package/src/runtime/lifecycle/retention.js +95 -31
  315. package/src/runtime/lifecycle/root.js +9 -1
  316. package/src/runtime/lifecycle/status.js +34 -17
  317. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  318. package/src/runtime/mask.js +134 -7
  319. package/src/runtime/mcp-consultations.js +40 -6
  320. package/src/runtime/model-router.js +79 -7
  321. package/src/runtime/models/catalogue.js +191 -0
  322. package/src/runtime/models/command.js +153 -0
  323. package/src/runtime/off-words.js +12 -0
  324. package/src/runtime/outcome.js +2 -2
  325. package/src/runtime/packages/command.js +1009 -0
  326. package/src/runtime/packages/contributions.js +116 -0
  327. package/src/runtime/packages/digest.js +132 -0
  328. package/src/runtime/packages/fetch.js +182 -0
  329. package/src/runtime/packages/grants.js +192 -0
  330. package/src/runtime/packages/index-file.js +134 -0
  331. package/src/runtime/packages/instruction.js +90 -0
  332. package/src/runtime/packages/manifest.js +331 -0
  333. package/src/runtime/packages/points.js +477 -0
  334. package/src/runtime/packages/programs.js +216 -0
  335. package/src/runtime/packages/scaffold.js +277 -0
  336. package/src/runtime/packages/source.js +90 -0
  337. package/src/runtime/packages/state.js +164 -0
  338. package/src/runtime/packages/store.js +449 -0
  339. package/src/runtime/packages/tar.js +106 -0
  340. package/src/runtime/packages/view.js +406 -0
  341. package/src/runtime/plan-check.js +59 -0
  342. package/src/runtime/plan-content.js +324 -0
  343. package/src/runtime/policy-init.js +118 -0
  344. package/src/runtime/profiles/doctor.js +96 -0
  345. package/src/runtime/profiles/resolve.js +244 -0
  346. package/src/runtime/profiles/rollback.js +254 -0
  347. package/src/runtime/profiles/sampler.js +41 -0
  348. package/src/runtime/readiness-record.js +16 -11
  349. package/src/runtime/readiness.js +46 -5
  350. package/src/runtime/research-request.js +50 -25
  351. package/src/runtime/retrieval-plan.js +10 -30
  352. package/src/runtime/retrieval-record.js +75 -5
  353. package/src/runtime/review/command.js +246 -0
  354. package/src/runtime/review/dominance.js +68 -0
  355. package/src/runtime/review/findings.js +434 -0
  356. package/src/runtime/review/identity.js +255 -0
  357. package/src/runtime/review/protocol-command.js +109 -0
  358. package/src/runtime/review/protocols.js +405 -0
  359. package/src/runtime/review/resolve-protocol.js +302 -0
  360. package/src/runtime/review/start.js +530 -0
  361. package/src/runtime/roadmap/facts.js +479 -0
  362. package/src/runtime/roadmap/gates.js +270 -0
  363. package/src/runtime/roadmap/loop.js +1636 -0
  364. package/src/runtime/roadmap/merge.js +381 -0
  365. package/src/runtime/roadmap/rows.js +1113 -0
  366. package/src/runtime/roadmap/seed.js +951 -0
  367. package/src/runtime/rules-report.js +336 -0
  368. package/src/runtime/scaffold/artifacts.js +60 -9
  369. package/src/runtime/scaffold/generate.js +21 -9
  370. package/src/runtime/settings/autopilot.js +106 -0
  371. package/src/runtime/settings/cli.js +280 -0
  372. package/src/runtime/settings/config-write.js +314 -0
  373. package/src/runtime/settings/files.js +271 -0
  374. package/src/runtime/settings/legacy.js +154 -0
  375. package/src/runtime/settings/lexical.js +56 -0
  376. package/src/runtime/settings/prepared-run.js +269 -0
  377. package/src/runtime/settings/project-layers.js +118 -0
  378. package/src/runtime/settings/refs.js +288 -0
  379. package/src/runtime/settings/registry.js +553 -0
  380. package/src/runtime/settings/resolve.js +713 -0
  381. package/src/runtime/settings/shared.js +37 -0
  382. package/src/runtime/settings/worker-billing.js +107 -0
  383. package/src/runtime/settings/write.js +269 -0
  384. package/src/runtime/slot-command.js +78 -0
  385. package/src/runtime/slots.js +671 -0
  386. package/src/runtime/source-version.js +1 -0
  387. package/src/runtime/state-root.js +217 -0
  388. package/src/runtime/storage/cli.js +12 -5
  389. package/src/runtime/storage/engine.js +9 -2
  390. package/src/runtime/storage/registry.js +14 -1
  391. package/src/runtime/storage/roots.js +66 -16
  392. package/src/runtime/storage/rules.js +82 -10
  393. package/src/runtime/storage/upkeep.js +10 -2
  394. package/src/runtime/storage/work-status.js +245 -26
  395. package/src/runtime/task-attempts.js +589 -69
  396. package/src/runtime/task-classifier.js +47 -11
  397. package/src/runtime/task-graph.js +373 -0
  398. package/src/runtime/task-run.js +778 -0
  399. package/src/runtime/task-scope.js +176 -55
  400. package/src/runtime/task-sources.js +147 -0
  401. package/src/runtime/task-state.js +374 -64
  402. package/src/runtime/team/admission.js +301 -0
  403. package/src/runtime/team/envelope.js +324 -0
  404. package/src/runtime/team/review-guard.js +156 -0
  405. package/src/runtime/trace/analyze.js +427 -0
  406. package/src/runtime/trace/baseline.js +770 -0
  407. package/src/runtime/trace/ledger.js +63 -140
  408. package/src/runtime/trace/otlp-export.js +568 -0
  409. package/src/runtime/trace/otlp-map.js +481 -0
  410. package/src/runtime/trace/spans.js +745 -0
  411. package/src/runtime/trace/telemetry.js +225 -0
  412. package/src/runtime/trace/views.js +1 -0
  413. package/src/runtime/transcripts/command.js +98 -0
  414. package/src/runtime/transcripts/cursor.js +326 -0
  415. package/src/runtime/transcripts/read.js +126 -0
  416. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  417. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  418. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  419. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  420. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  421. package/src/runtime/transcripts/registry.js +161 -0
  422. package/src/runtime/transcripts/stats.js +161 -0
  423. package/src/runtime/verification/check-key.js +628 -0
  424. package/src/runtime/verification/contract-runner.js +546 -11
  425. package/src/runtime/verification/engine.js +499 -9
  426. package/src/runtime/verification/impact.js +617 -0
  427. package/src/runtime/verification/inflight.js +205 -0
  428. package/src/runtime/verification/registry.js +176 -0
  429. package/src/runtime/verification/reuse.js +184 -0
  430. package/src/runtime/verification/telemetry-emit.js +254 -0
  431. package/src/runtime/verification/test-selection.js +67 -7
  432. package/src/runtime/worker/active.js +90 -0
  433. package/src/runtime/worker/cancel.js +222 -0
  434. package/src/runtime/worker/catalogue.js +122 -0
  435. package/src/runtime/worker/command.js +677 -0
  436. package/src/runtime/worker/evidence.js +288 -0
  437. package/src/runtime/worker/launch.js +288 -0
  438. package/src/runtime/worker/models.js +137 -0
  439. package/src/runtime/worker/parsers.js +218 -0
  440. package/src/runtime/worker/probes/index.js +706 -0
  441. package/src/runtime/worker/process-tree.js +415 -0
  442. package/src/runtime/worker/quota.js +43 -0
  443. package/src/runtime/worker/readiness.js +713 -0
  444. package/src/runtime/worker/run-store.js +166 -0
  445. package/src/runtime/worker/supervisor.js +541 -0
  446. package/src/runtime/worker/worktree-check.js +252 -0
  447. package/src/runtime/workflow-engine.js +5 -1
  448. package/src/runtime/workflow-orchestrator.js +578 -63
  449. package/src/runtime/worktree.js +149 -22
  450. package/src/state/index.js +1 -1
  451. package/src/state/lockfile.js +64 -10
  452. package/src/state/run-lock.js +1 -1
  453. package/types/node-commonjs.d.ts +106 -7
  454. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  455. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  456. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  457. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  458. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  459. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  460. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  461. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  462. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  463. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  464. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  465. package/core/shared/guidance/FLAGS.md +0 -25
  466. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  467. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  468. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  469. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  470. package/src/adapters/gemini/hooks.js +0 -251
  471. package/src/adapters/gemini/index.js +0 -429
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bash
2
- case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
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
+ _DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
3
4
  # pre-implementation-gate.sh — Canonical Policy Library: PreToolUse(Edit|Write|...)
4
5
  # backstop for the doflow implement gate. The HARD half of the one enforced
5
6
  # gate (the other half is the prompt-level do-prereqs.sh inside
@@ -27,7 +28,7 @@ case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
27
28
  # Canonical Policy Script Contract (design.md §4):
28
29
  # env DOFLOW_PROJECT_DIR (repo root, if the front door sets it),
29
30
  # DOFLOW_AGENT (harness id, informational only here),
30
- # CLAUDE_CONFIG_DIR / CLAUDE_PROJECT_DIR / GEMINI_CONFIG_DIR / CODEX_HOME
31
+ # CLAUDE_CONFIG_DIR / CLAUDE_PROJECT_DIR / CODEX_HOME
31
32
  # (each already read by the harness-specific dispatcher this policy
32
33
  # replaces — kept so an unmodified front door still resolves its own
33
34
  # harness's do-paths.sh resolver)
@@ -35,7 +36,7 @@ case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
35
36
  # exit exit 2 + doflow_decide deny = deny; other faults per IC-011. A front
36
37
  # door translates this into its native response shape.
37
38
  #
38
- # Reconciliation note (022-normalize-hooks, Phase A): claude/gemini/codex/kiro
39
+ # Reconciliation note (022-normalize-hooks, Phase A): claude/codex/kiro
39
40
  # each shipped a separately-adapted copy of this gate; antigravity's copy
40
41
  # additionally never depended on a do-paths.sh resolver at all — it computed
41
42
  # feature_dir itself from the current branch name and checked the three
@@ -139,13 +140,11 @@ RESOLVER_CANDIDATES=(
139
140
  "$ROOT/.doflow/scripts/doflow/bash/do-paths.sh"
140
141
  "$ROOT/.claude/scripts/doflow/bash/do-paths.sh"
141
142
  "$ROOT/.codex/scripts/doflow/bash/do-paths.sh"
142
- "$ROOT/.gemini/scripts/doflow/bash/do-paths.sh"
143
143
  "$ROOT/.kiro/scripts/doflow/bash/do-paths.sh"
144
144
  "$HOME/.doflow/scripts/doflow/bash/do-paths.sh"
145
145
  "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/scripts/doflow/bash/do-paths.sh"
146
146
  "${CLAUDE_PROJECT_DIR:-}/.claude/scripts/doflow/bash/do-paths.sh"
147
147
  "${CODEX_HOME:-$HOME/.codex}/scripts/doflow/bash/do-paths.sh"
148
- "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/scripts/doflow/bash/do-paths.sh"
149
148
  "$HOME/.kiro/scripts/doflow/bash/do-paths.sh"
150
149
  )
151
150
 
@@ -163,11 +162,14 @@ has_plan=""
163
162
  if [ -n "$RESOLVER" ]; then
164
163
  json=$("$RESOLVER" --json 2>/dev/null) || json=""
165
164
  if [ -n "$json" ]; then
166
- feature_dir=$(printf '%s' "$json" | jq -r '.feature_dir // empty' 2>/dev/null)
167
- repo_root=$(printf '%s' "$json" | jq -r '.repo_root // empty' 2>/dev/null)
168
- has_requirement=$(printf '%s' "$json" | jq -r '.has_requirement // false' 2>/dev/null)
169
- has_design=$(printf '%s' "$json" | jq -r '.has_design // false' 2>/dev/null)
170
- has_plan=$(printf '%s' "$json" | jq -r '.has_plan // false' 2>/dev/null)
165
+ # One jq run for all five fields, one per line (none of them can hold a newline).
166
+ {
167
+ IFS= read -r feature_dir
168
+ IFS= read -r repo_root
169
+ IFS= read -r has_requirement
170
+ IFS= read -r has_design
171
+ IFS= read -r has_plan
172
+ } < <(printf '%s' "$json" | jq -r '(.feature_dir // ""), (.repo_root // ""), (.has_requirement // false), (.has_design // false), (.has_plan // false)' 2>/dev/null) || true
171
173
  fi
172
174
  fi
173
175
 
@@ -247,18 +249,41 @@ real_path() {
247
249
  repo_real=$(cd -P "$repo_root" 2>/dev/null && pwd) || repo_real="$repo_root"
248
250
 
249
251
  # Only source files inside this repo are gated: edits to doflow artifacts are
250
- # always allowed, and an absolute path elsewhere is not this repo's.
252
+ # always allowed, an absolute path elsewhere is not this repo's, and neither is a
253
+ # path git ignores.
251
254
  GATED=false
252
255
  while IFS= read -r file; do
253
256
  [ -z "$file" ] && continue
254
- case "$file" in *"/agent-docs/"*|agent-docs/*) continue ;; esac
257
+ # A ".." segment can lead out of agent-docs (agent-docs/../src/x), so such a path is judged by
258
+ # its real path below, never by the text before the "..".
259
+ case "/$file/" in
260
+ */../*) ;;
261
+ *) case "$file" in *"/agent-docs/"*|agent-docs/*) continue ;; esac ;;
262
+ esac
263
+ check="$file"
255
264
  case "$file" in
256
265
  /*)
257
266
  real=$(real_path "$file") || real="$file"
258
- case "$real" in *"/agent-docs/"*) continue ;; esac
267
+ case "/$real/" in */../*) ;; *) case "$real" in *"/agent-docs/"*) continue ;; esac ;; esac
259
268
  case "$real" in "$repo_real"/*) ;; *) continue ;; esac
269
+ check="$real"
270
+ ;;
271
+ *)
272
+ real=$(real_path "$repo_root/$file") || real="$repo_root/$file"
273
+ # real_path folds a ".." only through directories that exist, so one left in it is not folded.
274
+ case "/$file/" in */../*) case "/$real/" in */../*) ;; *) case "${real#"$repo_real"}/" in */agent-docs/*) continue ;; esac ;; esac ;; esac
260
275
  ;;
261
276
  esac
277
+ # A path git ignores (a local config file such as .mcp.json) is not source. check-ignore
278
+ # without --no-index answers "not ignored" for a tracked file, so tracked source stays gated.
279
+ # The skip never applies to DoFlow's own state or gate artifacts: .doflow/ is gitignored, and
280
+ # skipping it would let an edit forge a readiness record. Any `.doflow` or `agent-docs/doflow`
281
+ # segment of the real path, or of the path as written (a `..` the resolver could not fold), keeps it gated.
282
+ # The same holds for the do-paths.sh resolver the gate runs (any RESOLVER_CANDIDATES path, whichever
283
+ # harness directory holds it, ignored or not): rewriting it can make the gate find no feature.
284
+ case "/$file/" in */.doflow/*|*/agent-docs/doflow/*|*/../*|*/scripts/doflow/bash/do-paths.sh/) GATED=true; break ;; esac
285
+ case "${real#"$repo_real"}/" in */.doflow/*|*/agent-docs/doflow/*|*/scripts/doflow/bash/do-paths.sh/) GATED=true; break ;; esac
286
+ git -C "$repo_root" check-ignore -q -- "$check" 2>/dev/null && continue
262
287
  GATED=true
263
288
  break
264
289
  done <<< "$FILES"
@@ -304,25 +329,71 @@ checkouts() {
304
329
  return 0
305
330
  }
306
331
 
307
- # A state file under this checkout, else under exactly one other checkout, at
308
- # the first of the given paths that exists in each; held in two or more others,
309
- # it cannot be told which is meant -> allow.
332
+ # Whether two files hold the same bytes.
333
+ same_bytes() {
334
+ if command -v cmp >/dev/null 2>&1; then cmp -s "$1" "$2"; else [ "$(cat "$1")" = "$(cat "$2")" ]; fi
335
+ }
336
+
337
+ # Whether the flat record $1 of a namespaced task may be read as feature $2's
338
+ # (115 D-3): it names that feature (featureSlug on a run, slug on a readiness
339
+ # record) or none. A file that does not parse names nobody.
340
+ flat_is_ours() {
341
+ local named
342
+ named=$(jq -r '[.featureSlug, .slug] | map(select(type == "string" and . != "")) | first // empty' "$1" 2>/dev/null) || return 1
343
+ [ -z "$named" ] || [ "$named" = "$2" ]
344
+ }
345
+
346
+ # The task's record of store $2 (readiness | orchestration) under checkout $1,
347
+ # keyed by feature $3 as the runtime keys it (115 C-1): <store>/<feature>/<id>.json
348
+ # for a task id other than the feature's slug, else the flat file; the flat file
349
+ # of a namespaced task only when it is this feature's or names none. Sets HIT.
350
+ HIT=""
351
+ record_in() {
352
+ local store="$1/.doflow/state/$2"
353
+ HIT=""
354
+ if [ -n "$3" ] && [ "$3" != "$task_id" ]; then
355
+ if [ -f "$store/$3/$task_id.json" ]; then HIT="$store/$3/$task_id.json"; return 0; fi
356
+ [ -f "$store/$task_id.json" ] && flat_is_ours "$store/$task_id.json" "$3" && HIT="$store/$task_id.json"
357
+ return 0
358
+ fi
359
+ [ -f "$store/$task_id.json" ] && HIT="$store/$task_id.json"
360
+ return 0
361
+ }
362
+
363
+ # The task's readiness record, keyed by feature $1. From a linked worktree the
364
+ # main checkout's comes first, since every record lives there (115 IC-004), and
365
+ # a copy at the same path here with other bytes refuses (C-3). Else this
366
+ # checkout's, else exactly one other checkout's; held in two or more others it
367
+ # cannot be told which is meant -> allow.
310
368
  FOUND=""
311
369
  find_state() {
312
- local rel root count=0 hit
370
+ local root count=0 copy
313
371
  FOUND=""
314
- for rel in "$@"; do
315
- if [ -f "$repo_root/$rel" ]; then FOUND="$repo_root/$rel"; return 0; fi
316
- done
372
+ if [ -f "$repo_root/.git" ]; then
373
+ checkouts
374
+ if [ -n "$MAIN" ]; then
375
+ record_in "$MAIN" readiness "$1"
376
+ if [ -n "$HIT" ]; then
377
+ copy="$repo_root${HIT#"$MAIN"}"
378
+ if [ -f "$copy" ] && ! same_bytes "$copy" "$HIT"; then
379
+ printf "doflow gate readiness-before-implementation: task '%s' has a readiness record in this worktree (%s) that differs from the main checkout's (%s). Next: keep one of the two and remove the other, then re-run. Nothing was changed.\n" "$task_id" "$copy" "$HIT" >&2
380
+ doflow_decide deny readiness-store-conflict
381
+ exit 2
382
+ fi
383
+ FOUND="$HIT"
384
+ return 0
385
+ fi
386
+ fi
387
+ fi
388
+ record_in "$repo_root" readiness "$1"
389
+ if [ -n "$HIT" ]; then FOUND="$HIT"; return 0; fi
317
390
  checkouts
318
391
  for root in ${OTHERS[@]+"${OTHERS[@]}"}; do
319
- hit=""
320
- for rel in "$@"; do
321
- [ -f "$root/$rel" ] && { hit="$root/$rel"; break; }
322
- done
323
- [ -n "$hit" ] || continue
392
+ [ "$root" = "$MAIN" ] && continue
393
+ record_in "$root" readiness "$1"
394
+ [ -n "$HIT" ] || continue
324
395
  count=$((count + 1))
325
- FOUND="$hit"
396
+ FOUND="$HIT"
326
397
  done
327
398
  [ "$count" -le 1 ] || exit 0
328
399
  }
@@ -338,18 +409,26 @@ run_feature() {
338
409
  return 0
339
410
  }
340
411
 
412
+ # The feature the task's records are keyed by, as the runtime keys them
413
+ # (featureSlugFor): a task id that names a feature folder in this checkout is
414
+ # its own feature, else the branch's.
415
+ run_key="$slug"
416
+ [ -d "$repo_root/agent-docs/doflow/$task_id" ] && run_key="$task_id"
417
+
341
418
  # The task's run: this checkout's, else the one other checkout's run of the same
342
419
  # feature. A run with the same id for another feature is a different task.
343
420
  find_run() {
344
- local rel=".doflow/state/orchestration/$task_id.json" root count=0
421
+ local root count=0
345
422
  FOUND=""
346
- if [ -f "$repo_root/$rel" ]; then FOUND="$repo_root/$rel"; return 0; fi
423
+ record_in "$repo_root" orchestration "$run_key"
424
+ if [ -n "$HIT" ]; then FOUND="$HIT"; return 0; fi
347
425
  checkouts
348
426
  for root in ${OTHERS[@]+"${OTHERS[@]}"}; do
349
- [ -f "$root/$rel" ] || continue
350
- [ "$(run_feature "$root/$rel")" = "$slug" ] || continue
427
+ record_in "$root" orchestration "$run_key"
428
+ [ -n "$HIT" ] || continue
429
+ [ "$(run_feature "$HIT")" = "$run_key" ] || continue
351
430
  count=$((count + 1))
352
- FOUND="$root/$rel"
431
+ FOUND="$HIT"
353
432
  done
354
433
  [ "$count" -le 1 ] || exit 0
355
434
  }
@@ -443,13 +522,10 @@ if [ -n "$RUN" ]; then
443
522
  fi
444
523
 
445
524
  # The record, where the runtime looks: under the feature's namespace (the run's
446
- # own feature when it recorded one), then flat; this checkout first.
447
- record_slug="${run_slug:-$slug}"
448
- if [ -n "$record_slug" ] && [ "$record_slug" != "$task_id" ]; then
449
- find_state ".doflow/state/readiness/$record_slug/$task_id.json" ".doflow/state/readiness/$task_id.json"
450
- else
451
- find_state ".doflow/state/readiness/$task_id.json"
452
- fi
525
+ # own feature when it recorded one), then flat; the main checkout first from a
526
+ # linked worktree, else this checkout first.
527
+ record_slug="${run_slug:-$run_key}"
528
+ find_state "$record_slug"
453
529
  record_state=""; record_class=""; record_at=""
454
530
  if [ -n "$FOUND" ]; then
455
531
  record_info=$(jq -r '(.state // ""), (.taskClass // ""), (.evaluatedAt // "")' "$FOUND" 2>/dev/null) || exit 0
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bash
2
- case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
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
+ _DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
3
4
  # session-context.sh — Canonical Policy Library: SessionStart guard policy
4
5
  #
5
6
  # Fires when a harness starts a new session. Captures git state into a
@@ -61,9 +62,36 @@ if [ "$ENVELOPE_CLASS" = unsupported ] || [ "$ENVELOPE_CLASS" = missing ]; then
61
62
  fi
62
63
  CWD=$(json_field "$INPUT" ".cwd")
63
64
 
65
+ package_verify_async() {
66
+ local home="${HOME:-}" lock run config_dir detach=""
67
+ [ -n "$home" ] || return 0
68
+ lock="$home/.doflow/doflow.lock"
69
+ [ -f "$lock" ] || return 0
70
+ jq -e '(.packages // []) | length > 0' "$lock" >/dev/null 2>&1 || return 0
71
+ config_dir="${CLAUDE_CONFIG_DIR:-$home/.claude}"
72
+ command -v setsid >/dev/null 2>&1 && detach="setsid"
73
+ for run in \
74
+ "$home/.doflow/scripts/doflow/bin/doflow-run" \
75
+ "$config_dir/scripts/doflow/bin/doflow-run"
76
+ do
77
+ [ -x "$run" ] || continue
78
+ ( cd "$home/.doflow" 2>/dev/null && nohup $detach "$run" package --action verify </dev/null >/dev/null 2>&1 ) >/dev/null 2>&1 3>&- 5>&- &
79
+ return 0
80
+ done
81
+ return 0
82
+ }
83
+
64
84
  # Guard: if we can't determine the session, nothing to do
65
85
  [[ -z "$SESSION_ID" ]] && exit 0
66
86
 
87
+ # No config home (lib.sh leaves the state paths empty): no session store to write, but the
88
+ # storage upkeep still starts (086 IC-010).
89
+ if [[ -z "$SESSION_DIR" ]]; then
90
+ package_verify_async
91
+ storage_upkeep_async "$CWD"
92
+ exit 0
93
+ fi
94
+
67
95
  SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
68
96
 
69
97
  # Clean up stale injected flag from a prior crashed session
@@ -167,5 +195,6 @@ fi
167
195
  mkdir -p "$(dirname "$SESSIONS_LOG")"
168
196
  echo "$TIMESTAMP START $SESSION_ID ${CWD:-unknown}" >> "$SESSIONS_LOG"
169
197
 
198
+ package_verify_async
170
199
  storage_upkeep_async "$CWD"
171
200
  exit 0
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bash
2
- case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
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
+ _DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
3
4
  # stop-check.sh — Canonical Policy Library: Stop hook
4
5
  #
5
6
  # Two responsibilities:
@@ -84,7 +85,8 @@ TRANSCRIPT_PATH=$(json_field "$INPUT" ".transcript_path")
84
85
 
85
86
  # ── 1. Lint dispatch (only when we have a session-scoped edited-files queue) ──
86
87
 
87
- if [ -n "$SESSION_ID" ]; then
88
+ # With no config home (SESSION_DIR empty) there is no queue to read; the stub check below still runs.
89
+ if [ -n "$SESSION_ID" ] && [ -n "$SESSION_DIR" ]; then
88
90
  SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
89
91
  EDITED_FILES="$SESSION_PATH/edited-files.txt"
90
92
  PROC_FILE="$SESSION_PATH/edited-files.txt.proc"
@@ -104,12 +106,14 @@ if [ -n "$SESSION_ID" ]; then
104
106
  # The resolver for the leak-scan verb. Absent install -> the scan is
105
107
  # skipped, like every other tool below: this hook has never required
106
108
  # anything to be present.
109
+ # HOME may be unset (an absolute XDG_CONFIG_HOME alone gives a config home): its candidates drop out.
107
110
  DOFLOW_RUN=""
111
+ claude_dir="${CLAUDE_CONFIG_DIR:-${HOME:+$HOME/.claude}}"
108
112
  for candidate in \
109
- "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/scripts/doflow/bin/doflow-run" \
110
- "$HOME/.doflow/scripts/doflow/bin/doflow-run"
113
+ "${claude_dir:+$claude_dir/scripts/doflow/bin/doflow-run}" \
114
+ "${HOME:+$HOME/.doflow/scripts/doflow/bin/doflow-run}"
111
115
  do
112
- [ -x "$candidate" ] && { DOFLOW_RUN="$candidate"; break; }
116
+ [ -n "$candidate" ] && [ -x "$candidate" ] && { DOFLOW_RUN="$candidate"; break; }
113
117
  done
114
118
 
115
119
  while IFS= read -r path; do
@@ -187,9 +191,10 @@ fi
187
191
 
188
192
  # The payload's own last_assistant_message is the response being stopped on. A present key
189
193
  # (even null or empty) is authoritative: the transcript is only read when the key is absent.
190
- # jq filter for the transcript fallback: one JSON object per line, assistant text from three
194
+ # jq filter for the transcript fallback: one JSON object per line, assistant text from four
191
195
  # shapes — Claude Code (.message with text blocks), Codex rollout (response_item .payload with
192
- # output_text blocks) and the flat {role,content} line. A partial or foreign line yields "".
196
+ # output_text blocks), Copilot CLI events.jsonl (type assistant.message, .data.content a string) and
197
+ # the flat {role,content} line. A partial or foreign line yields "".
193
198
  read -r -d '' LAST_ASSISTANT_JQ <<'JQ' || true
194
199
  def text: if type == "string" then .
195
200
  elif type == "array" then [ .[]? | objects | select(.type == "text" or .type == "output_text") | .text | strings ] | join("\n")
@@ -197,6 +202,7 @@ def text: if type == "string" then .
197
202
  [ inputs | fromjson? | objects
198
203
  | if ((.message | objects | .role) // null) == "assistant" then .message.content
199
204
  elif .type == "response_item" and ((.payload | objects | .role) // null) == "assistant" then .payload.content
205
+ elif .type == "assistant.message" then .data.content
200
206
  elif .role == "assistant" then .content
201
207
  else empty end
202
208
  | text | select(length > 0) ] | last // ""
@@ -274,10 +280,15 @@ if grep -qiE -- "$STUB_PATTERN" <<<"$STUB_TEXT" 2>/dev/null; then
274
280
  # Block a given message once: the continuation that follows is judged on new text, and a
275
281
  # harness with no stop_hook_active would otherwise be blocked on this one forever. State is
276
282
  # per session, or per transcript when the harness sends no session_id; any failure here
277
- # leaves the block in force only for this call.
283
+ # leaves the block in force only for this call. With no config home there is no state store, so
284
+ # this policy cannot remember a block and allows the stop.
285
+ [ -n "$SESSION_DIR" ] || exit 0
278
286
  GUARD_KEY="$SESSION_ID"
279
287
  [ -z "$GUARD_KEY" ] && GUARD_KEY="t$(printf '%s' "$TRANSCRIPT_PATH" | cksum | cut -d' ' -f1)"
280
- GUARD_FILE="$(ensure_session_dir "$GUARD_KEY" 2>/dev/null)/stop-last-blocked" || GUARD_FILE=""
288
+ GUARD_FILE=""
289
+ if [ -n "$SESSION_DIR" ]; then
290
+ GUARD_FILE="$(ensure_session_dir "$GUARD_KEY" 2>/dev/null)/stop-last-blocked" || GUARD_FILE=""
291
+ fi
281
292
  MESSAGE_SUM=$(printf '%s' "$LAST_ASSISTANT_CONTENT" | cksum 2>/dev/null) || MESSAGE_SUM=""
282
293
  if [ -n "$MESSAGE_SUM" ] && [ -n "$GUARD_FILE" ] && [ "$(cat "$GUARD_FILE" 2>/dev/null)" = "$MESSAGE_SUM" ]; then
283
294
  exit 0
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env bash
2
- case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
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
+ _DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
3
4
  # subagent-audit.sh — Canonical Policy Library: SubagentStart + SubagentStop hook
4
5
  # (pure observability, no deny path)
5
6
  #
6
7
  # 022-hooks-remaining-duplication: claude and codex's copies were byte-identical — moved here as
7
- # the single canonical copy. Gemini has no SubagentStart/SubagentStop-equivalent event.
8
+ # the single canonical copy.
8
9
  #
9
10
  # Appends {timestamp, session_id, event, agent_type, agent_id} to a session-scoped audit log.
10
11
  # Today there is zero record of which of the installed agents/ specialists actually run, how often, or
@@ -56,6 +57,8 @@ fi
56
57
 
57
58
  # Guard: if we can't determine the session, nothing to do
58
59
  [[ -z "$SESSION_ID" ]] && exit 0
60
+ # No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
61
+ [[ -n "$SESSION_DIR" ]] || exit 0
59
62
 
60
63
  EVENT=$(json_field "$INPUT" ".hook_event_name")
61
64
  AGENT_TYPE=$(json_field "$INPUT" ".agent_type")