@kernel.chat/kbot 3.2.0 → 3.3.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.
@@ -0,0 +1,395 @@
1
+ // kbot File Tools Tests
2
+ import { describe, it, expect, afterAll, vi } from 'vitest';
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ // Mock permissions to auto-approve all writes (permissive mode)
7
+ vi.mock('../permissions.js', () => ({
8
+ getPermissionMode: () => 'permissive',
9
+ }));
10
+ import { executeTool, getTool } from './index.js';
11
+ import { registerFileTools } from './files.js';
12
+ // Register once
13
+ registerFileTools();
14
+ // Temp directory for tests
15
+ const TEST_DIR = join(tmpdir(), 'kbot-files-test-' + Date.now());
16
+ mkdirSync(TEST_DIR, { recursive: true });
17
+ afterAll(() => {
18
+ try {
19
+ rmSync(TEST_DIR, { recursive: true, force: true });
20
+ }
21
+ catch { }
22
+ });
23
+ // ─────────────────────────────────────────────────────────────────────
24
+ // 1. Registration
25
+ // ─────────────────────────────────────────────────────────────────────
26
+ describe('File Tools Registration', () => {
27
+ it('registers read_file', () => {
28
+ const tool = getTool('read_file');
29
+ expect(tool).toBeTruthy();
30
+ expect(tool.tier).toBe('free');
31
+ expect(tool.parameters.path.required).toBe(true);
32
+ });
33
+ it('registers write_file', () => {
34
+ const tool = getTool('write_file');
35
+ expect(tool).toBeTruthy();
36
+ expect(tool.parameters.path.required).toBe(true);
37
+ expect(tool.parameters.content.required).toBe(true);
38
+ });
39
+ it('registers edit_file', () => {
40
+ const tool = getTool('edit_file');
41
+ expect(tool).toBeTruthy();
42
+ expect(tool.parameters.old_string.required).toBe(true);
43
+ expect(tool.parameters.new_string.required).toBe(true);
44
+ });
45
+ it('registers glob', () => {
46
+ const tool = getTool('glob');
47
+ expect(tool).toBeTruthy();
48
+ expect(tool.parameters.pattern.required).toBe(true);
49
+ });
50
+ it('registers grep', () => {
51
+ const tool = getTool('grep');
52
+ expect(tool).toBeTruthy();
53
+ expect(tool.parameters.pattern.required).toBe(true);
54
+ });
55
+ it('registers multi_file_write', () => {
56
+ const tool = getTool('multi_file_write');
57
+ expect(tool).toBeTruthy();
58
+ expect(tool.parameters.files.required).toBe(true);
59
+ });
60
+ it('registers list_directory', () => {
61
+ const tool = getTool('list_directory');
62
+ expect(tool).toBeTruthy();
63
+ });
64
+ });
65
+ // ─────────────────────────────────────────────────────────────────────
66
+ // 2. read_file
67
+ // ─────────────────────────────────────────────────────────────────────
68
+ describe('read_file', () => {
69
+ it('reads a file and returns content with line numbers', async () => {
70
+ const filePath = join(TEST_DIR, 'hello.txt');
71
+ writeFileSync(filePath, 'line one\nline two\nline three');
72
+ const result = await executeTool({
73
+ id: 'rf-1',
74
+ name: 'read_file',
75
+ arguments: { path: filePath },
76
+ });
77
+ expect(result.error).toBeUndefined();
78
+ expect(result.result).toContain('line one');
79
+ expect(result.result).toContain('line two');
80
+ expect(result.result).toContain('line three');
81
+ // Should have line numbers
82
+ expect(result.result).toMatch(/\d+\s*│/);
83
+ });
84
+ it('supports offset and limit', async () => {
85
+ const filePath = join(TEST_DIR, 'numbered.txt');
86
+ writeFileSync(filePath, 'a\nb\nc\nd\ne');
87
+ const result = await executeTool({
88
+ id: 'rf-2',
89
+ name: 'read_file',
90
+ arguments: { path: filePath, offset: 2, limit: 2 },
91
+ });
92
+ expect(result.error).toBeUndefined();
93
+ expect(result.result).toContain('b');
94
+ expect(result.result).toContain('c');
95
+ expect(result.result).not.toContain('│ a');
96
+ expect(result.result).not.toContain('│ d');
97
+ });
98
+ it('returns error for nonexistent file', async () => {
99
+ const result = await executeTool({
100
+ id: 'rf-3',
101
+ name: 'read_file',
102
+ arguments: { path: join(TEST_DIR, 'does-not-exist.txt') },
103
+ });
104
+ expect(result.result).toContain('Error');
105
+ expect(result.result).toContain('not found');
106
+ });
107
+ it('returns error for directory', async () => {
108
+ const result = await executeTool({
109
+ id: 'rf-4',
110
+ name: 'read_file',
111
+ arguments: { path: TEST_DIR },
112
+ });
113
+ expect(result.result).toContain('directory');
114
+ });
115
+ it('reads empty files', async () => {
116
+ const filePath = join(TEST_DIR, 'empty.txt');
117
+ writeFileSync(filePath, '');
118
+ const result = await executeTool({
119
+ id: 'rf-5',
120
+ name: 'read_file',
121
+ arguments: { path: filePath },
122
+ });
123
+ expect(result.error).toBeUndefined();
124
+ });
125
+ });
126
+ // ─────────────────────────────────────────────────────────────────────
127
+ // 3. write_file
128
+ // ─────────────────────────────────────────────────────────────────────
129
+ describe('write_file', () => {
130
+ it('creates a new file', async () => {
131
+ const filePath = join(TEST_DIR, 'new-file.txt');
132
+ const result = await executeTool({
133
+ id: 'wf-1',
134
+ name: 'write_file',
135
+ arguments: { path: filePath, content: 'hello world' },
136
+ });
137
+ expect(result.error).toBeUndefined();
138
+ expect(result.result).toContain('Written');
139
+ expect(result.result).toContain('11 bytes');
140
+ expect(readFileSync(filePath, 'utf-8')).toBe('hello world');
141
+ });
142
+ it('overwrites an existing file', async () => {
143
+ const filePath = join(TEST_DIR, 'overwrite.txt');
144
+ writeFileSync(filePath, 'old content');
145
+ const result = await executeTool({
146
+ id: 'wf-2',
147
+ name: 'write_file',
148
+ arguments: { path: filePath, content: 'new content' },
149
+ });
150
+ expect(result.error).toBeUndefined();
151
+ expect(readFileSync(filePath, 'utf-8')).toBe('new content');
152
+ });
153
+ it('auto-creates parent directories', async () => {
154
+ const filePath = join(TEST_DIR, 'deep', 'nested', 'dir', 'file.txt');
155
+ const result = await executeTool({
156
+ id: 'wf-3',
157
+ name: 'write_file',
158
+ arguments: { path: filePath, content: 'nested content' },
159
+ });
160
+ expect(result.error).toBeUndefined();
161
+ expect(existsSync(filePath)).toBe(true);
162
+ expect(readFileSync(filePath, 'utf-8')).toBe('nested content');
163
+ });
164
+ it('writes empty content', async () => {
165
+ const filePath = join(TEST_DIR, 'empty-write.txt');
166
+ const result = await executeTool({
167
+ id: 'wf-4',
168
+ name: 'write_file',
169
+ arguments: { path: filePath, content: '' },
170
+ });
171
+ expect(result.error).toBeUndefined();
172
+ expect(result.result).toContain('0 bytes');
173
+ expect(readFileSync(filePath, 'utf-8')).toBe('');
174
+ });
175
+ });
176
+ // ─────────────────────────────────────────────────────────────────────
177
+ // 4. edit_file
178
+ // ─────────────────────────────────────────────────────────────────────
179
+ describe('edit_file', () => {
180
+ it('replaces a unique string', async () => {
181
+ const filePath = join(TEST_DIR, 'edit-target.txt');
182
+ writeFileSync(filePath, 'hello world\nfoo bar\nbaz qux');
183
+ const result = await executeTool({
184
+ id: 'ef-1',
185
+ name: 'edit_file',
186
+ arguments: { path: filePath, old_string: 'foo bar', new_string: 'FOO BAR' },
187
+ });
188
+ expect(result.error).toBeUndefined();
189
+ expect(result.result).toContain('replaced 1 occurrence');
190
+ expect(readFileSync(filePath, 'utf-8')).toBe('hello world\nFOO BAR\nbaz qux');
191
+ });
192
+ it('returns error when old_string is not found', async () => {
193
+ const filePath = join(TEST_DIR, 'edit-nf.txt');
194
+ writeFileSync(filePath, 'hello world');
195
+ const result = await executeTool({
196
+ id: 'ef-2',
197
+ name: 'edit_file',
198
+ arguments: { path: filePath, old_string: 'not here', new_string: 'replacement' },
199
+ });
200
+ expect(result.result).toContain('not found');
201
+ });
202
+ it('returns error when old_string appears multiple times', async () => {
203
+ const filePath = join(TEST_DIR, 'edit-dup.txt');
204
+ writeFileSync(filePath, 'aaa bbb aaa ccc aaa');
205
+ const result = await executeTool({
206
+ id: 'ef-3',
207
+ name: 'edit_file',
208
+ arguments: { path: filePath, old_string: 'aaa', new_string: 'zzz' },
209
+ });
210
+ expect(result.result).toContain('3 times');
211
+ expect(result.result).toContain('must be unique');
212
+ });
213
+ it('returns error for nonexistent file', async () => {
214
+ const result = await executeTool({
215
+ id: 'ef-4',
216
+ name: 'edit_file',
217
+ arguments: { path: join(TEST_DIR, 'nonexistent.txt'), old_string: 'a', new_string: 'b' },
218
+ });
219
+ expect(result.result).toContain('not found');
220
+ });
221
+ });
222
+ // ─────────────────────────────────────────────────────────────────────
223
+ // 5. glob
224
+ // ─────────────────────────────────────────────────────────────────────
225
+ describe('glob', () => {
226
+ it('finds files matching a pattern', async () => {
227
+ const subDir = join(TEST_DIR, 'glob-test');
228
+ mkdirSync(subDir, { recursive: true });
229
+ writeFileSync(join(subDir, 'a.ts'), 'ts file');
230
+ writeFileSync(join(subDir, 'b.ts'), 'ts file');
231
+ writeFileSync(join(subDir, 'c.js'), 'js file');
232
+ const result = await executeTool({
233
+ id: 'gl-1',
234
+ name: 'glob',
235
+ arguments: { pattern: '*.ts', path: subDir },
236
+ });
237
+ expect(result.error).toBeUndefined();
238
+ expect(result.result).toContain('a.ts');
239
+ expect(result.result).toContain('b.ts');
240
+ });
241
+ it('returns "No files found" for no matches', async () => {
242
+ const subDir = join(TEST_DIR, 'glob-empty');
243
+ mkdirSync(subDir, { recursive: true });
244
+ const result = await executeTool({
245
+ id: 'gl-2',
246
+ name: 'glob',
247
+ arguments: { pattern: '*.xyz', path: subDir },
248
+ });
249
+ expect(result.result).toContain('No files found');
250
+ });
251
+ it('rejects unsafe characters in pattern', async () => {
252
+ const result = await executeTool({
253
+ id: 'gl-3',
254
+ name: 'glob',
255
+ arguments: { pattern: '*.ts; rm -rf /', path: TEST_DIR },
256
+ });
257
+ expect(result.result).toContain('unsafe characters');
258
+ });
259
+ it('rejects shell injection via backticks', async () => {
260
+ const result = await executeTool({
261
+ id: 'gl-4',
262
+ name: 'glob',
263
+ arguments: { pattern: '`whoami`.ts', path: TEST_DIR },
264
+ });
265
+ expect(result.result).toContain('unsafe characters');
266
+ });
267
+ it('rejects dollar sign substitution', async () => {
268
+ const result = await executeTool({
269
+ id: 'gl-5',
270
+ name: 'glob',
271
+ arguments: { pattern: '$(cat /etc/passwd).ts', path: TEST_DIR },
272
+ });
273
+ expect(result.result).toContain('unsafe characters');
274
+ });
275
+ });
276
+ // ─────────────────────────────────────────────────────────────────────
277
+ // 6. grep
278
+ // ─────────────────────────────────────────────────────────────────────
279
+ describe('grep', () => {
280
+ it('finds matching lines in files', async () => {
281
+ const subDir = join(TEST_DIR, 'grep-test');
282
+ mkdirSync(subDir, { recursive: true });
283
+ writeFileSync(join(subDir, 'code.ts'), 'function hello() {\n return "world"\n}');
284
+ writeFileSync(join(subDir, 'other.ts'), 'const x = 42');
285
+ const result = await executeTool({
286
+ id: 'gr-1',
287
+ name: 'grep',
288
+ arguments: { pattern: 'hello', path: subDir },
289
+ });
290
+ expect(result.error).toBeUndefined();
291
+ expect(result.result).toContain('hello');
292
+ });
293
+ it('returns "No matches found" for no matches', async () => {
294
+ const subDir = join(TEST_DIR, 'grep-empty');
295
+ mkdirSync(subDir, { recursive: true });
296
+ writeFileSync(join(subDir, 'a.txt'), 'nothing relevant here');
297
+ const result = await executeTool({
298
+ id: 'gr-2',
299
+ name: 'grep',
300
+ arguments: { pattern: 'zzzzuniquezzz', path: subDir },
301
+ });
302
+ expect(result.result).toContain('No matches found');
303
+ });
304
+ it('sanitizes type flag to prevent injection', async () => {
305
+ // The type flag should strip non-alphanumeric chars
306
+ const result = await executeTool({
307
+ id: 'gr-3',
308
+ name: 'grep',
309
+ arguments: { pattern: 'test', path: TEST_DIR, type: 'ts;rm' },
310
+ });
311
+ // Should not error fatally — type is sanitized to 'tsrm'
312
+ expect(result.result).toBeDefined();
313
+ });
314
+ });
315
+ // ─────────────────────────────────────────────────────────────────────
316
+ // 7. multi_file_write
317
+ // ─────────────────────────────────────────────────────────────────────
318
+ describe('multi_file_write', () => {
319
+ it('writes multiple files at once', async () => {
320
+ const result = await executeTool({
321
+ id: 'mfw-1',
322
+ name: 'multi_file_write',
323
+ arguments: {
324
+ files: [
325
+ { path: join(TEST_DIR, 'multi-a.txt'), content: 'alpha' },
326
+ { path: join(TEST_DIR, 'multi-b.txt'), content: 'beta' },
327
+ { path: join(TEST_DIR, 'multi-c.txt'), content: 'gamma' },
328
+ ],
329
+ },
330
+ });
331
+ expect(result.error).toBeUndefined();
332
+ expect(result.result).toContain('Written 3 files');
333
+ expect(readFileSync(join(TEST_DIR, 'multi-a.txt'), 'utf-8')).toBe('alpha');
334
+ expect(readFileSync(join(TEST_DIR, 'multi-b.txt'), 'utf-8')).toBe('beta');
335
+ expect(readFileSync(join(TEST_DIR, 'multi-c.txt'), 'utf-8')).toBe('gamma');
336
+ });
337
+ it('returns error for empty files array', async () => {
338
+ const result = await executeTool({
339
+ id: 'mfw-2',
340
+ name: 'multi_file_write',
341
+ arguments: { files: [] },
342
+ });
343
+ expect(result.result).toContain('non-empty array');
344
+ });
345
+ it('returns error for non-array files', async () => {
346
+ const result = await executeTool({
347
+ id: 'mfw-3',
348
+ name: 'multi_file_write',
349
+ arguments: { files: 'not an array' },
350
+ });
351
+ expect(result.result).toContain('non-empty array');
352
+ });
353
+ it('auto-creates parent directories for each file', async () => {
354
+ const result = await executeTool({
355
+ id: 'mfw-4',
356
+ name: 'multi_file_write',
357
+ arguments: {
358
+ files: [
359
+ { path: join(TEST_DIR, 'multi-deep', 'sub', 'file.txt'), content: 'deep' },
360
+ ],
361
+ },
362
+ });
363
+ expect(result.error).toBeUndefined();
364
+ expect(existsSync(join(TEST_DIR, 'multi-deep', 'sub', 'file.txt'))).toBe(true);
365
+ });
366
+ });
367
+ // ─────────────────────────────────────────────────────────────────────
368
+ // 8. list_directory
369
+ // ─────────────────────────────────────────────────────────────────────
370
+ describe('list_directory', () => {
371
+ it('lists files in a directory', async () => {
372
+ const subDir = join(TEST_DIR, 'list-test');
373
+ mkdirSync(subDir, { recursive: true });
374
+ writeFileSync(join(subDir, 'file1.txt'), 'content');
375
+ writeFileSync(join(subDir, 'file2.txt'), 'content');
376
+ const result = await executeTool({
377
+ id: 'ld-1',
378
+ name: 'list_directory',
379
+ arguments: { path: subDir },
380
+ });
381
+ expect(result.error).toBeUndefined();
382
+ expect(result.result).toContain('file1.txt');
383
+ expect(result.result).toContain('file2.txt');
384
+ });
385
+ it('returns something for nonexistent directory', async () => {
386
+ const result = await executeTool({
387
+ id: 'ld-2',
388
+ name: 'list_directory',
389
+ arguments: { path: join(TEST_DIR, 'no-such-dir-xyz') },
390
+ });
391
+ // ls -la with 2>/dev/null may return empty ("Empty directory") or error
392
+ expect(result.result).toBeTruthy();
393
+ });
394
+ });
395
+ //# sourceMappingURL=files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.test.js","sourceRoot":"","sources":["../../src/tools/files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.test.d.ts","sourceRoot":"","sources":["../../src/tools/git.test.ts"],"names":[],"mappings":""}