agent-army 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.
- package/README.md +162 -0
- package/dist/adapters/api-adapter.d.ts +76 -0
- package/dist/adapters/api-adapter.js +251 -0
- package/dist/adapters/api-adapter.js.map +1 -0
- package/dist/adapters/cli-adapter.d.ts +15 -0
- package/dist/adapters/cli-adapter.js +207 -0
- package/dist/adapters/cli-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.js +32 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.js +14 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.js +83 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.js +13 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +7 -0
- package/dist/commands/destroy.js +13 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +538 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.js +42 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/ssh.d.ts +9 -0
- package/dist/commands/ssh.js +101 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +13 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.js +13 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/lib/config.d.ts +66 -0
- package/dist/lib/config.js +239 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +147 -0
- package/dist/lib/constants.js +307 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/exec.d.ts +22 -0
- package/dist/lib/exec.js +60 -0
- package/dist/lib/exec.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +8 -0
- package/dist/lib/prerequisites.js +124 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +18 -0
- package/dist/lib/process.js +37 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/pulumi.d.ts +39 -0
- package/dist/lib/pulumi.js +87 -0
- package/dist/lib/pulumi.js.map +1 -0
- package/dist/lib/tailscale.d.ts +24 -0
- package/dist/lib/tailscale.js +71 -0
- package/dist/lib/tailscale.js.map +1 -0
- package/dist/lib/ui.d.ts +27 -0
- package/dist/lib/ui.js +89 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/tools/deploy.d.ts +16 -0
- package/dist/tools/deploy.js +133 -0
- package/dist/tools/deploy.js.map +1 -0
- package/dist/tools/destroy.d.ts +16 -0
- package/dist/tools/destroy.js +186 -0
- package/dist/tools/destroy.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.js +28 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/status.d.ts +16 -0
- package/dist/tools/status.js +213 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/validate.d.ts +16 -0
- package/dist/tools/validate.js +215 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Constants, preset definitions, aliases, and defaults
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KEY_INSTRUCTIONS = exports.MODEL_PROVIDERS = exports.CONFIG_DIR = exports.MANIFEST_FILE = exports.HETZNER_COST_ESTIMATES = exports.COST_ESTIMATES = exports.SSH_USER = exports.HETZNER_US_LOCATIONS = exports.HETZNER_SERVER_TYPES_US = exports.HETZNER_SERVER_TYPES_EU = exports.INSTANCE_TYPES = exports.HETZNER_LOCATIONS = exports.AWS_REGIONS = exports.PROVIDERS = exports.AGENT_ALIASES = exports.PRESETS = void 0;
|
|
7
|
+
exports.hetznerServerTypes = hetznerServerTypes;
|
|
8
|
+
exports.tailscaleHostname = tailscaleHostname;
|
|
9
|
+
exports.slackAppManifest = slackAppManifest;
|
|
10
|
+
/** Available preset agents */
|
|
11
|
+
exports.PRESETS = {
|
|
12
|
+
pm: {
|
|
13
|
+
name: "agent-pm",
|
|
14
|
+
displayName: "Juno",
|
|
15
|
+
role: "pm",
|
|
16
|
+
preset: "pm",
|
|
17
|
+
volumeSize: 30,
|
|
18
|
+
description: "Break down tickets, research, plan and sequence work, track progress, unblock teams",
|
|
19
|
+
},
|
|
20
|
+
eng: {
|
|
21
|
+
name: "agent-eng",
|
|
22
|
+
displayName: "Titus",
|
|
23
|
+
role: "eng",
|
|
24
|
+
preset: "eng",
|
|
25
|
+
volumeSize: 50,
|
|
26
|
+
description: "Lead engineering, coding, shipping",
|
|
27
|
+
},
|
|
28
|
+
tester: {
|
|
29
|
+
name: "agent-tester",
|
|
30
|
+
displayName: "Scout",
|
|
31
|
+
role: "tester",
|
|
32
|
+
preset: "tester",
|
|
33
|
+
volumeSize: 30,
|
|
34
|
+
description: "Quality assurance, verification, bug hunting",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/** Map agent aliases to role keys */
|
|
38
|
+
exports.AGENT_ALIASES = {
|
|
39
|
+
juno: "pm",
|
|
40
|
+
titus: "eng",
|
|
41
|
+
scout: "tester",
|
|
42
|
+
};
|
|
43
|
+
/** Available cloud providers */
|
|
44
|
+
exports.PROVIDERS = [
|
|
45
|
+
{ value: "aws", label: "AWS", hint: "Amazon Web Services EC2 instances" },
|
|
46
|
+
{ value: "hetzner", label: "Hetzner", hint: "Hetzner Cloud servers (EU/US)" },
|
|
47
|
+
];
|
|
48
|
+
/** Common AWS regions for selection */
|
|
49
|
+
exports.AWS_REGIONS = [
|
|
50
|
+
{ value: "us-east-1", label: "US East (N. Virginia)" },
|
|
51
|
+
{ value: "us-east-2", label: "US East (Ohio)" },
|
|
52
|
+
{ value: "us-west-2", label: "US West (Oregon)" },
|
|
53
|
+
{ value: "eu-west-1", label: "EU (Ireland)" },
|
|
54
|
+
{ value: "eu-central-1", label: "EU (Frankfurt)" },
|
|
55
|
+
{ value: "ap-southeast-1", label: "Asia Pacific (Singapore)" },
|
|
56
|
+
{ value: "ap-northeast-1", label: "Asia Pacific (Tokyo)" },
|
|
57
|
+
];
|
|
58
|
+
/** Hetzner Cloud locations */
|
|
59
|
+
exports.HETZNER_LOCATIONS = [
|
|
60
|
+
{ value: "fsn1", label: "Falkenstein, DE (fsn1)" },
|
|
61
|
+
{ value: "nbg1", label: "Nuremberg, DE (nbg1)" },
|
|
62
|
+
{ value: "hel1", label: "Helsinki, FI (hel1)" },
|
|
63
|
+
{ value: "ash", label: "Ashburn, US (ash)" },
|
|
64
|
+
];
|
|
65
|
+
/** Instance type options (AWS) */
|
|
66
|
+
exports.INSTANCE_TYPES = [
|
|
67
|
+
{ value: "t3.small", label: "t3.small — 2 vCPU, 2 GB (~$15/mo)" },
|
|
68
|
+
{ value: "t3.medium", label: "t3.medium — 2 vCPU, 4 GB (~$30/mo)" },
|
|
69
|
+
{ value: "t3.large", label: "t3.large — 2 vCPU, 8 GB (~$60/mo)" },
|
|
70
|
+
];
|
|
71
|
+
/** Hetzner server types — EU locations (cx shared vCPU) */
|
|
72
|
+
exports.HETZNER_SERVER_TYPES_EU = [
|
|
73
|
+
{ value: "cx22", label: "cx22 — 2 vCPU, 4 GB (~$4/mo)" },
|
|
74
|
+
{ value: "cx32", label: "cx32 — 4 vCPU, 8 GB (~$7/mo)" },
|
|
75
|
+
{ value: "cx42", label: "cx42 — 8 vCPU, 16 GB (~$14/mo)" },
|
|
76
|
+
];
|
|
77
|
+
/** Hetzner server types — US locations (cpx shared vCPU, cx not available) */
|
|
78
|
+
exports.HETZNER_SERVER_TYPES_US = [
|
|
79
|
+
{ value: "cpx21", label: "cpx21 — 3 vCPU, 4 GB (~$5/mo)" },
|
|
80
|
+
{ value: "cpx31", label: "cpx31 — 4 vCPU, 8 GB (~$9/mo)" },
|
|
81
|
+
{ value: "cpx41", label: "cpx41 — 8 vCPU, 16 GB (~$16/mo)" },
|
|
82
|
+
];
|
|
83
|
+
/** US Hetzner locations (cx types not available) */
|
|
84
|
+
exports.HETZNER_US_LOCATIONS = ["ash", "hil"];
|
|
85
|
+
/** Get server type options for a Hetzner location */
|
|
86
|
+
function hetznerServerTypes(location) {
|
|
87
|
+
return exports.HETZNER_US_LOCATIONS.includes(location)
|
|
88
|
+
? exports.HETZNER_SERVER_TYPES_US
|
|
89
|
+
: exports.HETZNER_SERVER_TYPES_EU;
|
|
90
|
+
}
|
|
91
|
+
/** Default SSH user for agent instances (Ubuntu 24.04 AMI default) */
|
|
92
|
+
exports.SSH_USER = "ubuntu";
|
|
93
|
+
/** Estimated monthly cost per instance type (AWS) */
|
|
94
|
+
exports.COST_ESTIMATES = {
|
|
95
|
+
"t3.small": 15,
|
|
96
|
+
"t3.medium": 30,
|
|
97
|
+
"t3.large": 60,
|
|
98
|
+
};
|
|
99
|
+
/** Estimated monthly cost per server type (Hetzner) */
|
|
100
|
+
exports.HETZNER_COST_ESTIMATES = {
|
|
101
|
+
cx22: 4,
|
|
102
|
+
cx32: 7,
|
|
103
|
+
cx42: 14,
|
|
104
|
+
cpx21: 5,
|
|
105
|
+
cpx31: 9,
|
|
106
|
+
cpx41: 16,
|
|
107
|
+
};
|
|
108
|
+
/** Manifest filename */
|
|
109
|
+
exports.MANIFEST_FILE = "agent-army.json";
|
|
110
|
+
/** Config directory under home (~/.agent-army/configs/) */
|
|
111
|
+
exports.CONFIG_DIR = ".agent-army/configs";
|
|
112
|
+
/**
|
|
113
|
+
* Supported model providers with their API key prefixes and available models
|
|
114
|
+
*/
|
|
115
|
+
exports.MODEL_PROVIDERS = {
|
|
116
|
+
anthropic: {
|
|
117
|
+
name: "Anthropic",
|
|
118
|
+
envVar: "ANTHROPIC_API_KEY",
|
|
119
|
+
keyPrefix: "sk-ant-",
|
|
120
|
+
models: [
|
|
121
|
+
{ value: "anthropic/claude-opus-4-6", label: "Claude Opus 4.6 (Recommended)" },
|
|
122
|
+
{ value: "anthropic/claude-sonnet-4-5", label: "Claude Sonnet 4.5" },
|
|
123
|
+
{ value: "anthropic/claude-haiku-4-5", label: "Claude Haiku 4.5" },
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Build the Tailscale hostname for an agent.
|
|
129
|
+
* Includes the stack name to avoid conflicts across deployments.
|
|
130
|
+
* Example: "dev-agent-pm", "prod-agent-eng"
|
|
131
|
+
*/
|
|
132
|
+
function tailscaleHostname(stackName, agentName) {
|
|
133
|
+
return `${stackName}-${agentName}`;
|
|
134
|
+
}
|
|
135
|
+
/** Key instructions for onboarding prompts */
|
|
136
|
+
exports.KEY_INSTRUCTIONS = {
|
|
137
|
+
anthropicApiKey: {
|
|
138
|
+
title: "Anthropic API Key",
|
|
139
|
+
steps: [
|
|
140
|
+
"To get your Anthropic API key:",
|
|
141
|
+
"1. Go to https://console.anthropic.com/account/keys",
|
|
142
|
+
"2. Click \"Create Key\"",
|
|
143
|
+
"3. Copy the key (starts with sk-ant-)",
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
tailscaleAuthKey: {
|
|
147
|
+
title: "Tailscale Auth Key",
|
|
148
|
+
steps: [
|
|
149
|
+
"To get your Tailscale auth key:",
|
|
150
|
+
"1. Go to https://login.tailscale.com/admin/settings/keys",
|
|
151
|
+
"2. Click \"Generate auth key\"",
|
|
152
|
+
"3. Enable \"Reusable\" AND \"Ephemeral\" — ephemeral nodes auto-remove when offline",
|
|
153
|
+
"4. Copy the key (starts with tskey-auth-)",
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
tailscaleApiKey: {
|
|
157
|
+
title: "Tailscale API Key (optional)",
|
|
158
|
+
steps: [
|
|
159
|
+
"For reliable cleanup of Tailscale devices during destroy:",
|
|
160
|
+
"1. Go to https://login.tailscale.com/admin/settings/keys",
|
|
161
|
+
"2. Under \"API access tokens\", click \"Generate access token\"",
|
|
162
|
+
"3. Copy the key (starts with tskey-api-)",
|
|
163
|
+
"4. This is optional but recommended for clean teardowns",
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
tailnetDnsName: {
|
|
167
|
+
title: "Tailnet DNS Name",
|
|
168
|
+
steps: [
|
|
169
|
+
"To find your Tailnet DNS name:",
|
|
170
|
+
"1. Go to https://login.tailscale.com/admin/dns",
|
|
171
|
+
"2. Look for your tailnet name at the top",
|
|
172
|
+
"3. It looks like \"tailXXXXX.ts.net\" or a custom domain",
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
slackCredentials: {
|
|
176
|
+
title: "Slack App Setup",
|
|
177
|
+
steps: [
|
|
178
|
+
"Create a Slack app for each agent using the manifest shown below:",
|
|
179
|
+
"1. Go to https://api.slack.com/apps → \"Create New App\" → \"From a manifest\"",
|
|
180
|
+
"2. Select your workspace, paste the JSON manifest, and create the app",
|
|
181
|
+
"3. Go to \"OAuth & Permissions\" — copy the Bot Token (xoxb-...)",
|
|
182
|
+
"4. Under \"Basic Information\" → \"App-Level Tokens\", generate a token",
|
|
183
|
+
" with the connections:write scope — copy it (xapp-...)",
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
linearApiKey: {
|
|
187
|
+
title: "Linear API Key",
|
|
188
|
+
steps: [
|
|
189
|
+
"Create a separate Linear account for each agent:",
|
|
190
|
+
"1. Invite you+agentname@domain.com to your Linear workspace",
|
|
191
|
+
" (plus-addressing forwards to your inbox — no new email needed)",
|
|
192
|
+
" Follow the link in the invite email to create the account and join the org",
|
|
193
|
+
"2. Go to Settings → Security & Access → Personal API keys → \"New API key\"",
|
|
194
|
+
"3. Copy the key (starts with lin_api_)",
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
githubToken: {
|
|
198
|
+
title: "GitHub Token",
|
|
199
|
+
steps: [
|
|
200
|
+
"To get a GitHub personal access token for gh CLI:",
|
|
201
|
+
"1. Go to https://github.com/settings/tokens?type=beta",
|
|
202
|
+
"2. Click \"Generate new token\" → Fine-grained token",
|
|
203
|
+
"3. Select repositories, set expiration, and permissions (e.g., repo, read:org)",
|
|
204
|
+
"4. Copy the token (starts with github_pat_ or ghp_)",
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
hcloudToken: {
|
|
208
|
+
title: "Hetzner Cloud API Token",
|
|
209
|
+
steps: [
|
|
210
|
+
"To get your Hetzner Cloud API token:",
|
|
211
|
+
"1. Go to https://console.hetzner.cloud/",
|
|
212
|
+
"2. Select your project (or create one)",
|
|
213
|
+
"3. Go to Security → API Tokens",
|
|
214
|
+
"4. Click \"Generate API Token\" with Read & Write permissions",
|
|
215
|
+
"5. Copy the token",
|
|
216
|
+
],
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
/** Generate a Slack app manifest JSON for a given agent */
|
|
220
|
+
function slackAppManifest(agentName) {
|
|
221
|
+
return JSON.stringify({
|
|
222
|
+
display_information: {
|
|
223
|
+
name: agentName,
|
|
224
|
+
description: "Slack connector for OpenClaw",
|
|
225
|
+
},
|
|
226
|
+
features: {
|
|
227
|
+
bot_user: {
|
|
228
|
+
display_name: agentName,
|
|
229
|
+
always_online: false,
|
|
230
|
+
},
|
|
231
|
+
app_home: {
|
|
232
|
+
messages_tab_enabled: true,
|
|
233
|
+
messages_tab_read_only_enabled: false,
|
|
234
|
+
},
|
|
235
|
+
slash_commands: [
|
|
236
|
+
{
|
|
237
|
+
command: "/openclaw",
|
|
238
|
+
description: "Send a message to OpenClaw",
|
|
239
|
+
should_escape: false,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
oauth_config: {
|
|
244
|
+
scopes: {
|
|
245
|
+
bot: [
|
|
246
|
+
"chat:write",
|
|
247
|
+
"channels:history",
|
|
248
|
+
"channels:read",
|
|
249
|
+
"groups:history",
|
|
250
|
+
"groups:read",
|
|
251
|
+
"groups:write",
|
|
252
|
+
"im:history",
|
|
253
|
+
"im:read",
|
|
254
|
+
"im:write",
|
|
255
|
+
"mpim:history",
|
|
256
|
+
"mpim:read",
|
|
257
|
+
"mpim:write",
|
|
258
|
+
"users:read",
|
|
259
|
+
"app_mentions:read",
|
|
260
|
+
"reactions:read",
|
|
261
|
+
"reactions:write",
|
|
262
|
+
"pins:read",
|
|
263
|
+
"pins:write",
|
|
264
|
+
"emoji:read",
|
|
265
|
+
"commands",
|
|
266
|
+
"files:read",
|
|
267
|
+
"files:write",
|
|
268
|
+
],
|
|
269
|
+
user: [
|
|
270
|
+
"channels:history",
|
|
271
|
+
"channels:read",
|
|
272
|
+
"groups:history",
|
|
273
|
+
"groups:read",
|
|
274
|
+
"im:history",
|
|
275
|
+
"im:read",
|
|
276
|
+
"mpim:history",
|
|
277
|
+
"mpim:read",
|
|
278
|
+
"users:read",
|
|
279
|
+
"reactions:read",
|
|
280
|
+
"pins:read",
|
|
281
|
+
"emoji:read",
|
|
282
|
+
"search:read",
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
settings: {
|
|
287
|
+
socket_mode_enabled: true,
|
|
288
|
+
event_subscriptions: {
|
|
289
|
+
bot_events: [
|
|
290
|
+
"app_mention",
|
|
291
|
+
"message.channels",
|
|
292
|
+
"message.groups",
|
|
293
|
+
"message.im",
|
|
294
|
+
"message.mpim",
|
|
295
|
+
"reaction_added",
|
|
296
|
+
"reaction_removed",
|
|
297
|
+
"member_joined_channel",
|
|
298
|
+
"member_left_channel",
|
|
299
|
+
"channel_rename",
|
|
300
|
+
"pin_added",
|
|
301
|
+
"pin_removed",
|
|
302
|
+
],
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
}, null, 2);
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child process helpers for CLI commands
|
|
3
|
+
*/
|
|
4
|
+
/** Result of a captured command execution */
|
|
5
|
+
export interface ExecResult {
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
exitCode: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Execute a command and capture output
|
|
12
|
+
*/
|
|
13
|
+
export declare function capture(command: string, args?: string[], cwd?: string): ExecResult;
|
|
14
|
+
/**
|
|
15
|
+
* Execute a command with streaming output (stdout/stderr pass-through)
|
|
16
|
+
* Returns the exit code.
|
|
17
|
+
*/
|
|
18
|
+
export declare function stream(command: string, args?: string[], cwd?: string): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a command exists on the system
|
|
21
|
+
*/
|
|
22
|
+
export declare function commandExists(command: string): boolean;
|
package/dist/lib/exec.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Child process helpers for CLI commands
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.capture = capture;
|
|
7
|
+
exports.stream = stream;
|
|
8
|
+
exports.commandExists = commandExists;
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const process_1 = require("./process");
|
|
11
|
+
/**
|
|
12
|
+
* Execute a command and capture output
|
|
13
|
+
*/
|
|
14
|
+
function capture(command, args = [], cwd) {
|
|
15
|
+
try {
|
|
16
|
+
const result = (0, child_process_1.execSync)([command, ...args].join(" "), {
|
|
17
|
+
cwd,
|
|
18
|
+
encoding: "utf-8",
|
|
19
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
20
|
+
});
|
|
21
|
+
return { stdout: result.trim(), stderr: "", exitCode: 0 };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const e = err;
|
|
25
|
+
return {
|
|
26
|
+
stdout: (e.stdout ?? "").toString().trim(),
|
|
27
|
+
stderr: (e.stderr ?? "").toString().trim(),
|
|
28
|
+
exitCode: e.status ?? 1,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Execute a command with streaming output (stdout/stderr pass-through)
|
|
34
|
+
* Returns the exit code.
|
|
35
|
+
*/
|
|
36
|
+
function stream(command, args = [], cwd) {
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
const opts = {
|
|
39
|
+
cwd,
|
|
40
|
+
stdio: "inherit",
|
|
41
|
+
shell: true,
|
|
42
|
+
};
|
|
43
|
+
const child = (0, child_process_1.spawn)(command, args, opts);
|
|
44
|
+
(0, process_1.trackChild)(child);
|
|
45
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
46
|
+
child.on("error", (err) => {
|
|
47
|
+
console.warn(`[exec] Child process error: ${err.message}`);
|
|
48
|
+
resolve(1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if a command exists on the system
|
|
54
|
+
*/
|
|
55
|
+
function commandExists(command) {
|
|
56
|
+
const bin = process.platform === "win32" ? "where" : "which";
|
|
57
|
+
const result = (0, child_process_1.spawnSync)(bin, [command], { shell: false, stdio: "ignore" });
|
|
58
|
+
return result.status === 0;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../lib/exec.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,0BAgBC;AAMD,wBAeC;AAKD,sCAIC;AA3DD,iDAA8E;AAC9E,uCAAuC;AASvC;;GAEG;AACH,SAAgB,OAAO,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,GAAY;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACpD,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAA4D,CAAC;QACvE,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC1C,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;SACxB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,MAAM,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,GAAY;IACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAiB;YACzB,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Prerequisite checking for CLI
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.checkPrerequisites = checkPrerequisites;
|
|
40
|
+
const p = __importStar(require("@clack/prompts"));
|
|
41
|
+
const exec_1 = require("./exec");
|
|
42
|
+
/**
|
|
43
|
+
* Run all prerequisite checks and display results.
|
|
44
|
+
* Returns true if all pass, false otherwise.
|
|
45
|
+
*/
|
|
46
|
+
async function checkPrerequisites() {
|
|
47
|
+
const results = [];
|
|
48
|
+
// Pulumi CLI
|
|
49
|
+
if ((0, exec_1.commandExists)("pulumi")) {
|
|
50
|
+
const ver = (0, exec_1.capture)("pulumi", ["version"]);
|
|
51
|
+
results.push({ name: "Pulumi", ok: true, message: `found (${ver.stdout})` });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
results.push({
|
|
55
|
+
name: "Pulumi",
|
|
56
|
+
ok: false,
|
|
57
|
+
message: "not found",
|
|
58
|
+
hint: "Install from https://www.pulumi.com/docs/iac/download-install/",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Node.js 18+
|
|
62
|
+
if ((0, exec_1.commandExists)("node")) {
|
|
63
|
+
const ver = (0, exec_1.capture)("node", ["-v"]);
|
|
64
|
+
const major = parseInt(ver.stdout.replace("v", "").split(".")[0], 10);
|
|
65
|
+
if (major >= 18) {
|
|
66
|
+
results.push({ name: "Node.js", ok: true, message: `${ver.stdout} (>= 18 required)` });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
results.push({
|
|
70
|
+
name: "Node.js",
|
|
71
|
+
ok: false,
|
|
72
|
+
message: `${ver.stdout} is too old`,
|
|
73
|
+
hint: "Requires Node.js 18+. Install from https://nodejs.org/",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
results.push({
|
|
79
|
+
name: "Node.js",
|
|
80
|
+
ok: false,
|
|
81
|
+
message: "not found",
|
|
82
|
+
hint: "Install from https://nodejs.org/",
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// AWS CLI
|
|
86
|
+
if ((0, exec_1.commandExists)("aws")) {
|
|
87
|
+
results.push({ name: "AWS CLI", ok: true, message: "found" });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
results.push({
|
|
91
|
+
name: "AWS CLI",
|
|
92
|
+
ok: false,
|
|
93
|
+
message: "not found",
|
|
94
|
+
hint: "Install from https://aws.amazon.com/cli/",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// pnpm
|
|
98
|
+
if ((0, exec_1.commandExists)("pnpm")) {
|
|
99
|
+
results.push({ name: "pnpm", ok: true, message: "found" });
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
results.push({
|
|
103
|
+
name: "pnpm",
|
|
104
|
+
ok: false,
|
|
105
|
+
message: "not found",
|
|
106
|
+
hint: "Install with: npm install -g pnpm",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Display results
|
|
110
|
+
const allOk = results.every((r) => r.ok);
|
|
111
|
+
for (const r of results) {
|
|
112
|
+
if (r.ok) {
|
|
113
|
+
p.log.success(`${r.name}: ${r.message}`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
p.log.error(`${r.name}: ${r.message}`);
|
|
117
|
+
if (r.hint) {
|
|
118
|
+
p.log.message(` ${r.hint}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return allOk;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../lib/prerequisites.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graceful shutdown and child process tracking.
|
|
3
|
+
*
|
|
4
|
+
* Spawn helpers in exec.ts and cli-adapter.ts register child processes here.
|
|
5
|
+
* bin.ts calls setupGracefulShutdown() at startup so that SIGINT / SIGTERM
|
|
6
|
+
* are forwarded to any running children before the CLI exits.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChildProcess } from "child_process";
|
|
9
|
+
/**
|
|
10
|
+
* Register a child process for cleanup on exit.
|
|
11
|
+
* Automatically unregisters when the child closes or errors.
|
|
12
|
+
*/
|
|
13
|
+
export declare function trackChild(child: ChildProcess): void;
|
|
14
|
+
/**
|
|
15
|
+
* Install SIGINT and SIGTERM handlers that forward the signal
|
|
16
|
+
* to tracked child processes before exiting.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setupGracefulShutdown(): void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Graceful shutdown and child process tracking.
|
|
4
|
+
*
|
|
5
|
+
* Spawn helpers in exec.ts and cli-adapter.ts register child processes here.
|
|
6
|
+
* bin.ts calls setupGracefulShutdown() at startup so that SIGINT / SIGTERM
|
|
7
|
+
* are forwarded to any running children before the CLI exits.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.trackChild = trackChild;
|
|
11
|
+
exports.setupGracefulShutdown = setupGracefulShutdown;
|
|
12
|
+
const activeChildren = new Set();
|
|
13
|
+
/**
|
|
14
|
+
* Register a child process for cleanup on exit.
|
|
15
|
+
* Automatically unregisters when the child closes or errors.
|
|
16
|
+
*/
|
|
17
|
+
function trackChild(child) {
|
|
18
|
+
activeChildren.add(child);
|
|
19
|
+
const remove = () => activeChildren.delete(child);
|
|
20
|
+
child.on("close", remove);
|
|
21
|
+
child.on("error", remove);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Install SIGINT and SIGTERM handlers that forward the signal
|
|
25
|
+
* to tracked child processes before exiting.
|
|
26
|
+
*/
|
|
27
|
+
function setupGracefulShutdown() {
|
|
28
|
+
const cleanup = (signal, exitCode) => {
|
|
29
|
+
for (const child of activeChildren) {
|
|
30
|
+
child.kill(signal);
|
|
31
|
+
}
|
|
32
|
+
process.exit(exitCode);
|
|
33
|
+
};
|
|
34
|
+
process.on("SIGINT", () => cleanup("SIGINT", 130));
|
|
35
|
+
process.on("SIGTERM", () => cleanup("SIGTERM", 143));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../lib/process.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAUH,gCAKC;AAMD,sDAUC;AA3BD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgB,CAAC;AAE/C;;;GAGG;AACH,SAAgB,UAAU,CAAC,KAAmB;IAC5C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAE,QAAgB,EAAE,EAAE;QAC3D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pulumi CLI wrappers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the current Pulumi stack name
|
|
6
|
+
*/
|
|
7
|
+
export declare function currentStack(): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Select a Pulumi stack (create if it doesn't exist).
|
|
10
|
+
* Returns { ok, error } so callers can display the error message.
|
|
11
|
+
*/
|
|
12
|
+
export declare function selectOrCreateStack(stackName: string): {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Set a Pulumi config value
|
|
18
|
+
*/
|
|
19
|
+
export declare function setConfig(key: string, value: string, secret?: boolean): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get a Pulumi config value
|
|
22
|
+
*/
|
|
23
|
+
export declare function getConfig(key: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get stack outputs as JSON
|
|
26
|
+
*/
|
|
27
|
+
export declare function getStackOutputs(showSecrets?: boolean): Record<string, unknown> | null;
|
|
28
|
+
/**
|
|
29
|
+
* Run pulumi up with streaming output
|
|
30
|
+
*/
|
|
31
|
+
export declare function pulumiUp(): Promise<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Run pulumi destroy with streaming output
|
|
34
|
+
*/
|
|
35
|
+
export declare function pulumiDestroy(): Promise<number>;
|
|
36
|
+
/**
|
|
37
|
+
* Run pulumi preview with streaming output
|
|
38
|
+
*/
|
|
39
|
+
export declare function pulumiPreview(): Promise<number>;
|