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,126 @@
1
+ "use strict";
2
+ /**
3
+ * Update the clawup CLI to the latest version
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.updateCommand = updateCommand;
43
+ const p = __importStar(require("@clack/prompts"));
44
+ const picocolors_1 = __importDefault(require("picocolors"));
45
+ const exec_1 = require("../lib/exec");
46
+ async function updateCommand(_opts) {
47
+ p.intro(picocolors_1.default.bgCyan(picocolors_1.default.black(" Agent Army — Update ")));
48
+ const s = p.spinner();
49
+ s.start("Checking npm for latest version…");
50
+ // Fetch latest version info
51
+ const { default: https } = await Promise.resolve().then(() => __importStar(require("https")));
52
+ const latest = await new Promise((resolve) => {
53
+ const req = https.get("https://registry.npmjs.org/clawup/latest", { timeout: 5000 }, (res) => {
54
+ let data = "";
55
+ res.on("data", (chunk) => (data += chunk));
56
+ res.on("end", () => {
57
+ try {
58
+ resolve(JSON.parse(data).version ?? null);
59
+ }
60
+ catch {
61
+ resolve(null);
62
+ }
63
+ });
64
+ });
65
+ req.on("timeout", () => { req.destroy(); resolve(null); });
66
+ req.on("error", () => resolve(null));
67
+ });
68
+ if (!latest) {
69
+ s.stop("Failed to reach npm registry");
70
+ p.log.error("Could not check for updates. Check your internet connection.");
71
+ process.exit(1);
72
+ }
73
+ // Read current version (go up two levels: dist/commands/ → dist/ → cli/)
74
+ const fs = await Promise.resolve().then(() => __importStar(require("fs")));
75
+ const path = await Promise.resolve().then(() => __importStar(require("path")));
76
+ const pkgJson = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "..", "package.json"), "utf-8"));
77
+ const current = pkgJson.version;
78
+ s.stop(`Current: ${picocolors_1.default.dim(current)} Latest: ${picocolors_1.default.green(latest)}`);
79
+ // Compare versions
80
+ const cParts = current.split(".").map(Number);
81
+ const lParts = latest.split(".").map(Number);
82
+ let isOutdated = false;
83
+ for (let i = 0; i < 3; i++) {
84
+ if ((lParts[i] ?? 0) > (cParts[i] ?? 0)) {
85
+ isOutdated = true;
86
+ break;
87
+ }
88
+ if ((lParts[i] ?? 0) < (cParts[i] ?? 0))
89
+ break;
90
+ }
91
+ if (!isOutdated) {
92
+ p.log.success("You're already on the latest version!");
93
+ p.outro("Done");
94
+ return;
95
+ }
96
+ p.log.step(`Updating ${picocolors_1.default.dim(current)} → ${picocolors_1.default.green(latest)}`);
97
+ console.log();
98
+ // Retry logic: npm registry metadata can propagate before the tarball is
99
+ // available on the CDN, causing ETARGET errors on freshly-published versions.
100
+ const MAX_RETRIES = 3;
101
+ const RETRY_DELAY_MS = 10_000;
102
+ let exitCode = 1;
103
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
104
+ exitCode = await (0, exec_1.stream)("npm", ["install", "-g", `clawup@${latest}`]);
105
+ if (exitCode === 0)
106
+ break;
107
+ if (attempt < MAX_RETRIES) {
108
+ console.log();
109
+ p.log.warn(`Install failed (attempt ${attempt}/${MAX_RETRIES}). ` +
110
+ `Retrying in ${RETRY_DELAY_MS / 1000}s — the new version may still be propagating…`);
111
+ await new Promise((r) => setTimeout(r, RETRY_DELAY_MS));
112
+ console.log();
113
+ }
114
+ }
115
+ console.log();
116
+ if (exitCode === 0) {
117
+ p.log.success(`Updated to ${picocolors_1.default.green(latest)}`);
118
+ }
119
+ else {
120
+ p.log.error("Update failed. You may need to run with sudo:");
121
+ p.log.message(` sudo npm install -g clawup@${latest}`);
122
+ process.exit(1);
123
+ }
124
+ p.outro("Done");
125
+ }
126
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * clawup validate — Health check agents via Tailscale SSH
3
+ *
4
+ * This command wraps the platform-agnostic validateTool with the CLI adapter.
5
+ */
6
+ import { type ValidateOptions } from "../tools";
7
+ export declare function validateCommand(opts: ValidateOptions): Promise<void>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * clawup validate — Health check agents via Tailscale SSH
4
+ *
5
+ * This command wraps the platform-agnostic validateTool with the CLI adapter.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.validateCommand = validateCommand;
9
+ const tools_1 = require("../tools");
10
+ async function validateCommand(opts) {
11
+ await (0, tools_1.validateTool)((0, tools_1.createCLIAdapter)(), opts);
12
+ }
13
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../commands/validate.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAIH,0CAEC;AAJD,oCAAgF;AAEzE,KAAK,UAAU,eAAe,CAAC,IAAqB;IACzD,MAAM,IAAA,oBAAY,EAAC,IAAA,wBAAgB,GAAE,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * clawup webhooks setup — Configure Linear webhooks for deployed agents
3
+ *
4
+ * This command wraps the platform-agnostic webhooksSetupTool with the CLI adapter.
5
+ */
6
+ import { type WebhooksSetupOptions } from "../tools";
7
+ export declare function webhooksSetupCommand(opts: WebhooksSetupOptions): Promise<void>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * clawup webhooks setup — Configure Linear webhooks for deployed agents
4
+ *
5
+ * This command wraps the platform-agnostic webhooksSetupTool with the CLI adapter.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.webhooksSetupCommand = webhooksSetupCommand;
9
+ const tools_1 = require("../tools");
10
+ async function webhooksSetupCommand(opts) {
11
+ await (0, tools_1.webhooksSetupTool)((0, tools_1.createCLIAdapter)(), opts);
12
+ }
13
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../commands/webhooks.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAIH,oDAEC;AAJD,oCAA0F;AAEnF,KAAK,UAAU,oBAAoB,CAAC,IAA0B;IACnE,MAAM,IAAA,yBAAiB,EAAC,IAAA,wBAAgB,GAAE,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const os_1 = require("os");
7
+ const identity_1 = require("@clawup/core/identity");
8
+ /** Helper to create a valid identity manifest object */
9
+ function validManifest(overrides = {}) {
10
+ return {
11
+ name: "test-agent",
12
+ displayName: "Test Agent",
13
+ role: "eng",
14
+ emoji: "wrench",
15
+ description: "A test agent",
16
+ volumeSize: 30,
17
+ skills: ["coding"],
18
+ templateVars: ["OWNER_NAME"],
19
+ ...overrides,
20
+ };
21
+ }
22
+ /** Helper to scaffold an identity directory */
23
+ function createIdentityDir(baseDir, subfolder, manifest, files = {}) {
24
+ const dir = (0, path_1.join)(baseDir, subfolder);
25
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
26
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.json"), JSON.stringify(manifest, null, 2));
27
+ for (const [path, content] of Object.entries(files)) {
28
+ const full = (0, path_1.join)(dir, path);
29
+ (0, fs_1.mkdirSync)((0, path_1.join)(full, ".."), { recursive: true });
30
+ (0, fs_1.writeFileSync)(full, content);
31
+ }
32
+ return dir;
33
+ }
34
+ (0, vitest_1.describe)("fetchIdentity", () => {
35
+ let tmpDir;
36
+ let cacheDir;
37
+ (0, vitest_1.beforeEach)(() => {
38
+ tmpDir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), "identity-test-"));
39
+ cacheDir = (0, path_1.join)(tmpDir, "cache");
40
+ });
41
+ (0, vitest_1.afterEach)(() => {
42
+ (0, fs_1.rmSync)(tmpDir, { recursive: true, force: true });
43
+ });
44
+ (0, vitest_1.it)("reads identity from a local directory path", async () => {
45
+ const dir = createIdentityDir(tmpDir, "my-agent", validManifest(), {
46
+ "SOUL.md": "# Soul\nI am a test agent.",
47
+ "IDENTITY.md": "# Identity\nTest identity.",
48
+ });
49
+ const result = await (0, identity_1.fetchIdentity)(dir, cacheDir);
50
+ (0, vitest_1.expect)(result.manifest.name).toBe("test-agent");
51
+ (0, vitest_1.expect)(result.manifest.displayName).toBe("Test Agent");
52
+ (0, vitest_1.expect)(result.manifest.role).toBe("eng");
53
+ (0, vitest_1.expect)(result.manifest.volumeSize).toBe(30);
54
+ (0, vitest_1.expect)(result.manifest.skills).toEqual(["coding"]);
55
+ (0, vitest_1.expect)(result.manifest.templateVars).toEqual(["OWNER_NAME"]);
56
+ (0, vitest_1.expect)(result.files["SOUL.md"]).toBe("# Soul\nI am a test agent.");
57
+ (0, vitest_1.expect)(result.files["IDENTITY.md"]).toBe("# Identity\nTest identity.");
58
+ // manifest file itself should NOT be in files
59
+ (0, vitest_1.expect)(result.files["identity.json"]).toBeUndefined();
60
+ (0, vitest_1.expect)(result.files["identity.yaml"]).toBeUndefined();
61
+ });
62
+ (0, vitest_1.it)("supports subfolder syntax for local paths", async () => {
63
+ const baseDir = (0, path_1.join)(tmpDir, "mono-repo");
64
+ createIdentityDir(baseDir, "agents/juno", validManifest({ name: "juno", displayName: "Juno" }), {
65
+ "SOUL.md": "# Juno Soul",
66
+ });
67
+ const result = await (0, identity_1.fetchIdentity)((0, path_1.join)(baseDir, "agents", "juno"), cacheDir);
68
+ (0, vitest_1.expect)(result.manifest.name).toBe("juno");
69
+ (0, vitest_1.expect)(result.files["SOUL.md"]).toBe("# Juno Soul");
70
+ });
71
+ (0, vitest_1.it)("reads nested skill files", async () => {
72
+ const dir = createIdentityDir(tmpDir, "with-skills", validManifest(), {
73
+ "skills/my-skill/SKILL.md": "# My Skill",
74
+ "skills/my-skill/refs/api.md": "API docs",
75
+ });
76
+ const result = await (0, identity_1.fetchIdentity)(dir, cacheDir);
77
+ (0, vitest_1.expect)(result.files["skills/my-skill/SKILL.md"]).toBe("# My Skill");
78
+ (0, vitest_1.expect)(result.files["skills/my-skill/refs/api.md"]).toBe("API docs");
79
+ });
80
+ (0, vitest_1.it)("includes optional fields when present", async () => {
81
+ const manifest = validManifest({
82
+ instanceType: "t3.large",
83
+ plugins: ["openclaw-linear"],
84
+ pluginDefaults: {
85
+ "openclaw-linear": {
86
+ stateActions: { triage: "remove", backlog: "add" },
87
+ },
88
+ },
89
+ });
90
+ const dir = createIdentityDir(tmpDir, "optional", manifest);
91
+ const result = await (0, identity_1.fetchIdentity)(dir, cacheDir);
92
+ (0, vitest_1.expect)(result.manifest.instanceType).toBe("t3.large");
93
+ (0, vitest_1.expect)(result.manifest.plugins).toEqual(["openclaw-linear"]);
94
+ (0, vitest_1.expect)(result.manifest.pluginDefaults).toEqual({
95
+ "openclaw-linear": {
96
+ stateActions: { triage: "remove", backlog: "add" },
97
+ },
98
+ });
99
+ });
100
+ (0, vitest_1.it)("throws when identity manifest is missing", async () => {
101
+ const dir = (0, path_1.join)(tmpDir, "empty");
102
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
103
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)(dir, cacheDir)).rejects.toThrow("identity.yaml not found");
104
+ });
105
+ (0, vitest_1.it)("throws when identity.json is malformed", async () => {
106
+ const dir = (0, path_1.join)(tmpDir, "bad-json");
107
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
108
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.json"), "{ not valid json }}}");
109
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)(dir, cacheDir)).rejects.toThrow("Failed to parse identity.json");
110
+ });
111
+ (0, vitest_1.it)("reads identity.yaml when present", async () => {
112
+ const dir = (0, path_1.join)(tmpDir, "yaml-agent");
113
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
114
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.yaml"), [
115
+ "name: yaml-test",
116
+ "displayName: YAML Test",
117
+ "role: eng",
118
+ "emoji: wrench",
119
+ "description: A YAML test agent",
120
+ "volumeSize: 30",
121
+ "plugins:",
122
+ " - openclaw-linear",
123
+ "skills:",
124
+ " - coding",
125
+ "templateVars:",
126
+ " - OWNER_NAME",
127
+ ].join("\n"));
128
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "SOUL.md"), "# YAML Soul");
129
+ const result = await (0, identity_1.fetchIdentity)(dir, cacheDir);
130
+ (0, vitest_1.expect)(result.manifest.name).toBe("yaml-test");
131
+ (0, vitest_1.expect)(result.manifest.plugins).toEqual(["openclaw-linear"]);
132
+ (0, vitest_1.expect)(result.files["SOUL.md"]).toBe("# YAML Soul");
133
+ (0, vitest_1.expect)(result.files["identity.yaml"]).toBeUndefined();
134
+ });
135
+ (0, vitest_1.it)("prefers identity.yaml over identity.json", async () => {
136
+ const dir = (0, path_1.join)(tmpDir, "both-formats");
137
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
138
+ // Write both files with different names to verify YAML wins
139
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.yaml"), [
140
+ "name: from-yaml",
141
+ "displayName: YAML Agent",
142
+ "role: eng",
143
+ "emoji: wrench",
144
+ "description: From YAML",
145
+ "volumeSize: 30",
146
+ "skills: [coding]",
147
+ "templateVars: [OWNER_NAME]",
148
+ ].join("\n"));
149
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.json"), JSON.stringify(validManifest({ name: "from-json" })));
150
+ const result = await (0, identity_1.fetchIdentity)(dir, cacheDir);
151
+ (0, vitest_1.expect)(result.manifest.name).toBe("from-yaml");
152
+ });
153
+ (0, vitest_1.it)("throws when required fields are missing", async () => {
154
+ const dir = (0, path_1.join)(tmpDir, "missing-fields");
155
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
156
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.json"), JSON.stringify({ name: "only-name" }));
157
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)(dir, cacheDir)).rejects.toThrow("missing required fields");
158
+ });
159
+ (0, vitest_1.it)("includes field names in validation error", async () => {
160
+ const dir = (0, path_1.join)(tmpDir, "missing-specific");
161
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
162
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, "identity.json"), JSON.stringify({ name: "test", displayName: "Test" }));
163
+ try {
164
+ await (0, identity_1.fetchIdentity)(dir, cacheDir);
165
+ vitest_1.expect.fail("Should have thrown");
166
+ }
167
+ catch (err) {
168
+ const msg = err.message;
169
+ (0, vitest_1.expect)(msg).toContain("role");
170
+ (0, vitest_1.expect)(msg).toContain("volumeSize");
171
+ (0, vitest_1.expect)(msg).toContain("skills");
172
+ }
173
+ });
174
+ (0, vitest_1.it)("throws when directory does not exist", async () => {
175
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)((0, path_1.join)(tmpDir, "nonexistent"), cacheDir)).rejects.toThrow("Identity directory not found");
176
+ });
177
+ (0, vitest_1.it)("throws when volumeSize is not a number", async () => {
178
+ const dir = createIdentityDir(tmpDir, "bad-type", validManifest({ volumeSize: "big" }));
179
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)(dir, cacheDir)).rejects.toThrow('"volumeSize" must be a number');
180
+ });
181
+ (0, vitest_1.it)("throws when skills is not an array", async () => {
182
+ const dir = createIdentityDir(tmpDir, "bad-skills", validManifest({ skills: "not-array" }));
183
+ await (0, vitest_1.expect)((0, identity_1.fetchIdentity)(dir, cacheDir)).rejects.toThrow('"skills" must be an array');
184
+ });
185
+ });
186
+ //# sourceMappingURL=identity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.test.js","sourceRoot":"","sources":["../../../lib/__tests__/identity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const core_1 = require("@clawup/core");
5
+ function makeAgent(overrides = {}) {
6
+ return {
7
+ name: "agent-test",
8
+ displayName: "Test",
9
+ role: "eng",
10
+ identity: "https://github.com/org/identities#eng",
11
+ volumeSize: 30,
12
+ ...overrides,
13
+ };
14
+ }
15
+ (0, vitest_1.describe)("validateAgentDefinition", () => {
16
+ (0, vitest_1.it)("accepts a valid identity-based agent", () => {
17
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent())).not.toThrow();
18
+ });
19
+ (0, vitest_1.it)("rejects agent missing identity", () => {
20
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent({ identity: "" }))).toThrow('missing required field "identity"');
21
+ });
22
+ (0, vitest_1.it)("rejects non-positive volumeSize", () => {
23
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent({ volumeSize: 0 }))).toThrow("positive number");
24
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent({ volumeSize: -5 }))).toThrow("positive number");
25
+ });
26
+ (0, vitest_1.it)("rejects missing required fields", () => {
27
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)({ ...makeAgent(), name: "" })).toThrow('missing required field "name"');
28
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)({ ...makeAgent(), displayName: "" })).toThrow('missing required field "displayName"');
29
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)({ ...makeAgent(), role: "" })).toThrow('missing required field "role"');
30
+ });
31
+ (0, vitest_1.it)("accepts agent with optional instanceType override", () => {
32
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent({ instanceType: "t3.large" }))).not.toThrow();
33
+ });
34
+ (0, vitest_1.it)("accepts agent with optional envVars", () => {
35
+ (0, vitest_1.expect)(() => (0, core_1.validateAgentDefinition)(makeAgent({ envVars: { FOO: "bar" } }))).not.toThrow();
36
+ });
37
+ });
38
+ //# sourceMappingURL=validate-agent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-agent.test.js","sourceRoot":"","sources":["../../../lib/__tests__/validate-agent.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,uCAA6E;AAE7E,SAAS,SAAS,CAAC,YAAsC,EAAE;IACzD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,uCAAuC;QACjD,UAAU,EAAE,EAAE;QACd,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAA,iBAAQ,EAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAuB,EAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CACrD,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAuB,EAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/F,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAuB,EAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACtD,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAE3C,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,EAAE,GAAG,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAC7D,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAElD,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACtD,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CACjE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,IAAA,eAAM,EAAC,GAAG,EAAE,CACV,IAAA,8BAAuB,EAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAChE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Load/save clawup manifests from ~/.clawup/configs/
3
+ */
4
+ import type { ClawupManifest, PluginConfigFile } from "@clawup/core";
5
+ /**
6
+ * Get the configs directory path (~/.clawup/configs/)
7
+ */
8
+ export declare function configsDir(): string;
9
+ /**
10
+ * Ensure the configs directory exists
11
+ */
12
+ export declare function ensureConfigsDir(): void;
13
+ /**
14
+ * Get the path to a config file by name
15
+ */
16
+ export declare function configPath(name: string): string;
17
+ /**
18
+ * Copy a named config to clawup.yaml so the Pulumi program can read it.
19
+ * When projectDir is provided, writes there instead of process.cwd().
20
+ */
21
+ export declare function syncManifestToProject(name: string, projectDir?: string): void;
22
+ /**
23
+ * Check if a config exists by name
24
+ */
25
+ export declare function manifestExists(name: string): boolean;
26
+ /**
27
+ * Load a manifest by name. Returns null if not found or invalid.
28
+ */
29
+ export declare function loadManifest(name: string): ClawupManifest | null;
30
+ /**
31
+ * Save a manifest by name
32
+ */
33
+ export declare function saveManifest(name: string, manifest: ClawupManifest): void;
34
+ /**
35
+ * List all saved config names
36
+ */
37
+ export declare function listManifests(): string[];
38
+ /**
39
+ * Delete a config by name. Returns true if deleted, false if not found.
40
+ */
41
+ export declare function deleteManifest(name: string): boolean;
42
+ /**
43
+ * Resolve a config name: auto-selects if only one config exists,
44
+ * errors with list if ambiguous or none found.
45
+ * @param name Optional explicit config name
46
+ * @returns The resolved config name
47
+ * @throws Error if no configs exist or multiple configs exist without explicit name
48
+ */
49
+ export declare function resolveConfigName(name?: string): string;
50
+ /**
51
+ * Get the plugins directory for a stack (~/.clawup/configs/<stackName>/plugins/)
52
+ * @deprecated Plugin config is now inline in the manifest. Use `clawup config migrate` to upgrade.
53
+ */
54
+ export declare function pluginsDir(stackName: string): string;
55
+ /**
56
+ * Ensure the plugins directory exists for a stack
57
+ * @deprecated Plugin config is now inline in the manifest.
58
+ */
59
+ export declare function ensurePluginsDir(stackName: string): void;
60
+ /**
61
+ * Load a plugin config file. Returns null if not found or invalid.
62
+ * @deprecated Plugin config is now inline in the manifest. Use `clawup config migrate` to upgrade.
63
+ */
64
+ export declare function loadPluginConfig(stackName: string, pluginName: string): PluginConfigFile | null;
65
+ /**
66
+ * Save a plugin config file
67
+ * @deprecated Plugin config is now inline in the manifest. Use `clawup config migrate` to upgrade.
68
+ */
69
+ export declare function savePluginConfig(stackName: string, pluginName: string, data: PluginConfigFile): void;