@blockspool/core 0.3.0 → 0.3.1
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.
- package/package.json +1 -1
- package/dist/db/adapter.d.ts +0 -191
- package/dist/db/adapter.d.ts.map +0 -1
- package/dist/db/adapter.js +0 -40
- package/dist/db/adapter.js.map +0 -1
- package/dist/db/contract.d.ts +0 -47
- package/dist/db/contract.d.ts.map +0 -1
- package/dist/db/contract.js +0 -258
- package/dist/db/contract.js.map +0 -1
- package/dist/db/index.d.ts +0 -6
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/index.js +0 -7
- package/dist/db/index.js.map +0 -1
- package/dist/exec/index.d.ts +0 -5
- package/dist/exec/index.d.ts.map +0 -1
- package/dist/exec/index.js +0 -5
- package/dist/exec/index.js.map +0 -1
- package/dist/exec/types.d.ts +0 -64
- package/dist/exec/types.d.ts.map +0 -1
- package/dist/exec/types.js +0 -8
- package/dist/exec/types.js.map +0 -1
- package/dist/index.d.ts +0 -23
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -27
- package/dist/index.js.map +0 -1
- package/dist/repos/index.d.ts +0 -15
- package/dist/repos/index.d.ts.map +0 -1
- package/dist/repos/index.js +0 -11
- package/dist/repos/index.js.map +0 -1
- package/dist/repos/projects.d.ts +0 -41
- package/dist/repos/projects.d.ts.map +0 -1
- package/dist/repos/projects.js +0 -74
- package/dist/repos/projects.js.map +0 -1
- package/dist/repos/run_steps.d.ts +0 -152
- package/dist/repos/run_steps.d.ts.map +0 -1
- package/dist/repos/run_steps.js +0 -321
- package/dist/repos/run_steps.js.map +0 -1
- package/dist/repos/runs.d.ts +0 -92
- package/dist/repos/runs.d.ts.map +0 -1
- package/dist/repos/runs.js +0 -177
- package/dist/repos/runs.js.map +0 -1
- package/dist/repos/tickets.d.ts +0 -71
- package/dist/repos/tickets.d.ts.map +0 -1
- package/dist/repos/tickets.js +0 -128
- package/dist/repos/tickets.js.map +0 -1
- package/dist/scout/index.d.ts +0 -15
- package/dist/scout/index.d.ts.map +0 -1
- package/dist/scout/index.js +0 -382
- package/dist/scout/index.js.map +0 -1
- package/dist/scout/prompt.d.ts +0 -30
- package/dist/scout/prompt.d.ts.map +0 -1
- package/dist/scout/prompt.js +0 -101
- package/dist/scout/prompt.js.map +0 -1
- package/dist/scout/runner.d.ts +0 -68
- package/dist/scout/runner.d.ts.map +0 -1
- package/dist/scout/runner.js +0 -241
- package/dist/scout/runner.js.map +0 -1
- package/dist/scout/scanner.d.ts +0 -35
- package/dist/scout/scanner.d.ts.map +0 -1
- package/dist/scout/scanner.js +0 -164
- package/dist/scout/scanner.js.map +0 -1
- package/dist/scout/types.d.ts +0 -177
- package/dist/scout/types.d.ts.map +0 -1
- package/dist/scout/types.js +0 -44
- package/dist/scout/types.js.map +0 -1
- package/dist/services/index.d.ts +0 -10
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -9
- package/dist/services/index.js.map +0 -1
- package/dist/services/qa.d.ts +0 -76
- package/dist/services/qa.d.ts.map +0 -1
- package/dist/services/qa.js +0 -239
- package/dist/services/qa.js.map +0 -1
- package/dist/services/scout.d.ts +0 -118
- package/dist/services/scout.d.ts.map +0 -1
- package/dist/services/scout.js +0 -204
- package/dist/services/scout.js.map +0 -1
- package/dist/test/db-contract-sqlite.test.d.ts +0 -2
- package/dist/test/db-contract-sqlite.test.d.ts.map +0 -1
- package/dist/test/db-contract-sqlite.test.js +0 -176
- package/dist/test/db-contract-sqlite.test.js.map +0 -1
- package/dist/test/learnings-format.test.d.ts +0 -9
- package/dist/test/learnings-format.test.d.ts.map +0 -1
- package/dist/test/learnings-format.test.js +0 -174
- package/dist/test/learnings-format.test.js.map +0 -1
- package/dist/test/repos-integration.test.d.ts +0 -2
- package/dist/test/repos-integration.test.d.ts.map +0 -1
- package/dist/test/repos-integration.test.js +0 -565
- package/dist/test/repos-integration.test.js.map +0 -1
- package/dist/test/scout-full-pure.test.d.ts +0 -2
- package/dist/test/scout-full-pure.test.d.ts.map +0 -1
- package/dist/test/scout-full-pure.test.js +0 -122
- package/dist/test/scout-full-pure.test.js.map +0 -1
- package/dist/test/scout-integration.test.d.ts +0 -13
- package/dist/test/scout-integration.test.d.ts.map +0 -1
- package/dist/test/scout-integration.test.js +0 -229
- package/dist/test/scout-integration.test.js.map +0 -1
- package/dist/test/scout-prompt.test.d.ts +0 -2
- package/dist/test/scout-prompt.test.d.ts.map +0 -1
- package/dist/test/scout-prompt.test.js +0 -79
- package/dist/test/scout-prompt.test.js.map +0 -1
- package/dist/test/scout-runner-parse.test.d.ts +0 -2
- package/dist/test/scout-runner-parse.test.d.ts.map +0 -1
- package/dist/test/scout-runner-parse.test.js +0 -44
- package/dist/test/scout-runner-parse.test.js.map +0 -1
- package/dist/test/scout-runner-spawn.test.d.ts +0 -11
- package/dist/test/scout-runner-spawn.test.d.ts.map +0 -1
- package/dist/test/scout-runner-spawn.test.js +0 -359
- package/dist/test/scout-runner-spawn.test.js.map +0 -1
- package/dist/test/scout-scanner-fs.test.d.ts +0 -2
- package/dist/test/scout-scanner-fs.test.d.ts.map +0 -1
- package/dist/test/scout-scanner-fs.test.js +0 -188
- package/dist/test/scout-scanner-fs.test.js.map +0 -1
- package/dist/test/scout-scanner-pure.test.d.ts +0 -2
- package/dist/test/scout-scanner-pure.test.d.ts.map +0 -1
- package/dist/test/scout-scanner-pure.test.js +0 -131
- package/dist/test/scout-scanner-pure.test.js.map +0 -1
- package/dist/test/services-integration.test.d.ts +0 -2
- package/dist/test/services-integration.test.d.ts.map +0 -1
- package/dist/test/services-integration.test.js +0 -327
- package/dist/test/services-integration.test.js.map +0 -1
- package/dist/test/services-qa.test.d.ts +0 -2
- package/dist/test/services-qa.test.d.ts.map +0 -1
- package/dist/test/services-qa.test.js +0 -255
- package/dist/test/services-qa.test.js.map +0 -1
- package/dist/test/services-scout.test.d.ts +0 -2
- package/dist/test/services-scout.test.d.ts.map +0 -1
- package/dist/test/services-scout.test.js +0 -269
- package/dist/test/services-scout.test.js.map +0 -1
- package/dist/utils/id.d.ts +0 -12
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -24
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/id.test.d.ts +0 -5
- package/dist/utils/id.test.d.ts.map +0 -1
- package/dist/utils/id.test.js +0 -173
- package/dist/utils/id.test.js.map +0 -1
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/json.d.ts +0 -9
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/json.js +0 -19
- package/dist/utils/json.js.map +0 -1
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { parseClaudeOutput } from '../scout/runner.js';
|
|
3
|
-
import { batchFiles } from '../scout/scanner.js';
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// parseClaudeOutput
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
describe('parseClaudeOutput', () => {
|
|
8
|
-
it('parses valid JSON directly', () => {
|
|
9
|
-
const result = parseClaudeOutput('{"x": 1}');
|
|
10
|
-
expect(result).toEqual({ x: 1 });
|
|
11
|
-
});
|
|
12
|
-
it('parses JSON with surrounding whitespace', () => {
|
|
13
|
-
const result = parseClaudeOutput(' \n {"a":"b"} \n ');
|
|
14
|
-
expect(result).toEqual({ a: 'b' });
|
|
15
|
-
});
|
|
16
|
-
it('extracts JSON from markdown code block', () => {
|
|
17
|
-
const input = 'Here is the result:\n```json\n{"proposals": [1, 2]}\n```\nDone.';
|
|
18
|
-
const result = parseClaudeOutput(input);
|
|
19
|
-
expect(result).toEqual({ proposals: [1, 2] });
|
|
20
|
-
});
|
|
21
|
-
it('extracts JSON from code block without json tag', () => {
|
|
22
|
-
const input = '```\n{"key": "value"}\n```';
|
|
23
|
-
const result = parseClaudeOutput(input);
|
|
24
|
-
expect(result).toEqual({ key: 'value' });
|
|
25
|
-
});
|
|
26
|
-
it('extracts JSON object from mixed text', () => {
|
|
27
|
-
const input = 'Some preamble text\n{"found": true}\nSome trailing text';
|
|
28
|
-
const result = parseClaudeOutput(input);
|
|
29
|
-
expect(result).toEqual({ found: true });
|
|
30
|
-
});
|
|
31
|
-
it('returns null for completely invalid input', () => {
|
|
32
|
-
const result = parseClaudeOutput('no json here at all');
|
|
33
|
-
expect(result).toBeNull();
|
|
34
|
-
});
|
|
35
|
-
it('returns null for empty string', () => {
|
|
36
|
-
const result = parseClaudeOutput('');
|
|
37
|
-
expect(result).toBeNull();
|
|
38
|
-
});
|
|
39
|
-
it('parses JSON arrays', () => {
|
|
40
|
-
const result = parseClaudeOutput('[1, 2, 3]');
|
|
41
|
-
expect(result).toEqual([1, 2, 3]);
|
|
42
|
-
});
|
|
43
|
-
it('handles nested objects', () => {
|
|
44
|
-
const input = '{"a": {"b": {"c": 1}}}';
|
|
45
|
-
const result = parseClaudeOutput(input);
|
|
46
|
-
expect(result?.a.b.c).toBe(1);
|
|
47
|
-
});
|
|
48
|
-
it('prefers direct parse over code block extraction', () => {
|
|
49
|
-
// If the entire string is valid JSON, it should parse directly
|
|
50
|
-
const input = '{"direct": true}';
|
|
51
|
-
const result = parseClaudeOutput(input);
|
|
52
|
-
expect(result).toEqual({ direct: true });
|
|
53
|
-
});
|
|
54
|
-
it('handles JSON with special characters in strings', () => {
|
|
55
|
-
const input = '{"msg": "hello\\nworld"}';
|
|
56
|
-
const result = parseClaudeOutput(input);
|
|
57
|
-
expect(result?.msg).toBe('hello\nworld');
|
|
58
|
-
});
|
|
59
|
-
it('returns null for malformed JSON in code block', () => {
|
|
60
|
-
const input = '```json\n{invalid json}\n```';
|
|
61
|
-
const result = parseClaudeOutput(input);
|
|
62
|
-
expect(result).toBeNull();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
// batchFiles
|
|
67
|
-
// ---------------------------------------------------------------------------
|
|
68
|
-
describe('batchFiles', () => {
|
|
69
|
-
function makeFile(name) {
|
|
70
|
-
return { path: name, content: `// ${name}`, size: 10 };
|
|
71
|
-
}
|
|
72
|
-
it('returns empty array for empty input', () => {
|
|
73
|
-
expect(batchFiles([])).toEqual([]);
|
|
74
|
-
});
|
|
75
|
-
it('creates a single batch when files <= batchSize', () => {
|
|
76
|
-
const files = [makeFile('a.ts'), makeFile('b.ts')];
|
|
77
|
-
const batches = batchFiles(files, 3);
|
|
78
|
-
expect(batches).toHaveLength(1);
|
|
79
|
-
expect(batches[0]).toHaveLength(2);
|
|
80
|
-
});
|
|
81
|
-
it('splits files into correct number of batches', () => {
|
|
82
|
-
const files = Array.from({ length: 7 }, (_, i) => makeFile(`f${i}.ts`));
|
|
83
|
-
const batches = batchFiles(files, 3);
|
|
84
|
-
expect(batches).toHaveLength(3);
|
|
85
|
-
expect(batches[0]).toHaveLength(3);
|
|
86
|
-
expect(batches[1]).toHaveLength(3);
|
|
87
|
-
expect(batches[2]).toHaveLength(1);
|
|
88
|
-
});
|
|
89
|
-
it('uses default batchSize of 3', () => {
|
|
90
|
-
const files = Array.from({ length: 6 }, (_, i) => makeFile(`f${i}.ts`));
|
|
91
|
-
const batches = batchFiles(files);
|
|
92
|
-
expect(batches).toHaveLength(2);
|
|
93
|
-
expect(batches[0]).toHaveLength(3);
|
|
94
|
-
expect(batches[1]).toHaveLength(3);
|
|
95
|
-
});
|
|
96
|
-
it('handles batchSize of 1', () => {
|
|
97
|
-
const files = [makeFile('a.ts'), makeFile('b.ts'), makeFile('c.ts')];
|
|
98
|
-
const batches = batchFiles(files, 1);
|
|
99
|
-
expect(batches).toHaveLength(3);
|
|
100
|
-
batches.forEach(b => expect(b).toHaveLength(1));
|
|
101
|
-
});
|
|
102
|
-
it('preserves file order across batches', () => {
|
|
103
|
-
const files = [makeFile('a.ts'), makeFile('b.ts'), makeFile('c.ts'), makeFile('d.ts')];
|
|
104
|
-
const batches = batchFiles(files, 2);
|
|
105
|
-
expect(batches[0][0].path).toBe('a.ts');
|
|
106
|
-
expect(batches[0][1].path).toBe('b.ts');
|
|
107
|
-
expect(batches[1][0].path).toBe('c.ts');
|
|
108
|
-
expect(batches[1][1].path).toBe('d.ts');
|
|
109
|
-
});
|
|
110
|
-
it('handles single file', () => {
|
|
111
|
-
const batches = batchFiles([makeFile('only.ts')], 5);
|
|
112
|
-
expect(batches).toHaveLength(1);
|
|
113
|
-
expect(batches[0]).toHaveLength(1);
|
|
114
|
-
});
|
|
115
|
-
it('handles exact multiple of batchSize', () => {
|
|
116
|
-
const files = Array.from({ length: 9 }, (_, i) => makeFile(`f${i}.ts`));
|
|
117
|
-
const batches = batchFiles(files, 3);
|
|
118
|
-
expect(batches).toHaveLength(3);
|
|
119
|
-
batches.forEach(b => expect(b).toHaveLength(3));
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
//# sourceMappingURL=scout-full-pure.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-full-pure.test.js","sourceRoot":"","sources":["../../src/test/scout-full-pure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scout module tests — pure function tests for exported utilities
|
|
3
|
-
* from packages/core/src/scout/
|
|
4
|
-
*
|
|
5
|
-
* Note: normalizeProposal, sanitizeVerificationCommands, and expandPathsForTests
|
|
6
|
-
* are private (not exported). We test their behavior indirectly through the
|
|
7
|
-
* scout() function, and directly test all exported pure functions:
|
|
8
|
-
* - parseClaudeOutput (runner.ts)
|
|
9
|
-
* - buildScoutPrompt, buildCategoryPrompt (prompt.ts)
|
|
10
|
-
* - batchFiles (scanner.ts)
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=scout-integration.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-integration.test.d.ts","sourceRoot":"","sources":["../../src/test/scout-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scout module tests — pure function tests for exported utilities
|
|
3
|
-
* from packages/core/src/scout/
|
|
4
|
-
*
|
|
5
|
-
* Note: normalizeProposal, sanitizeVerificationCommands, and expandPathsForTests
|
|
6
|
-
* are private (not exported). We test their behavior indirectly through the
|
|
7
|
-
* scout() function, and directly test all exported pure functions:
|
|
8
|
-
* - parseClaudeOutput (runner.ts)
|
|
9
|
-
* - buildScoutPrompt, buildCategoryPrompt (prompt.ts)
|
|
10
|
-
* - batchFiles (scanner.ts)
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect } from 'vitest';
|
|
13
|
-
import { parseClaudeOutput, buildScoutPrompt, buildCategoryPrompt, batchFiles, } from '../scout/index.js';
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
// parseClaudeOutput
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
describe('parseClaudeOutput', () => {
|
|
18
|
-
it('parses raw JSON', () => {
|
|
19
|
-
const result = parseClaudeOutput('{"x": 42}');
|
|
20
|
-
expect(result).toEqual({ x: 42 });
|
|
21
|
-
});
|
|
22
|
-
it('parses JSON with leading/trailing whitespace', () => {
|
|
23
|
-
const result = parseClaudeOutput(' \n {"a": "b"} \n ');
|
|
24
|
-
expect(result).toEqual({ a: 'b' });
|
|
25
|
-
});
|
|
26
|
-
it('extracts JSON from markdown code block', () => {
|
|
27
|
-
const input = 'Here is the result:\n```json\n{"proposals": []}\n```\nDone.';
|
|
28
|
-
const result = parseClaudeOutput(input);
|
|
29
|
-
expect(result).toEqual({ proposals: [] });
|
|
30
|
-
});
|
|
31
|
-
it('extracts JSON from code block without language tag', () => {
|
|
32
|
-
const input = '```\n{"key": "value"}\n```';
|
|
33
|
-
const result = parseClaudeOutput(input);
|
|
34
|
-
expect(result).toEqual({ key: 'value' });
|
|
35
|
-
});
|
|
36
|
-
it('extracts JSON object from mixed text', () => {
|
|
37
|
-
const input = 'Some preamble text\n{"found": true}\nSome trailing text';
|
|
38
|
-
const result = parseClaudeOutput(input);
|
|
39
|
-
expect(result).toEqual({ found: true });
|
|
40
|
-
});
|
|
41
|
-
it('returns null for unparseable content', () => {
|
|
42
|
-
expect(parseClaudeOutput('not json at all')).toBeNull();
|
|
43
|
-
});
|
|
44
|
-
it('returns null for empty string', () => {
|
|
45
|
-
expect(parseClaudeOutput('')).toBeNull();
|
|
46
|
-
});
|
|
47
|
-
it('parses nested proposals structure', () => {
|
|
48
|
-
const input = JSON.stringify({
|
|
49
|
-
proposals: [
|
|
50
|
-
{
|
|
51
|
-
category: 'refactor',
|
|
52
|
-
title: 'Test',
|
|
53
|
-
description: 'Desc',
|
|
54
|
-
confidence: 80,
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
});
|
|
58
|
-
const result = parseClaudeOutput(input);
|
|
59
|
-
expect(result.proposals).toHaveLength(1);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// buildScoutPrompt
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
describe('buildScoutPrompt', () => {
|
|
66
|
-
const baseFiles = [{ path: 'src/foo.ts', content: 'const x = 1;' }];
|
|
67
|
-
it('includes file content in prompt', () => {
|
|
68
|
-
const prompt = buildScoutPrompt({
|
|
69
|
-
files: baseFiles,
|
|
70
|
-
scope: 'src/**',
|
|
71
|
-
maxProposals: 5,
|
|
72
|
-
minConfidence: 60,
|
|
73
|
-
});
|
|
74
|
-
expect(prompt).toContain('src/foo.ts');
|
|
75
|
-
expect(prompt).toContain('const x = 1;');
|
|
76
|
-
});
|
|
77
|
-
it('includes scope in prompt', () => {
|
|
78
|
-
const prompt = buildScoutPrompt({
|
|
79
|
-
files: baseFiles,
|
|
80
|
-
scope: 'packages/**',
|
|
81
|
-
maxProposals: 3,
|
|
82
|
-
minConfidence: 50,
|
|
83
|
-
});
|
|
84
|
-
expect(prompt).toContain('packages/**');
|
|
85
|
-
});
|
|
86
|
-
it('includes category filter for types', () => {
|
|
87
|
-
const prompt = buildScoutPrompt({
|
|
88
|
-
files: baseFiles,
|
|
89
|
-
scope: 'src/**',
|
|
90
|
-
types: ['security', 'perf'],
|
|
91
|
-
maxProposals: 5,
|
|
92
|
-
minConfidence: 50,
|
|
93
|
-
});
|
|
94
|
-
expect(prompt).toContain('security');
|
|
95
|
-
expect(prompt).toContain('perf');
|
|
96
|
-
expect(prompt).toContain('ONLY');
|
|
97
|
-
});
|
|
98
|
-
it('includes exclude types filter', () => {
|
|
99
|
-
const prompt = buildScoutPrompt({
|
|
100
|
-
files: baseFiles,
|
|
101
|
-
scope: 'src/**',
|
|
102
|
-
excludeTypes: ['docs'],
|
|
103
|
-
maxProposals: 5,
|
|
104
|
-
minConfidence: 50,
|
|
105
|
-
});
|
|
106
|
-
expect(prompt).toContain('EXCLUDE');
|
|
107
|
-
expect(prompt).toContain('docs');
|
|
108
|
-
});
|
|
109
|
-
it('includes recently completed titles for dedup', () => {
|
|
110
|
-
const prompt = buildScoutPrompt({
|
|
111
|
-
files: baseFiles,
|
|
112
|
-
scope: 'src/**',
|
|
113
|
-
maxProposals: 5,
|
|
114
|
-
minConfidence: 50,
|
|
115
|
-
recentlyCompletedTitles: ['Fix auth bug', 'Add logging'],
|
|
116
|
-
});
|
|
117
|
-
expect(prompt).toContain('Fix auth bug');
|
|
118
|
-
expect(prompt).toContain('Add logging');
|
|
119
|
-
expect(prompt).toContain('AVOID');
|
|
120
|
-
});
|
|
121
|
-
it('includes custom prompt in strategic focus', () => {
|
|
122
|
-
const prompt = buildScoutPrompt({
|
|
123
|
-
files: baseFiles,
|
|
124
|
-
scope: 'src/**',
|
|
125
|
-
maxProposals: 5,
|
|
126
|
-
minConfidence: 50,
|
|
127
|
-
customPrompt: 'Focus on error handling patterns',
|
|
128
|
-
});
|
|
129
|
-
expect(prompt).toContain('Strategic Focus');
|
|
130
|
-
expect(prompt).toContain('Focus on error handling patterns');
|
|
131
|
-
});
|
|
132
|
-
it('includes maxProposals and minConfidence', () => {
|
|
133
|
-
const prompt = buildScoutPrompt({
|
|
134
|
-
files: baseFiles,
|
|
135
|
-
scope: 'src/**',
|
|
136
|
-
maxProposals: 7,
|
|
137
|
-
minConfidence: 75,
|
|
138
|
-
});
|
|
139
|
-
expect(prompt).toContain('7');
|
|
140
|
-
expect(prompt).toContain('75');
|
|
141
|
-
});
|
|
142
|
-
it('handles multiple files', () => {
|
|
143
|
-
const prompt = buildScoutPrompt({
|
|
144
|
-
files: [
|
|
145
|
-
{ path: 'a.ts', content: 'a' },
|
|
146
|
-
{ path: 'b.ts', content: 'b' },
|
|
147
|
-
],
|
|
148
|
-
scope: 'src/**',
|
|
149
|
-
maxProposals: 5,
|
|
150
|
-
minConfidence: 50,
|
|
151
|
-
});
|
|
152
|
-
expect(prompt).toContain('a.ts');
|
|
153
|
-
expect(prompt).toContain('b.ts');
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
// buildCategoryPrompt
|
|
158
|
-
// ---------------------------------------------------------------------------
|
|
159
|
-
describe('buildCategoryPrompt', () => {
|
|
160
|
-
it('generates prompt focused on a single category', () => {
|
|
161
|
-
const prompt = buildCategoryPrompt('security', [
|
|
162
|
-
{ path: 'src/auth.ts', content: 'export function login() {}' },
|
|
163
|
-
]);
|
|
164
|
-
expect(prompt).toContain('security');
|
|
165
|
-
expect(prompt).toContain('ONLY');
|
|
166
|
-
expect(prompt).toContain('src/auth.ts');
|
|
167
|
-
});
|
|
168
|
-
it('uses default maxProposals of 5', () => {
|
|
169
|
-
const prompt = buildCategoryPrompt('test', [
|
|
170
|
-
{ path: 'src/x.ts', content: 'x' },
|
|
171
|
-
]);
|
|
172
|
-
expect(prompt).toContain('5');
|
|
173
|
-
});
|
|
174
|
-
it('allows overriding maxProposals', () => {
|
|
175
|
-
const prompt = buildCategoryPrompt('refactor', [
|
|
176
|
-
{ path: 'src/x.ts', content: 'x' },
|
|
177
|
-
], 10);
|
|
178
|
-
expect(prompt).toContain('10');
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
// ---------------------------------------------------------------------------
|
|
182
|
-
// batchFiles
|
|
183
|
-
// ---------------------------------------------------------------------------
|
|
184
|
-
describe('batchFiles', () => {
|
|
185
|
-
function makeFiles(n) {
|
|
186
|
-
return Array.from({ length: n }, (_, i) => ({
|
|
187
|
-
path: `file${i}.ts`,
|
|
188
|
-
content: `content ${i}`,
|
|
189
|
-
size: 100,
|
|
190
|
-
}));
|
|
191
|
-
}
|
|
192
|
-
it('batches files into groups of default size 3', () => {
|
|
193
|
-
const batches = batchFiles(makeFiles(7));
|
|
194
|
-
expect(batches).toHaveLength(3);
|
|
195
|
-
expect(batches[0]).toHaveLength(3);
|
|
196
|
-
expect(batches[1]).toHaveLength(3);
|
|
197
|
-
expect(batches[2]).toHaveLength(1);
|
|
198
|
-
});
|
|
199
|
-
it('batches files with custom batch size', () => {
|
|
200
|
-
const batches = batchFiles(makeFiles(10), 5);
|
|
201
|
-
expect(batches).toHaveLength(2);
|
|
202
|
-
expect(batches[0]).toHaveLength(5);
|
|
203
|
-
expect(batches[1]).toHaveLength(5);
|
|
204
|
-
});
|
|
205
|
-
it('returns single batch when fewer files than batch size', () => {
|
|
206
|
-
const batches = batchFiles(makeFiles(2), 5);
|
|
207
|
-
expect(batches).toHaveLength(1);
|
|
208
|
-
expect(batches[0]).toHaveLength(2);
|
|
209
|
-
});
|
|
210
|
-
it('returns empty array for no files', () => {
|
|
211
|
-
expect(batchFiles([])).toEqual([]);
|
|
212
|
-
});
|
|
213
|
-
it('batch size 1 creates one batch per file', () => {
|
|
214
|
-
const batches = batchFiles(makeFiles(4), 1);
|
|
215
|
-
expect(batches).toHaveLength(4);
|
|
216
|
-
for (const b of batches) {
|
|
217
|
-
expect(b).toHaveLength(1);
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
it('preserves file ordering within batches', () => {
|
|
221
|
-
const files = makeFiles(6);
|
|
222
|
-
const batches = batchFiles(files, 2);
|
|
223
|
-
expect(batches[0][0].path).toBe('file0.ts');
|
|
224
|
-
expect(batches[0][1].path).toBe('file1.ts');
|
|
225
|
-
expect(batches[1][0].path).toBe('file2.ts');
|
|
226
|
-
expect(batches[2][0].path).toBe('file4.ts');
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
//# sourceMappingURL=scout-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-integration.test.js","sourceRoot":"","sources":["../../src/test/scout-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-prompt.test.d.ts","sourceRoot":"","sources":["../../src/test/scout-prompt.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { buildScoutPrompt, buildCategoryPrompt } from '../scout/prompt.js';
|
|
3
|
-
describe('buildScoutPrompt', () => {
|
|
4
|
-
const baseOptions = {
|
|
5
|
-
files: [{ path: 'src/index.ts', content: 'console.log("hello")' }],
|
|
6
|
-
scope: 'src/**/*.ts',
|
|
7
|
-
maxProposals: 10,
|
|
8
|
-
minConfidence: 70,
|
|
9
|
-
};
|
|
10
|
-
it('returns string containing scope, maxProposals, minConfidence', () => {
|
|
11
|
-
const result = buildScoutPrompt(baseOptions);
|
|
12
|
-
expect(result).toContain('"src/**/*.ts"');
|
|
13
|
-
expect(result).toContain('10');
|
|
14
|
-
expect(result).toContain('70');
|
|
15
|
-
});
|
|
16
|
-
it('with types filter includes "Focus ONLY on these categories"', () => {
|
|
17
|
-
const result = buildScoutPrompt({ ...baseOptions, types: ['refactor', 'test'] });
|
|
18
|
-
expect(result).toContain('Focus ONLY on these categories: refactor, test');
|
|
19
|
-
});
|
|
20
|
-
it('with excludeTypes includes "EXCLUDE these categories"', () => {
|
|
21
|
-
const result = buildScoutPrompt({ ...baseOptions, excludeTypes: ['docs', 'perf'] });
|
|
22
|
-
expect(result).toContain('EXCLUDE these categories: docs, perf');
|
|
23
|
-
});
|
|
24
|
-
it('with no type filters includes "Consider all categories"', () => {
|
|
25
|
-
const result = buildScoutPrompt(baseOptions);
|
|
26
|
-
expect(result).toContain('Consider all categories');
|
|
27
|
-
});
|
|
28
|
-
it('includes file contents formatted as markdown', () => {
|
|
29
|
-
const result = buildScoutPrompt(baseOptions);
|
|
30
|
-
expect(result).toContain('### src/index.ts');
|
|
31
|
-
expect(result).toContain('```\nconsole.log("hello")\n```');
|
|
32
|
-
});
|
|
33
|
-
it('with customPrompt includes Strategic Focus section', () => {
|
|
34
|
-
const result = buildScoutPrompt({ ...baseOptions, customPrompt: 'Focus on error handling' });
|
|
35
|
-
expect(result).toContain('## Strategic Focus');
|
|
36
|
-
expect(result).toContain('Focus on error handling');
|
|
37
|
-
});
|
|
38
|
-
it('with recentlyCompletedTitles includes avoidance text', () => {
|
|
39
|
-
const result = buildScoutPrompt({
|
|
40
|
-
...baseOptions,
|
|
41
|
-
recentlyCompletedTitles: ['Fix auth bug', 'Add logging'],
|
|
42
|
-
});
|
|
43
|
-
expect(result).toContain('AVOID proposing work similar to these recently completed tickets');
|
|
44
|
-
expect(result).toContain('- Fix auth bug');
|
|
45
|
-
expect(result).toContain('- Add logging');
|
|
46
|
-
});
|
|
47
|
-
it('with empty files array still returns valid prompt', () => {
|
|
48
|
-
const result = buildScoutPrompt({ ...baseOptions, files: [] });
|
|
49
|
-
expect(typeof result).toBe('string');
|
|
50
|
-
expect(result).toContain('scope');
|
|
51
|
-
expect(result).toContain('## Files to Analyze');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe('buildCategoryPrompt', () => {
|
|
55
|
-
const files = [{ path: 'a.ts', content: 'code' }];
|
|
56
|
-
it('calls buildScoutPrompt with correct defaults', () => {
|
|
57
|
-
const result = buildCategoryPrompt('refactor', files);
|
|
58
|
-
expect(result).toContain('Focus ONLY on these categories: refactor');
|
|
59
|
-
});
|
|
60
|
-
it('uses scope "*" and minConfidence 50', () => {
|
|
61
|
-
const result = buildCategoryPrompt('test', files);
|
|
62
|
-
expect(result).toContain('"*"');
|
|
63
|
-
expect(result).toContain('confidence >= 50');
|
|
64
|
-
});
|
|
65
|
-
it('respects custom maxProposals', () => {
|
|
66
|
-
const result = buildCategoryPrompt('docs', files, 3);
|
|
67
|
-
expect(result).toContain('at most 3 proposals');
|
|
68
|
-
});
|
|
69
|
-
it('sets types to single category array', () => {
|
|
70
|
-
const result = buildCategoryPrompt('security', files);
|
|
71
|
-
expect(result).toContain('Focus ONLY on these categories: security');
|
|
72
|
-
expect(result).not.toContain('Consider all categories');
|
|
73
|
-
});
|
|
74
|
-
it.each(['refactor', 'test', 'security', 'docs', 'perf'])('works with category "%s"', (category) => {
|
|
75
|
-
const result = buildCategoryPrompt(category, files);
|
|
76
|
-
expect(result).toContain(`Focus ONLY on these categories: ${category}`);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
//# sourceMappingURL=scout-prompt.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-prompt.test.js","sourceRoot":"","sources":["../../src/test/scout-prompt.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-runner-parse.test.d.ts","sourceRoot":"","sources":["../../src/test/scout-runner-parse.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { parseClaudeOutput } from '../scout/runner.js';
|
|
3
|
-
describe('parseClaudeOutput', () => {
|
|
4
|
-
it('parses valid JSON directly', () => {
|
|
5
|
-
const result = parseClaudeOutput('{"proposals": []}');
|
|
6
|
-
expect(result).toEqual({ proposals: [] });
|
|
7
|
-
});
|
|
8
|
-
it('extracts JSON from markdown code block', () => {
|
|
9
|
-
const input = 'Here is the result:\n```\n{"key": "value"}\n```\nDone.';
|
|
10
|
-
expect(parseClaudeOutput(input)).toEqual({ key: 'value' });
|
|
11
|
-
});
|
|
12
|
-
it('extracts JSON from ```json code block', () => {
|
|
13
|
-
const input = '```json\n{"foo": 42}\n```';
|
|
14
|
-
expect(parseClaudeOutput(input)).toEqual({ foo: 42 });
|
|
15
|
-
});
|
|
16
|
-
it('finds JSON object in mixed text', () => {
|
|
17
|
-
const input = 'Some text before\n{"found": true}\nSome text after';
|
|
18
|
-
expect(parseClaudeOutput(input)).toEqual({ found: true });
|
|
19
|
-
});
|
|
20
|
-
it('returns null for invalid JSON', () => {
|
|
21
|
-
expect(parseClaudeOutput('not json at all')).toBeNull();
|
|
22
|
-
});
|
|
23
|
-
it('returns null for empty string', () => {
|
|
24
|
-
expect(parseClaudeOutput('')).toBeNull();
|
|
25
|
-
});
|
|
26
|
-
it('handles whitespace around JSON', () => {
|
|
27
|
-
expect(parseClaudeOutput(' \n {"a": 1} \n ')).toEqual({ a: 1 });
|
|
28
|
-
});
|
|
29
|
-
it('handles nested objects', () => {
|
|
30
|
-
const input = '{"outer": {"inner": {"deep": true}}}';
|
|
31
|
-
const result = parseClaudeOutput(input);
|
|
32
|
-
expect(result?.outer.inner.deep).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
it('handles arrays', () => {
|
|
35
|
-
const input = '[1, 2, 3]';
|
|
36
|
-
expect(parseClaudeOutput(input)).toEqual([1, 2, 3]);
|
|
37
|
-
});
|
|
38
|
-
it('prefers direct parse over regex extraction', () => {
|
|
39
|
-
// Valid JSON that is also parseable - direct parse should win
|
|
40
|
-
const input = '{"direct": true}';
|
|
41
|
-
expect(parseClaudeOutput(input)).toEqual({ direct: true });
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=scout-runner-parse.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-runner-parse.test.js","sourceRoot":"","sources":["../../src/test/scout-runner-parse.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,wDAAwD,CAAC;QACvE,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,2BAA2B,CAAC;QAC1C,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,oDAAoD,CAAC;QACnE,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,sCAAsC,CAAC;QACrD,MAAM,MAAM,GAAG,iBAAiB,CAA0C,KAAK,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,KAAK,GAAG,WAAW,CAAC;QAC1B,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,8DAA8D;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC;QACjC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for scout/runner.ts - runClaude function
|
|
3
|
-
*
|
|
4
|
-
* Tests the Claude CLI invocation for scout analysis:
|
|
5
|
-
* - Successful execution
|
|
6
|
-
* - Timeout handling
|
|
7
|
-
* - Error handling
|
|
8
|
-
* - Signal propagation
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=scout-runner-spawn.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout-runner-spawn.test.d.ts","sourceRoot":"","sources":["../../src/test/scout-runner-spawn.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|