@qelos/aidev 0.1.14 → 0.1.16

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 (51) hide show
  1. package/.env.aidev.example +5 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +31 -0
  4. package/aidev.log +698 -0
  5. package/dist/__tests__/ai-runners.test.d.ts +2 -0
  6. package/dist/__tests__/ai-runners.test.d.ts.map +1 -0
  7. package/dist/__tests__/ai-runners.test.js +167 -0
  8. package/dist/__tests__/ai-runners.test.js.map +1 -0
  9. package/dist/__tests__/config.test.d.ts +2 -0
  10. package/dist/__tests__/config.test.d.ts.map +1 -0
  11. package/dist/__tests__/config.test.js +272 -0
  12. package/dist/__tests__/config.test.js.map +1 -0
  13. package/dist/__tests__/init.test.js +17 -0
  14. package/dist/__tests__/init.test.js.map +1 -1
  15. package/dist/__tests__/schedule.test.js +154 -0
  16. package/dist/__tests__/schedule.test.js.map +1 -1
  17. package/dist/ai/claude.d.ts.map +1 -1
  18. package/dist/ai/claude.js +5 -0
  19. package/dist/ai/claude.js.map +1 -1
  20. package/dist/ai/cursor.d.ts.map +1 -1
  21. package/dist/ai/cursor.js +4 -1
  22. package/dist/ai/cursor.js.map +1 -1
  23. package/dist/ai/windsurf.d.ts.map +1 -1
  24. package/dist/ai/windsurf.js +4 -1
  25. package/dist/ai/windsurf.js.map +1 -1
  26. package/dist/cli.js +6 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/commands/init.d.ts +1 -0
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +11 -0
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/run.d.ts.map +1 -1
  33. package/dist/commands/run.js +10 -2
  34. package/dist/commands/run.js.map +1 -1
  35. package/dist/commands/schedule.d.ts +17 -0
  36. package/dist/commands/schedule.d.ts.map +1 -1
  37. package/dist/commands/schedule.js +339 -6
  38. package/dist/commands/schedule.js.map +1 -1
  39. package/dist/config.d.ts +19 -0
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +96 -3
  42. package/dist/config.js.map +1 -1
  43. package/dist/diagnostics.d.ts +14 -0
  44. package/dist/diagnostics.d.ts.map +1 -0
  45. package/dist/diagnostics.js +89 -0
  46. package/dist/diagnostics.js.map +1 -0
  47. package/dist/platform.d.ts +7 -0
  48. package/dist/platform.d.ts.map +1 -1
  49. package/dist/platform.js +36 -0
  50. package/dist/platform.js.map +1 -1
  51. package/package.json +4 -4
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-runners.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-runners.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ai-runners.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const node_test_2 = require("node:test");
9
+ const logger_1 = require("../logger");
10
+ const claude_1 = require("../ai/claude");
11
+ const cursor_1 = require("../ai/cursor");
12
+ const windsurf_1 = require("../ai/windsurf");
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ const childProcess = require('node:child_process');
15
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
16
+ function mockSpawnSync(overrides) {
17
+ return node_test_2.mock.method(childProcess, 'spawnSync', () => ({
18
+ pid: 1,
19
+ output: [],
20
+ stdout: '',
21
+ stderr: '',
22
+ status: 0,
23
+ signal: null,
24
+ error: undefined,
25
+ ...overrides,
26
+ }));
27
+ }
28
+ function spyLogger() {
29
+ return {
30
+ info: node_test_2.mock.method(logger_1.logger, 'info', () => { }),
31
+ warn: node_test_2.mock.method(logger_1.logger, 'warn', () => { }),
32
+ debug: node_test_2.mock.method(logger_1.logger, 'debug', () => { }),
33
+ };
34
+ }
35
+ // ─── ClaudeRunner ─────────────────────────────────────────────────────────────
36
+ (0, node_test_1.describe)('ClaudeRunner – failed tasks', () => {
37
+ (0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
38
+ (0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
39
+ (0, node_test_1.it)('returns success=false when claude exits with non-zero status', async () => {
40
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'something went wrong' });
41
+ spyLogger();
42
+ const runner = new claude_1.ClaudeRunner();
43
+ const result = await runner.run('test prompt');
44
+ strict_1.default.equal(result.success, false);
45
+ strict_1.default.equal(result.error, 'something went wrong');
46
+ });
47
+ (0, node_test_1.it)('logs a warning with exit status on failure', async () => {
48
+ mockSpawnSync({ status: 2, stdout: '', stderr: 'fatal error' });
49
+ const spies = spyLogger();
50
+ const runner = new claude_1.ClaudeRunner();
51
+ await runner.run('test prompt');
52
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
53
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 2')));
54
+ });
55
+ (0, node_test_1.it)('logs stderr on failure', async () => {
56
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'heap out of memory' });
57
+ const spies = spyLogger();
58
+ const runner = new claude_1.ClaudeRunner();
59
+ await runner.run('test prompt');
60
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
61
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('heap out of memory')));
62
+ });
63
+ (0, node_test_1.it)('logs spawn error when present', async () => {
64
+ mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('ENOENT') });
65
+ const spies = spyLogger();
66
+ const runner = new claude_1.ClaudeRunner();
67
+ await runner.run('test prompt');
68
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
69
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('ENOENT')));
70
+ });
71
+ (0, node_test_1.it)('returns empty output on failure', async () => {
72
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
73
+ spyLogger();
74
+ const runner = new claude_1.ClaudeRunner();
75
+ const result = await runner.run('test prompt');
76
+ strict_1.default.equal(result.output, '');
77
+ });
78
+ });
79
+ // ─── CursorRunner ─────────────────────────────────────────────────────────────
80
+ (0, node_test_1.describe)('CursorRunner – failed tasks', () => {
81
+ (0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
82
+ (0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
83
+ (0, node_test_1.it)('returns success=false when cursor exits with non-zero status', async () => {
84
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'cursor failed' });
85
+ spyLogger();
86
+ const runner = new cursor_1.CursorRunner();
87
+ const result = await runner.run('test prompt');
88
+ strict_1.default.equal(result.success, false);
89
+ strict_1.default.equal(result.error, 'cursor failed');
90
+ });
91
+ (0, node_test_1.it)('logs a warning with exit status on failure', async () => {
92
+ mockSpawnSync({ status: 3, stdout: '', stderr: 'timeout' });
93
+ const spies = spyLogger();
94
+ const runner = new cursor_1.CursorRunner();
95
+ await runner.run('test prompt');
96
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
97
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 3')));
98
+ });
99
+ (0, node_test_1.it)('logs stderr on failure', async () => {
100
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'workspace not found' });
101
+ const spies = spyLogger();
102
+ const runner = new cursor_1.CursorRunner();
103
+ await runner.run('test prompt');
104
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
105
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('workspace not found')));
106
+ });
107
+ (0, node_test_1.it)('logs spawn error when present', async () => {
108
+ mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('EACCES') });
109
+ const spies = spyLogger();
110
+ const runner = new cursor_1.CursorRunner();
111
+ await runner.run('test prompt');
112
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
113
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('EACCES')));
114
+ });
115
+ (0, node_test_1.it)('returns empty output on failure', async () => {
116
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
117
+ spyLogger();
118
+ const runner = new cursor_1.CursorRunner();
119
+ const result = await runner.run('test prompt');
120
+ strict_1.default.equal(result.output, '');
121
+ });
122
+ });
123
+ // ─── WindsurfRunner ───────────────────────────────────────────────────────────
124
+ (0, node_test_1.describe)('WindsurfRunner – failed tasks', () => {
125
+ (0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
126
+ (0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
127
+ (0, node_test_1.it)('returns success=false when windsurf exits with non-zero status', async () => {
128
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'windsurf crashed' });
129
+ spyLogger();
130
+ const runner = new windsurf_1.WindsurfRunner();
131
+ const result = await runner.run('test prompt');
132
+ strict_1.default.equal(result.success, false);
133
+ strict_1.default.equal(result.error, 'windsurf crashed');
134
+ });
135
+ (0, node_test_1.it)('logs a warning with exit status on failure', async () => {
136
+ mockSpawnSync({ status: 127, stdout: '', stderr: 'not found' });
137
+ const spies = spyLogger();
138
+ const runner = new windsurf_1.WindsurfRunner();
139
+ await runner.run('test prompt');
140
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
141
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 127')));
142
+ });
143
+ (0, node_test_1.it)('logs stderr on failure', async () => {
144
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'license expired' });
145
+ const spies = spyLogger();
146
+ const runner = new windsurf_1.WindsurfRunner();
147
+ await runner.run('test prompt');
148
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
149
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('license expired')));
150
+ });
151
+ (0, node_test_1.it)('logs spawn error when present', async () => {
152
+ mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('SIGTERM') });
153
+ const spies = spyLogger();
154
+ const runner = new windsurf_1.WindsurfRunner();
155
+ await runner.run('test prompt');
156
+ const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
157
+ strict_1.default.ok(warnCalls.some((msg) => msg?.includes('SIGTERM')));
158
+ });
159
+ (0, node_test_1.it)('returns empty output on failure', async () => {
160
+ mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
161
+ spyLogger();
162
+ const runner = new windsurf_1.WindsurfRunner();
163
+ const result = await runner.run('test prompt');
164
+ strict_1.default.equal(result.output, '');
165
+ });
166
+ });
167
+ //# sourceMappingURL=ai-runners.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-runners.test.js","sourceRoot":"","sources":["../../src/__tests__/ai-runners.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const strict_1 = __importDefault(require("node:assert/strict"));
41
+ const node_child_process_1 = require("node:child_process");
42
+ const fs = __importStar(require("node:fs"));
43
+ const os = __importStar(require("node:os"));
44
+ const path = __importStar(require("node:path"));
45
+ const config_1 = require("../config");
46
+ // ─── mergeNullDelimited ────────────────────────────────────────────────────────
47
+ (0, node_test_1.describe)('mergeNullDelimited', () => {
48
+ (0, node_test_1.beforeEach)(() => {
49
+ delete process.env['__TEST_MERGE_A'];
50
+ delete process.env['__TEST_MERGE_B'];
51
+ delete process.env['__TEST_MERGE_EXISTING'];
52
+ });
53
+ (0, node_test_1.afterEach)(() => {
54
+ delete process.env['__TEST_MERGE_A'];
55
+ delete process.env['__TEST_MERGE_B'];
56
+ delete process.env['__TEST_MERGE_EXISTING'];
57
+ });
58
+ (0, node_test_1.it)('sets new variables from null-delimited env output', () => {
59
+ (0, config_1.mergeNullDelimited)('__TEST_MERGE_A=hello\0__TEST_MERGE_B=world\0');
60
+ strict_1.default.equal(process.env['__TEST_MERGE_A'], 'hello');
61
+ strict_1.default.equal(process.env['__TEST_MERGE_B'], 'world');
62
+ });
63
+ (0, node_test_1.it)('does not overwrite variables already in process.env', () => {
64
+ process.env['__TEST_MERGE_EXISTING'] = 'original';
65
+ (0, config_1.mergeNullDelimited)('__TEST_MERGE_EXISTING=overwritten\0');
66
+ strict_1.default.equal(process.env['__TEST_MERGE_EXISTING'], 'original');
67
+ });
68
+ (0, node_test_1.it)('handles values containing = signs', () => {
69
+ (0, config_1.mergeNullDelimited)('__TEST_MERGE_A=a=b=c\0');
70
+ strict_1.default.equal(process.env['__TEST_MERGE_A'], 'a=b=c');
71
+ });
72
+ (0, node_test_1.it)('skips entries with no = sign', () => {
73
+ (0, config_1.mergeNullDelimited)('NOEQUALS\0__TEST_MERGE_A=ok\0');
74
+ strict_1.default.equal(process.env['__TEST_MERGE_A'], 'ok');
75
+ });
76
+ (0, node_test_1.it)('handles empty string without throwing', () => {
77
+ strict_1.default.doesNotThrow(() => (0, config_1.mergeNullDelimited)(''));
78
+ });
79
+ });
80
+ // ─── sourceShellProfile ────────────────────────────────────────────────────────
81
+ // These tests only run on POSIX (macOS / Linux) since Windows uses PowerShell + registry.
82
+ const itPosix = process.platform === 'win32' ? node_test_1.it.skip : node_test_1.it;
83
+ (0, node_test_1.describe)('sourceShellProfile', () => {
84
+ let tmpDir;
85
+ const testKey = '__AIDEV_PROFILE_TEST';
86
+ const testKey2 = '__AIDEV_PROFILE_TEST2';
87
+ (0, node_test_1.beforeEach)(() => {
88
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aidev-profile-test-'));
89
+ delete process.env[testKey];
90
+ delete process.env[testKey2];
91
+ });
92
+ (0, node_test_1.afterEach)(() => {
93
+ fs.rmSync(tmpDir, { recursive: true, force: true });
94
+ delete process.env[testKey];
95
+ delete process.env[testKey2];
96
+ });
97
+ itPosix('picks up an exported variable from the profile', () => {
98
+ const rc = path.join(tmpDir, '.testrc');
99
+ fs.writeFileSync(rc, `export ${testKey}=from_profile\n`);
100
+ (0, config_1.sourceShellProfile)([rc]);
101
+ strict_1.default.equal(process.env[testKey], 'from_profile');
102
+ });
103
+ itPosix('profile with alias definitions does not break env sourcing', () => {
104
+ // Aliases are shell-internal and won't appear in process.env, but their
105
+ // presence must not prevent exported variables from being captured.
106
+ const rc = path.join(tmpDir, '.testrc');
107
+ fs.writeFileSync(rc, `alias gst='git status'\nexport ${testKey}=alongside_alias\n`);
108
+ (0, config_1.sourceShellProfile)([rc]);
109
+ strict_1.default.equal(process.env[testKey], 'alongside_alias');
110
+ // Aliases are not environment variables — they must not leak into process.env
111
+ strict_1.default.equal(process.env['gst'], undefined);
112
+ });
113
+ itPosix('does not overwrite an already-set variable', () => {
114
+ process.env[testKey] = 'existing';
115
+ const rc = path.join(tmpDir, '.testrc');
116
+ fs.writeFileSync(rc, `export ${testKey}=from_profile\n`);
117
+ (0, config_1.sourceShellProfile)([rc]);
118
+ strict_1.default.equal(process.env[testKey], 'existing');
119
+ });
120
+ itPosix('sources multiple profile files in order', () => {
121
+ const rc1 = path.join(tmpDir, '.rc1');
122
+ const rc2 = path.join(tmpDir, '.rc2');
123
+ fs.writeFileSync(rc1, `export ${testKey}=from_rc1\n`);
124
+ fs.writeFileSync(rc2, `export ${testKey2}=from_rc2\n`);
125
+ (0, config_1.sourceShellProfile)([rc1, rc2]);
126
+ strict_1.default.equal(process.env[testKey], 'from_rc1');
127
+ strict_1.default.equal(process.env[testKey2], 'from_rc2');
128
+ });
129
+ itPosix('silently ignores non-existent profile files', () => {
130
+ const missing = path.join(tmpDir, 'does_not_exist');
131
+ const rc = path.join(tmpDir, '.testrc');
132
+ fs.writeFileSync(rc, `export ${testKey}=still_works\n`);
133
+ strict_1.default.doesNotThrow(() => (0, config_1.sourceShellProfile)([missing, rc]));
134
+ strict_1.default.equal(process.env[testKey], 'still_works');
135
+ });
136
+ itPosix('exported variable propagates to child processes after sourcing', () => {
137
+ const rc = path.join(tmpDir, '.testrc');
138
+ fs.writeFileSync(rc, `export ${testKey}=child_test_value\n`);
139
+ (0, config_1.sourceShellProfile)([rc]);
140
+ strict_1.default.equal(process.env[testKey], 'child_test_value');
141
+ // Simulate how aidev spawns AI runners (claude, cursor, etc.) — they inherit process.env
142
+ const child = (0, node_child_process_1.spawnSync)(process.execPath, // node
143
+ ['-e', `process.stdout.write(process.env['${testKey}'] || 'NOT_FOUND')`], { encoding: 'utf8', env: process.env });
144
+ strict_1.default.equal(child.stdout, 'child_test_value');
145
+ });
146
+ itPosix('variable with special characters in value is captured correctly', () => {
147
+ const rc = path.join(tmpDir, '.testrc');
148
+ fs.writeFileSync(rc, `export ${testKey}="hello=world:path/to/thing"\n`);
149
+ (0, config_1.sourceShellProfile)([rc]);
150
+ strict_1.default.equal(process.env[testKey], 'hello=world:path/to/thing');
151
+ });
152
+ });
153
+ // ─── applyEnvFiles (AIDEV_ENV_EXTEND) ─────────────────────────────────────────
154
+ const EXT_A = '__AIDEV_EXT_A';
155
+ const EXT_B = '__AIDEV_EXT_B';
156
+ const EXT_C = '__AIDEV_EXT_C';
157
+ const EXT_ALL = [EXT_A, EXT_B, EXT_C, 'AIDEV_ENV_EXTEND'];
158
+ (0, node_test_1.describe)('applyEnvFiles', () => {
159
+ let tmpDir;
160
+ (0, node_test_1.beforeEach)(() => {
161
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aidev-envfiles-'));
162
+ EXT_ALL.forEach((k) => delete process.env[k]);
163
+ });
164
+ (0, node_test_1.afterEach)(() => {
165
+ fs.rmSync(tmpDir, { recursive: true, force: true });
166
+ EXT_ALL.forEach((k) => delete process.env[k]);
167
+ });
168
+ (0, node_test_1.it)('loads variables from a local env file', () => {
169
+ const local = path.join(tmpDir, '.env.aidev');
170
+ fs.writeFileSync(local, `${EXT_A}=from_local\n`);
171
+ (0, config_1.applyEnvFiles)(local);
172
+ strict_1.default.equal(process.env[EXT_A], 'from_local');
173
+ });
174
+ (0, node_test_1.it)('loads global extend file values as base', () => {
175
+ const global = path.join(tmpDir, '.aidev.global');
176
+ fs.writeFileSync(global, `${EXT_A}=from_global\n${EXT_B}=global_only\n`);
177
+ const local = path.join(tmpDir, '.env.aidev');
178
+ fs.writeFileSync(local, `${EXT_A}=from_local\n`);
179
+ (0, config_1.applyEnvFiles)(local, global);
180
+ // local wins over global for EXT_A
181
+ strict_1.default.equal(process.env[EXT_A], 'from_local');
182
+ // global-only key is still loaded
183
+ strict_1.default.equal(process.env[EXT_B], 'global_only');
184
+ });
185
+ (0, node_test_1.it)('local .env.aidev AIDEV_ENV_EXTEND entry is used when no explicit path given', () => {
186
+ const global = path.join(tmpDir, '.aidev.global');
187
+ fs.writeFileSync(global, `${EXT_B}=from_global_via_local_ref\n`);
188
+ const local = path.join(tmpDir, '.env.aidev');
189
+ fs.writeFileSync(local, `AIDEV_ENV_EXTEND=${global}\n${EXT_A}=local_val\n`);
190
+ (0, config_1.applyEnvFiles)(local);
191
+ strict_1.default.equal(process.env[EXT_A], 'local_val');
192
+ strict_1.default.equal(process.env[EXT_B], 'from_global_via_local_ref');
193
+ });
194
+ (0, node_test_1.it)('process.env variables override both local and global', () => {
195
+ process.env[EXT_A] = 'shell_value';
196
+ const global = path.join(tmpDir, '.aidev.global');
197
+ fs.writeFileSync(global, `${EXT_A}=global_value\n`);
198
+ const local = path.join(tmpDir, '.env.aidev');
199
+ fs.writeFileSync(local, `${EXT_A}=local_value\n`);
200
+ (0, config_1.applyEnvFiles)(local, global);
201
+ strict_1.default.equal(process.env[EXT_A], 'shell_value');
202
+ });
203
+ (0, node_test_1.it)('explicit envExtend arg overrides AIDEV_ENV_EXTEND entry inside local file', () => {
204
+ const globalA = path.join(tmpDir, 'global_a');
205
+ fs.writeFileSync(globalA, `${EXT_A}=from_global_a\n`);
206
+ const globalB = path.join(tmpDir, 'global_b');
207
+ fs.writeFileSync(globalB, `${EXT_B}=from_global_b\n`);
208
+ const local = path.join(tmpDir, '.env.aidev');
209
+ // local points to globalA via AIDEV_ENV_EXTEND, but caller passes globalB explicitly
210
+ fs.writeFileSync(local, `AIDEV_ENV_EXTEND=${globalA}\n`);
211
+ (0, config_1.applyEnvFiles)(local, globalB);
212
+ // globalB was used (explicit wins)
213
+ strict_1.default.equal(process.env[EXT_B], 'from_global_b');
214
+ // globalA was NOT used
215
+ strict_1.default.equal(process.env[EXT_A], undefined);
216
+ });
217
+ (0, node_test_1.it)('silently skips a missing global file', () => {
218
+ const missing = path.join(tmpDir, 'does_not_exist');
219
+ const local = path.join(tmpDir, '.env.aidev');
220
+ fs.writeFileSync(local, `${EXT_A}=still_works\n`);
221
+ strict_1.default.doesNotThrow(() => (0, config_1.applyEnvFiles)(local, missing));
222
+ strict_1.default.equal(process.env[EXT_A], 'still_works');
223
+ });
224
+ (0, node_test_1.it)('works when no local file exists', () => {
225
+ const global = path.join(tmpDir, '.aidev.global');
226
+ fs.writeFileSync(global, `${EXT_A}=global_only\n`);
227
+ (0, config_1.applyEnvFiles)(undefined, global);
228
+ strict_1.default.equal(process.env[EXT_A], 'global_only');
229
+ });
230
+ (0, node_test_1.it)('vars loaded from global file propagate to child processes', () => {
231
+ const global = path.join(tmpDir, '.aidev.global');
232
+ fs.writeFileSync(global, `${EXT_C}=child_sees_this\n`);
233
+ (0, config_1.applyEnvFiles)(undefined, global);
234
+ strict_1.default.equal(process.env[EXT_C], 'child_sees_this');
235
+ const child = (0, node_child_process_1.spawnSync)(process.execPath, ['-e', `process.stdout.write(process.env['${EXT_C}'] || 'NOT_FOUND')`], { encoding: 'utf8', env: process.env });
236
+ strict_1.default.equal(child.stdout, 'child_sees_this');
237
+ });
238
+ (0, node_test_1.it)('resolves AIDEV_ENV_EXTEND relative path against local file directory', () => {
239
+ // global file sits alongside .env.aidev
240
+ const global = path.join(tmpDir, '.aidev.global');
241
+ fs.writeFileSync(global, `${EXT_B}=relative_global\n`);
242
+ const local = path.join(tmpDir, '.env.aidev');
243
+ // stored as a relative path in the local file
244
+ fs.writeFileSync(local, `AIDEV_ENV_EXTEND=.aidev.global\n${EXT_A}=local_val\n`);
245
+ (0, config_1.applyEnvFiles)(local);
246
+ strict_1.default.equal(process.env[EXT_A], 'local_val');
247
+ strict_1.default.equal(process.env[EXT_B], 'relative_global');
248
+ });
249
+ });
250
+ // ─── resolveEnvPath ────────────────────────────────────────────────────────────
251
+ (0, node_test_1.describe)('resolveEnvPath', () => {
252
+ (0, node_test_1.it)('returns absolute paths unchanged', () => {
253
+ strict_1.default.equal((0, config_1.resolveEnvPath)('/etc/aidev.global', '/any/base'), '/etc/aidev.global');
254
+ });
255
+ (0, node_test_1.it)('expands ~ to the home directory', () => {
256
+ const result = (0, config_1.resolveEnvPath)('~/.aidev.global', '/any/base');
257
+ strict_1.default.equal(result, path.join(os.homedir(), '.aidev.global'));
258
+ });
259
+ (0, node_test_1.it)('expands ~/subdir correctly', () => {
260
+ const result = (0, config_1.resolveEnvPath)('~/conf/aidev.global', '/any/base');
261
+ strict_1.default.equal(result, path.join(os.homedir(), 'conf/aidev.global'));
262
+ });
263
+ (0, node_test_1.it)('resolves relative paths against the supplied base', () => {
264
+ const result = (0, config_1.resolveEnvPath)('.aidev.global', '/projects/myapp');
265
+ strict_1.default.equal(result, '/projects/myapp/.aidev.global');
266
+ });
267
+ (0, node_test_1.it)('resolves ../ relative paths correctly', () => {
268
+ const result = (0, config_1.resolveEnvPath)('../shared/aidev.global', '/projects/myapp');
269
+ strict_1.default.equal(result, '/projects/shared/aidev.global');
270
+ });
271
+ });
272
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -86,6 +86,7 @@ const baseAnswers = {
86
86
  devNotesMode: 'smart',
87
87
  triggerWord: 'aidev-continue',
88
88
  thinkingTag: '',
89
+ aidevEnvExtend: '',
89
90
  };
90
91
  (0, node_test_1.describe)('renderEnv', () => {
91
92
  (0, node_test_1.it)('writes non-empty values', () => {
@@ -116,6 +117,22 @@ const baseAnswers = {
116
117
  const out = (0, init_1.renderEnv)({ ...baseAnswers, githubRepo: '' });
117
118
  strict_1.default.ok(!out.includes('GITHUB_REPO'));
118
119
  });
120
+ (0, node_test_1.it)('omits AIDEV_ENV_EXTEND when empty', () => {
121
+ const out = (0, init_1.renderEnv)({ ...baseAnswers, aidevEnvExtend: '' });
122
+ strict_1.default.ok(!out.includes('AIDEV_ENV_EXTEND'));
123
+ });
124
+ (0, node_test_1.it)('includes AIDEV_ENV_EXTEND at the top when set', () => {
125
+ const out = (0, init_1.renderEnv)({ ...baseAnswers, aidevEnvExtend: '/home/user/.aidev.global' });
126
+ strict_1.default.ok(out.includes('AIDEV_ENV_EXTEND=/home/user/.aidev.global'));
127
+ // must appear before provider config
128
+ const extIdx = out.indexOf('AIDEV_ENV_EXTEND');
129
+ const provIdx = out.indexOf('PROVIDER=');
130
+ strict_1.default.ok(extIdx < provIdx, 'AIDEV_ENV_EXTEND should appear before PROVIDER');
131
+ });
132
+ (0, node_test_1.it)('includes a descriptive comment before AIDEV_ENV_EXTEND when set', () => {
133
+ const out = (0, init_1.renderEnv)({ ...baseAnswers, aidevEnvExtend: '/home/user/.aidev.global' });
134
+ strict_1.default.ok(out.includes('# Global env base'));
135
+ });
119
136
  });
120
137
  // ─── ensureGitignore ─────────────────────────────────────────────────────────
121
138
  function withTmpDir(fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"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"}