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,324 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ TOOL_BIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ SKILL_ROOT="$(cd "${TOOL_BIN_DIR}/../.." && pwd)"
6
+ ROOT_SOURCE_DIR="$(cd "${SKILL_ROOT}/../../.." && pwd)"
7
+ if [[ ! -f "${ROOT_SOURCE_DIR}/tools/bin/agent-project-reconcile-pr-session" ]]; then
8
+ ROOT_SOURCE_DIR="${SKILL_ROOT}"
9
+ fi
10
+ HAS_DISTINCT_ROOT_SOURCE=0
11
+ if [[ "${ROOT_SOURCE_DIR}" != "${SKILL_ROOT}" ]]; then
12
+ HAS_DISTINCT_ROOT_SOURCE=1
13
+ fi
14
+ ROOT_RUNTIME_DIR="${AGENT_PLATFORM_HOME:-${HOME}/.agent-runtime}/runtime-home"
15
+ RUNTIME_SKILL_ROOT="${ROOT_RUNTIME_DIR}/skills/openclaw/agent-control-plane"
16
+ # shellcheck source=/dev/null
17
+ source "${TOOL_BIN_DIR}/flow-config-lib.sh"
18
+ failures=0
19
+
20
+ contains_fixed_string() {
21
+ local pattern="${1:?pattern required}"
22
+ local file="${2:?file required}"
23
+ if command -v rg >/dev/null 2>&1; then
24
+ rg -q --fixed-strings -- "$pattern" "$file"
25
+ else
26
+ grep -F -q -- "$pattern" "$file"
27
+ fi
28
+ }
29
+
30
+ check_contains() {
31
+ local file="${1:?file required}"
32
+ local pattern="${2:?pattern required}"
33
+ local label="${3:?label required}"
34
+ if contains_fixed_string "$pattern" "$file"; then
35
+ printf 'PASS %s\n' "$label"
36
+ else
37
+ printf 'FAIL %s (%s missing in %s)\n' "$label" "$pattern" "$file" >&2
38
+ failures=$((failures + 1))
39
+ fi
40
+ }
41
+
42
+ check_absent() {
43
+ local file="${1:?file required}"
44
+ local pattern="${2:?pattern required}"
45
+ local label="${3:?label required}"
46
+ if contains_fixed_string "$pattern" "$file"; then
47
+ printf 'FAIL %s (%s unexpectedly present in %s)\n' "$label" "$pattern" "$file" >&2
48
+ failures=$((failures + 1))
49
+ else
50
+ printf 'PASS %s\n' "$label"
51
+ fi
52
+ }
53
+
54
+ check_sync_if_present() {
55
+ local source_file="${1:?source file required}"
56
+ local runtime_file="${2:?runtime file required}"
57
+ local label="${3:?label required}"
58
+ if [[ ! -f "$runtime_file" ]]; then
59
+ printf 'SKIP %s (runtime copy missing)\n' "$label"
60
+ return 0
61
+ fi
62
+ if cmp -s "$source_file" "$runtime_file"; then
63
+ printf 'PASS %s\n' "$label"
64
+ else
65
+ printf 'FAIL %s (source/runtime drift)\n' "$label" >&2
66
+ failures=$((failures + 1))
67
+ fi
68
+ }
69
+
70
+ issue_template="${SKILL_ROOT}/tools/templates/issue-prompt-template.md"
71
+ scheduled_issue_template="${SKILL_ROOT}/tools/templates/scheduled-issue-prompt-template.md"
72
+ pr_review_template="${SKILL_ROOT}/tools/templates/pr-review-template.md"
73
+ pr_fix_template="${SKILL_ROOT}/tools/templates/pr-fix-template.md"
74
+ pr_merge_repair_template="${SKILL_ROOT}/tools/templates/pr-merge-repair-template.md"
75
+ legacy_profile_repo_name="$(printf 'f-%s' 'losning')"
76
+ legacy_profile_repo_slug="$(printf '%s/%s' 'ducminhuyen0319' "${legacy_profile_repo_name}")"
77
+ legacy_profile_package_scope="@${legacy_profile_repo_name}"
78
+ commands_map="${SKILL_ROOT}/references/commands.md"
79
+ skill_doc="${SKILL_ROOT}/SKILL.md"
80
+ issue_reconcile="${SKILL_ROOT}/tools/bin/agent-project-reconcile-issue-session"
81
+ pr_reconcile="${SKILL_ROOT}/tools/bin/agent-project-reconcile-pr-session"
82
+ start_issue_worker="${SKILL_ROOT}/tools/bin/start-issue-worker.sh"
83
+ start_pr_fix_worker="${SKILL_ROOT}/tools/bin/start-pr-fix-worker.sh"
84
+ start_pr_review_worker="${SKILL_ROOT}/tools/bin/start-pr-review-worker.sh"
85
+ run_codex_task="${SKILL_ROOT}/tools/bin/run-codex-task.sh"
86
+ codex_quota_wrapper="${SKILL_ROOT}/tools/bin/codex-quota"
87
+ run_claude_session="${SKILL_ROOT}/tools/bin/agent-project-run-claude-session"
88
+ run_openclaw_session="${SKILL_ROOT}/tools/bin/agent-project-run-openclaw-session"
89
+ run_opencode_session="${SKILL_ROOT}/tools/bin/agent-project-run-opencode-session"
90
+ run_kilo_session="${SKILL_ROOT}/tools/bin/agent-project-run-kilo-session"
91
+ record_verification="${SKILL_ROOT}/tools/bin/record-verification.sh"
92
+ branch_verification_guard="${SKILL_ROOT}/tools/bin/branch-verification-guard.sh"
93
+ workflow_catalog="${SKILL_ROOT}/assets/workflow-catalog.json"
94
+ workflow_catalog_script="${SKILL_ROOT}/tools/bin/workflow-catalog.sh"
95
+ flow_runtime_doctor="${SKILL_ROOT}/tools/bin/flow-runtime-doctor.sh"
96
+ flow_config_lib="${SKILL_ROOT}/tools/bin/flow-config-lib.sh"
97
+ render_flow_config="${SKILL_ROOT}/tools/bin/render-flow-config.sh"
98
+ scaffold_profile="${SKILL_ROOT}/tools/bin/scaffold-profile.sh"
99
+ project_init="${SKILL_ROOT}/tools/bin/project-init.sh"
100
+ project_remove="${SKILL_ROOT}/tools/bin/project-remove.sh"
101
+ profile_smoke="${SKILL_ROOT}/tools/bin/profile-smoke.sh"
102
+ test_smoke="${SKILL_ROOT}/tools/bin/test-smoke.sh"
103
+ profile_adopt="${SKILL_ROOT}/tools/bin/profile-adopt.sh"
104
+ profile_activate="${SKILL_ROOT}/tools/bin/profile-activate.sh"
105
+ project_runtimectl="${SKILL_ROOT}/tools/bin/project-runtimectl.sh"
106
+ project_launchd_bootstrap="${SKILL_ROOT}/tools/bin/project-launchd-bootstrap.sh"
107
+ project_launchd_install="${SKILL_ROOT}/tools/bin/install-project-launchd.sh"
108
+ project_launchd_uninstall="${SKILL_ROOT}/tools/bin/uninstall-project-launchd.sh"
109
+ provider_cooldown_state="${SKILL_ROOT}/tools/bin/provider-cooldown-state.sh"
110
+ dashboard_launchd_bootstrap="${SKILL_ROOT}/tools/bin/dashboard-launchd-bootstrap.sh"
111
+ dashboard_launchd_install="${SKILL_ROOT}/tools/bin/install-dashboard-launchd.sh"
112
+ compat_skill_alias="$(flow_compat_skill_alias)"
113
+ root_pr_reconcile="${ROOT_SOURCE_DIR}/tools/bin/agent-project-reconcile-pr-session"
114
+ root_issue_reconcile="${ROOT_SOURCE_DIR}/tools/bin/agent-project-reconcile-issue-session"
115
+
116
+ check_contains "$issue_template" "ACTION=host-comment-blocker" "core issue template blocked action"
117
+ check_contains "$issue_template" "OUTCOME=implemented" "core issue template success outcome"
118
+ check_contains "$issue_template" "ACTION=host-publish-issue-pr" "core issue template success action"
119
+ check_contains "$issue_template" "{ISSUE_RECURRING_CONTEXT}" "core issue template recurring context placeholder"
120
+ check_contains "$issue_template" "record-verification.sh" "core issue template verification journal guidance"
121
+ check_contains "$issue_template" "verification.jsonl" "core issue template verification journal contract"
122
+ check_contains "$issue_template" "Superseded by focused follow-up issues:" "core issue template umbrella supersede marker"
123
+ check_contains "$issue_template" "create-follow-up-issue.sh" "core issue template follow-up helper guidance"
124
+ check_contains "$issue_template" '`{REPO_SLUG}`' "core issue template repo slug placeholder"
125
+ check_contains "$issue_template" '$ACP_FLOW_TOOLS_DIR' "core issue template canonical tools env"
126
+ check_absent "$issue_template" "${legacy_profile_package_scope}" "core issue template removed bundled package refs"
127
+ check_contains "$scheduled_issue_template" "host-comment-scheduled-report" "core scheduled issue template report action"
128
+ check_contains "$scheduled_issue_template" "host-comment-scheduled-alert" "core scheduled issue template alert action"
129
+ check_contains "$scheduled_issue_template" "not an implementation cycle" "core scheduled issue template check-only guidance"
130
+ check_contains "$scheduled_issue_template" "{ISSUE_BASELINE_HEAD_SHA}" "core scheduled issue template fixed baseline sha guidance"
131
+ check_contains "$scheduled_issue_template" '`{REPO_SLUG}`' "core scheduled issue template repo slug placeholder"
132
+ check_absent "$scheduled_issue_template" "${legacy_profile_repo_slug}" "core scheduled issue template removed bundled repo slug"
133
+ check_contains "$pr_review_template" "ACTION=host-advance-double-check-2" "core review template stage-1 action"
134
+ check_contains "$pr_review_template" "ACTION=host-approve-and-merge" "core review template merge action"
135
+ check_contains "$pr_review_template" "ACTION=host-await-human-review" "core review template human-review action"
136
+ check_contains "$pr_review_template" '`{REPO_SLUG}`' "core review template repo slug placeholder"
137
+ check_absent "$pr_review_template" "${legacy_profile_package_scope}" "core review template removed bundled package refs"
138
+ check_contains "$pr_fix_template" "did not run Git commit/push commands yourself" "core fix template host-owned git contract"
139
+ check_contains "$pr_fix_template" "record-verification.sh" "core fix template verification journal guidance"
140
+ check_contains "$pr_fix_template" "verification.jsonl" "core fix template verification journal contract"
141
+ check_contains "$pr_fix_template" "Required targeted verification coverage before" "core fix template targeted verification section"
142
+ check_contains "$pr_fix_template" '`{REPO_SLUG}`' "core fix template repo slug placeholder"
143
+ check_absent "$pr_fix_template" "If you fixed the branch and committed locally" "core fix template removed local-commit wording"
144
+ check_contains "$pr_merge_repair_template" "record-verification.sh" "core merge-repair template verification journal guidance"
145
+ check_contains "$pr_merge_repair_template" "verification.jsonl" "core merge-repair template verification journal contract"
146
+ check_contains "$pr_merge_repair_template" '`{REPO_SLUG}`' "core merge-repair template repo slug placeholder"
147
+ check_contains "$commands_map" "## Dependency bootstrap" "commands map bootstrap section"
148
+ check_contains "$commands_map" "## Flow maintenance" "commands map flow maintenance section"
149
+ check_contains "$commands_map" "~/.agent-runtime/control-plane/profiles/<id>/README.md" "commands map profile readme note"
150
+ check_contains "$skill_doc" "openspec/CONVENTIONS.md" "skill startup reads conventions"
151
+ check_contains "$skill_doc" "~/.agent-runtime/control-plane/profiles/<id>/README.md" "skill profile readme routing"
152
+ check_contains "$skill_doc" "agent-control-plane" "skill doc control plane rename"
153
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "assets/workflow-catalog.json" "control plane map workflow catalog"
154
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "flow-runtime-doctor.sh" "control plane map runtime doctor"
155
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "render-flow-config.sh" "control plane map render flow config"
156
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "project-init.sh" "control plane map project init"
157
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "scaffold-profile.sh" "control plane map scaffold profile"
158
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "project-runtimectl.sh" "control plane map project runtimectl"
159
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "project-launchd-bootstrap.sh" "control plane map project launchd bootstrap"
160
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "install-project-launchd.sh" "control plane map project launchd install"
161
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "uninstall-project-launchd.sh" "control plane map project launchd uninstall"
162
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "project-remove.sh" "control plane map project remove"
163
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "profile-smoke.sh" "control plane map profile smoke"
164
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "test-smoke.sh" "control plane map test smoke"
165
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "profile-adopt.sh" "control plane map profile adopt"
166
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "~/.agent-runtime/control-plane/profiles/<id>/control-plane.yaml" "control plane map canonical profile"
167
+ check_contains "${SKILL_ROOT}/references/control-plane-map.md" "~/.agent-runtime/control-plane/profiles/<id>/README.md" "control plane map profile notes"
168
+ check_contains "$issue_reconcile" "host-comment-blocker" "issue reconcile blocked contract"
169
+ check_contains "$issue_reconcile" "implemented:host-publish-issue-pr" "issue reconcile success contract"
170
+ check_contains "$issue_reconcile" "closed-superseded" "issue reconcile umbrella supersede contract"
171
+ check_contains "$issue_reconcile" "reported:host-comment-scheduled-report" "issue reconcile scheduled report contract"
172
+ check_contains "$issue_reconcile" "reported:host-comment-scheduled-alert" "issue reconcile scheduled alert contract"
173
+ check_contains "$pr_reconcile" "host-advance-double-check-2" "pr reconcile stage-1 contract"
174
+ check_contains "$pr_reconcile" "host-await-human-review" "pr reconcile human-review contract"
175
+ check_contains "$pr_reconcile" "host-verification-guard-blocked" "pr reconcile verification-guard blocked contract"
176
+ check_contains "$start_issue_worker" "Opened PR #" "start issue worker parses recurring PR history"
177
+ check_contains "$start_issue_worker" "Target:" "start issue worker recurring target guidance"
178
+ check_contains "$start_issue_worker" "Blocked on missing referenced OpenSpec paths for issue #" "start issue worker missing-openspec guard"
179
+ check_contains "$start_issue_worker" "scheduled-issue-prompt-template.md" "start issue worker scheduled template switch"
180
+ check_contains "$start_issue_worker" "ISSUE_BASELINE_HEAD_SHA" "start issue worker baseline sha prompt context"
181
+ check_contains "$start_issue_worker" "flow_resolve_template_file" "start issue worker template resolver"
182
+ check_contains "$start_pr_fix_worker" "flow_resolve_template_file" "start pr fix worker template resolver"
183
+ check_contains "$start_pr_fix_worker" "flow_resolve_web_playwright_command" "start pr fix worker playwright command resolver"
184
+ check_contains "$start_pr_review_worker" "flow_resolve_template_file" "start pr review worker template resolver"
185
+ check_contains "$start_issue_worker" "Blocked retries so far:" "start issue worker blocked retry context"
186
+ check_absent "$pr_reconcile" "legacy-empty-result-contract" "pr reconcile removed empty-result compatibility"
187
+ if (( HAS_DISTINCT_ROOT_SOURCE )); then
188
+ check_contains "$root_pr_reconcile" "host-advance-double-check-2" "root pr reconcile stage-1 contract"
189
+ check_contains "$root_issue_reconcile" "host-comment-blocker" "root issue reconcile blocked contract"
190
+ check_contains "$root_issue_reconcile" "implemented:host-publish-issue-pr" "root issue reconcile success contract"
191
+ check_absent "$root_pr_reconcile" "legacy-empty-result-contract" "root pr reconcile removed empty-result compatibility"
192
+ fi
193
+ check_contains "$run_codex_task" "--collect-file \"verification.jsonl\"" "run task collects verification journal"
194
+ check_contains "$run_codex_task" "FLOW_TOOLS_DIR" "run task exports flow tools dir"
195
+ check_contains "$issue_template" '`{REPO_SLUG}`' "issue template repo slug placeholder"
196
+ check_contains "$issue_template" '$ACP_FLOW_TOOLS_DIR' "issue template canonical tools env"
197
+ check_contains "$pr_fix_template" '`{REPO_SLUG}`' "fix template repo slug placeholder"
198
+ check_contains "$pr_review_template" '`{REPO_SLUG}`' "review template repo slug placeholder"
199
+ check_contains "$pr_merge_repair_template" '`{REPO_SLUG}`' "merge-repair template repo slug placeholder"
200
+ check_contains "$run_codex_task" "agent-project-run-openclaw-session" "run task openclaw dispatch"
201
+ check_contains "$run_codex_task" "agent-project-run-claude-session" "run task claude dispatch"
202
+ check_contains "$run_codex_task" "agent-project-run-opencode-session" "run task opencode dispatch"
203
+ check_contains "$run_codex_task" "agent-project-run-kilo-session" "run task kilo dispatch"
204
+ check_contains "$codex_quota_wrapper" "vendor/codex-quota/codex-quota.js" "codex quota wrapper vendored entrypoint"
205
+ check_contains "$run_claude_session" "install_pre_commit_scope_hook" "claude session installs pre-commit scope hook"
206
+ check_contains "$run_claude_session" "run_with_timeout" "claude session timeout helper"
207
+ check_contains "$run_openclaw_session" "OPENCLAW_CONFIG_PATH" "openclaw session isolated config contract"
208
+ check_contains "$run_openclaw_session" "SOUL.md" "openclaw session ignore bootstrap files"
209
+ check_contains "$run_opencode_session" "execution is not implemented yet" "opencode placeholder adapter contract"
210
+ check_contains "$run_kilo_session" "execution is not implemented yet" "kilo placeholder adapter contract"
211
+ check_contains "$flow_config_lib" "flow_export_execution_env" "flow config lib exports execution env"
212
+ check_contains "$flow_config_lib" "flow_resolve_provider_quota_cooldowns" "flow config lib provider quota cooldown resolver"
213
+ check_contains "$flow_config_lib" "flow_selected_provider_pool_env" "flow config lib provider pool selection helper"
214
+ check_contains "$flow_config_lib" "flow_resolve_codex_quota_bin" "flow config lib codex quota bin resolver"
215
+ check_contains "$flow_config_lib" "flow_resolve_codex_quota_manager_script" "flow config lib codex quota manager resolver"
216
+ check_contains "$render_flow_config" "EFFECTIVE_CODING_WORKER=" "render flow config coding worker output"
217
+ check_contains "$render_flow_config" "EFFECTIVE_PROVIDER_QUOTA_COOLDOWNS=" "render flow config provider quota cooldown output"
218
+ check_contains "$render_flow_config" "EFFECTIVE_PROVIDER_POOL_NAME=" "render flow config active provider pool output"
219
+ check_contains "$render_flow_config" "EFFECTIVE_AGENT_REPO_ROOT=" "render flow config agent repo output"
220
+ check_contains "$render_flow_config" "PROFILE_ID=" "render flow config profile id output"
221
+ check_contains "$render_flow_config" "PROFILE_REGISTRY_ROOT=" "render flow config profile registry output"
222
+ check_contains "$render_flow_config" "PROFILE_SELECTION_MODE=" "render flow config selection mode output"
223
+ check_contains "$render_flow_config" "PROFILE_NOTES=" "render flow config profile notes output"
224
+ check_contains "$commands_map" "tools/bin/workflow-catalog.sh context" "commands map workflow catalog context command"
225
+ check_contains "$commands_map" "tools/bin/profile-activate.sh --profile-id <id>" "commands map profile activate command"
226
+ check_contains "$commands_map" "tools/bin/project-init.sh --profile-id <id> --repo-slug <owner/repo>" "commands map project init command"
227
+ check_contains "$commands_map" "tools/bin/scaffold-profile.sh" "commands map scaffold profile command"
228
+ check_contains "$commands_map" "tools/bin/profile-smoke.sh" "commands map profile smoke command"
229
+ check_contains "$commands_map" "tools/bin/test-smoke.sh" "commands map test smoke command"
230
+ check_contains "$commands_map" "tools/bin/profile-adopt.sh" "commands map profile adopt command"
231
+ check_contains "$commands_map" "tools/bin/project-runtimectl.sh status --profile-id <id>" "commands map project runtimectl status command"
232
+ check_contains "$commands_map" "tools/bin/project-remove.sh --profile-id <id>" "commands map project remove command"
233
+ check_contains "$commands_map" "tools/bin/install-project-launchd.sh --profile-id <id>" "commands map project launchd install command"
234
+ check_contains "$commands_map" "tools/bin/uninstall-project-launchd.sh --profile-id <id>" "commands map project launchd uninstall command"
235
+ check_contains "$commands_map" "tools/bin/install-dashboard-launchd.sh" "commands map dashboard launchd install command"
236
+ check_contains "$commands_map" "~/.agent-runtime/control-plane/profiles/<id>/templates/" "commands map profile templates note"
237
+ check_contains "$project_init" "PROJECT_INIT_STATUS=ok" "project init status output"
238
+ check_contains "$project_remove" "PROJECT_REMOVE_STATUS=ok" "project remove status output"
239
+ check_contains "$scaffold_profile" "PROFILE_YAML=" "scaffold profile output"
240
+ check_contains "$profile_smoke" "PROFILE_SMOKE_STATUS" "profile smoke status output"
241
+ check_contains "$test_smoke" "SMOKE_TEST_STATUS" "test smoke status output"
242
+ check_contains "$profile_adopt" "ADOPT_STATUS" "profile adopt status output"
243
+ check_contains "$profile_activate" "PROFILE_ID=" "profile activate profile output"
244
+ check_contains "$profile_activate" "export ACP_PROJECT_ID=" "profile activate exports output"
245
+ check_contains "$project_runtimectl" "ACTION=start" "project runtimectl start output"
246
+ check_contains "$project_runtimectl" "ACTION=stop" "project runtimectl stop output"
247
+ check_contains "$project_runtimectl" "RUNTIME_STATUS=" "project runtimectl status output"
248
+ check_contains "$project_launchd_bootstrap" "heartbeat-safe-auto.sh" "project launchd bootstrap heartbeat contract"
249
+ check_contains "$project_launchd_bootstrap" "sync-shared-agent-home.sh" "project launchd bootstrap sync contract"
250
+ check_contains "$project_launchd_install" "project-runtime-supervisor.sh" "project launchd install supervisor contract"
251
+ check_contains "$project_launchd_install" "launchctl bootstrap" "project launchd install bootstrap command"
252
+ check_contains "$project_launchd_uninstall" "launchctl bootout" "project launchd uninstall bootout command"
253
+ check_contains "$workflow_catalog_script" "assets/workflow-catalog.json" "workflow catalog script reads catalog file"
254
+ check_contains "$workflow_catalog_script" 'if command == "context":' "workflow catalog context command"
255
+ check_contains "$flow_runtime_doctor" "DOCTOR_STATUS" "runtime doctor status output"
256
+ check_contains "$flow_runtime_doctor" "PROFILE_REGISTRY_ROOT" "runtime doctor profile registry output"
257
+ check_contains "$flow_runtime_doctor" "PROFILE_SELECTION_MODE" "runtime doctor selection mode output"
258
+ check_contains "$flow_runtime_doctor" "PROFILE_NOTES" "runtime doctor profile notes output"
259
+ check_contains "$flow_runtime_doctor" "NEXT_STEP=" "runtime doctor next step output"
260
+ check_contains "$flow_runtime_doctor" "CONTROL_PLANE_NAME" "runtime doctor canonical name output"
261
+ check_contains "$dashboard_launchd_bootstrap" "sync-shared-agent-home.sh" "dashboard launchd bootstrap sync runtime contract"
262
+ check_contains "$dashboard_launchd_bootstrap" "serve-dashboard.sh" "dashboard launchd bootstrap serve contract"
263
+ check_contains "$dashboard_launchd_install" "launchctl bootstrap" "dashboard launchd install bootstrap command"
264
+ check_contains "$dashboard_launchd_install" "<key>KeepAlive</key>" "dashboard launchd install keepalive contract"
265
+ check_absent "$skill_doc" 'repo-local `profiles/<id>/`' "skill doc removed repo-bundled profiles"
266
+ check_absent "$commands_map" 'bundled `profiles/<id>/templates/`' "commands map removed bundled profile templates"
267
+ check_absent "${SKILL_ROOT}/references/control-plane-map.md" 'bundled `profiles/<id>/`' "control plane map removed bundled profiles"
268
+ check_absent "${SKILL_ROOT}/references/repo-map.md" '- `profiles/`' "repo map removed bundled profiles dir"
269
+ check_absent "${SKILL_ROOT}/references/docs-map.md" "Bundled seed/fallback profiles" "docs map removed repo-bundled profiles"
270
+
271
+ if [[ -n "${compat_skill_alias}" ]]; then
272
+ check_absent "$pr_reconcile" "skills/openclaw/${compat_skill_alias}" "skill pr reconcile removed old package fallback"
273
+ if (( HAS_DISTINCT_ROOT_SOURCE )); then
274
+ check_absent "$root_pr_reconcile" "skills/openclaw/${compat_skill_alias}" "root pr reconcile removed old package fallback"
275
+ fi
276
+ fi
277
+
278
+ check_sync_if_present "$issue_template" "${RUNTIME_SKILL_ROOT}/tools/templates/issue-prompt-template.md" "core issue template source/runtime sync"
279
+ check_sync_if_present "$scheduled_issue_template" "${RUNTIME_SKILL_ROOT}/tools/templates/scheduled-issue-prompt-template.md" "core scheduled issue template source/runtime sync"
280
+ check_sync_if_present "$pr_review_template" "${RUNTIME_SKILL_ROOT}/tools/templates/pr-review-template.md" "core review template source/runtime sync"
281
+ check_sync_if_present "$pr_fix_template" "${RUNTIME_SKILL_ROOT}/tools/templates/pr-fix-template.md" "core fix template source/runtime sync"
282
+ check_sync_if_present "$pr_merge_repair_template" "${RUNTIME_SKILL_ROOT}/tools/templates/pr-merge-repair-template.md" "core merge-repair template source/runtime sync"
283
+ check_sync_if_present "$commands_map" "${RUNTIME_SKILL_ROOT}/references/commands.md" "commands map source/runtime sync"
284
+ check_sync_if_present "$pr_reconcile" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-reconcile-pr-session" "skill pr reconcile source/runtime sync"
285
+ check_sync_if_present "$issue_reconcile" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-reconcile-issue-session" "skill issue reconcile source/runtime sync"
286
+ check_sync_if_present "$start_issue_worker" "${RUNTIME_SKILL_ROOT}/tools/bin/start-issue-worker.sh" "start issue worker source/runtime sync"
287
+ check_sync_if_present "$run_codex_task" "${RUNTIME_SKILL_ROOT}/tools/bin/run-codex-task.sh" "run task source/runtime sync"
288
+ check_sync_if_present "$codex_quota_wrapper" "${RUNTIME_SKILL_ROOT}/tools/bin/codex-quota" "codex quota wrapper source/runtime sync"
289
+ check_sync_if_present "$run_claude_session" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-run-claude-session" "claude session source/runtime sync"
290
+ check_sync_if_present "$run_openclaw_session" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-run-openclaw-session" "openclaw session source/runtime sync"
291
+ check_sync_if_present "$run_opencode_session" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-run-opencode-session" "opencode session source/runtime sync"
292
+ check_sync_if_present "$run_kilo_session" "${RUNTIME_SKILL_ROOT}/tools/bin/agent-project-run-kilo-session" "kilo session source/runtime sync"
293
+ check_sync_if_present "$record_verification" "${RUNTIME_SKILL_ROOT}/tools/bin/record-verification.sh" "record verification source/runtime sync"
294
+ check_sync_if_present "$branch_verification_guard" "${RUNTIME_SKILL_ROOT}/tools/bin/branch-verification-guard.sh" "branch verification guard source/runtime sync"
295
+ check_sync_if_present "$flow_config_lib" "${RUNTIME_SKILL_ROOT}/tools/bin/flow-config-lib.sh" "flow config lib source/runtime sync"
296
+ check_sync_if_present "$render_flow_config" "${RUNTIME_SKILL_ROOT}/tools/bin/render-flow-config.sh" "render flow config source/runtime sync"
297
+ check_sync_if_present "$provider_cooldown_state" "${RUNTIME_SKILL_ROOT}/tools/bin/provider-cooldown-state.sh" "provider cooldown state source/runtime sync"
298
+ check_sync_if_present "$project_init" "${RUNTIME_SKILL_ROOT}/tools/bin/project-init.sh" "project init source/runtime sync"
299
+ check_sync_if_present "$project_remove" "${RUNTIME_SKILL_ROOT}/tools/bin/project-remove.sh" "project remove source/runtime sync"
300
+ check_sync_if_present "$project_launchd_bootstrap" "${RUNTIME_SKILL_ROOT}/tools/bin/project-launchd-bootstrap.sh" "project launchd bootstrap source/runtime sync"
301
+ check_sync_if_present "$project_launchd_install" "${RUNTIME_SKILL_ROOT}/tools/bin/install-project-launchd.sh" "project launchd install source/runtime sync"
302
+ check_sync_if_present "$project_launchd_uninstall" "${RUNTIME_SKILL_ROOT}/tools/bin/uninstall-project-launchd.sh" "project launchd uninstall source/runtime sync"
303
+ check_sync_if_present "$scaffold_profile" "${RUNTIME_SKILL_ROOT}/tools/bin/scaffold-profile.sh" "scaffold profile source/runtime sync"
304
+ check_sync_if_present "$profile_smoke" "${RUNTIME_SKILL_ROOT}/tools/bin/profile-smoke.sh" "profile smoke source/runtime sync"
305
+ check_sync_if_present "$test_smoke" "${RUNTIME_SKILL_ROOT}/tools/bin/test-smoke.sh" "test smoke source/runtime sync"
306
+ check_sync_if_present "$profile_adopt" "${RUNTIME_SKILL_ROOT}/tools/bin/profile-adopt.sh" "profile adopt source/runtime sync"
307
+ check_sync_if_present "$profile_activate" "${RUNTIME_SKILL_ROOT}/tools/bin/profile-activate.sh" "profile activate source/runtime sync"
308
+ check_sync_if_present "$project_runtimectl" "${RUNTIME_SKILL_ROOT}/tools/bin/project-runtimectl.sh" "project runtimectl source/runtime sync"
309
+ check_sync_if_present "$dashboard_launchd_bootstrap" "${RUNTIME_SKILL_ROOT}/tools/bin/dashboard-launchd-bootstrap.sh" "dashboard launchd bootstrap source/runtime sync"
310
+ check_sync_if_present "$dashboard_launchd_install" "${RUNTIME_SKILL_ROOT}/tools/bin/install-dashboard-launchd.sh" "dashboard launchd install source/runtime sync"
311
+ check_sync_if_present "$workflow_catalog" "${RUNTIME_SKILL_ROOT}/assets/workflow-catalog.json" "workflow catalog source/runtime sync"
312
+ check_sync_if_present "$workflow_catalog_script" "${RUNTIME_SKILL_ROOT}/tools/bin/workflow-catalog.sh" "workflow catalog script source/runtime sync"
313
+ check_sync_if_present "$flow_runtime_doctor" "${RUNTIME_SKILL_ROOT}/tools/bin/flow-runtime-doctor.sh" "runtime doctor source/runtime sync"
314
+ if (( HAS_DISTINCT_ROOT_SOURCE )); then
315
+ check_sync_if_present "$root_pr_reconcile" "${ROOT_RUNTIME_DIR}/tools/bin/agent-project-reconcile-pr-session" "root pr reconcile source/runtime sync"
316
+ check_sync_if_present "$root_issue_reconcile" "${ROOT_RUNTIME_DIR}/tools/bin/agent-project-reconcile-issue-session" "root issue reconcile source/runtime sync"
317
+ fi
318
+
319
+ if (( failures > 0 )); then
320
+ printf 'CHECK_STATUS=failed\n'
321
+ exit 1
322
+ fi
323
+
324
+ printf 'CHECK_STATUS=ok\n'
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ # shellcheck source=/dev/null
6
+ source "${SCRIPT_DIR}/flow-config-lib.sh"
7
+
8
+ FLOW_SKILL_DIR="$(resolve_flow_skill_dir "${BASH_SOURCE[0]}")"
9
+ FLOW_TOOLS_DIR="${FLOW_SKILL_DIR}/tools/bin"
10
+ CONFIG_YAML="$(resolve_flow_config_yaml "${BASH_SOURCE[0]}")"
11
+ AGENT_REPO_ROOT="$(flow_resolve_agent_repo_root "${CONFIG_YAML}")"
12
+ AGENT_ROOT="$(flow_resolve_agent_root "${CONFIG_YAML}")"
13
+ RUNS_ROOT="$(flow_resolve_runs_root "${CONFIG_YAML}")"
14
+ HISTORY_ROOT="$(flow_resolve_history_root "${CONFIG_YAML}")"
15
+ RETAINED_REPO_ROOT="$(flow_resolve_retained_repo_root "${CONFIG_YAML}")"
16
+ VSCODE_WORKSPACE_FILE="$(flow_resolve_vscode_workspace_file "${CONFIG_YAML}")"
17
+ ISSUE_SESSION_PREFIX="$(flow_resolve_issue_session_prefix "${CONFIG_YAML}")"
18
+ PR_SESSION_PREFIX="$(flow_resolve_pr_session_prefix "${CONFIG_YAML}")"
19
+ WORKTREE="${1-}"
20
+ SESSION="${2:-}"
21
+ MODE="generic"
22
+ ARGS=(
23
+ --repo-root "$AGENT_REPO_ROOT"
24
+ --runs-root "$RUNS_ROOT"
25
+ --history-root "$HISTORY_ROOT"
26
+ --worktree "${WORKTREE:-}"
27
+ )
28
+
29
+ case "$SESSION" in
30
+ "${ISSUE_SESSION_PREFIX}"*) MODE="issue" ;;
31
+ "${PR_SESSION_PREFIX}"*) MODE="pr" ;;
32
+ esac
33
+
34
+ ARGS+=(--mode "$MODE")
35
+ if [[ -n "$SESSION" ]]; then
36
+ ARGS+=(--session "$SESSION")
37
+ fi
38
+
39
+ bash "${FLOW_TOOLS_DIR}/agent-project-cleanup-session" "${ARGS[@]}" >/dev/null
40
+
41
+ F_LOSNING_AGENT_REPO_ROOT="$AGENT_REPO_ROOT" \
42
+ F_LOSNING_RETAINED_REPO_ROOT="$RETAINED_REPO_ROOT" \
43
+ F_LOSNING_VSCODE_WORKSPACE_FILE="$VSCODE_WORKSPACE_FILE" \
44
+ "${FLOW_TOOLS_DIR}/sync-vscode-workspace.sh" >/dev/null 2>&1 || true
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ QUOTA_ENTRY="${SCRIPT_DIR}/../vendor/codex-quota/codex-quota.js"
6
+ NODE_BIN="${ACP_CODEX_QUOTA_NODE_BIN:-${F_LOSNING_CODEX_QUOTA_NODE_BIN:-}}"
7
+
8
+ if [[ -z "${NODE_BIN}" ]]; then
9
+ NODE_BIN="$(command -v node 2>/dev/null || true)"
10
+ fi
11
+
12
+ if [[ -z "${NODE_BIN}" ]]; then
13
+ export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
14
+ if [[ -s "${NVM_DIR}/nvm.sh" ]]; then
15
+ # shellcheck source=/dev/null
16
+ . "${NVM_DIR}/nvm.sh"
17
+ NODE_BIN="$(command -v node 2>/dev/null || true)"
18
+ fi
19
+ fi
20
+
21
+ if [[ -z "${NODE_BIN}" ]]; then
22
+ echo "node is required to run the bundled codex-quota tool" >&2
23
+ exit 1
24
+ fi
25
+
26
+ if [[ ! -f "${QUOTA_ENTRY}" ]]; then
27
+ echo "bundled codex-quota entrypoint not found: ${QUOTA_ENTRY}" >&2
28
+ exit 1
29
+ fi
30
+
31
+ exec "${NODE_BIN}" "${QUOTA_ENTRY}" "$@"
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ # shellcheck source=/dev/null
6
+ source "${SCRIPT_DIR}/flow-config-lib.sh"
7
+
8
+ usage() {
9
+ cat <<'EOF'
10
+ Usage:
11
+ create-follow-up-issue.sh --parent ISSUE_ID --title "Title" [--body "text" | --body-file path] [--label LABEL ...]
12
+
13
+ Create a focused follow-up issue linked back to the umbrella issue. By default the
14
+ new issue is left unlabeled so the scheduler can pick it up normally.
15
+ EOF
16
+ }
17
+
18
+ FLOW_TOOLS_DIR="${SCRIPT_DIR}"
19
+ CONFIG_YAML="$(resolve_flow_config_yaml "${BASH_SOURCE[0]}")"
20
+ REPO_SLUG="$(flow_resolve_repo_slug "${CONFIG_YAML}")"
21
+ UPDATE_LABELS_BIN="${UPDATE_LABELS_BIN:-${FLOW_TOOLS_DIR}/agent-github-update-labels}"
22
+
23
+ parent_issue=""
24
+ title=""
25
+ body=""
26
+ body_file=""
27
+ labels=()
28
+
29
+ while [[ $# -gt 0 ]]; do
30
+ case "$1" in
31
+ --parent)
32
+ parent_issue="${2:-}"
33
+ shift 2
34
+ ;;
35
+ --title)
36
+ title="${2:-}"
37
+ shift 2
38
+ ;;
39
+ --body)
40
+ body="${2:-}"
41
+ shift 2
42
+ ;;
43
+ --body-file)
44
+ body_file="${2:-}"
45
+ shift 2
46
+ ;;
47
+ --label)
48
+ labels+=("${2:-}")
49
+ shift 2
50
+ ;;
51
+ --help|-h)
52
+ usage
53
+ exit 0
54
+ ;;
55
+ *)
56
+ echo "Unknown argument: $1" >&2
57
+ usage >&2
58
+ exit 1
59
+ ;;
60
+ esac
61
+ done
62
+
63
+ if [[ -z "$parent_issue" || -z "$title" ]]; then
64
+ usage >&2
65
+ exit 1
66
+ fi
67
+
68
+ if [[ -n "$body" && -n "$body_file" ]]; then
69
+ echo "Provide either --body or --body-file, not both." >&2
70
+ exit 1
71
+ fi
72
+
73
+ tmp_body_file="$(mktemp)"
74
+ cleanup() {
75
+ rm -f "$tmp_body_file"
76
+ }
77
+ trap cleanup EXIT
78
+
79
+ {
80
+ printf 'Parent issue: #%s\n\n' "$parent_issue"
81
+ if [[ -n "$body_file" ]]; then
82
+ cat "$body_file"
83
+ elif [[ -n "$body" ]]; then
84
+ printf '%s\n' "$body"
85
+ else
86
+ printf 'Follow-up slice decomposed from umbrella issue #%s.\n' "$parent_issue"
87
+ fi
88
+ } >"$tmp_body_file"
89
+
90
+ issue_url="$(flow_github_issue_create "$REPO_SLUG" "$title" "$tmp_body_file")"
91
+ issue_url="$(printf '%s' "$issue_url" | tail -n 1)"
92
+ issue_number="$(sed -nE 's#.*/issues/([0-9]+)$#\1#p' <<<"$issue_url" | tail -n 1)"
93
+
94
+ if [[ -z "$issue_number" ]]; then
95
+ echo "Unable to determine created issue number from gh output: $issue_url" >&2
96
+ exit 1
97
+ fi
98
+
99
+ if [[ ${#labels[@]} -gt 0 ]]; then
100
+ update_args=()
101
+ for label in "${labels[@]}"; do
102
+ [[ -n "$label" ]] || continue
103
+ update_args+=(--add "$label")
104
+ done
105
+ if [[ ${#update_args[@]} -gt 0 ]]; then
106
+ bash "${UPDATE_LABELS_BIN}" \
107
+ --repo-slug "$REPO_SLUG" \
108
+ --number "$issue_number" \
109
+ "${update_args[@]}" >/dev/null || true
110
+ fi
111
+ fi
112
+
113
+ printf 'ISSUE_NUMBER=%s\n' "$issue_number"
114
+ printf 'ISSUE_URL=%s\n' "$issue_url"
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ FLOW_SKILL_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
6
+ HOME_DIR="${ACP_DASHBOARD_HOME_DIR:-${HOME:-}}"
7
+ SOURCE_HOME="${ACP_DASHBOARD_SOURCE_HOME:-$(cd "${FLOW_SKILL_DIR}/../../.." && pwd)}"
8
+ RUNTIME_HOME="${ACP_DASHBOARD_RUNTIME_HOME:-${HOME_DIR}/.agent-runtime/runtime-home}"
9
+ PROFILE_REGISTRY_ROOT="${ACP_DASHBOARD_PROFILE_REGISTRY_ROOT:-${ACP_PROFILE_REGISTRY_ROOT:-${HOME_DIR}/.agent-runtime/control-plane/profiles}}"
10
+ HOST="${ACP_DASHBOARD_HOST:-127.0.0.1}"
11
+ PORT="${ACP_DASHBOARD_PORT:-8765}"
12
+ BASE_PATH="${ACP_DASHBOARD_PATH:-/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin}"
13
+ SYNC_SCRIPT="${ACP_DASHBOARD_SYNC_SCRIPT:-${FLOW_SKILL_DIR}/tools/bin/sync-shared-agent-home.sh}"
14
+ RUNTIME_SERVE_SCRIPT="${ACP_DASHBOARD_RUNTIME_SERVE_SCRIPT:-${RUNTIME_HOME}/skills/openclaw/agent-control-plane/tools/bin/serve-dashboard.sh}"
15
+
16
+ if [[ -z "${HOME_DIR}" ]]; then
17
+ echo "dashboard launchd bootstrap requires HOME or ACP_DASHBOARD_HOME_DIR" >&2
18
+ exit 64
19
+ fi
20
+
21
+ export HOME="${HOME_DIR}"
22
+ export PATH="${BASE_PATH}"
23
+ export ACP_PROFILE_REGISTRY_ROOT="${PROFILE_REGISTRY_ROOT}"
24
+ export PYTHONDONTWRITEBYTECODE=1
25
+
26
+ if [[ ! -x "${SYNC_SCRIPT}" ]]; then
27
+ echo "dashboard launchd bootstrap missing sync script: ${SYNC_SCRIPT}" >&2
28
+ exit 65
29
+ fi
30
+
31
+ bash "${SYNC_SCRIPT}" "${SOURCE_HOME}" "${RUNTIME_HOME}" >/dev/null
32
+
33
+ if [[ ! -x "${RUNTIME_SERVE_SCRIPT}" ]]; then
34
+ echo "dashboard launchd bootstrap missing runtime serve script: ${RUNTIME_SERVE_SCRIPT}" >&2
35
+ exit 66
36
+ fi
37
+
38
+ exec bash "${RUNTIME_SERVE_SCRIPT}" --host "${HOST}" --port "${PORT}"