@fractary/core 0.1.0 → 0.2.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 (50) hide show
  1. package/README.md +183 -30
  2. package/dist/common/config.d.ts +22 -6
  3. package/dist/common/config.d.ts.map +1 -1
  4. package/dist/common/config.js +43 -14
  5. package/dist/common/config.js.map +1 -1
  6. package/dist/common/exec-file-no-throw.d.ts +42 -0
  7. package/dist/common/exec-file-no-throw.d.ts.map +1 -0
  8. package/dist/common/exec-file-no-throw.js +54 -0
  9. package/dist/common/exec-file-no-throw.js.map +1 -0
  10. package/dist/common/types.d.ts +15 -0
  11. package/dist/common/types.d.ts.map +1 -1
  12. package/dist/common/yaml-config.d.ts +198 -0
  13. package/dist/common/yaml-config.d.ts.map +1 -0
  14. package/dist/common/yaml-config.js +300 -0
  15. package/dist/common/yaml-config.js.map +1 -0
  16. package/dist/common/yaml-config.test.d.ts +5 -0
  17. package/dist/common/yaml-config.test.d.ts.map +1 -0
  18. package/dist/common/yaml-config.test.js +551 -0
  19. package/dist/common/yaml-config.test.js.map +1 -0
  20. package/dist/repo/config.d.ts +112 -0
  21. package/dist/repo/config.d.ts.map +1 -0
  22. package/dist/repo/config.js +202 -0
  23. package/dist/repo/config.js.map +1 -0
  24. package/dist/repo/config.test.d.ts +7 -0
  25. package/dist/repo/config.test.d.ts.map +1 -0
  26. package/dist/repo/config.test.js +173 -0
  27. package/dist/repo/config.test.js.map +1 -0
  28. package/dist/repo/manager.d.ts +20 -1
  29. package/dist/repo/manager.d.ts.map +1 -1
  30. package/dist/repo/manager.js +68 -2
  31. package/dist/repo/manager.js.map +1 -1
  32. package/dist/repo/organization.d.ts +46 -0
  33. package/dist/repo/organization.d.ts.map +1 -0
  34. package/dist/repo/organization.js +119 -0
  35. package/dist/repo/organization.js.map +1 -0
  36. package/dist/repo/organization.test.d.ts +7 -0
  37. package/dist/repo/organization.test.d.ts.map +1 -0
  38. package/dist/repo/organization.test.js +241 -0
  39. package/dist/repo/organization.test.js.map +1 -0
  40. package/dist/repo/path-generator.d.ts +53 -0
  41. package/dist/repo/path-generator.d.ts.map +1 -0
  42. package/dist/repo/path-generator.js +126 -0
  43. package/dist/repo/path-generator.js.map +1 -0
  44. package/dist/repo/path-generator.test.d.ts +7 -0
  45. package/dist/repo/path-generator.test.d.ts.map +1 -0
  46. package/dist/repo/path-generator.test.js +278 -0
  47. package/dist/repo/path-generator.test.js.map +1 -0
  48. package/dist/spec/manager.js +1 -1
  49. package/dist/spec/manager.js.map +1 -1
  50. package/package.json +3 -2
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for unified YAML configuration loader
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const os = __importStar(require("os"));
42
+ const yaml_config_1 = require("./yaml-config");
43
+ describe('yaml-config', () => {
44
+ let tempDir;
45
+ let originalCwd;
46
+ let originalEnv;
47
+ beforeEach(() => {
48
+ // Create temp directory for tests
49
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fractary-test-'));
50
+ originalCwd = process.cwd();
51
+ originalEnv = { ...process.env };
52
+ // Clear test environment variables
53
+ delete process.env.TEST_VAR;
54
+ delete process.env.TEST_TOKEN;
55
+ delete process.env.MISSING_VAR;
56
+ });
57
+ afterEach(() => {
58
+ // Restore original state
59
+ process.chdir(originalCwd);
60
+ process.env = originalEnv;
61
+ // Clean up temp directory
62
+ if (fs.existsSync(tempDir)) {
63
+ fs.rmSync(tempDir, { recursive: true, force: true });
64
+ }
65
+ });
66
+ describe('substituteEnvVars', () => {
67
+ it('should substitute environment variables', () => {
68
+ process.env.TEST_VAR = 'test-value';
69
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${TEST_VAR}', false);
70
+ expect(result).toBe('token: test-value');
71
+ });
72
+ it('should substitute multiple environment variables', () => {
73
+ process.env.TEST_VAR = 'value1';
74
+ process.env.TEST_TOKEN = 'value2';
75
+ const result = (0, yaml_config_1.substituteEnvVars)('var: ${TEST_VAR}\ntoken: ${TEST_TOKEN}', false);
76
+ expect(result).toBe('var: value1\ntoken: value2');
77
+ });
78
+ it('should use default value when variable not set', () => {
79
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${MISSING_VAR:-default}', false);
80
+ expect(result).toBe('token: default');
81
+ });
82
+ it('should prefer env var over default', () => {
83
+ process.env.TEST_VAR = 'actual';
84
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${TEST_VAR:-default}', false);
85
+ expect(result).toBe('token: actual');
86
+ });
87
+ it('should keep placeholder when variable not set and no default', () => {
88
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${MISSING_VAR}', false);
89
+ expect(result).toBe('token: ${MISSING_VAR}');
90
+ });
91
+ it('should warn about missing variables when warnMissing is true', () => {
92
+ const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
93
+ (0, yaml_config_1.substituteEnvVars)('token: ${MISSING_VAR}', true);
94
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('MISSING_VAR'));
95
+ consoleSpy.mockRestore();
96
+ });
97
+ it('should not warn when warnMissing is false', () => {
98
+ const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
99
+ (0, yaml_config_1.substituteEnvVars)('token: ${MISSING_VAR}', false);
100
+ expect(consoleSpy).not.toHaveBeenCalled();
101
+ consoleSpy.mockRestore();
102
+ });
103
+ it('should handle complex default values', () => {
104
+ const result = (0, yaml_config_1.substituteEnvVars)('url: ${API_URL:-https://api.example.com}', false);
105
+ expect(result).toBe('url: https://api.example.com');
106
+ });
107
+ it('should handle empty string env var', () => {
108
+ process.env.TEST_VAR = '';
109
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${TEST_VAR}', false);
110
+ expect(result).toBe('token: ');
111
+ });
112
+ it('should not substitute invalid patterns', () => {
113
+ const result = (0, yaml_config_1.substituteEnvVars)('token: $TEST_VAR', false);
114
+ expect(result).toBe('token: $TEST_VAR');
115
+ });
116
+ it('should not substitute lowercase variables', () => {
117
+ process.env.test_var = 'should-not-match';
118
+ const result = (0, yaml_config_1.substituteEnvVars)('token: ${test_var}', false);
119
+ expect(result).toBe('token: ${test_var}');
120
+ });
121
+ });
122
+ describe('findProjectRoot', () => {
123
+ it('should find project root with .fractary directory', () => {
124
+ // Create .fractary directory
125
+ const fractaryDir = path.join(tempDir, '.fractary');
126
+ fs.mkdirSync(fractaryDir, { recursive: true });
127
+ // Create subdirectory
128
+ const subDir = path.join(tempDir, 'sub', 'dir');
129
+ fs.mkdirSync(subDir, { recursive: true });
130
+ const root = (0, yaml_config_1.findProjectRoot)(subDir);
131
+ expect(root).toBe(tempDir);
132
+ });
133
+ it('should find project root with .git directory', () => {
134
+ // Create .git directory
135
+ const gitDir = path.join(tempDir, '.git');
136
+ fs.mkdirSync(gitDir, { recursive: true });
137
+ // Create subdirectory
138
+ const subDir = path.join(tempDir, 'sub', 'dir');
139
+ fs.mkdirSync(subDir, { recursive: true });
140
+ const root = (0, yaml_config_1.findProjectRoot)(subDir);
141
+ expect(root).toBe(tempDir);
142
+ });
143
+ it('should return start directory if no marker found', () => {
144
+ const subDir = path.join(tempDir, 'sub', 'dir');
145
+ fs.mkdirSync(subDir, { recursive: true });
146
+ const root = (0, yaml_config_1.findProjectRoot)(subDir);
147
+ expect(root).toBe(subDir);
148
+ });
149
+ it('should use current directory if no startDir provided', () => {
150
+ const fractaryDir = path.join(tempDir, '.fractary');
151
+ fs.mkdirSync(fractaryDir, { recursive: true });
152
+ process.chdir(tempDir);
153
+ const root = (0, yaml_config_1.findProjectRoot)();
154
+ expect(root).toBe(tempDir);
155
+ });
156
+ it('should prefer .fractary over .git', () => {
157
+ // Create both markers
158
+ fs.mkdirSync(path.join(tempDir, '.fractary'), { recursive: true });
159
+ fs.mkdirSync(path.join(tempDir, '.git'), { recursive: true });
160
+ const subDir = path.join(tempDir, 'sub');
161
+ fs.mkdirSync(subDir, { recursive: true });
162
+ const root = (0, yaml_config_1.findProjectRoot)(subDir);
163
+ expect(root).toBe(tempDir);
164
+ });
165
+ });
166
+ describe('configExists', () => {
167
+ it('should return true when config exists', () => {
168
+ const coreDir = path.join(tempDir, '.fractary', 'core');
169
+ fs.mkdirSync(coreDir, { recursive: true });
170
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'version: "2.0"');
171
+ const exists = (0, yaml_config_1.configExists)(tempDir);
172
+ expect(exists).toBe(true);
173
+ });
174
+ it('should return false when config does not exist', () => {
175
+ const exists = (0, yaml_config_1.configExists)(tempDir);
176
+ expect(exists).toBe(false);
177
+ });
178
+ it('should auto-detect project root when not provided', () => {
179
+ const coreDir = path.join(tempDir, '.fractary', 'core');
180
+ fs.mkdirSync(coreDir, { recursive: true });
181
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'version: "2.0"');
182
+ process.chdir(tempDir);
183
+ const exists = (0, yaml_config_1.configExists)();
184
+ expect(exists).toBe(true);
185
+ });
186
+ });
187
+ describe('getConfigPath', () => {
188
+ it('should return config path for given project root', () => {
189
+ const configPath = (0, yaml_config_1.getConfigPath)(tempDir);
190
+ expect(configPath).toBe(path.join(tempDir, '.fractary', 'core', 'config.yaml'));
191
+ });
192
+ it('should auto-detect project root when not provided', () => {
193
+ fs.mkdirSync(path.join(tempDir, '.fractary'), { recursive: true });
194
+ process.chdir(tempDir);
195
+ const configPath = (0, yaml_config_1.getConfigPath)();
196
+ expect(configPath).toBe(path.join(tempDir, '.fractary', 'core', 'config.yaml'));
197
+ });
198
+ });
199
+ describe('getCoreDir', () => {
200
+ it('should return core directory path', () => {
201
+ const coreDir = (0, yaml_config_1.getCoreDir)(tempDir);
202
+ expect(coreDir).toBe(path.join(tempDir, '.fractary', 'core'));
203
+ });
204
+ it('should auto-detect project root when not provided', () => {
205
+ fs.mkdirSync(path.join(tempDir, '.fractary'), { recursive: true });
206
+ process.chdir(tempDir);
207
+ const coreDir = (0, yaml_config_1.getCoreDir)();
208
+ expect(coreDir).toBe(path.join(tempDir, '.fractary', 'core'));
209
+ });
210
+ });
211
+ describe('loadYamlConfig', () => {
212
+ it('should load valid YAML config', () => {
213
+ const coreDir = path.join(tempDir, '.fractary', 'core');
214
+ fs.mkdirSync(coreDir, { recursive: true });
215
+ const configContent = `
216
+ version: "2.0"
217
+ work:
218
+ active_handler: github
219
+ handlers:
220
+ github:
221
+ owner: test
222
+ repo: test
223
+ token: test-token
224
+ `;
225
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), configContent);
226
+ const config = (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
227
+ expect(config).not.toBeNull();
228
+ expect(config?.version).toBe('2.0');
229
+ expect(config?.work?.active_handler).toBe('github');
230
+ });
231
+ it('should substitute environment variables', () => {
232
+ process.env.TEST_TOKEN = 'secret-token';
233
+ const coreDir = path.join(tempDir, '.fractary', 'core');
234
+ fs.mkdirSync(coreDir, { recursive: true });
235
+ const configContent = `
236
+ version: "2.0"
237
+ work:
238
+ active_handler: github
239
+ handlers:
240
+ github:
241
+ token: \${TEST_TOKEN}
242
+ `;
243
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), configContent);
244
+ const config = (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
245
+ expect(config?.work?.handlers?.github?.token).toBe('secret-token');
246
+ });
247
+ it('should return null when config does not exist', () => {
248
+ const config = (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
249
+ expect(config).toBeNull();
250
+ });
251
+ it('should throw when config missing and throwIfMissing is true', () => {
252
+ expect(() => {
253
+ (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir, throwIfMissing: true });
254
+ }).toThrow('Configuration file not found');
255
+ });
256
+ it('should throw on invalid YAML', () => {
257
+ const coreDir = path.join(tempDir, '.fractary', 'core');
258
+ fs.mkdirSync(coreDir, { recursive: true });
259
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'invalid: yaml: syntax:');
260
+ expect(() => {
261
+ (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
262
+ }).toThrow('Failed to load config');
263
+ });
264
+ it('should throw when config is not an object', () => {
265
+ const coreDir = path.join(tempDir, '.fractary', 'core');
266
+ fs.mkdirSync(coreDir, { recursive: true });
267
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'just a string');
268
+ expect(() => {
269
+ (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
270
+ }).toThrow('Invalid configuration: must be a YAML object');
271
+ });
272
+ it('should warn when version field is missing', () => {
273
+ const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
274
+ const coreDir = path.join(tempDir, '.fractary', 'core');
275
+ fs.mkdirSync(coreDir, { recursive: true });
276
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'work: {}');
277
+ (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
278
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('missing version field'));
279
+ consoleSpy.mockRestore();
280
+ });
281
+ it('should auto-detect project root when not provided', () => {
282
+ const coreDir = path.join(tempDir, '.fractary', 'core');
283
+ fs.mkdirSync(coreDir, { recursive: true });
284
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), 'version: "2.0"');
285
+ process.chdir(tempDir);
286
+ const config = (0, yaml_config_1.loadYamlConfig)();
287
+ expect(config).not.toBeNull();
288
+ expect(config?.version).toBe('2.0');
289
+ });
290
+ it('should handle complex config structure', () => {
291
+ const coreDir = path.join(tempDir, '.fractary', 'core');
292
+ fs.mkdirSync(coreDir, { recursive: true });
293
+ const configContent = `
294
+ version: "2.0"
295
+ work:
296
+ active_handler: github
297
+ handlers:
298
+ github:
299
+ owner: myorg
300
+ repo: myrepo
301
+ classification:
302
+ feature: [feature, enhancement]
303
+ bug: [bug, fix]
304
+ defaults:
305
+ auto_assign: false
306
+ repo:
307
+ active_handler: github
308
+ handlers:
309
+ github:
310
+ token: test
311
+ defaults:
312
+ default_branch: main
313
+ logs:
314
+ schema_version: "2.0"
315
+ storage:
316
+ local_path: /logs
317
+ file:
318
+ schema_version: "1.0"
319
+ active_handler: local
320
+ spec:
321
+ schema_version: "1.0"
322
+ storage:
323
+ local_path: /specs
324
+ docs:
325
+ schema_version: "1.1"
326
+ doc_types:
327
+ adr:
328
+ enabled: true
329
+ `;
330
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), configContent);
331
+ const config = (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
332
+ expect(config).not.toBeNull();
333
+ expect(config?.work?.active_handler).toBe('github');
334
+ expect(config?.repo?.active_handler).toBe('github');
335
+ expect(config?.logs?.schema_version).toBe('2.0');
336
+ expect(config?.file?.schema_version).toBe('1.0');
337
+ expect(config?.spec?.schema_version).toBe('1.0');
338
+ expect(config?.docs?.schema_version).toBe('1.1');
339
+ });
340
+ });
341
+ describe('writeYamlConfig', () => {
342
+ it('should write config to file', () => {
343
+ const config = {
344
+ version: '2.0',
345
+ work: {
346
+ active_handler: 'github',
347
+ handlers: {
348
+ github: {
349
+ owner: 'test',
350
+ repo: 'test',
351
+ token: '${GITHUB_TOKEN}',
352
+ },
353
+ },
354
+ },
355
+ };
356
+ (0, yaml_config_1.writeYamlConfig)(config, tempDir);
357
+ const configPath = path.join(tempDir, '.fractary', 'core', 'config.yaml');
358
+ expect(fs.existsSync(configPath)).toBe(true);
359
+ const content = fs.readFileSync(configPath, 'utf-8');
360
+ expect(content).toContain('version: "2.0"');
361
+ expect(content).toContain('active_handler: github');
362
+ });
363
+ it('should create directory if it does not exist', () => {
364
+ const config = {
365
+ version: '2.0',
366
+ };
367
+ (0, yaml_config_1.writeYamlConfig)(config, tempDir);
368
+ const coreDir = path.join(tempDir, '.fractary', 'core');
369
+ expect(fs.existsSync(coreDir)).toBe(true);
370
+ });
371
+ it('should preserve environment variable placeholders', () => {
372
+ const config = {
373
+ version: '2.0',
374
+ work: {
375
+ active_handler: 'github',
376
+ handlers: {
377
+ github: {
378
+ token: '${GITHUB_TOKEN}',
379
+ },
380
+ },
381
+ },
382
+ };
383
+ (0, yaml_config_1.writeYamlConfig)(config, tempDir);
384
+ const configPath = path.join(tempDir, '.fractary', 'core', 'config.yaml');
385
+ const content = fs.readFileSync(configPath, 'utf-8');
386
+ expect(content).toContain('${GITHUB_TOKEN}');
387
+ });
388
+ it('should auto-detect project root when not provided', () => {
389
+ fs.mkdirSync(path.join(tempDir, '.fractary'), { recursive: true });
390
+ process.chdir(tempDir);
391
+ const config = {
392
+ version: '2.0',
393
+ };
394
+ (0, yaml_config_1.writeYamlConfig)(config);
395
+ const configPath = path.join(tempDir, '.fractary', 'core', 'config.yaml');
396
+ expect(fs.existsSync(configPath)).toBe(true);
397
+ });
398
+ });
399
+ describe('validateEnvVars', () => {
400
+ it('should return empty array when all vars are set', () => {
401
+ process.env.TEST_TOKEN = 'value';
402
+ const config = {
403
+ version: '2.0',
404
+ work: {
405
+ active_handler: 'github',
406
+ handlers: {
407
+ github: {
408
+ token: '${TEST_TOKEN}',
409
+ },
410
+ },
411
+ },
412
+ };
413
+ const missing = (0, yaml_config_1.validateEnvVars)(config);
414
+ expect(missing).toEqual([]);
415
+ });
416
+ it('should return missing variable names', () => {
417
+ const config = {
418
+ version: '2.0',
419
+ work: {
420
+ active_handler: 'github',
421
+ handlers: {
422
+ github: {
423
+ token: '${MISSING_TOKEN}',
424
+ },
425
+ },
426
+ },
427
+ };
428
+ const missing = (0, yaml_config_1.validateEnvVars)(config);
429
+ expect(missing).toContain('MISSING_TOKEN');
430
+ });
431
+ it('should not report vars with defaults', () => {
432
+ const config = {
433
+ version: '2.0',
434
+ work: {
435
+ active_handler: 'github',
436
+ handlers: {
437
+ github: {
438
+ api_url: '${API_URL:-https://api.github.com}',
439
+ },
440
+ },
441
+ },
442
+ };
443
+ const missing = (0, yaml_config_1.validateEnvVars)(config);
444
+ expect(missing).toEqual([]);
445
+ });
446
+ it('should return unique variable names', () => {
447
+ const config = {
448
+ version: '2.0',
449
+ work: {
450
+ active_handler: 'github',
451
+ handlers: {
452
+ github: {
453
+ token: '${MISSING_TOKEN}',
454
+ },
455
+ },
456
+ },
457
+ repo: {
458
+ active_handler: 'github',
459
+ handlers: {
460
+ github: {
461
+ token: '${MISSING_TOKEN}',
462
+ },
463
+ },
464
+ },
465
+ };
466
+ const missing = (0, yaml_config_1.validateEnvVars)(config);
467
+ expect(missing).toEqual(['MISSING_TOKEN']);
468
+ });
469
+ it('should handle multiple missing variables', () => {
470
+ const config = {
471
+ version: '2.0',
472
+ work: {
473
+ active_handler: 'github',
474
+ handlers: {
475
+ github: {
476
+ token: '${GITHUB_TOKEN}',
477
+ },
478
+ },
479
+ },
480
+ repo: {
481
+ active_handler: 'gitlab',
482
+ handlers: {
483
+ gitlab: {
484
+ token: '${GITLAB_TOKEN}',
485
+ },
486
+ },
487
+ },
488
+ };
489
+ const missing = (0, yaml_config_1.validateEnvVars)(config);
490
+ expect(missing).toContain('GITHUB_TOKEN');
491
+ expect(missing).toContain('GITLAB_TOKEN');
492
+ });
493
+ });
494
+ describe('Security Tests', () => {
495
+ it('should prevent YAML code injection attacks', () => {
496
+ const coreDir = path.join(tempDir, '.fractary', 'core');
497
+ fs.mkdirSync(coreDir, { recursive: true });
498
+ // Test that malicious YAML tags are rejected by yaml.safeLoad()
499
+ // This YAML string contains a Python object tag that would execute code with yaml.load()
500
+ // but should be safely rejected by yaml.safeLoad()
501
+ const maliciousYaml = `
502
+ version: "2.0"
503
+ malicious: !!python/object/new:type
504
+ args: ["z", !!python/tuple [], {"extend": !!python/name:exec }]
505
+ listitems: "print('code executed')"
506
+ `;
507
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), maliciousYaml);
508
+ // Should fail to parse safely, not execute code
509
+ expect(() => {
510
+ (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
511
+ }).toThrow();
512
+ });
513
+ it('should safely handle path traversal attempts', () => {
514
+ // Attempt path traversal in findProjectRoot
515
+ const maliciousPath = path.join(tempDir, '..', '..', '..', 'etc');
516
+ const result = (0, yaml_config_1.findProjectRoot)(maliciousPath);
517
+ // Should handle gracefully without traversing outside intended directories
518
+ expect(result).toBeDefined();
519
+ expect(typeof result).toBe('string');
520
+ });
521
+ it('should not execute shell commands in environment variable values', () => {
522
+ // Set env var with shell command syntax
523
+ process.env.MALICIOUS_VAR = '$(echo "malicious command")';
524
+ const result = (0, yaml_config_1.substituteEnvVars)('cmd: ${MALICIOUS_VAR}', false);
525
+ // Should substitute literally as string, not execute
526
+ expect(result).toBe('cmd: $(echo "malicious command")');
527
+ // Verify it's treated as plain string
528
+ const coreDir = path.join(tempDir, '.fractary', 'core');
529
+ fs.mkdirSync(coreDir, { recursive: true });
530
+ const configContent = `
531
+ version: "2.0"
532
+ test: \${MALICIOUS_VAR}
533
+ `;
534
+ fs.writeFileSync(path.join(coreDir, 'config.yaml'), configContent);
535
+ const config = (0, yaml_config_1.loadYamlConfig)({ projectRoot: tempDir });
536
+ // Value should be literal string, not executed
537
+ expect(config?.test).toBe('$(echo "malicious command")');
538
+ });
539
+ it('should handle special characters in default values', () => {
540
+ const result = (0, yaml_config_1.substituteEnvVars)('value: ${MISSING:-https://example.com?param=1&other=2}', false);
541
+ expect(result).toBe('value: https://example.com?param=1&other=2');
542
+ });
543
+ it('should not allow regex injection in variable names', () => {
544
+ process.env['.*'] = 'should-not-match';
545
+ const result = (0, yaml_config_1.substituteEnvVars)('value: ${SAFE_VAR}', false);
546
+ // Should keep placeholder, not match regex pattern
547
+ expect(result).toBe('value: ${SAFE_VAR}');
548
+ });
549
+ });
550
+ });
551
+ //# sourceMappingURL=yaml-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-config.test.js","sourceRoot":"","sources":["../../src/common/yaml-config.test.ts"],"names":[],"mappings":"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"}