@herdctl/core 5.2.2 → 5.4.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 (91) hide show
  1. package/dist/__tests__/fleet-composition-integration.test.d.ts +15 -0
  2. package/dist/__tests__/fleet-composition-integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/fleet-composition-integration.test.js +942 -0
  4. package/dist/__tests__/fleet-composition-integration.test.js.map +1 -0
  5. package/dist/config/__tests__/fleet-error-messages.test.d.ts +9 -0
  6. package/dist/config/__tests__/fleet-error-messages.test.d.ts.map +1 -0
  7. package/dist/config/__tests__/fleet-error-messages.test.js +321 -0
  8. package/dist/config/__tests__/fleet-error-messages.test.js.map +1 -0
  9. package/dist/config/__tests__/fleet-loading.test.d.ts +2 -0
  10. package/dist/config/__tests__/fleet-loading.test.d.ts.map +1 -0
  11. package/dist/config/__tests__/fleet-loading.test.js +627 -0
  12. package/dist/config/__tests__/fleet-loading.test.js.map +1 -0
  13. package/dist/config/__tests__/fleet-naming-and-defaults.test.d.ts +2 -0
  14. package/dist/config/__tests__/fleet-naming-and-defaults.test.d.ts.map +1 -0
  15. package/dist/config/__tests__/fleet-naming-and-defaults.test.js +1024 -0
  16. package/dist/config/__tests__/fleet-naming-and-defaults.test.js.map +1 -0
  17. package/dist/config/__tests__/schema.test.js +172 -1
  18. package/dist/config/__tests__/schema.test.js.map +1 -1
  19. package/dist/config/index.d.ts +2 -2
  20. package/dist/config/index.d.ts.map +1 -1
  21. package/dist/config/index.js +3 -3
  22. package/dist/config/index.js.map +1 -1
  23. package/dist/config/loader.d.ts +63 -2
  24. package/dist/config/loader.d.ts.map +1 -1
  25. package/dist/config/loader.js +309 -74
  26. package/dist/config/loader.js.map +1 -1
  27. package/dist/config/schema.d.ts +280 -36
  28. package/dist/config/schema.d.ts.map +1 -1
  29. package/dist/config/schema.js +58 -7
  30. package/dist/config/schema.js.map +1 -1
  31. package/dist/fleet-manager/__tests__/config-reload-qualified.test.d.ts +8 -0
  32. package/dist/fleet-manager/__tests__/config-reload-qualified.test.d.ts.map +1 -0
  33. package/dist/fleet-manager/__tests__/config-reload-qualified.test.js +416 -0
  34. package/dist/fleet-manager/__tests__/config-reload-qualified.test.js.map +1 -0
  35. package/dist/fleet-manager/__tests__/integration.test.js +2 -2
  36. package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
  37. package/dist/fleet-manager/chat-manager-interface.d.ts +6 -6
  38. package/dist/fleet-manager/chat-manager-interface.d.ts.map +1 -1
  39. package/dist/fleet-manager/config-reload.d.ts.map +1 -1
  40. package/dist/fleet-manager/config-reload.js +17 -14
  41. package/dist/fleet-manager/config-reload.js.map +1 -1
  42. package/dist/fleet-manager/fleet-manager.d.ts +9 -5
  43. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  44. package/dist/fleet-manager/fleet-manager.js +19 -9
  45. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  46. package/dist/fleet-manager/job-control.js +9 -9
  47. package/dist/fleet-manager/job-control.js.map +1 -1
  48. package/dist/fleet-manager/schedule-executor.js +13 -13
  49. package/dist/fleet-manager/schedule-executor.js.map +1 -1
  50. package/dist/fleet-manager/schedule-management.d.ts.map +1 -1
  51. package/dist/fleet-manager/schedule-management.js +22 -16
  52. package/dist/fleet-manager/schedule-management.js.map +1 -1
  53. package/dist/fleet-manager/status-queries.d.ts +5 -1
  54. package/dist/fleet-manager/status-queries.d.ts.map +1 -1
  55. package/dist/fleet-manager/status-queries.js +16 -8
  56. package/dist/fleet-manager/status-queries.js.map +1 -1
  57. package/dist/fleet-manager/types.d.ts +12 -1
  58. package/dist/fleet-manager/types.d.ts.map +1 -1
  59. package/dist/runner/__tests__/job-executor.test.js +2 -0
  60. package/dist/runner/__tests__/job-executor.test.js.map +1 -1
  61. package/dist/runner/__tests__/sdk-adapter.test.js +2 -0
  62. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
  63. package/dist/scheduler/__tests__/schedule-runner.test.js +2 -0
  64. package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -1
  65. package/dist/scheduler/__tests__/scheduler.test.js +2 -0
  66. package/dist/scheduler/__tests__/scheduler.test.js.map +1 -1
  67. package/dist/scheduler/schedule-runner.js +12 -12
  68. package/dist/scheduler/schedule-runner.js.map +1 -1
  69. package/dist/scheduler/scheduler.js +22 -22
  70. package/dist/scheduler/scheduler.js.map +1 -1
  71. package/dist/state/__tests__/session.test.js +27 -0
  72. package/dist/state/__tests__/session.test.js.map +1 -1
  73. package/dist/state/fleet-state.d.ts +2 -2
  74. package/dist/state/fleet-state.js +2 -2
  75. package/dist/state/schemas/session-info.d.ts +5 -2
  76. package/dist/state/schemas/session-info.d.ts.map +1 -1
  77. package/dist/state/schemas/session-info.js +5 -2
  78. package/dist/state/schemas/session-info.js.map +1 -1
  79. package/dist/state/session.d.ts +4 -1
  80. package/dist/state/session.d.ts.map +1 -1
  81. package/dist/state/session.js +4 -1
  82. package/dist/state/session.js.map +1 -1
  83. package/dist/state/utils/__tests__/path-safety.test.js +18 -3
  84. package/dist/state/utils/__tests__/path-safety.test.js.map +1 -1
  85. package/dist/state/utils/path-safety.d.ts +4 -2
  86. package/dist/state/utils/path-safety.d.ts.map +1 -1
  87. package/dist/state/utils/path-safety.js +5 -3
  88. package/dist/state/utils/path-safety.js.map +1 -1
  89. package/dist/work-sources/__tests__/manager.test.js +2 -0
  90. package/dist/work-sources/__tests__/manager.test.js.map +1 -1
  91. package/package.json +1 -1
@@ -0,0 +1,627 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdir, writeFile, rm, realpath } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { loadConfig, FleetCycleError, FleetNameCollisionError, FleetLoadError, } from "../loader.js";
6
+ // =============================================================================
7
+ // Test helpers
8
+ // =============================================================================
9
+ async function createTempDir() {
10
+ const baseDir = join(tmpdir(), `herdctl-fleet-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
+ await mkdir(baseDir, { recursive: true });
12
+ return await realpath(baseDir);
13
+ }
14
+ async function createFile(filePath, content) {
15
+ await mkdir(join(filePath, ".."), { recursive: true });
16
+ await writeFile(filePath, content, "utf-8");
17
+ }
18
+ // =============================================================================
19
+ // Fixture-based tests (using static fixture YAML files)
20
+ // =============================================================================
21
+ const fixturesDir = resolve(__dirname, "fixtures", "fleet-composition");
22
+ describe("fleet composition (fixture-based)", () => {
23
+ it("loads root fleet with two sub-fleets and a root-level agent", async () => {
24
+ const result = await loadConfig(join(fixturesDir, "root.yaml"), {
25
+ env: {},
26
+ envFile: false,
27
+ });
28
+ // Should have 4 agents total: 2 from project-a, 1 from project-b, 1 root monitor
29
+ expect(result.agents).toHaveLength(4);
30
+ // Root-level agent
31
+ const monitor = result.agents.find((a) => a.name === "monitor");
32
+ expect(monitor).toBeDefined();
33
+ expect(monitor.fleetPath).toEqual([]);
34
+ expect(monitor.qualifiedName).toBe("monitor");
35
+ // Project A agents
36
+ const secAuditor = result.agents.find((a) => a.name === "security-auditor");
37
+ expect(secAuditor).toBeDefined();
38
+ expect(secAuditor.fleetPath).toEqual(["project-a"]);
39
+ expect(secAuditor.qualifiedName).toBe("project-a.security-auditor");
40
+ const engineer = result.agents.find((a) => a.name === "engineer");
41
+ expect(engineer).toBeDefined();
42
+ expect(engineer.fleetPath).toEqual(["project-a"]);
43
+ expect(engineer.qualifiedName).toBe("project-a.engineer");
44
+ // Project B agent (renamed via parent override)
45
+ const designer = result.agents.find((a) => a.name === "designer");
46
+ expect(designer).toBeDefined();
47
+ expect(designer.fleetPath).toEqual(["renamed-b"]);
48
+ expect(designer.qualifiedName).toBe("renamed-b.designer");
49
+ });
50
+ it("preserves root fleet web config", async () => {
51
+ const result = await loadConfig(join(fixturesDir, "root.yaml"), {
52
+ env: {},
53
+ envFile: false,
54
+ });
55
+ expect(result.fleet.web?.enabled).toBe(true);
56
+ expect(result.fleet.web?.port).toBe(3232);
57
+ });
58
+ it("detects fleet composition cycles", async () => {
59
+ await expect(loadConfig(join(fixturesDir, "cycle-root.yaml"), {
60
+ env: {},
61
+ envFile: false,
62
+ })).rejects.toThrow(FleetCycleError);
63
+ });
64
+ it("detects fleet name collisions", async () => {
65
+ await expect(loadConfig(join(fixturesDir, "collision-root.yaml"), {
66
+ env: {},
67
+ envFile: false,
68
+ })).rejects.toThrow(FleetNameCollisionError);
69
+ });
70
+ });
71
+ // =============================================================================
72
+ // Dynamic tests (using temp directories)
73
+ // =============================================================================
74
+ describe("fleet composition (dynamic)", () => {
75
+ let tempDir;
76
+ beforeEach(async () => {
77
+ tempDir = await createTempDir();
78
+ });
79
+ afterEach(async () => {
80
+ await rm(tempDir, { recursive: true, force: true });
81
+ });
82
+ describe("basic composition", () => {
83
+ it("flattens agents from sub-fleets with correct count", async () => {
84
+ await createFile(join(tempDir, "herdctl.yaml"), `
85
+ version: 1
86
+ fleets:
87
+ - path: ./sub-a/herdctl.yaml
88
+ - path: ./sub-b/herdctl.yaml
89
+ agents:
90
+ - path: ./agents/root-agent.yaml
91
+ `);
92
+ await createFile(join(tempDir, "sub-a", "herdctl.yaml"), `
93
+ version: 1
94
+ fleet:
95
+ name: sub-a
96
+ agents:
97
+ - path: ./agents/a1.yaml
98
+ - path: ./agents/a2.yaml
99
+ `);
100
+ await createFile(join(tempDir, "sub-b", "herdctl.yaml"), `
101
+ version: 1
102
+ fleet:
103
+ name: sub-b
104
+ agents:
105
+ - path: ./agents/b1.yaml
106
+ `);
107
+ await createFile(join(tempDir, "agents", "root-agent.yaml"), "name: root-agent");
108
+ await createFile(join(tempDir, "sub-a", "agents", "a1.yaml"), "name: agent-a1");
109
+ await createFile(join(tempDir, "sub-a", "agents", "a2.yaml"), "name: agent-a2");
110
+ await createFile(join(tempDir, "sub-b", "agents", "b1.yaml"), "name: agent-b1");
111
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
112
+ expect(result.agents).toHaveLength(4);
113
+ });
114
+ it("sets correct fleetPath for sub-fleet agents", async () => {
115
+ await createFile(join(tempDir, "herdctl.yaml"), `
116
+ version: 1
117
+ fleets:
118
+ - path: ./sub/herdctl.yaml
119
+ `);
120
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
121
+ version: 1
122
+ fleet:
123
+ name: my-sub
124
+ agents:
125
+ - path: ./agents/worker.yaml
126
+ `);
127
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
128
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
129
+ expect(result.agents[0].fleetPath).toEqual(["my-sub"]);
130
+ expect(result.agents[0].qualifiedName).toBe("my-sub.worker");
131
+ });
132
+ });
133
+ describe("root-level agents", () => {
134
+ it("root agents have empty fleetPath and qualifiedName equals name", async () => {
135
+ await createFile(join(tempDir, "herdctl.yaml"), `
136
+ version: 1
137
+ agents:
138
+ - path: ./agents/direct.yaml
139
+ `);
140
+ await createFile(join(tempDir, "agents", "direct.yaml"), "name: direct-agent");
141
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
142
+ expect(result.agents).toHaveLength(1);
143
+ expect(result.agents[0].fleetPath).toEqual([]);
144
+ expect(result.agents[0].qualifiedName).toBe("direct-agent");
145
+ });
146
+ });
147
+ describe("fleet naming", () => {
148
+ it("uses parent override name when provided", async () => {
149
+ await createFile(join(tempDir, "herdctl.yaml"), `
150
+ version: 1
151
+ fleets:
152
+ - path: ./sub/herdctl.yaml
153
+ name: override-name
154
+ `);
155
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
156
+ version: 1
157
+ fleet:
158
+ name: original-name
159
+ agents:
160
+ - path: ./agents/worker.yaml
161
+ `);
162
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
163
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
164
+ expect(result.agents[0].fleetPath).toEqual(["override-name"]);
165
+ expect(result.agents[0].qualifiedName).toBe("override-name.worker");
166
+ });
167
+ it("uses sub-fleet fleet.name when no parent override", async () => {
168
+ await createFile(join(tempDir, "herdctl.yaml"), `
169
+ version: 1
170
+ fleets:
171
+ - path: ./sub/herdctl.yaml
172
+ `);
173
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
174
+ version: 1
175
+ fleet:
176
+ name: fleet-own-name
177
+ agents:
178
+ - path: ./agents/worker.yaml
179
+ `);
180
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
181
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
182
+ expect(result.agents[0].fleetPath).toEqual(["fleet-own-name"]);
183
+ expect(result.agents[0].qualifiedName).toBe("fleet-own-name.worker");
184
+ });
185
+ it("uses directory name when neither parent nor sub-fleet provides name", async () => {
186
+ await createFile(join(tempDir, "herdctl.yaml"), `
187
+ version: 1
188
+ fleets:
189
+ - path: ./my-project-dir/herdctl.yaml
190
+ `);
191
+ await createFile(join(tempDir, "my-project-dir", "herdctl.yaml"), `
192
+ version: 1
193
+ agents:
194
+ - path: ./agents/worker.yaml
195
+ `);
196
+ await createFile(join(tempDir, "my-project-dir", "agents", "worker.yaml"), "name: worker");
197
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
198
+ expect(result.agents[0].fleetPath).toEqual(["my-project-dir"]);
199
+ expect(result.agents[0].qualifiedName).toBe("my-project-dir.worker");
200
+ });
201
+ });
202
+ describe("web suppression", () => {
203
+ it("suppresses sub-fleet web config by default", async () => {
204
+ await createFile(join(tempDir, "herdctl.yaml"), `
205
+ version: 1
206
+ web:
207
+ enabled: true
208
+ port: 3232
209
+ fleets:
210
+ - path: ./sub/herdctl.yaml
211
+ `);
212
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
213
+ version: 1
214
+ fleet:
215
+ name: sub-fleet
216
+ web:
217
+ enabled: true
218
+ port: 4000
219
+ agents:
220
+ - path: ./agents/worker.yaml
221
+ `);
222
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
223
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
224
+ // Root web should be preserved
225
+ expect(result.fleet.web?.enabled).toBe(true);
226
+ expect(result.fleet.web?.port).toBe(3232);
227
+ });
228
+ it("does not suppress sub-fleet web when parent explicitly overrides web", async () => {
229
+ await createFile(join(tempDir, "herdctl.yaml"), `
230
+ version: 1
231
+ fleets:
232
+ - path: ./sub/herdctl.yaml
233
+ overrides:
234
+ web:
235
+ enabled: true
236
+ port: 5000
237
+ `);
238
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
239
+ version: 1
240
+ fleet:
241
+ name: sub-fleet
242
+ web:
243
+ enabled: true
244
+ port: 4000
245
+ agents:
246
+ - path: ./agents/worker.yaml
247
+ `);
248
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
249
+ // Should not throw, and the web override should be applied
250
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
251
+ expect(result.agents).toHaveLength(1);
252
+ });
253
+ });
254
+ describe("cycle detection", () => {
255
+ it("detects direct cycle (A -> B -> A) and throws FleetCycleError", async () => {
256
+ await createFile(join(tempDir, "root.yaml"), `
257
+ version: 1
258
+ fleets:
259
+ - path: ./fleet-a/herdctl.yaml
260
+ `);
261
+ await createFile(join(tempDir, "fleet-a", "herdctl.yaml"), `
262
+ version: 1
263
+ fleet:
264
+ name: fleet-a
265
+ fleets:
266
+ - path: ../fleet-b/herdctl.yaml
267
+ `);
268
+ await createFile(join(tempDir, "fleet-b", "herdctl.yaml"), `
269
+ version: 1
270
+ fleet:
271
+ name: fleet-b
272
+ fleets:
273
+ - path: ../fleet-a/herdctl.yaml
274
+ `);
275
+ await expect(loadConfig(join(tempDir, "root.yaml"), { env: {}, envFile: false })).rejects.toThrow(FleetCycleError);
276
+ });
277
+ it("cycle error message shows the full path chain", async () => {
278
+ await createFile(join(tempDir, "root.yaml"), `
279
+ version: 1
280
+ fleets:
281
+ - path: ./fleet-a/herdctl.yaml
282
+ `);
283
+ await createFile(join(tempDir, "fleet-a", "herdctl.yaml"), `
284
+ version: 1
285
+ fleet:
286
+ name: fleet-a
287
+ fleets:
288
+ - path: ../fleet-b/herdctl.yaml
289
+ `);
290
+ await createFile(join(tempDir, "fleet-b", "herdctl.yaml"), `
291
+ version: 1
292
+ fleet:
293
+ name: fleet-b
294
+ fleets:
295
+ - path: ../fleet-a/herdctl.yaml
296
+ `);
297
+ try {
298
+ await loadConfig(join(tempDir, "root.yaml"), {
299
+ env: {},
300
+ envFile: false,
301
+ });
302
+ expect.fail("Should have thrown FleetCycleError");
303
+ }
304
+ catch (error) {
305
+ expect(error).toBeInstanceOf(FleetCycleError);
306
+ const cycleError = error;
307
+ expect(cycleError.message).toContain("Fleet composition cycle detected");
308
+ // Path chain should include the cycle
309
+ expect(cycleError.pathChain.length).toBeGreaterThanOrEqual(3);
310
+ }
311
+ });
312
+ });
313
+ describe("fleet name collision", () => {
314
+ it("throws FleetNameCollisionError for same-name sub-fleets at same level", async () => {
315
+ await createFile(join(tempDir, "herdctl.yaml"), `
316
+ version: 1
317
+ fleets:
318
+ - path: ./fleet-a/herdctl.yaml
319
+ - path: ./fleet-b/herdctl.yaml
320
+ `);
321
+ await createFile(join(tempDir, "fleet-a", "herdctl.yaml"), `
322
+ version: 1
323
+ fleet:
324
+ name: duplicate-name
325
+ agents: []
326
+ `);
327
+ await createFile(join(tempDir, "fleet-b", "herdctl.yaml"), `
328
+ version: 1
329
+ fleet:
330
+ name: duplicate-name
331
+ agents: []
332
+ `);
333
+ await expect(loadConfig(tempDir, { env: {}, envFile: false })).rejects.toThrow(FleetNameCollisionError);
334
+ });
335
+ it("collision error message is actionable", async () => {
336
+ await createFile(join(tempDir, "herdctl.yaml"), `
337
+ version: 1
338
+ fleets:
339
+ - path: ./a/herdctl.yaml
340
+ - path: ./b/herdctl.yaml
341
+ `);
342
+ await createFile(join(tempDir, "a", "herdctl.yaml"), `
343
+ version: 1
344
+ fleet:
345
+ name: conflict
346
+ agents: []
347
+ `);
348
+ await createFile(join(tempDir, "b", "herdctl.yaml"), `
349
+ version: 1
350
+ fleet:
351
+ name: conflict
352
+ agents: []
353
+ `);
354
+ try {
355
+ await loadConfig(tempDir, { env: {}, envFile: false });
356
+ expect.fail("Should have thrown FleetNameCollisionError");
357
+ }
358
+ catch (error) {
359
+ expect(error).toBeInstanceOf(FleetNameCollisionError);
360
+ const collisionError = error;
361
+ expect(collisionError.message).toContain("conflict");
362
+ expect(collisionError.message).toContain("disambiguate");
363
+ }
364
+ });
365
+ });
366
+ describe("backward compatibility", () => {
367
+ it("config with no fleets array works exactly as before", async () => {
368
+ await createFile(join(tempDir, "herdctl.yaml"), `
369
+ version: 1
370
+ agents:
371
+ - path: ./agents/worker.yaml
372
+ `);
373
+ await createFile(join(tempDir, "agents", "worker.yaml"), "name: worker");
374
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
375
+ expect(result.agents).toHaveLength(1);
376
+ expect(result.agents[0].name).toBe("worker");
377
+ expect(result.agents[0].fleetPath).toEqual([]);
378
+ expect(result.agents[0].qualifiedName).toBe("worker");
379
+ });
380
+ it("config with empty fleets array works exactly as before", async () => {
381
+ await createFile(join(tempDir, "herdctl.yaml"), `
382
+ version: 1
383
+ fleets: []
384
+ agents:
385
+ - path: ./agents/worker.yaml
386
+ `);
387
+ await createFile(join(tempDir, "agents", "worker.yaml"), "name: worker");
388
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
389
+ expect(result.agents).toHaveLength(1);
390
+ expect(result.agents[0].name).toBe("worker");
391
+ expect(result.agents[0].fleetPath).toEqual([]);
392
+ expect(result.agents[0].qualifiedName).toBe("worker");
393
+ });
394
+ it("config with no agents and no fleets works", async () => {
395
+ await createFile(join(tempDir, "herdctl.yaml"), `
396
+ version: 1
397
+ `);
398
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
399
+ expect(result.agents).toEqual([]);
400
+ });
401
+ });
402
+ describe("defaults merging across levels", () => {
403
+ it("super-fleet defaults fill gaps for sub-fleet agents", async () => {
404
+ await createFile(join(tempDir, "herdctl.yaml"), `
405
+ version: 1
406
+ defaults:
407
+ model: claude-sonnet-4-20250514
408
+ max_turns: 100
409
+ fleets:
410
+ - path: ./sub/herdctl.yaml
411
+ `);
412
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
413
+ version: 1
414
+ fleet:
415
+ name: sub
416
+ agents:
417
+ - path: ./agents/worker.yaml
418
+ `);
419
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
420
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
421
+ // Worker should inherit model and max_turns from super-fleet defaults
422
+ expect(result.agents[0].model).toBe("claude-sonnet-4-20250514");
423
+ expect(result.agents[0].max_turns).toBe(100);
424
+ });
425
+ it("sub-fleet defaults override super-fleet defaults", async () => {
426
+ await createFile(join(tempDir, "herdctl.yaml"), `
427
+ version: 1
428
+ defaults:
429
+ model: claude-sonnet-4-20250514
430
+ max_turns: 100
431
+ fleets:
432
+ - path: ./sub/herdctl.yaml
433
+ `);
434
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
435
+ version: 1
436
+ fleet:
437
+ name: sub
438
+ defaults:
439
+ model: claude-opus-4-20250514
440
+ agents:
441
+ - path: ./agents/worker.yaml
442
+ `);
443
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
444
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
445
+ // Worker gets sub-fleet's model (overrides super-fleet)
446
+ expect(result.agents[0].model).toBe("claude-opus-4-20250514");
447
+ // Worker gets super-fleet's max_turns (gap-fill)
448
+ expect(result.agents[0].max_turns).toBe(100);
449
+ });
450
+ it("agent config overrides both fleet defaults", async () => {
451
+ await createFile(join(tempDir, "herdctl.yaml"), `
452
+ version: 1
453
+ defaults:
454
+ model: claude-sonnet-4-20250514
455
+ max_turns: 100
456
+ fleets:
457
+ - path: ./sub/herdctl.yaml
458
+ `);
459
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
460
+ version: 1
461
+ fleet:
462
+ name: sub
463
+ defaults:
464
+ model: claude-opus-4-20250514
465
+ max_turns: 50
466
+ agents:
467
+ - path: ./agents/worker.yaml
468
+ `);
469
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), `
470
+ name: worker
471
+ model: haiku
472
+ max_turns: 10
473
+ `);
474
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
475
+ // Worker's own config takes precedence
476
+ expect(result.agents[0].model).toBe("haiku");
477
+ expect(result.agents[0].max_turns).toBe(10);
478
+ });
479
+ });
480
+ describe("working directory normalization", () => {
481
+ it("resolves agent working_directory relative to its own config file", async () => {
482
+ await createFile(join(tempDir, "herdctl.yaml"), `
483
+ version: 1
484
+ fleets:
485
+ - path: ./sub/herdctl.yaml
486
+ `);
487
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
488
+ version: 1
489
+ fleet:
490
+ name: sub
491
+ agents:
492
+ - path: ./agents/worker.yaml
493
+ `);
494
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), `
495
+ name: worker
496
+ working_directory: ../workspace
497
+ `);
498
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
499
+ // ../workspace relative to sub/agents/ = sub/workspace
500
+ expect(result.agents[0].working_directory).toBe(join(tempDir, "sub", "workspace"));
501
+ });
502
+ it("defaults working_directory to agent config directory", async () => {
503
+ await createFile(join(tempDir, "herdctl.yaml"), `
504
+ version: 1
505
+ fleets:
506
+ - path: ./sub/herdctl.yaml
507
+ `);
508
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
509
+ version: 1
510
+ fleet:
511
+ name: sub
512
+ agents:
513
+ - path: ./agents/worker.yaml
514
+ `);
515
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
516
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
517
+ expect(result.agents[0].working_directory).toBe(join(tempDir, "sub", "agents"));
518
+ });
519
+ });
520
+ describe("fleet-level overrides", () => {
521
+ it("fleet-level overrides apply to sub-fleet config", async () => {
522
+ await createFile(join(tempDir, "herdctl.yaml"), `
523
+ version: 1
524
+ fleets:
525
+ - path: ./sub/herdctl.yaml
526
+ overrides:
527
+ defaults:
528
+ model: override-model
529
+ `);
530
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
531
+ version: 1
532
+ fleet:
533
+ name: sub
534
+ defaults:
535
+ model: original-model
536
+ agents:
537
+ - path: ./agents/worker.yaml
538
+ `);
539
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), "name: worker");
540
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
541
+ // Override model should be applied (fleet-level override applies to sub-fleet config)
542
+ expect(result.agents[0].model).toBe("override-model");
543
+ });
544
+ });
545
+ describe("deeply nested fleets", () => {
546
+ it("handles three levels of nesting", async () => {
547
+ await createFile(join(tempDir, "herdctl.yaml"), `
548
+ version: 1
549
+ fleets:
550
+ - path: ./level1/herdctl.yaml
551
+ `);
552
+ await createFile(join(tempDir, "level1", "herdctl.yaml"), `
553
+ version: 1
554
+ fleet:
555
+ name: level1
556
+ fleets:
557
+ - path: ./level2/herdctl.yaml
558
+ agents:
559
+ - path: ./agents/l1-agent.yaml
560
+ `);
561
+ await createFile(join(tempDir, "level1", "level2", "herdctl.yaml"), `
562
+ version: 1
563
+ fleet:
564
+ name: level2
565
+ agents:
566
+ - path: ./agents/l2-agent.yaml
567
+ `);
568
+ await createFile(join(tempDir, "level1", "agents", "l1-agent.yaml"), "name: l1-agent");
569
+ await createFile(join(tempDir, "level1", "level2", "agents", "l2-agent.yaml"), "name: l2-agent");
570
+ const result = await loadConfig(tempDir, { env: {}, envFile: false });
571
+ expect(result.agents).toHaveLength(2);
572
+ const l1Agent = result.agents.find((a) => a.name === "l1-agent");
573
+ expect(l1Agent).toBeDefined();
574
+ expect(l1Agent.fleetPath).toEqual(["level1"]);
575
+ expect(l1Agent.qualifiedName).toBe("level1.l1-agent");
576
+ const l2Agent = result.agents.find((a) => a.name === "l2-agent");
577
+ expect(l2Agent).toBeDefined();
578
+ expect(l2Agent.fleetPath).toEqual(["level1", "level2"]);
579
+ expect(l2Agent.qualifiedName).toBe("level1.level2.l2-agent");
580
+ });
581
+ });
582
+ describe("error handling", () => {
583
+ it("throws FleetLoadError when sub-fleet file is missing", async () => {
584
+ await createFile(join(tempDir, "herdctl.yaml"), `
585
+ version: 1
586
+ fleets:
587
+ - path: ./nonexistent/herdctl.yaml
588
+ `);
589
+ await expect(loadConfig(tempDir, { env: {}, envFile: false })).rejects.toThrow(FleetLoadError);
590
+ });
591
+ it("throws FleetLoadError when sub-fleet YAML is invalid", async () => {
592
+ await createFile(join(tempDir, "herdctl.yaml"), `
593
+ version: 1
594
+ fleets:
595
+ - path: ./sub/herdctl.yaml
596
+ `);
597
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), "invalid: yaml: syntax:");
598
+ await expect(loadConfig(tempDir, { env: {}, envFile: false })).rejects.toThrow(FleetLoadError);
599
+ });
600
+ });
601
+ describe("environment interpolation", () => {
602
+ it("interpolates env vars in sub-fleet agent configs", async () => {
603
+ await createFile(join(tempDir, "herdctl.yaml"), `
604
+ version: 1
605
+ fleets:
606
+ - path: ./sub/herdctl.yaml
607
+ `);
608
+ await createFile(join(tempDir, "sub", "herdctl.yaml"), `
609
+ version: 1
610
+ fleet:
611
+ name: sub
612
+ agents:
613
+ - path: ./agents/worker.yaml
614
+ `);
615
+ await createFile(join(tempDir, "sub", "agents", "worker.yaml"), `
616
+ name: worker
617
+ model: \${AGENT_MODEL}
618
+ `);
619
+ const result = await loadConfig(tempDir, {
620
+ env: { AGENT_MODEL: "claude-sonnet-4-20250514" },
621
+ envFile: false,
622
+ });
623
+ expect(result.agents[0].model).toBe("claude-sonnet-4-20250514");
624
+ });
625
+ });
626
+ });
627
+ //# sourceMappingURL=fleet-loading.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-loading.test.js","sourceRoot":"","sources":["../../../src/config/__tests__/fleet-loading.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fleet-naming-and-defaults.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-naming-and-defaults.test.d.ts","sourceRoot":"","sources":["../../../src/config/__tests__/fleet-naming-and-defaults.test.ts"],"names":[],"mappings":""}