@herdctl/core 5.4.3 → 5.6.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 (148) hide show
  1. package/dist/config/__tests__/schema.test.js +19 -0
  2. package/dist/config/__tests__/schema.test.js.map +1 -1
  3. package/dist/config/index.d.ts +1 -1
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +3 -1
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/schema.d.ts +10 -18
  8. package/dist/config/schema.d.ts.map +1 -1
  9. package/dist/config/schema.js +4 -2
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
  12. package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
  13. package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
  14. package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
  15. package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
  16. package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
  17. package/dist/distribution/__tests__/agent-info.test.js +568 -0
  18. package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
  19. package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
  20. package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
  21. package/dist/distribution/__tests__/agent-remover.test.js +498 -0
  22. package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
  23. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
  24. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
  25. package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
  26. package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
  27. package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
  28. package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
  29. package/dist/distribution/__tests__/env-scanner.test.js +576 -0
  30. package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
  31. package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
  32. package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
  33. package/dist/distribution/__tests__/file-installer.test.js +714 -0
  34. package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
  35. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
  36. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
  37. package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
  38. package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
  39. package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
  40. package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
  41. package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
  42. package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
  43. package/dist/distribution/__tests__/integration.test.d.ts +10 -0
  44. package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
  45. package/dist/distribution/__tests__/integration.test.js +522 -0
  46. package/dist/distribution/__tests__/integration.test.js.map +1 -0
  47. package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
  48. package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
  49. package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
  50. package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
  51. package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
  52. package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
  53. package/dist/distribution/__tests__/repository-validator.test.js +447 -0
  54. package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
  55. package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
  56. package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
  57. package/dist/distribution/__tests__/source-specifier.test.js +533 -0
  58. package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
  59. package/dist/distribution/agent-discovery.d.ts +81 -0
  60. package/dist/distribution/agent-discovery.d.ts.map +1 -0
  61. package/dist/distribution/agent-discovery.js +264 -0
  62. package/dist/distribution/agent-discovery.js.map +1 -0
  63. package/dist/distribution/agent-info.d.ts +86 -0
  64. package/dist/distribution/agent-info.d.ts.map +1 -0
  65. package/dist/distribution/agent-info.js +225 -0
  66. package/dist/distribution/agent-info.js.map +1 -0
  67. package/dist/distribution/agent-remover.d.ts +83 -0
  68. package/dist/distribution/agent-remover.d.ts.map +1 -0
  69. package/dist/distribution/agent-remover.js +222 -0
  70. package/dist/distribution/agent-remover.js.map +1 -0
  71. package/dist/distribution/agent-repo-metadata.d.ts +181 -0
  72. package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
  73. package/dist/distribution/agent-repo-metadata.js +143 -0
  74. package/dist/distribution/agent-repo-metadata.js.map +1 -0
  75. package/dist/distribution/env-scanner.d.ts +78 -0
  76. package/dist/distribution/env-scanner.d.ts.map +1 -0
  77. package/dist/distribution/env-scanner.js +144 -0
  78. package/dist/distribution/env-scanner.js.map +1 -0
  79. package/dist/distribution/file-installer.d.ts +80 -0
  80. package/dist/distribution/file-installer.d.ts.map +1 -0
  81. package/dist/distribution/file-installer.js +268 -0
  82. package/dist/distribution/file-installer.js.map +1 -0
  83. package/dist/distribution/fleet-config-updater.d.ts +96 -0
  84. package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
  85. package/dist/distribution/fleet-config-updater.js +266 -0
  86. package/dist/distribution/fleet-config-updater.js.map +1 -0
  87. package/dist/distribution/index.d.ts +23 -0
  88. package/dist/distribution/index.d.ts.map +1 -0
  89. package/dist/distribution/index.js +42 -0
  90. package/dist/distribution/index.js.map +1 -0
  91. package/dist/distribution/installation-metadata.d.ts +191 -0
  92. package/dist/distribution/installation-metadata.d.ts.map +1 -0
  93. package/dist/distribution/installation-metadata.js +100 -0
  94. package/dist/distribution/installation-metadata.js.map +1 -0
  95. package/dist/distribution/repository-fetcher.d.ts +104 -0
  96. package/dist/distribution/repository-fetcher.d.ts.map +1 -0
  97. package/dist/distribution/repository-fetcher.js +246 -0
  98. package/dist/distribution/repository-fetcher.js.map +1 -0
  99. package/dist/distribution/repository-validator.d.ts +86 -0
  100. package/dist/distribution/repository-validator.d.ts.map +1 -0
  101. package/dist/distribution/repository-validator.js +296 -0
  102. package/dist/distribution/repository-validator.js.map +1 -0
  103. package/dist/distribution/source-specifier.d.ts +106 -0
  104. package/dist/distribution/source-specifier.d.ts.map +1 -0
  105. package/dist/distribution/source-specifier.js +247 -0
  106. package/dist/distribution/source-specifier.js.map +1 -0
  107. package/dist/fleet-manager/errors.d.ts +15 -0
  108. package/dist/fleet-manager/errors.d.ts.map +1 -1
  109. package/dist/fleet-manager/errors.js +16 -0
  110. package/dist/fleet-manager/errors.js.map +1 -1
  111. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  112. package/dist/fleet-manager/fleet-manager.js +32 -9
  113. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  114. package/dist/hooks/types.d.ts +2 -3
  115. package/dist/hooks/types.d.ts.map +1 -1
  116. package/dist/index.d.ts +1 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +2 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/runner/job-executor.js +10 -10
  121. package/dist/runner/job-executor.js.map +1 -1
  122. package/dist/runner/message-processor.d.ts.map +1 -1
  123. package/dist/runner/message-processor.js +7 -2
  124. package/dist/runner/message-processor.js.map +1 -1
  125. package/dist/runner/runtime/cli-runtime.d.ts +3 -2
  126. package/dist/runner/runtime/cli-runtime.d.ts.map +1 -1
  127. package/dist/runner/runtime/cli-session-path.d.ts +0 -20
  128. package/dist/runner/runtime/cli-session-path.d.ts.map +1 -1
  129. package/dist/runner/runtime/cli-session-path.js +1 -1
  130. package/dist/runner/runtime/cli-session-path.js.map +1 -1
  131. package/dist/runner/runtime/container-manager.js +1 -1
  132. package/dist/runner/runtime/container-manager.js.map +1 -1
  133. package/dist/runner/runtime/container-runner.d.ts.map +1 -1
  134. package/dist/runner/runtime/container-runner.js +5 -1
  135. package/dist/runner/runtime/container-runner.js.map +1 -1
  136. package/dist/runner/runtime/factory.d.ts +2 -1
  137. package/dist/runner/runtime/factory.d.ts.map +1 -1
  138. package/dist/runner/runtime/index.d.ts +4 -10
  139. package/dist/runner/runtime/index.d.ts.map +1 -1
  140. package/dist/runner/runtime/index.js +4 -13
  141. package/dist/runner/runtime/index.js.map +1 -1
  142. package/dist/scheduler/errors.d.ts +15 -0
  143. package/dist/scheduler/errors.d.ts.map +1 -1
  144. package/dist/state/schemas/session-info.d.ts +2 -1
  145. package/dist/state/schemas/session-info.d.ts.map +1 -1
  146. package/dist/state/schemas/session-info.js +1 -1
  147. package/dist/state/schemas/session-info.js.map +1 -1
  148. package/package.json +1 -1
@@ -0,0 +1,498 @@
1
+ /**
2
+ * Tests for agent remover
3
+ *
4
+ * Uses real file I/O with temporary directories to test removal logic.
5
+ */
6
+ import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
10
+ import { AGENT_NOT_FOUND, AgentRemoveError, removeAgent } from "../agent-remover.js";
11
+ // =============================================================================
12
+ // Test Setup
13
+ // =============================================================================
14
+ describe("removeAgent", () => {
15
+ let tempDir;
16
+ beforeEach(async () => {
17
+ // Create fresh temp directory for each test
18
+ tempDir = await mkdtemp(join(tmpdir(), "herdctl-remover-"));
19
+ });
20
+ afterEach(async () => {
21
+ // Clean up temp directory
22
+ await rm(tempDir, { recursive: true, force: true });
23
+ });
24
+ // ===========================================================================
25
+ // Helper Functions
26
+ // ===========================================================================
27
+ /**
28
+ * Create a minimal herdctl.yaml fleet config
29
+ */
30
+ async function createFleetConfig(agentPaths = [], options = {}) {
31
+ const { name = "test-fleet" } = options;
32
+ const agentsYaml = agentPaths.length > 0 ? agentPaths.map((p) => ` - path: ${p}`).join("\n") : "";
33
+ const content = `version: 1
34
+
35
+ fleet:
36
+ name: ${name}
37
+
38
+ agents:
39
+ ${agentsYaml}
40
+ `;
41
+ const configPath = join(tempDir, "herdctl.yaml");
42
+ await writeFile(configPath, content, "utf-8");
43
+ return configPath;
44
+ }
45
+ /**
46
+ * Read the fleet config and return its content
47
+ */
48
+ async function readFleetConfig(configPath) {
49
+ return await readFile(configPath, "utf-8");
50
+ }
51
+ /**
52
+ * Create an agent directory with agent.yaml
53
+ */
54
+ async function createAgent(name, options = {}) {
55
+ const agentDir = join(tempDir, "agents", name);
56
+ await mkdir(agentDir, { recursive: true });
57
+ // Build agent.yaml content with optional env vars
58
+ let agentYaml = `name: ${name}
59
+ permission_mode: default
60
+ runtime: sdk
61
+ `;
62
+ if (options.description) {
63
+ agentYaml += `description: "${options.description}"\n`;
64
+ }
65
+ // Add env vars to agent.yaml if requested
66
+ if (options.envVars && options.envVars.length > 0) {
67
+ agentYaml += `env:\n`;
68
+ for (const envVar of options.envVars) {
69
+ if (envVar.defaultValue !== undefined) {
70
+ agentYaml += ` ${envVar.name.toLowerCase()}: \${${envVar.name}:-${envVar.defaultValue}}\n`;
71
+ }
72
+ else {
73
+ agentYaml += ` ${envVar.name.toLowerCase()}: \${${envVar.name}}\n`;
74
+ }
75
+ }
76
+ }
77
+ await writeFile(join(agentDir, "agent.yaml"), agentYaml, "utf-8");
78
+ // Create CLAUDE.md
79
+ await writeFile(join(agentDir, "CLAUDE.md"), "# Agent Instructions\n", "utf-8");
80
+ // Create metadata.json if requested
81
+ if (options.withMetadata) {
82
+ const metadata = {
83
+ source: {
84
+ type: "github",
85
+ url: "https://github.com/user/repo",
86
+ ref: "v1.0.0",
87
+ version: options.metadata?.source?.version ?? "1.0.0",
88
+ ...options.metadata?.source,
89
+ },
90
+ installed_at: options.metadata?.installed_at ?? new Date().toISOString(),
91
+ installed_by: options.metadata?.installed_by ?? "herdctl@0.5.0",
92
+ ...options.metadata,
93
+ };
94
+ await writeFile(join(agentDir, "metadata.json"), JSON.stringify(metadata, null, 2), "utf-8");
95
+ }
96
+ // Create workspace/ directory if requested
97
+ if (options.withWorkspace) {
98
+ const workspaceDir = join(agentDir, "workspace");
99
+ await mkdir(workspaceDir, { recursive: true });
100
+ // Add workspace files if specified
101
+ if (options.workspaceFiles && options.workspaceFiles.length > 0) {
102
+ for (const file of options.workspaceFiles) {
103
+ await writeFile(join(workspaceDir, file), `content of ${file}`, "utf-8");
104
+ }
105
+ }
106
+ }
107
+ // Create extra files if requested
108
+ if (options.extraFiles && options.extraFiles.length > 0) {
109
+ for (const file of options.extraFiles) {
110
+ const filePath = join(agentDir, file);
111
+ const dir = filePath.substring(0, filePath.lastIndexOf("/"));
112
+ if (dir !== agentDir) {
113
+ await mkdir(dir, { recursive: true });
114
+ }
115
+ await writeFile(filePath, `content of ${file}`, "utf-8");
116
+ }
117
+ }
118
+ return agentDir;
119
+ }
120
+ /**
121
+ * Check if a path exists
122
+ */
123
+ async function pathExists(filePath) {
124
+ try {
125
+ await readFile(filePath);
126
+ return true;
127
+ }
128
+ catch {
129
+ try {
130
+ await readdir(filePath);
131
+ return true;
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ }
137
+ }
138
+ // ===========================================================================
139
+ // Successful Removal Tests
140
+ // ===========================================================================
141
+ describe("successful removal", () => {
142
+ it("removes installed agent and updates config", async () => {
143
+ const agentDir = await createAgent("my-agent", { withMetadata: true });
144
+ const configPath = await createFleetConfig(["./agents/my-agent/agent.yaml"]);
145
+ const result = await removeAgent({
146
+ name: "my-agent",
147
+ configPath,
148
+ });
149
+ // Check result
150
+ expect(result.agentName).toBe("my-agent");
151
+ expect(result.removedPath).toBe(agentDir);
152
+ expect(result.filesRemoved).toBe(true);
153
+ expect(result.configUpdated).toBe(true);
154
+ expect(result.workspacePreserved).toBe(false);
155
+ // Verify directory is gone
156
+ expect(await pathExists(agentDir)).toBe(false);
157
+ // Verify config is updated
158
+ const configContent = await readFleetConfig(configPath);
159
+ expect(configContent).not.toContain("my-agent");
160
+ });
161
+ it("removes manual agent without metadata", async () => {
162
+ const agentDir = await createAgent("manual-agent", { withMetadata: false });
163
+ const configPath = await createFleetConfig(["./agents/manual-agent/agent.yaml"]);
164
+ const result = await removeAgent({
165
+ name: "manual-agent",
166
+ configPath,
167
+ });
168
+ expect(result.agentName).toBe("manual-agent");
169
+ expect(result.filesRemoved).toBe(true);
170
+ expect(result.configUpdated).toBe(true);
171
+ expect(await pathExists(agentDir)).toBe(false);
172
+ });
173
+ it("removes agent with extra files and subdirectories", async () => {
174
+ const agentDir = await createAgent("complex-agent", {
175
+ withMetadata: true,
176
+ extraFiles: ["knowledge/guide.md", "knowledge/faq.md", "scripts/run.sh"],
177
+ });
178
+ const configPath = await createFleetConfig(["./agents/complex-agent/agent.yaml"]);
179
+ const result = await removeAgent({
180
+ name: "complex-agent",
181
+ configPath,
182
+ });
183
+ expect(result.filesRemoved).toBe(true);
184
+ expect(await pathExists(agentDir)).toBe(false);
185
+ expect(await pathExists(join(agentDir, "knowledge"))).toBe(false);
186
+ expect(await pathExists(join(agentDir, "scripts"))).toBe(false);
187
+ });
188
+ });
189
+ // ===========================================================================
190
+ // Keep Workspace Tests
191
+ // ===========================================================================
192
+ describe("keep workspace option", () => {
193
+ it("preserves workspace directory when keepWorkspace is true", async () => {
194
+ const agentDir = await createAgent("workspace-agent", {
195
+ withMetadata: true,
196
+ withWorkspace: true,
197
+ workspaceFiles: ["output.txt", "data.json"],
198
+ });
199
+ const configPath = await createFleetConfig(["./agents/workspace-agent/agent.yaml"]);
200
+ const result = await removeAgent({
201
+ name: "workspace-agent",
202
+ configPath,
203
+ keepWorkspace: true,
204
+ });
205
+ expect(result.workspacePreserved).toBe(true);
206
+ expect(result.filesRemoved).toBe(true);
207
+ // Workspace should still exist
208
+ expect(await pathExists(join(agentDir, "workspace"))).toBe(true);
209
+ expect(await pathExists(join(agentDir, "workspace", "output.txt"))).toBe(true);
210
+ expect(await pathExists(join(agentDir, "workspace", "data.json"))).toBe(true);
211
+ // Other files should be gone
212
+ expect(await pathExists(join(agentDir, "agent.yaml"))).toBe(false);
213
+ expect(await pathExists(join(agentDir, "CLAUDE.md"))).toBe(false);
214
+ expect(await pathExists(join(agentDir, "metadata.json"))).toBe(false);
215
+ });
216
+ it("deletes everything including workspace when keepWorkspace is false", async () => {
217
+ const agentDir = await createAgent("full-delete-agent", {
218
+ withMetadata: true,
219
+ withWorkspace: true,
220
+ workspaceFiles: ["data.txt"],
221
+ });
222
+ const configPath = await createFleetConfig(["./agents/full-delete-agent/agent.yaml"]);
223
+ const result = await removeAgent({
224
+ name: "full-delete-agent",
225
+ configPath,
226
+ keepWorkspace: false,
227
+ });
228
+ expect(result.workspacePreserved).toBe(false);
229
+ expect(result.filesRemoved).toBe(true);
230
+ expect(await pathExists(agentDir)).toBe(false);
231
+ });
232
+ it("handles keepWorkspace when workspace does not exist", async () => {
233
+ const agentDir = await createAgent("no-workspace-agent", {
234
+ withMetadata: true,
235
+ withWorkspace: false,
236
+ });
237
+ const configPath = await createFleetConfig(["./agents/no-workspace-agent/agent.yaml"]);
238
+ const result = await removeAgent({
239
+ name: "no-workspace-agent",
240
+ configPath,
241
+ keepWorkspace: true,
242
+ });
243
+ // Should still work, just deletes everything
244
+ expect(result.filesRemoved).toBe(true);
245
+ expect(result.workspacePreserved).toBe(false);
246
+ expect(await pathExists(agentDir)).toBe(false);
247
+ });
248
+ });
249
+ // ===========================================================================
250
+ // Environment Variables Tests
251
+ // ===========================================================================
252
+ describe("environment variables", () => {
253
+ it("reports required env variables", async () => {
254
+ await createAgent("env-agent", {
255
+ withMetadata: true,
256
+ envVars: [{ name: "DISCORD_WEBHOOK_URL" }, { name: "WEBSITES" }],
257
+ });
258
+ const configPath = await createFleetConfig(["./agents/env-agent/agent.yaml"]);
259
+ const result = await removeAgent({
260
+ name: "env-agent",
261
+ configPath,
262
+ });
263
+ expect(result.envVariables).toBeDefined();
264
+ expect(result.envVariables.required.length).toBe(2);
265
+ expect(result.envVariables.required.map((v) => v.name)).toContain("DISCORD_WEBHOOK_URL");
266
+ expect(result.envVariables.required.map((v) => v.name)).toContain("WEBSITES");
267
+ });
268
+ it("reports optional env variables with defaults", async () => {
269
+ await createAgent("optional-env-agent", {
270
+ withMetadata: true,
271
+ envVars: [
272
+ { name: "CRON_SCHEDULE", defaultValue: "*/5 * * * *" },
273
+ { name: "TIMEOUT", defaultValue: "30" },
274
+ ],
275
+ });
276
+ const configPath = await createFleetConfig(["./agents/optional-env-agent/agent.yaml"]);
277
+ const result = await removeAgent({
278
+ name: "optional-env-agent",
279
+ configPath,
280
+ });
281
+ expect(result.envVariables).toBeDefined();
282
+ expect(result.envVariables.optional.length).toBe(2);
283
+ expect(result.envVariables.optional.find((v) => v.name === "CRON_SCHEDULE")?.defaultValue).toBe("*/5 * * * *");
284
+ });
285
+ it("reports both required and optional env variables", async () => {
286
+ await createAgent("mixed-env-agent", {
287
+ withMetadata: true,
288
+ envVars: [{ name: "API_KEY" }, { name: "DEBUG", defaultValue: "false" }],
289
+ });
290
+ const configPath = await createFleetConfig(["./agents/mixed-env-agent/agent.yaml"]);
291
+ const result = await removeAgent({
292
+ name: "mixed-env-agent",
293
+ configPath,
294
+ });
295
+ expect(result.envVariables).toBeDefined();
296
+ expect(result.envVariables.required.length).toBe(1);
297
+ expect(result.envVariables.optional.length).toBe(1);
298
+ expect(result.envVariables.required[0].name).toBe("API_KEY");
299
+ expect(result.envVariables.optional[0].name).toBe("DEBUG");
300
+ });
301
+ it("returns empty env variables when agent has none", async () => {
302
+ await createAgent("no-env-agent", {
303
+ withMetadata: true,
304
+ });
305
+ const configPath = await createFleetConfig(["./agents/no-env-agent/agent.yaml"]);
306
+ const result = await removeAgent({
307
+ name: "no-env-agent",
308
+ configPath,
309
+ });
310
+ expect(result.envVariables).toBeDefined();
311
+ expect(result.envVariables.variables.length).toBe(0);
312
+ expect(result.envVariables.required.length).toBe(0);
313
+ expect(result.envVariables.optional.length).toBe(0);
314
+ });
315
+ });
316
+ // ===========================================================================
317
+ // Error Handling Tests
318
+ // ===========================================================================
319
+ describe("error handling", () => {
320
+ it("throws when agent is not found", async () => {
321
+ const configPath = await createFleetConfig([]);
322
+ await expect(removeAgent({
323
+ name: "nonexistent-agent",
324
+ configPath,
325
+ })).rejects.toThrow(AgentRemoveError);
326
+ try {
327
+ await removeAgent({
328
+ name: "nonexistent-agent",
329
+ configPath,
330
+ });
331
+ }
332
+ catch (err) {
333
+ const error = err;
334
+ expect(error.code).toBe(AGENT_NOT_FOUND);
335
+ expect(error.message).toContain("nonexistent-agent");
336
+ expect(error.message).toContain("not found");
337
+ }
338
+ });
339
+ it("still removes from config when agent directory is missing", async () => {
340
+ // Create agent in config but don't create the directory
341
+ const configPath = join(tempDir, "herdctl.yaml");
342
+ await writeFile(configPath, `version: 1
343
+
344
+ fleet:
345
+ name: test-fleet
346
+
347
+ agents:
348
+ - path: ./agents/missing-dir-agent/agent.yaml
349
+ `, "utf-8");
350
+ // Create the agent directory so discovery finds it
351
+ const agentDir = join(tempDir, "agents", "missing-dir-agent");
352
+ await mkdir(agentDir, { recursive: true });
353
+ await writeFile(join(agentDir, "agent.yaml"), "name: missing-dir-agent\n", "utf-8");
354
+ // Now delete the directory but keep config
355
+ await rm(agentDir, { recursive: true, force: true });
356
+ // This should fail because discovery won't find the agent anymore
357
+ await expect(removeAgent({
358
+ name: "missing-dir-agent",
359
+ configPath,
360
+ })).rejects.toThrow(AgentRemoveError);
361
+ });
362
+ it("still returns success when directory is gone but config update works", async () => {
363
+ // Create agent and config
364
+ const agentDir = await createAgent("dir-test-agent", { withMetadata: true });
365
+ const configPath = await createFleetConfig(["./agents/dir-test-agent/agent.yaml"]);
366
+ // Remove the agent normally
367
+ const result = await removeAgent({
368
+ name: "dir-test-agent",
369
+ configPath,
370
+ });
371
+ expect(result.filesRemoved).toBe(true);
372
+ expect(result.configUpdated).toBe(true);
373
+ });
374
+ });
375
+ // ===========================================================================
376
+ // Multiple Agents Tests
377
+ // ===========================================================================
378
+ describe("multiple agents", () => {
379
+ it("removes only the specified agent", async () => {
380
+ const agent1Dir = await createAgent("agent-1", { withMetadata: true });
381
+ const agent2Dir = await createAgent("agent-2", { withMetadata: true });
382
+ const agent3Dir = await createAgent("agent-3", { withMetadata: true });
383
+ const configPath = await createFleetConfig([
384
+ "./agents/agent-1/agent.yaml",
385
+ "./agents/agent-2/agent.yaml",
386
+ "./agents/agent-3/agent.yaml",
387
+ ]);
388
+ const result = await removeAgent({
389
+ name: "agent-2",
390
+ configPath,
391
+ });
392
+ expect(result.agentName).toBe("agent-2");
393
+ // Only agent-2 should be removed
394
+ expect(await pathExists(agent1Dir)).toBe(true);
395
+ expect(await pathExists(agent2Dir)).toBe(false);
396
+ expect(await pathExists(agent3Dir)).toBe(true);
397
+ // Config should still have agent-1 and agent-3
398
+ const configContent = await readFleetConfig(configPath);
399
+ expect(configContent).toContain("agent-1");
400
+ expect(configContent).not.toContain("agent-2");
401
+ expect(configContent).toContain("agent-3");
402
+ });
403
+ it("can remove agents one by one", async () => {
404
+ await createAgent("first-agent", { withMetadata: true });
405
+ await createAgent("second-agent", { withMetadata: true });
406
+ const configPath = await createFleetConfig([
407
+ "./agents/first-agent/agent.yaml",
408
+ "./agents/second-agent/agent.yaml",
409
+ ]);
410
+ // Remove first agent
411
+ await removeAgent({
412
+ name: "first-agent",
413
+ configPath,
414
+ });
415
+ let configContent = await readFleetConfig(configPath);
416
+ expect(configContent).not.toContain("first-agent");
417
+ expect(configContent).toContain("second-agent");
418
+ // Remove second agent
419
+ await removeAgent({
420
+ name: "second-agent",
421
+ configPath,
422
+ });
423
+ configContent = await readFleetConfig(configPath);
424
+ expect(configContent).not.toContain("first-agent");
425
+ expect(configContent).not.toContain("second-agent");
426
+ });
427
+ });
428
+ // ===========================================================================
429
+ // Base Directory Tests
430
+ // ===========================================================================
431
+ describe("base directory handling", () => {
432
+ it("uses custom baseDir when provided", async () => {
433
+ // Create agent in a different base directory
434
+ const customBase = join(tempDir, "custom-base");
435
+ const agentDir = join(customBase, "agents", "custom-agent");
436
+ await mkdir(agentDir, { recursive: true });
437
+ await writeFile(join(agentDir, "agent.yaml"), "name: custom-agent\nruntime: sdk\n", "utf-8");
438
+ // Config is in tempDir but baseDir is customBase
439
+ const configPath = await createFleetConfig(["./agents/custom-agent/agent.yaml"]);
440
+ const result = await removeAgent({
441
+ name: "custom-agent",
442
+ configPath,
443
+ baseDir: customBase,
444
+ });
445
+ expect(result.filesRemoved).toBe(true);
446
+ expect(await pathExists(agentDir)).toBe(false);
447
+ });
448
+ });
449
+ // ===========================================================================
450
+ // Edge Cases
451
+ // ===========================================================================
452
+ describe("edge cases", () => {
453
+ it("handles agent with empty workspace", async () => {
454
+ const agentDir = await createAgent("empty-workspace-agent", {
455
+ withMetadata: true,
456
+ withWorkspace: true,
457
+ workspaceFiles: [],
458
+ });
459
+ const configPath = await createFleetConfig(["./agents/empty-workspace-agent/agent.yaml"]);
460
+ const result = await removeAgent({
461
+ name: "empty-workspace-agent",
462
+ configPath,
463
+ keepWorkspace: true,
464
+ });
465
+ expect(result.workspacePreserved).toBe(true);
466
+ expect(await pathExists(join(agentDir, "workspace"))).toBe(true);
467
+ });
468
+ it("handles agent name with special characters (hyphens)", async () => {
469
+ await createAgent("my-special-agent-name", { withMetadata: true });
470
+ const configPath = await createFleetConfig(["./agents/my-special-agent-name/agent.yaml"]);
471
+ const result = await removeAgent({
472
+ name: "my-special-agent-name",
473
+ configPath,
474
+ });
475
+ expect(result.agentName).toBe("my-special-agent-name");
476
+ expect(result.filesRemoved).toBe(true);
477
+ });
478
+ it("leaves no orphaned files when removing without keepWorkspace", async () => {
479
+ const agentDir = await createAgent("clean-remove-agent", {
480
+ withMetadata: true,
481
+ withWorkspace: true,
482
+ workspaceFiles: ["file1.txt", "file2.txt"],
483
+ extraFiles: ["knowledge/doc.md"],
484
+ });
485
+ const configPath = await createFleetConfig(["./agents/clean-remove-agent/agent.yaml"]);
486
+ await removeAgent({
487
+ name: "clean-remove-agent",
488
+ configPath,
489
+ keepWorkspace: false,
490
+ });
491
+ // The entire agent directory should be gone
492
+ expect(await pathExists(agentDir)).toBe(false);
493
+ // But the agents/ parent directory should still exist
494
+ expect(await pathExists(join(tempDir, "agents"))).toBe(true);
495
+ });
496
+ });
497
+ });
498
+ //# sourceMappingURL=agent-remover.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-remover.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-remover.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for AgentRepoMetadataSchema (herdctl.json validation)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=agent-repo-metadata.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-repo-metadata.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-repo-metadata.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}