@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.4

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 (409) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -2
  3. package/bin/doflow.js +44 -0
  4. package/core/.antigravity-plugin/hooks.json +39 -0
  5. package/core/.antigravity-plugin/mcp_config.json +18 -0
  6. package/core/.antigravity-plugin/plugin.json +31 -0
  7. package/core/.claude-plugin/marketplace.json +20 -0
  8. package/core/.claude-plugin/plugin.json +21 -0
  9. package/core/.codex-plugin/marketplace.json +20 -0
  10. package/core/.codex-plugin/plugin.json +35 -0
  11. package/core/.plugin/plugin.json +19 -0
  12. package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
  13. package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
  14. package/core/harnesses/claude/hooks/lib.sh +304 -0
  15. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
  16. package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
  17. package/core/harnesses/claude/hooks/post-compact.sh +74 -0
  18. package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
  19. package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
  20. package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
  21. package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
  22. package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
  23. package/core/harnesses/claude/hooks/session-end.sh +89 -0
  24. package/core/harnesses/claude/hooks/session-start.sh +5 -0
  25. package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
  26. package/core/harnesses/claude/hooks/stop-check.sh +5 -0
  27. package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
  28. package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
  29. package/core/harnesses/claude/settings/keybindings.json +20 -0
  30. package/core/harnesses/claude/settings/settings.json +201 -0
  31. package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
  32. package/core/harnesses/codex/agents/core-implementer.toml +7 -0
  33. package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
  34. package/core/harnesses/codex/agents/research-writer.toml +8 -0
  35. package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
  36. package/core/harnesses/codex/agents/system-architect.toml +9 -0
  37. package/core/harnesses/codex/config/config.toml +10 -0
  38. package/core/harnesses/codex/hooks/hooks.json +122 -0
  39. package/core/harnesses/codex/hooks/lib.sh +335 -0
  40. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
  41. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
  42. package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
  43. package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
  44. package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
  45. package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
  46. package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
  47. package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
  48. package/core/harnesses/codex/hooks/session-end.sh +5 -0
  49. package/core/harnesses/codex/hooks/session-start.sh +5 -0
  50. package/core/harnesses/codex/hooks/stop-check.sh +8 -0
  51. package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
  52. package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
  53. package/core/harnesses/gemini/hooks/hooks.json +77 -0
  54. package/core/harnesses/gemini/hooks/lib.sh +302 -0
  55. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
  56. package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
  57. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
  58. package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
  59. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
  60. package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
  61. package/core/harnesses/gemini/hooks/session-end.sh +5 -0
  62. package/core/harnesses/gemini/hooks/session-start.sh +5 -0
  63. package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
  64. package/core/harnesses/kiro/agents/doflow.json +58 -0
  65. package/core/harnesses/kiro/hooks/doflow.json +53 -0
  66. package/core/harnesses/kiro/hooks/lib.sh +324 -0
  67. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
  68. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
  69. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
  70. package/core/harnesses/kiro/hooks/session-start.sh +9 -0
  71. package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
  72. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
  73. package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
  74. package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
  75. package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
  76. package/core/harnesses/shared/hooks/hooks.json +47 -0
  77. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
  78. package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
  79. package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
  80. package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
  81. package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
  82. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
  83. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
  84. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
  85. package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
  86. package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
  87. package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
  88. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
  89. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
  90. package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
  91. package/core/harnesses/shared/locator/doflow-run +87 -0
  92. package/core/registry/advice.json +101 -0
  93. package/core/registry/assets.json +792 -0
  94. package/core/registry/capabilities.json +120 -0
  95. package/core/registry/contracts.json +189 -0
  96. package/core/registry/external-tools.json +191 -0
  97. package/core/registry/harnesses.json +2062 -0
  98. package/core/registry/lifecycle.json +231 -0
  99. package/core/registry/mcp.json +18 -0
  100. package/core/registry/models.json +79 -0
  101. package/core/registry/readiness-templates.json +118 -0
  102. package/core/registry/routes.json +47 -0
  103. package/core/registry/storage.json +1061 -0
  104. package/core/registry/verification.json +258 -0
  105. package/core/registry/workflows.json +790 -0
  106. package/core/shared/agent-specs/core-implementer.md +73 -0
  107. package/core/shared/agent-specs/quality-guardian.md +28 -0
  108. package/core/shared/agent-specs/research-writer.md +31 -0
  109. package/core/shared/agent-specs/spec-analyst.md +33 -0
  110. package/core/shared/agent-specs/system-architect.md +29 -0
  111. package/core/shared/guidance/DOFLOW_CORE.md +8 -0
  112. package/core/shared/guidance/FLAGS.md +25 -0
  113. package/core/shared/guidance/PRINCIPLES.md +61 -0
  114. package/core/shared/guidance/VERSION +1 -0
  115. package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
  116. package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
  117. package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
  118. package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
  119. package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
  120. package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
  121. package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
  122. package/core/shared/guidance/pointers/claude-gemini.md +2 -0
  123. package/core/shared/guidance/pointers/codex.md +6 -0
  124. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
  125. package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
  126. package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
  127. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
  128. package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
  129. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
  130. package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
  131. package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
  132. package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
  133. package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
  134. package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
  135. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
  136. package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
  137. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
  138. package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
  139. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
  140. package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
  141. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
  142. package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
  143. package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
  144. package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
  145. package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
  146. package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
  147. package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
  148. package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
  149. package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
  150. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
  151. package/core/shared/scripts/doflow/bin/doflow-run +592 -0
  152. package/core/shared/skills/do/SKILL.md +128 -0
  153. package/core/shared/skills/do/references/estimation.md +13 -0
  154. package/core/shared/skills/do/references/pm_routing.md +25 -0
  155. package/core/shared/skills/do/references/tool_matrix.md +52 -0
  156. package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
  157. package/core/shared/skills/do-code-review/README.md +49 -0
  158. package/core/shared/skills/do-code-review/SKILL.md +333 -0
  159. package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
  160. package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
  161. package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
  162. package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
  163. package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
  164. package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
  165. package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
  166. package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
  167. package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
  168. package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
  169. package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
  170. package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
  171. package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
  172. package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
  173. package/core/shared/skills/do-code-review/content-types/config.md +83 -0
  174. package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
  175. package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
  176. package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
  177. package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
  178. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
  179. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
  180. package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
  181. package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
  182. package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
  183. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
  184. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
  185. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
  186. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
  187. package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
  188. package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
  189. package/core/shared/skills/do-code-review/languages/c.md +103 -0
  190. package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
  191. package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
  192. package/core/shared/skills/do-code-review/languages/dart.md +108 -0
  193. package/core/shared/skills/do-code-review/languages/go.md +92 -0
  194. package/core/shared/skills/do-code-review/languages/java.md +103 -0
  195. package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
  196. package/core/shared/skills/do-code-review/languages/php.md +109 -0
  197. package/core/shared/skills/do-code-review/languages/python.md +94 -0
  198. package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
  199. package/core/shared/skills/do-code-review/languages/rust.md +99 -0
  200. package/core/shared/skills/do-code-review/languages/shell.md +90 -0
  201. package/core/shared/skills/do-code-review/languages/swift.md +88 -0
  202. package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
  203. package/core/shared/skills/do-code-review/review-policy.json +47 -0
  204. package/core/shared/skills/do-code-review/rules/universal.md +49 -0
  205. package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
  206. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
  207. package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
  208. package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
  209. package/core/shared/skills/do-constitution/SKILL.md +72 -0
  210. package/core/shared/skills/do-design/SKILL.md +212 -0
  211. package/core/shared/skills/do-diagnose/SKILL.md +156 -0
  212. package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
  213. package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
  214. package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
  215. package/core/shared/skills/do-document/SKILL.md +81 -0
  216. package/core/shared/skills/do-document/references/api-reference.md +42 -0
  217. package/core/shared/skills/do-document/references/deep_research.md +18 -0
  218. package/core/shared/skills/do-document/references/embedded-research.md +11 -0
  219. package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
  220. package/core/shared/skills/do-document/references/index_generator.md +9 -0
  221. package/core/shared/skills/do-document/references/user-guide.md +22 -0
  222. package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
  223. package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
  224. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
  225. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
  226. package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
  227. package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
  228. package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
  229. package/core/shared/skills/do-flow/SKILL.md +186 -0
  230. package/core/shared/skills/do-flow/references/task_classes.md +134 -0
  231. package/core/shared/skills/do-git/SKILL.md +115 -0
  232. package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
  233. package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
  234. package/core/shared/skills/do-git/references/release-ritual.md +64 -0
  235. package/core/shared/skills/do-implement/SKILL.md +222 -0
  236. package/core/shared/skills/do-plan/SKILL.md +219 -0
  237. package/core/shared/skills/do-test/SKILL.md +113 -0
  238. package/core/shared/templates/doflow/constitution-template.md +28 -0
  239. package/core/shared/templates/doflow/data-model-template.md +169 -0
  240. package/core/shared/templates/doflow/design-template.md +193 -0
  241. package/core/shared/templates/doflow/external-contract-template.md +35 -0
  242. package/core/shared/templates/doflow/intent-template.md +45 -0
  243. package/core/shared/templates/doflow/plan-template.md +151 -0
  244. package/core/shared/templates/doflow/question-log-template.md +51 -0
  245. package/core/shared/templates/doflow/requirement-template.md +126 -0
  246. package/core/shared/templates/doflow/specs-template.md +55 -0
  247. package/core/shared/templates/doflow/state-template.md +59 -0
  248. package/core/shared/workflows/do-flow-chain.md +17 -0
  249. package/package.json +48 -4
  250. package/src/adapters/antigravity/index.js +631 -0
  251. package/src/adapters/claude/index.js +548 -0
  252. package/src/adapters/claude/mcp.js +94 -0
  253. package/src/adapters/codex/agents.js +208 -0
  254. package/src/adapters/codex/config.js +272 -0
  255. package/src/adapters/codex/hooks.js +203 -0
  256. package/src/adapters/codex/index.js +707 -0
  257. package/src/adapters/codex/mcp.js +271 -0
  258. package/src/adapters/codex/native-projection.js +34 -0
  259. package/src/adapters/copilot/index.js +413 -0
  260. package/src/adapters/copy-tree.js +620 -0
  261. package/src/adapters/gemini/hooks.js +210 -0
  262. package/src/adapters/gemini/index.js +390 -0
  263. package/src/adapters/hook-commands.js +60 -0
  264. package/src/adapters/index.js +106 -0
  265. package/src/adapters/kiro/index.js +310 -0
  266. package/src/adapters/mcp-entries.js +331 -0
  267. package/src/adapters/opencode/index.js +466 -0
  268. package/src/adapters/pi/index.js +279 -0
  269. package/src/adapters/pi/json-members.js +185 -0
  270. package/src/adapters/pi/mcp.js +373 -0
  271. package/src/adapters/resolve-source.js +19 -0
  272. package/src/cli/commands/install.js +218 -0
  273. package/src/cli/commands/list-backups.js +21 -0
  274. package/src/cli/commands/reconcile.js +120 -0
  275. package/src/cli/commands/remove.js +82 -0
  276. package/src/cli/commands/rollback.js +172 -0
  277. package/src/cli/commands/self-update.js +33 -0
  278. package/src/cli/commands/status.js +138 -0
  279. package/src/cli/commands/tools.js +92 -0
  280. package/src/cli/commands/update.js +162 -0
  281. package/src/cli/index.js +568 -0
  282. package/src/cli/runtime-commands.js +281 -0
  283. package/src/cli/shared.js +218 -0
  284. package/src/helper/bash-helper.js +34 -0
  285. package/src/helper/git.js +24 -0
  286. package/src/helper/guardrails.js +49 -0
  287. package/src/helper/harness-paths.js +140 -0
  288. package/src/helper/marker-merge.js +116 -0
  289. package/src/helper/prompt.js +61 -0
  290. package/src/helper/repo-root.js +29 -0
  291. package/src/helper/settings-merge.js +151 -0
  292. package/src/helper/settings-scope.js +33 -0
  293. package/src/helper/toml.js +244 -0
  294. package/src/install/backup-set.js +149 -0
  295. package/src/install/backup.js +724 -0
  296. package/src/install/context.js +58 -0
  297. package/src/install/manifest.js +145 -0
  298. package/src/install/mcp.js +254 -0
  299. package/src/install/paths.js +84 -0
  300. package/src/install/targets.js +90 -0
  301. package/src/install/tool-lifecycle.js +151 -0
  302. package/src/lifecycle/bash-availability.js +25 -0
  303. package/src/lifecycle/index.js +812 -0
  304. package/src/lifecycle/mcp-index.js +28 -0
  305. package/src/lifecycle/policies.js +73 -0
  306. package/src/lifecycle/view.js +175 -0
  307. package/src/registry/index.js +611 -0
  308. package/src/release/build-package.js +91 -0
  309. package/src/release/changelog-section.js +70 -0
  310. package/src/release/sync-plugin-versions.js +66 -0
  311. package/src/runtime/advice/cli.js +283 -0
  312. package/src/runtime/advice/client.js +324 -0
  313. package/src/runtime/advice/config.js +189 -0
  314. package/src/runtime/advice/doctor.js +169 -0
  315. package/src/runtime/advice/endpoint-guard.js +134 -0
  316. package/src/runtime/advice/kinds.js +154 -0
  317. package/src/runtime/advice/providers/ollama-systemone.js +209 -0
  318. package/src/runtime/advice/record.js +166 -0
  319. package/src/runtime/advice/registry.js +170 -0
  320. package/src/runtime/advice/strength.js +66 -0
  321. package/src/runtime/brief-tools.js +342 -0
  322. package/src/runtime/c4-project.js +371 -0
  323. package/src/runtime/capability-router.js +484 -0
  324. package/src/runtime/checkouts.js +170 -0
  325. package/src/runtime/claims.js +468 -0
  326. package/src/runtime/cli-result.js +55 -0
  327. package/src/runtime/cli.js +678 -0
  328. package/src/runtime/command-detect.js +516 -0
  329. package/src/runtime/context-pack.js +492 -0
  330. package/src/runtime/decision-register.js +493 -0
  331. package/src/runtime/evidence-ledger.js +338 -0
  332. package/src/runtime/failure/capture.js +272 -0
  333. package/src/runtime/failure/classifier.js +68 -0
  334. package/src/runtime/failure/cli.js +178 -0
  335. package/src/runtime/failure/home.js +64 -0
  336. package/src/runtime/failure/store.js +226 -0
  337. package/src/runtime/feature-resolve.js +79 -0
  338. package/src/runtime/freshness.js +177 -0
  339. package/src/runtime/health.js +863 -0
  340. package/src/runtime/history-compactor.js +237 -0
  341. package/src/runtime/implementation-gate.js +321 -0
  342. package/src/runtime/inventory/coverage.js +218 -0
  343. package/src/runtime/inventory/identity.js +65 -0
  344. package/src/runtime/inventory/index.js +705 -0
  345. package/src/runtime/inventory/precedence.js +134 -0
  346. package/src/runtime/inventory/read-scopes.js +131 -0
  347. package/src/runtime/inventory/siblings.js +192 -0
  348. package/src/runtime/knowledge/chunker.js +124 -0
  349. package/src/runtime/knowledge/hybrid.js +149 -0
  350. package/src/runtime/knowledge/index-store.js +145 -0
  351. package/src/runtime/knowledge/retrieval.js +194 -0
  352. package/src/runtime/leak-scan.js +185 -0
  353. package/src/runtime/lifecycle/cli.js +276 -0
  354. package/src/runtime/lifecycle/event-store.js +340 -0
  355. package/src/runtime/lifecycle/fold.js +353 -0
  356. package/src/runtime/lifecycle/followup.js +432 -0
  357. package/src/runtime/lifecycle/goal.js +249 -0
  358. package/src/runtime/lifecycle/intent-writer.js +86 -0
  359. package/src/runtime/lifecycle/overview.js +292 -0
  360. package/src/runtime/lifecycle/release.js +241 -0
  361. package/src/runtime/lifecycle/report-store.js +221 -0
  362. package/src/runtime/lifecycle/retention.js +212 -0
  363. package/src/runtime/lifecycle/root.js +71 -0
  364. package/src/runtime/lifecycle/status.js +353 -0
  365. package/src/runtime/lifecycle/store-upkeep.js +393 -0
  366. package/src/runtime/locator-resolve.js +158 -0
  367. package/src/runtime/mask.js +210 -0
  368. package/src/runtime/mcp-consultations.js +412 -0
  369. package/src/runtime/mcp-reach.js +157 -0
  370. package/src/runtime/model-router.js +153 -0
  371. package/src/runtime/outcome.js +467 -0
  372. package/src/runtime/reach.js +148 -0
  373. package/src/runtime/readiness-record.js +150 -0
  374. package/src/runtime/readiness.js +435 -0
  375. package/src/runtime/recovery.js +282 -0
  376. package/src/runtime/research-request.js +231 -0
  377. package/src/runtime/retrieval-plan.js +578 -0
  378. package/src/runtime/scaffold/artifacts.js +217 -0
  379. package/src/runtime/scaffold/fingerprint.js +56 -0
  380. package/src/runtime/scaffold/generate.js +911 -0
  381. package/src/runtime/scaffold/languages.js +245 -0
  382. package/src/runtime/storage/cli.js +64 -0
  383. package/src/runtime/storage/engine.js +249 -0
  384. package/src/runtime/storage/registry.js +130 -0
  385. package/src/runtime/storage/roots.js +63 -0
  386. package/src/runtime/storage/rules.js +282 -0
  387. package/src/runtime/storage/upkeep.js +243 -0
  388. package/src/runtime/storage/work-status.js +326 -0
  389. package/src/runtime/task-attempts.js +415 -0
  390. package/src/runtime/task-classifier.js +550 -0
  391. package/src/runtime/task-scope.js +130 -0
  392. package/src/runtime/task-state.js +176 -0
  393. package/src/runtime/trace/indicators.js +235 -0
  394. package/src/runtime/trace/ledger.js +626 -0
  395. package/src/runtime/trace/render.js +76 -0
  396. package/src/runtime/trace/views.js +459 -0
  397. package/src/runtime/verification/contract-runner.js +341 -0
  398. package/src/runtime/verification/engine.js +1461 -0
  399. package/src/runtime/verification/registry.js +130 -0
  400. package/src/runtime/verification/scope-bound.js +418 -0
  401. package/src/runtime/verification/test-selection.js +172 -0
  402. package/src/runtime/workflow-engine.js +588 -0
  403. package/src/runtime/workflow-orchestrator.js +953 -0
  404. package/src/runtime/worktree.js +340 -0
  405. package/src/state/index.js +193 -0
  406. package/src/state/lockfile.js +136 -0
  407. package/src/state/run-lock.js +408 -0
  408. package/types/node-commonjs.d.ts +68 -0
  409. package/types/runtime.d.ts +91 -0
@@ -0,0 +1,2062 @@
1
+ {
2
+ "version": 1,
3
+ "harnesses": [
4
+ {
5
+ "id": "claude",
6
+ "displayName": "Claude Code",
7
+ "adapter": "claude",
8
+ "scopes": [
9
+ "project",
10
+ "user"
11
+ ],
12
+ "nativeTargets": {
13
+ "instructions": "CLAUDE.md",
14
+ "settings": "settings.json",
15
+ "hooks": "settings.json",
16
+ "mcp": ".mcp.json"
17
+ },
18
+ "paths": {
19
+ "configDir": {
20
+ "base": "root",
21
+ "segments": [
22
+ ".claude"
23
+ ]
24
+ },
25
+ "instructions": {
26
+ "base": "root",
27
+ "segments": [
28
+ ".claude",
29
+ "CLAUDE.md"
30
+ ]
31
+ },
32
+ "settings": {
33
+ "base": "root",
34
+ "segments": [
35
+ ".claude",
36
+ "settings.json"
37
+ ]
38
+ },
39
+ "keybindings": {
40
+ "base": "root",
41
+ "segments": [
42
+ ".claude",
43
+ "keybindings.json"
44
+ ]
45
+ },
46
+ "statuslineScript": {
47
+ "base": "root",
48
+ "segments": [
49
+ ".claude",
50
+ "doflow-statusline.sh"
51
+ ]
52
+ },
53
+ "mcp": {
54
+ "project": {
55
+ "base": "root",
56
+ "segments": [
57
+ ".mcp.json"
58
+ ]
59
+ },
60
+ "user": {
61
+ "base": "root",
62
+ "segments": [
63
+ ".claude.json"
64
+ ]
65
+ }
66
+ }
67
+ },
68
+ "capabilities": {
69
+ "instructions": {
70
+ "status": "supported",
71
+ "evidence": [
72
+ "https://code.claude.com/docs/en/memory"
73
+ ],
74
+ "verification": "Confirm CLAUDE.md is loaded by Claude Code."
75
+ },
76
+ "skills": {
77
+ "status": "supported",
78
+ "evidence": [
79
+ "https://code.claude.com/docs/en/skills"
80
+ ],
81
+ "verification": "Confirm the installed skill is discoverable."
82
+ },
83
+ "agents": {
84
+ "status": "supported",
85
+ "evidence": [
86
+ "https://code.claude.com/docs/en/sub-agents"
87
+ ],
88
+ "verification": "Delegate a test task to an installed agent."
89
+ },
90
+ "scripts": {
91
+ "status": "supported",
92
+ "evidence": [
93
+ "https://code.claude.com/docs/en/hooks"
94
+ ],
95
+ "verification": "Confirm referenced scripts exist."
96
+ },
97
+ "templates": {
98
+ "status": "supported",
99
+ "evidence": [
100
+ "https://code.claude.com/docs/en/skills"
101
+ ],
102
+ "verification": "Confirm a skill can read its template."
103
+ },
104
+ "modes": {
105
+ "status": "supported",
106
+ "evidence": [
107
+ "https://code.claude.com/docs/en/memory"
108
+ ],
109
+ "verification": "Confirm the referenced mode file exists."
110
+ },
111
+ "settings": {
112
+ "status": "supported",
113
+ "evidence": [
114
+ "https://code.claude.com/docs/en/settings"
115
+ ],
116
+ "verification": "Inspect the merged native settings."
117
+ },
118
+ "hooks": {
119
+ "status": "supported",
120
+ "evidence": [
121
+ "https://code.claude.com/docs/en/hooks"
122
+ ],
123
+ "verification": "Exercise one installed hook event.",
124
+ "events": {
125
+ "ConfigChange": {
126
+ "status": "supported"
127
+ },
128
+ "PostCompact": {
129
+ "status": "supported"
130
+ },
131
+ "PostToolUse": {
132
+ "status": "supported"
133
+ },
134
+ "PreCompact": {
135
+ "status": "supported"
136
+ },
137
+ "PreToolUse": {
138
+ "status": "supported"
139
+ },
140
+ "SessionEnd": {
141
+ "status": "supported"
142
+ },
143
+ "SessionStart": {
144
+ "status": "supported"
145
+ },
146
+ "Stop": {
147
+ "status": "supported"
148
+ },
149
+ "SubagentStart": {
150
+ "status": "supported"
151
+ },
152
+ "SubagentStop": {
153
+ "status": "supported"
154
+ },
155
+ "UserPromptSubmit": {
156
+ "status": "supported",
157
+ "note": "DoFlow's once-per-session `/do` suggestion is delivered by this per-prompt hook."
158
+ },
159
+ "PostToolUseFailure": {
160
+ "status": "supported"
161
+ },
162
+ "PermissionDenied": {
163
+ "status": "supported"
164
+ }
165
+ }
166
+ },
167
+ "mcp": {
168
+ "status": "supported",
169
+ "evidence": [
170
+ "https://code.claude.com/docs/en/mcp"
171
+ ],
172
+ "verification": "Confirm selected MCP servers appear in status.",
173
+ "toolName": "mcp__{server}__{tool}"
174
+ },
175
+ "plugin": {
176
+ "status": "supported",
177
+ "evidence": [
178
+ "https://code.claude.com/docs/en/plugins"
179
+ ],
180
+ "verification": "Install or inspect the plugin manifest."
181
+ }
182
+ },
183
+ "orchestration": {
184
+ "spawn": {
185
+ "status": "supported",
186
+ "evidence": [
187
+ "https://code.claude.com/docs/en/tools-reference → Agent: \"Spawns a subagent with its own context window to handle a task.\""
188
+ ],
189
+ "verification": "Ask Claude Code to delegate a task to an installed subagent and confirm a subagent runs.",
190
+ "verifiedOn": "2026-10-12"
191
+ },
192
+ "wait": {
193
+ "status": "supported",
194
+ "evidence": [
195
+ "https://code.claude.com/docs/en/sub-agents → \"Foreground subagents block the main conversation until complete.\"",
196
+ "https://code.claude.com/docs/en/sub-agents → \"A background subagent's results reach Claude as a completion notification in a later turn.\""
197
+ ],
198
+ "verification": "Run a foreground subagent and confirm the main conversation resumes with its result.",
199
+ "verifiedOn": "2026-10-12"
200
+ },
201
+ "status": {
202
+ "status": "supported",
203
+ "evidence": [
204
+ "https://code.claude.com/docs/en/sub-agents → \"To check which model a subagent is running on, run /tasks.\""
205
+ ],
206
+ "verification": "Run /tasks while a background subagent is active.",
207
+ "verifiedOn": "2026-10-12"
208
+ },
209
+ "cancel": {
210
+ "status": "supported",
211
+ "evidence": [
212
+ "https://code.claude.com/docs/en/tools-reference → TaskStop: \"Stops a running background task by ID. It also accepts an agent-team teammate or a named background agent by agent ID or name.\""
213
+ ],
214
+ "verification": "Start a background subagent and stop it with TaskStop.",
215
+ "verifiedOn": "2026-10-12"
216
+ },
217
+ "resume": {
218
+ "status": "supported",
219
+ "evidence": [
220
+ "https://code.claude.com/docs/en/sub-agents → \"Claude uses the SendMessage tool with the agent's ID or name as the to field to resume it.\""
221
+ ],
222
+ "verification": "Complete a subagent, then send it a follow-up through SendMessage and confirm it keeps its history.",
223
+ "verifiedOn": "2026-10-12"
224
+ }
225
+ },
226
+ "scopePrecedence": {
227
+ "status": "established",
228
+ "order": [
229
+ "user",
230
+ "project"
231
+ ],
232
+ "evidence": [
233
+ "https://code.claude.com/docs/en/skills"
234
+ ],
235
+ "note": "The skills doc's \"Resolve skills that share a name\" table states a first-match-wins hierarchy for a same-named skill: \"Enterprise over personal, and personal over project\" -- with `deploy` in both `~/.claude/skills/` and the project's `.claude/skills/`, the personal one runs. Order lists DoFlow's two tracked scopes (user, project); the fuller vendor hierarchy also has an enterprise-managed tier consulted before user. The skills doc states a first-match-wins hierarchy, so the order lists the winner first: the user copy is used.",
236
+ "determinedOn": "2026-09-27",
237
+ "mode": "first-wins"
238
+ }
239
+ },
240
+ {
241
+ "id": "codex",
242
+ "displayName": "Codex",
243
+ "adapter": "codex",
244
+ "scopes": [
245
+ "project",
246
+ "user"
247
+ ],
248
+ "nativeTargets": {
249
+ "instructions": "AGENTS.md",
250
+ "settings": ".codex/config.toml",
251
+ "hooks": ".codex/hooks.json",
252
+ "agents": ".codex/agents/*.toml",
253
+ "mcp": ".codex/config.toml"
254
+ },
255
+ "paths": {
256
+ "configDir": {
257
+ "base": "root",
258
+ "segments": [
259
+ ".codex"
260
+ ]
261
+ },
262
+ "configFile": {
263
+ "base": "root",
264
+ "segments": [
265
+ ".codex",
266
+ "config.toml"
267
+ ]
268
+ },
269
+ "agentsDirectory": {
270
+ "base": "root",
271
+ "segments": [
272
+ ".codex",
273
+ "agents"
274
+ ]
275
+ },
276
+ "hooksFile": {
277
+ "base": "root",
278
+ "segments": [
279
+ ".codex",
280
+ "hooks.json"
281
+ ]
282
+ },
283
+ "hooksDirectory": {
284
+ "base": "root",
285
+ "segments": [
286
+ ".codex",
287
+ "hooks"
288
+ ]
289
+ },
290
+ "instructions": {
291
+ "project": {
292
+ "base": "root",
293
+ "segments": [
294
+ "AGENTS.md"
295
+ ]
296
+ },
297
+ "user": {
298
+ "base": "root",
299
+ "segments": [
300
+ ".codex",
301
+ "AGENTS.md"
302
+ ]
303
+ }
304
+ }
305
+ },
306
+ "nativeProjection": {
307
+ "config": {
308
+ "source": "core/harnesses/codex/config/config.toml",
309
+ "note": "Codex hooks are enabled by default since GA; DoFlow still writes features.hooks=true so older CLI versions that required the opt-in also pick the projection up. The flag now only ever disables (features.hooks=false).",
310
+ "resources": [
311
+ {
312
+ "kind": "configuration-entry",
313
+ "identity": "features.hooks",
314
+ "value": true
315
+ }
316
+ ]
317
+ },
318
+ "mcp": {
319
+ "catalog": "registry.mcp",
320
+ "selection": "optional"
321
+ },
322
+ "agents": {
323
+ "source": "core/harnesses/codex/agents"
324
+ },
325
+ "hooks": {
326
+ "configSource": "core/harnesses/codex/hooks/hooks.json",
327
+ "scriptsSource": "core/harnesses/codex/hooks",
328
+ "trusted": false
329
+ }
330
+ },
331
+ "capabilities": {
332
+ "instructions": {
333
+ "status": "supported",
334
+ "evidence": [
335
+ "https://learn.chatgpt.com/docs/agent-configuration/agents-md"
336
+ ],
337
+ "verification": "Confirm the managed AGENTS.md section is applied at the project root (or ~/.codex/AGENTS.md globally)."
338
+ },
339
+ "skills": {
340
+ "status": "supported",
341
+ "evidence": [
342
+ "https://learn.chatgpt.com/docs/build-skills"
343
+ ],
344
+ "verification": "Confirm Codex discovers the installed skill from .agents/skills (repo scope) or ~/.agents/skills (user scope); Codex never scans .codex/skills."
345
+ },
346
+ "agents": {
347
+ "status": "supported",
348
+ "evidence": [
349
+ "https://learn.chatgpt.com/docs/agent-configuration/subagents"
350
+ ],
351
+ "verification": "Delegate a test task to a custom agent."
352
+ },
353
+ "scripts": {
354
+ "status": "supported",
355
+ "evidence": [
356
+ "https://learn.chatgpt.com/docs/customization/overview"
357
+ ],
358
+ "verification": "Confirm referenced scripts exist."
359
+ },
360
+ "templates": {
361
+ "status": "supported",
362
+ "evidence": [
363
+ "https://learn.chatgpt.com/docs/customization/overview"
364
+ ],
365
+ "verification": "Confirm a skill can read its template."
366
+ },
367
+ "modes": {
368
+ "status": "unavailable",
369
+ "evidence": [
370
+ "https://learn.chatgpt.com/docs/customization/overview"
371
+ ],
372
+ "verification": "Report the capability gap; do not render a native mode."
373
+ },
374
+ "settings": {
375
+ "status": "different",
376
+ "evidence": [
377
+ "https://learn.chatgpt.com/docs/config-file/config-advanced"
378
+ ],
379
+ "prerequisites": [
380
+ "trusted-project"
381
+ ],
382
+ "verification": "Inspect the reconciled config.toml."
383
+ },
384
+ "hooks": {
385
+ "status": "supported",
386
+ "evidence": [
387
+ "https://learn.chatgpt.com/docs/hooks"
388
+ ],
389
+ "prerequisites": [
390
+ "trusted-project",
391
+ "hook-review"
392
+ ],
393
+ "verification": "Review and exercise a mapped hook.",
394
+ "events": {
395
+ "SessionStart": {
396
+ "status": "supported"
397
+ },
398
+ "SessionEnd": {
399
+ "status": "supported"
400
+ },
401
+ "UserPromptSubmit": {
402
+ "status": "supported",
403
+ "note": "DoFlow's once-per-session `/do` suggestion is delivered by this per-prompt hook."
404
+ },
405
+ "Stop": {
406
+ "status": "supported"
407
+ },
408
+ "PreToolUse": {
409
+ "status": "supported"
410
+ },
411
+ "PostToolUse": {
412
+ "status": "supported"
413
+ },
414
+ "SubagentStart": {
415
+ "status": "supported"
416
+ },
417
+ "SubagentStop": {
418
+ "status": "supported"
419
+ },
420
+ "PreCompact": {
421
+ "status": "supported"
422
+ },
423
+ "PostToolUseFailure": {
424
+ "status": "unavailable",
425
+ "note": "No Codex event fires only on tool failure; PostToolUse cannot distinguish the two."
426
+ },
427
+ "PermissionDenied": {
428
+ "status": "unavailable",
429
+ "note": "Codex documents PermissionRequest before an approval prompt and no event after a denial."
430
+ },
431
+ "PermissionRequest": {
432
+ "status": "different",
433
+ "note": "Native PermissionRequest runs before an approval prompt; DoFlow projects no policy to it on Codex."
434
+ },
435
+ "PostCompact": {
436
+ "status": "different",
437
+ "note": "Native PostCompact exists; DoFlow's post-compact policy is not projected to Codex."
438
+ },
439
+ "Interrupt": {
440
+ "status": "different",
441
+ "note": "Native Interrupt runs when a turn is interrupted, not for subagents; no DoFlow policy maps to it."
442
+ }
443
+ }
444
+ },
445
+ "mcp": {
446
+ "status": "supported",
447
+ "evidence": [
448
+ "https://learn.chatgpt.com/docs/extend/mcp"
449
+ ],
450
+ "verification": "Confirm selected MCP servers connect."
451
+ },
452
+ "plugin": {
453
+ "status": "supported",
454
+ "evidence": [
455
+ "https://learn.chatgpt.com/docs/build-plugins"
456
+ ],
457
+ "prerequisites": [
458
+ "user-activation"
459
+ ],
460
+ "verification": "Confirm the plugin is enabled by the host."
461
+ }
462
+ },
463
+ "orchestration": {
464
+ "spawn": {
465
+ "status": "supported",
466
+ "evidence": [
467
+ "https://learn.chatgpt.com/docs/agent-configuration/subagents → \"Ask for subagents or parallel agent work directly.\""
468
+ ],
469
+ "verification": "Ask Codex to spawn two agents and confirm both appear under Subagents.",
470
+ "verifiedOn": "2026-10-12"
471
+ },
472
+ "wait": {
473
+ "status": "supported",
474
+ "evidence": [
475
+ "https://learn.chatgpt.com/docs/agent-configuration/subagents → \"When many agents are running, Codex waits until all requested results are available, then returns a consolidated response.\""
476
+ ],
477
+ "verification": "Spawn two agents and confirm one consolidated response arrives after both finish.",
478
+ "verifiedOn": "2026-10-12"
479
+ },
480
+ "status": {
481
+ "status": "supported",
482
+ "evidence": [
483
+ "https://learn.chatgpt.com/docs/agent-configuration/subagents → \"Open Subagents to see read-only Active and Done lists.\" and \"Use /agent in the CLI to switch between active agent threads and inspect the ongoing thread.\""
484
+ ],
485
+ "verification": "Open Subagents or run /agent while a subagent is active.",
486
+ "verifiedOn": "2026-10-12"
487
+ },
488
+ "cancel": {
489
+ "status": "supported",
490
+ "evidence": [
491
+ "https://learn.chatgpt.com/docs/agent-configuration/subagents → \"Ask Codex directly to steer a running subagent, stop it, or close completed agent threads.\""
492
+ ],
493
+ "verification": "Ask Codex to stop a running subagent and confirm the thread ends.",
494
+ "verifiedOn": "2026-10-12"
495
+ },
496
+ "resume": {
497
+ "status": "unknown",
498
+ "evidence": [],
499
+ "verification": "Re-read https://learn.chatgpt.com/docs/agent-configuration/subagents; `codex resume` resumes a session (observed in `codex --help`, codex-cli 0.162.1) and is not recorded as a subagent resume.",
500
+ "verifiedOn": "2026-10-12",
501
+ "fallback": "manual",
502
+ "reason": "https://learn.chatgpt.com/docs/agent-configuration/subagents was read on 2026-10-12 and does not state a resume operation; nothing is inferred from another harness or a model name."
503
+ }
504
+ },
505
+ "scopePrecedence": {
506
+ "status": "established",
507
+ "order": [
508
+ "user",
509
+ "project"
510
+ ],
511
+ "evidence": [
512
+ "https://learn.chatgpt.com/docs/agent-configuration/agents-md"
513
+ ],
514
+ "note": "AGENTS.md discovery is documented as: \"1. Global scope: In your Codex home directory ... Codex reads AGENTS.override.md if it exists. Otherwise, Codex reads AGENTS.md. 2. Project scope: Starting at the project root ...\", then \"Codex concatenates files from the root down ... Files closer to your current directory override earlier guidance because they appear later in the combined prompt.\" Codex concatenates and states that files closer to the working directory override earlier guidance because they appear later, so the LAST scope consulted takes effect: the project copy wins despite being consulted second.",
515
+ "determinedOn": "2026-09-27",
516
+ "mode": "last-wins"
517
+ }
518
+ },
519
+ {
520
+ "id": "gemini",
521
+ "displayName": "Gemini CLI",
522
+ "adapter": "gemini",
523
+ "scopes": [
524
+ "project",
525
+ "user"
526
+ ],
527
+ "nativeTargets": {
528
+ "instructions": "GEMINI.md",
529
+ "agents": ".gemini/agents",
530
+ "hooks": "settings.json"
531
+ },
532
+ "paths": {
533
+ "configDir": {
534
+ "project": {
535
+ "base": "root",
536
+ "segments": [
537
+ ".agents"
538
+ ]
539
+ },
540
+ "user": {
541
+ "base": "root",
542
+ "segments": [
543
+ ".gemini",
544
+ "config"
545
+ ]
546
+ }
547
+ },
548
+ "instruction": {
549
+ "project": {
550
+ "base": "root",
551
+ "segments": [
552
+ "GEMINI.md"
553
+ ]
554
+ },
555
+ "user": {
556
+ "base": "root",
557
+ "segments": [
558
+ ".gemini",
559
+ "GEMINI.md"
560
+ ]
561
+ }
562
+ },
563
+ "settings": {
564
+ "base": "root",
565
+ "segments": [
566
+ ".gemini",
567
+ "settings.json"
568
+ ]
569
+ },
570
+ "hooksDirectory": {
571
+ "base": "root",
572
+ "segments": [
573
+ ".gemini",
574
+ "hooks"
575
+ ]
576
+ }
577
+ },
578
+ "capabilities": {
579
+ "instructions": {
580
+ "status": "supported",
581
+ "evidence": [
582
+ "https://geminicli.com/docs/cli/gemini-md/"
583
+ ],
584
+ "verification": "Confirm GEMINI.md is loaded by Gemini CLI."
585
+ },
586
+ "skills": {
587
+ "status": "supported",
588
+ "evidence": [
589
+ "https://geminicli.com/docs/cli/skills/"
590
+ ],
591
+ "verification": "Confirm the installed skill is discoverable."
592
+ },
593
+ "agents": {
594
+ "status": "supported",
595
+ "evidence": [
596
+ "https://geminicli.com/docs/core/subagents"
597
+ ],
598
+ "note": "Flat <name>.md files; frontmatter limited to Gemini's documented keys by the gemini-agents transform.",
599
+ "verification": "Confirm Gemini CLI lists the installed agents from .gemini/agents."
600
+ },
601
+ "scripts": {
602
+ "status": "supported",
603
+ "evidence": [
604
+ "https://geminicli.com/docs/reference/tools",
605
+ "https://geminicli.com/docs/cli/creating-skills"
606
+ ],
607
+ "verification": "Confirm run_shell_command executes an installed helper and that a bundled skill scripts/ directory is reachable."
608
+ },
609
+ "templates": {
610
+ "status": "supported",
611
+ "evidence": [
612
+ "https://geminicli.com/docs/cli/creating-skills",
613
+ "https://geminicli.com/docs/cli/skills-best-practices"
614
+ ],
615
+ "verification": "Confirm the installed template tree is readable by the agent."
616
+ },
617
+ "modes": {
618
+ "status": "different",
619
+ "evidence": [
620
+ "https://geminicli.com/docs/cli/gemini-md/"
621
+ ],
622
+ "verification": "Confirm mode guidance is available through instructions."
623
+ },
624
+ "settings": {
625
+ "status": "different",
626
+ "evidence": [
627
+ "https://geminicli.com/docs/cli/settings/"
628
+ ],
629
+ "verification": "Verify only adapter-supported native settings."
630
+ },
631
+ "hooks": {
632
+ "status": "supported",
633
+ "evidence": [
634
+ "https://geminicli.com/docs/hooks/"
635
+ ],
636
+ "verification": "Exercise one installed hook event.",
637
+ "events": {
638
+ "SessionStart": {
639
+ "status": "supported"
640
+ },
641
+ "SessionEnd": {
642
+ "status": "supported"
643
+ },
644
+ "BeforeTool": {
645
+ "status": "supported"
646
+ },
647
+ "AfterTool": {
648
+ "status": "supported"
649
+ },
650
+ "PreCompress": {
651
+ "status": "supported"
652
+ },
653
+ "UserPromptSubmit": {
654
+ "status": "unavailable",
655
+ "note": "No Gemini equivalent; the nearest native hook is BeforeAgent, which fires once before planning and can block the turn or inject context — not a per-prompt pre-submission gate. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
656
+ },
657
+ "Stop": {
658
+ "status": "unavailable",
659
+ "note": "No exact match; AfterAgent fires at agent-loop end and can halt or retry the turn, which is coarser than Claude's Stop."
660
+ },
661
+ "SubagentStart": {
662
+ "status": "unavailable",
663
+ "note": "BeforeAgent/AfterAgent bracket the whole agent loop; they are not subagent lifecycle events."
664
+ },
665
+ "SubagentStop": {
666
+ "status": "unavailable",
667
+ "note": "BeforeAgent/AfterAgent bracket the whole agent loop; they are not subagent lifecycle events."
668
+ },
669
+ "PostToolUseFailure": {
670
+ "status": "unavailable",
671
+ "note": "AfterTool fires regardless of outcome; failure cannot be isolated."
672
+ },
673
+ "PermissionDenied": {
674
+ "status": "unavailable",
675
+ "note": "Gemini exposes no permission-decision event."
676
+ }
677
+ }
678
+ },
679
+ "mcp": {
680
+ "status": "different",
681
+ "evidence": [
682
+ "https://geminicli.com/docs/tools/mcp-server/"
683
+ ],
684
+ "verification": "Verify only adapter-supported MCP registration."
685
+ },
686
+ "plugin": {
687
+ "status": "different",
688
+ "evidence": [
689
+ "https://geminicli.com/docs/extensions/"
690
+ ],
691
+ "note": "Extensions (gemini-extension.json) now package skills, hooks, sub-agents, and MCP; security.blockGitExtensions/allowedExtensions can gate Git-sourced installs. Context: Google sunset Gemini CLI for consumer tiers on 2026-06-18 — enterprise/paid-API use only; Antigravity CLI (GA 2026-05-19, antigravity.google/docs/gcli-migration) is the successor surface carrying skills/hooks/subagents/plugins.",
692
+ "verification": "Verify extensions through the native host workflow."
693
+ }
694
+ },
695
+ "orchestration": {
696
+ "spawn": {
697
+ "status": "supported",
698
+ "evidence": [
699
+ "https://geminicli.com/docs/core/subagents → \"When the main agent calls the tool, it delegates the task to the subagent.\"",
700
+ "https://geminicli.com/docs/core/subagents → \"You can explicitly direct a task to a specific subagent by using the @ symbol followed by the subagent's name at the beginning of your prompt.\""
701
+ ],
702
+ "verification": "Prompt with @<subagent> and confirm the subagent runs.",
703
+ "verifiedOn": "2026-10-12"
704
+ },
705
+ "wait": {
706
+ "status": "supported",
707
+ "evidence": [
708
+ "https://geminicli.com/docs/core/subagents → \"Once the subagent completes its task, it reports back to the main agent with its findings.\""
709
+ ],
710
+ "verification": "Delegate a task and confirm the main agent continues from the subagent report.",
711
+ "verifiedOn": "2026-10-12"
712
+ },
713
+ "status": {
714
+ "status": "unknown",
715
+ "evidence": [],
716
+ "verification": "Re-read https://geminicli.com/docs/core/subagents and the Gemini CLI changelog for a status operation.",
717
+ "verifiedOn": "2026-10-12",
718
+ "fallback": "sequential",
719
+ "reason": "https://geminicli.com/docs/core/subagents was read on 2026-10-12 and does not state a status operation; nothing is inferred from another harness or a model name."
720
+ },
721
+ "cancel": {
722
+ "status": "unknown",
723
+ "evidence": [],
724
+ "verification": "Re-read https://geminicli.com/docs/core/subagents for a stop operation.",
725
+ "verifiedOn": "2026-10-12",
726
+ "fallback": "sequential",
727
+ "reason": "https://geminicli.com/docs/core/subagents was read on 2026-10-12 and does not state a cancel operation; nothing is inferred from another harness or a model name."
728
+ },
729
+ "resume": {
730
+ "status": "unknown",
731
+ "evidence": [],
732
+ "verification": "Re-read https://geminicli.com/docs/core/subagents for a resume operation.",
733
+ "verifiedOn": "2026-10-12",
734
+ "fallback": "manual",
735
+ "reason": "https://geminicli.com/docs/core/subagents was read on 2026-10-12 and does not state a resume operation; nothing is inferred from another harness or a model name."
736
+ }
737
+ },
738
+ "scopePrecedence": {
739
+ "status": "established",
740
+ "order": [
741
+ "user",
742
+ "project"
743
+ ],
744
+ "evidence": [
745
+ "https://geminicli.com/docs/cli/gemini-md/"
746
+ ],
747
+ "note": "The CLI loads context files in the following order: (1) global context file at ~/.gemini/GEMINI.md, (2) environment/workspace context files (project directory and its parents), (3) just-in-time files read on demand from directories a tool touches. The page states this loading order but explicitly does not state a conflict-resolution rule -- contents are concatenated and sent to the model together. Order here reflects DoFlow's two tracked scopes; the documented third, finer-grained JIT tier is omitted. The load order is documented but the page explicitly states no conflict-resolution rule and describes contents being concatenated and sent together, so no copy can be said to win. Order established, winner not.",
748
+ "determinedOn": "2026-09-27",
749
+ "mode": "unestablished"
750
+ }
751
+ },
752
+ {
753
+ "id": "opencode",
754
+ "displayName": "OpenCode",
755
+ "adapter": "opencode",
756
+ "scopes": [
757
+ "project",
758
+ "user"
759
+ ],
760
+ "nativeTargets": {
761
+ "instructions": "AGENTS.md",
762
+ "settings": "opencode.json",
763
+ "mcp": "opencode.json"
764
+ },
765
+ "paths": {
766
+ "configDir": {
767
+ "project": {
768
+ "base": "root",
769
+ "segments": []
770
+ },
771
+ "user": {
772
+ "base": "root",
773
+ "segments": [
774
+ ".config",
775
+ "opencode"
776
+ ]
777
+ }
778
+ },
779
+ "instruction": {
780
+ "project": {
781
+ "base": "root",
782
+ "segments": [
783
+ "AGENTS.md"
784
+ ]
785
+ },
786
+ "user": {
787
+ "base": "root",
788
+ "segments": [
789
+ ".config",
790
+ "opencode",
791
+ "AGENTS.md"
792
+ ]
793
+ }
794
+ },
795
+ "config": {
796
+ "project": {
797
+ "base": "root",
798
+ "segments": [
799
+ "opencode.json"
800
+ ]
801
+ },
802
+ "user": {
803
+ "base": "root",
804
+ "segments": [
805
+ ".config",
806
+ "opencode",
807
+ "opencode.json"
808
+ ]
809
+ }
810
+ },
811
+ "treeRoot": {
812
+ "project": {
813
+ "base": "root",
814
+ "segments": [
815
+ ".opencode"
816
+ ]
817
+ },
818
+ "user": {
819
+ "base": "root",
820
+ "segments": [
821
+ ".config",
822
+ "opencode"
823
+ ]
824
+ }
825
+ },
826
+ "agentsDirectory": {
827
+ "project": {
828
+ "base": "root",
829
+ "segments": [
830
+ ".opencode",
831
+ "agents"
832
+ ]
833
+ },
834
+ "user": {
835
+ "base": "root",
836
+ "segments": [
837
+ ".config",
838
+ "opencode",
839
+ "agents"
840
+ ]
841
+ }
842
+ }
843
+ },
844
+ "capabilities": {
845
+ "instructions": {
846
+ "status": "supported",
847
+ "evidence": [
848
+ "https://opencode.ai/docs/rules"
849
+ ],
850
+ "verification": "Confirm AGENTS.md is loaded, and that opencode.json instructions[] pulls in the DoFlow guidance pointer."
851
+ },
852
+ "skills": {
853
+ "status": "supported",
854
+ "evidence": [
855
+ "https://opencode.ai/docs/skills",
856
+ "https://opencode.ai/docs/rules"
857
+ ],
858
+ "verification": "Confirm OpenCode discovers DoFlow skills from the registered directory rather than a copied tree."
859
+ },
860
+ "agents": {
861
+ "status": "supported",
862
+ "evidence": [
863
+ "https://opencode.ai/docs/agents"
864
+ ],
865
+ "note": "OpenCode supports native agent definitions as Markdown files with frontmatter (description, mode primary|subagent, model, temperature, permission, hidden) discovered at .opencode/agents/ (project) and ~/.config/opencode/agents/ (global); agents are also definable in opencode.json's agent key. DoFlow still projects specialist guidance through instructions; direct projection into these directories is planned and will reuse copy-tree's layout rename.",
866
+ "verification": "Confirm a native agent under .opencode/agents/ or ~/.config/opencode/agents/ is selectable (Tab cycles primary agents; @ mentions invoke subagents)."
867
+ },
868
+ "scripts": {
869
+ "status": "supported",
870
+ "evidence": [
871
+ "https://opencode.ai/docs/skills"
872
+ ],
873
+ "verification": "Confirm a bundled skill scripts/ directory is reachable from the registered skills path."
874
+ },
875
+ "templates": {
876
+ "status": "supported",
877
+ "evidence": [
878
+ "https://opencode.ai/docs/rules"
879
+ ],
880
+ "verification": "Confirm the installed template tree is readable by the agent."
881
+ },
882
+ "modes": {
883
+ "status": "different",
884
+ "evidence": [
885
+ "https://opencode.ai/docs/rules"
886
+ ],
887
+ "note": "OpenCode has no separate mode surface; DoFlow mode guidance is reachable through the instructions pointer.",
888
+ "verification": "Confirm mode guidance is available through instructions."
889
+ },
890
+ "settings": {
891
+ "status": "supported",
892
+ "evidence": [
893
+ "https://opencode.ai/docs/config"
894
+ ],
895
+ "verification": "Confirm opencode.json retains user keys and only DoFlow-owned entries change."
896
+ },
897
+ "hooks": {
898
+ "status": "different",
899
+ "evidence": [
900
+ "https://opencode.ai/docs/plugins"
901
+ ],
902
+ "note": "OpenCode extends behaviour through JavaScript/TypeScript plugin modules, not the shell hook scripts DoFlow ships, so no hook projection is attempted.",
903
+ "verification": "Report that DoFlow installs no OpenCode plugin and its shell hooks do not apply here.",
904
+ "events": {
905
+ "PreToolUse": {
906
+ "status": "different",
907
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: tool.execute.before."
908
+ },
909
+ "PostToolUse": {
910
+ "status": "different",
911
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: tool.execute.after."
912
+ },
913
+ "SessionStart": {
914
+ "status": "different",
915
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: session.created."
916
+ },
917
+ "SessionEnd": {
918
+ "status": "different",
919
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: session.idle / session.deleted."
920
+ },
921
+ "PreCompact": {
922
+ "status": "different",
923
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: experimental.session.compacting."
924
+ },
925
+ "PostCompact": {
926
+ "status": "different",
927
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: session.compacted."
928
+ },
929
+ "PermissionDenied": {
930
+ "status": "different",
931
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: permission.replied, whose payload carries the decision."
932
+ },
933
+ "Stop": {
934
+ "status": "different",
935
+ "note": "DoFlow projects shell hooks; OpenCode requires a code module, so no hook is installed. Native equivalent: session.idle."
936
+ },
937
+ "UserPromptSubmit": {
938
+ "status": "unavailable",
939
+ "note": "OpenCode exposes message.updated rather than a pre-submission prompt event, so a hook could not gate a prompt before the model sees it. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
940
+ },
941
+ "SubagentStart": {
942
+ "status": "unavailable",
943
+ "note": "OpenCode publishes no subagent lifecycle event."
944
+ },
945
+ "SubagentStop": {
946
+ "status": "unavailable",
947
+ "note": "OpenCode publishes no subagent lifecycle event."
948
+ },
949
+ "PostToolUseFailure": {
950
+ "status": "unavailable",
951
+ "note": "tool.execute.after fires for both outcomes; no failure-only event exists."
952
+ },
953
+ "ConfigChange": {
954
+ "status": "unavailable",
955
+ "note": "installation.updated tracks OpenCode upgrades, not configuration edits."
956
+ }
957
+ }
958
+ },
959
+ "mcp": {
960
+ "status": "supported",
961
+ "evidence": [
962
+ "https://opencode.ai/docs/mcp-servers"
963
+ ],
964
+ "verification": "Confirm selected MCP servers appear under the mcp key in opencode.json."
965
+ },
966
+ "plugin": {
967
+ "status": "different",
968
+ "evidence": [
969
+ "https://opencode.ai/docs/plugins"
970
+ ],
971
+ "note": "DoFlow publishes no OpenCode plugin package; its content reaches OpenCode by registration rather than plugin distribution.",
972
+ "verification": "Report that no plugin package is installed for OpenCode."
973
+ }
974
+ },
975
+ "orchestration": {
976
+ "spawn": {
977
+ "status": "supported",
978
+ "evidence": [
979
+ "https://opencode.ai/docs/agents → \"Control which subagents an agent can invoke via the Task tool with permission.task.\"",
980
+ "https://opencode.ai/docs/agents → \"Subagents can be invoked: Automatically by primary agents for specialized tasks based on their descriptions. Manually by @ mentioning a subagent in your message.\""
981
+ ],
982
+ "verification": "Mention a subagent with @ or let a primary agent call the Task tool and confirm a child session starts.",
983
+ "verifiedOn": "2026-10-12"
984
+ },
985
+ "wait": {
986
+ "status": "unknown",
987
+ "evidence": [],
988
+ "verification": "Re-read https://opencode.ai/docs/agents and https://opencode.ai/docs/tools for a wait operation.",
989
+ "verifiedOn": "2026-10-12",
990
+ "fallback": "sequential",
991
+ "reason": "https://opencode.ai/docs/agents was read on 2026-10-12 and does not state a wait operation; nothing is inferred from another harness or a model name."
992
+ },
993
+ "status": {
994
+ "status": "unknown",
995
+ "evidence": [],
996
+ "verification": "Re-read https://opencode.ai/docs/agents for a status operation.",
997
+ "verifiedOn": "2026-10-12",
998
+ "fallback": "sequential",
999
+ "reason": "https://opencode.ai/docs/agents describes keybinds to enter and leave child sessions but states no status operation; nothing is inferred."
1000
+ },
1001
+ "cancel": {
1002
+ "status": "unknown",
1003
+ "evidence": [],
1004
+ "verification": "Re-read https://opencode.ai/docs/agents for a stop operation.",
1005
+ "verifiedOn": "2026-10-12",
1006
+ "fallback": "sequential",
1007
+ "reason": "https://opencode.ai/docs/agents was read on 2026-10-12 and does not state a cancel operation; nothing is inferred from another harness or a model name."
1008
+ },
1009
+ "resume": {
1010
+ "status": "unknown",
1011
+ "evidence": [],
1012
+ "verification": "Re-read https://opencode.ai/docs/agents for a resume operation.",
1013
+ "verifiedOn": "2026-10-12",
1014
+ "fallback": "manual",
1015
+ "reason": "https://opencode.ai/docs/agents was read on 2026-10-12 and does not state a resume operation; nothing is inferred from another harness or a model name."
1016
+ }
1017
+ },
1018
+ "scopePrecedence": {
1019
+ "status": "established",
1020
+ "order": [
1021
+ "project",
1022
+ "user"
1023
+ ],
1024
+ "evidence": [
1025
+ "https://opencode.ai/docs/rules"
1026
+ ],
1027
+ "note": "\"When opencode starts, it looks for rule files in this order: 1. Local files by traversing up from the current directory (AGENTS.md, CLAUDE.md) 2. Global file at ~/.config/opencode/AGENTS.md\", and \"The first matching file wins in each category.\" A community issue (anomalyco/opencode#9282, filed 2026-01-18) argues project and global files are actually combined rather than one overriding the other; this block records only the documented consultation order above, not that unresolved merge-vs-override dispute. The rules doc states the first matching file wins, so the order lists the winner first: the project copy is used.",
1028
+ "determinedOn": "2026-09-27",
1029
+ "mode": "first-wins"
1030
+ }
1031
+ },
1032
+ {
1033
+ "id": "pi",
1034
+ "displayName": "Pi Coding Agent",
1035
+ "adapter": "pi",
1036
+ "scopes": [
1037
+ "project",
1038
+ "user"
1039
+ ],
1040
+ "nativeTargets": {
1041
+ "instructions": "AGENTS.md",
1042
+ "settings": ".pi/settings.json",
1043
+ "mcp": ".pi/mcp.json"
1044
+ },
1045
+ "paths": {
1046
+ "configDir": {
1047
+ "project": {
1048
+ "base": "root",
1049
+ "segments": [
1050
+ ".pi"
1051
+ ]
1052
+ },
1053
+ "user": {
1054
+ "base": "root",
1055
+ "segments": [
1056
+ ".pi",
1057
+ "agent"
1058
+ ]
1059
+ }
1060
+ },
1061
+ "settings": {
1062
+ "project": {
1063
+ "base": "root",
1064
+ "segments": [
1065
+ ".pi",
1066
+ "settings.json"
1067
+ ]
1068
+ },
1069
+ "user": {
1070
+ "base": "root",
1071
+ "segments": [
1072
+ ".pi",
1073
+ "agent",
1074
+ "settings.json"
1075
+ ]
1076
+ }
1077
+ },
1078
+ "instruction": {
1079
+ "project": {
1080
+ "base": "root",
1081
+ "segments": [
1082
+ "AGENTS.md"
1083
+ ]
1084
+ },
1085
+ "user": {
1086
+ "base": "root",
1087
+ "segments": [
1088
+ ".pi",
1089
+ "agent",
1090
+ "AGENTS.md"
1091
+ ]
1092
+ }
1093
+ },
1094
+ "mcp": {
1095
+ "project": {
1096
+ "base": "root",
1097
+ "segments": [
1098
+ ".pi",
1099
+ "mcp.json"
1100
+ ]
1101
+ },
1102
+ "user": {
1103
+ "base": "root",
1104
+ "segments": [
1105
+ ".pi",
1106
+ "agent",
1107
+ "mcp.json"
1108
+ ]
1109
+ }
1110
+ }
1111
+ },
1112
+ "capabilities": {
1113
+ "instructions": {
1114
+ "status": "supported",
1115
+ "evidence": [
1116
+ "https://pi.dev/docs/latest/quickstart"
1117
+ ],
1118
+ "verification": "Confirm Pi loads AGENTS.md from the project (or ~/.pi/agent/AGENTS.md globally)."
1119
+ },
1120
+ "skills": {
1121
+ "status": "supported",
1122
+ "evidence": [
1123
+ "https://pi.dev/docs/latest/skills"
1124
+ ],
1125
+ "verification": "Confirm the DoFlow skills are copied into .pi/skills (project) or ~/.pi/agent/skills (global), settings.json is unchanged, and Pi lists those skills."
1126
+ },
1127
+ "agents": {
1128
+ "status": "different",
1129
+ "evidence": [
1130
+ "https://pi.dev/docs/latest/extensions"
1131
+ ],
1132
+ "note": "Pi has no declarative agent-spec directory; specialist guidance reaches it through instructions and skills instead.",
1133
+ "verification": "Report that agent guidance arrives via instructions, not a native agent registry."
1134
+ },
1135
+ "scripts": {
1136
+ "status": "supported",
1137
+ "evidence": [
1138
+ "https://pi.dev/docs/latest/skills"
1139
+ ],
1140
+ "verification": "Confirm a bundled skill scripts/ directory is reachable from the registered skills path."
1141
+ },
1142
+ "templates": {
1143
+ "status": "supported",
1144
+ "evidence": [
1145
+ "https://pi.dev/docs/latest/skills"
1146
+ ],
1147
+ "verification": "Confirm the installed template tree is readable by the agent."
1148
+ },
1149
+ "modes": {
1150
+ "status": "different",
1151
+ "evidence": [
1152
+ "https://pi.dev/docs/latest/quickstart"
1153
+ ],
1154
+ "note": "Pi has no separate mode surface; DoFlow mode guidance is reachable through the instructions pointer.",
1155
+ "verification": "Confirm mode guidance is available through instructions."
1156
+ },
1157
+ "settings": {
1158
+ "status": "supported",
1159
+ "evidence": [
1160
+ "https://pi.dev/docs/latest/settings"
1161
+ ],
1162
+ "verification": "Confirm ~/.pi/agent/settings.json (or .pi/settings.json) retains user keys and only DoFlow-owned entries change."
1163
+ },
1164
+ "hooks": {
1165
+ "status": "different",
1166
+ "evidence": [
1167
+ "https://pi.dev/docs/latest/extensions"
1168
+ ],
1169
+ "note": "Pi lifecycle hooks are TypeScript extension modules registered through pi.on(), executing arbitrary code with full permissions — a different trust model from the shell hooks DoFlow ships, so no hook projection is attempted.",
1170
+ "verification": "Report that DoFlow installs no Pi extension and its shell hooks do not apply here.",
1171
+ "events": {
1172
+ "SessionStart": {
1173
+ "status": "different",
1174
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: session_start, which carries reason:\"reload\" on /reload."
1175
+ },
1176
+ "SessionEnd": {
1177
+ "status": "different",
1178
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: session_shutdown."
1179
+ },
1180
+ "UserPromptSubmit": {
1181
+ "status": "different",
1182
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: input, which fires before skill expansion. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
1183
+ },
1184
+ "PreCompact": {
1185
+ "status": "different",
1186
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: session_before_compact, which may cancel or supply a summary."
1187
+ },
1188
+ "PostCompact": {
1189
+ "status": "different",
1190
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: compaction_end."
1191
+ },
1192
+ "PreToolUse": {
1193
+ "status": "different",
1194
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: tool_execution_start, exposed through session.subscribe rather than pi.on."
1195
+ },
1196
+ "PostToolUse": {
1197
+ "status": "different",
1198
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: tool_execution_end, exposed through session.subscribe rather than pi.on."
1199
+ },
1200
+ "Stop": {
1201
+ "status": "different",
1202
+ "note": "DoFlow projects shell hooks; Pi requires a code module, so no hook is installed. Native equivalent: agent_end."
1203
+ },
1204
+ "SubagentStart": {
1205
+ "status": "unavailable",
1206
+ "note": "Pi publishes no subagent lifecycle event."
1207
+ },
1208
+ "SubagentStop": {
1209
+ "status": "unavailable",
1210
+ "note": "Pi publishes no subagent lifecycle event."
1211
+ },
1212
+ "PostToolUseFailure": {
1213
+ "status": "unavailable",
1214
+ "note": "tool_execution_end reports both outcomes; no failure-only event exists."
1215
+ },
1216
+ "PermissionDenied": {
1217
+ "status": "unavailable",
1218
+ "note": "Pi has no permission-decision event; extensions run with full permissions rather than gating them."
1219
+ },
1220
+ "ConfigChange": {
1221
+ "status": "unavailable",
1222
+ "note": "Pi reloads configuration via /reload, surfaced as session_start with reason \"reload\", not as a distinct config event."
1223
+ }
1224
+ }
1225
+ },
1226
+ "mcp": {
1227
+ "status": "supported",
1228
+ "evidence": [
1229
+ "https://pi.dev/docs/latest/mcp",
1230
+ "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/mcp.md",
1231
+ "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md"
1232
+ ],
1233
+ "note": "Pi's built-in MCP (Pi 0.99.0 or later) reads stdio and HTTP servers from the mcpServers map of .pi/mcp.json (project, read only after the project is trusted) and ~/.pi/agent/mcp.json (user, or $PI_CODING_AGENT_DIR/mcp.json); a project entry replaces a user entry with the same name, and from Pi 1.0.1 a project entry without command or url overrides only enabled, exposure and toolExposure of that user entry. DoFlow writes stdio entries only. An installed extension that registers /mcp, such as pi-mcp-adapter, replaces the built-in and Pi then does not read mcp.json.",
1234
+ "verification": "Confirm the selected MCP servers appear in .pi/mcp.json (project, after trusting the project) or ~/.pi/agent/mcp.json (global) and connect via /mcp in Pi 0.99.0 or later with no extension registering /mcp."
1235
+ },
1236
+ "plugin": {
1237
+ "status": "different",
1238
+ "evidence": [
1239
+ "https://pi.dev/docs/latest/extensions"
1240
+ ],
1241
+ "note": "DoFlow publishes no Pi extension package; its content reaches Pi by registration rather than extension distribution.",
1242
+ "verification": "Report that no extension package is installed for Pi."
1243
+ }
1244
+ },
1245
+ "orchestration": {
1246
+ "spawn": {
1247
+ "status": "unsupported",
1248
+ "evidence": [
1249
+ "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md → \"Pi ships with powerful defaults but skips features like sub-agents and plan mode.\""
1250
+ ],
1251
+ "verification": "Re-read https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md and https://pi.dev/docs/latest/extensions; an extension may add subagents, which is not recorded as a Pi capability.",
1252
+ "verifiedOn": "2026-10-12",
1253
+ "fallback": "sequential"
1254
+ },
1255
+ "wait": {
1256
+ "status": "unknown",
1257
+ "evidence": [],
1258
+ "verification": "Re-read https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md for a wait operation.",
1259
+ "verifiedOn": "2026-10-12",
1260
+ "fallback": "sequential",
1261
+ "reason": "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md states no wait operation; https://pi.dev/docs/latest/extensions was read on 2026-10-12 and states no subagent operation. Nothing is inferred."
1262
+ },
1263
+ "status": {
1264
+ "status": "unknown",
1265
+ "evidence": [],
1266
+ "verification": "Re-read https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md for a status operation.",
1267
+ "verifiedOn": "2026-10-12",
1268
+ "fallback": "sequential",
1269
+ "reason": "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md states no status operation; https://pi.dev/docs/latest/extensions states no subagent operation. Nothing is inferred."
1270
+ },
1271
+ "cancel": {
1272
+ "status": "unknown",
1273
+ "evidence": [],
1274
+ "verification": "Re-read https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md for a cancel operation.",
1275
+ "verifiedOn": "2026-10-12",
1276
+ "fallback": "sequential",
1277
+ "reason": "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md states no cancel operation; https://pi.dev/docs/latest/extensions states no subagent operation. Nothing is inferred."
1278
+ },
1279
+ "resume": {
1280
+ "status": "unknown",
1281
+ "evidence": [],
1282
+ "verification": "Re-read https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md for a resume operation.",
1283
+ "verifiedOn": "2026-10-12",
1284
+ "fallback": "manual",
1285
+ "reason": "https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md states no resume operation; https://pi.dev/docs/latest/extensions states no subagent operation. Nothing is inferred."
1286
+ }
1287
+ },
1288
+ "scopePrecedence": {
1289
+ "status": "unestablished",
1290
+ "evidence": [
1291
+ "https://pi.dev/docs/latest/skills"
1292
+ ],
1293
+ "note": "The question was asked and the documentation is silent: the skills doc names both `.agents/skills/` (project, discovered walking up from the working directory) and `~/.agents/skills/` (user, under ~/.pi/agent) and states only that \"name collisions keep the first discovered skill and produce a warning\" -- it never states which location is discovered first, and no other primary Pi doc found in this pass states one either. Resolution mode is likewise unestablished: with no order documented there is nothing for a mode to qualify.",
1294
+ "determinedOn": "2026-09-27",
1295
+ "mode": "unestablished"
1296
+ }
1297
+ },
1298
+ {
1299
+ "id": "copilot",
1300
+ "displayName": "GitHub Copilot CLI",
1301
+ "adapter": "copilot",
1302
+ "scopes": [
1303
+ "project",
1304
+ "user"
1305
+ ],
1306
+ "nativeTargets": {
1307
+ "instructions": ".github/copilot-instructions.md",
1308
+ "agents": ".github/agents",
1309
+ "mcp": ".mcp.json"
1310
+ },
1311
+ "paths": {
1312
+ "skillsConfigDir": {
1313
+ "base": "root",
1314
+ "segments": [
1315
+ ".agents"
1316
+ ]
1317
+ },
1318
+ "agentsConfigDir": {
1319
+ "project": {
1320
+ "base": "root",
1321
+ "segments": [
1322
+ ".github"
1323
+ ]
1324
+ },
1325
+ "user": {
1326
+ "base": "root",
1327
+ "segments": [
1328
+ ".copilot"
1329
+ ]
1330
+ }
1331
+ },
1332
+ "ruleInstructionsConfigDir": {
1333
+ "project": {
1334
+ "base": "root",
1335
+ "segments": [
1336
+ ".github"
1337
+ ]
1338
+ },
1339
+ "user": {
1340
+ "base": "root",
1341
+ "segments": [
1342
+ ".copilot"
1343
+ ]
1344
+ }
1345
+ },
1346
+ "skills": {
1347
+ "base": "root",
1348
+ "segments": [
1349
+ ".agents",
1350
+ "skills"
1351
+ ]
1352
+ },
1353
+ "agents": {
1354
+ "project": {
1355
+ "base": "root",
1356
+ "segments": [
1357
+ ".github",
1358
+ "agents"
1359
+ ]
1360
+ },
1361
+ "user": {
1362
+ "base": "root",
1363
+ "segments": [
1364
+ ".copilot",
1365
+ "agents"
1366
+ ]
1367
+ }
1368
+ },
1369
+ "instruction": {
1370
+ "project": {
1371
+ "base": "root",
1372
+ "segments": [
1373
+ ".github",
1374
+ "copilot-instructions.md"
1375
+ ]
1376
+ }
1377
+ },
1378
+ "mcp": {
1379
+ "project": {
1380
+ "base": "root",
1381
+ "segments": [
1382
+ ".mcp.json"
1383
+ ]
1384
+ },
1385
+ "user": {
1386
+ "base": "root",
1387
+ "segments": [
1388
+ ".copilot",
1389
+ "mcp-config.json"
1390
+ ]
1391
+ }
1392
+ }
1393
+ },
1394
+ "capabilities": {
1395
+ "instructions": {
1396
+ "status": "supported",
1397
+ "evidence": [
1398
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot",
1399
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-custom-instructions"
1400
+ ],
1401
+ "verification": "Confirm .github/copilot-instructions.md is loaded by Copilot CLI. A user-level ~/.copilot/copilot-instructions.md (or $COPILOT_HOME/copilot-instructions.md) also exists upstream; DoFlow writes nothing there."
1402
+ },
1403
+ "skills": {
1404
+ "status": "supported",
1405
+ "evidence": [
1406
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills"
1407
+ ],
1408
+ "verification": "Confirm Copilot CLI discovers the installed skill from .agents/skills (project) or ~/.agents/skills (personal) — the same SKILL.md + YAML frontmatter format DoFlow already authors, so no per-harness transformation is required."
1409
+ },
1410
+ "agents": {
1411
+ "status": "supported",
1412
+ "evidence": [
1413
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/create-custom-agents-for-cli",
1414
+ "https://docs.github.com/en/copilot/reference/custom-agents-configuration"
1415
+ ],
1416
+ "note": "The on-disk agent file format is `.agent.md` with YAML frontmatter, confirmed against the custom-agents-configuration reference: a required `description`, optional `name`, `tools`, `model`, `disable-model-invocation`, `user-invocable`, `mcp-servers`, and `metadata` fields, with the Markdown body below the frontmatter as the agent's instructions. The adapter renames each core/shared/agent-specs/<name>.md file to <name>.agent.md via copy-tree's layout mechanism on the way out; unrecognized frontmatter keys pass through untouched, the same posture Claude/Codex/Gemini's agent projections already take.",
1417
+ "verification": "Confirm an installed custom agent under ~/.copilot/agents or .github/agents is discoverable and selectable by Copilot CLI."
1418
+ },
1419
+ "scripts": {
1420
+ "status": "supported",
1421
+ "evidence": [
1422
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills"
1423
+ ],
1424
+ "verification": "Confirm a bundled skill scripts/ directory is reachable from the registered .agents/skills path."
1425
+ },
1426
+ "templates": {
1427
+ "status": "supported",
1428
+ "evidence": [
1429
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills"
1430
+ ],
1431
+ "verification": "Confirm the installed template tree is readable from the registered .agents/skills path."
1432
+ },
1433
+ "modes": {
1434
+ "status": "different",
1435
+ "evidence": [
1436
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot"
1437
+ ],
1438
+ "note": "Copilot CLI has no separate mode surface; DoFlow mode guidance is reachable through the instructions pointer (.github/copilot-instructions.md) instead.",
1439
+ "verification": "Confirm mode guidance is available through instructions."
1440
+ },
1441
+ "settings": {
1442
+ "status": "supported",
1443
+ "evidence": [
1444
+ "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-config-dir-reference"
1445
+ ],
1446
+ "note": "Copilot CLI documents a full settings stack (2026): ~/.copilot/settings.json (user), .github/copilot/settings.json (repo, committed) and .github/copilot/settings.local.json (personal), merged in that order. Documented keys include hooks, disableAllHooks, disabledMcpServers, enabledMcpServers, disabledSkills, skillDirectories, subagents.agents and enabledPlugins. DoFlow merges named keys it owns and never replaces the file, the same posture as its opencode.json merge.",
1447
+ "verification": "Confirm .github/copilot/settings.json retains user keys and only DoFlow-owned keys change; run /settings inside Copilot CLI to confirm the file loaded."
1448
+ },
1449
+ "hooks": {
1450
+ "status": "different",
1451
+ "evidence": [
1452
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/use-hooks",
1453
+ "https://docs.github.com/en/copilot/reference/hooks-reference"
1454
+ ],
1455
+ "note": "Copilot CLI documented a full hook surface (2026): .github/hooks/*.json (repo) and ~/.copilot/hooks/ (user), shape {\"version\":1,\"hooks\":{\"<camelCase event>\":[entries]}}, command entries fail-closed on non-zero exit, preToolUse decides via stdout JSON {permissionDecision}. DoFlow wires NONE of it yet, deliberately: its shipped scripts are Claude-payload-coupled (tool names Edit|Write|MultiEdit, .session_id/.transcript_path stdin fields, CLAUDE_CONFIG_DIR/CLAUDE_PROJECT_DIR envs). Projecting them onto Copilot's unverified payload schemas would install hooks that silently misfire — recorded here instead of imitated.",
1456
+ "verification": "Report that no Copilot hook is installed; revisit once payload schemas are verified in a live session.",
1457
+ "events": {
1458
+ "SessionStart": {
1459
+ "status": "different",
1460
+ "note": "Native sessionStart exists; DoFlow's script reads Claude's .session_id/.cwd stdin fields."
1461
+ },
1462
+ "SessionEnd": {
1463
+ "status": "different",
1464
+ "note": "Native sessionEnd exists; same payload-schema caveat."
1465
+ },
1466
+ "PreToolUse": {
1467
+ "status": "different",
1468
+ "note": "Blocking contract matches ({permissionDecision} on stdout) but tool names differ from Claude's Edit|Write|MultiEdit and the gate reads CLAUDE_* envs."
1469
+ },
1470
+ "PostToolUse": {
1471
+ "status": "different",
1472
+ "note": "Native postToolUse can rewrite results/inject context; not projected."
1473
+ },
1474
+ "PostToolUseFailure": {
1475
+ "status": "different",
1476
+ "note": "Native postToolUseFailure exists — a failure-only event Claude lacks a direct name for."
1477
+ },
1478
+ "Stop": {
1479
+ "status": "different",
1480
+ "note": "Native agentStop forces continuation via stdout {decision:'block'} (8-block runaway cap), unlike Claude's exit-2 semantics; stop-check relies on .transcript_path."
1481
+ },
1482
+ "UserPromptSubmit": {
1483
+ "status": "different",
1484
+ "note": "Natives are userPromptSubmitted and userPromptTransformed; pre-submission gating semantics unverified. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
1485
+ },
1486
+ "PreCompact": {
1487
+ "status": "different",
1488
+ "note": "Native preCompact exists."
1489
+ },
1490
+ "SubagentStart": {
1491
+ "status": "different",
1492
+ "note": "Native subagentStart/subagentStop exist."
1493
+ },
1494
+ "SubagentStop": {
1495
+ "status": "different",
1496
+ "note": "Native subagentStart/subagentStop exist."
1497
+ },
1498
+ "PermissionDenied": {
1499
+ "status": "unavailable",
1500
+ "note": "No deny-side event; permissionRequest carries the decision instead."
1501
+ }
1502
+ }
1503
+ },
1504
+ "mcp": {
1505
+ "status": "supported",
1506
+ "evidence": [
1507
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot"
1508
+ ],
1509
+ "verification": "Confirm selected MCP servers appear via .mcp.json (project) or ~/.copilot/mcp-config.json (global)."
1510
+ },
1511
+ "plugin": {
1512
+ "status": "different",
1513
+ "evidence": [
1514
+ "https://docs.github.com/en/copilot/concepts/agents/about-plugins",
1515
+ "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference"
1516
+ ],
1517
+ "note": "Copilot CLI documents plugins (plugin.json manifest bundling agents, skills, hooks, .mcp.json and lsp.json; installed via 'copilot plugin install' or enabledPlugins in settings). Manifest discovery checks .plugin/plugin.json, plugin.json, .github/plugin/plugin.json, then .claude-plugin/plugin.json - there is no .copilot-plugin/ convention. DoFlow publishes a skills-only manifest at core/.plugin/plugin.json declaring only what activates there: agent specs are excluded (Copilot requires .agent.md; shared agent-specs are plain .md), hooks stay unprojected (Claude-payload-coupled), MCP registration stays installer-managed. Findings: docs/distribution-notes.md.",
1518
+ "verification": "Report that no Copilot plugin package is installed."
1519
+ }
1520
+ },
1521
+ "orchestration": {
1522
+ "spawn": {
1523
+ "status": "supported",
1524
+ "evidence": [
1525
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/create-custom-agents-for-cli → \"Work performed by a custom agent is carried out using a subagent, which is a temporary agent spun up to complete the task.\""
1526
+ ],
1527
+ "verification": "Run a custom agent task and confirm a subagent appears in /tasks.",
1528
+ "verifiedOn": "2026-10-12"
1529
+ },
1530
+ "wait": {
1531
+ "status": "unknown",
1532
+ "evidence": [],
1533
+ "verification": "Re-read https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference for a wait operation.",
1534
+ "verifiedOn": "2026-10-12",
1535
+ "fallback": "sequential",
1536
+ "reason": "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/create-custom-agents-for-cli and https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference was read on 2026-10-12 and does not state a wait operation; nothing is inferred from another harness or a model name."
1537
+ },
1538
+ "status": {
1539
+ "status": "supported",
1540
+ "evidence": [
1541
+ "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference → tasks dialog (/tasks): \"Enter - View task details, or teleport into the selected subagent's own session view\"; subagents that spawn nested subagents \"appear as an indented tree\"."
1542
+ ],
1543
+ "verification": "Open /tasks while a subagent is active.",
1544
+ "verifiedOn": "2026-10-12"
1545
+ },
1546
+ "cancel": {
1547
+ "status": "supported",
1548
+ "evidence": [
1549
+ "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference → tasks dialog (/tasks): \"X - Kill the selected active task\"; the dialog lists subagents and shells (\"Toggle showing finished subagents and shells\")."
1550
+ ],
1551
+ "verification": "Open /tasks, select an active subagent and press X.",
1552
+ "verifiedOn": "2026-10-12"
1553
+ },
1554
+ "resume": {
1555
+ "status": "unknown",
1556
+ "evidence": [],
1557
+ "verification": "Re-read https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference for a resume operation.",
1558
+ "verifiedOn": "2026-10-12",
1559
+ "fallback": "manual",
1560
+ "reason": "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference offers steering of a running subagent from its session view but states no resume of a finished subagent; nothing is inferred."
1561
+ }
1562
+ },
1563
+ "scopePrecedence": {
1564
+ "status": "established",
1565
+ "order": [
1566
+ "project",
1567
+ "user"
1568
+ ],
1569
+ "evidence": [
1570
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/create-custom-agents-for-cli"
1571
+ ],
1572
+ "note": "Confirmed for custom agents only: \"If you have custom agents with the same name in both locations, the one in your home directory will be used, rather than the one in the repository\" (user overrides project). The parallel add-skills page states no such rule for skills, and no page found states one for .github/copilot-instructions.md -- this order is not shown to generalize beyond custom agents, and the general customize-copilot overview page names no precedence word at all. The source states an outcome rather than a consultation order: the home-directory copy is used rather than the repository one. Encoded as the recorded consultation order with a last-wins mode, which yields the documented winner, the user copy. Confirmed for custom agents only.",
1573
+ "determinedOn": "2026-09-27",
1574
+ "mode": "last-wins"
1575
+ }
1576
+ },
1577
+ {
1578
+ "id": "kiro",
1579
+ "displayName": "Kiro",
1580
+ "adapter": "kiro",
1581
+ "scopes": [
1582
+ "project",
1583
+ "user"
1584
+ ],
1585
+ "nativeTargets": {
1586
+ "instructions": ".kiro/steering/",
1587
+ "skills": ".kiro/skills",
1588
+ "agents": ".kiro/agents",
1589
+ "hooks": ".kiro/hooks",
1590
+ "mcp": ".kiro/settings/mcp.json"
1591
+ },
1592
+ "paths": {
1593
+ "configDir": {
1594
+ "base": "root",
1595
+ "segments": [
1596
+ ".kiro"
1597
+ ]
1598
+ },
1599
+ "steering": {
1600
+ "base": "root",
1601
+ "segments": [
1602
+ ".kiro",
1603
+ "steering"
1604
+ ]
1605
+ },
1606
+ "skills": {
1607
+ "base": "root",
1608
+ "segments": [
1609
+ ".kiro",
1610
+ "skills"
1611
+ ]
1612
+ },
1613
+ "agents": {
1614
+ "base": "root",
1615
+ "segments": [
1616
+ ".kiro",
1617
+ "agents"
1618
+ ]
1619
+ },
1620
+ "hooks": {
1621
+ "base": "root",
1622
+ "segments": [
1623
+ ".kiro",
1624
+ "hooks"
1625
+ ]
1626
+ },
1627
+ "mcp": {
1628
+ "base": "root",
1629
+ "segments": [
1630
+ ".kiro",
1631
+ "settings",
1632
+ "mcp.json"
1633
+ ]
1634
+ }
1635
+ },
1636
+ "capabilities": {
1637
+ "instructions": {
1638
+ "status": "supported",
1639
+ "evidence": [
1640
+ "https://kiro.dev/docs/steering/"
1641
+ ],
1642
+ "verification": "Confirm the full DoFlow guidance tree is discoverable as steering files under .kiro/steering/ (workspace) or ~/.kiro/steering/ (global); workspace files must win on conflict."
1643
+ },
1644
+ "skills": {
1645
+ "status": "supported",
1646
+ "evidence": [
1647
+ "https://kiro.dev/docs/skills/"
1648
+ ],
1649
+ "note": "Kiro has a dedicated skills system, separate from steering: a skill is a folder containing SKILL.md with YAML frontmatter (name, description) plus optional scripts/references/assets subdirectories, following the same open Agent Skills standard DoFlow already authors — no transformation needed. Scanned from .kiro/skills/ (workspace) and ~/.kiro/skills/ (global); workspace wins on a same-name conflict. This corrects an earlier declaration made before kiro.dev/docs/skills/ was found.",
1650
+ "verification": "Confirm the installed skill is discoverable under .kiro/skills/ (workspace) or ~/.kiro/skills/ (global)."
1651
+ },
1652
+ "agents": {
1653
+ "status": "supported",
1654
+ "evidence": [
1655
+ "https://kiro.dev/docs/custom-agents/configuration-reference/"
1656
+ ],
1657
+ "note": "kiro-cli discovers custom agents as .kiro/agents/<name>.json; kiro-cli 2.27.1 `kiro-cli agent list` did not list .md agents. DoFlow renders each shared agent spec to JSON (name, description, prompt, tools, hooks) through the kiro-agents transform and installs a static doflow agent beside them. A pre-existing DoFlow-owned <name>.md is removed on update. DoFlow never changes the user's default agent; run `kiro-cli chat --agent doflow` or opt in with `kiro-cli agent set-default doflow`.",
1658
+ "verification": "Confirm an installed custom agent under .kiro/agents is discoverable by Kiro."
1659
+ },
1660
+ "scripts": {
1661
+ "status": "supported",
1662
+ "evidence": [
1663
+ "https://kiro.dev/docs/skills/"
1664
+ ],
1665
+ "note": "A skill's own scripts/ subdirectory travels with it inside .kiro/skills/, per the same bundled-with-skill pattern opencode/pi/copilot already use — not a standalone tree DoFlow projects separately.",
1666
+ "verification": "Confirm a bundled skill scripts/ directory is reachable from the installed .kiro/skills/ path."
1667
+ },
1668
+ "templates": {
1669
+ "status": "supported",
1670
+ "evidence": [
1671
+ "https://kiro.dev/docs/skills/"
1672
+ ],
1673
+ "note": "A skill's own references/assets subdirectories travel with it inside .kiro/skills/, the same bundled-with-skill pattern opencode/pi/copilot already use.",
1674
+ "verification": "Confirm the installed template tree is readable from within a skill's own directory under .kiro/skills/."
1675
+ },
1676
+ "modes": {
1677
+ "status": "different",
1678
+ "evidence": [
1679
+ "https://kiro.dev/docs/steering/"
1680
+ ],
1681
+ "note": "Kiro has no separate mode surface; DoFlow mode guidance is reachable through the projected steering tree.",
1682
+ "verification": "Confirm mode guidance is available through the projected steering files."
1683
+ },
1684
+ "settings": {
1685
+ "status": "unavailable",
1686
+ "evidence": [
1687
+ "https://kiro.dev/docs/mcp/configuration/"
1688
+ ],
1689
+ "note": "No general Kiro settings file is documented separately from .kiro/settings/mcp.json (covered under mcp) and the steering/hooks/agent directories, each already covered by its own capability.",
1690
+ "verification": "Report the capability gap; do not attempt a native settings merge."
1691
+ },
1692
+ "hooks": {
1693
+ "status": "supported",
1694
+ "evidence": [
1695
+ "https://kiro.dev/docs/hooks/",
1696
+ "https://kiro.dev/docs/hooks/actions/",
1697
+ "https://kiro.dev/docs/permissions/"
1698
+ ],
1699
+ "note": "kiro-cli reads hooks from an agent config's `hooks` array (agentSpawn, userPromptSubmit, preToolUse, postToolUse, stop). A preToolUse hook that exits 2 blocks the tool call; any other non-zero exit warns and allows; stop is not blockable on 2.x. DoFlow writes three preToolUse hooks (pre-implementation-gate on `write`, pre-bash-guard on `shell`, mcp-tool-guard on `*`) into every rendered agent, plus agentSpawn (session context) and stop (stop-check) on the doflow agent only. The Kiro front doors translate Kiro tool names, KIRO_SESSION_ID and assistant_response to the canonical payload before running the shared policies. `.kiro/hooks/doflow.json` (flat `{version, hooks: [...]}`, PascalCase triggers) is read by the Kiro IDE and by CLI V3 (for every agent); CLI 2.x does not read it. Kiro CLI V3 also loads standalone `.kiro/hooks/*.json` (workspace) and `~/.kiro/hooks/*.json` (global) for every agent, alongside agent-profile hooks, so doflow.json runs for all agents there, and with `--agent doflow` on V3 the preToolUse checks run twice (accepted, idempotent). V3 payloads carry `session_id`, and V3 built-in tool IDs include `read_file`, `execute_bash`, `execute_pwsh`, `fs_write`, `fs_append`, `str_replace` and `delete_file`; the front doors map the write family to Write and `execute_pwsh` to Bash, and V3 MCP IDs (`mcp_<server>_<tool>`) reach mcp-tool-guard unchanged. doflow.json scopes the MCP guard with the V3 `@mcp` selector. V3 Stop: exit 0 finishes, exit 0 with stdout JSON `{\"decision\":\"block\",\"reason\":\"...\"}` starts another turn, exit 1 also starts another turn, and exit 2 does not block; the stop front door therefore turns the policy's deny into that JSON block when the payload has a session_id and keeps exit 2 with stderr for 2.x, where any non-zero exit only warns. It is not in Kiro v3's untrusted-workspace exclusion list; an untrusted workspace asks before every shell command, and whether that covers hook commands is undocumented. Observed on CLI V3 (kiro-cli 2.27.1 --v3, 2026-10-11): PreToolUse payloads carry session_id, tool_name execute_bash with tool_input.command, fs_write and str_replace with tool_input.path; the Stop payload carries only session_id, hook_event_name and cwd, with no response text or transcript path, so stop-check's unfinished-work scan has nothing to read on V3 and allows the stop.",
1700
+ "verification": "Confirm kiro-cli reads hooks from the agent config JSON `hooks` (installed .kiro/agents/doflow.json and the specialist agents) with the expected trigger names, and that a preToolUse hook blocks only on exit 2 (any other non-zero exit warns and allows). .kiro/hooks/doflow.json is the Kiro IDE surface.",
1701
+ "events": {
1702
+ "UserPromptSubmit": {
1703
+ "status": "different",
1704
+ "note": "Kiro documents a native UserPromptSubmit trigger that is blockable via a non-zero exit code and exposes the prompt as the USER_PROMPT environment variable; DoFlow wires no hook to it. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
1705
+ }
1706
+ }
1707
+ },
1708
+ "mcp": {
1709
+ "status": "supported",
1710
+ "evidence": [
1711
+ "https://kiro.dev/docs/mcp/configuration/"
1712
+ ],
1713
+ "verification": "Confirm selected MCP servers appear in .kiro/settings/mcp.json (workspace) or ~/.kiro/settings/mcp.json (global), with workspace taking precedence."
1714
+ },
1715
+ "plugin": {
1716
+ "status": "unavailable",
1717
+ "evidence": [
1718
+ "https://kiro.dev/docs/steering/"
1719
+ ],
1720
+ "note": "No plugin or extension marketplace mechanism is documented in the steering, hooks, or MCP sources cited for this feature.",
1721
+ "verification": "Report the capability gap; do not attempt to install a plugin."
1722
+ }
1723
+ },
1724
+ "orchestration": {
1725
+ "spawn": {
1726
+ "status": "supported",
1727
+ "evidence": [
1728
+ "https://kiro.dev/docs/custom-agents/subagents/ → \"Use the code-reviewer agent to analyze src/auth/ for security issues\" (invocation example for a sub-agent)."
1729
+ ],
1730
+ "verification": "Prompt the main agent to use a custom agent and confirm a sub-agent runs.",
1731
+ "verifiedOn": "2026-10-12"
1732
+ },
1733
+ "wait": {
1734
+ "status": "supported",
1735
+ "evidence": [
1736
+ "https://kiro.dev/docs/custom-agents/subagents/ → \"When finished, the sub-agent returns findings to the main agent\"."
1737
+ ],
1738
+ "verification": "Delegate a task and confirm the main agent continues from the returned findings.",
1739
+ "verifiedOn": "2026-10-12"
1740
+ },
1741
+ "status": {
1742
+ "status": "supported",
1743
+ "evidence": [
1744
+ "https://kiro.dev/docs/custom-agents/subagents/ → \"In CLI, use Ctrl+G to check on long-running sub-agents\"."
1745
+ ],
1746
+ "verification": "Press Ctrl+G in the Kiro CLI while a sub-agent is running.",
1747
+ "verifiedOn": "2026-10-12"
1748
+ },
1749
+ "cancel": {
1750
+ "status": "unknown",
1751
+ "evidence": [],
1752
+ "verification": "Re-read https://kiro.dev/docs/custom-agents/subagents/ for a stop operation.",
1753
+ "verifiedOn": "2026-10-12",
1754
+ "fallback": "sequential",
1755
+ "reason": "https://kiro.dev/docs/custom-agents/subagents/ was read on 2026-10-12 and does not state a cancel operation; nothing is inferred from another harness or a model name."
1756
+ },
1757
+ "resume": {
1758
+ "status": "unknown",
1759
+ "evidence": [],
1760
+ "verification": "Re-read https://kiro.dev/docs/custom-agents/subagents/ for a resume operation.",
1761
+ "verifiedOn": "2026-10-12",
1762
+ "fallback": "manual",
1763
+ "reason": "https://kiro.dev/docs/custom-agents/subagents/ was read on 2026-10-12 and does not state a resume operation; nothing is inferred from another harness or a model name."
1764
+ }
1765
+ },
1766
+ "scopePrecedence": {
1767
+ "status": "established",
1768
+ "order": [
1769
+ "project",
1770
+ "user"
1771
+ ],
1772
+ "evidence": [
1773
+ "https://kiro.dev/docs/skills/",
1774
+ "https://kiro.dev/docs/steering/"
1775
+ ],
1776
+ "note": "Skills doc: \"Scanned from .kiro/skills/ (workspace) and ~/.kiro/skills/ (global); workspace wins on a same-name conflict.\" Steering doc likewise requires workspace files to win on conflict. Order lists workspace (project) before global (user), matching the scan order the skills doc states them in. The skills doc states the workspace copy wins on a same-name conflict, so the order lists the winner first: the project copy is used.",
1777
+ "determinedOn": "2026-09-27",
1778
+ "mode": "first-wins"
1779
+ }
1780
+ },
1781
+ {
1782
+ "id": "antigravity",
1783
+ "displayName": "Antigravity CLI",
1784
+ "adapter": "antigravity",
1785
+ "scopes": [
1786
+ "project",
1787
+ "user"
1788
+ ],
1789
+ "nativeTargets": {
1790
+ "instructions": "AGENTS.md",
1791
+ "skills": ".agents/skills",
1792
+ "agents": ".agents/agents",
1793
+ "mcp": ".agents/mcp_config.json"
1794
+ },
1795
+ "paths": {
1796
+ "configDir": {
1797
+ "project": {
1798
+ "base": "root",
1799
+ "segments": [
1800
+ ".agents"
1801
+ ]
1802
+ },
1803
+ "user": {
1804
+ "base": "root",
1805
+ "segments": [
1806
+ ".gemini",
1807
+ "config"
1808
+ ]
1809
+ }
1810
+ },
1811
+ "instruction": {
1812
+ "project": {
1813
+ "base": "root",
1814
+ "segments": [
1815
+ "AGENTS.md"
1816
+ ]
1817
+ }
1818
+ },
1819
+ "mcpFile": {
1820
+ "project": {
1821
+ "base": "root",
1822
+ "segments": [
1823
+ ".agents",
1824
+ "mcp_config.json"
1825
+ ]
1826
+ },
1827
+ "user": {
1828
+ "base": "root",
1829
+ "segments": [
1830
+ ".gemini",
1831
+ "config",
1832
+ "mcp_config.json"
1833
+ ]
1834
+ }
1835
+ },
1836
+ "skillsDir": {
1837
+ "project": {
1838
+ "base": "root",
1839
+ "segments": [
1840
+ ".agents",
1841
+ "skills"
1842
+ ]
1843
+ },
1844
+ "user": {
1845
+ "base": "root",
1846
+ "segments": [
1847
+ ".gemini",
1848
+ "config",
1849
+ "skills"
1850
+ ]
1851
+ }
1852
+ },
1853
+ "agentsDir": {
1854
+ "project": {
1855
+ "base": "root",
1856
+ "segments": [
1857
+ ".agents",
1858
+ "agents"
1859
+ ]
1860
+ },
1861
+ "user": {
1862
+ "base": "root",
1863
+ "segments": [
1864
+ ".gemini",
1865
+ "config",
1866
+ "agents"
1867
+ ]
1868
+ }
1869
+ },
1870
+ "hooksJson": {
1871
+ "project": {
1872
+ "base": "root",
1873
+ "segments": [
1874
+ ".agents",
1875
+ "hooks.json"
1876
+ ]
1877
+ }
1878
+ },
1879
+ "hookScript": {
1880
+ "project": {
1881
+ "base": "root",
1882
+ "segments": [
1883
+ ".agents",
1884
+ "hooks",
1885
+ "pre-implementation-gate.sh"
1886
+ ]
1887
+ }
1888
+ },
1889
+ "stopHookScript": {
1890
+ "project": {
1891
+ "base": "root",
1892
+ "segments": [
1893
+ ".agents",
1894
+ "hooks",
1895
+ "stop-check.sh"
1896
+ ]
1897
+ }
1898
+ }
1899
+ },
1900
+ "capabilities": {
1901
+ "instructions": {
1902
+ "status": "supported",
1903
+ "evidence": [
1904
+ "https://antigravity.google/docs/cli/gcli-migration"
1905
+ ],
1906
+ "verification": "Confirm agy reads the managed AGENTS.md section from the workspace."
1907
+ },
1908
+ "skills": {
1909
+ "status": "supported",
1910
+ "evidence": [
1911
+ "https://antigravity.google/docs/cli/plugins",
1912
+ "https://antigravity.google/docs/skills"
1913
+ ],
1914
+ "note": "Antigravity discovers folder-form skills under .agents/skills (project) and ~/.gemini/config/skills (global).",
1915
+ "verification": "Confirm the skill is discoverable by agy from .agents/skills."
1916
+ },
1917
+ "agents": {
1918
+ "status": "supported",
1919
+ "evidence": [
1920
+ "https://antigravity.google/docs/cli/subagents"
1921
+ ],
1922
+ "note": "Shared agent-spec frontmatter (name, description) is a compatible subset of Antigravity's subagent schema; body becomes the system prompt.",
1923
+ "verification": "Confirm invoke_subagent reaches the installed agent definition."
1924
+ },
1925
+ "scripts": {
1926
+ "status": "supported",
1927
+ "evidence": [
1928
+ "https://antigravity.google/docs/cli/plugins",
1929
+ "https://antigravity.google/docs/skills"
1930
+ ],
1931
+ "note": "Bundled skill scripts travel inside skills/<name>/scripts/. DoFlow projects its runtime seam under .doflow and locator in the configDir bin/ (project and global scopes).",
1932
+ "verification": "Confirm a bundled skill scripts/ directory is reachable from an installed skill."
1933
+ },
1934
+ "templates": {
1935
+ "status": "different",
1936
+ "evidence": [
1937
+ "https://antigravity.google/docs/cli/plugins"
1938
+ ],
1939
+ "verification": "Report that template access arrives through skill bundles, not a projected tree."
1940
+ },
1941
+ "modes": {
1942
+ "status": "different",
1943
+ "evidence": [
1944
+ "https://antigravity.google/docs/rules-workflows"
1945
+ ],
1946
+ "verification": "Report that mode guidance rides the instructions pointer; .agents/rules projection is future work."
1947
+ },
1948
+ "settings": {
1949
+ "status": "unavailable",
1950
+ "evidence": [
1951
+ "https://antigravity.google/docs/cli/settings"
1952
+ ],
1953
+ "note": "Settings live only at user scope (~/.gemini/antigravity-cli/settings.json); no project settings tier exists.",
1954
+ "verification": "Report the capability gap; never write that file."
1955
+ },
1956
+ "hooks": {
1957
+ "status": "supported",
1958
+ "evidence": [
1959
+ "https://antigravity.google/docs/hooks/"
1960
+ ],
1961
+ "note": "Antigravity documents a full hook surface (2026): hooks.json in the customization directory (.agents/ workspace, ~/.gemini/config/ user), named groups per event, PreToolUse/PostToolUse/PreInvocation/PostInvocation/Stop, and an explicit stdin/stdout contract (PreToolUse returns {decision: allow|deny|ask|force_ask|...}, Stop returns {decision: continue}). Unlike Copilot's, this contract is complete enough to project against without a live-session capture. DoFlow wires its pre-implementation gate and its stop check as native-payload shims; events with no matching DoFlow policy stay unwired.",
1962
+ "verification": "Report that no Antigravity hook is installed.",
1963
+ "events": {
1964
+ "PreToolUse": {
1965
+ "status": "supported",
1966
+ "note": "DoFlow projects its pre-implementation gate as a native shim: matcher write_to_file|replace_file_content|multi_replace_file_content, deny decision until the branch-coupled feature's three specifications exist."
1967
+ },
1968
+ "PostToolUse": {
1969
+ "status": "different",
1970
+ "note": "Documented (post-edit lint candidate), not projected yet."
1971
+ },
1972
+ "PreInvocation": {
1973
+ "status": "different",
1974
+ "note": "Documented step-injection point; no current DoFlow policy needs model-call interception."
1975
+ },
1976
+ "PostInvocation": {
1977
+ "status": "different",
1978
+ "note": "Documented (terminationBehavior control); no current DoFlow policy maps to it."
1979
+ },
1980
+ "Stop": {
1981
+ "status": "supported",
1982
+ "note": "DoFlow projects its stop check as a native shim: emits the documented {decision:'continue', reason} when the last assistant response in transcriptPath carries unfinished-work markers (the same gate Claude's stop-check enforces via exit 2). transcriptPath is optional and unverified — empty/garbage stdin, missing/unreadable/unrecognized transcripts all fail open, so a broken hook can never trap session end."
1983
+ },
1984
+ "UserPromptSubmit": {
1985
+ "status": "unavailable",
1986
+ "note": "Antigravity documents no event that fires when a user submits a prompt; the nearest point, PreInvocation, fires before every model call and no DoFlow policy uses it. DoFlow's once-per-session `/do` suggestion is not hook-delivered here and reaches this harness through skill descriptions only."
1987
+ }
1988
+ }
1989
+ },
1990
+ "mcp": {
1991
+ "status": "supported",
1992
+ "evidence": [
1993
+ "https://antigravity.google/docs/cli/mcp"
1994
+ ],
1995
+ "note": "mcpServers object in .agents/mcp_config.json (workspace) or ~/.gemini/config/mcp_config.json (user). Remote servers project url/httpUrl to serverUrl per current schema.",
1996
+ "verification": "Confirm selected MCP servers appear via /mcp in agy."
1997
+ },
1998
+ "plugin": {
1999
+ "status": "different",
2000
+ "evidence": [
2001
+ "https://antigravity.google/docs/cli/plugins"
2002
+ ],
2003
+ "note": "Local-path plugin installs only; DoFlow publishes none.",
2004
+ "verification": "Report that no plugin is installed."
2005
+ }
2006
+ },
2007
+ "orchestration": {
2008
+ "spawn": {
2009
+ "status": "supported",
2010
+ "evidence": [
2011
+ "https://antigravity.google/docs/subagents?tab=cli → \"The parent agent calls the invoke_subagent tool to spawn a new concurrent session with a dedicated role and initial prompt\"."
2012
+ ],
2013
+ "verification": "Ask the agent to delegate and confirm a subagent appears in the subagent panel.",
2014
+ "verifiedOn": "2026-10-12"
2015
+ },
2016
+ "wait": {
2017
+ "status": "unknown",
2018
+ "evidence": [],
2019
+ "verification": "Re-read https://antigravity.google/docs/subagents?tab=cli for a wait operation.",
2020
+ "verifiedOn": "2026-10-12",
2021
+ "fallback": "sequential",
2022
+ "reason": "https://antigravity.google/docs/subagents?tab=cli describes asynchronous execution (\"the primary agent delegates these operations to parallel subagents or background tasks\") but states no wait operation; nothing is inferred."
2023
+ },
2024
+ "status": {
2025
+ "status": "supported",
2026
+ "evidence": [
2027
+ "https://antigravity.google/docs/subagents?tab=cli → \"You can directly monitor the progress of any subagent by clicking into its conversation in the subagent panel or pressing Alt+J\"."
2028
+ ],
2029
+ "verification": "Open the subagent panel while a subagent is running.",
2030
+ "verifiedOn": "2026-10-12"
2031
+ },
2032
+ "cancel": {
2033
+ "status": "supported",
2034
+ "evidence": [
2035
+ "https://antigravity.google/docs/subagents?tab=cli → \"You can cancel a running subagent by clicking Stop Subagent in the subagent panel (or pressing k in the CLI).\""
2036
+ ],
2037
+ "verification": "Press k on a running subagent in the CLI and confirm it is Killed.",
2038
+ "verifiedOn": "2026-10-12"
2039
+ },
2040
+ "resume": {
2041
+ "status": "supported",
2042
+ "evidence": [
2043
+ "https://antigravity.google/docs/subagents?tab=cli → \"An idle agent automatically re-awakens to the Running state upon receiving a message from another agent.\""
2044
+ ],
2045
+ "verification": "Message an Idle subagent and confirm it returns to Running.",
2046
+ "verifiedOn": "2026-10-12"
2047
+ }
2048
+ },
2049
+ "scopePrecedence": {
2050
+ "status": "unestablished",
2051
+ "evidence": [
2052
+ "https://antigravity.google/docs/skills/",
2053
+ "https://antigravity.google/docs/subagents",
2054
+ "https://antigravity.google/docs/cli/mcp"
2055
+ ],
2056
+ "note": "The question was asked across the three dual-scope asset types Antigravity documents (skills, subagents, MCP servers) and the documentation is silent on all three: each page names a workspace location and a global location but never states which wins on a same-name conflict. Separate from this: the skills capability above already records that DoFlow itself skips the global skills scope over an unresolved CLI-vs-desktop contradiction about that scope's own file format -- a dispute about the global location's shape, not about precedence between the two scopes. Resolution mode is likewise unestablished: with no order documented there is nothing for a mode to qualify.",
2057
+ "determinedOn": "2026-09-27",
2058
+ "mode": "unestablished"
2059
+ }
2060
+ }
2061
+ ]
2062
+ }