@clawops/cli 2.1.1 → 2.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 (30) hide show
  1. package/README.md +23 -1
  2. package/dist/{apply-HJ5GAKHW.js → apply-JARPVA5Y.js} +8 -8
  3. package/dist/{automation-MKCJ46I6.js → automation-NBYQ6MFZ.js} +1 -1
  4. package/dist/{bootstrap-NN647RCY.js → bootstrap-3PBVY7MA.js} +2 -2
  5. package/dist/{chunk-X56CQ6GB.js → chunk-4MHDW2NB.js} +1 -1
  6. package/dist/{chunk-3Z5TDXCJ.js → chunk-55UMO37O.js} +1 -1
  7. package/dist/chunk-755X5OGS.js +213 -0
  8. package/dist/{chunk-R3DTA35B.js → chunk-7T4CIT7C.js} +6 -6
  9. package/dist/{chunk-QDNFADJI.js → chunk-AVERNLUY.js} +6 -6
  10. package/dist/{chunk-GFUK6KDR.js → chunk-CPCO6UJK.js} +9 -9
  11. package/dist/{chunk-64PONSA5.js → chunk-GFIR2IIJ.js} +3 -1
  12. package/dist/{chunk-YEBFVLOE.js → chunk-PTCVFLZ3.js} +4 -4
  13. package/dist/{chunk-ELU3XQEA.js → chunk-RDUKRIRC.js} +1 -1
  14. package/dist/{chunk-OFTAXLOY.js → chunk-TYHTISI5.js} +239 -159
  15. package/dist/cli.js +127 -274
  16. package/dist/{context-7VI3R6EK.js → context-WOKSKAIA.js} +5 -5
  17. package/dist/{flows-RI7FGHAM.js → flows-HGJIA6EL.js} +7 -7
  18. package/dist/{generate-JNJ63ZYZ.js → generate-NE54BATS.js} +6 -6
  19. package/dist/{harden-3KKCR7BL.js → harden-RUOUA5BV.js} +2 -2
  20. package/dist/init-HOPXDNWY.js +13 -0
  21. package/dist/{mcp-wire-B57DUNOD.js → mcp-wire-FIO5DFBY.js} +11 -11
  22. package/dist/{package-SAUDFQLG.js → package-MF5LPITL.js} +1 -1
  23. package/dist/{server-RHON6QMN.js → server-OXWHBTXK.js} +11 -11
  24. package/dist/{stack-config-LUTS2XAD.js → stack-config-ICQ5YHUL.js} +2 -2
  25. package/dist/{state-AOAYLYY5.js → state-AKZP2S4T.js} +2 -2
  26. package/dist/{store-OVB3DAJR.js → store-YOLQYXMB.js} +1 -1
  27. package/dist/{tailscale-cutover-6YP2QKFM.js → tailscale-cutover-EKAQSDXP.js} +2 -2
  28. package/package.json +1 -1
  29. package/spec/mcp-tools.yaml +69 -28
  30. package/dist/{chunk-BELTQGHT.js → chunk-CHNSL3TC.js} +3 -3
@@ -2,18 +2,18 @@
2
2
  import {
3
3
  buildContext,
4
4
  loadAdapterModule
5
- } from "./chunk-QDNFADJI.js";
6
- import "./chunk-BELTQGHT.js";
5
+ } from "./chunk-AVERNLUY.js";
6
+ import "./chunk-CHNSL3TC.js";
7
+ import "./chunk-VUFMZEIM.js";
7
8
  import "./chunk-GIEVAGEK.js";
8
9
  import "./chunk-VOEJYRIK.js";
9
10
  import "./chunk-EI7CQQ7D.js";
10
11
  import "./chunk-FEK7VJAY.js";
11
12
  import "./chunk-RHOWYIWT.js";
12
13
  import "./chunk-N4WZLWJ4.js";
13
- import "./chunk-ELU3XQEA.js";
14
- import "./chunk-64PONSA5.js";
14
+ import "./chunk-RDUKRIRC.js";
15
+ import "./chunk-GFIR2IIJ.js";
15
16
  import "./chunk-KGXPLI7W.js";
16
- import "./chunk-VUFMZEIM.js";
17
17
  export {
18
18
  buildContext,
19
19
  loadAdapterModule
@@ -2,9 +2,9 @@
2
2
 
3
3
  // src/harden/flows.ts
4
4
  async function cutOverToTailnet(ctx, conn, config) {
5
- const { withRemoteExec } = await import("./harden-3KKCR7BL.js");
6
- const { verifyTailnetAddress, probeSsh } = await import("./tailscale-cutover-6YP2QKFM.js");
7
- const { setConfig } = await import("./store-OVB3DAJR.js");
5
+ const { withRemoteExec } = await import("./harden-RUOUA5BV.js");
6
+ const { verifyTailnetAddress, probeSsh } = await import("./tailscale-cutover-EKAQSDXP.js");
7
+ const { setConfig } = await import("./store-YOLQYXMB.js");
8
8
  const result = await withRemoteExec(
9
9
  conn,
10
10
  void 0,
@@ -49,11 +49,11 @@ async function revertTailnet(ctx, config) {
49
49
  message: `Stack "${ctx.stackName}" is not using a tailnet address; nothing to revert.`
50
50
  };
51
51
  }
52
- const { buildContext } = await import("./context-7VI3R6EK.js");
52
+ const { buildContext } = await import("./context-WOKSKAIA.js");
53
53
  const { extractBaseOutputs } = await import("./outputs-DJHBY7EE.js");
54
- const { probeSsh, leaveTailnet } = await import("./tailscale-cutover-6YP2QKFM.js");
55
- const { withRemoteExec } = await import("./harden-3KKCR7BL.js");
56
- const { getConfig, setConfig } = await import("./store-OVB3DAJR.js");
54
+ const { probeSsh, leaveTailnet } = await import("./tailscale-cutover-EKAQSDXP.js");
55
+ const { withRemoteExec } = await import("./harden-RUOUA5BV.js");
56
+ const { getConfig, setConfig } = await import("./store-YOLQYXMB.js");
57
57
  const { forgetHost } = await import("./known-hosts-file-I3Q3NBYQ.js");
58
58
  const direct = buildContext({ stack: ctx.stackName, ignoreTailnet: true });
59
59
  const outputMap = await (await direct.getStack()).outputs();
@@ -5,21 +5,21 @@ import {
5
5
  isInstanceAlias,
6
6
  parseDiffForTest,
7
7
  planId
8
- } from "./chunk-YEBFVLOE.js";
8
+ } from "./chunk-PTCVFLZ3.js";
9
9
  import "./chunk-XFN3YDZE.js";
10
- import "./chunk-QDNFADJI.js";
10
+ import "./chunk-AVERNLUY.js";
11
+ import "./chunk-CHNSL3TC.js";
11
12
  import "./chunk-JW5A7E3X.js";
12
- import "./chunk-BELTQGHT.js";
13
+ import "./chunk-VUFMZEIM.js";
13
14
  import "./chunk-GIEVAGEK.js";
14
15
  import "./chunk-VOEJYRIK.js";
15
16
  import "./chunk-EI7CQQ7D.js";
16
17
  import "./chunk-FEK7VJAY.js";
17
18
  import "./chunk-RHOWYIWT.js";
18
19
  import "./chunk-N4WZLWJ4.js";
19
- import "./chunk-ELU3XQEA.js";
20
- import "./chunk-64PONSA5.js";
20
+ import "./chunk-RDUKRIRC.js";
21
+ import "./chunk-GFIR2IIJ.js";
21
22
  import "./chunk-KGXPLI7W.js";
22
- import "./chunk-VUFMZEIM.js";
23
23
  export {
24
24
  INSTANCE_ALIASES,
25
25
  generatePlan,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  makeTailscaleModule,
4
4
  tailscaleModule
5
- } from "./chunk-X56CQ6GB.js";
5
+ } from "./chunk-4MHDW2NB.js";
6
6
  import {
7
7
  acquireSession,
8
8
  drainPool
@@ -28,7 +28,7 @@ import {
28
28
  import {
29
29
  resolveProjectId
30
30
  } from "./chunk-TC2VYPLH.js";
31
- import "./chunk-64PONSA5.js";
31
+ import "./chunk-GFIR2IIJ.js";
32
32
  import "./chunk-KGXPLI7W.js";
33
33
 
34
34
  // src/harden/types.ts
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ PROVIDER_DEFAULTS,
4
+ SUPPORTED_PROVIDERS,
5
+ initStack
6
+ } from "./chunk-755X5OGS.js";
7
+ import "./chunk-GFIR2IIJ.js";
8
+ import "./chunk-KGXPLI7W.js";
9
+ export {
10
+ PROVIDER_DEFAULTS,
11
+ SUPPORTED_PROVIDERS,
12
+ initStack
13
+ };
@@ -1,29 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MCP_HTTP_PORT
4
- } from "./chunk-OFTAXLOY.js";
5
- import "./chunk-R3DTA35B.js";
4
+ } from "./chunk-TYHTISI5.js";
5
+ import "./chunk-7T4CIT7C.js";
6
+ import "./chunk-PTCVFLZ3.js";
6
7
  import "./chunk-BOPSG2LI.js";
7
8
  import "./chunk-6ZFIFDBJ.js";
8
9
  import "./chunk-3QJBNAHW.js";
9
10
  import "./chunk-2I7KCMXZ.js";
10
- import "./chunk-3Z5TDXCJ.js";
11
- import "./chunk-AEEMRFZV.js";
12
- import "./chunk-YEBFVLOE.js";
13
11
  import "./chunk-XFN3YDZE.js";
12
+ import "./chunk-55UMO37O.js";
13
+ import "./chunk-AEEMRFZV.js";
14
+ import "./chunk-AVERNLUY.js";
14
15
  import "./chunk-2Z7J3ERQ.js";
15
16
  import "./chunk-E4NJSJ54.js";
16
17
  import "./chunk-MC5ATCXS.js";
17
- import "./chunk-QDNFADJI.js";
18
- import "./chunk-GFUK6KDR.js";
18
+ import "./chunk-CPCO6UJK.js";
19
19
  import "./chunk-NUL5F6YV.js";
20
20
  import "./chunk-3OLUJPCB.js";
21
21
  import {
22
22
  execPrivileged
23
23
  } from "./chunk-NUDIHZEH.js";
24
+ import "./chunk-CHNSL3TC.js";
24
25
  import "./chunk-JW5A7E3X.js";
25
26
  import "./chunk-LT4XMO5D.js";
26
- import "./chunk-BELTQGHT.js";
27
+ import "./chunk-VUFMZEIM.js";
27
28
  import "./chunk-GIEVAGEK.js";
28
29
  import "./chunk-VOEJYRIK.js";
29
30
  import "./chunk-EI7CQQ7D.js";
@@ -31,10 +32,9 @@ import "./chunk-FEK7VJAY.js";
31
32
  import "./chunk-RHOWYIWT.js";
32
33
  import "./chunk-Q7NQY5HV.js";
33
34
  import "./chunk-N4WZLWJ4.js";
34
- import "./chunk-ELU3XQEA.js";
35
- import "./chunk-64PONSA5.js";
35
+ import "./chunk-RDUKRIRC.js";
36
+ import "./chunk-GFIR2IIJ.js";
36
37
  import "./chunk-KGXPLI7W.js";
37
- import "./chunk-VUFMZEIM.js";
38
38
 
39
39
  // src/cli/mcp-wire.ts
40
40
  var GATEWAY_MCP_NAME = "clawops";
@@ -2,7 +2,7 @@
2
2
 
3
3
  // package.json
4
4
  var name = "@clawops/cli";
5
- var version = "2.1.1";
5
+ var version = "2.1.3";
6
6
  var description = "Deploy self-hosted OpenClaw to AWS, GCP, Azure or a local VM \u2014 a CLI and an MCP server in one.";
7
7
  var keywords = [
8
8
  "openclaw",
@@ -5,27 +5,28 @@ import {
5
5
  bearerFrom,
6
6
  isLoopbackBind,
7
7
  serveMcp
8
- } from "./chunk-OFTAXLOY.js";
9
- import "./chunk-R3DTA35B.js";
8
+ } from "./chunk-TYHTISI5.js";
9
+ import "./chunk-7T4CIT7C.js";
10
+ import "./chunk-PTCVFLZ3.js";
10
11
  import "./chunk-BOPSG2LI.js";
11
12
  import "./chunk-6ZFIFDBJ.js";
12
13
  import "./chunk-3QJBNAHW.js";
13
14
  import "./chunk-2I7KCMXZ.js";
14
- import "./chunk-3Z5TDXCJ.js";
15
- import "./chunk-AEEMRFZV.js";
16
- import "./chunk-YEBFVLOE.js";
17
15
  import "./chunk-XFN3YDZE.js";
16
+ import "./chunk-55UMO37O.js";
17
+ import "./chunk-AEEMRFZV.js";
18
+ import "./chunk-AVERNLUY.js";
18
19
  import "./chunk-2Z7J3ERQ.js";
19
20
  import "./chunk-E4NJSJ54.js";
20
21
  import "./chunk-MC5ATCXS.js";
21
- import "./chunk-QDNFADJI.js";
22
- import "./chunk-GFUK6KDR.js";
22
+ import "./chunk-CPCO6UJK.js";
23
23
  import "./chunk-NUL5F6YV.js";
24
24
  import "./chunk-3OLUJPCB.js";
25
25
  import "./chunk-NUDIHZEH.js";
26
+ import "./chunk-CHNSL3TC.js";
26
27
  import "./chunk-JW5A7E3X.js";
27
28
  import "./chunk-LT4XMO5D.js";
28
- import "./chunk-BELTQGHT.js";
29
+ import "./chunk-VUFMZEIM.js";
29
30
  import "./chunk-GIEVAGEK.js";
30
31
  import "./chunk-VOEJYRIK.js";
31
32
  import "./chunk-EI7CQQ7D.js";
@@ -33,10 +34,9 @@ import "./chunk-FEK7VJAY.js";
33
34
  import "./chunk-RHOWYIWT.js";
34
35
  import "./chunk-Q7NQY5HV.js";
35
36
  import "./chunk-N4WZLWJ4.js";
36
- import "./chunk-ELU3XQEA.js";
37
- import "./chunk-64PONSA5.js";
37
+ import "./chunk-RDUKRIRC.js";
38
+ import "./chunk-GFIR2IIJ.js";
38
39
  import "./chunk-KGXPLI7W.js";
39
- import "./chunk-VUFMZEIM.js";
40
40
  export {
41
41
  MCP_HTTP_PORT,
42
42
  authRequirement,
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeStackConfig
4
- } from "./chunk-3Z5TDXCJ.js";
4
+ } from "./chunk-55UMO37O.js";
5
5
  import "./chunk-AEEMRFZV.js";
6
6
  import "./chunk-VOEJYRIK.js";
7
7
  import "./chunk-EI7CQQ7D.js";
8
- import "./chunk-64PONSA5.js";
8
+ import "./chunk-GFIR2IIJ.js";
9
9
  import "./chunk-KGXPLI7W.js";
10
10
  export {
11
11
  writeStackConfig
@@ -5,8 +5,8 @@ import {
5
5
  stateDir,
6
6
  statePath,
7
7
  writeLocalState
8
- } from "./chunk-ELU3XQEA.js";
9
- import "./chunk-64PONSA5.js";
8
+ } from "./chunk-RDUKRIRC.js";
9
+ import "./chunk-GFIR2IIJ.js";
10
10
  import "./chunk-KGXPLI7W.js";
11
11
  export {
12
12
  localStateToConnectionInfo,
@@ -5,7 +5,7 @@ import {
5
5
  getConfigPath,
6
6
  requireConfig,
7
7
  setConfig
8
- } from "./chunk-64PONSA5.js";
8
+ } from "./chunk-GFIR2IIJ.js";
9
9
  import "./chunk-KGXPLI7W.js";
10
10
  export {
11
11
  getConfig,
@@ -3,13 +3,13 @@ import {
3
3
  isTailscaleIpv4,
4
4
  parseStatus,
5
5
  rootPrefix
6
- } from "./chunk-X56CQ6GB.js";
6
+ } from "./chunk-4MHDW2NB.js";
7
7
  import {
8
8
  formatKnownHostsLine,
9
9
  keyTypeFromBlob,
10
10
  verifyAgainstKnownHosts
11
11
  } from "./chunk-MC5ATCXS.js";
12
- import "./chunk-64PONSA5.js";
12
+ import "./chunk-GFIR2IIJ.js";
13
13
  import "./chunk-KGXPLI7W.js";
14
14
 
15
15
  // src/harden/tailscale-cutover.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawops/cli",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "description": "Deploy self-hosted OpenClaw to AWS, GCP, Azure or a local VM — a CLI and an MCP server in one.",
5
5
  "keywords": [
6
6
  "openclaw",
@@ -136,8 +136,8 @@ tools:
136
136
  idempotentHint: true
137
137
  openWorldHint: true
138
138
  input:
139
- stackName: { type: string, optional: true }
140
- tailLines: { type: integer, optional: true, default: 100, max: 1000 }
139
+ stackName: { type: string, optional: true, description: "Which stack's gateway to read. Omitted = the default stack in ~/.clawops/config.json" }
140
+ tailLines: { type: integer, optional: true, default: 100, max: 1000, description: "How many of the most recent lines to return. Keep it small; output is trimmed to 8KB regardless" }
141
141
  sinceMin: { type: integer, optional: true, description: "Lines since N minutes ago" }
142
142
  output:
143
143
  lines: { type: array, items: { type: string }, description: "Trimmed log lines (R14: hard cap 8KB)" }
@@ -227,7 +227,7 @@ tools:
227
227
  idempotentHint: true
228
228
  openWorldHint: true
229
229
  input:
230
- stackName: { type: string, optional: true }
230
+ stackName: { type: string, optional: true, description: "Which stack's gateway config to read. Omitted = the default stack in ~/.clawops/config.json" }
231
231
  key: { type: string, optional: true, description: "Dot-path config key, e.g., gateway.auth.mode. Omit to dump the full config." }
232
232
  output:
233
233
  value: { type: string, description: "Stringified value; complex objects are JSON-encoded" }
@@ -249,7 +249,7 @@ tools:
249
249
  idempotentHint: true
250
250
  openWorldHint: true
251
251
  input:
252
- stackName: { type: string, optional: true }
252
+ stackName: { type: string, optional: true, description: "Which stack's agents to list. Omitted = the default stack in ~/.clawops/config.json" }
253
253
  output:
254
254
  agents:
255
255
  type: array
@@ -286,13 +286,13 @@ tools:
286
286
  idempotentHint: true
287
287
  openWorldHint: true
288
288
  input:
289
- stackName: { type: string, optional: true }
289
+ stackName: { type: string, optional: true, description: "Name for the stack to provision, and the name every later command refers to it by. Omitted = the default stack in ~/.clawops/config.json" }
290
290
  provider:
291
291
  type: enum
292
292
  values: [aws, gcp, azure, local]
293
293
  optional: true
294
294
  description: Defaults to provider configured for this stack
295
- region: { type: string, optional: true }
295
+ region: { type: string, optional: true, description: "Cloud region to deploy into, in the provider's own spelling (us-east-1, us-central1, eastus). Omitted = the region recorded for the stack" }
296
296
  instanceType:
297
297
  type: string
298
298
  optional: true
@@ -318,10 +318,10 @@ tools:
318
318
  optional: true
319
319
  description: Which interface the gateway binds. 'all' serves plaintext HTTP.
320
320
  openclawVersion: { type: string, optional: true, description: "semver or 'stable'/'dev'" }
321
- dryRun: { type: boolean, optional: true, default: false }
321
+ dryRun: { type: boolean, optional: true, default: false, description: "Show what would be created and change nothing. Use this first when the user has not yet approved a spend" }
322
322
  output:
323
323
  taskId: { type: string, description: "For >60s ops; poll clawops_task_status" }
324
- stackName: { type: string }
324
+ stackName: { type: string, description: "Name for the stack to provision, and the name every later command refers to it by. Omitted = the default stack in ~/.clawops/config.json" }
325
325
  gatewayUrl: { type: string, format: uri }
326
326
  resourceCount: { type: integer }
327
327
 
@@ -346,7 +346,7 @@ tools:
346
346
  idempotentHint: true
347
347
  openWorldHint: true
348
348
  input:
349
- stackName: { type: string }
349
+ stackName: { type: string, description: "The stack to destroy. Required, and worth repeating back to the user before calling: this deletes every resource it provisioned" }
350
350
  yes: { type: boolean, optional: true, default: false, description: "Skip elicitation; CI/scripted use only" }
351
351
  output:
352
352
  taskId: { type: string }
@@ -371,7 +371,7 @@ tools:
371
371
  openWorldHint: true
372
372
  input:
373
373
  planPath: { type: string, description: "Absolute path to plan JSON (R7)" }
374
- yes: { type: boolean, optional: true, default: false }
374
+ yes: { type: boolean, optional: true, default: false, description: "Skip the confirmation and apply immediately. Only when the user has already approved this specific plan" }
375
375
  output:
376
376
  taskId: { type: string }
377
377
  summary: { type: string, description: "Trimmed; full output as resource (R14)" }
@@ -394,9 +394,9 @@ tools:
394
394
  idempotentHint: true
395
395
  openWorldHint: true
396
396
  input:
397
- stackName: { type: string, optional: true }
398
- provider: { type: enum, values: [aws, gcp, azure, local], optional: true }
399
- region: { type: string, optional: true }
397
+ stackName: { type: string, optional: true, description: "Which stack the plan is for. Omitted = the default stack in ~/.clawops/config.json" }
398
+ provider: { type: enum, values: [aws, gcp, azure, local], optional: true, description: "Cloud to plan against. Omitted = the provider recorded for the stack. 'local' has no plan/apply path and is refused" }
399
+ region: { type: string, optional: true, description: "Cloud region, in the provider's own spelling (us-east-1, us-central1, eastus). Omitted = the region recorded for the stack" }
400
400
  instanceType: { type: string, optional: true, description: "A clawops alias (micro|small|medium|large|gpu) or a machine type the cloud names itself, e.g. t3.small" }
401
401
  openclawVersion: { type: string, optional: true, description: "semver, or 'stable'/'dev'" }
402
402
  sshCidr: { type: string, optional: true, description: "CIDR(s) allowed to reach SSH, comma-separated, or 'auto' for this machine. Omitted = none, and nothing will be able to connect" }
@@ -428,10 +428,10 @@ tools:
428
428
  idempotentHint: true
429
429
  openWorldHint: true
430
430
  input:
431
- stackName: { type: string, optional: true }
432
- key: { type: string }
431
+ stackName: { type: string, optional: true, description: "Which stack's gateway config to write. Omitted = the default stack in ~/.clawops/config.json" }
432
+ key: { type: string, description: "Dotted path into the gateway config, e.g. models.provider or channels.slack.enabled" }
433
433
  value: { type: string, description: "Stringified; JSON for complex values" }
434
- restart: { type: boolean, optional: true, default: false }
434
+ restart: { type: boolean, optional: true, default: false, description: "Restart the gateway so the change takes effect. Without it the value is written and the running gateway keeps the old one" }
435
435
  output:
436
436
  message: { type: string, description: "Confirmation of the change applied" }
437
437
 
@@ -453,9 +453,9 @@ tools:
453
453
  idempotentHint: true
454
454
  openWorldHint: true
455
455
  input:
456
- stackName: { type: string, optional: true }
456
+ stackName: { type: string, optional: true, description: "Which stack's gateway config to write. Omitted = the default stack in ~/.clawops/config.json" }
457
457
  key: { type: string, description: "Dot-path config key to remove" }
458
- restart: { type: boolean, optional: true, default: false }
458
+ restart: { type: boolean, optional: true, default: false, description: "Restart the gateway so the removal takes effect. Without it the key is removed and the running gateway keeps the old value" }
459
459
  output:
460
460
  message: { type: string, description: "Confirmation of the key removed" }
461
461
 
@@ -477,7 +477,7 @@ tools:
477
477
  idempotentHint: true
478
478
  openWorldHint: true
479
479
  input:
480
- stackName: { type: string, optional: true }
480
+ stackName: { type: string, optional: true, description: "Which stack's deployed config to validate. Omitted = the default stack in ~/.clawops/config.json" }
481
481
  output:
482
482
  valid: { type: boolean }
483
483
  issues: { type: array, items: { type: string } }
@@ -499,7 +499,7 @@ tools:
499
499
  idempotentHint: true
500
500
  openWorldHint: true
501
501
  input:
502
- stackName: { type: string, optional: true }
502
+ stackName: { type: string, optional: true, description: "Which stack's gateway to restart. Omitted = the default stack in ~/.clawops/config.json" }
503
503
  output:
504
504
  restartedAt: { type: string, format: date-time }
505
505
  previousUptimeSec: { type: integer }
@@ -508,6 +508,47 @@ tools:
508
508
  # COMPOSITE WORKFLOW TOOLS (R2: encode user intent, not API sequences)
509
509
  # ────────────────────────────────────────────────────────────────────────────
510
510
 
511
+ - name: clawops_init
512
+ toolset: [cli]
513
+ description: |
514
+ Register a stack and write ~/.clawops/config.json: the provider, the state backend, the
515
+ region, and an SSH key pair generated if one is not already there. Nothing is provisioned
516
+ and nothing is charged; this only creates local configuration.
517
+
518
+ Use when: any other clawops tool reports that there is no config, or the user wants to add
519
+ a second stack alongside the ones they have. This is the first call on a machine that has
520
+ never run clawops — a fresh container, a new laptop, a sandbox.
521
+
522
+ Adding a stack is additive and safe: existing stacks are kept. Overwriting one needs
523
+ force: true, because changing a state backend orphans the Pulumi state it points at — the
524
+ infrastructure stays up and clawops can no longer see or destroy it.
525
+
526
+ For aws, gcp and azure, stateUrl can be omitted and clawops names a bucket from the
527
+ account it can see; that needs cloud credentials in the environment, so in a sandbox pass
528
+ stateUrl explicitly. The local provider needs host instead, and no cloud account at all.
529
+
530
+ Do NOT use when: the user wants to deploy — that is clawops_up, after this. Credentials
531
+ are never passed here: clawops reads them from the environment (R6).
532
+ annotations:
533
+ title: Initialise clawops Config
534
+ readOnlyHint: false
535
+ destructiveHint: false
536
+ idempotentHint: false
537
+ openWorldHint: false
538
+ input:
539
+ provider: { type: enum, values: [aws, gcp, azure, local], description: "Which cloud this stack deploys to, or 'local' for a machine you already have" }
540
+ stackName: { type: string, optional: true, description: "Name for the stack, used by every later call. Omitted = \"default\"" }
541
+ stateUrl: { type: string, optional: true, description: "Where Pulumi state lives, e.g. s3://bucket/clawops, gs://bucket/clawops, azblob://container. Omitted = clawops names one from the cloud account it can see, which needs credentials" }
542
+ region: { type: string, optional: true, description: "Cloud region in the provider's own spelling. Omitted = us-east-1 (aws), us-central1 (gcp), eastus (azure)" }
543
+ host: { type: string, optional: true, description: "[local only] Hostname or IP of the machine to manage. Required when provider is local" }
544
+ sshUser: { type: string, optional: true, description: "[local only] SSH login user. Omitted = root" }
545
+ sshPort: { type: integer, optional: true, description: "[local only] SSH port. Omitted = 22" }
546
+ force: { type: boolean, optional: true, description: "Overwrite a stack that already exists. Refused without it, because replacing a state backend orphans the state it points at" }
547
+ output:
548
+ configPath: { type: string }
549
+ stackName: { type: string }
550
+ stateUrl: { type: string }
551
+
511
552
  - name: clawops_harden
512
553
  toolset: [cli]
513
554
  description: |
@@ -543,7 +584,7 @@ tools:
543
584
  idempotentHint: true
544
585
  openWorldHint: true
545
586
  input:
546
- stackName: { type: string, optional: true }
587
+ stackName: { type: string, optional: true, description: "Which stack to harden. Omitted = the default stack in ~/.clawops/config.json" }
547
588
  options: { type: string, optional: true, description: "Comma-separated module IDs; default is every defaultOn module for the provider" }
548
589
  dryRun: { type: boolean, optional: true, default: false, description: "Report the current state, change nothing" }
549
590
  tailscale: { type: boolean, optional: true, default: false, description: "Join the tailnet, verify this machine reaches the host there, then use that address" }
@@ -577,14 +618,14 @@ tools:
577
618
  idempotentHint: true
578
619
  openWorldHint: true
579
620
  input:
580
- provider: { type: enum, values: [aws, gcp, azure, local] }
581
- region: { type: string, optional: true }
582
- stackName: { type: string, optional: true, default: "default" }
583
- instanceType: { type: enum, values: [micro, small, medium, large, gpu], optional: true, default: small }
621
+ provider: { type: enum, values: [aws, gcp, azure, local], description: "Cloud to deploy to. Omitted = the default provider in ~/.clawops/config.json" }
622
+ region: { type: string, optional: true, description: "Cloud region, in the provider's own spelling (us-east-1, us-central1, eastus). Omitted = the provider's default" }
623
+ stackName: { type: string, optional: true, default: "default", description: "Name for the new stack. Omitted = the default stack name in ~/.clawops/config.json" }
624
+ instanceType: { type: enum, values: [micro, small, medium, large, gpu], optional: true, default: small, description: "Machine size: a clawops alias (micro|small|medium|large|gpu) or a type the cloud names itself, e.g. t3.small" }
584
625
  output:
585
626
  taskId: { type: string }
586
627
  gatewayUrl: { type: string, format: uri }
587
- stackName: { type: string }
628
+ stackName: { type: string, description: "Name for the new stack. Omitted = the default stack name in ~/.clawops/config.json" }
588
629
 
589
630
  - name: clawops_workflow_recover
590
631
  toolset: [workflow, read]
@@ -605,7 +646,7 @@ tools:
605
646
  idempotentHint: true
606
647
  openWorldHint: true
607
648
  input:
608
- stackName: { type: string, optional: true }
649
+ stackName: { type: string, optional: true, description: "Which stack to diagnose. Omitted = the default stack in ~/.clawops/config.json" }
609
650
  output:
610
651
  report:
611
652
  type: object
@@ -633,7 +674,7 @@ tools:
633
674
  idempotentHint: true
634
675
  openWorldHint: false
635
676
  input:
636
- taskId: { type: string }
677
+ taskId: { type: string, description: "The taskId returned by a long-running tool such as clawops_up, clawops_apply or clawops_destroy" }
637
678
  output:
638
679
  status: { type: enum, values: [working, input_required, completed, failed, cancelled] }
639
680
  progress: { type: number, minimum: 0, maximum: 1 }
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ registerProvider
4
+ } from "./chunk-VUFMZEIM.js";
2
5
  import {
3
6
  CONFIG_FILENAME,
4
7
  CONTAINER_UID,
@@ -17,9 +20,6 @@ import {
17
20
  import {
18
21
  INSTANCE_TYPE_MAP
19
22
  } from "./chunk-N4WZLWJ4.js";
20
- import {
21
- registerProvider
22
- } from "./chunk-VUFMZEIM.js";
23
23
 
24
24
  // src/providers/aws/index.ts
25
25
  import process2 from "process";