@herdctl/core 5.5.0 → 5.7.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 (172) hide show
  1. package/dist/config/__tests__/merge.test.js +1 -1
  2. package/dist/config/__tests__/merge.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 -2
  8. package/dist/config/schema.d.ts.map +1 -1
  9. package/dist/config/schema.js +6 -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 +31 -9
  113. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  114. package/dist/index.d.ts +1 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/runner/message-processor.d.ts.map +1 -1
  119. package/dist/runner/message-processor.js +7 -2
  120. package/dist/runner/message-processor.js.map +1 -1
  121. package/dist/runner/runtime/container-manager.js +1 -1
  122. package/dist/runner/runtime/container-manager.js.map +1 -1
  123. package/dist/scheduler/errors.d.ts +15 -0
  124. package/dist/scheduler/errors.d.ts.map +1 -1
  125. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  126. package/dist/scheduler/schedule-runner.js +6 -5
  127. package/dist/scheduler/schedule-runner.js.map +1 -1
  128. package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
  129. package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
  130. package/dist/state/__tests__/jsonl-parser.test.js +307 -0
  131. package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
  132. package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
  133. package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
  134. package/dist/state/__tests__/session-attribution.test.js +567 -0
  135. package/dist/state/__tests__/session-attribution.test.js.map +1 -0
  136. package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
  137. package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
  138. package/dist/state/__tests__/session-discovery.test.js +941 -0
  139. package/dist/state/__tests__/session-discovery.test.js.map +1 -0
  140. package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
  141. package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
  142. package/dist/state/__tests__/session-metadata.test.js +422 -0
  143. package/dist/state/__tests__/session-metadata.test.js.map +1 -0
  144. package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
  145. package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
  146. package/dist/state/__tests__/tool-parsing.test.js +315 -0
  147. package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
  148. package/dist/state/index.d.ts +5 -0
  149. package/dist/state/index.d.ts.map +1 -1
  150. package/dist/state/index.js +10 -0
  151. package/dist/state/index.js.map +1 -1
  152. package/dist/state/jsonl-parser.d.ts +115 -0
  153. package/dist/state/jsonl-parser.d.ts.map +1 -0
  154. package/dist/state/jsonl-parser.js +437 -0
  155. package/dist/state/jsonl-parser.js.map +1 -0
  156. package/dist/state/session-attribution.d.ts +35 -0
  157. package/dist/state/session-attribution.d.ts.map +1 -0
  158. package/dist/state/session-attribution.js +179 -0
  159. package/dist/state/session-attribution.js.map +1 -0
  160. package/dist/state/session-discovery.d.ts +188 -0
  161. package/dist/state/session-discovery.d.ts.map +1 -0
  162. package/dist/state/session-discovery.js +513 -0
  163. package/dist/state/session-discovery.js.map +1 -0
  164. package/dist/state/session-metadata.d.ts +186 -0
  165. package/dist/state/session-metadata.d.ts.map +1 -0
  166. package/dist/state/session-metadata.js +297 -0
  167. package/dist/state/session-metadata.js.map +1 -0
  168. package/dist/state/tool-parsing.d.ts +88 -0
  169. package/dist/state/tool-parsing.d.ts.map +1 -0
  170. package/dist/state/tool-parsing.js +199 -0
  171. package/dist/state/tool-parsing.js.map +1 -0
  172. package/package.json +1 -1
@@ -0,0 +1,576 @@
1
+ /**
2
+ * Tests for Environment Variable Scanner
3
+ */
4
+ import { describe, expect, it } from "vitest";
5
+ import { scanEnvVariables } from "../env-scanner.js";
6
+ // =============================================================================
7
+ // Basic Extraction Tests
8
+ // =============================================================================
9
+ describe("scanEnvVariables - basic extraction", () => {
10
+ it("should extract simple ${VAR} references", () => {
11
+ const content = `
12
+ name: my-agent
13
+ env:
14
+ webhook: \${DISCORD_WEBHOOK_URL}
15
+ token: \${API_TOKEN}
16
+ `;
17
+ const result = scanEnvVariables(content);
18
+ expect(result.variables).toHaveLength(2);
19
+ expect(result.variables[0]).toEqual({ name: "API_TOKEN" });
20
+ expect(result.variables[1]).toEqual({ name: "DISCORD_WEBHOOK_URL" });
21
+ });
22
+ it("should extract ${VAR:-default} references with defaults", () => {
23
+ const content = `
24
+ name: my-agent
25
+ env:
26
+ host: \${DB_HOST:-localhost}
27
+ port: \${DB_PORT:-5432}
28
+ `;
29
+ const result = scanEnvVariables(content);
30
+ expect(result.variables).toHaveLength(2);
31
+ expect(result.variables[0]).toEqual({ name: "DB_HOST", defaultValue: "localhost" });
32
+ expect(result.variables[1]).toEqual({ name: "DB_PORT", defaultValue: "5432" });
33
+ });
34
+ it("should extract mixed simple and default references", () => {
35
+ const content = `
36
+ name: my-agent
37
+ env:
38
+ required: \${API_KEY}
39
+ optional: \${CACHE_TTL:-3600}
40
+ `;
41
+ const result = scanEnvVariables(content);
42
+ expect(result.variables).toHaveLength(2);
43
+ expect(result.variables[0]).toEqual({ name: "API_KEY" });
44
+ expect(result.variables[1]).toEqual({ name: "CACHE_TTL", defaultValue: "3600" });
45
+ });
46
+ });
47
+ // =============================================================================
48
+ // Deduplication Tests
49
+ // =============================================================================
50
+ describe("scanEnvVariables - deduplication", () => {
51
+ it("should deduplicate variables with same name", () => {
52
+ const content = `
53
+ name: my-agent
54
+ env:
55
+ first: \${API_KEY}
56
+ second: \${API_KEY}
57
+ third: \${API_KEY}
58
+ `;
59
+ const result = scanEnvVariables(content);
60
+ expect(result.variables).toHaveLength(1);
61
+ expect(result.variables[0]).toEqual({ name: "API_KEY" });
62
+ });
63
+ it("should prefer entry with default when same var appears with and without", () => {
64
+ const content = `
65
+ name: my-agent
66
+ # First appearance without default
67
+ env:
68
+ first: \${DATABASE_URL}
69
+ # Second appearance with default
70
+ second: \${DATABASE_URL:-postgres://localhost/db}
71
+ `;
72
+ const result = scanEnvVariables(content);
73
+ expect(result.variables).toHaveLength(1);
74
+ expect(result.variables[0]).toEqual({
75
+ name: "DATABASE_URL",
76
+ defaultValue: "postgres://localhost/db",
77
+ });
78
+ });
79
+ it("should prefer entry with default even when default appears first", () => {
80
+ const content = `
81
+ name: my-agent
82
+ env:
83
+ first: \${API_KEY:-default}
84
+ second: \${API_KEY}
85
+ `;
86
+ const result = scanEnvVariables(content);
87
+ expect(result.variables).toHaveLength(1);
88
+ expect(result.variables[0]).toEqual({ name: "API_KEY", defaultValue: "default" });
89
+ });
90
+ it("should keep first default when same var appears multiple times with different defaults", () => {
91
+ const content = `
92
+ name: my-agent
93
+ env:
94
+ first: \${TIMEOUT:-30}
95
+ second: \${TIMEOUT:-60}
96
+ `;
97
+ const result = scanEnvVariables(content);
98
+ expect(result.variables).toHaveLength(1);
99
+ // Keeps the first default encountered
100
+ expect(result.variables[0]).toEqual({ name: "TIMEOUT", defaultValue: "30" });
101
+ });
102
+ });
103
+ // =============================================================================
104
+ // Sorting Tests
105
+ // =============================================================================
106
+ describe("scanEnvVariables - sorting", () => {
107
+ it("should sort variables alphabetically by name", () => {
108
+ const content = `
109
+ name: my-agent
110
+ env:
111
+ z: \${ZEBRA}
112
+ a: \${APPLE}
113
+ m: \${MANGO}
114
+ `;
115
+ const result = scanEnvVariables(content);
116
+ expect(result.variables).toHaveLength(3);
117
+ expect(result.variables[0].name).toBe("APPLE");
118
+ expect(result.variables[1].name).toBe("MANGO");
119
+ expect(result.variables[2].name).toBe("ZEBRA");
120
+ });
121
+ it("should sort consistently with localeCompare", () => {
122
+ const content = `
123
+ name: my-agent
124
+ env:
125
+ lower: \${abc}
126
+ upper: \${ABC}
127
+ `;
128
+ const result = scanEnvVariables(content);
129
+ // localeCompare sorts case-insensitively by default
130
+ // Just verify both are present and sorted consistently
131
+ expect(result.variables).toHaveLength(2);
132
+ expect(result.variables.map((v) => v.name.toUpperCase())).toEqual(["ABC", "ABC"]);
133
+ // Verify they're sorted (lowercase 'abc' typically comes before 'ABC' in localeCompare)
134
+ expect(result.variables[0].name).toBe("abc");
135
+ expect(result.variables[1].name).toBe("ABC");
136
+ });
137
+ });
138
+ // =============================================================================
139
+ // Partitioning Tests
140
+ // =============================================================================
141
+ describe("scanEnvVariables - partitioning", () => {
142
+ it("should partition into required and optional arrays", () => {
143
+ const content = `
144
+ name: my-agent
145
+ env:
146
+ required1: \${API_KEY}
147
+ optional1: \${HOST:-localhost}
148
+ required2: \${SECRET}
149
+ optional2: \${PORT:-8080}
150
+ `;
151
+ const result = scanEnvVariables(content);
152
+ expect(result.required).toHaveLength(2);
153
+ expect(result.required[0]).toEqual({ name: "API_KEY" });
154
+ expect(result.required[1]).toEqual({ name: "SECRET" });
155
+ expect(result.optional).toHaveLength(2);
156
+ expect(result.optional[0]).toEqual({ name: "HOST", defaultValue: "localhost" });
157
+ expect(result.optional[1]).toEqual({ name: "PORT", defaultValue: "8080" });
158
+ });
159
+ it("should have required and optional that sum to variables", () => {
160
+ const content = `
161
+ name: my-agent
162
+ env:
163
+ a: \${A}
164
+ b: \${B:-default}
165
+ c: \${C}
166
+ d: \${D:-other}
167
+ e: \${E}
168
+ `;
169
+ const result = scanEnvVariables(content);
170
+ expect(result.variables.length).toBe(result.required.length + result.optional.length);
171
+ expect(result.required.length).toBe(3); // A, C, E
172
+ expect(result.optional.length).toBe(2); // B, D
173
+ });
174
+ it("should maintain sorting in required and optional arrays", () => {
175
+ const content = `
176
+ name: my-agent
177
+ env:
178
+ z: \${Z_VAR}
179
+ a: \${A_VAR:-a}
180
+ m: \${M_VAR}
181
+ b: \${B_VAR:-b}
182
+ `;
183
+ const result = scanEnvVariables(content);
184
+ // Required should be sorted
185
+ expect(result.required.map((v) => v.name)).toEqual(["M_VAR", "Z_VAR"]);
186
+ // Optional should be sorted
187
+ expect(result.optional.map((v) => v.name)).toEqual(["A_VAR", "B_VAR"]);
188
+ });
189
+ });
190
+ // =============================================================================
191
+ // Empty and Edge Case Tests
192
+ // =============================================================================
193
+ describe("scanEnvVariables - empty and edge cases", () => {
194
+ it("should handle empty content", () => {
195
+ const result = scanEnvVariables("");
196
+ expect(result.variables).toEqual([]);
197
+ expect(result.required).toEqual([]);
198
+ expect(result.optional).toEqual([]);
199
+ });
200
+ it("should handle content with no variables", () => {
201
+ const content = `
202
+ name: my-agent
203
+ description: A simple agent with no env vars
204
+ `;
205
+ const result = scanEnvVariables(content);
206
+ expect(result.variables).toEqual([]);
207
+ expect(result.required).toEqual([]);
208
+ expect(result.optional).toEqual([]);
209
+ });
210
+ it("should handle null input gracefully", () => {
211
+ const result = scanEnvVariables(null);
212
+ expect(result.variables).toEqual([]);
213
+ expect(result.required).toEqual([]);
214
+ expect(result.optional).toEqual([]);
215
+ });
216
+ it("should handle undefined input gracefully", () => {
217
+ const result = scanEnvVariables(undefined);
218
+ expect(result.variables).toEqual([]);
219
+ expect(result.required).toEqual([]);
220
+ expect(result.optional).toEqual([]);
221
+ });
222
+ });
223
+ // =============================================================================
224
+ // YAML Comments Tests
225
+ // =============================================================================
226
+ describe("scanEnvVariables - YAML comments", () => {
227
+ it("should extract variables from YAML comments", () => {
228
+ const content = `
229
+ name: my-agent
230
+ # Set \${WEBHOOK_URL} to enable notifications
231
+ # Optional: \${DEBUG:-false}
232
+ env:
233
+ key: \${API_KEY}
234
+ `;
235
+ const result = scanEnvVariables(content);
236
+ expect(result.variables).toHaveLength(3);
237
+ expect(result.variables.map((v) => v.name)).toEqual(["API_KEY", "DEBUG", "WEBHOOK_URL"]);
238
+ });
239
+ it("should extract variables from inline comments", () => {
240
+ const content = `
241
+ name: my-agent
242
+ env:
243
+ key: value # Use \${ALTERNATIVE_KEY} for production
244
+ `;
245
+ const result = scanEnvVariables(content);
246
+ expect(result.variables).toHaveLength(1);
247
+ expect(result.variables[0].name).toBe("ALTERNATIVE_KEY");
248
+ });
249
+ });
250
+ // =============================================================================
251
+ // HERDCTL_ Exclusion Tests
252
+ // =============================================================================
253
+ describe("scanEnvVariables - HERDCTL_ exclusion", () => {
254
+ it("should exclude HERDCTL_LOG_LEVEL", () => {
255
+ const content = `
256
+ name: my-agent
257
+ env:
258
+ log: \${HERDCTL_LOG_LEVEL}
259
+ api: \${API_KEY}
260
+ `;
261
+ const result = scanEnvVariables(content);
262
+ expect(result.variables).toHaveLength(1);
263
+ expect(result.variables[0].name).toBe("API_KEY");
264
+ });
265
+ it("should exclude all HERDCTL_ prefixed variables", () => {
266
+ const content = `
267
+ name: my-agent
268
+ env:
269
+ a: \${HERDCTL_CONFIG_DIR}
270
+ b: \${HERDCTL_DEBUG}
271
+ c: \${HERDCTL_TIMEOUT}
272
+ d: \${USER_API_KEY}
273
+ `;
274
+ const result = scanEnvVariables(content);
275
+ expect(result.variables).toHaveLength(1);
276
+ expect(result.variables[0].name).toBe("USER_API_KEY");
277
+ });
278
+ it("should exclude HERDCTL_ variables even with defaults", () => {
279
+ const content = `
280
+ name: my-agent
281
+ env:
282
+ log: \${HERDCTL_LOG_LEVEL:-info}
283
+ debug: \${HERDCTL_DEBUG:-false}
284
+ api: \${API_KEY:-default}
285
+ `;
286
+ const result = scanEnvVariables(content);
287
+ expect(result.variables).toHaveLength(1);
288
+ expect(result.variables[0]).toEqual({ name: "API_KEY", defaultValue: "default" });
289
+ });
290
+ it("should not exclude variables that contain HERDCTL in the middle", () => {
291
+ const content = `
292
+ name: my-agent
293
+ env:
294
+ a: \${MY_HERDCTL_CONFIG}
295
+ b: \${HERDCTL_SECRET}
296
+ `;
297
+ const result = scanEnvVariables(content);
298
+ expect(result.variables).toHaveLength(1);
299
+ expect(result.variables[0].name).toBe("MY_HERDCTL_CONFIG");
300
+ });
301
+ });
302
+ // =============================================================================
303
+ // Complex Default Values Tests
304
+ // =============================================================================
305
+ describe("scanEnvVariables - complex defaults", () => {
306
+ it("should handle cron expression defaults", () => {
307
+ const content = `
308
+ name: my-agent
309
+ schedule: "\${CRON_SCHEDULE:-*/5 * * * *}"
310
+ `;
311
+ const result = scanEnvVariables(content);
312
+ expect(result.variables).toHaveLength(1);
313
+ expect(result.variables[0]).toEqual({
314
+ name: "CRON_SCHEDULE",
315
+ defaultValue: "*/5 * * * *",
316
+ });
317
+ });
318
+ it("should handle URL defaults", () => {
319
+ const content = `
320
+ name: my-agent
321
+ env:
322
+ db: \${DATABASE_URL:-postgres://user:pass@localhost:5432/mydb}
323
+ `;
324
+ const result = scanEnvVariables(content);
325
+ expect(result.variables).toHaveLength(1);
326
+ expect(result.variables[0]).toEqual({
327
+ name: "DATABASE_URL",
328
+ defaultValue: "postgres://user:pass@localhost:5432/mydb",
329
+ });
330
+ });
331
+ it("should handle defaults with spaces", () => {
332
+ const content = `
333
+ name: my-agent
334
+ env:
335
+ msg: \${WELCOME_MESSAGE:-Hello, World!}
336
+ `;
337
+ const result = scanEnvVariables(content);
338
+ expect(result.variables).toHaveLength(1);
339
+ expect(result.variables[0]).toEqual({
340
+ name: "WELCOME_MESSAGE",
341
+ defaultValue: "Hello, World!",
342
+ });
343
+ });
344
+ it("should handle defaults with colons", () => {
345
+ const content = `
346
+ name: my-agent
347
+ env:
348
+ time: \${DEFAULT_TIME:-12:00:00}
349
+ `;
350
+ const result = scanEnvVariables(content);
351
+ expect(result.variables).toHaveLength(1);
352
+ expect(result.variables[0]).toEqual({
353
+ name: "DEFAULT_TIME",
354
+ defaultValue: "12:00:00",
355
+ });
356
+ });
357
+ it("should handle empty default value", () => {
358
+ const content = `
359
+ name: my-agent
360
+ env:
361
+ prefix: \${PREFIX:-}
362
+ `;
363
+ const result = scanEnvVariables(content);
364
+ expect(result.variables).toHaveLength(1);
365
+ expect(result.variables[0]).toEqual({
366
+ name: "PREFIX",
367
+ defaultValue: "",
368
+ });
369
+ expect(result.optional).toHaveLength(1);
370
+ });
371
+ it("should handle numeric defaults", () => {
372
+ const content = `
373
+ name: my-agent
374
+ env:
375
+ port: \${PORT:-8080}
376
+ timeout: \${TIMEOUT:-30.5}
377
+ `;
378
+ const result = scanEnvVariables(content);
379
+ expect(result.variables).toHaveLength(2);
380
+ expect(result.variables[0]).toEqual({ name: "PORT", defaultValue: "8080" });
381
+ expect(result.variables[1]).toEqual({ name: "TIMEOUT", defaultValue: "30.5" });
382
+ });
383
+ });
384
+ // =============================================================================
385
+ // Multiple Variables on One Line Tests
386
+ // =============================================================================
387
+ describe("scanEnvVariables - multiple variables on one line", () => {
388
+ it("should extract multiple variables from a single line", () => {
389
+ const content = `
390
+ name: my-agent
391
+ url: "\${PROTOCOL:-https}://\${HOST}:\${PORT:-443}"
392
+ `;
393
+ const result = scanEnvVariables(content);
394
+ expect(result.variables).toHaveLength(3);
395
+ expect(result.variables[0]).toEqual({ name: "HOST" });
396
+ expect(result.variables[1]).toEqual({ name: "PORT", defaultValue: "443" });
397
+ expect(result.variables[2]).toEqual({ name: "PROTOCOL", defaultValue: "https" });
398
+ });
399
+ it("should handle adjacent variables without separator", () => {
400
+ const content = `
401
+ name: my-agent
402
+ combined: "\${FIRST}\${SECOND}\${THIRD}"
403
+ `;
404
+ const result = scanEnvVariables(content);
405
+ expect(result.variables).toHaveLength(3);
406
+ expect(result.variables.map((v) => v.name)).toEqual(["FIRST", "SECOND", "THIRD"]);
407
+ });
408
+ });
409
+ // =============================================================================
410
+ // Variable Name Format Tests
411
+ // =============================================================================
412
+ describe("scanEnvVariables - variable name formats", () => {
413
+ it("should extract variables starting with underscore", () => {
414
+ const content = `
415
+ name: my-agent
416
+ env:
417
+ a: \${_PRIVATE_VAR}
418
+ b: \${__DOUBLE_UNDERSCORE}
419
+ `;
420
+ const result = scanEnvVariables(content);
421
+ expect(result.variables).toHaveLength(2);
422
+ // localeCompare sorts underscore-prefixed names by their full string
423
+ expect(result.variables.map((v) => v.name)).toEqual(["__DOUBLE_UNDERSCORE", "_PRIVATE_VAR"]);
424
+ });
425
+ it("should extract variables with numbers", () => {
426
+ const content = `
427
+ name: my-agent
428
+ env:
429
+ a: \${API_KEY_V2}
430
+ b: \${REDIS_DB_0}
431
+ `;
432
+ const result = scanEnvVariables(content);
433
+ expect(result.variables).toHaveLength(2);
434
+ expect(result.variables.map((v) => v.name)).toEqual(["API_KEY_V2", "REDIS_DB_0"]);
435
+ });
436
+ it("should not match variables starting with numbers", () => {
437
+ const content = `
438
+ name: my-agent
439
+ env:
440
+ a: \${2FA_SECRET}
441
+ `;
442
+ const result = scanEnvVariables(content);
443
+ // The regex requires starting with letter or underscore
444
+ expect(result.variables).toHaveLength(0);
445
+ });
446
+ it("should handle single-character variable names", () => {
447
+ const content = `
448
+ name: my-agent
449
+ env:
450
+ a: \${A}
451
+ b: \${_}
452
+ `;
453
+ const result = scanEnvVariables(content);
454
+ expect(result.variables).toHaveLength(2);
455
+ // localeCompare sorts underscore before letters
456
+ expect(result.variables.map((v) => v.name)).toEqual(["_", "A"]);
457
+ });
458
+ });
459
+ // =============================================================================
460
+ // Type Tests
461
+ // =============================================================================
462
+ describe("scanEnvVariables - types", () => {
463
+ it("should return correct interface structure for EnvScanResult", () => {
464
+ const content = `
465
+ name: my-agent
466
+ env:
467
+ required: \${REQUIRED_VAR}
468
+ optional: \${OPTIONAL_VAR:-default}
469
+ `;
470
+ const result = scanEnvVariables(content);
471
+ // Verify structure
472
+ expect(result).toHaveProperty("variables");
473
+ expect(result).toHaveProperty("required");
474
+ expect(result).toHaveProperty("optional");
475
+ expect(Array.isArray(result.variables)).toBe(true);
476
+ expect(Array.isArray(result.required)).toBe(true);
477
+ expect(Array.isArray(result.optional)).toBe(true);
478
+ });
479
+ it("should return correct interface structure for EnvVariable", () => {
480
+ const content = `
481
+ name: my-agent
482
+ env:
483
+ a: \${VAR_WITH_DEFAULT:-value}
484
+ b: \${VAR_WITHOUT_DEFAULT}
485
+ `;
486
+ const result = scanEnvVariables(content);
487
+ const withDefault = result.variables[0];
488
+ const withoutDefault = result.variables[1];
489
+ expect(withDefault.name).toBe("VAR_WITH_DEFAULT");
490
+ expect(withDefault.defaultValue).toBe("value");
491
+ expect(withoutDefault.name).toBe("VAR_WITHOUT_DEFAULT");
492
+ expect(withoutDefault.defaultValue).toBeUndefined();
493
+ });
494
+ });
495
+ // =============================================================================
496
+ // Real-World Example Tests
497
+ // =============================================================================
498
+ describe("scanEnvVariables - real-world examples", () => {
499
+ it("should handle a typical agent.yaml file", () => {
500
+ const content = `
501
+ # Website Monitor Agent
502
+ name: website-monitor
503
+ description: Monitors websites and sends alerts
504
+ version: "1.0.0"
505
+
506
+ # Environment configuration
507
+ env:
508
+ # Required - must be set by user
509
+ webhook_url: \${DISCORD_WEBHOOK_URL}
510
+ api_key: \${MONITORING_API_KEY}
511
+
512
+ # Optional with sensible defaults
513
+ check_interval: \${CHECK_INTERVAL:-60}
514
+ timeout: \${REQUEST_TIMEOUT:-30}
515
+ log_level: \${HERDCTL_LOG_LEVEL:-info}
516
+
517
+ # Schedule (uses cron format)
518
+ schedule: "\${CRON_SCHEDULE:-*/5 * * * *}"
519
+
520
+ # Docker configuration
521
+ docker:
522
+ image: website-monitor:latest
523
+ network: bridge
524
+ `;
525
+ const result = scanEnvVariables(content);
526
+ // Should have 5 variables (excludes HERDCTL_LOG_LEVEL)
527
+ expect(result.variables).toHaveLength(5);
528
+ // Check required (no defaults)
529
+ expect(result.required).toHaveLength(2);
530
+ expect(result.required.map((v) => v.name)).toEqual([
531
+ "DISCORD_WEBHOOK_URL",
532
+ "MONITORING_API_KEY",
533
+ ]);
534
+ // Check optional (have defaults)
535
+ expect(result.optional).toHaveLength(3);
536
+ expect(result.optional.map((v) => v.name)).toEqual([
537
+ "CHECK_INTERVAL",
538
+ "CRON_SCHEDULE",
539
+ "REQUEST_TIMEOUT",
540
+ ]);
541
+ });
542
+ it("should handle multiline YAML with complex structure", () => {
543
+ const content = `
544
+ name: data-processor
545
+ version: "2.0.0"
546
+
547
+ secrets:
548
+ - name: database
549
+ value: \${DATABASE_URL}
550
+ - name: cache
551
+ value: \${REDIS_URL:-redis://localhost:6379}
552
+
553
+ config:
554
+ endpoints:
555
+ primary: https://\${API_HOST:-api.example.com}/v1
556
+ fallback: https://\${FALLBACK_HOST}/v1
557
+
558
+ auth:
559
+ token: \${AUTH_TOKEN}
560
+ refresh_interval: \${REFRESH_INTERVAL:-3600}
561
+ `;
562
+ const result = scanEnvVariables(content);
563
+ expect(result.variables).toHaveLength(6);
564
+ expect(result.required.map((v) => v.name)).toEqual([
565
+ "AUTH_TOKEN",
566
+ "DATABASE_URL",
567
+ "FALLBACK_HOST",
568
+ ]);
569
+ expect(result.optional.map((v) => v.name)).toEqual([
570
+ "API_HOST",
571
+ "REDIS_URL",
572
+ "REFRESH_INTERVAL",
573
+ ]);
574
+ });
575
+ });
576
+ //# sourceMappingURL=env-scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-scanner.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/env-scanner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for file installer
3
+ *
4
+ * Uses real file I/O with temporary directories to test installation logic.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=file-installer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-installer.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/file-installer.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}