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,64 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- FLOW_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
6
- FLOW_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
7
- FLOW_RESIDENT_LIB="${FLOW_ROOT}/tools/bin/flow-resident-worker-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" "$assets_dir" "$profile_home/alpha" "$profile_home/beta"
17
-
18
- cp "$FLOW_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
19
- cp "$FLOW_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
20
- cp "$FLOW_RESIDENT_LIB" "$bin_dir/flow-resident-worker-lib.sh"
21
- printf '{}\n' >"$assets_dir/workflow-catalog.json"
22
-
23
- for script in heartbeat-safe-auto.sh start-issue-worker.sh start-pr-fix-worker.sh start-pr-review-worker.sh new-worktree.sh new-pr-worktree.sh worker-status.sh; do
24
- cp "$FLOW_ROOT/tools/bin/${script}" "$bin_dir/${script}"
25
- done
26
-
27
- cat >"$profile_home/alpha/control-plane.yaml" <<'EOF'
28
- schema_version: "1"
29
- id: "alpha"
30
- repo:
31
- slug: "example/alpha"
32
- EOF
33
-
34
- cat >"$profile_home/beta/control-plane.yaml" <<'EOF'
35
- schema_version: "1"
36
- id: "beta"
37
- repo:
38
- slug: "example/beta"
39
- EOF
40
-
41
- check_guard() {
42
- local script="${1:?script required}"
43
- shift || true
44
-
45
- set +e
46
- local output
47
- output="$(ACP_PROFILE_REGISTRY_ROOT="$profile_home" bash "$bin_dir/$script" "$@" 2>&1)"
48
- local status=$?
49
- set -e
50
-
51
- test "$status" -eq 64
52
- grep -q "^explicit profile selection required for ${script} when multiple available profiles exist\.$" <<<"$output"
53
- grep -q '^Set ACP_PROJECT_ID=<id> or AGENT_PROJECT_ID=<id> when multiple available profiles exist\.$' <<<"$output"
54
- }
55
-
56
- check_guard heartbeat-safe-auto.sh
57
- check_guard start-issue-worker.sh 101
58
- check_guard start-pr-fix-worker.sh 601
59
- check_guard start-pr-review-worker.sh 601
60
- check_guard new-worktree.sh 101
61
- check_guard new-pr-worktree.sh 601 feature/test
62
- check_guard worker-status.sh demo-session
63
-
64
- echo "manual operator explicit profile guard test passed"
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
5
- PACKAGE_JSON="$ROOT_DIR/package.json"
6
- FUNDING_FILE="$ROOT_DIR/.github/FUNDING.yml"
7
-
8
- node -e '
9
- const fs = require("fs");
10
- const pkg = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
11
- if (!Array.isArray(pkg.funding) || pkg.funding.length === 0) {
12
- process.exit(1);
13
- }
14
- if (!pkg.funding.includes("https://github.com/sponsors/ducminhnguyen0319")) {
15
- process.exit(2);
16
- }
17
- ' "$PACKAGE_JSON"
18
-
19
- test -f "$FUNDING_FILE"
20
- grep -q '^github: \[ducminhnguyen0319\]$' "$FUNDING_FILE"
21
- grep -q '^ - https://github.com/sponsors/ducminhnguyen0319$' "$FUNDING_FILE"
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
5
- PACKAGE_JSON="$ROOT_DIR/package.json"
6
-
7
- node -e '
8
- const fs = require("fs");
9
- const pkg = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
10
-
11
- if (!pkg.description || !pkg.description.includes("running reliably without constant human babysitting")) {
12
- process.exit(1);
13
- }
14
- if (pkg.homepage !== "https://github.com/ducminhnguyen0319/agent-control-plane") {
15
- process.exit(10);
16
- }
17
- if (!pkg.bugs || pkg.bugs.url !== "https://github.com/ducminhnguyen0319/agent-control-plane/issues") {
18
- process.exit(11);
19
- }
20
- if (!pkg.repository || pkg.repository.type !== "git" || pkg.repository.url !== "git+https://github.com/ducminhnguyen0319/agent-control-plane.git") {
21
- process.exit(12);
22
- }
23
- if (pkg.license !== "MIT") {
24
- process.exit(2);
25
- }
26
- for (const keyword of ["agents", "dashboard", "runtime"]) {
27
- if (!Array.isArray(pkg.keywords) || !pkg.keywords.includes(keyword)) {
28
- process.exit(3);
29
- }
30
- }
31
- if (!Array.isArray(pkg.files) || !pkg.files.includes("assets/workflow-catalog.json")) {
32
- process.exit(4);
33
- }
34
- if (pkg.files.includes("assets")) {
35
- process.exit(5);
36
- }
37
- if (!pkg.directories || pkg.directories.bin !== "npm/public-bin") {
38
- process.exit(6);
39
- }
40
- if (!Array.isArray(pkg.files) || !pkg.files.includes("npm/public-bin")) {
41
- process.exit(7);
42
- }
43
- if (pkg.bin) {
44
- process.exit(8);
45
- }
46
- for (const bundledPath of [
47
- "tools/vendor/codex-quota/codex-quota.js",
48
- "tools/vendor/codex-quota/lib",
49
- "tools/vendor/codex-quota-manager/scripts"
50
- ]) {
51
- if (!pkg.files.includes(bundledPath)) {
52
- process.exit(9);
53
- }
54
- }
55
- ' "$PACKAGE_JSON"
56
-
57
- test -f "$ROOT_DIR/LICENSE"
58
- grep -q '^MIT License$' "$ROOT_DIR/LICENSE"
59
- test -f "$ROOT_DIR/npm/public-bin/agent-control-plane"
60
- test -x "$ROOT_DIR/npm/public-bin/agent-control-plane"
61
-
62
- echo "package public metadata test passed"
@@ -1,38 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- OPENCODE_SCRIPT="${FLOW_ROOT}/tools/bin/agent-project-run-opencode-session"
6
- KILO_SCRIPT="${FLOW_ROOT}/tools/bin/agent-project-run-kilo-session"
7
-
8
- help_output="$(bash "$OPENCODE_SCRIPT" --help)"
9
- grep -q 'Placeholder adapter for the roadmap' <<<"$help_output"
10
- grep -q '`opencode`' <<<"$help_output"
11
-
12
- help_output="$(bash "$KILO_SCRIPT" --help)"
13
- grep -q 'Placeholder adapter for the roadmap' <<<"$help_output"
14
- grep -q '`kilo`' <<<"$help_output"
15
-
16
- set +e
17
- opencode_output="$(bash "$OPENCODE_SCRIPT" --session demo 2>&1)"
18
- opencode_status=$?
19
- kilo_output="$(bash "$KILO_SCRIPT" --session demo 2>&1)"
20
- kilo_status=$?
21
- set -e
22
-
23
- if [[ "$opencode_status" -eq 0 ]]; then
24
- echo "expected opencode placeholder adapter to fail" >&2
25
- exit 1
26
- fi
27
-
28
- if [[ "$kilo_status" -eq 0 ]]; then
29
- echo "expected kilo placeholder adapter to fail" >&2
30
- exit 1
31
- fi
32
-
33
- grep -q 'execution is not implemented yet' <<<"$opencode_output"
34
- grep -q 'Choose codex, claude, or openclaw for live runs today.' <<<"$opencode_output"
35
- grep -q 'execution is not implemented yet' <<<"$kilo_output"
36
- grep -q 'Choose codex, claude, or openclaw for live runs today.' <<<"$kilo_output"
37
-
38
- echo "placeholder worker adapters 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
-
6
- tmpdir="$(mktemp -d)"
7
- trap 'rm -rf "$tmpdir"' EXIT
8
-
9
- skill_root="$tmpdir/skill"
10
- hooks_dir="$skill_root/hooks"
11
- tools_bin_dir="$skill_root/tools/bin"
12
- adapter_bin_dir="$skill_root/bin"
13
- assets_dir="$skill_root/assets"
14
- profile_registry_root="$tmpdir/profile-registry"
15
- profile_dir="$profile_registry_root/demo"
16
- shim_dir="$tmpdir/shim"
17
-
18
- mkdir -p "$hooks_dir" "$tools_bin_dir" "$adapter_bin_dir" "$assets_dir" "$profile_dir" "$shim_dir"
19
-
20
- cp "$FLOW_ROOT/hooks/pr-reconcile-hooks.sh" "$hooks_dir/pr-reconcile-hooks.sh"
21
- cp "$FLOW_ROOT/tools/bin/flow-config-lib.sh" "$tools_bin_dir/flow-config-lib.sh"
22
- cp "$FLOW_ROOT/tools/bin/flow-shell-lib.sh" "$tools_bin_dir/flow-shell-lib.sh"
23
-
24
- cat >"$profile_dir/control-plane.yaml" <<EOF
25
- schema_version: "1"
26
- id: "demo"
27
- repo:
28
- slug: "example/demo"
29
- root: "$tmpdir/repo"
30
- default_branch: "main"
31
- runtime:
32
- orchestrator_agent_root: "$tmpdir/agent"
33
- worktree_root: "$tmpdir/worktrees"
34
- agent_repo_root: "$tmpdir/repo"
35
- runs_root: "$tmpdir/runs"
36
- state_root: "$tmpdir/state"
37
- history_root: "$tmpdir/history"
38
- retained_repo_root: "$tmpdir/repo"
39
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
40
- session_naming:
41
- issue_prefix: "demo-issue-"
42
- pr_prefix: "demo-pr-"
43
- issue_branch_prefix: "agent/demo/issue"
44
- pr_worktree_branch_prefix: "agent/demo/pr"
45
- managed_pr_branch_globs: "agent/demo/*"
46
- execution:
47
- coding_worker: "openclaw"
48
- EOF
49
-
50
- printf '# demo skill\n' >"$skill_root/SKILL.md"
51
- printf '{}\n' >"$assets_dir/workflow-catalog.json"
52
-
53
- cat >"$adapter_bin_dir/pr-risk.sh" <<'EOF'
54
- #!/usr/bin/env bash
55
- set -euo pipefail
56
- cat <<JSON
57
- {"linkedIssueId":"42","isManagedByAgent":true}
58
- JSON
59
- EOF
60
- chmod +x "$adapter_bin_dir/pr-risk.sh"
61
-
62
- sync_invocation_file="$tmpdir/sync-invocation.txt"
63
- cat >"$tools_bin_dir/sync-recurring-issue-checklist.sh" <<'EOF'
64
- #!/usr/bin/env bash
65
- set -euo pipefail
66
- printf '%s\n' "$*" >"${TEST_SYNC_INVOCATION_FILE:?}"
67
- exit 0
68
- EOF
69
- chmod +x "$tools_bin_dir/sync-recurring-issue-checklist.sh"
70
-
71
- cat >"$tools_bin_dir/agent-github-update-labels" <<'EOF'
72
- #!/usr/bin/env bash
73
- set -euo pipefail
74
- exit 0
75
- EOF
76
- chmod +x "$tools_bin_dir/agent-github-update-labels"
77
-
78
- cat >"$tools_bin_dir/kick-scheduler.sh" <<'EOF'
79
- #!/usr/bin/env bash
80
- set -euo pipefail
81
- exit 0
82
- EOF
83
- chmod +x "$tools_bin_dir/kick-scheduler.sh"
84
-
85
- cat >"$shim_dir/gh" <<'EOF'
86
- #!/usr/bin/env bash
87
- set -euo pipefail
88
- if [[ "${1:-}" == "issue" && "${2:-}" == "view" ]]; then
89
- cat <<'JSON'
90
- {"number":42,"state":"OPEN","title":"Recurring demo issue","body":"Keep it open.","url":"https://example.test/issues/42","labels":[{"name":"agent-keep-open"}],"comments":[],"createdAt":"2026-03-28T10:00:00Z","updatedAt":"2026-03-28T10:00:00Z"}
91
- JSON
92
- exit 0
93
- fi
94
- echo "unexpected gh args: $*" >&2
95
- exit 1
96
- EOF
97
- chmod +x "$shim_dir/gh"
98
-
99
- export PATH="$shim_dir:$PATH"
100
- export ACP_PROJECT_ID="demo"
101
- export ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root"
102
- export TEST_SYNC_INVOCATION_FILE="$sync_invocation_file"
103
- source "$hooks_dir/pr-reconcile-hooks.sh"
104
-
105
- pr_after_merged 99
106
-
107
- test -f "$sync_invocation_file"
108
- grep -q -- '--repo-slug example/demo --issue-id 42' "$sync_invocation_file"
109
-
110
- echo "pr reconcile hooks recurring checklist refresh 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
- PR_RISK_BIN="${FLOW_ROOT}/bin/pr-risk.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- bin_dir="$tmpdir/bin"
11
- node_bin_dir="$(dirname "$(command -v node)")"
12
- mkdir -p "$bin_dir"
13
-
14
- cat >"$bin_dir/gh" <<'EOF'
15
- #!/usr/bin/env bash
16
- set -euo pipefail
17
-
18
- if [[ "${1:-}" == "pr" && "${2:-}" == "view" ]]; then
19
- cat <<'JSON'
20
- {"number":465,"title":"feat(mobile): align locale hydration with shared i18n contract","url":"https://example.test/pr/465","body":"Closes #422","isDraft":false,"headRefName":"codex/issue-422-mobile-align-language-selection-and-persisted-lo","baseRefName":"main","labels":[],"files":[{"path":"apps/mobile/README.md"},{"path":"apps/mobile/app/_layout.tsx"},{"path":"apps/mobile/app/settings/language.tsx"},{"path":"apps/mobile/app/settings/security.tsx"},{"path":"apps/mobile/src/components/LanguageSwitcher.tsx"},{"path":"apps/mobile/src/lib/i18n.ts"},{"path":"apps/mobile/src/lib/mobile-language-contract.ts"},{"path":"apps/mobile/src/lib/mobile-language.ts"},{"path":"apps/mobile/src/store/settings.ts"},{"path":"packages/i18n/README.md"},{"path":"packages/i18n/src/i18n.ts"}],"mergeStateStatus":"CLEAN","reviewDecision":"","reviewRequests":[],"statusCheckRollup":[],"comments":[]}
21
- JSON
22
- exit 0
23
- fi
24
-
25
- if [[ "${1:-}" == "api" ]]; then
26
- case "${2:-}" in
27
- repos/example/repo/pulls/465)
28
- printf 'abc465\n'
29
- exit 0
30
- ;;
31
- repos/example/repo/commits/abc465)
32
- printf '2026-03-16T10:30:00Z\n'
33
- exit 0
34
- ;;
35
- repos/example/repo/pulls/465/comments)
36
- printf '[]\n'
37
- exit 0
38
- ;;
39
- repos/example/repo/commits/abc465/check-runs)
40
- printf '{"check_runs":[]}\n'
41
- exit 0
42
- ;;
43
- esac
44
- fi
45
-
46
- echo "unexpected gh args: $*" >&2
47
- exit 1
48
- EOF
49
-
50
- chmod +x "$bin_dir/gh"
51
-
52
- risk_json="$(
53
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
54
- F_LOSNING_REPO_SLUG="example/repo" \
55
- bash "$PR_RISK_BIN" 465
56
- )"
57
-
58
- test "$(jq -r '.linkedIssueId' <<<"$risk_json")" = "422"
59
- test "$(jq -r '.scopeTooBroad' <<<"$risk_json")" = "false"
60
- test "$(jq -r '.mobileProductCount' <<<"$risk_json")" = "8"
61
- test "$(jq -r '.agentLane' <<<"$risk_json")" = "automerge"
62
- test "$(jq -r '.eligibleForAutoMerge' <<<"$risk_json")" = "true"
63
-
64
- if jq -e '.missingReasons[]? | select(. == "scope-too-broad")' >/dev/null <<<"$risk_json"; then
65
- echo "cohesive mobile locale PR unexpectedly blocked on scope-too-broad" >&2
66
- printf '%s\n' "$risk_json" >&2
67
- exit 1
68
- fi
69
-
70
- echo "pr-risk cohesive mobile locale scope test passed"
@@ -1,114 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- PR_RISK_BIN="${FLOW_ROOT}/bin/pr-risk.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- bin_dir="$tmpdir/bin"
11
- node_bin_dir="$(dirname "$(command -v node)")"
12
- mkdir -p "$bin_dir"
13
-
14
- cat >"$bin_dir/gh" <<'EOF'
15
- #!/usr/bin/env bash
16
- set -euo pipefail
17
-
18
- if [[ "${1:-}" == "pr" && "${2:-}" == "view" ]]; then
19
- case "${3:-}" in
20
- 601)
21
- cat <<'JSON'
22
- {"number":601,"title":"feat: queued repair label should stay informational","url":"https://example.test/pr/601","body":"","isDraft":false,"headRefName":"agent/acp/issue-601-fix-label-semantics","baseRefName":"main","labels":[{"name":"agent-repair-queued"}],"files":[{"path":"docs/auto-flow.md"}],"mergeStateStatus":"CLEAN","reviewDecision":"","reviewRequests":[],"statusCheckRollup":[],"comments":[]}
23
- JSON
24
- exit 0
25
- ;;
26
- 602)
27
- cat <<'JSON'
28
- {"number":602,"title":"feat: manual fix override should force one more pass","url":"https://example.test/pr/602","body":"","isDraft":false,"headRefName":"agent/acp/issue-602-manual-fix-override","baseRefName":"main","labels":[{"name":"agent-manual-fix-override"}],"files":[{"path":"docs/auto-flow.md"}],"mergeStateStatus":"CLEAN","reviewDecision":"","reviewRequests":[],"statusCheckRollup":[],"comments":[]}
29
- JSON
30
- exit 0
31
- ;;
32
- esac
33
- fi
34
-
35
- if [[ "${1:-}" == "api" ]]; then
36
- case "${2:-}" in
37
- repos/example/repo/pulls/601)
38
- printf 'sha601\n'
39
- exit 0
40
- ;;
41
- repos/example/repo/commits/sha601)
42
- printf '2026-03-15T20:30:00Z\n'
43
- exit 0
44
- ;;
45
- repos/example/repo/pulls/601/comments)
46
- printf '[]\n'
47
- exit 0
48
- ;;
49
- repos/example/repo/commits/sha601/check-runs)
50
- printf '{"check_runs":[]}\n'
51
- exit 0
52
- ;;
53
- repos/example/repo/pulls/602)
54
- printf 'sha602\n'
55
- exit 0
56
- ;;
57
- repos/example/repo/commits/sha602)
58
- printf '2026-03-15T20:35:00Z\n'
59
- exit 0
60
- ;;
61
- repos/example/repo/pulls/602/comments)
62
- printf '[]\n'
63
- exit 0
64
- ;;
65
- repos/example/repo/commits/sha602/check-runs)
66
- printf '{"check_runs":[]}\n'
67
- exit 0
68
- ;;
69
- esac
70
- fi
71
-
72
- echo "unexpected gh args: $*" >&2
73
- exit 1
74
- EOF
75
-
76
- chmod +x "$bin_dir/gh"
77
-
78
- queued_json="$(
79
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
80
- ACP_MANAGED_PR_BRANCH_GLOBS="agent/acp/* codex/* openclaw/*" \
81
- F_LOSNING_REPO_SLUG="example/repo" \
82
- bash "$PR_RISK_BIN" 601
83
- )"
84
-
85
- test "$(jq -r '.hasRepairQueuedLabel' <<<"$queued_json")" = "true"
86
- test "$(jq -r '.hasManualFixNeededLabel' <<<"$queued_json")" = "false"
87
- test "$(jq -r '.hasManualFixOverride' <<<"$queued_json")" = "false"
88
- test "$(jq -r '.agentLane' <<<"$queued_json")" = "automerge"
89
- test "$(jq -r '.eligibleForAutoMerge' <<<"$queued_json")" = "true"
90
- if jq -e '.missingReasons[]? | select(. == "manual-fix-override")' >/dev/null <<<"$queued_json"; then
91
- echo "queued repair label unexpectedly acted like a manual override" >&2
92
- printf '%s\n' "$queued_json" >&2
93
- exit 1
94
- fi
95
-
96
- manual_json="$(
97
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
98
- ACP_MANAGED_PR_BRANCH_GLOBS="agent/acp/* codex/* openclaw/*" \
99
- F_LOSNING_REPO_SLUG="example/repo" \
100
- bash "$PR_RISK_BIN" 602
101
- )"
102
-
103
- test "$(jq -r '.hasRepairQueuedLabel' <<<"$manual_json")" = "false"
104
- test "$(jq -r '.hasManualFixNeededLabel' <<<"$manual_json")" = "false"
105
- test "$(jq -r '.hasManualFixOverrideLabel' <<<"$manual_json")" = "true"
106
- test "$(jq -r '.hasManualFixOverride' <<<"$manual_json")" = "true"
107
- test "$(jq -r '.agentLane' <<<"$manual_json")" = "fix"
108
- if ! jq -e '.missingReasons[]? | select(. == "manual-fix-override")' >/dev/null <<<"$manual_json"; then
109
- echo "manual fix override label did not force the fix lane" >&2
110
- printf '%s\n' "$manual_json" >&2
111
- exit 1
112
- fi
113
-
114
- echo "pr-risk fix label semantics 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
- PR_RISK_BIN="${FLOW_ROOT}/bin/pr-risk.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- bin_dir="$tmpdir/bin"
11
- node_bin_dir="$(dirname "$(command -v node)")"
12
- mkdir -p "$bin_dir"
13
-
14
- cat >"$bin_dir/gh" <<'EOF'
15
- #!/usr/bin/env bash
16
- set -euo pipefail
17
-
18
- if [[ "${1:-}" == "pr" && "${2:-}" == "view" ]]; then
19
- cat <<'JSON'
20
- {"number":501,"title":"docs: clarify local-first PR automation","url":"https://example.test/pr/501","body":"","isDraft":false,"headRefName":"codex/issue-501-local-first","baseRefName":"main","labels":[],"files":[{"path":"docs/auto-flow.md"}],"mergeStateStatus":"CLEAN","reviewDecision":"","reviewRequests":[],"statusCheckRollup":[],"comments":[]}
21
- JSON
22
- exit 0
23
- fi
24
-
25
- if [[ "${1:-}" == "api" ]]; then
26
- case "${2:-}" in
27
- repos/example/repo/pulls/501)
28
- printf 'abc123\n'
29
- exit 0
30
- ;;
31
- repos/example/repo/commits/abc123)
32
- printf '2026-03-15T20:30:00Z\n'
33
- exit 0
34
- ;;
35
- repos/example/repo/pulls/501/comments)
36
- printf '[]\n'
37
- exit 0
38
- ;;
39
- repos/example/repo/commits/abc123/check-runs)
40
- printf '{"check_runs":[]}\n'
41
- exit 0
42
- ;;
43
- esac
44
- fi
45
-
46
- echo "unexpected gh args: $*" >&2
47
- exit 1
48
- EOF
49
-
50
- chmod +x "$bin_dir/gh"
51
-
52
- risk_json="$(
53
- PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
54
- F_LOSNING_REPO_SLUG="example/repo" \
55
- bash "$PR_RISK_BIN" 501
56
- )"
57
-
58
- test "$(jq -r '.isManagedByAgent' <<<"$risk_json")" = "true"
59
- test "$(jq -r '.linkedIssueId' <<<"$risk_json")" = "501"
60
- test "$(jq -r '.noChecksReported' <<<"$risk_json")" = "true"
61
- test "$(jq -r '.agentLane' <<<"$risk_json")" = "automerge"
62
- test "$(jq -r '.eligibleForAutoMerge' <<<"$risk_json")" = "true"
63
-
64
- if jq -e '.missingReasons[]? | select(. == "no-checks-reported")' >/dev/null <<<"$risk_json"; then
65
- echo "managed local-first PR unexpectedly blocked on missing GitHub checks" >&2
66
- printf '%s\n' "$risk_json" >&2
67
- exit 1
68
- fi
69
-
70
- echo "pr-risk local-first no-checks test passed"
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- PREPARE_BIN="${FLOW_ROOT}/tools/bin/prepare-worktree.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- profile_registry_root="$tmpdir/profiles"
11
- profile_dir="$profile_registry_root/demo"
12
- repo_root="$tmpdir/repo"
13
- worktree_root="$tmpdir/worktree"
14
-
15
- mkdir -p "$profile_dir" "$repo_root/node_modules"
16
- mkdir -p "$worktree_root"
17
-
18
- cat >"$repo_root/package.json" <<'EOF'
19
- {
20
- "name": "demo-repo",
21
- "private": true
22
- }
23
- EOF
24
-
25
- git -C "$repo_root" init -b main >/dev/null 2>&1
26
- git -C "$repo_root" config user.name "Codex"
27
- git -C "$repo_root" config user.email "codex@example.com"
28
- git -C "$worktree_root" init -b main >/dev/null 2>&1
29
- git -C "$worktree_root" config user.name "Codex"
30
- git -C "$worktree_root" config user.email "codex@example.com"
31
-
32
- cat >"$profile_dir/control-plane.yaml" <<EOF
33
- schema_version: "1"
34
- id: "demo"
35
- repo:
36
- slug: "example/demo"
37
- root: "$repo_root"
38
- default_branch: "main"
39
- runtime:
40
- orchestrator_agent_root: "$tmpdir/runtime/demo"
41
- worktree_root: "$tmpdir/worktrees"
42
- agent_repo_root: "$repo_root"
43
- runs_root: "$tmpdir/runtime/demo/runs"
44
- state_root: "$tmpdir/runtime/demo/state"
45
- history_root: "$tmpdir/runtime/demo/history"
46
- retained_repo_root: "$repo_root"
47
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
48
- execution:
49
- coding_worker: "openclaw"
50
- openclaw:
51
- model: "primary/model"
52
- thinking: "adaptive"
53
- timeout_seconds: 900
54
- EOF
55
-
56
- output="$(
57
- ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
58
- ACP_PROJECT_ID=demo \
59
- ACP_SYNC_DEPENDENCY_BASELINE_SCRIPT=/nonexistent \
60
- bash "$PREPARE_BIN" "$worktree_root"
61
- )"
62
-
63
- grep -q "^WORKTREE=${worktree_root}\$" <<<"$output"
64
- grep -q "^SANDBOX_ARTIFACT_DIR=${worktree_root}/.openclaw-artifacts\$" <<<"$output"
65
- test -L "$worktree_root/node_modules"
66
-
67
- echo "prepare worktree simple repo baseline test passed"
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SCRIPT="${FLOW_ROOT}/tools/bin/profile-activate.sh"
6
- SCAFFOLD_SCRIPT="${FLOW_ROOT}/tools/bin/scaffold-profile.sh"
7
-
8
- tmpdir="$(mktemp -d)"
9
- trap 'rm -rf "$tmpdir"' EXIT
10
-
11
- profile_home="$tmpdir/profiles"
12
-
13
- bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id demo --repo-slug example/demo-platform >/dev/null
14
- profile_notes_real="$(cd "$profile_home/demo" && pwd -P)/README.md"
15
-
16
- output="$(ACP_PROFILE_REGISTRY_ROOT="$profile_home" bash "$SCRIPT" --profile-id demo)"
17
-
18
- grep -q '^PROFILE_ID=demo$' <<<"$output"
19
- grep -q "^PROFILE_REGISTRY_ROOT=${profile_home}$" <<<"$output"
20
- grep -q "^CONFIG_YAML=${profile_home}/demo/control-plane.yaml$" <<<"$output"
21
- grep -q "^PROFILE_NOTES=${profile_notes_real}$" <<<"$output"
22
- grep -q '^REPO_SLUG=example/demo-platform$' <<<"$output"
23
- grep -q '^CODING_WORKER=openclaw$' <<<"$output"
24
- printf -v expected_next_step 'NEXT_STEP=eval "$(%s/tools/bin/profile-activate.sh --profile-id demo --exports)"' "${FLOW_ROOT}"
25
- grep -Fqx "$expected_next_step" <<<"$output"
26
-
27
- exports_out="$(ACP_PROFILE_REGISTRY_ROOT="$profile_home" bash "$SCRIPT" --profile-id demo --exports)"
28
- grep -q '^export ACP_PROJECT_ID=demo$' <<<"$exports_out"
29
- grep -q '^export AGENT_PROJECT_ID=demo$' <<<"$exports_out"
30
- grep -q "^export ACP_PROFILE_REGISTRY_ROOT=${profile_home}$" <<<"$exports_out"
31
- grep -q "^export ACP_CONFIG=${profile_home}/demo/control-plane.yaml$" <<<"$exports_out"
32
-
33
- echo "profile activate test passed"