agent-control-plane 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +589 -0
  3. package/SKILL.md +149 -0
  4. package/assets/workflow-catalog.json +57 -0
  5. package/bin/audit-issue-routing.sh +74 -0
  6. package/bin/issue-resource-class.sh +58 -0
  7. package/bin/label-follow-up-issues.sh +114 -0
  8. package/bin/pr-risk.sh +532 -0
  9. package/bin/sync-pr-labels.sh +112 -0
  10. package/hooks/heartbeat-hooks.sh +573 -0
  11. package/hooks/issue-reconcile-hooks.sh +217 -0
  12. package/hooks/pr-reconcile-hooks.sh +225 -0
  13. package/npm/bin/agent-control-plane.js +1984 -0
  14. package/npm/public-bin/agent-control-plane +3 -0
  15. package/package.json +61 -0
  16. package/tools/bin/agent-cleanup-worktree +247 -0
  17. package/tools/bin/agent-github-update-labels +66 -0
  18. package/tools/bin/agent-init-worktree +216 -0
  19. package/tools/bin/agent-project-archive-run +52 -0
  20. package/tools/bin/agent-project-capture-worker +46 -0
  21. package/tools/bin/agent-project-catch-up-merged-prs +137 -0
  22. package/tools/bin/agent-project-cleanup-session +244 -0
  23. package/tools/bin/agent-project-detached-launch +107 -0
  24. package/tools/bin/agent-project-heartbeat-loop +2347 -0
  25. package/tools/bin/agent-project-open-issue-worktree +89 -0
  26. package/tools/bin/agent-project-open-pr-worktree +80 -0
  27. package/tools/bin/agent-project-publish-issue-pr +349 -0
  28. package/tools/bin/agent-project-reconcile-issue-session +1128 -0
  29. package/tools/bin/agent-project-reconcile-pr-session +1005 -0
  30. package/tools/bin/agent-project-retry-state +147 -0
  31. package/tools/bin/agent-project-run-claude-session +657 -0
  32. package/tools/bin/agent-project-run-codex-resilient +718 -0
  33. package/tools/bin/agent-project-run-codex-session +316 -0
  34. package/tools/bin/agent-project-run-kilo-session +27 -0
  35. package/tools/bin/agent-project-run-openclaw-session +984 -0
  36. package/tools/bin/agent-project-run-opencode-session +27 -0
  37. package/tools/bin/agent-project-sync-anchor-repo +128 -0
  38. package/tools/bin/agent-project-worker-status +143 -0
  39. package/tools/bin/audit-agent-worktrees.sh +310 -0
  40. package/tools/bin/audit-issue-routing.sh +11 -0
  41. package/tools/bin/audit-retained-layout.sh +58 -0
  42. package/tools/bin/audit-retained-overlap.sh +135 -0
  43. package/tools/bin/audit-retained-worktrees.sh +228 -0
  44. package/tools/bin/branch-verification-guard.sh +351 -0
  45. package/tools/bin/capture-worker.sh +18 -0
  46. package/tools/bin/check-skill-contracts.sh +324 -0
  47. package/tools/bin/cleanup-worktree.sh +44 -0
  48. package/tools/bin/codex-quota +31 -0
  49. package/tools/bin/create-follow-up-issue.sh +114 -0
  50. package/tools/bin/dashboard-launchd-bootstrap.sh +38 -0
  51. package/tools/bin/flow-config-lib.sh +2127 -0
  52. package/tools/bin/flow-resident-worker-lib.sh +683 -0
  53. package/tools/bin/flow-runtime-doctor.sh +97 -0
  54. package/tools/bin/flow-shell-lib.sh +266 -0
  55. package/tools/bin/heartbeat-recovery-preflight.sh +106 -0
  56. package/tools/bin/heartbeat-safe-auto.sh +551 -0
  57. package/tools/bin/install-dashboard-launchd.sh +152 -0
  58. package/tools/bin/install-project-launchd.sh +219 -0
  59. package/tools/bin/issue-publish-scope-guard.sh +242 -0
  60. package/tools/bin/issue-requires-local-workspace-install.sh +31 -0
  61. package/tools/bin/issue-resource-class.sh +12 -0
  62. package/tools/bin/kick-scheduler.sh +75 -0
  63. package/tools/bin/label-follow-up-issues.sh +14 -0
  64. package/tools/bin/new-pr-worktree.sh +50 -0
  65. package/tools/bin/new-worktree.sh +49 -0
  66. package/tools/bin/pr-risk.sh +12 -0
  67. package/tools/bin/prepare-worktree.sh +140 -0
  68. package/tools/bin/profile-activate.sh +109 -0
  69. package/tools/bin/profile-adopt.sh +219 -0
  70. package/tools/bin/profile-smoke.sh +461 -0
  71. package/tools/bin/project-init.sh +189 -0
  72. package/tools/bin/project-launchd-bootstrap.sh +54 -0
  73. package/tools/bin/project-remove.sh +155 -0
  74. package/tools/bin/project-runtime-supervisor.sh +56 -0
  75. package/tools/bin/project-runtimectl.sh +586 -0
  76. package/tools/bin/provider-cooldown-state.sh +166 -0
  77. package/tools/bin/publish-issue-worker.sh +31 -0
  78. package/tools/bin/reconcile-issue-worker.sh +34 -0
  79. package/tools/bin/reconcile-pr-worker.sh +34 -0
  80. package/tools/bin/record-verification.sh +71 -0
  81. package/tools/bin/render-architecture-infographics.sh +110 -0
  82. package/tools/bin/render-dashboard-demo-media.sh +333 -0
  83. package/tools/bin/render-dashboard-snapshot.py +16 -0
  84. package/tools/bin/render-flow-config.sh +86 -0
  85. package/tools/bin/retry-state.sh +31 -0
  86. package/tools/bin/reuse-issue-worktree.sh +75 -0
  87. package/tools/bin/run-codex-bypass.sh +3 -0
  88. package/tools/bin/run-codex-safe.sh +3 -0
  89. package/tools/bin/run-codex-task.sh +231 -0
  90. package/tools/bin/scaffold-profile.sh +374 -0
  91. package/tools/bin/serve-dashboard.sh +5 -0
  92. package/tools/bin/split-retained-slice.sh +124 -0
  93. package/tools/bin/start-issue-worker.sh +796 -0
  94. package/tools/bin/start-pr-fix-worker.sh +458 -0
  95. package/tools/bin/start-pr-merge-repair-worker.sh +8 -0
  96. package/tools/bin/start-pr-review-worker.sh +227 -0
  97. package/tools/bin/start-resident-issue-loop.sh +908 -0
  98. package/tools/bin/sync-agent-repo.sh +52 -0
  99. package/tools/bin/sync-dependency-baseline.sh +247 -0
  100. package/tools/bin/sync-pr-labels.sh +12 -0
  101. package/tools/bin/sync-recurring-issue-checklist.sh +274 -0
  102. package/tools/bin/sync-shared-agent-home.sh +214 -0
  103. package/tools/bin/sync-vscode-workspace.sh +157 -0
  104. package/tools/bin/test-smoke.sh +63 -0
  105. package/tools/bin/uninstall-project-launchd.sh +55 -0
  106. package/tools/bin/update-github-labels.sh +14 -0
  107. package/tools/bin/worker-status.sh +19 -0
  108. package/tools/bin/workflow-catalog.sh +77 -0
  109. package/tools/dashboard/app.js +286 -0
  110. package/tools/dashboard/dashboard_snapshot.py +466 -0
  111. package/tools/dashboard/index.html +41 -0
  112. package/tools/dashboard/server.py +64 -0
  113. package/tools/dashboard/styles.css +351 -0
  114. package/tools/templates/issue-prompt-template.md +109 -0
  115. package/tools/templates/pr-fix-template.md +120 -0
  116. package/tools/templates/pr-merge-repair-template.md +91 -0
  117. package/tools/templates/pr-review-template.md +62 -0
  118. package/tools/templates/scheduled-issue-prompt-template.md +62 -0
  119. package/tools/tests/test-agent-control-plane-npm-cli.sh +279 -0
  120. package/tools/tests/test-agent-github-update-labels-falls-back-to-repository-id.sh +56 -0
  121. package/tools/tests/test-agent-project-claude-session-wrapper-clears-stale-sandbox-artifacts.sh +89 -0
  122. package/tools/tests/test-agent-project-claude-session-wrapper-does-not-retry-provider-quota.sh +82 -0
  123. package/tools/tests/test-agent-project-claude-session-wrapper-retries-transient-failures.sh +90 -0
  124. package/tools/tests/test-agent-project-claude-session-wrapper-times-out.sh +73 -0
  125. package/tools/tests/test-agent-project-claude-session-wrapper.sh +103 -0
  126. package/tools/tests/test-agent-project-cleanup-session-orphan-fallback.sh +90 -0
  127. package/tools/tests/test-agent-project-cleanup-session-skip-worktree-cleanup.sh +90 -0
  128. package/tools/tests/test-agent-project-codex-live-thread-persist.sh +76 -0
  129. package/tools/tests/test-agent-project-codex-recovery.sh +731 -0
  130. package/tools/tests/test-agent-project-codex-session-wrapper-clears-stale-sandbox-artifacts.sh +105 -0
  131. package/tools/tests/test-agent-project-codex-session-wrapper.sh +97 -0
  132. package/tools/tests/test-agent-project-open-pr-worktree-config-prefix.sh +81 -0
  133. package/tools/tests/test-agent-project-openclaw-session-wrapper-clears-stale-sandbox-artifacts.sh +109 -0
  134. package/tools/tests/test-agent-project-openclaw-session-wrapper-infers-blocked-result-contract.sh +89 -0
  135. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-literal-env-artifacts.sh +113 -0
  136. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-version-mismatch.sh +135 -0
  137. package/tools/tests/test-agent-project-openclaw-session-wrapper-resident.sh +179 -0
  138. package/tools/tests/test-agent-project-openclaw-session-wrapper-reuses-existing-agent-after-add-race.sh +119 -0
  139. package/tools/tests/test-agent-project-openclaw-session-wrapper-terminates-rate-limit-hang.sh +91 -0
  140. package/tools/tests/test-agent-project-openclaw-session-wrapper.sh +117 -0
  141. package/tools/tests/test-agent-project-publish-issue-pr-prunes-stale-worktree-entry.sh +148 -0
  142. package/tools/tests/test-agent-project-publish-issue-pr-reads-archived-session.sh +146 -0
  143. package/tools/tests/test-agent-project-publish-issue-pr-recovers-final-head.sh +145 -0
  144. package/tools/tests/test-agent-project-publish-issue-pr-reuses-existing-worktree.sh +147 -0
  145. package/tools/tests/test-agent-project-reconcile-failure-reason.sh +456 -0
  146. package/tools/tests/test-agent-project-reconcile-issue-archived-session-fallback.sh +96 -0
  147. package/tools/tests/test-agent-project-reconcile-issue-before-blocked.sh +90 -0
  148. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery-uses-recovered-worktree.sh +212 -0
  149. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery.sh +207 -0
  150. package/tools/tests/test-agent-project-reconcile-issue-provider-quota-schedules-provider-cooldown.sh +101 -0
  151. package/tools/tests/test-agent-project-reconcile-issue-session-backfills-lane-metadata-from-worker-key.sh +113 -0
  152. package/tools/tests/test-agent-project-reconcile-issue-session-clears-stale-failed-summary.sh +117 -0
  153. package/tools/tests/test-agent-project-reconcile-issue-session-initializes-shared-agent-home.sh +55 -0
  154. package/tools/tests/test-agent-project-reconcile-issue-session-normalizes-runner-state.sh +125 -0
  155. package/tools/tests/test-agent-project-reconcile-issue-session-records-invalid-contract-summary.sh +118 -0
  156. package/tools/tests/test-agent-project-reconcile-issue-session-skips-duplicate-blocked-comment.sh +144 -0
  157. package/tools/tests/test-agent-project-reconcile-issue-session-standardizes-no-commits-blocker.sh +145 -0
  158. package/tools/tests/test-agent-project-reconcile-issue-session-synthesizes-blocked-comment.sh +139 -0
  159. package/tools/tests/test-agent-project-reconcile-pr-blocked-host-recovery.sh +242 -0
  160. package/tools/tests/test-agent-project-reconcile-pr-guard-blocked-no-commit.sh +142 -0
  161. package/tools/tests/test-agent-project-reconcile-pr-provider-quota-schedules-provider-cooldown.sh +106 -0
  162. package/tools/tests/test-agent-project-reconcile-pr-session-initializes-shared-agent-home.sh +66 -0
  163. package/tools/tests/test-agent-project-reconcile-pr-updated-branch-noop.sh +129 -0
  164. package/tools/tests/test-audit-agent-worktrees-active-launch-skips-git-inspection.sh +69 -0
  165. package/tools/tests/test-audit-agent-worktrees-broken-worktree.sh +43 -0
  166. package/tools/tests/test-audit-agent-worktrees-pending-launch-owner.sh +46 -0
  167. package/tools/tests/test-audit-agent-worktrees-unreconciled-owner.sh +79 -0
  168. package/tools/tests/test-audit-issue-routing-managed-branch-globs.sh +56 -0
  169. package/tools/tests/test-branch-verification-guard-generated-artifacts.sh +72 -0
  170. package/tools/tests/test-branch-verification-guard-targeted-coverage.sh +125 -0
  171. package/tools/tests/test-codex-quota-manager-failure-driven-rotation.sh +178 -0
  172. package/tools/tests/test-codex-quota-wrapper.sh +37 -0
  173. package/tools/tests/test-contribution-docs.sh +18 -0
  174. package/tools/tests/test-control-plane-dashboard-runtime-smoke.sh +343 -0
  175. package/tools/tests/test-create-follow-up-issue.sh +73 -0
  176. package/tools/tests/test-dashboard-launchd-bootstrap.sh +55 -0
  177. package/tools/tests/test-flow-export-execution-env-exports-repo-id.sh +30 -0
  178. package/tools/tests/test-flow-export-github-cli-auth-env-prefers-git-credential.sh +48 -0
  179. package/tools/tests/test-flow-github-api-repo-fallback-preserves-input.sh +85 -0
  180. package/tools/tests/test-flow-github-api-repo-prefers-explicit-repository-id.sh +60 -0
  181. package/tools/tests/test-flow-github-issue-list-falls-back-to-repository-id.sh +64 -0
  182. package/tools/tests/test-flow-github-pr-list-falls-back-to-repository-id.sh +77 -0
  183. package/tools/tests/test-flow-resident-can-reuse-does-not-leak-metadata.sh +52 -0
  184. package/tools/tests/test-flow-resident-reap-stale-controllers.sh +63 -0
  185. package/tools/tests/test-flow-resolve-codex-quota-tools.sh +104 -0
  186. package/tools/tests/test-flow-runtime-doctor-profile-selection.sh +27 -0
  187. package/tools/tests/test-heartbeat-codex-pr-linked-issue-exclusion.sh +79 -0
  188. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-idle-controller.sh +115 -0
  189. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-live-lane-controller.sh +117 -0
  190. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-claude.sh +96 -0
  191. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-codex.sh +96 -0
  192. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop.sh +96 -0
  193. package/tools/tests/test-heartbeat-loop-auth-wait-does-not-consume-capacity.sh +170 -0
  194. package/tools/tests/test-heartbeat-loop-blocked-recovery-lane.sh +201 -0
  195. package/tools/tests/test-heartbeat-loop-blocked-recovery-vs-pr-reservation.sh +201 -0
  196. package/tools/tests/test-heartbeat-loop-idle-resident-controller-does-not-block-launches.sh +160 -0
  197. package/tools/tests/test-heartbeat-loop-pr-launch-dedup.sh +133 -0
  198. package/tools/tests/test-heartbeat-loop-provider-cooldown-suppresses-launches.sh +157 -0
  199. package/tools/tests/test-heartbeat-loop-reaps-stale-resident-controller.sh +181 -0
  200. package/tools/tests/test-heartbeat-loop-waiting-provider-resident-controller-does-not-block-launches.sh +160 -0
  201. package/tools/tests/test-heartbeat-ready-issues-blocked-recovery.sh +134 -0
  202. package/tools/tests/test-heartbeat-safe-auto-dynamic-concurrency.sh +162 -0
  203. package/tools/tests/test-heartbeat-safe-auto-no-tmux-sessions.sh +136 -0
  204. package/tools/tests/test-heartbeat-safe-auto-openclaw-skips-codex-quota.sh +139 -0
  205. package/tools/tests/test-heartbeat-safe-auto-quota-health-signal.sh +119 -0
  206. package/tools/tests/test-heartbeat-safe-auto-stale-shared-loop-pid-does-not-skip.sh +140 -0
  207. package/tools/tests/test-heartbeat-safe-auto-static-capacity-without-quota-cache.sh +142 -0
  208. package/tools/tests/test-heartbeat-safe-auto-zero-healthy-pools.sh +141 -0
  209. package/tools/tests/test-heartbeat-sync-issue-labels-empty-schedule.sh +65 -0
  210. package/tools/tests/test-heartbeat-sync-open-agent-prs-terminal-clears-running.sh +179 -0
  211. package/tools/tests/test-install-dashboard-launchd.sh +78 -0
  212. package/tools/tests/test-install-project-launchd-adds-tool-paths.sh +87 -0
  213. package/tools/tests/test-install-project-launchd.sh +110 -0
  214. package/tools/tests/test-issue-local-workspace-install-policy.sh +81 -0
  215. package/tools/tests/test-issue-publish-scope-guard-docs-signal.sh +70 -0
  216. package/tools/tests/test-issue-reconcile-hooks-success-clears-blocked.sh +36 -0
  217. package/tools/tests/test-kick-scheduler-requires-explicit-profile.sh +47 -0
  218. package/tools/tests/test-label-follow-up-issues-falls-back-to-repository-id.sh +132 -0
  219. package/tools/tests/test-manual-operator-entrypoints-require-explicit-profile.sh +64 -0
  220. package/tools/tests/test-package-funding-metadata.sh +21 -0
  221. package/tools/tests/test-package-public-metadata.sh +62 -0
  222. package/tools/tests/test-placeholder-worker-adapters.sh +38 -0
  223. package/tools/tests/test-pr-reconcile-hooks-refreshes-recurring-issue-checklist.sh +110 -0
  224. package/tools/tests/test-pr-risk-cohesive-mobile-locale-scope.sh +70 -0
  225. package/tools/tests/test-pr-risk-fix-label-semantics.sh +114 -0
  226. package/tools/tests/test-pr-risk-local-first-no-checks.sh +70 -0
  227. package/tools/tests/test-prepare-worktree-simple-repo-baseline.sh +67 -0
  228. package/tools/tests/test-profile-activate.sh +33 -0
  229. package/tools/tests/test-profile-adopt-allow-missing-repo.sh +68 -0
  230. package/tools/tests/test-profile-adopt-skip-workspace-sync-missing-file.sh +61 -0
  231. package/tools/tests/test-profile-adopt-syncs-anchor-and-workspace.sh +90 -0
  232. package/tools/tests/test-profile-smoke-collision.sh +44 -0
  233. package/tools/tests/test-profile-smoke-invalid-claude-config.sh +31 -0
  234. package/tools/tests/test-profile-smoke-invalid-provider-pool.sh +68 -0
  235. package/tools/tests/test-profile-smoke-repo-slug-mismatch.sh +36 -0
  236. package/tools/tests/test-profile-smoke.sh +45 -0
  237. package/tools/tests/test-project-init-force-and-skip-sync.sh +61 -0
  238. package/tools/tests/test-project-init-repo-slug-mismatch.sh +29 -0
  239. package/tools/tests/test-project-init.sh +66 -0
  240. package/tools/tests/test-project-launchd-bootstrap.sh +66 -0
  241. package/tools/tests/test-project-remove.sh +150 -0
  242. package/tools/tests/test-project-runtime-supervisor.sh +47 -0
  243. package/tools/tests/test-project-runtimectl-launchd.sh +115 -0
  244. package/tools/tests/test-project-runtimectl-missing-profile.sh +54 -0
  245. package/tools/tests/test-project-runtimectl-start-falls-back-to-bootstrap.sh +108 -0
  246. package/tools/tests/test-project-runtimectl-status-reports-supervisor-as-heartbeat-parent.sh +95 -0
  247. package/tools/tests/test-project-runtimectl-status-supervisor-running.sh +59 -0
  248. package/tools/tests/test-project-runtimectl-stop-cancels-pending-kick.sh +85 -0
  249. package/tools/tests/test-project-runtimectl-stop-clears-running-labels.sh +78 -0
  250. package/tools/tests/test-project-runtimectl.sh +212 -0
  251. package/tools/tests/test-provider-cooldown-state-prefers-runtime-worker-context.sh +39 -0
  252. package/tools/tests/test-provider-cooldown-state.sh +59 -0
  253. package/tools/tests/test-public-repo-docs.sh +159 -0
  254. package/tools/tests/test-reconcile-pr-worker-acp-config-routing.sh +75 -0
  255. package/tools/tests/test-render-dashboard-snapshot.sh +149 -0
  256. package/tools/tests/test-render-flow-config-demo-profile.sh +36 -0
  257. package/tools/tests/test-render-flow-config-provider-pool-fallback.sh +81 -0
  258. package/tools/tests/test-render-flow-config.sh +52 -0
  259. package/tools/tests/test-run-codex-task-claude-routing.sh +125 -0
  260. package/tools/tests/test-run-codex-task-codex-resident-routing.sh +108 -0
  261. package/tools/tests/test-run-codex-task-kilo-routing.sh +98 -0
  262. package/tools/tests/test-run-codex-task-openclaw-resident-routing.sh +117 -0
  263. package/tools/tests/test-run-codex-task-openclaw-routing.sh +113 -0
  264. package/tools/tests/test-run-codex-task-opencode-routing.sh +98 -0
  265. package/tools/tests/test-run-codex-task-provider-pool-fallback-routing.sh +146 -0
  266. package/tools/tests/test-scaffold-profile.sh +108 -0
  267. package/tools/tests/test-serve-dashboard.sh +93 -0
  268. package/tools/tests/test-start-issue-worker-blocked-context.sh +129 -0
  269. package/tools/tests/test-start-issue-worker-blocks-complete-recurring-checklist.sh +189 -0
  270. package/tools/tests/test-start-issue-worker-local-install-routing.sh +157 -0
  271. package/tools/tests/test-start-issue-worker-profile-template-routing.sh +149 -0
  272. package/tools/tests/test-start-issue-worker-recurring-resident-reuse-codex.sh +212 -0
  273. package/tools/tests/test-start-issue-worker-recurring-resident-reuse.sh +219 -0
  274. package/tools/tests/test-start-issue-worker-renders-verification-snippet.sh +155 -0
  275. package/tools/tests/test-start-issue-worker-resident-reuse-falls-back-to-new-worktree.sh +199 -0
  276. package/tools/tests/test-start-pr-fix-worker-host-blocker-context.sh +275 -0
  277. package/tools/tests/test-start-resident-issue-loop-adopts-next-recurring-issue.sh +185 -0
  278. package/tools/tests/test-start-resident-issue-loop-clears-pending-while-waiting-due.sh +152 -0
  279. package/tools/tests/test-start-resident-issue-loop-consumes-queued-lease.sh +186 -0
  280. package/tools/tests/test-start-resident-issue-loop-fails-over-provider-pool.sh +212 -0
  281. package/tools/tests/test-start-resident-issue-loop-immediate-cycles.sh +148 -0
  282. package/tools/tests/test-start-resident-issue-loop-waits-for-provider.sh +194 -0
  283. package/tools/tests/test-start-resident-issue-loop-waits-for-terminal-reconcile-status.sh +198 -0
  284. package/tools/tests/test-start-resident-issue-loop-yields-to-live-lane-controller.sh +145 -0
  285. package/tools/tests/test-sync-pr-labels-fix-lane-uses-repair-queued.sh +67 -0
  286. package/tools/tests/test-sync-recurring-issue-checklist-backfills-workflow-complete-blocker.sh +70 -0
  287. package/tools/tests/test-sync-recurring-issue-checklist.sh +95 -0
  288. package/tools/tests/test-sync-shared-agent-home-local-source-root.sh +66 -0
  289. package/tools/tests/test-sync-shared-agent-home-preserves-unrelated-workflow-catalog-skill.sh +47 -0
  290. package/tools/tests/test-test-smoke.sh +86 -0
  291. package/tools/tests/test-uninstall-project-launchd.sh +37 -0
  292. package/tools/tests/test-update-github-labels-prefers-sibling-helper.sh +49 -0
  293. package/tools/tests/test-workflow-catalog.sh +43 -0
  294. package/tools/vendor/codex-quota/LICENSE +21 -0
  295. package/tools/vendor/codex-quota/README.md +459 -0
  296. package/tools/vendor/codex-quota/codex-quota.js +261 -0
  297. package/tools/vendor/codex-quota/lib/claude-accounts.js +226 -0
  298. package/tools/vendor/codex-quota/lib/claude-oauth.js +174 -0
  299. package/tools/vendor/codex-quota/lib/claude-tokens.js +471 -0
  300. package/tools/vendor/codex-quota/lib/claude-usage.js +929 -0
  301. package/tools/vendor/codex-quota/lib/codex-accounts.js +205 -0
  302. package/tools/vendor/codex-quota/lib/codex-tokens.js +326 -0
  303. package/tools/vendor/codex-quota/lib/codex-usage.js +32 -0
  304. package/tools/vendor/codex-quota/lib/color.js +72 -0
  305. package/tools/vendor/codex-quota/lib/constants.js +57 -0
  306. package/tools/vendor/codex-quota/lib/container.js +143 -0
  307. package/tools/vendor/codex-quota/lib/display.js +1111 -0
  308. package/tools/vendor/codex-quota/lib/fs.js +63 -0
  309. package/tools/vendor/codex-quota/lib/handlers.js +2060 -0
  310. package/tools/vendor/codex-quota/lib/jwt.js +33 -0
  311. package/tools/vendor/codex-quota/lib/oauth.js +486 -0
  312. package/tools/vendor/codex-quota/lib/paths.js +34 -0
  313. package/tools/vendor/codex-quota/lib/prompts.js +44 -0
  314. package/tools/vendor/codex-quota/lib/sync.js +1438 -0
  315. package/tools/vendor/codex-quota/lib/token-match.js +96 -0
  316. package/tools/vendor/codex-quota-manager/scripts/auto-switch.sh +500 -0
  317. package/tools/vendor/codex-quota-manager/scripts/batch-add.sh +123 -0
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
5
+
6
+ test -f "$ROOT_DIR/SECURITY.md"
7
+ test -f "$ROOT_DIR/CODE_OF_CONDUCT.md"
8
+ test -f "$ROOT_DIR/CHANGELOG.md"
9
+ test -f "$ROOT_DIR/ROADMAP.md"
10
+ test -f "$ROOT_DIR/references/architecture.md"
11
+ test -f "$ROOT_DIR/references/release-checklist.md"
12
+ test -f "$ROOT_DIR/.github/release-template.md"
13
+ test -f "$ROOT_DIR/.github/workflows/ci.yml"
14
+ test -f "$ROOT_DIR/tools/bin/render-dashboard-demo-media.sh"
15
+ test -f "$ROOT_DIR/tools/bin/render-architecture-infographics.sh"
16
+ test -f "$ROOT_DIR/tools/architecture/architecture-infographics.html"
17
+ test -f "$ROOT_DIR/assets/readme/dashboard-demo.png"
18
+ test -f "$ROOT_DIR/assets/readme/dashboard-demo.gif"
19
+ test -f "$ROOT_DIR/assets/architecture/agent-control-plane-architecture.pdf"
20
+ test -f "$ROOT_DIR/assets/architecture/overview-infographic.png"
21
+ test -f "$ROOT_DIR/assets/architecture/runtime-loop-infographic.png"
22
+ test -f "$ROOT_DIR/assets/architecture/worker-lifecycle-infographic.png"
23
+ test -f "$ROOT_DIR/assets/architecture/state-dashboard-infographic.png"
24
+
25
+ grep -q 'Use GitHub private vulnerability reporting or a GitHub security advisory' "$ROOT_DIR/SECURITY.md"
26
+ grep -q 'For undisclosed security issues, use \[SECURITY.md\](\./SECURITY.md)' "$ROOT_DIR/CODE_OF_CONDUCT.md"
27
+ grep -q '^## \[Unreleased\]$' "$ROOT_DIR/CHANGELOG.md"
28
+ grep -q '^## \[0.1.0\] - 2026-03-27$' "$ROOT_DIR/CHANGELOG.md"
29
+ grep -q '^# Roadmap$' "$ROOT_DIR/ROADMAP.md"
30
+ grep -q '^## Platform Support$' "$ROOT_DIR/ROADMAP.md"
31
+ grep -q '^| Platform | Status | Why it matters next |$' "$ROOT_DIR/ROADMAP.md"
32
+ grep -q '^| `macOS` | best supported today | Current reference platform for setup, launchd, dashboard, and local operator flows\. |$' "$ROOT_DIR/ROADMAP.md"
33
+ grep -q '^| `Linux` | planned next | ACP already knows common Linux package managers; the missing step is first-class runtime/service validation and an operator story as smooth as macOS\. |$' "$ROOT_DIR/ROADMAP.md"
34
+ grep -q '^| `Windows (WSL2)` | exploratory next | A practical bridge for Windows users who still want Unix-like repos, containers, and worker CLIs\. |$' "$ROOT_DIR/ROADMAP.md"
35
+ grep -q '^| `Native Windows` | longer-term | Needs explicit work around services, shell/process management, path handling, and backend compatibility\. |$' "$ROOT_DIR/ROADMAP.md"
36
+ grep -q '^| Backend | Status | Runtime Routing | Profile Scaffolding | Notes |$' "$ROOT_DIR/ROADMAP.md"
37
+ grep -q '^| `codex` | available now | yes | yes | First-class worker path for Codex-backed runs\. |$' "$ROOT_DIR/ROADMAP.md"
38
+ grep -q '^| `opencode` | planned next | placeholder scaffold | no | Adapter stub ships in the package, but live execution is not implemented yet\. |$' "$ROOT_DIR/ROADMAP.md"
39
+ grep -q '^| `kilo` | planned next | placeholder scaffold | no | Adapter stub ships in the package, but live execution is not implemented yet\. |$' "$ROOT_DIR/ROADMAP.md"
40
+ grep -q '^| `gemini-cli` | research next | no | no | Official Google terminal agent and the closest ecosystem fit for a future ACP worker adapter\. |$' "$ROOT_DIR/ROADMAP.md"
41
+ grep -q -- '- `codex`' "$ROOT_DIR/ROADMAP.md"
42
+ grep -q -- '- `claude`' "$ROOT_DIR/ROADMAP.md"
43
+ grep -q -- '- `openclaw`' "$ROOT_DIR/ROADMAP.md"
44
+ grep -q -- '- `opencode`' "$ROOT_DIR/ROADMAP.md"
45
+ grep -q -- '- `kilo`' "$ROOT_DIR/ROADMAP.md"
46
+ grep -q -- '- `gemini-cli`' "$ROOT_DIR/ROADMAP.md"
47
+ grep -q '^## Adjacent Runtime and Model Integrations$' "$ROOT_DIR/ROADMAP.md"
48
+ grep -q '^| Target | Category | Status | Why it matters |$' "$ROOT_DIR/ROADMAP.md"
49
+ grep -q '^| `ollama` | local model runtime | research next | Strong local-first story, cross-platform distribution, and an existing tool-launch surface that already knows about coding tools\. |$' "$ROOT_DIR/ROADMAP.md"
50
+ grep -q '^| `nanoclaw` | containerized assistant runtime | exploratory | Useful reference for container isolation, scheduled tasks, and WSL2-friendly workflows around Claude-powered agents\. |$' "$ROOT_DIR/ROADMAP.md"
51
+ grep -q '^| `picoclaw` | lightweight assistant runtime | exploratory | Interesting for Linux and edge-style deployments, MCP-heavy workflows, and ultra-low-footprint automation\. |$' "$ROOT_DIR/ROADMAP.md"
52
+ grep -q '^# Release Summary$' "$ROOT_DIR/.github/release-template.md"
53
+ grep -q '\[SECURITY.md\](\./SECURITY.md)' "$ROOT_DIR/README.md"
54
+ grep -q '\[CODE_OF_CONDUCT.md\](\./CODE_OF_CONDUCT.md)' "$ROOT_DIR/README.md"
55
+ grep -q '\[CHANGELOG.md\](\./CHANGELOG.md)' "$ROOT_DIR/README.md"
56
+ grep -q '\[ROADMAP.md\](\./ROADMAP.md)' "$ROOT_DIR/README.md"
57
+ grep -q '\[references/architecture.md\](\./references/architecture.md)' "$ROOT_DIR/README.md"
58
+ grep -q '\[references/commands.md\](\./references/commands.md)' "$ROOT_DIR/README.md"
59
+ grep -q 'keep coding agents running reliably without' "$ROOT_DIR/README.md"
60
+ grep -q 'constant human babysitting' "$ROOT_DIR/README.md"
61
+ grep -q 'replace human babysitting with boring runtime ownership: supervisor,' "$ROOT_DIR/README.md"
62
+ grep -q '^## Architecture$' "$ROOT_DIR/README.md"
63
+ grep -q '^### Runtime Loop At A Glance$' "$ROOT_DIR/README.md"
64
+ grep -q '```mermaid' "$ROOT_DIR/README.md"
65
+ grep -q '\[System overview\](\./references/architecture.md#system-overview)' "$ROOT_DIR/README.md"
66
+ grep -q '\[Runtime scheduler loop\](\./references/architecture.md#runtime-scheduler-loop)' "$ROOT_DIR/README.md"
67
+ grep -q '\[Dashboard snapshot pipeline\](\./references/architecture.md#dashboard-snapshot-pipeline)' "$ROOT_DIR/README.md"
68
+ grep -q '\[Architecture deck PDF\](\./assets/architecture/agent-control-plane-architecture.pdf)' "$ROOT_DIR/README.md"
69
+ grep -q '\[Overview infographic\](\./assets/architecture/overview-infographic.png)' "$ROOT_DIR/README.md"
70
+ grep -q '\[Runtime loop infographic\](\./assets/architecture/runtime-loop-infographic.png)' "$ROOT_DIR/README.md"
71
+ grep -q '\[Worker lifecycle infographic\](\./assets/architecture/worker-lifecycle-infographic.png)' "$ROOT_DIR/README.md"
72
+ grep -q '\[State and dashboard infographic\](\./assets/architecture/state-dashboard-infographic.png)' "$ROOT_DIR/README.md"
73
+ grep -q 'planned next: `opencode`, `kilo`, `gemini-cli`' "$ROOT_DIR/README.md"
74
+ grep -q 'platform roadmap now calls out Linux, Windows via WSL2, and the longer-term' "$ROOT_DIR/README.md"
75
+ grep -q 'native Windows story explicitly' "$ROOT_DIR/README.md"
76
+ grep -q 'such as `ollama`, `nanoclaw`, and `picoclaw`' "$ROOT_DIR/README.md"
77
+ grep -q 'roadmap matrix now distinguishes implemented backends from placeholder' "$ROOT_DIR/README.md"
78
+ grep -q '^### Backend Snapshot$' "$ROOT_DIR/README.md"
79
+ grep -q '^| Backend | What You Can Expect Today |$' "$ROOT_DIR/README.md"
80
+ grep -q '^| `codex` | Ready for real ACP workflows today\. |$' "$ROOT_DIR/README.md"
81
+ grep -q '^| `openclaw` | Ready for real ACP workflows today, including resident-style runs\. |$' "$ROOT_DIR/README.md"
82
+ grep -q '^| `opencode` | Scaffolded in the package so routing and docs can evolve, but not implemented for live execution yet\. |$' "$ROOT_DIR/README.md"
83
+ grep -q '^| `kilo` | Scaffolded in the package so routing and docs can evolve, but not implemented for live execution yet\. |$' "$ROOT_DIR/README.md"
84
+ grep -q '^| `gemini-cli` | Not wired into ACP yet, but on the public roadmap as a strong future worker candidate\. |$' "$ROOT_DIR/README.md"
85
+ grep -q '^### Support Matrix$' "$ROOT_DIR/README.md"
86
+ grep -q '^| Target | Kind | ACP Relationship Today | Current Status |$' "$ROOT_DIR/README.md"
87
+ grep -q '^| `codex` | direct worker | First-class ACP worker backend | production-ready path today |$' "$ROOT_DIR/README.md"
88
+ grep -q '^| `openclaw` | direct worker | First-class ACP worker backend with resident workflow support | production-ready path today |$' "$ROOT_DIR/README.md"
89
+ grep -q '^| `gemini-cli` | direct worker | Research target for a future worker adapter | roadmap candidate |$' "$ROOT_DIR/README.md"
90
+ grep -q '^| `ollama` | local model runtime | Candidate local-model substrate behind future ACP integrations | research target |$' "$ROOT_DIR/README.md"
91
+ grep -q '^| `nanoclaw` | adjacent agent shell | Ecosystem reference for containerized and WSL2-friendly workflows | exploratory interoperability target |$' "$ROOT_DIR/README.md"
92
+ grep -q '^| `picoclaw` | adjacent agent shell | Ecosystem reference for lightweight Linux and edge-style agent runtimes | exploratory interoperability target |$' "$ROOT_DIR/README.md"
93
+ grep -q 'If you are trying ACP on a real repo right now, start with `codex`, `claude`,' "$ROOT_DIR/README.md"
94
+ grep -q 'github.com/ducminhuyen0319/agent-control-plane/actions/workflows/ci.yml/badge.svg?branch=main' "$ROOT_DIR/README.md"
95
+ grep -q 'img.shields.io/npm/v/agent-control-plane' "$ROOT_DIR/README.md"
96
+ grep -q 'img.shields.io/node/v/agent-control-plane' "$ROOT_DIR/README.md"
97
+ grep -q 'img.shields.io/npm/l/agent-control-plane' "$ROOT_DIR/README.md"
98
+ grep -q 'https://github.com/ducminhuyen0319/agent-control-plane/actions/workflows/ci.yml' "$ROOT_DIR/README.md"
99
+ grep -q 'https://www.npmjs.com/package/agent-control-plane' "$ROOT_DIR/README.md"
100
+ grep -q '\./assets/readme/dashboard-demo.png' "$ROOT_DIR/README.md"
101
+ grep -q '\./assets/readme/dashboard-demo.gif' "$ROOT_DIR/README.md"
102
+ grep -q '^| Tool | Required | Why ACP uses it | Notes |$' "$ROOT_DIR/README.md"
103
+ grep -q '^| Node.js `>= 18` | yes | Runs the npm package entrypoint and `npx agent-control-plane \.\.\.` wrapper\. |' "$ROOT_DIR/README.md"
104
+ grep -q '^| `jq` | yes | Several runtime and GitHub flows parse JSON from `gh` and worker metadata\. |' "$ROOT_DIR/README.md"
105
+ grep -q '^| Bundled `codex-quota` plus ACP quota manager | automatic for Codex profiles | Improves Codex quota-aware failover and health signals\. |' "$ROOT_DIR/README.md"
106
+ grep -q 'ACP_CODEX_QUOTA_BIN=/path/to/codex-quota' "$ROOT_DIR/README.md"
107
+ grep -q '^| Command | What it is for | Key args and parameters |$' "$ROOT_DIR/README.md"
108
+ grep -q '^```bash$' "$ROOT_DIR/README.md"
109
+ grep -q '^npx agent-control-plane@latest setup$' "$ROOT_DIR/README.md"
110
+ grep -q '`setup` detects the current repo when it can' "$ROOT_DIR/README.md"
111
+ grep -q 'offers to install missing core tools' "$ROOT_DIR/README.md"
112
+ grep -q 'can prompt to run `gh auth login`' "$ROOT_DIR/README.md"
113
+ grep -q 'reports core tool and auth readiness' "$ROOT_DIR/README.md"
114
+ grep -q '^During `setup`, ACP can:$' "$ROOT_DIR/README.md"
115
+ grep -q 'supported package managers such as `brew`, `apt-get`, `dnf`, `yum`,' "$ROOT_DIR/README.md"
116
+ grep -q 'offer to install supported worker backends like `codex`, `claude`, or' "$ROOT_DIR/README.md"
117
+ grep -q 'run one final fix-up summary at the end so you can clear whatever is still' "$ROOT_DIR/README.md"
118
+ grep -q 'The wizard now automates ACP'\''s shell/runtime prerequisites and can also' "$ROOT_DIR/README.md"
119
+ grep -q 'auto-install supported worker CLIs through npm' "$ROOT_DIR/README.md"
120
+ grep -q 'it will tell you what is missing, print' "$ROOT_DIR/README.md"
121
+ grep -q 'backend-specific next steps, and offer to open the right setup docs' "$ROOT_DIR/README.md"
122
+ grep -q '^npx agent-control-plane@latest setup --dry-run$' "$ROOT_DIR/README.md"
123
+ grep -q 'without writing files, installing packages, or launching background services' "$ROOT_DIR/README.md"
124
+ grep -q 'emit exactly one JSON object on `stdout`' "$ROOT_DIR/README.md"
125
+ grep -q 'send progress logs to' "$ROOT_DIR/README.md"
126
+ grep -q '`stderr`, which keeps parsing stable\.' "$ROOT_DIR/README.md"
127
+ grep -q '`--non-interactive`, `--install-missing-deps`, `--gh-auth-login`,' "$ROOT_DIR/README.md"
128
+ grep -q '`--start-runtime`, and `--json`\.' "$ROOT_DIR/README.md"
129
+ grep -q '^| `npx agent-control-plane@latest setup` | Guided bootstrap for one repo profile\. |' "$ROOT_DIR/README.md"
130
+ grep -q 'can install missing core tools, supported worker backends, and run `gh auth login`' "$ROOT_DIR/README.md"
131
+ grep -q 'Add `--json` for one structured JSON result on `stdout`' "$ROOT_DIR/README.md"
132
+ grep -q '^| `npx agent-control-plane@latest setup --dry-run` | Preview exactly what setup would do without changing the machine\. |' "$ROOT_DIR/README.md"
133
+ grep -q 'Add `--json` for a machine-readable plan object\.' "$ROOT_DIR/README.md"
134
+ grep -q '^| `npx agent-control-plane@latest install` | Alias for `sync`\.' "$ROOT_DIR/README.md"
135
+ grep -q '^| `npx agent-control-plane@latest runtime <status\|start\|stop\|restart> --profile-id <id>` | Operate one profile runtime\. |' "$ROOT_DIR/README.md"
136
+ grep -q '\[references/commands.md\](\./references/commands.md)' "$ROOT_DIR/README.md"
137
+ grep -q '^# Architecture Guide$' "$ROOT_DIR/references/architecture.md"
138
+ grep -q '^## System Overview$' "$ROOT_DIR/references/architecture.md"
139
+ grep -q '^## Install and Publication Flow$' "$ROOT_DIR/references/architecture.md"
140
+ grep -q '^## Runtime Scheduler Loop$' "$ROOT_DIR/references/architecture.md"
141
+ grep -q '^## Worker Session Lifecycle$' "$ROOT_DIR/references/architecture.md"
142
+ grep -q '^## Dashboard Snapshot Pipeline$' "$ROOT_DIR/references/architecture.md"
143
+ grep -q '```mermaid' "$ROOT_DIR/references/architecture.md"
144
+ grep -q 'Maintainer checklist for shipping a new public package release' "$ROOT_DIR/references/release-checklist.md"
145
+ grep -q 'npm publish --access public' "$ROOT_DIR/references/release-checklist.md"
146
+ grep -q 'render-dashboard-demo-media.sh' "$ROOT_DIR/references/release-checklist.md"
147
+ grep -q 'if a public GitHub repo now exists, set or verify the `homepage`,' "$ROOT_DIR/references/release-checklist.md"
148
+ grep -q '`repository`, and `bugs` URLs in `package.json`' "$ROOT_DIR/references/release-checklist.md"
149
+ grep -q 'bash tools/bin/test-smoke.sh' "$ROOT_DIR/references/release-checklist.md"
150
+ grep -q '`references/release-checklist.md`' "$ROOT_DIR/references/docs-map.md"
151
+ grep -q '`references/architecture.md`' "$ROOT_DIR/references/docs-map.md"
152
+ grep -q '`CHANGELOG.md`' "$ROOT_DIR/references/docs-map.md"
153
+ grep -q '`ROADMAP.md`' "$ROOT_DIR/references/docs-map.md"
154
+ grep -q '`.github/release-template.md`' "$ROOT_DIR/references/docs-map.md"
155
+ grep -q '`.github/workflows/ci.yml`' "$ROOT_DIR/references/docs-map.md"
156
+ grep -q '`tools/bin/render-dashboard-demo-media.sh`' "$ROOT_DIR/references/docs-map.md"
157
+ grep -q '`tools/bin/render-architecture-infographics.sh`' "$ROOT_DIR/references/docs-map.md"
158
+
159
+ echo "public repo docs test passed"
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SOURCE_SCRIPT="${FLOW_ROOT}/tools/bin/reconcile-pr-worker.sh"
6
+ FLOW_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
7
+ FLOW_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
8
+
9
+ tmpdir="$(mktemp -d)"
10
+ trap 'rm -rf "$tmpdir"' EXIT
11
+
12
+ workspace_bin_dir="$tmpdir/workspace/bin"
13
+ shared_home="$tmpdir/shared-home"
14
+ flow_root="$shared_home/skills/openclaw/agent-control-plane"
15
+ flow_tools_dir="$flow_root/tools/bin"
16
+ flow_assets_dir="$flow_root/assets"
17
+ hooks_dir="$flow_root/hooks"
18
+ profile_home="$tmpdir/profiles"
19
+ capture_file="$tmpdir/capture.log"
20
+
21
+ mkdir -p "$workspace_bin_dir" "$flow_tools_dir" "$flow_assets_dir" "$hooks_dir" "$profile_home/demo"
22
+ cp "$SOURCE_SCRIPT" "$workspace_bin_dir/reconcile-pr-worker.sh"
23
+ cp "$FLOW_CONFIG_LIB" "$workspace_bin_dir/flow-config-lib.sh"
24
+ cp "$FLOW_SHELL_LIB" "$workspace_bin_dir/flow-shell-lib.sh"
25
+
26
+ cat >"$profile_home/demo/control-plane.yaml" <<EOF
27
+ id: "demo"
28
+ repo:
29
+ slug: "example/repo"
30
+ runtime:
31
+ orchestrator_agent_root: "$tmpdir/agent-root"
32
+ agent_repo_root: "$tmpdir/repo"
33
+ runs_root: "$tmpdir/runs"
34
+ EOF
35
+
36
+ cat >"$flow_tools_dir/agent-project-reconcile-pr-session" <<'EOF'
37
+ #!/usr/bin/env bash
38
+ set -euo pipefail
39
+ printf 'ARGV=%s\n' "$*" >"${TEST_CAPTURE_FILE:?}"
40
+ printf 'ACP_RUNS_ROOT=%s\n' "${ACP_RUNS_ROOT:-}" >>"${TEST_CAPTURE_FILE:?}"
41
+ printf 'F_LOSNING_RUNS_ROOT=%s\n' "${F_LOSNING_RUNS_ROOT:-}" >>"${TEST_CAPTURE_FILE:?}"
42
+ EOF
43
+
44
+ cat >"$hooks_dir/pr-reconcile-hooks.sh" <<'EOF'
45
+ #!/usr/bin/env bash
46
+ set -euo pipefail
47
+ exit 0
48
+ EOF
49
+
50
+ chmod +x \
51
+ "$workspace_bin_dir/reconcile-pr-worker.sh" \
52
+ "$workspace_bin_dir/flow-config-lib.sh" \
53
+ "$workspace_bin_dir/flow-shell-lib.sh" \
54
+ "$flow_tools_dir/agent-project-reconcile-pr-session" \
55
+ "$hooks_dir/pr-reconcile-hooks.sh"
56
+
57
+ expected_hook_file="$(cd "$hooks_dir" && pwd -P)/pr-reconcile-hooks.sh"
58
+
59
+ TEST_CAPTURE_FILE="$capture_file" \
60
+ SHARED_AGENT_HOME="$shared_home" \
61
+ ACP_ROOT="$flow_root" \
62
+ ACP_PROFILE_REGISTRY_ROOT="$profile_home" \
63
+ ACP_PROJECT_ID="demo" \
64
+ bash "$workspace_bin_dir/reconcile-pr-worker.sh" "acp-pr-55"
65
+
66
+ grep -q -- '--session acp-pr-55' "$capture_file"
67
+ grep -q -- '--repo-slug example/repo' "$capture_file"
68
+ grep -q -- "--repo-root $tmpdir/repo" "$capture_file"
69
+ grep -q -- "--runs-root $tmpdir/runs" "$capture_file"
70
+ grep -q -- "--history-root $tmpdir/agent-root/history" "$capture_file"
71
+ grep -q -- "--hook-file $expected_hook_file" "$capture_file"
72
+ grep -q -- "^ACP_RUNS_ROOT=$tmpdir/runs$" "$capture_file"
73
+ grep -q -- "^F_LOSNING_RUNS_ROOT=$tmpdir/runs$" "$capture_file"
74
+
75
+ echo "reconcile-pr-worker acp config routing test passed"
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SNAPSHOT_BIN="${FLOW_ROOT}/tools/bin/render-dashboard-snapshot.py"
6
+
7
+ tmpdir="$(mktemp -d)"
8
+ trap 'rm -rf "$tmpdir"' EXIT
9
+
10
+ profile_registry_root="$tmpdir/profiles"
11
+ profile_dir="$profile_registry_root/demo"
12
+ runs_root="$tmpdir/runtime/demo/runs"
13
+ state_root="$tmpdir/runtime/demo/state"
14
+ run_dir="$runs_root/demo-issue-1"
15
+
16
+ mkdir -p \
17
+ "$profile_dir" \
18
+ "$run_dir" \
19
+ "$state_root/resident-workers/issues/1" \
20
+ "$state_root/resident-workers/issues/issue-lane-recurring-general-openclaw-safe" \
21
+ "$state_root/retries/providers" \
22
+ "$state_root/scheduled-issues" \
23
+ "$state_root/resident-workers/issue-queue/pending"
24
+
25
+ cat >"$profile_dir/control-plane.yaml" <<EOF
26
+ schema_version: "1"
27
+ id: "demo"
28
+ repo:
29
+ slug: "example/demo-dashboard"
30
+ root: "$tmpdir/repo"
31
+ default_branch: "main"
32
+ runtime:
33
+ orchestrator_agent_root: "$tmpdir/runtime/demo"
34
+ worktree_root: "$tmpdir/worktrees"
35
+ agent_repo_root: "$tmpdir/repo"
36
+ runs_root: "$runs_root"
37
+ state_root: "$state_root"
38
+ history_root: "$tmpdir/runtime/demo/history"
39
+ retained_repo_root: "$tmpdir/repo"
40
+ vscode_workspace_file: "$tmpdir/demo.code-workspace"
41
+ session_naming:
42
+ issue_prefix: "demo-issue-"
43
+ pr_prefix: "demo-pr-"
44
+ execution:
45
+ coding_worker: "openclaw"
46
+ openclaw:
47
+ model: "primary/model"
48
+ thinking: "adaptive"
49
+ timeout_seconds: 900
50
+ EOF
51
+
52
+ cat >"$run_dir/run.env" <<'EOF'
53
+ TASK_KIND=issue
54
+ TASK_ID=1
55
+ SESSION=demo-issue-1
56
+ MODE=safe
57
+ STARTED_AT=2026-03-26T15:00:00Z
58
+ CODING_WORKER=openclaw
59
+ WORKTREE=/tmp/demo-worktree
60
+ BRANCH=agent/demo/issue-1
61
+ RESIDENT_WORKER_KEY=issue-lane-recurring-general-openclaw-safe
62
+ OPENCLAW_MODEL=primary/model
63
+ EOF
64
+
65
+ cat >"$run_dir/runner.env" <<'EOF'
66
+ RUNNER_STATE=succeeded
67
+ THREAD_ID=thread-demo-1
68
+ LAST_EXIT_CODE=0
69
+ LAST_FAILURE_REASON=''
70
+ UPDATED_AT=2026-03-26T15:01:00Z
71
+ EOF
72
+
73
+ cat >"$run_dir/result.env" <<'EOF'
74
+ OUTCOME=implemented
75
+ ACTION=host-publish-issue-pr
76
+ EOF
77
+
78
+ cat >"$state_root/resident-workers/issues/1/controller.env" <<'EOF'
79
+ ISSUE_ID=1
80
+ SESSION=demo-issue-1
81
+ CONTROLLER_PID=1234
82
+ CONTROLLER_MODE=safe
83
+ CONTROLLER_LOOP_COUNT=2
84
+ CONTROLLER_STATE=waiting-provider
85
+ CONTROLLER_REASON=provider-cooldown
86
+ ACTIVE_RESIDENT_WORKER_KEY=issue-lane-recurring-general-openclaw-safe
87
+ ACTIVE_RESIDENT_LANE_KIND=recurring
88
+ ACTIVE_RESIDENT_LANE_VALUE=general
89
+ ACTIVE_PROVIDER_BACKEND=openclaw
90
+ ACTIVE_PROVIDER_MODEL=primary/model
91
+ PROVIDER_SWITCH_COUNT=1
92
+ PROVIDER_FAILOVER_COUNT=1
93
+ PROVIDER_WAIT_COUNT=2
94
+ PROVIDER_WAIT_TOTAL_SECONDS=45
95
+ PROVIDER_LAST_WAIT_SECONDS=21
96
+ UPDATED_AT=2026-03-26T15:02:00Z
97
+ EOF
98
+
99
+ cat >"$state_root/resident-workers/issues/issue-lane-recurring-general-openclaw-safe/metadata.env" <<'EOF'
100
+ RESIDENT_WORKER_KIND=issue
101
+ RESIDENT_WORKER_SCOPE=lane
102
+ RESIDENT_WORKER_KEY=issue-lane-recurring-general-openclaw-safe
103
+ ISSUE_ID=1
104
+ CODING_WORKER=openclaw
105
+ TASK_COUNT=7
106
+ LAST_STATUS=running
107
+ LAST_STARTED_AT=2026-03-26T15:00:00Z
108
+ LAST_RUN_SESSION=demo-issue-1
109
+ EOF
110
+
111
+ cat >"$state_root/retries/providers/openclaw-primary-model.env" <<'EOF'
112
+ ATTEMPTS=2
113
+ NEXT_ATTEMPT_EPOCH=4102444800
114
+ NEXT_ATTEMPT_AT=2100-01-01T00:00:00Z
115
+ LAST_REASON=provider-quota-limit
116
+ UPDATED_AT=2026-03-26T15:03:00Z
117
+ EOF
118
+
119
+ cat >"$state_root/scheduled-issues/1.env" <<'EOF'
120
+ INTERVAL_SECONDS=600
121
+ LAST_STARTED_AT=2026-03-26T15:00:00Z
122
+ NEXT_DUE_AT=2026-03-26T15:10:00Z
123
+ UPDATED_AT=2026-03-26T15:00:00Z
124
+ EOF
125
+
126
+ cat >"$state_root/resident-workers/issue-queue/pending/issue-2.env" <<'EOF'
127
+ ISSUE_ID=2
128
+ SESSION=demo-issue-2
129
+ UPDATED_AT=2026-03-26T15:04:00Z
130
+ EOF
131
+
132
+ snapshot="$(ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root" python3 "$SNAPSHOT_BIN" --pretty)"
133
+
134
+ grep -q '"profile_count": 1' <<<"$snapshot"
135
+ grep -q '"id": "demo"' <<<"$snapshot"
136
+ grep -q '"repo_slug": "example/demo-dashboard"' <<<"$snapshot"
137
+ grep -q '"session": "demo-issue-1"' <<<"$snapshot"
138
+ grep -q '"state": "waiting-provider"' <<<"$snapshot"
139
+ grep -q '"provider_failover_count": 1' <<<"$snapshot"
140
+ grep -q '"provider_wait_total_seconds": 45' <<<"$snapshot"
141
+ grep -q '"provider_key": "openclaw-primary-model"' <<<"$snapshot"
142
+ grep -q '"queued_issues": 1' <<<"$snapshot"
143
+ grep -q '"implemented_runs": 1' <<<"$snapshot"
144
+ grep -q '"live_resident_controllers": 0' <<<"$snapshot"
145
+ grep -q '"controller_live": false' <<<"$snapshot"
146
+ grep -q '"result_kind": "implemented"' <<<"$snapshot"
147
+ grep -q '"result_label": "Implemented"' <<<"$snapshot"
148
+
149
+ echo "render dashboard snapshot test passed"
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SCRIPT="${FLOW_ROOT}/tools/bin/render-flow-config.sh"
6
+ SCAFFOLD_SCRIPT="${FLOW_ROOT}/tools/bin/scaffold-profile.sh"
7
+
8
+ tmpdir="$(mktemp -d)"
9
+ trap 'rm -rf "$tmpdir"' EXIT
10
+
11
+ profile_home="$tmpdir/profiles"
12
+ repo_slug="example-owner/alpha"
13
+
14
+ bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id alpha --repo-slug "$repo_slug" >/dev/null
15
+ bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id demo --repo-slug example/demo-platform >/dev/null
16
+ profile_notes_real="$(cd "$profile_home/demo" && pwd -P)/README.md"
17
+
18
+ output="$(
19
+ ACP_PROFILE_REGISTRY_ROOT="$profile_home" \
20
+ AGENT_PROJECT_ID="alpha" \
21
+ ACP_PROJECT_ID="demo" \
22
+ bash "$SCRIPT"
23
+ )"
24
+
25
+ grep -q "^CONFIG_YAML=${profile_home}/demo/control-plane.yaml$" <<<"$output"
26
+ grep -q '^PROFILE_ID=demo$' <<<"$output"
27
+ grep -q '^PROFILE_SELECTION_MODE=explicit$' <<<"$output"
28
+ grep -q "^PROFILE_NOTES=${profile_notes_real}$" <<<"$output"
29
+ grep -q '^PROFILE_NOTES_EXISTS=yes$' <<<"$output"
30
+ grep -Eq '^AVAILABLE_PROFILES=(demo,alpha|alpha,demo)$' <<<"$output"
31
+ grep -q '^EFFECTIVE_CODING_WORKER=openclaw$' <<<"$output"
32
+ grep -q '^EFFECTIVE_PROVIDER_QUOTA_COOLDOWNS=300,900,1800,3600$' <<<"$output"
33
+ grep -q '^EFFECTIVE_OPENCLAW_MODEL=openrouter/stepfun/step-3.5-flash:free$' <<<"$output"
34
+ grep -q '^EFFECTIVE_AGENT_REPO_ROOT=/tmp/agent-control-plane-demo/repo$' <<<"$output"
35
+
36
+ echo "render flow config demo profile test passed"
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SCRIPT="${FLOW_ROOT}/tools/bin/render-flow-config.sh"
6
+
7
+ tmpdir="$(mktemp -d)"
8
+ trap 'rm -rf "$tmpdir"' EXIT
9
+
10
+ profile_home="$tmpdir/profiles"
11
+ profile_dir="$profile_home/demo"
12
+ state_root="$tmpdir/runtime/demo/state"
13
+ mkdir -p "$profile_dir" "$state_root/retries/providers"
14
+
15
+ cat >"$profile_dir/control-plane.yaml" <<EOF
16
+ id: "demo"
17
+ repo:
18
+ slug: "example/demo"
19
+ root: "${tmpdir}/repo"
20
+ runtime:
21
+ orchestrator_agent_root: "${tmpdir}/runtime/demo"
22
+ agent_repo_root: "${tmpdir}/repo"
23
+ worktree_root: "${tmpdir}/worktrees"
24
+ runs_root: "${tmpdir}/runtime/demo/runs"
25
+ state_root: "${state_root}"
26
+ session_naming:
27
+ issue_prefix: "demo-issue-"
28
+ pr_prefix: "demo-pr-"
29
+ issue_branch_prefix: "agent/demo/issue"
30
+ pr_worktree_branch_prefix: "agent/demo/pr"
31
+ execution:
32
+ coding_worker: "openclaw"
33
+ provider_quota:
34
+ cooldowns: "300,900"
35
+ provider_pool_order: "primary fallback"
36
+ provider_pools:
37
+ primary:
38
+ coding_worker: "openclaw"
39
+ openclaw:
40
+ model: "primary/model"
41
+ thinking: "adaptive"
42
+ timeout_seconds: 321
43
+ fallback:
44
+ coding_worker: "claude"
45
+ claude:
46
+ model: "fallback-sonnet"
47
+ permission_mode: "dontAsk"
48
+ effort: "high"
49
+ timeout_seconds: 777
50
+ max_attempts: 5
51
+ retry_backoff_seconds: 12
52
+ EOF
53
+
54
+ printf '# demo\n' >"$profile_dir/README.md"
55
+
56
+ future_epoch=$(( $(date +%s) + 3600 ))
57
+ cat >"$state_root/retries/providers/openclaw-primary-model.env" <<EOF
58
+ ATTEMPTS=1
59
+ NEXT_ATTEMPT_EPOCH=${future_epoch}
60
+ NEXT_ATTEMPT_AT=2099-01-01T00:00:00Z
61
+ LAST_REASON=provider-quota-limit
62
+ UPDATED_AT=2099-01-01T00:00:00Z
63
+ EOF
64
+
65
+ output="$(
66
+ ACP_PROFILE_REGISTRY_ROOT="$profile_home" \
67
+ ACP_PROJECT_ID="demo" \
68
+ bash "$SCRIPT"
69
+ )"
70
+
71
+ grep -q '^PROFILE_ID=demo$' <<<"$output"
72
+ grep -q '^EFFECTIVE_PROVIDER_POOL_ORDER=primary fallback$' <<<"$output"
73
+ grep -q '^EFFECTIVE_PROVIDER_POOL_NAME=fallback$' <<<"$output"
74
+ grep -q '^EFFECTIVE_PROVIDER_POOL_BACKEND=claude$' <<<"$output"
75
+ grep -q '^EFFECTIVE_PROVIDER_POOL_MODEL=fallback-sonnet$' <<<"$output"
76
+ grep -q '^EFFECTIVE_PROVIDER_POOLS_EXHAUSTED=no$' <<<"$output"
77
+ grep -q '^EFFECTIVE_PROVIDER_POOL_SELECTION_REASON=ready$' <<<"$output"
78
+ grep -q '^EFFECTIVE_CODING_WORKER=claude$' <<<"$output"
79
+ grep -q '^EFFECTIVE_CLAUDE_MODEL=fallback-sonnet$' <<<"$output"
80
+
81
+ echo "render flow config provider pool fallback test passed"
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SCRIPT="${FLOW_ROOT}/tools/bin/render-flow-config.sh"
6
+ SCAFFOLD_SCRIPT="${FLOW_ROOT}/tools/bin/scaffold-profile.sh"
7
+
8
+ tmpdir="$(mktemp -d)"
9
+ trap 'rm -rf "$tmpdir"' EXIT
10
+
11
+ profile_home="$tmpdir/profiles"
12
+ repo_slug="example-owner/alpha"
13
+
14
+ bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id alpha --repo-slug "$repo_slug" >/dev/null
15
+ bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id demo --repo-slug example/demo-platform >/dev/null
16
+ profile_notes_real="$(cd "$profile_home/alpha" && pwd -P)/README.md"
17
+
18
+ output="$(
19
+ ACP_PROFILE_REGISTRY_ROOT="$profile_home" \
20
+ ACP_AGENT_REPO_ROOT="/tmp/agent-repo" \
21
+ ACP_CODING_WORKER="codex" \
22
+ ACP_CLAUDE_MODEL="sonnet" \
23
+ ACP_CLAUDE_PERMISSION_MODE="dontAsk" \
24
+ ACP_CLAUDE_EFFORT="high" \
25
+ ACP_CLAUDE_TIMEOUT_SECONDS="777" \
26
+ ACP_CLAUDE_MAX_ATTEMPTS="5" \
27
+ ACP_CLAUDE_RETRY_BACKOFF_SECONDS="12" \
28
+ ACP_OPENCLAW_MODEL="override/model" \
29
+ bash "$SCRIPT"
30
+ )"
31
+
32
+ grep -q '^FLOW_SKILL_DIR=' <<<"$output"
33
+ grep -q "^CONFIG_YAML=${profile_home}/alpha/control-plane.yaml$" <<<"$output"
34
+ grep -q '^PROFILE_ID=alpha$' <<<"$output"
35
+ grep -q '^PROFILE_NOTES_EXISTS=yes$' <<<"$output"
36
+ grep -q "^PROFILE_NOTES=${profile_notes_real}$" <<<"$output"
37
+ grep -q '^PROFILE_SELECTION_HINT=Set ACP_PROJECT_ID=<id> or AGENT_PROJECT_ID=<id> when multiple available profiles exist\.$' <<<"$output"
38
+ grep -q '^PROFILE_SELECTION_MODE=implicit-default$' <<<"$output"
39
+ grep -q '^EFFECTIVE_AGENT_REPO_ROOT=/tmp/agent-repo$' <<<"$output"
40
+ grep -q '^EFFECTIVE_CODING_WORKER=codex$' <<<"$output"
41
+ grep -q '^EFFECTIVE_PROVIDER_QUOTA_COOLDOWNS=300,900,1800,3600$' <<<"$output"
42
+ grep -q '^EFFECTIVE_CODEX_PROFILE_SAFE=alpha_safe$' <<<"$output"
43
+ grep -q '^EFFECTIVE_CODEX_PROFILE_BYPASS=alpha_bypass$' <<<"$output"
44
+ grep -q '^EFFECTIVE_CLAUDE_MODEL=sonnet$' <<<"$output"
45
+ grep -q '^EFFECTIVE_CLAUDE_PERMISSION_MODE=dontAsk$' <<<"$output"
46
+ grep -q '^EFFECTIVE_CLAUDE_EFFORT=high$' <<<"$output"
47
+ grep -q '^EFFECTIVE_CLAUDE_TIMEOUT_SECONDS=777$' <<<"$output"
48
+ grep -q '^EFFECTIVE_CLAUDE_MAX_ATTEMPTS=5$' <<<"$output"
49
+ grep -q '^EFFECTIVE_CLAUDE_RETRY_BACKOFF_SECONDS=12$' <<<"$output"
50
+ grep -q '^EFFECTIVE_OPENCLAW_MODEL=override/model$' <<<"$output"
51
+
52
+ echo "render flow config test passed"