@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,522 @@
1
+ /**
2
+ * Integration Tests for Agent Distribution System
3
+ *
4
+ * These tests exercise the complete installation pipeline: source parsing,
5
+ * file installation, fleet config updating, and env var scanning.
6
+ *
7
+ * Uses real filesystem operations with fixture data, no mocking.
8
+ */
9
+ import * as fs from "node:fs/promises";
10
+ import * as os from "node:os";
11
+ import * as path from "node:path";
12
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
13
+ // Config loader for end-to-end testing
14
+ import { loadConfig } from "../../config/loader.js";
15
+ // Distribution modules
16
+ import { scanEnvVariables } from "../env-scanner.js";
17
+ import { AGENT_ALREADY_EXISTS, AgentInstallError, installAgentFiles } from "../file-installer.js";
18
+ import { addAgentToFleetConfig, CONFIG_NOT_FOUND, FleetConfigError, } from "../fleet-config-updater.js";
19
+ import { fetchRepository } from "../repository-fetcher.js";
20
+ import { validateRepository } from "../repository-validator.js";
21
+ import { isLocalSource, parseSourceSpecifier } from "../source-specifier.js";
22
+ // =============================================================================
23
+ // Test Setup
24
+ // =============================================================================
25
+ const FIXTURE_DIR = path.resolve(__dirname, "fixtures", "sample-agent");
26
+ describe("Agent Distribution Integration", () => {
27
+ let tempDir;
28
+ const originalEnv = {};
29
+ beforeEach(async () => {
30
+ // Create a fresh temp directory for each test
31
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "herdctl-integration-"));
32
+ // Store original env values
33
+ originalEnv.WEBSITES = process.env.WEBSITES;
34
+ originalEnv.DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;
35
+ originalEnv.DOCKER_ENABLED = process.env.DOCKER_ENABLED;
36
+ });
37
+ afterEach(async () => {
38
+ // Clean up temp directory
39
+ await fs.rm(tempDir, { recursive: true, force: true });
40
+ // Restore original env values
41
+ if (originalEnv.WEBSITES !== undefined) {
42
+ process.env.WEBSITES = originalEnv.WEBSITES;
43
+ }
44
+ else {
45
+ delete process.env.WEBSITES;
46
+ }
47
+ if (originalEnv.DISCORD_WEBHOOK_URL !== undefined) {
48
+ process.env.DISCORD_WEBHOOK_URL = originalEnv.DISCORD_WEBHOOK_URL;
49
+ }
50
+ else {
51
+ delete process.env.DISCORD_WEBHOOK_URL;
52
+ }
53
+ if (originalEnv.DOCKER_ENABLED !== undefined) {
54
+ process.env.DOCKER_ENABLED = originalEnv.DOCKER_ENABLED;
55
+ }
56
+ else {
57
+ delete process.env.DOCKER_ENABLED;
58
+ }
59
+ });
60
+ // ===========================================================================
61
+ // Helper Functions
62
+ // ===========================================================================
63
+ /**
64
+ * Creates a minimal valid herdctl.yaml for testing
65
+ */
66
+ async function createMinimalFleetConfig(dir) {
67
+ const configPath = path.join(dir, "herdctl.yaml");
68
+ const content = `version: 1
69
+ agents: []
70
+ `;
71
+ await fs.writeFile(configPath, content, "utf-8");
72
+ return configPath;
73
+ }
74
+ /**
75
+ * Creates a fleet config with the installed agent reference
76
+ */
77
+ async function createFleetConfigWithAgent(dir, agentPath) {
78
+ const configPath = path.join(dir, "herdctl.yaml");
79
+ const content = `version: 1
80
+ agents:
81
+ - path: ${agentPath}
82
+ `;
83
+ await fs.writeFile(configPath, content, "utf-8");
84
+ return configPath;
85
+ }
86
+ // ===========================================================================
87
+ // Test 1: Full Installation Flow from Local Path
88
+ // ===========================================================================
89
+ describe("full installation flow from local path", () => {
90
+ it("completes the entire installation pipeline", async () => {
91
+ // 1. Create project root with minimal herdctl.yaml
92
+ const configPath = await createMinimalFleetConfig(tempDir);
93
+ // 2. Parse source specifier (local path to fixture)
94
+ const source = parseSourceSpecifier(FIXTURE_DIR);
95
+ expect(source.type).toBe("local");
96
+ expect(isLocalSource(source)).toBe(true);
97
+ // 3. Fetch repository (copies local to temp)
98
+ const fetchResult = await fetchRepository(source);
99
+ expect(fetchResult.path).toBeTruthy();
100
+ try {
101
+ // 4. Validate the repository
102
+ const validationResult = await validateRepository(fetchResult.path);
103
+ expect(validationResult.valid).toBe(true);
104
+ expect(validationResult.agentName).toBe("sample-agent");
105
+ expect(validationResult.errors).toHaveLength(0);
106
+ // 5. Install agent files
107
+ const installResult = await installAgentFiles({
108
+ sourceDir: fetchResult.path,
109
+ targetBaseDir: tempDir,
110
+ source: {
111
+ type: "local",
112
+ url: FIXTURE_DIR,
113
+ },
114
+ });
115
+ expect(installResult.agentName).toBe("sample-agent");
116
+ expect(installResult.installPath).toBe(path.join(tempDir, "agents", "sample-agent"));
117
+ // 6. Verify files were copied
118
+ const agentDir = installResult.installPath;
119
+ // Check agent.yaml exists
120
+ const agentYamlExists = await fs
121
+ .access(path.join(agentDir, "agent.yaml"))
122
+ .then(() => true)
123
+ .catch(() => false);
124
+ expect(agentYamlExists).toBe(true);
125
+ // Check CLAUDE.md exists
126
+ const claudeMdExists = await fs
127
+ .access(path.join(agentDir, "CLAUDE.md"))
128
+ .then(() => true)
129
+ .catch(() => false);
130
+ expect(claudeMdExists).toBe(true);
131
+ // Check herdctl.json exists
132
+ const herdctlJsonExists = await fs
133
+ .access(path.join(agentDir, "herdctl.json"))
134
+ .then(() => true)
135
+ .catch(() => false);
136
+ expect(herdctlJsonExists).toBe(true);
137
+ // Check knowledge/guide.md exists
138
+ const knowledgeExists = await fs
139
+ .access(path.join(agentDir, "knowledge", "guide.md"))
140
+ .then(() => true)
141
+ .catch(() => false);
142
+ expect(knowledgeExists).toBe(true);
143
+ // Check workspace/ directory was created
144
+ const workspaceExists = await fs
145
+ .access(path.join(agentDir, "workspace"))
146
+ .then(() => true)
147
+ .catch(() => false);
148
+ expect(workspaceExists).toBe(true);
149
+ // Check metadata.json was created
150
+ const metadataPath = path.join(agentDir, "metadata.json");
151
+ const metadataContent = await fs.readFile(metadataPath, "utf-8");
152
+ const metadata = JSON.parse(metadataContent);
153
+ expect(metadata.source.type).toBe("local");
154
+ expect(metadata.source.url).toBe(FIXTURE_DIR);
155
+ expect(metadata.installed_at).toBeTruthy();
156
+ expect(metadata.installed_by).toBeTruthy();
157
+ // 7. Update fleet config to add agent reference
158
+ const agentRelPath = "./agents/sample-agent/agent.yaml";
159
+ const updateResult = await addAgentToFleetConfig({
160
+ configPath,
161
+ agentPath: agentRelPath,
162
+ });
163
+ expect(updateResult.modified).toBe(true);
164
+ expect(updateResult.alreadyExists).toBe(false);
165
+ // Verify the herdctl.yaml was updated
166
+ const updatedConfig = await fs.readFile(configPath, "utf-8");
167
+ expect(updatedConfig).toContain(agentRelPath);
168
+ // 8. Scan env variables from installed agent.yaml
169
+ const installedAgentYaml = await fs.readFile(path.join(agentDir, "agent.yaml"), "utf-8");
170
+ const envScan = scanEnvVariables(installedAgentYaml);
171
+ // The fixture uses env vars in string contexts (the prompt field)
172
+ // but not in boolean fields (docker.enabled is a literal false)
173
+ expect(envScan.required).toHaveLength(2);
174
+ expect(envScan.required.map((v) => v.name).sort()).toEqual([
175
+ "DISCORD_WEBHOOK_URL",
176
+ "WEBSITES",
177
+ ]);
178
+ // No optional env vars in this fixture (docker.enabled is a literal boolean)
179
+ expect(envScan.optional).toHaveLength(0);
180
+ }
181
+ finally {
182
+ await fetchResult.cleanup();
183
+ }
184
+ });
185
+ });
186
+ // ===========================================================================
187
+ // Test 2: Installed Agent is Loadable by loadConfig()
188
+ // ===========================================================================
189
+ describe("installed agent is loadable by loadConfig()", () => {
190
+ it("loads the installed agent configuration successfully", async () => {
191
+ // Set required env vars for interpolation
192
+ process.env.WEBSITES = "https://example.com";
193
+ process.env.DISCORD_WEBHOOK_URL = "https://discord.com/webhook/test";
194
+ // 1. Fetch and install the agent
195
+ const fetchResult = await fetchRepository({
196
+ type: "local",
197
+ path: FIXTURE_DIR,
198
+ });
199
+ try {
200
+ const installResult = await installAgentFiles({
201
+ sourceDir: fetchResult.path,
202
+ targetBaseDir: tempDir,
203
+ source: {
204
+ type: "local",
205
+ url: FIXTURE_DIR,
206
+ },
207
+ });
208
+ // 2. Create herdctl.yaml that references the installed agent
209
+ const agentRelPath = "./agents/sample-agent/agent.yaml";
210
+ await createFleetConfigWithAgent(tempDir, agentRelPath);
211
+ // 3. Load the config using the standard loader
212
+ const configPath = path.join(tempDir, "herdctl.yaml");
213
+ const config = await loadConfig(configPath, {
214
+ envFile: false, // Don't auto-load .env
215
+ });
216
+ // 4. Verify the config loaded correctly
217
+ expect(config.agents).toHaveLength(1);
218
+ const agent = config.agents[0];
219
+ expect(agent.name).toBe("sample-agent");
220
+ expect(agent.runtime).toBe("cli");
221
+ expect(agent.permission_mode).toBe("default");
222
+ // Verify interpolation worked in the prompt string
223
+ expect(agent.schedules?.heartbeat?.prompt).toContain("https://example.com");
224
+ expect(agent.schedules?.heartbeat?.prompt).toContain("https://discord.com/webhook/test");
225
+ // Docker.enabled is a literal false in the fixture (not an env var)
226
+ expect(agent.docker?.enabled).toBe(false);
227
+ // Verify qualified name (root-level agent)
228
+ expect(agent.qualifiedName).toBe("sample-agent");
229
+ expect(agent.fleetPath).toEqual([]);
230
+ // Verify configPath is set
231
+ expect(agent.configPath).toBe(path.join(installResult.installPath, "agent.yaml"));
232
+ }
233
+ finally {
234
+ await fetchResult.cleanup();
235
+ }
236
+ });
237
+ });
238
+ // ===========================================================================
239
+ // Test 3: Installation Rejects Existing Agent Directory
240
+ // ===========================================================================
241
+ describe("installation rejects existing agent directory", () => {
242
+ it("throws AGENT_ALREADY_EXISTS when agent directory exists", async () => {
243
+ // 1. Install once
244
+ const fetchResult = await fetchRepository({
245
+ type: "local",
246
+ path: FIXTURE_DIR,
247
+ });
248
+ try {
249
+ await installAgentFiles({
250
+ sourceDir: fetchResult.path,
251
+ targetBaseDir: tempDir,
252
+ source: {
253
+ type: "local",
254
+ url: FIXTURE_DIR,
255
+ },
256
+ });
257
+ // 2. Try to install again without force
258
+ await expect(installAgentFiles({
259
+ sourceDir: fetchResult.path,
260
+ targetBaseDir: tempDir,
261
+ source: {
262
+ type: "local",
263
+ url: FIXTURE_DIR,
264
+ },
265
+ force: false, // Explicitly false
266
+ })).rejects.toThrow(AgentInstallError);
267
+ // 3. Verify error code
268
+ try {
269
+ await installAgentFiles({
270
+ sourceDir: fetchResult.path,
271
+ targetBaseDir: tempDir,
272
+ source: {
273
+ type: "local",
274
+ url: FIXTURE_DIR,
275
+ },
276
+ });
277
+ }
278
+ catch (err) {
279
+ expect(err).toBeInstanceOf(AgentInstallError);
280
+ expect(err.code).toBe(AGENT_ALREADY_EXISTS);
281
+ }
282
+ }
283
+ finally {
284
+ await fetchResult.cleanup();
285
+ }
286
+ });
287
+ });
288
+ // ===========================================================================
289
+ // Test 4: Installation with --force Overwrites
290
+ // ===========================================================================
291
+ describe("installation with force overwrites", () => {
292
+ it("successfully reinstalls when force is true", async () => {
293
+ // 1. Install once
294
+ const fetchResult1 = await fetchRepository({
295
+ type: "local",
296
+ path: FIXTURE_DIR,
297
+ });
298
+ let firstMetadataTime;
299
+ try {
300
+ const firstInstall = await installAgentFiles({
301
+ sourceDir: fetchResult1.path,
302
+ targetBaseDir: tempDir,
303
+ source: {
304
+ type: "local",
305
+ url: FIXTURE_DIR,
306
+ },
307
+ });
308
+ // Record the first installation time
309
+ const firstMetadata = JSON.parse(await fs.readFile(path.join(firstInstall.installPath, "metadata.json"), "utf-8"));
310
+ firstMetadataTime = firstMetadata.installed_at;
311
+ }
312
+ finally {
313
+ await fetchResult1.cleanup();
314
+ }
315
+ // Small delay to ensure different timestamps
316
+ await new Promise((resolve) => setTimeout(resolve, 10));
317
+ // 2. Install again with force
318
+ const fetchResult2 = await fetchRepository({
319
+ type: "local",
320
+ path: FIXTURE_DIR,
321
+ });
322
+ try {
323
+ const secondInstall = await installAgentFiles({
324
+ sourceDir: fetchResult2.path,
325
+ targetBaseDir: tempDir,
326
+ source: {
327
+ type: "local",
328
+ url: FIXTURE_DIR,
329
+ },
330
+ force: true,
331
+ });
332
+ // 3. Verify installation succeeded
333
+ expect(secondInstall.agentName).toBe("sample-agent");
334
+ // 4. Verify metadata was updated
335
+ const secondMetadata = JSON.parse(await fs.readFile(path.join(secondInstall.installPath, "metadata.json"), "utf-8"));
336
+ expect(secondMetadata.installed_at).not.toBe(firstMetadataTime);
337
+ }
338
+ finally {
339
+ await fetchResult2.cleanup();
340
+ }
341
+ });
342
+ });
343
+ // ===========================================================================
344
+ // Test 5: Validation Stops Installation on Errors
345
+ // ===========================================================================
346
+ describe("validation stops installation on errors", () => {
347
+ it("validateRepository returns errors for invalid repo", async () => {
348
+ // Create a temp directory with no agent.yaml
349
+ const invalidRepoDir = path.join(tempDir, "invalid-repo");
350
+ await fs.mkdir(invalidRepoDir, { recursive: true });
351
+ await fs.writeFile(path.join(invalidRepoDir, "README.md"), "# Invalid Agent\n\nNo agent.yaml here!");
352
+ // Validation should return errors
353
+ const validationResult = await validateRepository(invalidRepoDir);
354
+ expect(validationResult.valid).toBe(false);
355
+ expect(validationResult.errors.length).toBeGreaterThan(0);
356
+ expect(validationResult.errors.some((e) => e.code === "MISSING_AGENT_YAML")).toBe(true);
357
+ });
358
+ it("installAgentFiles errors on missing agent.yaml", async () => {
359
+ // Create a temp directory with no agent.yaml
360
+ const invalidRepoDir = path.join(tempDir, "invalid-repo");
361
+ await fs.mkdir(invalidRepoDir, { recursive: true });
362
+ await fs.writeFile(path.join(invalidRepoDir, "README.md"), "# Invalid Agent\n\nNo agent.yaml here!");
363
+ // Install should fail
364
+ await expect(installAgentFiles({
365
+ sourceDir: invalidRepoDir,
366
+ targetBaseDir: tempDir,
367
+ source: {
368
+ type: "local",
369
+ url: invalidRepoDir,
370
+ },
371
+ })).rejects.toThrow(AgentInstallError);
372
+ });
373
+ });
374
+ // ===========================================================================
375
+ // Test 6: Fleet Config Already Has Agent Reference
376
+ // ===========================================================================
377
+ describe("fleet config already has the agent reference", () => {
378
+ it("returns alreadyExists: true when adding duplicate reference", async () => {
379
+ // 1. Create fleet config with agent already referenced
380
+ const agentRelPath = "./agents/sample-agent/agent.yaml";
381
+ const configPath = await createFleetConfigWithAgent(tempDir, agentRelPath);
382
+ // 2. Try to add the same agent reference
383
+ const result = await addAgentToFleetConfig({
384
+ configPath,
385
+ agentPath: agentRelPath,
386
+ });
387
+ // 3. Verify it was not modified
388
+ expect(result.modified).toBe(false);
389
+ expect(result.alreadyExists).toBe(true);
390
+ expect(result.agentPath).toBe(agentRelPath);
391
+ });
392
+ it("does not duplicate agent reference on second add", async () => {
393
+ // 1. Create minimal config
394
+ const configPath = await createMinimalFleetConfig(tempDir);
395
+ // 2. Add agent reference
396
+ const agentRelPath = "./agents/sample-agent/agent.yaml";
397
+ await addAgentToFleetConfig({
398
+ configPath,
399
+ agentPath: agentRelPath,
400
+ });
401
+ // 3. Try to add again
402
+ const result = await addAgentToFleetConfig({
403
+ configPath,
404
+ agentPath: agentRelPath,
405
+ });
406
+ expect(result.modified).toBe(false);
407
+ expect(result.alreadyExists).toBe(true);
408
+ // 4. Verify config only has one reference
409
+ const configContent = await fs.readFile(configPath, "utf-8");
410
+ const matches = configContent.match(/sample-agent/g);
411
+ expect(matches).toHaveLength(1);
412
+ });
413
+ });
414
+ // ===========================================================================
415
+ // Test 7: Env Var Scanner Finds All Variables
416
+ // ===========================================================================
417
+ describe("env var scanner finds all variables", () => {
418
+ it("correctly partitions required and optional variables", async () => {
419
+ // Read the fixture agent.yaml
420
+ const agentYaml = await fs.readFile(path.join(FIXTURE_DIR, "agent.yaml"), "utf-8");
421
+ const result = scanEnvVariables(agentYaml);
422
+ // The fixture has 2 env vars in the prompt string (WEBSITES and DISCORD_WEBHOOK_URL)
423
+ // docker.enabled is a literal boolean (not an env var reference)
424
+ expect(result.variables).toHaveLength(2);
425
+ // Check required variables (no default)
426
+ expect(result.required).toHaveLength(2);
427
+ const requiredNames = result.required.map((v) => v.name).sort();
428
+ expect(requiredNames).toEqual(["DISCORD_WEBHOOK_URL", "WEBSITES"]);
429
+ // Verify required vars have no default
430
+ for (const reqVar of result.required) {
431
+ expect(reqVar.defaultValue).toBeUndefined();
432
+ }
433
+ // No optional variables in this fixture
434
+ // (docker.enabled is a literal false, not ${DOCKER_ENABLED:-false})
435
+ expect(result.optional).toHaveLength(0);
436
+ });
437
+ it("handles YAML content with no env vars", () => {
438
+ const yamlContent = `
439
+ name: simple-agent
440
+ runtime: cli
441
+ description: No environment variables here
442
+ `;
443
+ const result = scanEnvVariables(yamlContent);
444
+ expect(result.variables).toHaveLength(0);
445
+ expect(result.required).toHaveLength(0);
446
+ expect(result.optional).toHaveLength(0);
447
+ });
448
+ });
449
+ // ===========================================================================
450
+ // Additional Integration Tests
451
+ // ===========================================================================
452
+ describe("end-to-end error handling", () => {
453
+ it("addAgentToFleetConfig throws when config file is missing", async () => {
454
+ const nonExistentConfig = path.join(tempDir, "non-existent.yaml");
455
+ await expect(addAgentToFleetConfig({
456
+ configPath: nonExistentConfig,
457
+ agentPath: "./agents/test/agent.yaml",
458
+ })).rejects.toThrow(FleetConfigError);
459
+ try {
460
+ await addAgentToFleetConfig({
461
+ configPath: nonExistentConfig,
462
+ agentPath: "./agents/test/agent.yaml",
463
+ });
464
+ }
465
+ catch (err) {
466
+ expect(err).toBeInstanceOf(FleetConfigError);
467
+ expect(err.code).toBe(CONFIG_NOT_FOUND);
468
+ }
469
+ });
470
+ it("validates and installs in correct order", async () => {
471
+ // This test verifies the expected workflow: validate THEN install
472
+ const fetchResult = await fetchRepository({
473
+ type: "local",
474
+ path: FIXTURE_DIR,
475
+ });
476
+ try {
477
+ // Step 1: Validate
478
+ const validation = await validateRepository(fetchResult.path);
479
+ expect(validation.valid).toBe(true);
480
+ // Only proceed if validation passes
481
+ if (!validation.valid) {
482
+ throw new Error("Validation failed unexpectedly");
483
+ }
484
+ // Step 2: Install
485
+ const install = await installAgentFiles({
486
+ sourceDir: fetchResult.path,
487
+ targetBaseDir: tempDir,
488
+ source: {
489
+ type: "local",
490
+ url: FIXTURE_DIR,
491
+ },
492
+ });
493
+ // Step 3: Verify the agent name matches
494
+ expect(install.agentName).toBe(validation.agentName);
495
+ }
496
+ finally {
497
+ await fetchResult.cleanup();
498
+ }
499
+ });
500
+ });
501
+ describe("repository fetcher integration", () => {
502
+ it("local source fetch copies all files correctly", async () => {
503
+ const source = parseSourceSpecifier(FIXTURE_DIR);
504
+ expect(isLocalSource(source)).toBe(true);
505
+ const fetchResult = await fetchRepository(source);
506
+ try {
507
+ // Verify the temp directory contains the expected files
508
+ const files = await fs.readdir(fetchResult.path, { recursive: true });
509
+ // Should have agent.yaml, CLAUDE.md, herdctl.json, knowledge/guide.md
510
+ expect(files).toContain("agent.yaml");
511
+ expect(files).toContain("CLAUDE.md");
512
+ expect(files).toContain("herdctl.json");
513
+ // Note: readdir with recursive returns relative paths with path separators
514
+ expect(files.some((f) => f.includes("guide.md"))).toBe(true);
515
+ }
516
+ finally {
517
+ await fetchResult.cleanup();
518
+ }
519
+ });
520
+ });
521
+ });
522
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for repository fetcher
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=repository-fetcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-fetcher.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/repository-fetcher.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}