daedalus-cli 0.5.22 → 0.5.24

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.
@@ -0,0 +1,201 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { patchFile, writeFile } from './files.js';
6
+ function makeTmpDir() {
7
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'daedalus-test-'));
8
+ }
9
+ function makeContext(projectRoot, withReadCache = false) {
10
+ return {
11
+ projectRoot,
12
+ autoApplyEdits: 'all',
13
+ patchHistory: [],
14
+ sessionReadCache: withReadCache ? new Map() : undefined,
15
+ patchFailureStreak: withReadCache ? new Map() : undefined,
16
+ };
17
+ }
18
+ function makeContextWithRead(projectRoot, readFiles) {
19
+ const cache = new Map();
20
+ for (const f of readFiles) {
21
+ if (fs.existsSync(f))
22
+ cache.set(f, fs.statSync(f).mtimeMs);
23
+ }
24
+ return {
25
+ projectRoot,
26
+ autoApplyEdits: 'all',
27
+ patchHistory: [],
28
+ sessionReadCache: cache,
29
+ patchFailureStreak: new Map(),
30
+ };
31
+ }
32
+ describe('patchFile — fuzzy whitespace matching', () => {
33
+ let tmpDir;
34
+ beforeEach(() => { tmpDir = makeTmpDir(); });
35
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
36
+ it('applies patch when indentation differs by extra spaces', async () => {
37
+ const file = path.join(tmpDir, 'test.js');
38
+ fs.writeFileSync(file, 'function foo() {\n return 1;\n}\n');
39
+ const ctx = makeContext(tmpDir);
40
+ const result = await patchFile({ path: file, old_string: 'function foo() {\n return 1;\n}', new_string: 'function foo() {\n return 2;\n}' }, ctx);
41
+ expect(result.success).toBe(true);
42
+ expect(fs.readFileSync(file, 'utf8')).toContain('return 2');
43
+ });
44
+ it('rejects ambiguous fuzzy match with multiple candidates', async () => {
45
+ const file = path.join(tmpDir, 'test.js');
46
+ fs.writeFileSync(file, 'const a = 1;\nconst b = 1;\n');
47
+ const ctx = makeContext(tmpDir);
48
+ const result = await patchFile({ path: file, old_string: 'const x = 1;', new_string: 'const x = 2;' }, ctx);
49
+ expect(result.success).toBe(false);
50
+ });
51
+ });
52
+ describe('patchFile — context-aware hint on failure', () => {
53
+ let tmpDir;
54
+ beforeEach(() => { tmpDir = makeTmpDir(); });
55
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
56
+ it('returns a closest-match hint when old_string is close but not exact', async () => {
57
+ const file = path.join(tmpDir, 'hint.js');
58
+ fs.writeFileSync(file, 'function greet(name) {\n return "Hello " + name;\n}\n');
59
+ const ctx = makeContext(tmpDir);
60
+ const result = await patchFile({ path: file, old_string: 'function greet(user) {\n return "Hello " + user;\n}', new_string: 'function greet(name) {\n return `Hello ${name}`;\n}' }, ctx);
61
+ expect(result.success).toBe(false);
62
+ expect(result.error).toMatch(/Closest match found at line/);
63
+ expect(result.error).toMatch(/greet/);
64
+ });
65
+ it('returns no-close-match message when old_string is completely unrelated', async () => {
66
+ const file = path.join(tmpDir, 'nohint.js');
67
+ fs.writeFileSync(file, 'const x = 42;\n');
68
+ const ctx = makeContext(tmpDir);
69
+ const result = await patchFile({ path: file, old_string: 'zzz_completely_unrelated_zzz', new_string: '' }, ctx);
70
+ expect(result.success).toBe(false);
71
+ expect(result.error).toMatch(/No close match found/);
72
+ });
73
+ });
74
+ describe('writeFile — syntax validation', () => {
75
+ let tmpDir;
76
+ beforeEach(() => { tmpDir = makeTmpDir(); });
77
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
78
+ it('rejects and reverts a JS file with a syntax error', async () => {
79
+ const file = path.join(tmpDir, 'broken.js');
80
+ const original = 'const x = 1;\n';
81
+ fs.writeFileSync(file, original);
82
+ const ctx = makeContext(tmpDir);
83
+ const result = await writeFile({ path: file, content: 'const x = {\n // missing closing brace\n' }, ctx);
84
+ expect(result.success).toBe(false);
85
+ expect(result.error).toMatch(/Syntax error/);
86
+ expect(fs.readFileSync(file, 'utf8')).toBe(original);
87
+ });
88
+ it('accepts a valid JS file', async () => {
89
+ const file = path.join(tmpDir, 'valid.js');
90
+ const ctx = makeContext(tmpDir);
91
+ const result = await writeFile({ path: file, content: 'const x = 1;\nexport { x };\n' }, ctx);
92
+ expect(result.success).toBe(true);
93
+ expect(fs.existsSync(file)).toBe(true);
94
+ });
95
+ it('rejects and removes a new JSON file with invalid content', async () => {
96
+ const file = path.join(tmpDir, 'bad.json');
97
+ const ctx = makeContext(tmpDir);
98
+ const result = await writeFile({ path: file, content: '{ "key": "value", }' }, ctx);
99
+ expect(result.success).toBe(false);
100
+ expect(result.error).toMatch(/JSON syntax error/);
101
+ expect(fs.existsSync(file)).toBe(false);
102
+ });
103
+ it('accepts valid JSON', async () => {
104
+ const file = path.join(tmpDir, 'good.json');
105
+ const ctx = makeContext(tmpDir);
106
+ const result = await writeFile({ path: file, content: '{ "key": "value" }' }, ctx);
107
+ expect(result.success).toBe(true);
108
+ });
109
+ });
110
+ describe('patchFile — write-without-read guardrail', () => {
111
+ let tmpDir;
112
+ beforeEach(() => { tmpDir = makeTmpDir(); });
113
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
114
+ it('blocks patch if file not read this session', async () => {
115
+ const file = path.join(tmpDir, 'guard.js');
116
+ fs.writeFileSync(file, 'const x = 1;\n');
117
+ const ctx = makeContext(tmpDir, true);
118
+ const result = await patchFile({ path: file, old_string: 'const x = 1;', new_string: 'const x = 2;' }, ctx);
119
+ expect(result.success).toBe(false);
120
+ expect(result.error).toMatch(/READ REQUIRED/);
121
+ });
122
+ it('allows patch if file was read first', async () => {
123
+ const file = path.join(tmpDir, 'guard2.js');
124
+ fs.writeFileSync(file, 'const x = 1;\n');
125
+ const ctx = makeContextWithRead(tmpDir, [file]);
126
+ const result = await patchFile({ path: file, old_string: 'const x = 1;', new_string: 'const x = 2;' }, ctx);
127
+ expect(result.success).toBe(true);
128
+ });
129
+ it('blocks write_file on existing file not read this session', async () => {
130
+ const file = path.join(tmpDir, 'guard3.js');
131
+ fs.writeFileSync(file, 'const x = 1;\n');
132
+ const ctx = makeContext(tmpDir, true);
133
+ const result = await writeFile({ path: file, content: 'const x = 2;\n' }, ctx);
134
+ expect(result.success).toBe(false);
135
+ expect(result.error).toMatch(/READ REQUIRED/);
136
+ });
137
+ });
138
+ describe('patchFile — circuit breaker', () => {
139
+ let tmpDir;
140
+ beforeEach(() => { tmpDir = makeTmpDir(); });
141
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
142
+ it('blocks after 2 consecutive failures', async () => {
143
+ const file = path.join(tmpDir, 'cb.js');
144
+ fs.writeFileSync(file, 'const x = 1;\n');
145
+ const ctx = makeContextWithRead(tmpDir, [file]);
146
+ await patchFile({ path: file, old_string: 'MISSING_STRING_1', new_string: '' }, ctx);
147
+ await patchFile({ path: file, old_string: 'MISSING_STRING_2', new_string: '' }, ctx);
148
+ const result = await patchFile({ path: file, old_string: 'MISSING_STRING_3', new_string: '' }, ctx);
149
+ expect(result.success).toBe(false);
150
+ expect(result.error).toMatch(/CIRCUIT BREAKER/);
151
+ });
152
+ it('resets streak after a successful patch', async () => {
153
+ const file = path.join(tmpDir, 'cb2.js');
154
+ fs.writeFileSync(file, 'const x = 1;\n');
155
+ const ctx = makeContextWithRead(tmpDir, [file]);
156
+ await patchFile({ path: file, old_string: 'MISSING', new_string: '' }, ctx);
157
+ const ok = await patchFile({ path: file, old_string: 'const x = 1;', new_string: 'const x = 99;' }, ctx);
158
+ expect(ok.success).toBe(true);
159
+ const result = await patchFile({ path: file, old_string: 'MISSING_AGAIN', new_string: '' }, ctx);
160
+ expect(result.error).not.toMatch(/CIRCUIT BREAKER/);
161
+ });
162
+ });
163
+ describe('writeFile — import existence validation', () => {
164
+ let tmpDir;
165
+ beforeEach(() => { tmpDir = makeTmpDir(); });
166
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
167
+ it('warns about a hallucinated local import', async () => {
168
+ const file = path.join(tmpDir, 'importer.js');
169
+ const ctx = makeContext(tmpDir);
170
+ const result = await writeFile({ path: file, content: "import { foo } from './nonexistent-module.js';\nexport { foo };\n" }, ctx);
171
+ expect(result.success).toBe(true);
172
+ expect(result.content).toMatch(/Local import not found/);
173
+ });
174
+ it('does not warn for valid local imports', async () => {
175
+ const dep = path.join(tmpDir, 'real.js');
176
+ fs.writeFileSync(dep, 'export const bar = 1;\n');
177
+ const file = path.join(tmpDir, 'importer2.js');
178
+ const ctx = makeContext(tmpDir);
179
+ const result = await writeFile({ path: file, content: "import { bar } from './real.js';\nexport { bar };\n" }, ctx);
180
+ expect(result.content).not.toMatch(/Local import not found/);
181
+ });
182
+ });
183
+ describe('writeFile — export consistency check', () => {
184
+ let tmpDir;
185
+ beforeEach(() => { tmpDir = makeTmpDir(); });
186
+ afterEach(() => { fs.rmSync(tmpDir, { recursive: true, force: true }); });
187
+ it('warns when exporting a name not defined in the file', async () => {
188
+ const file = path.join(tmpDir, 'exports.js');
189
+ const ctx = makeContext(tmpDir);
190
+ const result = await writeFile({ path: file, content: 'const x = 1;\nexport { x, ghostFunction };\n' }, ctx);
191
+ expect(result.success).toBe(true);
192
+ expect(result.content).toMatch(/ghostFunction.*is not defined/);
193
+ });
194
+ it('does not warn when all exported names are defined', async () => {
195
+ const file = path.join(tmpDir, 'exports2.js');
196
+ const ctx = makeContext(tmpDir);
197
+ const result = await writeFile({ path: file, content: 'const x = 1;\nfunction doThing() {}\nexport { x, doThing };\n' }, ctx);
198
+ expect(result.content).not.toMatch(/is not defined/);
199
+ });
200
+ });
201
+ //# sourceMappingURL=files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.test.js","sourceRoot":"","sources":["../../../src/tools/builtin/files.test.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -46,6 +46,8 @@ export interface ToolContext {
46
46
  pauseSpinner?: () => void;
47
47
  resumeSpinner?: () => void;
48
48
  patchHistory?: PatchEntry[];
49
+ sessionReadCache?: Map<string, number>;
50
+ patchFailureStreak?: Map<string, number>;
49
51
  }
50
52
  export interface PatchEntry {
51
53
  filePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;SAChC,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;SAChC,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daedalus-cli",
3
- "version": "0.5.22",
3
+ "version": "0.5.24",
4
4
  "description": "Local-first AI coding CLI with embedded model router, multi-agent orchestration, and codebase indexing",
5
5
  "type": "module",
6
6
  "bin": {