clawup 1.0.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.
Files changed (190) hide show
  1. package/README.md +245 -0
  2. package/dist/adapters/api-adapter.d.ts +76 -0
  3. package/dist/adapters/api-adapter.js +250 -0
  4. package/dist/adapters/api-adapter.js.map +1 -0
  5. package/dist/adapters/cli-adapter.d.ts +15 -0
  6. package/dist/adapters/cli-adapter.js +208 -0
  7. package/dist/adapters/cli-adapter.js.map +1 -0
  8. package/dist/adapters/index.d.ts +22 -0
  9. package/dist/adapters/index.js +32 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/adapters/types.d.ts +135 -0
  12. package/dist/adapters/types.js +14 -0
  13. package/dist/adapters/types.js.map +1 -0
  14. package/dist/bin.d.ts +8 -0
  15. package/dist/bin.js +221 -0
  16. package/dist/bin.js.map +1 -0
  17. package/dist/commands/config.d.ts +21 -0
  18. package/dist/commands/config.js +323 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/deploy.d.ts +7 -0
  21. package/dist/commands/deploy.js +13 -0
  22. package/dist/commands/deploy.js.map +1 -0
  23. package/dist/commands/destroy.d.ts +7 -0
  24. package/dist/commands/destroy.js +13 -0
  25. package/dist/commands/destroy.js.map +1 -0
  26. package/dist/commands/init.d.ts +13 -0
  27. package/dist/commands/init.js +698 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/list.d.ts +8 -0
  30. package/dist/commands/list.js +42 -0
  31. package/dist/commands/list.js.map +1 -0
  32. package/dist/commands/push.d.ts +7 -0
  33. package/dist/commands/push.js +19 -0
  34. package/dist/commands/push.js.map +1 -0
  35. package/dist/commands/redeploy.d.ts +7 -0
  36. package/dist/commands/redeploy.js +13 -0
  37. package/dist/commands/redeploy.js.map +1 -0
  38. package/dist/commands/secrets.d.ts +16 -0
  39. package/dist/commands/secrets.js +169 -0
  40. package/dist/commands/secrets.js.map +1 -0
  41. package/dist/commands/ssh.d.ts +9 -0
  42. package/dist/commands/ssh.js +108 -0
  43. package/dist/commands/ssh.js.map +1 -0
  44. package/dist/commands/status.d.ts +7 -0
  45. package/dist/commands/status.js +13 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/update.d.ts +7 -0
  48. package/dist/commands/update.js +126 -0
  49. package/dist/commands/update.js.map +1 -0
  50. package/dist/commands/validate.d.ts +7 -0
  51. package/dist/commands/validate.js +13 -0
  52. package/dist/commands/validate.js.map +1 -0
  53. package/dist/commands/webhooks.d.ts +7 -0
  54. package/dist/commands/webhooks.js +13 -0
  55. package/dist/commands/webhooks.js.map +1 -0
  56. package/dist/lib/__tests__/identity.test.d.ts +1 -0
  57. package/dist/lib/__tests__/identity.test.js +186 -0
  58. package/dist/lib/__tests__/identity.test.js.map +1 -0
  59. package/dist/lib/__tests__/validate-agent.test.d.ts +1 -0
  60. package/dist/lib/__tests__/validate-agent.test.js +38 -0
  61. package/dist/lib/__tests__/validate-agent.test.js.map +1 -0
  62. package/dist/lib/config.d.ts +69 -0
  63. package/dist/lib/config.js +218 -0
  64. package/dist/lib/config.js.map +1 -0
  65. package/dist/lib/constants.d.ts +5 -0
  66. package/dist/lib/constants.js +29 -0
  67. package/dist/lib/constants.js.map +1 -0
  68. package/dist/lib/exec.d.ts +24 -0
  69. package/dist/lib/exec.js +63 -0
  70. package/dist/lib/exec.js.map +1 -0
  71. package/dist/lib/prerequisites.d.ts +8 -0
  72. package/dist/lib/prerequisites.js +146 -0
  73. package/dist/lib/prerequisites.js.map +1 -0
  74. package/dist/lib/process.d.ts +18 -0
  75. package/dist/lib/process.js +37 -0
  76. package/dist/lib/process.js.map +1 -0
  77. package/dist/lib/pulumi.d.ts +37 -0
  78. package/dist/lib/pulumi.js +87 -0
  79. package/dist/lib/pulumi.js.map +1 -0
  80. package/dist/lib/tailscale.d.ts +75 -0
  81. package/dist/lib/tailscale.js +251 -0
  82. package/dist/lib/tailscale.js.map +1 -0
  83. package/dist/lib/tool-helpers.d.ts +15 -0
  84. package/dist/lib/tool-helpers.js +35 -0
  85. package/dist/lib/tool-helpers.js.map +1 -0
  86. package/dist/lib/ui.d.ts +26 -0
  87. package/dist/lib/ui.js +86 -0
  88. package/dist/lib/ui.js.map +1 -0
  89. package/dist/lib/update-check.d.ts +8 -0
  90. package/dist/lib/update-check.js +151 -0
  91. package/dist/lib/update-check.js.map +1 -0
  92. package/dist/lib/vendor.d.ts +34 -0
  93. package/dist/lib/vendor.js +128 -0
  94. package/dist/lib/vendor.js.map +1 -0
  95. package/dist/lib/workspace.d.ts +21 -0
  96. package/dist/lib/workspace.js +170 -0
  97. package/dist/lib/workspace.js.map +1 -0
  98. package/dist/tools/deploy.d.ts +16 -0
  99. package/dist/tools/deploy.js +181 -0
  100. package/dist/tools/deploy.js.map +1 -0
  101. package/dist/tools/destroy.d.ts +16 -0
  102. package/dist/tools/destroy.js +119 -0
  103. package/dist/tools/destroy.js.map +1 -0
  104. package/dist/tools/index.d.ts +20 -0
  105. package/dist/tools/index.js +34 -0
  106. package/dist/tools/index.js.map +1 -0
  107. package/dist/tools/push.d.ts +29 -0
  108. package/dist/tools/push.js +341 -0
  109. package/dist/tools/push.js.map +1 -0
  110. package/dist/tools/redeploy.d.ts +17 -0
  111. package/dist/tools/redeploy.js +181 -0
  112. package/dist/tools/redeploy.js.map +1 -0
  113. package/dist/tools/status.d.ts +16 -0
  114. package/dist/tools/status.js +205 -0
  115. package/dist/tools/status.js.map +1 -0
  116. package/dist/tools/validate.d.ts +16 -0
  117. package/dist/tools/validate.js +219 -0
  118. package/dist/tools/validate.js.map +1 -0
  119. package/dist/tools/webhooks.d.ts +17 -0
  120. package/dist/tools/webhooks.js +181 -0
  121. package/dist/tools/webhooks.js.map +1 -0
  122. package/dist/types.d.ts +6 -0
  123. package/dist/types.js +10 -0
  124. package/dist/types.js.map +1 -0
  125. package/infra/Pulumi.yaml +6 -0
  126. package/infra/dist/components/cloud-init.js +412 -0
  127. package/infra/dist/components/config-generator.js +254 -0
  128. package/infra/dist/components/hetzner-agent.js +162 -0
  129. package/infra/dist/components/index.js +18 -0
  130. package/infra/dist/components/openclaw-agent.js +287 -0
  131. package/infra/dist/components/shared.js +132 -0
  132. package/infra/dist/components/types.js +6 -0
  133. package/infra/dist/index.js +387 -0
  134. package/infra/dist/shared-vpc.js +167 -0
  135. package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.d.ts +2 -0
  136. package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.d.ts.map +1 -0
  137. package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.js +124 -0
  138. package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.js.map +1 -0
  139. package/infra/node_modules/@clawup/core/dist/coding-agent-registry.d.ts +32 -0
  140. package/infra/node_modules/@clawup/core/dist/coding-agent-registry.d.ts.map +1 -0
  141. package/infra/node_modules/@clawup/core/dist/coding-agent-registry.js +56 -0
  142. package/infra/node_modules/@clawup/core/dist/coding-agent-registry.js.map +1 -0
  143. package/infra/node_modules/@clawup/core/dist/constants.d.ts +137 -0
  144. package/infra/node_modules/@clawup/core/dist/constants.d.ts.map +1 -0
  145. package/infra/node_modules/@clawup/core/dist/constants.js +314 -0
  146. package/infra/node_modules/@clawup/core/dist/constants.js.map +1 -0
  147. package/infra/node_modules/@clawup/core/dist/dep-registry.d.ts +25 -0
  148. package/infra/node_modules/@clawup/core/dist/dep-registry.d.ts.map +1 -0
  149. package/infra/node_modules/@clawup/core/dist/dep-registry.js +46 -0
  150. package/infra/node_modules/@clawup/core/dist/dep-registry.js.map +1 -0
  151. package/infra/node_modules/@clawup/core/dist/deps.d.ts +18 -0
  152. package/infra/node_modules/@clawup/core/dist/deps.d.ts.map +1 -0
  153. package/infra/node_modules/@clawup/core/dist/deps.js +39 -0
  154. package/infra/node_modules/@clawup/core/dist/deps.js.map +1 -0
  155. package/infra/node_modules/@clawup/core/dist/identity.d.ts +20 -0
  156. package/infra/node_modules/@clawup/core/dist/identity.d.ts.map +1 -0
  157. package/infra/node_modules/@clawup/core/dist/identity.js +217 -0
  158. package/infra/node_modules/@clawup/core/dist/identity.js.map +1 -0
  159. package/infra/node_modules/@clawup/core/dist/index.d.ts +18 -0
  160. package/infra/node_modules/@clawup/core/dist/index.d.ts.map +1 -0
  161. package/infra/node_modules/@clawup/core/dist/index.js +52 -0
  162. package/infra/node_modules/@clawup/core/dist/index.js.map +1 -0
  163. package/infra/node_modules/@clawup/core/dist/plugin-registry.d.ts +13 -0
  164. package/infra/node_modules/@clawup/core/dist/plugin-registry.d.ts.map +1 -0
  165. package/infra/node_modules/@clawup/core/dist/plugin-registry.js +24 -0
  166. package/infra/node_modules/@clawup/core/dist/plugin-registry.js.map +1 -0
  167. package/infra/node_modules/@clawup/core/dist/schemas/identity.d.ts +74 -0
  168. package/infra/node_modules/@clawup/core/dist/schemas/identity.d.ts.map +1 -0
  169. package/infra/node_modules/@clawup/core/dist/schemas/identity.js +45 -0
  170. package/infra/node_modules/@clawup/core/dist/schemas/identity.js.map +1 -0
  171. package/infra/node_modules/@clawup/core/dist/schemas/index.d.ts +6 -0
  172. package/infra/node_modules/@clawup/core/dist/schemas/index.d.ts.map +1 -0
  173. package/infra/node_modules/@clawup/core/dist/schemas/index.js +13 -0
  174. package/infra/node_modules/@clawup/core/dist/schemas/index.js.map +1 -0
  175. package/infra/node_modules/@clawup/core/dist/schemas/manifest.d.ts +159 -0
  176. package/infra/node_modules/@clawup/core/dist/schemas/manifest.d.ts.map +1 -0
  177. package/infra/node_modules/@clawup/core/dist/schemas/manifest.js +54 -0
  178. package/infra/node_modules/@clawup/core/dist/schemas/manifest.js.map +1 -0
  179. package/infra/node_modules/@clawup/core/dist/skills.d.ts +30 -0
  180. package/infra/node_modules/@clawup/core/dist/skills.d.ts.map +1 -0
  181. package/infra/node_modules/@clawup/core/dist/skills.js +52 -0
  182. package/infra/node_modules/@clawup/core/dist/skills.js.map +1 -0
  183. package/infra/node_modules/@clawup/core/dist/types.d.ts +59 -0
  184. package/infra/node_modules/@clawup/core/dist/types.d.ts.map +1 -0
  185. package/infra/node_modules/@clawup/core/dist/types.js +30 -0
  186. package/infra/node_modules/@clawup/core/dist/types.js.map +1 -0
  187. package/infra/node_modules/@clawup/core/package.json +46 -0
  188. package/infra/package.json +12 -0
  189. package/package.json +43 -0
  190. package/scripts/postinstall.mjs +395 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * Deploy Tool — Deploy agents with pulumi up
4
+ *
5
+ * Platform-agnostic implementation using RuntimeAdapter.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.deployTool = void 0;
12
+ const config_1 = require("../lib/config");
13
+ const core_1 = require("@clawup/core");
14
+ const workspace_1 = require("../lib/workspace");
15
+ const tailscale_1 = require("../lib/tailscale");
16
+ const tool_helpers_1 = require("../lib/tool-helpers");
17
+ const ui_1 = require("../lib/ui");
18
+ const picocolors_1 = __importDefault(require("picocolors"));
19
+ /**
20
+ * Deploy tool implementation
21
+ */
22
+ const deployTool = async (runtime, options) => {
23
+ const { ui, exec } = runtime;
24
+ ui.intro("Agent Army");
25
+ // Ensure workspace is set up (no-op in dev mode)
26
+ const wsResult = (0, workspace_1.ensureWorkspace)();
27
+ if (!wsResult.ok) {
28
+ ui.log.error(wsResult.error ?? "Failed to set up workspace.");
29
+ process.exit(1);
30
+ }
31
+ const cwd = (0, workspace_1.getWorkspaceDir)();
32
+ // Resolve config name and load manifest
33
+ let configName;
34
+ try {
35
+ configName = (0, config_1.resolveConfigName)(options.config);
36
+ }
37
+ catch (err) {
38
+ ui.log.error(err.message);
39
+ process.exit(1);
40
+ }
41
+ const manifest = (0, config_1.loadManifest)(configName);
42
+ if (!manifest) {
43
+ ui.log.error(`Config '${configName}' could not be loaded.`);
44
+ process.exit(1);
45
+ }
46
+ // Select/create stack
47
+ const selectResult = exec.capture("pulumi", ["stack", "select", manifest.stackName], cwd);
48
+ if (selectResult.exitCode !== 0) {
49
+ const initResult = exec.capture("pulumi", ["stack", "init", manifest.stackName], cwd);
50
+ if (initResult.exitCode !== 0) {
51
+ ui.log.error(initResult.stderr || selectResult.stderr);
52
+ ui.log.error(`Could not select Pulumi stack "${manifest.stackName}".`);
53
+ process.exit(1);
54
+ }
55
+ }
56
+ // Calculate estimated cost
57
+ const totalCost = manifest.agents.reduce((sum, a) => {
58
+ const costs = manifest.provider === "hetzner" ? core_1.HETZNER_COST_ESTIMATES : core_1.COST_ESTIMATES;
59
+ return sum + (costs[a.instanceType ?? manifest.instanceType] ?? 30);
60
+ }, 0);
61
+ // Show deployment summary
62
+ ui.note([
63
+ `Stack: ${manifest.stackName}`,
64
+ `Region: ${manifest.region}`,
65
+ ``,
66
+ `Agents (${manifest.agents.length}):`,
67
+ (0, ui_1.formatAgentList)(manifest.agents),
68
+ ``,
69
+ `Estimated cost: ${(0, ui_1.formatCost)(totalCost)}`,
70
+ ].join("\n"), "Deployment Summary");
71
+ // Confirm deployment
72
+ if (!options.yes) {
73
+ const confirmed = await ui.confirm({
74
+ message: "Proceed with deployment?",
75
+ });
76
+ if (!confirmed) {
77
+ ui.cancel("Deployment cancelled.");
78
+ }
79
+ }
80
+ // Sync manifest to project root so the Pulumi program can read it
81
+ (0, config_1.syncManifestToProject)(configName, cwd);
82
+ // Sync instanceType from manifest to Pulumi config
83
+ exec.capture("pulumi", ["config", "set", "instanceType", manifest.instanceType], cwd);
84
+ // Clean up stale Tailscale devices before deploying
85
+ // This prevents duplicates when Pulumi replaces servers (create-before-delete)
86
+ const tailnetDnsName = (0, tool_helpers_1.getConfig)(exec, "tailnetDnsName", cwd);
87
+ const tailscaleApiKey = (0, tool_helpers_1.getConfig)(exec, "tailscaleApiKey", cwd);
88
+ if (tailnetDnsName && tailscaleApiKey) {
89
+ const spinner = ui.spinner("Cleaning up stale Tailscale devices...");
90
+ const { cleaned, failed } = (0, tailscale_1.cleanupTailscaleDevices)(tailscaleApiKey, tailnetDnsName, manifest.stackName, manifest.agents);
91
+ if (cleaned.length > 0) {
92
+ spinner.stop(`Removed ${cleaned.length} stale Tailscale device(s)`);
93
+ }
94
+ else {
95
+ spinner.stop("No stale Tailscale devices found");
96
+ }
97
+ if (failed.length > 0) {
98
+ ui.log.warn(`Could not remove some devices: ${failed.join(", ")}. Check https://login.tailscale.com/admin/machines`);
99
+ }
100
+ }
101
+ // Ensure MagicDNS is enabled (required for Tailscale hostname resolution)
102
+ if (tailscaleApiKey) {
103
+ const spinner = ui.spinner("Ensuring Tailscale MagicDNS is enabled...");
104
+ const magicDnsChanged = (0, tailscale_1.ensureMagicDns)(tailscaleApiKey);
105
+ spinner.stop(magicDnsChanged ? "MagicDNS enabled" : "MagicDNS OK");
106
+ }
107
+ // Ensure Tailscale Funnel prerequisites (identity plugins may need webhooks)
108
+ if (tailscaleApiKey) {
109
+ const spinner = ui.spinner("Ensuring Tailscale Funnel prerequisites...");
110
+ const funnel = (0, tailscale_1.ensureTailscaleFunnel)(tailscaleApiKey);
111
+ const changes = [];
112
+ if (funnel.funnelAcl)
113
+ changes.push("Funnel ACL enabled");
114
+ spinner.stop(changes.length > 0 ? changes.join(", ") : "Funnel prerequisites OK");
115
+ }
116
+ // Deploy
117
+ ui.log.step("Running pulumi up...");
118
+ console.log();
119
+ const exitCode = await exec.stream("pulumi", ["up", "--yes"], { cwd });
120
+ console.log();
121
+ if (exitCode !== 0) {
122
+ ui.log.error("Deployment failed. Check the output above for details.");
123
+ process.exit(1);
124
+ }
125
+ ui.log.success("Deployment complete!");
126
+ // Show outputs
127
+ const outputsResult = exec.capture("pulumi", [
128
+ "stack",
129
+ "output",
130
+ "--json",
131
+ "--show-secrets",
132
+ ], cwd);
133
+ if (outputsResult.exitCode === 0) {
134
+ try {
135
+ const outputs = JSON.parse(outputsResult.stdout);
136
+ const lines = [];
137
+ for (const agent of manifest.agents) {
138
+ const urlKey = `${agent.role}TailscaleUrl`;
139
+ const ipKey = `${agent.role}PublicIp`;
140
+ const idKey = `${agent.role}InstanceId`;
141
+ lines.push(`${agent.displayName} (${agent.role}):`);
142
+ if (outputs[urlKey])
143
+ lines.push(` Tailscale URL: ${outputs[urlKey]}`);
144
+ if (outputs[ipKey])
145
+ lines.push(` Public IP: ${outputs[ipKey]}`);
146
+ if (outputs[idKey])
147
+ lines.push(` Instance ID: ${outputs[idKey]}`);
148
+ lines.push("");
149
+ }
150
+ ui.note(lines.join("\n"), "Agent Details");
151
+ // Show webhook URLs if available
152
+ const webhookLines = [];
153
+ for (const agent of manifest.agents) {
154
+ const webhookUrl = outputs[`${agent.role}WebhookUrl`];
155
+ if (webhookUrl) {
156
+ webhookLines.push(` ${agent.displayName} (${agent.role}): ${webhookUrl}`);
157
+ }
158
+ }
159
+ if (webhookLines.length > 0) {
160
+ ui.note(webhookLines.join("\n"), "Webhook URLs");
161
+ }
162
+ }
163
+ catch (err) {
164
+ ui.log.warn(`Could not parse stack outputs: ${err instanceof Error ? err.message : String(err)}`);
165
+ }
166
+ }
167
+ // Remind user about Tailscale if not connected
168
+ if (!(0, tailscale_1.isTailscaleInstalled)()) {
169
+ const hint = process.platform === "darwin"
170
+ ? "Install from the Mac App Store or https://tailscale.com/download"
171
+ : "Install from https://tailscale.com/download";
172
+ ui.log.warn(`Tailscale is required to connect to agents.\n ${hint}\n Then run: ${picocolors_1.default.cyan("tailscale up")}`);
173
+ }
174
+ else if (!(0, tailscale_1.isTailscaleRunning)()) {
175
+ ui.log.warn(`Tailscale is not running. Start it before validating agents.\n Open the Tailscale app or run: ${picocolors_1.default.cyan("tailscale up")}`);
176
+ }
177
+ ui.log.info(`Run ${picocolors_1.default.cyan("clawup webhooks setup")} to configure Linear webhooks for your agents.`);
178
+ ui.outro("Agents will be ready in 3-5 minutes. Run `clawup validate` to check.");
179
+ };
180
+ exports.deployTool = deployTool;
181
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../tools/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Destroy Tool — Tear down resources with safety confirmations
3
+ *
4
+ * Platform-agnostic implementation using RuntimeAdapter.
5
+ */
6
+ import type { ToolImplementation } from "../adapters";
7
+ export interface DestroyOptions {
8
+ /** Skip confirmation prompts (dangerous!) */
9
+ yes?: boolean;
10
+ /** Config name (auto-detected if only one) */
11
+ config?: string;
12
+ }
13
+ /**
14
+ * Destroy tool implementation
15
+ */
16
+ export declare const destroyTool: ToolImplementation<DestroyOptions>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Destroy Tool — Tear down resources with safety confirmations
4
+ *
5
+ * Platform-agnostic implementation using RuntimeAdapter.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.destroyTool = void 0;
9
+ const config_1 = require("../lib/config");
10
+ const tailscale_1 = require("../lib/tailscale");
11
+ const workspace_1 = require("../lib/workspace");
12
+ const tool_helpers_1 = require("../lib/tool-helpers");
13
+ const ui_1 = require("../lib/ui");
14
+ /**
15
+ * Destroy tool implementation
16
+ */
17
+ const destroyTool = async (runtime, options) => {
18
+ const { ui, exec } = runtime;
19
+ ui.intro("Agent Army");
20
+ // Ensure workspace is set up (no-op in dev mode)
21
+ const wsResult = (0, workspace_1.ensureWorkspace)();
22
+ if (!wsResult.ok) {
23
+ ui.log.error(wsResult.error ?? "Failed to set up workspace.");
24
+ process.exit(1);
25
+ }
26
+ const cwd = (0, workspace_1.getWorkspaceDir)();
27
+ // Resolve config name and load manifest
28
+ let configName;
29
+ try {
30
+ configName = (0, config_1.resolveConfigName)(options.config);
31
+ }
32
+ catch (err) {
33
+ ui.log.error(err.message);
34
+ process.exit(1);
35
+ }
36
+ const manifest = (0, config_1.loadManifest)(configName);
37
+ if (!manifest) {
38
+ ui.log.error(`Config '${configName}' could not be loaded.`);
39
+ process.exit(1);
40
+ }
41
+ // Select/create stack
42
+ const selectResult = exec.capture("pulumi", ["stack", "select", manifest.stackName], cwd);
43
+ if (selectResult.exitCode !== 0) {
44
+ const initResult = exec.capture("pulumi", ["stack", "init", manifest.stackName], cwd);
45
+ if (initResult.exitCode !== 0) {
46
+ ui.log.error(`Could not select Pulumi stack "${manifest.stackName}".`);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ // Show what will be destroyed (provider-aware)
51
+ const manifestProvider = manifest.provider ?? "aws";
52
+ const resourceLabel = manifestProvider === "hetzner" ? "Hetzner servers" : "EC2 instances";
53
+ const infraLabel = manifestProvider === "hetzner" ? "Firewall rules" : "VPC, subnet, and security group";
54
+ ui.note([
55
+ `Stack: ${manifest.stackName}`,
56
+ `Region: ${manifest.region}`,
57
+ ``,
58
+ `Agents (${manifest.agents.length}):`,
59
+ (0, ui_1.formatAgentList)(manifest.agents),
60
+ ``,
61
+ `This will PERMANENTLY DESTROY:`,
62
+ ` - ${manifest.agents.length} ${resourceLabel}`,
63
+ ` - All workspace data on those instances`,
64
+ ` - ${infraLabel}`,
65
+ ` - Tailscale device registrations`,
66
+ ].join("\n"), "Destruction Plan");
67
+ // Confirm
68
+ if (!options.yes) {
69
+ const typedName = await ui.text({
70
+ message: `Type the stack name to confirm: "${manifest.stackName}"`,
71
+ validate: (val) => {
72
+ if (val !== manifest.stackName)
73
+ return `Must type "${manifest.stackName}" to confirm`;
74
+ return undefined;
75
+ },
76
+ });
77
+ const confirmed = await ui.confirm({
78
+ message: "Are you ABSOLUTELY sure?",
79
+ initialValue: false,
80
+ });
81
+ if (!confirmed) {
82
+ ui.cancel("Destruction cancelled.");
83
+ }
84
+ }
85
+ // Sync manifest to project root so the Pulumi program can read it
86
+ (0, config_1.syncManifestToProject)(configName, cwd);
87
+ // Destroy infrastructure
88
+ ui.log.step("Running pulumi destroy...");
89
+ console.log();
90
+ const exitCode = await exec.stream("pulumi", ["destroy", "--yes"], { cwd });
91
+ console.log();
92
+ if (exitCode !== 0) {
93
+ ui.log.error("Destruction failed. Check the output above for details.");
94
+ process.exit(1);
95
+ }
96
+ // Clean up Tailscale devices after infrastructure is destroyed
97
+ const tailnetDnsName = (0, tool_helpers_1.getConfig)(exec, "tailnetDnsName", cwd);
98
+ const tailscaleApiKey = (0, tool_helpers_1.getConfig)(exec, "tailscaleApiKey", cwd);
99
+ if (tailnetDnsName && tailscaleApiKey) {
100
+ const spinner = ui.spinner("Removing agents from Tailscale...");
101
+ const { cleaned, failed } = (0, tailscale_1.cleanupTailscaleDevices)(tailscaleApiKey, tailnetDnsName, manifest.stackName, manifest.agents);
102
+ if (failed.length === 0) {
103
+ spinner.stop(cleaned.length > 0 ? "Tailscale devices cleaned up" : "No Tailscale devices found");
104
+ }
105
+ else {
106
+ spinner.stop("Some Tailscale devices could not be removed");
107
+ ui.log.warn(`Could not remove: ${failed.join(", ")}. Remove manually from https://login.tailscale.com/admin/machines`);
108
+ }
109
+ }
110
+ else if (tailnetDnsName && !tailscaleApiKey) {
111
+ ui.log.warn("No Tailscale API key configured - devices must be removed manually.");
112
+ console.log(" Remove devices at: https://login.tailscale.com/admin/machines");
113
+ console.log(" Tip: Set a Tailscale API key (`clawup init`) for automatic cleanup.");
114
+ }
115
+ ui.log.success(`Stack "${manifest.stackName}" has been destroyed.`);
116
+ ui.outro("Done!");
117
+ };
118
+ exports.destroyTool = destroyTool;
119
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../tools/destroy.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,0CAAuF;AACvF,gDAA2D;AAC3D,gDAAoE;AACpE,sDAAgD;AAChD,kCAA4C;AAS5C;;GAEG;AACI,MAAM,WAAW,GAAuC,KAAK,EAClE,OAAuB,EACvB,OAAuB,EACvB,EAAE;IACF,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7B,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvB,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAA,2BAAe,GAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,2BAAe,GAAE,CAAC;IAE9B,wCAAwC;IACxC,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,qBAAY,EAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,UAAU,wBAAwB,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1F,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACtF,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACpD,MAAM,aAAa,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;IAC3F,MAAM,UAAU,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iCAAiC,CAAC;IAEzG,EAAE,CAAC,IAAI,CACL;QACE,WAAW,QAAQ,CAAC,SAAS,EAAE;QAC/B,WAAW,QAAQ,CAAC,MAAM,EAAE;QAC5B,EAAE;QACF,WAAW,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI;QACrC,IAAA,oBAAe,EAAC,QAAQ,CAAC,MAAM,CAAC;QAChC,EAAE;QACF,gCAAgC;QAChC,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE;QAChD,2CAA2C;QAC3C,OAAO,UAAU,EAAE;QACnB,oCAAoC;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,kBAAkB,CACnB,CAAC;IAEF,UAAU;IACV,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,oCAAoC,QAAQ,CAAC,SAAS,GAAG;YAClE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChB,IAAI,GAAG,KAAK,QAAQ,CAAC,SAAS;oBAAE,OAAO,cAAc,QAAQ,CAAC,SAAS,cAAc,CAAC;gBACtF,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,0BAA0B;YACnC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAA,8BAAqB,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAEvC,yBAAyB;IACzB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,MAAM,cAAc,GAAG,IAAA,wBAAS,EAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAA,wBAAS,EAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAEhE,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAChE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAA,mCAAuB,EACjD,eAAe,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CACrE,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC5D,EAAE,CAAC,GAAG,CAAC,IAAI,CACT,qBAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mEAAmE,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACvF,CAAC;IAED,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,QAAQ,CAAC,SAAS,uBAAuB,CAAC,CAAC;IACpE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACpB,CAAC,CAAC;AAzHW,QAAA,WAAW,eAyHtB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tools Module
3
+ *
4
+ * Platform-agnostic tool implementations using the RuntimeAdapter pattern.
5
+ * Each tool is a ToolImplementation that can run with any adapter.
6
+ *
7
+ * @example
8
+ * import { deployTool, createCLIAdapter } from './tools';
9
+ *
10
+ * // Run with CLI adapter
11
+ * await deployTool(createCLIAdapter(), { yes: false });
12
+ */
13
+ export { deployTool, type DeployOptions } from "./deploy";
14
+ export { statusTool, type StatusOptions } from "./status";
15
+ export { validateTool, type ValidateOptions } from "./validate";
16
+ export { destroyTool, type DestroyOptions } from "./destroy";
17
+ export { redeployTool, type RedeployOptions } from "./redeploy";
18
+ export { pushTool, type PushOptions } from "./push";
19
+ export { webhooksSetupTool, type WebhooksSetupOptions } from "./webhooks";
20
+ export { type RuntimeAdapter, type ToolImplementation, type ToolDefinition, createCLIAdapter, } from "../adapters";
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * Tools Module
4
+ *
5
+ * Platform-agnostic tool implementations using the RuntimeAdapter pattern.
6
+ * Each tool is a ToolImplementation that can run with any adapter.
7
+ *
8
+ * @example
9
+ * import { deployTool, createCLIAdapter } from './tools';
10
+ *
11
+ * // Run with CLI adapter
12
+ * await deployTool(createCLIAdapter(), { yes: false });
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.createCLIAdapter = exports.webhooksSetupTool = exports.pushTool = exports.redeployTool = exports.destroyTool = exports.validateTool = exports.statusTool = exports.deployTool = void 0;
16
+ // Export all tools
17
+ var deploy_1 = require("./deploy");
18
+ Object.defineProperty(exports, "deployTool", { enumerable: true, get: function () { return deploy_1.deployTool; } });
19
+ var status_1 = require("./status");
20
+ Object.defineProperty(exports, "statusTool", { enumerable: true, get: function () { return status_1.statusTool; } });
21
+ var validate_1 = require("./validate");
22
+ Object.defineProperty(exports, "validateTool", { enumerable: true, get: function () { return validate_1.validateTool; } });
23
+ var destroy_1 = require("./destroy");
24
+ Object.defineProperty(exports, "destroyTool", { enumerable: true, get: function () { return destroy_1.destroyTool; } });
25
+ var redeploy_1 = require("./redeploy");
26
+ Object.defineProperty(exports, "redeployTool", { enumerable: true, get: function () { return redeploy_1.redeployTool; } });
27
+ var push_1 = require("./push");
28
+ Object.defineProperty(exports, "pushTool", { enumerable: true, get: function () { return push_1.pushTool; } });
29
+ var webhooks_1 = require("./webhooks");
30
+ Object.defineProperty(exports, "webhooksSetupTool", { enumerable: true, get: function () { return webhooks_1.webhooksSetupTool; } });
31
+ // Re-export adapter types and factory for convenience
32
+ var adapters_1 = require("../adapters");
33
+ Object.defineProperty(exports, "createCLIAdapter", { enumerable: true, get: function () { return adapters_1.createCLIAdapter; } });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../tools/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,mBAAmB;AACnB,mCAA0D;AAAjD,oGAAA,UAAU,OAAA;AACnB,mCAA0D;AAAjD,oGAAA,UAAU,OAAA;AACnB,uCAAgE;AAAvD,wGAAA,YAAY,OAAA;AACrB,qCAA6D;AAApD,sGAAA,WAAW,OAAA;AACpB,uCAAgE;AAAvD,wGAAA,YAAY,OAAA;AACrB,+BAAoD;AAA3C,gGAAA,QAAQ,OAAA;AACjB,uCAA0E;AAAjE,6GAAA,iBAAiB,OAAA;AAE1B,sDAAsD;AACtD,wCAKqB;AADnB,4GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Push Tool — Live-update running agents via Tailscale SSH
3
+ *
4
+ * Syncs workspace files, skills, config, and OpenClaw updates to
5
+ * running agent instances without redeploying infrastructure.
6
+ *
7
+ * Platform-agnostic implementation using RuntimeAdapter.
8
+ */
9
+ import type { ToolImplementation } from "../adapters";
10
+ export interface PushOptions {
11
+ /** Sync skills to remote workspace */
12
+ skills?: boolean;
13
+ /** Sync workspace files to remote agents */
14
+ workspace?: boolean;
15
+ /** Remove remote memory/ dir and MEMORY.md */
16
+ memoryReset?: boolean;
17
+ /** Run npm install -g openclaw@latest + gateway restart */
18
+ openclaw?: boolean;
19
+ /** Copy local openclaw.json to remote + gateway restart */
20
+ pushConfig?: boolean;
21
+ /** Filter to a single agent (name, role, or alias) */
22
+ agent?: string;
23
+ /** Config name (auto-detected if only one) */
24
+ config?: string;
25
+ }
26
+ /**
27
+ * Push tool implementation
28
+ */
29
+ export declare const pushTool: ToolImplementation<PushOptions>;