agent-control-plane 0.1.1 → 0.1.3

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 (184) hide show
  1. package/README.md +6 -0
  2. package/npm/bin/agent-control-plane.js +149 -5
  3. package/package.json +2 -3
  4. package/tools/vendor/codex-quota/README.md +8 -16
  5. package/tools/vendor/codex-quota/lib/claude-accounts.js +2 -68
  6. package/tools/vendor/codex-quota/lib/claude-usage.js +76 -667
  7. package/tools/vendor/codex-quota/lib/display.js +6 -14
  8. package/tools/vendor/codex-quota/lib/handlers.js +32 -117
  9. package/tools/vendor/codex-quota/lib/sync.js +9 -14
  10. package/tools/tests/test-agent-control-plane-npm-cli.sh +0 -280
  11. package/tools/tests/test-agent-github-update-labels-falls-back-to-repository-id.sh +0 -56
  12. package/tools/tests/test-agent-project-claude-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -89
  13. package/tools/tests/test-agent-project-claude-session-wrapper-does-not-retry-provider-quota.sh +0 -82
  14. package/tools/tests/test-agent-project-claude-session-wrapper-retries-transient-failures.sh +0 -90
  15. package/tools/tests/test-agent-project-claude-session-wrapper-times-out.sh +0 -73
  16. package/tools/tests/test-agent-project-claude-session-wrapper.sh +0 -103
  17. package/tools/tests/test-agent-project-cleanup-session-orphan-fallback.sh +0 -90
  18. package/tools/tests/test-agent-project-cleanup-session-skip-worktree-cleanup.sh +0 -90
  19. package/tools/tests/test-agent-project-codex-live-thread-persist.sh +0 -76
  20. package/tools/tests/test-agent-project-codex-recovery.sh +0 -731
  21. package/tools/tests/test-agent-project-codex-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -105
  22. package/tools/tests/test-agent-project-codex-session-wrapper.sh +0 -97
  23. package/tools/tests/test-agent-project-open-pr-worktree-config-prefix.sh +0 -81
  24. package/tools/tests/test-agent-project-openclaw-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -109
  25. package/tools/tests/test-agent-project-openclaw-session-wrapper-infers-blocked-result-contract.sh +0 -89
  26. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-literal-env-artifacts.sh +0 -113
  27. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-version-mismatch.sh +0 -135
  28. package/tools/tests/test-agent-project-openclaw-session-wrapper-resident.sh +0 -179
  29. package/tools/tests/test-agent-project-openclaw-session-wrapper-reuses-existing-agent-after-add-race.sh +0 -119
  30. package/tools/tests/test-agent-project-openclaw-session-wrapper-terminates-rate-limit-hang.sh +0 -91
  31. package/tools/tests/test-agent-project-openclaw-session-wrapper.sh +0 -117
  32. package/tools/tests/test-agent-project-publish-issue-pr-prunes-stale-worktree-entry.sh +0 -148
  33. package/tools/tests/test-agent-project-publish-issue-pr-reads-archived-session.sh +0 -146
  34. package/tools/tests/test-agent-project-publish-issue-pr-recovers-final-head.sh +0 -145
  35. package/tools/tests/test-agent-project-publish-issue-pr-reuses-existing-worktree.sh +0 -147
  36. package/tools/tests/test-agent-project-reconcile-failure-reason.sh +0 -456
  37. package/tools/tests/test-agent-project-reconcile-issue-archived-session-fallback.sh +0 -96
  38. package/tools/tests/test-agent-project-reconcile-issue-before-blocked.sh +0 -90
  39. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery-uses-recovered-worktree.sh +0 -212
  40. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery.sh +0 -207
  41. package/tools/tests/test-agent-project-reconcile-issue-provider-quota-schedules-provider-cooldown.sh +0 -101
  42. package/tools/tests/test-agent-project-reconcile-issue-session-backfills-lane-metadata-from-worker-key.sh +0 -113
  43. package/tools/tests/test-agent-project-reconcile-issue-session-clears-stale-failed-summary.sh +0 -117
  44. package/tools/tests/test-agent-project-reconcile-issue-session-initializes-shared-agent-home.sh +0 -55
  45. package/tools/tests/test-agent-project-reconcile-issue-session-normalizes-runner-state.sh +0 -125
  46. package/tools/tests/test-agent-project-reconcile-issue-session-records-invalid-contract-summary.sh +0 -118
  47. package/tools/tests/test-agent-project-reconcile-issue-session-skips-duplicate-blocked-comment.sh +0 -144
  48. package/tools/tests/test-agent-project-reconcile-issue-session-standardizes-no-commits-blocker.sh +0 -145
  49. package/tools/tests/test-agent-project-reconcile-issue-session-synthesizes-blocked-comment.sh +0 -139
  50. package/tools/tests/test-agent-project-reconcile-pr-blocked-host-recovery.sh +0 -242
  51. package/tools/tests/test-agent-project-reconcile-pr-guard-blocked-no-commit.sh +0 -142
  52. package/tools/tests/test-agent-project-reconcile-pr-provider-quota-schedules-provider-cooldown.sh +0 -106
  53. package/tools/tests/test-agent-project-reconcile-pr-session-initializes-shared-agent-home.sh +0 -66
  54. package/tools/tests/test-agent-project-reconcile-pr-updated-branch-noop.sh +0 -129
  55. package/tools/tests/test-audit-agent-worktrees-active-launch-skips-git-inspection.sh +0 -69
  56. package/tools/tests/test-audit-agent-worktrees-broken-worktree.sh +0 -43
  57. package/tools/tests/test-audit-agent-worktrees-pending-launch-owner.sh +0 -46
  58. package/tools/tests/test-audit-agent-worktrees-unreconciled-owner.sh +0 -79
  59. package/tools/tests/test-audit-issue-routing-managed-branch-globs.sh +0 -56
  60. package/tools/tests/test-branch-verification-guard-generated-artifacts.sh +0 -72
  61. package/tools/tests/test-branch-verification-guard-targeted-coverage.sh +0 -125
  62. package/tools/tests/test-codex-quota-manager-failure-driven-rotation.sh +0 -178
  63. package/tools/tests/test-codex-quota-wrapper.sh +0 -37
  64. package/tools/tests/test-contribution-docs.sh +0 -18
  65. package/tools/tests/test-control-plane-dashboard-runtime-smoke.sh +0 -343
  66. package/tools/tests/test-create-follow-up-issue.sh +0 -73
  67. package/tools/tests/test-dashboard-launchd-bootstrap.sh +0 -55
  68. package/tools/tests/test-flow-export-execution-env-exports-repo-id.sh +0 -30
  69. package/tools/tests/test-flow-export-github-cli-auth-env-prefers-git-credential.sh +0 -48
  70. package/tools/tests/test-flow-github-api-repo-fallback-preserves-input.sh +0 -85
  71. package/tools/tests/test-flow-github-api-repo-prefers-explicit-repository-id.sh +0 -60
  72. package/tools/tests/test-flow-github-issue-list-falls-back-to-repository-id.sh +0 -64
  73. package/tools/tests/test-flow-github-pr-list-falls-back-to-repository-id.sh +0 -77
  74. package/tools/tests/test-flow-resident-can-reuse-does-not-leak-metadata.sh +0 -52
  75. package/tools/tests/test-flow-resident-reap-stale-controllers.sh +0 -63
  76. package/tools/tests/test-flow-resolve-codex-quota-tools.sh +0 -104
  77. package/tools/tests/test-flow-runtime-doctor-profile-selection.sh +0 -27
  78. package/tools/tests/test-heartbeat-codex-pr-linked-issue-exclusion.sh +0 -79
  79. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-idle-controller.sh +0 -115
  80. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-live-lane-controller.sh +0 -117
  81. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-claude.sh +0 -96
  82. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-codex.sh +0 -96
  83. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop.sh +0 -96
  84. package/tools/tests/test-heartbeat-loop-auth-wait-does-not-consume-capacity.sh +0 -170
  85. package/tools/tests/test-heartbeat-loop-blocked-recovery-lane.sh +0 -201
  86. package/tools/tests/test-heartbeat-loop-blocked-recovery-vs-pr-reservation.sh +0 -201
  87. package/tools/tests/test-heartbeat-loop-idle-resident-controller-does-not-block-launches.sh +0 -160
  88. package/tools/tests/test-heartbeat-loop-pr-launch-dedup.sh +0 -133
  89. package/tools/tests/test-heartbeat-loop-provider-cooldown-suppresses-launches.sh +0 -157
  90. package/tools/tests/test-heartbeat-loop-reaps-stale-resident-controller.sh +0 -181
  91. package/tools/tests/test-heartbeat-loop-waiting-provider-resident-controller-does-not-block-launches.sh +0 -160
  92. package/tools/tests/test-heartbeat-ready-issues-blocked-recovery.sh +0 -134
  93. package/tools/tests/test-heartbeat-safe-auto-dynamic-concurrency.sh +0 -162
  94. package/tools/tests/test-heartbeat-safe-auto-no-tmux-sessions.sh +0 -136
  95. package/tools/tests/test-heartbeat-safe-auto-openclaw-skips-codex-quota.sh +0 -139
  96. package/tools/tests/test-heartbeat-safe-auto-quota-health-signal.sh +0 -119
  97. package/tools/tests/test-heartbeat-safe-auto-stale-shared-loop-pid-does-not-skip.sh +0 -140
  98. package/tools/tests/test-heartbeat-safe-auto-static-capacity-without-quota-cache.sh +0 -142
  99. package/tools/tests/test-heartbeat-safe-auto-zero-healthy-pools.sh +0 -141
  100. package/tools/tests/test-heartbeat-sync-issue-labels-empty-schedule.sh +0 -65
  101. package/tools/tests/test-heartbeat-sync-open-agent-prs-terminal-clears-running.sh +0 -179
  102. package/tools/tests/test-install-dashboard-launchd.sh +0 -78
  103. package/tools/tests/test-install-project-launchd-adds-tool-paths.sh +0 -87
  104. package/tools/tests/test-install-project-launchd.sh +0 -110
  105. package/tools/tests/test-issue-local-workspace-install-policy.sh +0 -81
  106. package/tools/tests/test-issue-publish-scope-guard-docs-signal.sh +0 -70
  107. package/tools/tests/test-issue-reconcile-hooks-success-clears-blocked.sh +0 -36
  108. package/tools/tests/test-kick-scheduler-requires-explicit-profile.sh +0 -47
  109. package/tools/tests/test-label-follow-up-issues-falls-back-to-repository-id.sh +0 -132
  110. package/tools/tests/test-manual-operator-entrypoints-require-explicit-profile.sh +0 -64
  111. package/tools/tests/test-package-funding-metadata.sh +0 -21
  112. package/tools/tests/test-package-public-metadata.sh +0 -62
  113. package/tools/tests/test-placeholder-worker-adapters.sh +0 -38
  114. package/tools/tests/test-pr-reconcile-hooks-refreshes-recurring-issue-checklist.sh +0 -110
  115. package/tools/tests/test-pr-risk-cohesive-mobile-locale-scope.sh +0 -70
  116. package/tools/tests/test-pr-risk-fix-label-semantics.sh +0 -114
  117. package/tools/tests/test-pr-risk-local-first-no-checks.sh +0 -70
  118. package/tools/tests/test-prepare-worktree-simple-repo-baseline.sh +0 -67
  119. package/tools/tests/test-profile-activate.sh +0 -33
  120. package/tools/tests/test-profile-adopt-allow-missing-repo.sh +0 -68
  121. package/tools/tests/test-profile-adopt-skip-workspace-sync-missing-file.sh +0 -61
  122. package/tools/tests/test-profile-adopt-syncs-anchor-and-workspace.sh +0 -90
  123. package/tools/tests/test-profile-smoke-collision.sh +0 -44
  124. package/tools/tests/test-profile-smoke-invalid-claude-config.sh +0 -31
  125. package/tools/tests/test-profile-smoke-invalid-provider-pool.sh +0 -68
  126. package/tools/tests/test-profile-smoke-repo-slug-mismatch.sh +0 -36
  127. package/tools/tests/test-profile-smoke.sh +0 -45
  128. package/tools/tests/test-project-init-force-and-skip-sync.sh +0 -61
  129. package/tools/tests/test-project-init-repo-slug-mismatch.sh +0 -29
  130. package/tools/tests/test-project-init.sh +0 -66
  131. package/tools/tests/test-project-launchd-bootstrap.sh +0 -66
  132. package/tools/tests/test-project-remove.sh +0 -150
  133. package/tools/tests/test-project-runtime-supervisor.sh +0 -47
  134. package/tools/tests/test-project-runtimectl-launchd.sh +0 -115
  135. package/tools/tests/test-project-runtimectl-missing-profile.sh +0 -54
  136. package/tools/tests/test-project-runtimectl-start-falls-back-to-bootstrap.sh +0 -108
  137. package/tools/tests/test-project-runtimectl-status-reports-supervisor-as-heartbeat-parent.sh +0 -95
  138. package/tools/tests/test-project-runtimectl-status-supervisor-running.sh +0 -59
  139. package/tools/tests/test-project-runtimectl-stop-cancels-pending-kick.sh +0 -85
  140. package/tools/tests/test-project-runtimectl-stop-clears-running-labels.sh +0 -78
  141. package/tools/tests/test-project-runtimectl.sh +0 -212
  142. package/tools/tests/test-provider-cooldown-state-prefers-runtime-worker-context.sh +0 -39
  143. package/tools/tests/test-provider-cooldown-state.sh +0 -59
  144. package/tools/tests/test-public-repo-docs.sh +0 -160
  145. package/tools/tests/test-reconcile-pr-worker-acp-config-routing.sh +0 -75
  146. package/tools/tests/test-render-dashboard-snapshot.sh +0 -149
  147. package/tools/tests/test-render-flow-config-demo-profile.sh +0 -36
  148. package/tools/tests/test-render-flow-config-provider-pool-fallback.sh +0 -81
  149. package/tools/tests/test-render-flow-config.sh +0 -52
  150. package/tools/tests/test-run-codex-task-claude-routing.sh +0 -125
  151. package/tools/tests/test-run-codex-task-codex-resident-routing.sh +0 -108
  152. package/tools/tests/test-run-codex-task-kilo-routing.sh +0 -98
  153. package/tools/tests/test-run-codex-task-openclaw-resident-routing.sh +0 -117
  154. package/tools/tests/test-run-codex-task-openclaw-routing.sh +0 -113
  155. package/tools/tests/test-run-codex-task-opencode-routing.sh +0 -98
  156. package/tools/tests/test-run-codex-task-provider-pool-fallback-routing.sh +0 -146
  157. package/tools/tests/test-scaffold-profile.sh +0 -108
  158. package/tools/tests/test-serve-dashboard.sh +0 -93
  159. package/tools/tests/test-start-issue-worker-blocked-context.sh +0 -129
  160. package/tools/tests/test-start-issue-worker-blocks-complete-recurring-checklist.sh +0 -189
  161. package/tools/tests/test-start-issue-worker-local-install-routing.sh +0 -157
  162. package/tools/tests/test-start-issue-worker-profile-template-routing.sh +0 -149
  163. package/tools/tests/test-start-issue-worker-recurring-resident-reuse-codex.sh +0 -212
  164. package/tools/tests/test-start-issue-worker-recurring-resident-reuse.sh +0 -219
  165. package/tools/tests/test-start-issue-worker-renders-verification-snippet.sh +0 -155
  166. package/tools/tests/test-start-issue-worker-resident-reuse-falls-back-to-new-worktree.sh +0 -199
  167. package/tools/tests/test-start-pr-fix-worker-host-blocker-context.sh +0 -275
  168. package/tools/tests/test-start-resident-issue-loop-adopts-next-recurring-issue.sh +0 -185
  169. package/tools/tests/test-start-resident-issue-loop-clears-pending-while-waiting-due.sh +0 -152
  170. package/tools/tests/test-start-resident-issue-loop-consumes-queued-lease.sh +0 -186
  171. package/tools/tests/test-start-resident-issue-loop-fails-over-provider-pool.sh +0 -212
  172. package/tools/tests/test-start-resident-issue-loop-immediate-cycles.sh +0 -148
  173. package/tools/tests/test-start-resident-issue-loop-waits-for-provider.sh +0 -194
  174. package/tools/tests/test-start-resident-issue-loop-waits-for-terminal-reconcile-status.sh +0 -198
  175. package/tools/tests/test-start-resident-issue-loop-yields-to-live-lane-controller.sh +0 -145
  176. package/tools/tests/test-sync-pr-labels-fix-lane-uses-repair-queued.sh +0 -67
  177. package/tools/tests/test-sync-recurring-issue-checklist-backfills-workflow-complete-blocker.sh +0 -70
  178. package/tools/tests/test-sync-recurring-issue-checklist.sh +0 -95
  179. package/tools/tests/test-sync-shared-agent-home-local-source-root.sh +0 -66
  180. package/tools/tests/test-sync-shared-agent-home-preserves-unrelated-workflow-catalog-skill.sh +0 -47
  181. package/tools/tests/test-test-smoke.sh +0 -86
  182. package/tools/tests/test-uninstall-project-launchd.sh +0 -37
  183. package/tools/tests/test-update-github-labels-prefers-sibling-helper.sh +0 -49
  184. package/tools/tests/test-workflow-catalog.sh +0 -43
@@ -1,78 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- INSTALL_BIN="${FLOW_ROOT}/tools/bin/install-dashboard-launchd.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- home_dir="$tmpdir/home"
11
- workspace_dir="$home_dir/.agent-runtime/control-plane/workspace"
12
- launch_agents_dir="$home_dir/Library/LaunchAgents"
13
- log_dir="$home_dir/.agent-runtime/logs"
14
- source_home="$tmpdir/source-home"
15
- runtime_home="$home_dir/.agent-runtime/runtime-home"
16
- profile_registry_root="$home_dir/.agent-runtime/control-plane/profiles"
17
- sync_script="$tmpdir/sync.sh"
18
- bootstrap_script="$tmpdir/bootstrap.sh"
19
- label="ai.agent.dashboard.test"
20
-
21
- mkdir -p "$workspace_dir" "$launch_agents_dir" "$log_dir" "$source_home" "$runtime_home" "$profile_registry_root"
22
-
23
- cat >"$sync_script" <<'EOF'
24
- #!/usr/bin/env bash
25
- set -euo pipefail
26
- exit 0
27
- EOF
28
- chmod +x "$sync_script"
29
-
30
- cat >"$bootstrap_script" <<'EOF'
31
- #!/usr/bin/env bash
32
- set -euo pipefail
33
- exit 0
34
- EOF
35
- chmod +x "$bootstrap_script"
36
-
37
- output="$(
38
- ACP_DASHBOARD_HOME_DIR="$home_dir" \
39
- ACP_DASHBOARD_SOURCE_HOME="$source_home" \
40
- ACP_DASHBOARD_RUNTIME_HOME="$runtime_home" \
41
- ACP_DASHBOARD_WORKSPACE_DIR="$workspace_dir" \
42
- ACP_DASHBOARD_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
43
- ACP_DASHBOARD_LAUNCH_AGENTS_DIR="$launch_agents_dir" \
44
- ACP_DASHBOARD_LOG_DIR="$log_dir" \
45
- ACP_DASHBOARD_SYNC_SCRIPT="$sync_script" \
46
- ACP_DASHBOARD_BOOTSTRAP_SCRIPT="$bootstrap_script" \
47
- ACP_DASHBOARD_SKIP_LAUNCHCTL=1 \
48
- bash "$INSTALL_BIN" --host 127.0.0.1 --port 9911 --label "$label"
49
- )"
50
-
51
- wrapper_path="$workspace_dir/bin/agent-dashboard-launchd.sh"
52
- plist_path="$launch_agents_dir/$label.plist"
53
-
54
- grep -q '^LAUNCHD_INSTALL_STATUS=skipped-launchctl$' <<<"$output"
55
- grep -q "^LABEL=$label$" <<<"$output"
56
- grep -q "^PLIST=$plist_path$" <<<"$output"
57
- grep -q "^WRAPPER=$wrapper_path$" <<<"$output"
58
- grep -q '^URL=http://127.0.0.1:9911$' <<<"$output"
59
-
60
- test -x "$wrapper_path"
61
- test -f "$plist_path"
62
- grep -q "^export ACP_DASHBOARD_HOME_DIR='$home_dir'$" "$wrapper_path"
63
- grep -q "^export ACP_DASHBOARD_SOURCE_HOME='$source_home'$" "$wrapper_path"
64
- grep -q "^export ACP_DASHBOARD_RUNTIME_HOME='$runtime_home'$" "$wrapper_path"
65
- grep -q "^export ACP_DASHBOARD_PROFILE_REGISTRY_ROOT='$profile_registry_root'$" "$wrapper_path"
66
- grep -q "^export ACP_DASHBOARD_HOST='127.0.0.1'$" "$wrapper_path"
67
- grep -q "^export ACP_DASHBOARD_PORT='9911'$" "$wrapper_path"
68
- grep -q "^export ACP_DASHBOARD_SYNC_SCRIPT='$sync_script'$" "$wrapper_path"
69
- grep -q "exec bash '$bootstrap_script'$" "$wrapper_path"
70
-
71
- grep -q "<string>$label</string>" "$plist_path"
72
- grep -q "<string>$wrapper_path</string>" "$plist_path"
73
- grep -q "<string>$log_dir/agent-dashboard.stderr.log</string>" "$plist_path"
74
- grep -q "<string>$log_dir/agent-dashboard.stdout.log</string>" "$plist_path"
75
- grep -q '<key>KeepAlive</key>' "$plist_path"
76
- grep -q '<true/>' "$plist_path"
77
-
78
- echo "install dashboard launchd test passed"
@@ -1,87 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- INSTALL_BIN="${FLOW_ROOT}/tools/bin/install-project-launchd.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- home_dir="$tmpdir/home"
11
- workspace_dir="$home_dir/.agent-runtime/control-plane/workspace"
12
- launch_agents_dir="$home_dir/Library/LaunchAgents"
13
- log_dir="$home_dir/.agent-runtime/logs"
14
- source_home="$tmpdir/source-home"
15
- runtime_home="$home_dir/.agent-runtime/runtime-home"
16
- profile_registry_root="$home_dir/.agent-runtime/control-plane/profiles"
17
- profile_dir="$profile_registry_root/demo"
18
- shim_dir="$tmpdir/shim"
19
- sync_script="$tmpdir/sync.sh"
20
- bootstrap_script="$tmpdir/bootstrap.sh"
21
- supervisor_script="$tmpdir/supervisor.sh"
22
-
23
- mkdir -p "$workspace_dir" "$launch_agents_dir" "$log_dir" "$source_home" "$runtime_home" "$profile_dir" "$shim_dir"
24
-
25
- cat >"$profile_dir/control-plane.yaml" <<EOF
26
- schema_version: "1"
27
- id: "demo"
28
- repo:
29
- slug: "example/demo"
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: "$tmpdir/runtime/demo/runs"
37
- state_root: "$tmpdir/runtime/demo/state"
38
- history_root: "$tmpdir/runtime/demo/history"
39
- retained_repo_root: "$tmpdir/repo"
40
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
41
- execution:
42
- coding_worker: "openclaw"
43
- openclaw:
44
- model: "primary/model"
45
- thinking: "adaptive"
46
- timeout_seconds: 900
47
- EOF
48
-
49
- for path in "$sync_script" "$bootstrap_script" "$supervisor_script"; do
50
- cat >"$path" <<'EOF'
51
- #!/usr/bin/env bash
52
- set -euo pipefail
53
- exit 0
54
- EOF
55
- chmod +x "$path"
56
- done
57
-
58
- for tool in node gh openclaw; do
59
- cat >"$shim_dir/$tool" <<'EOF'
60
- #!/usr/bin/env bash
61
- set -euo pipefail
62
- exit 0
63
- EOF
64
- chmod +x "$shim_dir/$tool"
65
- done
66
-
67
- PATH="$shim_dir:/usr/bin:/bin:/usr/sbin:/sbin" \
68
- ACP_PROJECT_RUNTIME_HOME_DIR="$home_dir" \
69
- ACP_PROJECT_RUNTIME_SOURCE_HOME="$source_home" \
70
- ACP_PROJECT_RUNTIME_RUNTIME_HOME="$runtime_home" \
71
- ACP_PROJECT_RUNTIME_WORKSPACE_DIR="$workspace_dir" \
72
- ACP_PROJECT_RUNTIME_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
73
- ACP_PROJECT_RUNTIME_LAUNCH_AGENTS_DIR="$launch_agents_dir" \
74
- ACP_PROJECT_RUNTIME_LOG_DIR="$log_dir" \
75
- ACP_PROJECT_RUNTIME_SYNC_SCRIPT="$sync_script" \
76
- ACP_PROJECT_RUNTIME_BOOTSTRAP_SCRIPT="$bootstrap_script" \
77
- ACP_PROJECT_RUNTIME_SUPERVISOR_SCRIPT="$supervisor_script" \
78
- ACP_PROJECT_RUNTIME_SKIP_LAUNCHCTL=1 \
79
- bash "$INSTALL_BIN" --profile-id demo >/dev/null
80
-
81
- wrapper_path="$workspace_dir/bin/agent-project-demo-launchd.sh"
82
- plist_path="$launch_agents_dir/ai.agent.project.demo.plist"
83
-
84
- grep -q "^export ACP_PROJECT_RUNTIME_PATH='.*${shim_dir}.*'$" "$wrapper_path"
85
- grep -q "<string>.*${shim_dir}.*</string>" "$plist_path"
86
-
87
- echo "install project launchd adds tool paths test passed"
@@ -1,110 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- INSTALL_BIN="${FLOW_ROOT}/tools/bin/install-project-launchd.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- home_dir="$tmpdir/home"
11
- workspace_dir="$home_dir/.agent-runtime/control-plane/workspace"
12
- launch_agents_dir="$home_dir/Library/LaunchAgents"
13
- log_dir="$home_dir/.agent-runtime/logs"
14
- source_home="$tmpdir/source-home"
15
- runtime_home="$home_dir/.agent-runtime/runtime-home"
16
- profile_registry_root="$home_dir/.agent-runtime/control-plane/profiles"
17
- profile_dir="$profile_registry_root/demo"
18
- sync_script="$tmpdir/sync.sh"
19
- bootstrap_script="$tmpdir/bootstrap.sh"
20
- supervisor_script="$tmpdir/supervisor.sh"
21
- label="ai.agent.project.demo-test"
22
-
23
- mkdir -p "$workspace_dir" "$launch_agents_dir" "$log_dir" "$source_home" "$runtime_home" "$profile_dir"
24
-
25
- cat >"$profile_dir/control-plane.yaml" <<EOF
26
- schema_version: "1"
27
- id: "demo"
28
- repo:
29
- slug: "example/demo"
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: "$tmpdir/runtime/demo/runs"
37
- state_root: "$tmpdir/runtime/demo/state"
38
- history_root: "$tmpdir/runtime/demo/history"
39
- retained_repo_root: "$tmpdir/repo"
40
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
41
- execution:
42
- coding_worker: "openclaw"
43
- openclaw:
44
- model: "primary/model"
45
- thinking: "adaptive"
46
- timeout_seconds: 900
47
- EOF
48
-
49
- cat >"$sync_script" <<'EOF'
50
- #!/usr/bin/env bash
51
- set -euo pipefail
52
- exit 0
53
- EOF
54
- chmod +x "$sync_script"
55
-
56
- cat >"$bootstrap_script" <<'EOF'
57
- #!/usr/bin/env bash
58
- set -euo pipefail
59
- exit 0
60
- EOF
61
- chmod +x "$bootstrap_script"
62
-
63
- cat >"$supervisor_script" <<'EOF'
64
- #!/usr/bin/env bash
65
- set -euo pipefail
66
- exit 0
67
- EOF
68
- chmod +x "$supervisor_script"
69
-
70
- output="$(
71
- ACP_PROJECT_RUNTIME_HOME_DIR="$home_dir" \
72
- ACP_PROJECT_RUNTIME_SOURCE_HOME="$source_home" \
73
- ACP_PROJECT_RUNTIME_RUNTIME_HOME="$runtime_home" \
74
- ACP_PROJECT_RUNTIME_WORKSPACE_DIR="$workspace_dir" \
75
- ACP_PROJECT_RUNTIME_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
76
- ACP_PROJECT_RUNTIME_LAUNCH_AGENTS_DIR="$launch_agents_dir" \
77
- ACP_PROJECT_RUNTIME_LOG_DIR="$log_dir" \
78
- ACP_PROJECT_RUNTIME_SYNC_SCRIPT="$sync_script" \
79
- ACP_PROJECT_RUNTIME_BOOTSTRAP_SCRIPT="$bootstrap_script" \
80
- ACP_PROJECT_RUNTIME_SUPERVISOR_SCRIPT="$supervisor_script" \
81
- ACP_PROJECT_RUNTIME_SKIP_LAUNCHCTL=1 \
82
- bash "$INSTALL_BIN" --profile-id demo --label "$label" --delay-seconds 3 --interval-seconds 20
83
- )"
84
-
85
- wrapper_path="$workspace_dir/bin/agent-project-demo-launchd.sh"
86
- plist_path="$launch_agents_dir/$label.plist"
87
-
88
- grep -q '^LAUNCHD_INSTALL_STATUS=skipped-launchctl$' <<<"$output"
89
- grep -q '^PROFILE_ID=demo$' <<<"$output"
90
- grep -q "^LABEL=$label$" <<<"$output"
91
- grep -q "^PLIST=$plist_path$" <<<"$output"
92
- grep -q "^WRAPPER=$wrapper_path$" <<<"$output"
93
-
94
- test -x "$wrapper_path"
95
- test -f "$plist_path"
96
- grep -q "^export ACP_PROJECT_RUNTIME_HOME_DIR='$home_dir'$" "$wrapper_path"
97
- grep -q "^export ACP_PROJECT_RUNTIME_SOURCE_HOME='$source_home'$" "$wrapper_path"
98
- grep -q "^export ACP_PROJECT_RUNTIME_RUNTIME_HOME='$runtime_home'$" "$wrapper_path"
99
- grep -q "^export ACP_PROJECT_RUNTIME_PROFILE_ID='demo'$" "$wrapper_path"
100
- grep -q "^export ACP_PROJECT_RUNTIME_ENV_FILE='$profile_dir/runtime.env'$" "$wrapper_path"
101
- grep -q "^export ACP_PROFILE_REGISTRY_ROOT='$profile_registry_root'$" "$wrapper_path"
102
- grep -q "exec bash '$supervisor_script' --bootstrap-script '$bootstrap_script' --pid-file '$tmpdir/runtime/demo/state/runtime-supervisor.pid' --delay-seconds '3' --interval-seconds '20'$" "$wrapper_path"
103
-
104
- grep -q "<string>$label</string>" "$plist_path"
105
- grep -q "<string>$wrapper_path</string>" "$plist_path"
106
- grep -q "<string>$log_dir/agent-project-demo.stderr.log</string>" "$plist_path"
107
- grep -q "<string>$log_dir/agent-project-demo.stdout.log</string>" "$plist_path"
108
- grep -q '<key>KeepAlive</key>' "$plist_path"
109
-
110
- echo "install project launchd test passed"
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- POLICY_BIN="${FLOW_ROOT}/tools/bin/issue-requires-local-workspace-install.sh"
6
-
7
- scheduled_verify_body="$(cat <<'EOF'
8
- ## Summary
9
- Run a recurring read-only verification.
10
-
11
- Schedule: every 1h
12
-
13
- ## Commands
14
- 1. `pnpm run verify:web:main`
15
- EOF
16
- )"
17
-
18
- scheduled_mobile_verify_body="$(cat <<'EOF'
19
- ## Summary
20
- Run a recurring read-only verification.
21
-
22
- Schedule: every 1h
23
-
24
- ## Commands
25
- 1. `pnpm run verify:mobile:main`
26
- EOF
27
- )"
28
-
29
- scheduled_install_body="$(cat <<'EOF'
30
- ## Summary
31
- Rebuild the workspace before running checks.
32
-
33
- Schedule: every 1h
34
-
35
- ## Commands
36
- 1. `pnpm install --frozen-lockfile`
37
- 2. `pnpm run verify:web:main`
38
- EOF
39
- )"
40
-
41
- scheduled_native_body="$(cat <<'EOF'
42
- ## Summary
43
- Prepare iOS workspace before recurring checks.
44
-
45
- Schedule: every 1h
46
-
47
- ## Commands
48
- 1. `expo prebuild --platform ios`
49
- 2. `pnpm run verify:mobile:main`
50
- EOF
51
- )"
52
-
53
- explicit_opt_in_body="$(cat <<'EOF'
54
- ## Summary
55
- Run with local install.
56
-
57
- Schedule: every 1h
58
- Local workspace install: yes
59
-
60
- ## Commands
61
- 1. `pnpm run verify:web:main`
62
- EOF
63
- )"
64
-
65
- unscheduled_install_body="$(cat <<'EOF'
66
- ## Summary
67
- Manual task.
68
-
69
- ## Commands
70
- 1. `pnpm install --frozen-lockfile`
71
- EOF
72
- )"
73
-
74
- [[ "$(ISSUE_BODY="$scheduled_verify_body" bash "$POLICY_BIN")" == "no" ]]
75
- [[ "$(ISSUE_BODY="$scheduled_mobile_verify_body" bash "$POLICY_BIN")" == "no" ]]
76
- [[ "$(ISSUE_BODY="$scheduled_install_body" bash "$POLICY_BIN")" == "yes" ]]
77
- [[ "$(ISSUE_BODY="$scheduled_native_body" bash "$POLICY_BIN")" == "yes" ]]
78
- [[ "$(ISSUE_BODY="$explicit_opt_in_body" bash "$POLICY_BIN")" == "yes" ]]
79
- [[ "$(ISSUE_BODY="$unscheduled_install_body" bash "$POLICY_BIN")" == "no" ]]
80
-
81
- echo "issue local workspace install policy test passed"
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SCOPE_GUARD_BIN="${FLOW_ROOT}/tools/bin/issue-publish-scope-guard.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- repo="$tmpdir/repo"
11
- bin_dir="$tmpdir/bin"
12
- node_bin_dir="$(dirname "$(command -v node)")"
13
- mkdir -p "$bin_dir"
14
-
15
- git init -b main "$repo" >/dev/null 2>&1
16
- mkdir -p "$repo/apps/web/src/app"
17
- printf 'export default function Home() { return null; }\n' >"$repo/apps/web/src/app/page.tsx"
18
- git -C "$repo" add apps/web/src/app/page.tsx
19
- git -C "$repo" -c user.name=Test -c user.email=test@example.com commit -m "init" >/dev/null
20
- git -C "$repo" checkout -b issue-slice >/dev/null 2>&1
21
- printf 'export default function Home() { return \"patched\"; }\n' >"$repo/apps/web/src/app/page.tsx"
22
- git -C "$repo" add apps/web/src/app/page.tsx
23
- git -C "$repo" -c user.name=Test -c user.email=test@example.com commit -m "product slice" >/dev/null
24
-
25
- cat >"$bin_dir/gh" <<'EOF'
26
- #!/usr/bin/env bash
27
- set -euo pipefail
28
-
29
- if [[ "${1:-}" == "issue" && "${2:-}" == "view" ]]; then
30
- issue_id="${3:-}"
31
- case "$issue_id" in
32
- 100)
33
- cat <<'JSON'
34
- {"title":"Align auth page with OpenSpec contract","body":"Context: keep behavior aligned with the latest OpenSpec notes."}
35
- JSON
36
- ;;
37
- 101)
38
- cat <<'JSON'
39
- {"title":"docs: auth page follow-up","body":"Scope: docs only"}
40
- JSON
41
- ;;
42
- *)
43
- echo "unexpected issue id: $issue_id" >&2
44
- exit 1
45
- ;;
46
- esac
47
- exit 0
48
- fi
49
-
50
- echo "unexpected gh args: $*" >&2
51
- exit 1
52
- EOF
53
-
54
- chmod +x "$bin_dir/gh"
55
-
56
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
57
- bash "$SCOPE_GUARD_BIN" --worktree "$repo" --base-ref main --issue-id 100 >/dev/null
58
-
59
- set +e
60
- blocked_output="$(
61
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
62
- bash "$SCOPE_GUARD_BIN" --worktree "$repo" --base-ref main --issue-id 101 2>&1
63
- )"
64
- blocked_status=$?
65
- set -e
66
-
67
- test "$blocked_status" = "42"
68
- grep -q 'docs_declared_scope_contains_product_changes=1' <<<"$blocked_output"
69
-
70
- echo "issue publish scope guard docs signal test passed"
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- HOOK_FILE="${FLOW_ROOT}/hooks/issue-reconcile-hooks.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- stub_tools="$tmpdir/tools/bin"
11
- capture_file="$tmpdir/labels.log"
12
- mkdir -p "$stub_tools"
13
-
14
- cat >"$stub_tools/agent-github-update-labels" <<'EOF'
15
- #!/usr/bin/env bash
16
- set -euo pipefail
17
- printf '%s\n' "$*" >"${TEST_CAPTURE_FILE:?}"
18
- EOF
19
- chmod +x "$stub_tools/agent-github-update-labels"
20
-
21
- export ISSUE_ID=42
22
- export TEST_CAPTURE_FILE="$capture_file"
23
-
24
- # shellcheck source=/dev/null
25
- source "$HOOK_FILE"
26
-
27
- FLOW_TOOLS_DIR="$stub_tools"
28
- REPO_SLUG="example/repo"
29
-
30
- issue_remove_running
31
-
32
- grep -q -- '--remove agent-running' "$capture_file"
33
- grep -q -- '--remove agent-ready' "$capture_file"
34
- grep -q -- '--remove agent-blocked' "$capture_file"
35
-
36
- echo "issue reconcile hooks success clears blocked label test passed"
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- KICK_SCRIPT="${FLOW_ROOT}/tools/bin/kick-scheduler.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
- skill_root="$tmpdir/skill"
13
- bin_dir="$skill_root/tools/bin"
14
- assets_dir="$skill_root/assets"
15
- profile_home="$tmpdir/profiles"
16
- mkdir -p "$bin_dir" "$profile_home/alpha" "$profile_home/beta" "$assets_dir"
17
-
18
- cp "$KICK_SCRIPT" "$bin_dir/kick-scheduler.sh"
19
- cp "$FLOW_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
20
- cp "$FLOW_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
21
- printf '{}
22
- ' >"$assets_dir/workflow-catalog.json"
23
-
24
- cat >"$profile_home/alpha/control-plane.yaml" <<'EOF'
25
- schema_version: "1"
26
- id: "alpha"
27
- repo:
28
- slug: "example/alpha"
29
- EOF
30
-
31
- cat >"$profile_home/beta/control-plane.yaml" <<'EOF'
32
- schema_version: "1"
33
- id: "beta"
34
- repo:
35
- slug: "example/beta"
36
- EOF
37
-
38
- set +e
39
- output="$(ACP_PROFILE_REGISTRY_ROOT="$profile_home" bash "$bin_dir/kick-scheduler.sh" 1 2>&1)"
40
- status=$?
41
- set -e
42
-
43
- test "$status" -eq 64
44
- grep -q '^explicit profile selection required for kick-scheduler.sh when multiple available profiles exist\.$' <<<"$output"
45
- grep -q '^Set ACP_PROJECT_ID=<id> or AGENT_PROJECT_ID=<id> when multiple available profiles exist\.$' <<<"$output"
46
-
47
- echo "kick scheduler explicit profile guard test passed"
@@ -1,132 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
-
6
- tmpdir="$(mktemp -d)"
7
- trap 'rm -rf "$tmpdir"' EXIT
8
-
9
- workspace_root="$tmpdir/workspace"
10
- adapter_bin_dir="$workspace_root/bin"
11
- tools_bin_dir="$workspace_root/tools/bin"
12
- profile_registry_root="$tmpdir/profile-registry"
13
- profile_dir="$profile_registry_root/demo"
14
- agent_root="$tmpdir/agent"
15
- repo_root="$tmpdir/repo"
16
- shim_dir="$tmpdir/shim"
17
- run_dir="$agent_root/runs/demo-issue-42"
18
- capture_file="$tmpdir/labels.log"
19
-
20
- mkdir -p "$adapter_bin_dir" "$tools_bin_dir" "$profile_dir" "$agent_root/runs" "$agent_root/history" "$agent_root/state" "$repo_root" "$shim_dir" "$run_dir"
21
-
22
- cp "$FLOW_ROOT/bin/label-follow-up-issues.sh" "$adapter_bin_dir/label-follow-up-issues.sh"
23
- cp "$FLOW_ROOT/tools/bin/flow-config-lib.sh" "$tools_bin_dir/flow-config-lib.sh"
24
- cp "$FLOW_ROOT/tools/bin/flow-shell-lib.sh" "$tools_bin_dir/flow-shell-lib.sh"
25
-
26
- cat >"$profile_dir/control-plane.yaml" <<EOF
27
- schema_version: "1"
28
- id: "demo"
29
- repo:
30
- slug: "example/demo"
31
- id: "123"
32
- root: "$repo_root"
33
- default_branch: "main"
34
- runtime:
35
- orchestrator_agent_root: "$agent_root"
36
- worktree_root: "$tmpdir/worktrees"
37
- agent_repo_root: "$repo_root"
38
- runs_root: "$agent_root/runs"
39
- state_root: "$agent_root/state"
40
- history_root: "$agent_root/history"
41
- retained_repo_root: "$repo_root"
42
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
43
- session_naming:
44
- issue_prefix: "demo-issue-"
45
- pr_prefix: "demo-pr-"
46
- issue_branch_prefix: "agent/demo/issue"
47
- pr_worktree_branch_prefix: "agent/demo/pr"
48
- managed_pr_branch_globs: "agent/demo/*"
49
- execution:
50
- coding_worker: "openclaw"
51
- EOF
52
-
53
- cat >"$tools_bin_dir/agent-project-worker-status" <<'EOF'
54
- #!/usr/bin/env bash
55
- set -euo pipefail
56
- cat <<OUT
57
- STATUS=SUCCEEDED
58
- META_FILE=${TEST_RUN_DIR:?}/run.env
59
- OUT
60
- EOF
61
- chmod +x "$tools_bin_dir/agent-project-worker-status"
62
-
63
- cat >"$tools_bin_dir/agent-github-update-labels" <<'EOF'
64
- #!/usr/bin/env bash
65
- set -euo pipefail
66
- printf '%s\n' "$*" >>"${TEST_CAPTURE_FILE:?}"
67
- EOF
68
- chmod +x "$tools_bin_dir/agent-github-update-labels"
69
-
70
- cat >"$adapter_bin_dir/issue-resource-class.sh" <<'EOF'
71
- #!/usr/bin/env bash
72
- set -euo pipefail
73
- cat <<OUT
74
- IS_E2E=yes
75
- OUT
76
- EOF
77
- chmod +x "$adapter_bin_dir/issue-resource-class.sh"
78
-
79
- cat >"$shim_dir/gh" <<'EOF'
80
- #!/usr/bin/env bash
81
- set -euo pipefail
82
-
83
- if [[ "${1:-}" == "issue" && "${2:-}" == "view" ]]; then
84
- issue_id="${3:-0}"
85
- cat <<JSON
86
- {"number":${issue_id},"state":"OPEN","title":"Follow-up issue ${issue_id}","body":"Keep this focused.","url":"https://example.test/issues/${issue_id}","labels":[],"comments":[],"createdAt":"2026-03-28T20:00:00Z","updatedAt":"2026-03-28T20:00:00Z"}
87
- JSON
88
- exit 0
89
- fi
90
-
91
- if [[ "${1:-}" == "api" ]]; then
92
- route="${2:-}"
93
- case "${route}" in
94
- repos/example/demo/issues/42/comments*)
95
- echo "gh: Not Found (HTTP 404)" >&2
96
- exit 1
97
- ;;
98
- repositories/123/issues/42/comments*)
99
- cat <<'JSON'
100
- [{"user":{"login":"tester"},"created_at":"2026-03-28T20:01:00Z","body":"Please follow up in issue #77."}]
101
- JSON
102
- exit 0
103
- ;;
104
- esac
105
- fi
106
-
107
- echo "unexpected gh args: $*" >&2
108
- exit 1
109
- EOF
110
- chmod +x "$shim_dir/gh"
111
-
112
- cat >"$run_dir/run.env" <<'EOF'
113
- ISSUE_ID=42
114
- SESSION=demo-issue-42
115
- STARTED_AT=2026-03-28T20:00:00Z
116
- EOF
117
-
118
- out="$(
119
- PATH="$shim_dir:$PATH" \
120
- ACP_PROJECT_ID="demo" \
121
- ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
122
- TEST_RUN_DIR="$run_dir" \
123
- TEST_CAPTURE_FILE="$capture_file" \
124
- GITHUB_ACTOR="tester" \
125
- bash "$adapter_bin_dir/label-follow-up-issues.sh" demo-issue-42
126
- )"
127
-
128
- grep -q '^LABELED=77$' <<<"$out"
129
- grep -q '^COUNT=1$' <<<"$out"
130
- grep -q -- '--repo-slug example/demo --number 77 --add agent-e2e-heavy' "$capture_file"
131
-
132
- echo "label follow-up issues repository id fallback test passed"