agent-control-plane 0.7.0 → 0.8.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.
@@ -1,109 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
- SCRIPT_PATH="${SCRIPT_DIR}/profile-activate.sh"
6
- # shellcheck source=/dev/null
7
- source "${SCRIPT_DIR}/flow-config-lib.sh"
8
-
9
- usage() {
10
- cat <<'EOF'
11
- Usage:
12
- profile-activate.sh --profile-id <id> [--exports]
13
-
14
- Print the selected profile context or shell export statements for quickly
15
- switching operator commands to a specific installed profile.
16
- EOF
17
- }
18
-
19
- profile_id=""
20
- exports_only="0"
21
-
22
- while [[ $# -gt 0 ]]; do
23
- case "$1" in
24
- --profile-id) profile_id="${2:-}"; shift 2 ;;
25
- --exports) exports_only="1"; shift ;;
26
- --help|-h) usage; exit 0 ;;
27
- *) echo "Unknown argument: $1" >&2; usage >&2; exit 1 ;;
28
- esac
29
- done
30
-
31
- if [[ -z "${profile_id}" ]]; then
32
- usage >&2
33
- exit 1
34
- fi
35
-
36
- FLOW_SKILL_DIR="$(resolve_flow_skill_dir "${BASH_SOURCE[0]}")"
37
- PROFILE_REGISTRY_ROOT="$(resolve_flow_profile_registry_root)"
38
- CONFIG_YAML="$(flow_find_profile_dir_by_id "${FLOW_SKILL_DIR}" "${profile_id}")/control-plane.yaml"
39
- PROFILE_NOTES="$(flow_resolve_profile_notes_file "${CONFIG_YAML}")"
40
- AVAILABLE_PROFILES="$(flow_list_profile_ids "${FLOW_SKILL_DIR}" | paste -sd, -)"
41
-
42
- if [[ ! -f "${CONFIG_YAML}" ]]; then
43
- echo "unknown profile id: ${profile_id}" >&2
44
- echo "AVAILABLE_PROFILES=${AVAILABLE_PROFILES}" >&2
45
- exit 1
46
- fi
47
-
48
- export ACP_PROJECT_ID="${profile_id}"
49
- export AGENT_PROJECT_ID="${profile_id}"
50
- flow_export_execution_env "${CONFIG_YAML}"
51
-
52
- REPO_SLUG="$(flow_resolve_repo_slug "${CONFIG_YAML}")"
53
- REPO_ROOT="$(flow_resolve_repo_root "${CONFIG_YAML}")"
54
- AGENT_ROOT="$(flow_resolve_agent_root "${CONFIG_YAML}")"
55
- AGENT_REPO_ROOT="$(flow_resolve_agent_repo_root "${CONFIG_YAML}")"
56
- WORKTREE_ROOT="$(flow_resolve_worktree_root "${CONFIG_YAML}")"
57
- RUNS_ROOT="$(flow_resolve_runs_root "${CONFIG_YAML}")"
58
- STATE_ROOT="$(flow_resolve_state_root "${CONFIG_YAML}")"
59
- CODING_WORKER="${ACP_CODING_WORKER:-codex}"
60
- ACTIVE_PROVIDER_POOL_NAME="${ACP_ACTIVE_PROVIDER_POOL_NAME:-}"
61
-
62
- if [[ "${exports_only}" == "1" ]]; then
63
- printf 'export ACP_PROJECT_ID=%q
64
- ' "${profile_id}"
65
- printf 'export AGENT_PROJECT_ID=%q
66
- ' "${profile_id}"
67
- printf 'export ACP_PROFILE_REGISTRY_ROOT=%q
68
- ' "${PROFILE_REGISTRY_ROOT}"
69
- printf 'export ACP_CONFIG=%q
70
- ' "${CONFIG_YAML}"
71
- printf 'export ACP_PROFILE_NOTES=%q
72
- ' "${PROFILE_NOTES}"
73
- printf 'export ACP_PROFILE_REPO_ROOT=%q
74
- ' "${REPO_ROOT}"
75
- printf 'export ACP_PROFILE_AGENT_ROOT=%q
76
- ' "${AGENT_ROOT}"
77
- exit 0
78
- fi
79
-
80
- printf 'PROFILE_ID=%s
81
- ' "${profile_id}"
82
- printf 'PROFILE_REGISTRY_ROOT=%s
83
- ' "${PROFILE_REGISTRY_ROOT}"
84
- printf 'CONFIG_YAML=%s
85
- ' "${CONFIG_YAML}"
86
- printf 'PROFILE_NOTES=%s
87
- ' "${PROFILE_NOTES}"
88
- printf 'AVAILABLE_PROFILES=%s
89
- ' "${AVAILABLE_PROFILES}"
90
- printf 'REPO_SLUG=%s
91
- ' "${REPO_SLUG}"
92
- printf 'REPO_ROOT=%s
93
- ' "${REPO_ROOT}"
94
- printf 'AGENT_ROOT=%s
95
- ' "${AGENT_ROOT}"
96
- printf 'AGENT_REPO_ROOT=%s
97
- ' "${AGENT_REPO_ROOT}"
98
- printf 'WORKTREE_ROOT=%s
99
- ' "${WORKTREE_ROOT}"
100
- printf 'RUNS_ROOT=%s
101
- ' "${RUNS_ROOT}"
102
- printf 'STATE_ROOT=%s
103
- ' "${STATE_ROOT}"
104
- printf 'CODING_WORKER=%s
105
- ' "${CODING_WORKER}"
106
- printf 'ACTIVE_PROVIDER_POOL_NAME=%s
107
- ' "${ACTIVE_PROVIDER_POOL_NAME}"
108
- printf 'NEXT_STEP=eval "$(%s --profile-id %s --exports)"
109
- ' "${SCRIPT_PATH}" "${profile_id}"
@@ -1,225 +0,0 @@
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
- profile-adopt.sh [--profile-id <id>] [options]
12
-
13
- Prepare an available profile for real scheduler use by creating runtime roots,
14
- seeding the agent anchor repo when possible, syncing the VS Code workspace file,
15
- and copying the selected installed profile into the runtime root for quick
16
- operator access.
17
-
18
- Options:
19
- --profile-id <id> Profile id to adopt
20
- --source-repo-root <path> Optional source repo used when seeding the agent repo
21
- --skip-anchor-sync Do not run sync-agent-repo.sh
22
- --skip-workspace-sync Do not run sync-vscode-workspace.sh
23
- --allow-missing-repo Continue when canonical/source repos are missing
24
- --help Show this help
25
- EOF
26
- }
27
-
28
- profile_id_override=""
29
- source_repo_root_override=""
30
- skip_anchor_sync="0"
31
- skip_workspace_sync="0"
32
- allow_missing_repo="0"
33
-
34
- while [[ $# -gt 0 ]]; do
35
- case "$1" in
36
- --profile-id) profile_id_override="${2:-}"; shift 2 ;;
37
- --source-repo-root) source_repo_root_override="${2:-}"; shift 2 ;;
38
- --skip-anchor-sync) skip_anchor_sync="1"; shift ;;
39
- --skip-workspace-sync) skip_workspace_sync="1"; shift ;;
40
- --allow-missing-repo) allow_missing_repo="1"; shift ;;
41
- --help|-h) usage; exit 0 ;;
42
- *) echo "Unknown argument: $1" >&2; usage >&2; exit 1 ;;
43
- esac
44
- done
45
-
46
- if [[ -n "$profile_id_override" ]]; then
47
- export ACP_PROJECT_ID="$profile_id_override"
48
- export AGENT_PROJECT_ID="$profile_id_override"
49
- fi
50
-
51
- FLOW_SKILL_DIR="$(resolve_flow_skill_dir "${BASH_SOURCE[0]}")"
52
- CONFIG_YAML="$(resolve_flow_config_yaml "${BASH_SOURCE[0]}")"
53
- PROFILE_ID="$(flow_resolve_adapter_id "${CONFIG_YAML}")"
54
- PROFILE_REGISTRY_ROOT="$(resolve_flow_profile_registry_root)"
55
- if [[ ! -f "${CONFIG_YAML}" ]]; then
56
- echo "[profile-adopt] missing installed profile config: ${CONFIG_YAML}" >&2
57
- exit 1
58
- fi
59
-
60
- REPO_SLUG="$(flow_resolve_repo_slug "${CONFIG_YAML}")"
61
- DEFAULT_BRANCH="$(flow_resolve_default_branch "${CONFIG_YAML}")"
62
- PROJECT_LABEL="$(flow_resolve_project_label "${CONFIG_YAML}")"
63
- REPO_ROOT="$(flow_resolve_repo_root "${CONFIG_YAML}")"
64
- AGENT_REPO_ROOT="$(flow_resolve_agent_repo_root "${CONFIG_YAML}")"
65
- AGENT_ROOT="$(flow_resolve_agent_root "${CONFIG_YAML}")"
66
- RUNS_ROOT="$(flow_resolve_runs_root "${CONFIG_YAML}")"
67
- STATE_ROOT="$(flow_resolve_state_root "${CONFIG_YAML}")"
68
- HISTORY_ROOT="$(flow_resolve_history_root "${CONFIG_YAML}")"
69
- WORKTREE_ROOT="$(flow_resolve_worktree_root "${CONFIG_YAML}")"
70
- RETAINED_REPO_ROOT="$(flow_resolve_retained_repo_root "${CONFIG_YAML}")"
71
- VSCODE_WORKSPACE_FILE="$(flow_resolve_vscode_workspace_file "${CONFIG_YAML}")"
72
- REMOTE_NAME="${ACP_REMOTE_NAME:-origin}"
73
- SOURCE_REPO_ROOT="${source_repo_root_override:-${ACP_SOURCE_REPO_ROOT:-${RETAINED_REPO_ROOT}}}"
74
- PROFILE_LINK="${AGENT_ROOT}/control-plane.yaml"
75
- WORKSPACE_LINK="${AGENT_ROOT}/workspace.code-workspace"
76
- INSTALLED_PROFILE_DIR="$(dirname "${CONFIG_YAML}")"
77
- FLOW_TOOLS_DIR="${FLOW_SKILL_DIR}/tools/bin"
78
- PROFILE_SMOKE_SCRIPT="${FLOW_TOOLS_DIR}/profile-smoke.sh"
79
- SYNC_AGENT_REPO_SCRIPT="${FLOW_TOOLS_DIR}/sync-agent-repo.sh"
80
- SYNC_VSCODE_WORKSPACE_SCRIPT="${FLOW_TOOLS_DIR}/sync-vscode-workspace.sh"
81
-
82
- canonical_copy_source() {
83
- local target_path="${1:-}"
84
- local target_dir=""
85
- local target_name=""
86
-
87
- [[ -n "$target_path" ]] || return 1
88
- target_dir="$(dirname "$target_path")"
89
- target_name="$(basename "$target_path")"
90
- target_dir="$(cd "$target_dir" && pwd -P)"
91
- printf '%s/%s\n' "$target_dir" "$target_name"
92
- }
93
-
94
- path_status() {
95
- local path="${1:-}"
96
- if [[ -z "$path" ]]; then
97
- printf 'missing\n'
98
- elif [[ -d "$path/.git" || -f "$path/.git" ]]; then
99
- printf 'git\n'
100
- elif [[ -e "$path" ]]; then
101
- printf 'exists\n'
102
- else
103
- printf 'missing\n'
104
- fi
105
- }
106
-
107
- repo_has_remote() {
108
- local repo_root="${1:-}"
109
- local remote_name="${2:-origin}"
110
- [[ -n "$repo_root" ]] || return 1
111
- [[ -d "$repo_root/.git" || -f "$repo_root/.git" ]] || return 1
112
- git -C "$repo_root" remote get-url "$remote_name" >/dev/null 2>&1
113
- }
114
-
115
- if ! smoke_output="$(ACP_PROJECT_ID="$PROFILE_ID" bash "$PROFILE_SMOKE_SCRIPT" --profile-id "$PROFILE_ID" 2>&1)"; then
116
- printf '%s\n' "$smoke_output" >&2
117
- exit 1
118
- fi
119
-
120
- mkdir -p "$AGENT_ROOT" "$RUNS_ROOT" "$STATE_ROOT" "$HISTORY_ROOT" "$WORKTREE_ROOT" "$(dirname "$VSCODE_WORKSPACE_FILE")"
121
- copy_file_into_runtime() {
122
- local source_file="${1:?source file required}"
123
- local target_file="${2:?target file required}"
124
- mkdir -p "$(dirname "$target_file")"
125
- if [[ -L "$target_file" || -f "$target_file" ]]; then
126
- rm -f "$target_file"
127
- elif [[ -d "$target_file" ]]; then
128
- rm -rf "$target_file"
129
- fi
130
- cp "$source_file" "$target_file"
131
- }
132
-
133
- copy_file_into_runtime "$(canonical_copy_source "$CONFIG_YAML")" "$PROFILE_LINK"
134
-
135
- warnings=0
136
- anchor_sync_status="skipped"
137
- workspace_sync_status="skipped"
138
-
139
- canonical_repo_status="$(path_status "$REPO_ROOT")"
140
- source_repo_status="$(path_status "$SOURCE_REPO_ROOT")"
141
- agent_repo_status_before="$(path_status "$AGENT_REPO_ROOT")"
142
-
143
- if [[ "$skip_anchor_sync" == "1" ]]; then
144
- anchor_sync_status="skipped"
145
- else
146
- if repo_has_remote "$REPO_ROOT" "$REMOTE_NAME" || repo_has_remote "$SOURCE_REPO_ROOT" "$REMOTE_NAME"; then
147
- ACP_PROJECT_ID="$PROFILE_ID" \
148
- ACP_REPO_ROOT="$REPO_ROOT" \
149
- ACP_AGENT_REPO_ROOT="$AGENT_REPO_ROOT" \
150
- ACP_RETAINED_REPO_ROOT="$RETAINED_REPO_ROOT" \
151
- ACP_SOURCE_REPO_ROOT="$SOURCE_REPO_ROOT" \
152
- ACP_DEFAULT_BRANCH="$DEFAULT_BRANCH" \
153
- ACP_REMOTE_NAME="$REMOTE_NAME" \
154
- bash "$SYNC_AGENT_REPO_SCRIPT" >/dev/null
155
- anchor_sync_status="ok"
156
- elif [[ "$allow_missing_repo" == "1" ]]; then
157
- anchor_sync_status="skipped-missing-repo"
158
- warnings=$((warnings + 1))
159
- else
160
- echo "[profile-adopt] no Git source with remote '${REMOTE_NAME}' for profile ${PROFILE_ID}" >&2
161
- exit 1
162
- fi
163
- fi
164
-
165
- if [[ "$skip_workspace_sync" == "1" ]]; then
166
- workspace_sync_status="skipped"
167
- else
168
- ACP_PROJECT_ID="$PROFILE_ID" \
169
- ACP_REPO_ROOT="$REPO_ROOT" \
170
- ACP_AGENT_REPO_ROOT="$AGENT_REPO_ROOT" \
171
- ACP_RETAINED_REPO_ROOT="$RETAINED_REPO_ROOT" \
172
- ACP_VSCODE_WORKSPACE_FILE="$VSCODE_WORKSPACE_FILE" \
173
- ACP_DEFAULT_BRANCH="$DEFAULT_BRANCH" \
174
- bash "$SYNC_VSCODE_WORKSPACE_SCRIPT" >/dev/null
175
- workspace_sync_status="ok"
176
- fi
177
-
178
- if [[ -f "$VSCODE_WORKSPACE_FILE" ]]; then
179
- copy_file_into_runtime "$(canonical_copy_source "$VSCODE_WORKSPACE_FILE")" "$WORKSPACE_LINK"
180
- else
181
- rm -f "$WORKSPACE_LINK"
182
- fi
183
-
184
- # Keep the configured anchor root materialized even when anchor sync is skipped
185
- # so later setup/runtime steps can rely on the path existing.
186
- if [[ "$anchor_sync_status" != "ok" && ! -e "$AGENT_REPO_ROOT" ]]; then
187
- mkdir -p "$AGENT_REPO_ROOT"
188
- fi
189
-
190
- agent_repo_status_after="$(path_status "$AGENT_REPO_ROOT")"
191
- workspace_file_status="$(path_status "$VSCODE_WORKSPACE_FILE")"
192
- adopt_status="ok"
193
- if (( warnings > 0 )); then
194
- adopt_status="ok-with-warnings"
195
- fi
196
-
197
- printf 'PROFILE_ID=%s\n' "$PROFILE_ID"
198
- printf 'PROJECT_LABEL=%s\n' "$PROJECT_LABEL"
199
- printf 'PROFILE_REGISTRY_ROOT=%s\n' "$PROFILE_REGISTRY_ROOT"
200
- printf 'INSTALLED_PROFILE_DIR=%s\n' "$INSTALLED_PROFILE_DIR"
201
- printf 'CONFIG_YAML=%s\n' "$CONFIG_YAML"
202
- printf 'REPO_SLUG=%s\n' "$REPO_SLUG"
203
- printf 'DEFAULT_BRANCH=%s\n' "$DEFAULT_BRANCH"
204
- printf 'REMOTE_NAME=%s\n' "$REMOTE_NAME"
205
- printf 'REPO_ROOT=%s\n' "$REPO_ROOT"
206
- printf 'SOURCE_REPO_ROOT=%s\n' "$SOURCE_REPO_ROOT"
207
- printf 'AGENT_REPO_ROOT=%s\n' "$AGENT_REPO_ROOT"
208
- printf 'AGENT_ROOT=%s\n' "$AGENT_ROOT"
209
- printf 'RUNS_ROOT=%s\n' "$RUNS_ROOT"
210
- printf 'STATE_ROOT=%s\n' "$STATE_ROOT"
211
- printf 'HISTORY_ROOT=%s\n' "$HISTORY_ROOT"
212
- printf 'WORKTREE_ROOT=%s\n' "$WORKTREE_ROOT"
213
- printf 'VSCODE_WORKSPACE_FILE=%s\n' "$VSCODE_WORKSPACE_FILE"
214
- printf 'PROFILE_LINK=%s\n' "$PROFILE_LINK"
215
- printf 'WORKSPACE_LINK=%s\n' "$WORKSPACE_LINK"
216
- printf 'CANONICAL_REPO_STATUS=%s\n' "$canonical_repo_status"
217
- printf 'SOURCE_REPO_STATUS=%s\n' "$source_repo_status"
218
- printf 'AGENT_REPO_STATUS_BEFORE=%s\n' "$agent_repo_status_before"
219
- printf 'AGENT_REPO_STATUS_AFTER=%s\n' "$agent_repo_status_after"
220
- printf 'WORKSPACE_FILE_STATUS=%s\n' "$workspace_file_status"
221
- printf 'PROFILE_SMOKE_STATUS=ok\n'
222
- printf 'ANCHOR_SYNC_STATUS=%s\n' "$anchor_sync_status"
223
- printf 'WORKSPACE_SYNC_STATUS=%s\n' "$workspace_sync_status"
224
- printf 'WARNING_COUNT=%s\n' "$warnings"
225
- printf 'ADOPT_STATUS=%s\n' "$adopt_status"