@herdctl/core 5.5.0 → 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 (119) hide show
  1. package/dist/config/index.d.ts +1 -1
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/index.js +3 -1
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
  6. package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
  7. package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
  8. package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
  9. package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
  10. package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
  11. package/dist/distribution/__tests__/agent-info.test.js +568 -0
  12. package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
  13. package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
  14. package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
  15. package/dist/distribution/__tests__/agent-remover.test.js +498 -0
  16. package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
  17. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
  18. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
  19. package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
  20. package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
  21. package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
  22. package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
  23. package/dist/distribution/__tests__/env-scanner.test.js +576 -0
  24. package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
  25. package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
  26. package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
  27. package/dist/distribution/__tests__/file-installer.test.js +714 -0
  28. package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
  29. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
  30. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
  31. package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
  32. package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
  33. package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
  34. package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
  35. package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
  36. package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
  37. package/dist/distribution/__tests__/integration.test.d.ts +10 -0
  38. package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
  39. package/dist/distribution/__tests__/integration.test.js +522 -0
  40. package/dist/distribution/__tests__/integration.test.js.map +1 -0
  41. package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
  42. package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
  43. package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
  44. package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
  45. package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
  46. package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
  47. package/dist/distribution/__tests__/repository-validator.test.js +447 -0
  48. package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
  49. package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
  50. package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
  51. package/dist/distribution/__tests__/source-specifier.test.js +533 -0
  52. package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
  53. package/dist/distribution/agent-discovery.d.ts +81 -0
  54. package/dist/distribution/agent-discovery.d.ts.map +1 -0
  55. package/dist/distribution/agent-discovery.js +264 -0
  56. package/dist/distribution/agent-discovery.js.map +1 -0
  57. package/dist/distribution/agent-info.d.ts +86 -0
  58. package/dist/distribution/agent-info.d.ts.map +1 -0
  59. package/dist/distribution/agent-info.js +225 -0
  60. package/dist/distribution/agent-info.js.map +1 -0
  61. package/dist/distribution/agent-remover.d.ts +83 -0
  62. package/dist/distribution/agent-remover.d.ts.map +1 -0
  63. package/dist/distribution/agent-remover.js +222 -0
  64. package/dist/distribution/agent-remover.js.map +1 -0
  65. package/dist/distribution/agent-repo-metadata.d.ts +181 -0
  66. package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
  67. package/dist/distribution/agent-repo-metadata.js +143 -0
  68. package/dist/distribution/agent-repo-metadata.js.map +1 -0
  69. package/dist/distribution/env-scanner.d.ts +78 -0
  70. package/dist/distribution/env-scanner.d.ts.map +1 -0
  71. package/dist/distribution/env-scanner.js +144 -0
  72. package/dist/distribution/env-scanner.js.map +1 -0
  73. package/dist/distribution/file-installer.d.ts +80 -0
  74. package/dist/distribution/file-installer.d.ts.map +1 -0
  75. package/dist/distribution/file-installer.js +268 -0
  76. package/dist/distribution/file-installer.js.map +1 -0
  77. package/dist/distribution/fleet-config-updater.d.ts +96 -0
  78. package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
  79. package/dist/distribution/fleet-config-updater.js +266 -0
  80. package/dist/distribution/fleet-config-updater.js.map +1 -0
  81. package/dist/distribution/index.d.ts +23 -0
  82. package/dist/distribution/index.d.ts.map +1 -0
  83. package/dist/distribution/index.js +42 -0
  84. package/dist/distribution/index.js.map +1 -0
  85. package/dist/distribution/installation-metadata.d.ts +191 -0
  86. package/dist/distribution/installation-metadata.d.ts.map +1 -0
  87. package/dist/distribution/installation-metadata.js +100 -0
  88. package/dist/distribution/installation-metadata.js.map +1 -0
  89. package/dist/distribution/repository-fetcher.d.ts +104 -0
  90. package/dist/distribution/repository-fetcher.d.ts.map +1 -0
  91. package/dist/distribution/repository-fetcher.js +246 -0
  92. package/dist/distribution/repository-fetcher.js.map +1 -0
  93. package/dist/distribution/repository-validator.d.ts +86 -0
  94. package/dist/distribution/repository-validator.d.ts.map +1 -0
  95. package/dist/distribution/repository-validator.js +296 -0
  96. package/dist/distribution/repository-validator.js.map +1 -0
  97. package/dist/distribution/source-specifier.d.ts +106 -0
  98. package/dist/distribution/source-specifier.d.ts.map +1 -0
  99. package/dist/distribution/source-specifier.js +247 -0
  100. package/dist/distribution/source-specifier.js.map +1 -0
  101. package/dist/fleet-manager/errors.d.ts +15 -0
  102. package/dist/fleet-manager/errors.d.ts.map +1 -1
  103. package/dist/fleet-manager/errors.js +16 -0
  104. package/dist/fleet-manager/errors.js.map +1 -1
  105. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  106. package/dist/fleet-manager/fleet-manager.js +31 -9
  107. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +2 -0
  111. package/dist/index.js.map +1 -1
  112. package/dist/runner/message-processor.d.ts.map +1 -1
  113. package/dist/runner/message-processor.js +7 -2
  114. package/dist/runner/message-processor.js.map +1 -1
  115. package/dist/runner/runtime/container-manager.js +1 -1
  116. package/dist/runner/runtime/container-manager.js.map +1 -1
  117. package/dist/scheduler/errors.d.ts +15 -0
  118. package/dist/scheduler/errors.d.ts.map +1 -1
  119. package/package.json +1 -1
@@ -0,0 +1,568 @@
1
+ /**
2
+ * Tests for agent info module
3
+ *
4
+ * Uses real file I/O with temporary directories to test agent info gathering.
5
+ */
6
+ import { mkdir, mkdtemp, 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 { getAgentInfo } from "../agent-info.js";
11
+ // =============================================================================
12
+ // Test Setup
13
+ // =============================================================================
14
+ describe("getAgentInfo", () => {
15
+ let tempDir;
16
+ beforeEach(async () => {
17
+ // Create fresh temp directory for each test
18
+ tempDir = await mkdtemp(join(tmpdir(), "herdctl-agent-info-"));
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 = []) {
31
+ const agentsYaml = agentPaths.length > 0 ? agentPaths.map((p) => ` - path: ${p}`).join("\n") : "";
32
+ const content = `version: 1
33
+
34
+ fleet:
35
+ name: test-fleet
36
+
37
+ agents:
38
+ ${agentsYaml}
39
+ `;
40
+ const configPath = join(tempDir, "herdctl.yaml");
41
+ await writeFile(configPath, content, "utf-8");
42
+ return configPath;
43
+ }
44
+ /**
45
+ * Create an agent directory with optional components
46
+ */
47
+ async function createAgent(name, options = {}) {
48
+ const agentDir = join(tempDir, "agents", name);
49
+ await mkdir(agentDir, { recursive: true });
50
+ // Build agent.yaml content
51
+ let agentYaml = `name: ${name}
52
+ permission_mode: default
53
+ runtime: sdk
54
+ `;
55
+ if (options.description) {
56
+ agentYaml += `description: "${options.description}"\n`;
57
+ }
58
+ // Add environment variables if requested
59
+ if (options.withEnvVars || options.envVars) {
60
+ const envConfig = options.envVars ?? { required: ["API_KEY"] };
61
+ agentYaml += "env:\n";
62
+ if (envConfig.required) {
63
+ for (const varName of envConfig.required) {
64
+ agentYaml += ` ${varName.toLowerCase()}: \${${varName}}\n`;
65
+ }
66
+ }
67
+ if (envConfig.optional) {
68
+ for (const [varName, defaultValue] of Object.entries(envConfig.optional)) {
69
+ agentYaml += ` ${varName.toLowerCase()}: \${${varName}:-${defaultValue}}\n`;
70
+ }
71
+ }
72
+ }
73
+ // Add schedules if requested
74
+ if (options.withSchedules || options.schedules) {
75
+ const scheduleConfig = options.schedules ?? {
76
+ daily: { type: "cron", cron: "0 0 * * *" },
77
+ };
78
+ agentYaml += "schedules:\n";
79
+ for (const [scheduleName, scheduleValue] of Object.entries(scheduleConfig)) {
80
+ if (typeof scheduleValue === "object" && scheduleValue !== null) {
81
+ agentYaml += ` ${scheduleName}:\n`;
82
+ for (const [key, value] of Object.entries(scheduleValue)) {
83
+ agentYaml += ` ${key}: "${value}"\n`;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ await writeFile(join(agentDir, "agent.yaml"), agentYaml, "utf-8");
89
+ // Create metadata.json if requested
90
+ if (options.withMetadata) {
91
+ const metadata = {
92
+ source: {
93
+ type: "github",
94
+ url: "https://github.com/user/repo",
95
+ ref: "v1.0.0",
96
+ version: options.metadata?.source?.version ?? "1.0.0",
97
+ ...options.metadata?.source,
98
+ },
99
+ installed_at: options.metadata?.installed_at ?? new Date().toISOString(),
100
+ installed_by: options.metadata?.installed_by ?? "herdctl@0.5.0",
101
+ ...options.metadata,
102
+ };
103
+ await writeFile(join(agentDir, "metadata.json"), JSON.stringify(metadata, null, 2), "utf-8");
104
+ }
105
+ // Create herdctl.json if requested
106
+ if (options.withHerdctlJson) {
107
+ const herdctlJson = options.herdctlJson ?? {
108
+ name,
109
+ version: "1.0.0",
110
+ description: `${name} agent`,
111
+ author: "test-author",
112
+ };
113
+ await writeFile(join(agentDir, "herdctl.json"), JSON.stringify(herdctlJson, null, 2), "utf-8");
114
+ }
115
+ // Create workspace directory if requested
116
+ if (options.withWorkspace) {
117
+ await mkdir(join(agentDir, "workspace"), { recursive: true });
118
+ }
119
+ // Create additional files if provided
120
+ if (options.additionalFiles) {
121
+ for (const [filePath, content] of Object.entries(options.additionalFiles)) {
122
+ const fullPath = join(agentDir, filePath);
123
+ await mkdir(join(fullPath, ".."), { recursive: true });
124
+ await writeFile(fullPath, content, "utf-8");
125
+ }
126
+ }
127
+ return agentDir;
128
+ }
129
+ // ===========================================================================
130
+ // Agent Not Found Tests
131
+ // ===========================================================================
132
+ describe("agent not found", () => {
133
+ it("returns null when agent does not exist", async () => {
134
+ const configPath = await createFleetConfig([]);
135
+ const result = await getAgentInfo({
136
+ name: "nonexistent-agent",
137
+ configPath,
138
+ });
139
+ expect(result).toBeNull();
140
+ });
141
+ it("returns null when agent name does not match any discovered agent", async () => {
142
+ await createAgent("my-agent");
143
+ const configPath = await createFleetConfig(["./agents/my-agent/agent.yaml"]);
144
+ const result = await getAgentInfo({
145
+ name: "other-agent",
146
+ configPath,
147
+ });
148
+ expect(result).toBeNull();
149
+ });
150
+ it("returns null when config file does not exist", async () => {
151
+ const result = await getAgentInfo({
152
+ name: "any-agent",
153
+ configPath: join(tempDir, "nonexistent.yaml"),
154
+ });
155
+ expect(result).toBeNull();
156
+ });
157
+ });
158
+ // ===========================================================================
159
+ // Basic Installed Agent Tests
160
+ // ===========================================================================
161
+ describe("basic installed agent", () => {
162
+ it("returns full info for installed agent with metadata", async () => {
163
+ await createAgent("my-agent", {
164
+ description: "A helpful agent",
165
+ withMetadata: true,
166
+ metadata: {
167
+ source: {
168
+ type: "github",
169
+ url: "https://github.com/user/my-agent",
170
+ ref: "v1.0.0",
171
+ version: "1.0.0",
172
+ },
173
+ installed_at: "2024-01-15T10:30:00Z",
174
+ installed_by: "herdctl@0.5.0",
175
+ },
176
+ });
177
+ const configPath = await createFleetConfig(["./agents/my-agent/agent.yaml"]);
178
+ const result = await getAgentInfo({
179
+ name: "my-agent",
180
+ configPath,
181
+ });
182
+ expect(result).not.toBeNull();
183
+ expect(result.name).toBe("my-agent");
184
+ expect(result.description).toBe("A helpful agent");
185
+ expect(result.installed).toBe(true);
186
+ expect(result.metadata).toBeDefined();
187
+ expect(result.metadata?.source.type).toBe("github");
188
+ expect(result.metadata?.source.url).toBe("https://github.com/user/my-agent");
189
+ expect(result.metadata?.source.ref).toBe("v1.0.0");
190
+ expect(result.metadata?.installed_at).toBe("2024-01-15T10:30:00Z");
191
+ expect(result.version).toBe("1.0.0");
192
+ expect(result.configPath).toBe("./agents/my-agent/agent.yaml");
193
+ expect(result.path).toBe(join(tempDir, "agents", "my-agent"));
194
+ });
195
+ it("includes files list", async () => {
196
+ await createAgent("files-agent", {
197
+ additionalFiles: {
198
+ "CLAUDE.md": "# Agent Instructions",
199
+ "knowledge/guide.md": "# Guide content",
200
+ },
201
+ });
202
+ const configPath = await createFleetConfig(["./agents/files-agent/agent.yaml"]);
203
+ const result = await getAgentInfo({
204
+ name: "files-agent",
205
+ configPath,
206
+ });
207
+ expect(result).not.toBeNull();
208
+ expect(result.files).toContain("agent.yaml");
209
+ expect(result.files).toContain("CLAUDE.md");
210
+ expect(result.files).toContain(join("knowledge", "guide.md"));
211
+ // Files should be sorted
212
+ expect(result.files).toEqual([...result.files].sort());
213
+ });
214
+ });
215
+ // ===========================================================================
216
+ // Manual Agent Tests
217
+ // ===========================================================================
218
+ describe("manual (non-installed) agent", () => {
219
+ it("returns info with installed: false and no metadata", async () => {
220
+ await createAgent("manual-agent", {
221
+ description: "A manually created agent",
222
+ });
223
+ const configPath = await createFleetConfig(["./agents/manual-agent/agent.yaml"]);
224
+ const result = await getAgentInfo({
225
+ name: "manual-agent",
226
+ configPath,
227
+ });
228
+ expect(result).not.toBeNull();
229
+ expect(result.name).toBe("manual-agent");
230
+ expect(result.installed).toBe(false);
231
+ expect(result.metadata).toBeUndefined();
232
+ expect(result.version).toBeUndefined();
233
+ });
234
+ });
235
+ // ===========================================================================
236
+ // herdctl.json Tests
237
+ // ===========================================================================
238
+ describe("agent with herdctl.json", () => {
239
+ it("includes repoMetadata from valid herdctl.json", async () => {
240
+ await createAgent("repo-agent", {
241
+ withHerdctlJson: true,
242
+ herdctlJson: {
243
+ name: "repo-agent",
244
+ version: "2.0.0",
245
+ description: "An agent with repo metadata",
246
+ author: "test-author",
247
+ repository: "github:user/repo-agent",
248
+ license: "MIT",
249
+ keywords: ["test", "monitoring"],
250
+ },
251
+ });
252
+ const configPath = await createFleetConfig(["./agents/repo-agent/agent.yaml"]);
253
+ const result = await getAgentInfo({
254
+ name: "repo-agent",
255
+ configPath,
256
+ });
257
+ expect(result).not.toBeNull();
258
+ expect(result.repoMetadata).toBeDefined();
259
+ expect(result.repoMetadata?.name).toBe("repo-agent");
260
+ expect(result.repoMetadata?.version).toBe("2.0.0");
261
+ expect(result.repoMetadata?.description).toBe("An agent with repo metadata");
262
+ expect(result.repoMetadata?.author).toBe("test-author");
263
+ expect(result.repoMetadata?.license).toBe("MIT");
264
+ expect(result.repoMetadata?.keywords).toEqual(["test", "monitoring"]);
265
+ });
266
+ it("handles invalid herdctl.json gracefully (no repoMetadata)", async () => {
267
+ await createAgent("invalid-json-agent");
268
+ const agentDir = join(tempDir, "agents", "invalid-json-agent");
269
+ // Write invalid JSON
270
+ await writeFile(join(agentDir, "herdctl.json"), "{ invalid json }", "utf-8");
271
+ const configPath = await createFleetConfig(["./agents/invalid-json-agent/agent.yaml"]);
272
+ const result = await getAgentInfo({
273
+ name: "invalid-json-agent",
274
+ configPath,
275
+ });
276
+ expect(result).not.toBeNull();
277
+ expect(result.repoMetadata).toBeUndefined();
278
+ });
279
+ it("handles herdctl.json that fails schema validation (missing required fields)", async () => {
280
+ await createAgent("bad-schema-agent");
281
+ const agentDir = join(tempDir, "agents", "bad-schema-agent");
282
+ // Write JSON that is valid but doesn't match schema (missing required fields)
283
+ await writeFile(join(agentDir, "herdctl.json"), JSON.stringify({ name: "bad-schema-agent" }), // Missing version, description, author
284
+ "utf-8");
285
+ const configPath = await createFleetConfig(["./agents/bad-schema-agent/agent.yaml"]);
286
+ const result = await getAgentInfo({
287
+ name: "bad-schema-agent",
288
+ configPath,
289
+ });
290
+ expect(result).not.toBeNull();
291
+ expect(result.repoMetadata).toBeUndefined();
292
+ });
293
+ });
294
+ // ===========================================================================
295
+ // Environment Variables Tests
296
+ // ===========================================================================
297
+ describe("agent with environment variables", () => {
298
+ it("includes envVariables from agent.yaml", async () => {
299
+ await createAgent("env-agent", {
300
+ withEnvVars: true,
301
+ envVars: {
302
+ required: ["DISCORD_WEBHOOK_URL", "WEBSITES"],
303
+ optional: { CRON_SCHEDULE: "*/5 * * * *" },
304
+ },
305
+ });
306
+ const configPath = await createFleetConfig(["./agents/env-agent/agent.yaml"]);
307
+ const result = await getAgentInfo({
308
+ name: "env-agent",
309
+ configPath,
310
+ });
311
+ expect(result).not.toBeNull();
312
+ expect(result.envVariables).toBeDefined();
313
+ expect(result.envVariables.variables).toHaveLength(3);
314
+ // Check required vars
315
+ const requiredNames = result.envVariables.required.map((v) => v.name);
316
+ expect(requiredNames).toContain("DISCORD_WEBHOOK_URL");
317
+ expect(requiredNames).toContain("WEBSITES");
318
+ // Check optional vars
319
+ const optionalNames = result.envVariables.optional.map((v) => v.name);
320
+ expect(optionalNames).toContain("CRON_SCHEDULE");
321
+ const cronVar = result.envVariables.optional.find((v) => v.name === "CRON_SCHEDULE");
322
+ expect(cronVar?.defaultValue).toBe("*/5 * * * *");
323
+ });
324
+ it("returns undefined envVariables when no env vars in agent.yaml", async () => {
325
+ await createAgent("no-env-agent");
326
+ const configPath = await createFleetConfig(["./agents/no-env-agent/agent.yaml"]);
327
+ const result = await getAgentInfo({
328
+ name: "no-env-agent",
329
+ configPath,
330
+ });
331
+ expect(result).not.toBeNull();
332
+ expect(result.envVariables).toBeUndefined();
333
+ });
334
+ });
335
+ // ===========================================================================
336
+ // Schedules Tests
337
+ // ===========================================================================
338
+ describe("agent with schedules", () => {
339
+ it("includes schedules from agent.yaml", async () => {
340
+ await createAgent("scheduled-agent", {
341
+ withSchedules: true,
342
+ schedules: {
343
+ "check-websites": { type: "cron", cron: "*/5 * * * *" },
344
+ "daily-report": { type: "cron", cron: "0 9 * * *" },
345
+ },
346
+ });
347
+ const configPath = await createFleetConfig(["./agents/scheduled-agent/agent.yaml"]);
348
+ const result = await getAgentInfo({
349
+ name: "scheduled-agent",
350
+ configPath,
351
+ });
352
+ expect(result).not.toBeNull();
353
+ expect(result.schedules).toBeDefined();
354
+ expect(Object.keys(result.schedules)).toContain("check-websites");
355
+ expect(Object.keys(result.schedules)).toContain("daily-report");
356
+ });
357
+ it("returns undefined schedules when no schedules in agent.yaml", async () => {
358
+ await createAgent("no-schedule-agent");
359
+ const configPath = await createFleetConfig(["./agents/no-schedule-agent/agent.yaml"]);
360
+ const result = await getAgentInfo({
361
+ name: "no-schedule-agent",
362
+ configPath,
363
+ });
364
+ expect(result).not.toBeNull();
365
+ expect(result.schedules).toBeUndefined();
366
+ });
367
+ });
368
+ // ===========================================================================
369
+ // Workspace Tests
370
+ // ===========================================================================
371
+ describe("agent workspace directory", () => {
372
+ it("has hasWorkspace true when workspace directory exists", async () => {
373
+ await createAgent("workspace-agent", {
374
+ withWorkspace: true,
375
+ });
376
+ const configPath = await createFleetConfig(["./agents/workspace-agent/agent.yaml"]);
377
+ const result = await getAgentInfo({
378
+ name: "workspace-agent",
379
+ configPath,
380
+ });
381
+ expect(result).not.toBeNull();
382
+ expect(result.hasWorkspace).toBe(true);
383
+ });
384
+ it("has hasWorkspace false when no workspace directory", async () => {
385
+ await createAgent("no-workspace-agent");
386
+ const configPath = await createFleetConfig(["./agents/no-workspace-agent/agent.yaml"]);
387
+ const result = await getAgentInfo({
388
+ name: "no-workspace-agent",
389
+ configPath,
390
+ });
391
+ expect(result).not.toBeNull();
392
+ expect(result.hasWorkspace).toBe(false);
393
+ });
394
+ });
395
+ // ===========================================================================
396
+ // File Listing Tests
397
+ // ===========================================================================
398
+ describe("file listing", () => {
399
+ it("lists all files in agent directory", async () => {
400
+ await createAgent("full-agent", {
401
+ withMetadata: true,
402
+ withHerdctlJson: true,
403
+ herdctlJson: {
404
+ name: "full-agent",
405
+ version: "1.0.0",
406
+ description: "Test agent",
407
+ author: "test",
408
+ },
409
+ additionalFiles: {
410
+ "CLAUDE.md": "# Instructions",
411
+ "README.md": "# Readme",
412
+ "knowledge/guide.md": "# Guide",
413
+ "scripts/setup.sh": "#!/bin/bash\necho hello",
414
+ },
415
+ });
416
+ const configPath = await createFleetConfig(["./agents/full-agent/agent.yaml"]);
417
+ const result = await getAgentInfo({
418
+ name: "full-agent",
419
+ configPath,
420
+ });
421
+ expect(result).not.toBeNull();
422
+ expect(result.files).toContain("agent.yaml");
423
+ expect(result.files).toContain("metadata.json");
424
+ expect(result.files).toContain("herdctl.json");
425
+ expect(result.files).toContain("CLAUDE.md");
426
+ expect(result.files).toContain("README.md");
427
+ expect(result.files).toContain(join("knowledge", "guide.md"));
428
+ expect(result.files).toContain(join("scripts", "setup.sh"));
429
+ });
430
+ it("excludes .git and node_modules directories from file listing", async () => {
431
+ await createAgent("git-agent", {
432
+ additionalFiles: {
433
+ ".git/config": "git config",
434
+ ".git/HEAD": "ref: refs/heads/main",
435
+ "node_modules/package/index.js": "module.exports = {}",
436
+ "real-file.md": "# Real file",
437
+ },
438
+ });
439
+ const configPath = await createFleetConfig(["./agents/git-agent/agent.yaml"]);
440
+ const result = await getAgentInfo({
441
+ name: "git-agent",
442
+ configPath,
443
+ });
444
+ expect(result).not.toBeNull();
445
+ expect(result.files).toContain("real-file.md");
446
+ expect(result.files).not.toContain(".git/config");
447
+ expect(result.files).not.toContain(".git/HEAD");
448
+ expect(result.files).not.toContain("node_modules/package/index.js");
449
+ // Check no files from excluded dirs
450
+ expect(result.files.some((f) => f.startsWith(".git"))).toBe(false);
451
+ expect(result.files.some((f) => f.startsWith("node_modules"))).toBe(false);
452
+ });
453
+ it("returns sorted file list", async () => {
454
+ await createAgent("sort-agent", {
455
+ additionalFiles: {
456
+ "z-file.md": "Z",
457
+ "a-file.md": "A",
458
+ "m-file.md": "M",
459
+ },
460
+ });
461
+ const configPath = await createFleetConfig(["./agents/sort-agent/agent.yaml"]);
462
+ const result = await getAgentInfo({
463
+ name: "sort-agent",
464
+ configPath,
465
+ });
466
+ expect(result).not.toBeNull();
467
+ const sortedFiles = [...result.files].sort();
468
+ expect(result.files).toEqual(sortedFiles);
469
+ });
470
+ });
471
+ // ===========================================================================
472
+ // Edge Cases
473
+ // ===========================================================================
474
+ describe("edge cases", () => {
475
+ it("handles agent with all optional fields present", async () => {
476
+ await createAgent("complete-agent", {
477
+ description: "A complete agent with everything",
478
+ withMetadata: true,
479
+ metadata: {
480
+ source: {
481
+ type: "github",
482
+ url: "https://github.com/org/complete-agent",
483
+ ref: "v2.0.0",
484
+ version: "2.0.0",
485
+ },
486
+ installed_at: "2024-02-15T10:30:00Z",
487
+ installed_by: "herdctl@1.0.0",
488
+ },
489
+ withHerdctlJson: true,
490
+ herdctlJson: {
491
+ name: "complete-agent",
492
+ version: "2.0.0",
493
+ description: "Complete agent description",
494
+ author: "complete-author",
495
+ keywords: ["complete", "test"],
496
+ },
497
+ withWorkspace: true,
498
+ withEnvVars: true,
499
+ envVars: {
500
+ required: ["API_KEY"],
501
+ optional: { DEBUG: "false" },
502
+ },
503
+ withSchedules: true,
504
+ schedules: {
505
+ hourly: { type: "cron", cron: "0 * * * *" },
506
+ },
507
+ additionalFiles: {
508
+ "CLAUDE.md": "# Complete Instructions",
509
+ },
510
+ });
511
+ const configPath = await createFleetConfig(["./agents/complete-agent/agent.yaml"]);
512
+ const result = await getAgentInfo({
513
+ name: "complete-agent",
514
+ configPath,
515
+ });
516
+ expect(result).not.toBeNull();
517
+ expect(result.name).toBe("complete-agent");
518
+ expect(result.description).toBe("A complete agent with everything");
519
+ expect(result.installed).toBe(true);
520
+ expect(result.metadata).toBeDefined();
521
+ expect(result.version).toBe("2.0.0");
522
+ expect(result.repoMetadata).toBeDefined();
523
+ expect(result.envVariables).toBeDefined();
524
+ expect(result.schedules).toBeDefined();
525
+ expect(result.hasWorkspace).toBe(true);
526
+ expect(result.files.length).toBeGreaterThan(0);
527
+ });
528
+ it("handles agent with minimal fields (just name)", async () => {
529
+ const agentDir = join(tempDir, "agents", "minimal-agent");
530
+ await mkdir(agentDir, { recursive: true });
531
+ await writeFile(join(agentDir, "agent.yaml"), "name: minimal-agent\n", "utf-8");
532
+ const configPath = await createFleetConfig(["./agents/minimal-agent/agent.yaml"]);
533
+ const result = await getAgentInfo({
534
+ name: "minimal-agent",
535
+ configPath,
536
+ });
537
+ expect(result).not.toBeNull();
538
+ expect(result.name).toBe("minimal-agent");
539
+ expect(result.description).toBeUndefined();
540
+ expect(result.installed).toBe(false);
541
+ expect(result.metadata).toBeUndefined();
542
+ expect(result.version).toBeUndefined();
543
+ expect(result.repoMetadata).toBeUndefined();
544
+ expect(result.envVariables).toBeUndefined();
545
+ expect(result.schedules).toBeUndefined();
546
+ expect(result.hasWorkspace).toBe(false);
547
+ expect(result.files).toContain("agent.yaml");
548
+ });
549
+ it("uses custom baseDir when provided", async () => {
550
+ // Create agent in a different base directory
551
+ const customBase = join(tempDir, "custom-base");
552
+ const agentDir = join(customBase, "agents", "custom-agent");
553
+ await mkdir(agentDir, { recursive: true });
554
+ await writeFile(join(agentDir, "agent.yaml"), "name: custom-agent\nruntime: sdk\n", "utf-8");
555
+ // Config is in tempDir but baseDir is customBase
556
+ const configPath = await createFleetConfig(["./agents/custom-agent/agent.yaml"]);
557
+ const result = await getAgentInfo({
558
+ name: "custom-agent",
559
+ configPath,
560
+ baseDir: customBase,
561
+ });
562
+ expect(result).not.toBeNull();
563
+ expect(result.name).toBe("custom-agent");
564
+ expect(result.path).toBe(agentDir);
565
+ });
566
+ });
567
+ });
568
+ //# sourceMappingURL=agent-info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-info.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-info.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for agent remover
3
+ *
4
+ * Uses real file I/O with temporary directories to test removal logic.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=agent-remover.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-remover.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-remover.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}