@promptwheel/core 0.6.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.
- package/dist/codebase-index/index.d.ts +23 -0
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +361 -0
- package/dist/codebase-index/index.js.map +1 -0
- package/dist/codebase-index/shared.d.ts +95 -0
- package/dist/codebase-index/shared.d.ts.map +1 -0
- package/dist/codebase-index/shared.js +319 -0
- package/dist/codebase-index/shared.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/critic/shared.d.ts +49 -0
- package/dist/critic/shared.d.ts.map +1 -0
- package/dist/critic/shared.js +204 -0
- package/dist/critic/shared.js.map +1 -0
- package/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/dedup/shared.d.ts +82 -0
- package/dist/dedup/shared.d.ts.map +1 -0
- package/dist/dedup/shared.js +215 -0
- package/dist/dedup/shared.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/formulas/shared.d.ts +42 -0
- package/dist/formulas/shared.d.ts.map +1 -0
- package/dist/formulas/shared.js +204 -0
- package/dist/formulas/shared.js.map +1 -0
- package/dist/guidelines/shared.d.ts +46 -0
- package/dist/guidelines/shared.d.ts.map +1 -0
- package/dist/guidelines/shared.js +128 -0
- package/dist/guidelines/shared.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings/shared.d.ts +112 -0
- package/dist/learnings/shared.d.ts.map +1 -0
- package/dist/learnings/shared.js +402 -0
- package/dist/learnings/shared.js.map +1 -0
- package/dist/proposals/shared.d.ts +137 -0
- package/dist/proposals/shared.d.ts.map +1 -0
- package/dist/proposals/shared.js +254 -0
- package/dist/proposals/shared.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +75 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +328 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +185 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +158 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scope/shared.d.ts +67 -0
- package/dist/scope/shared.d.ts.map +1 -0
- package/dist/scope/shared.js +355 -0
- package/dist/scope/shared.js.map +1 -0
- package/dist/scout/index.d.ts +18 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +445 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/kimi-runner.d.ts +21 -0
- package/dist/scout/kimi-runner.d.ts.map +1 -0
- package/dist/scout/kimi-runner.js +76 -0
- package/dist/scout/kimi-runner.js.map +1 -0
- package/dist/scout/mcp-batch-server.d.ts +37 -0
- package/dist/scout/mcp-batch-server.d.ts.map +1 -0
- package/dist/scout/mcp-batch-server.js +144 -0
- package/dist/scout/mcp-batch-server.js.map +1 -0
- package/dist/scout/openai-local-runner.d.ts +20 -0
- package/dist/scout/openai-local-runner.d.ts.map +1 -0
- package/dist/scout/openai-local-runner.js +82 -0
- package/dist/scout/openai-local-runner.js.map +1 -0
- package/dist/scout/prompt.d.ts +49 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +153 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +101 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +521 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +61 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +315 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +221 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/sectors/shared.d.ts +146 -0
- package/dist/sectors/shared.d.ts.map +1 -0
- package/dist/sectors/shared.js +408 -0
- package/dist/sectors/shared.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +228 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +164 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +215 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/spindle/shared.d.ts +14 -0
- package/dist/spindle/shared.d.ts.map +1 -0
- package/dist/spindle/shared.js +65 -0
- package/dist/spindle/shared.js.map +1 -0
- package/dist/tools/shared.d.ts +35 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +247 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/trace/shared.d.ts +147 -0
- package/dist/trace/shared.d.ts.map +1 -0
- package/dist/trace/shared.js +414 -0
- package/dist/trace/shared.js.map +1 -0
- package/dist/trajectory/shared.d.ts +69 -0
- package/dist/trajectory/shared.d.ts.map +1 -0
- package/dist/trajectory/shared.js +336 -0
- package/dist/trajectory/shared.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/waves/shared.d.ts +106 -0
- package/dist/waves/shared.d.ts.map +1 -0
- package/dist/waves/shared.js +356 -0
- package/dist/waves/shared.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File scanner - Discovers and reads files for analysis
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
/**
|
|
7
|
+
* Default exclusion patterns
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_EXCLUDES = [
|
|
10
|
+
'node_modules',
|
|
11
|
+
'.git',
|
|
12
|
+
'dist',
|
|
13
|
+
'build',
|
|
14
|
+
'coverage',
|
|
15
|
+
'.next',
|
|
16
|
+
'.cache',
|
|
17
|
+
'*.min.js',
|
|
18
|
+
'*.map',
|
|
19
|
+
'*.lock',
|
|
20
|
+
'package-lock.json',
|
|
21
|
+
'yarn.lock',
|
|
22
|
+
'pnpm-lock.yaml',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Check if a path matches a simple glob pattern
|
|
26
|
+
*
|
|
27
|
+
* Supports:
|
|
28
|
+
* - ** for recursive matching
|
|
29
|
+
* - * for single segment matching
|
|
30
|
+
* - Direct path matching
|
|
31
|
+
*/
|
|
32
|
+
function matchesPattern(filePath, pattern) {
|
|
33
|
+
// Normalize paths
|
|
34
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
35
|
+
const normalizedPattern = pattern.replace(/\\/g, '/');
|
|
36
|
+
// Direct match
|
|
37
|
+
if (normalizedPath === normalizedPattern) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
// Check if pattern is a directory prefix (without glob)
|
|
41
|
+
if (!normalizedPattern.includes('*') && normalizedPath.startsWith(normalizedPattern + '/')) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
// Simple glob matching
|
|
45
|
+
if (normalizedPattern.includes('*')) {
|
|
46
|
+
// Escape regex special chars except *
|
|
47
|
+
const escaped = normalizedPattern
|
|
48
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
49
|
+
// Convert glob patterns to regex
|
|
50
|
+
// Note: **/ should be optional to match files directly in the directory
|
|
51
|
+
// e.g., src/services/**/*.ts should match both src/services/auditor.ts
|
|
52
|
+
// and src/services/sub/file.ts
|
|
53
|
+
const regexPattern = escaped
|
|
54
|
+
.replace(/\*\*\//g, '<<<DOUBLESTARSLASH>>>')
|
|
55
|
+
.replace(/\*\*/g, '<<<DOUBLESTAR>>>')
|
|
56
|
+
.replace(/\*/g, '[^/]*')
|
|
57
|
+
.replace(/<<<DOUBLESTARSLASH>>>/g, '(.*\\/)?')
|
|
58
|
+
.replace(/<<<DOUBLESTAR>>>/g, '.*');
|
|
59
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
60
|
+
return regex.test(normalizedPath);
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if a path should be excluded
|
|
66
|
+
*/
|
|
67
|
+
function shouldExclude(filePath, excludePatterns) {
|
|
68
|
+
const allExcludes = [...DEFAULT_EXCLUDES, ...excludePatterns];
|
|
69
|
+
for (const pattern of allExcludes) {
|
|
70
|
+
if (matchesPattern(filePath, pattern)) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
// Also check if any path segment matches (for things like node_modules)
|
|
74
|
+
const segments = filePath.split('/');
|
|
75
|
+
if (segments.some(seg => matchesPattern(seg, pattern))) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if a file matches any include pattern
|
|
83
|
+
*/
|
|
84
|
+
function shouldInclude(filePath, includePatterns) {
|
|
85
|
+
// If no patterns specified, include source-like files
|
|
86
|
+
if (includePatterns.length === 0) {
|
|
87
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
88
|
+
return ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.java', '.rb', '.md'].includes(ext);
|
|
89
|
+
}
|
|
90
|
+
return includePatterns.some(pattern => matchesPattern(filePath, pattern));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Recursively scan directory for files
|
|
94
|
+
*/
|
|
95
|
+
function walkDir(dir, baseDir, options, files) {
|
|
96
|
+
const maxFileSize = options.maxFileSize ?? 500 * 1024; // 500KB
|
|
97
|
+
const maxFiles = options.maxFiles ?? 500;
|
|
98
|
+
if (files.length >= maxFiles) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
let entries;
|
|
102
|
+
try {
|
|
103
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return; // Skip unreadable directories
|
|
107
|
+
}
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
if (files.length >= maxFiles) {
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
const fullPath = path.join(dir, entry.name);
|
|
113
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
114
|
+
// Check exclusions first
|
|
115
|
+
if (shouldExclude(relativePath, options.exclude ?? [])) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (entry.isDirectory()) {
|
|
119
|
+
walkDir(fullPath, baseDir, options, files);
|
|
120
|
+
}
|
|
121
|
+
else if (entry.isFile()) {
|
|
122
|
+
// Check inclusion
|
|
123
|
+
if (!shouldInclude(relativePath, options.include)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Check file size
|
|
127
|
+
try {
|
|
128
|
+
const stat = fs.statSync(fullPath);
|
|
129
|
+
if (stat.size > maxFileSize) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
// Read content
|
|
133
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
134
|
+
files.push({
|
|
135
|
+
path: relativePath,
|
|
136
|
+
content,
|
|
137
|
+
size: stat.size,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Skip unreadable files
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Scan a directory for files matching the given patterns
|
|
148
|
+
*/
|
|
149
|
+
export function scanFiles(options) {
|
|
150
|
+
const files = [];
|
|
151
|
+
walkDir(options.cwd, options.cwd, options, files);
|
|
152
|
+
return files;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Group files into batches for processing
|
|
156
|
+
*/
|
|
157
|
+
export function batchFiles(files, batchSize = 3) {
|
|
158
|
+
const batches = [];
|
|
159
|
+
for (let i = 0; i < files.length; i += batchSize) {
|
|
160
|
+
batches.push(files.slice(i, i + batchSize));
|
|
161
|
+
}
|
|
162
|
+
return batches;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Estimate token count for a string (~4 chars per token)
|
|
166
|
+
*/
|
|
167
|
+
export function estimateTokens(content) {
|
|
168
|
+
return Math.ceil(content.length / 4);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Group files into batches by token budget instead of fixed count.
|
|
172
|
+
* Packs small files together; oversized files get their own batch.
|
|
173
|
+
*/
|
|
174
|
+
export function batchFilesByTokens(files, maxTokensPerBatch = 12000) {
|
|
175
|
+
const batches = [];
|
|
176
|
+
let current = [];
|
|
177
|
+
let currentTokens = 0;
|
|
178
|
+
for (const file of files) {
|
|
179
|
+
const tokens = estimateTokens(file.content);
|
|
180
|
+
// If single file exceeds budget, give it its own batch
|
|
181
|
+
if (tokens >= maxTokensPerBatch) {
|
|
182
|
+
if (current.length > 0) {
|
|
183
|
+
batches.push(current);
|
|
184
|
+
current = [];
|
|
185
|
+
currentTokens = 0;
|
|
186
|
+
}
|
|
187
|
+
batches.push([file]);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (currentTokens + tokens > maxTokensPerBatch && current.length > 0) {
|
|
191
|
+
batches.push(current);
|
|
192
|
+
current = [];
|
|
193
|
+
currentTokens = 0;
|
|
194
|
+
}
|
|
195
|
+
current.push(file);
|
|
196
|
+
currentTokens += tokens;
|
|
197
|
+
}
|
|
198
|
+
if (current.length > 0)
|
|
199
|
+
batches.push(current);
|
|
200
|
+
return batches;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Group files into batches by module boundaries, keeping related files together.
|
|
204
|
+
*
|
|
205
|
+
* Files are first assigned to their module (by longest matching directory prefix).
|
|
206
|
+
* Modules + their dependencies are packed into the same batch when they fit the token budget.
|
|
207
|
+
* Orphan files (not matching any module) are batched together at the end.
|
|
208
|
+
*/
|
|
209
|
+
export function batchFilesByModule(files, modules, maxTokensPerBatch = 12000) {
|
|
210
|
+
if (modules.length === 0) {
|
|
211
|
+
return batchFilesByTokens(files, maxTokensPerBatch);
|
|
212
|
+
}
|
|
213
|
+
// Sort modules by path length descending so longer prefixes match first
|
|
214
|
+
const sortedModules = [...modules].sort((a, b) => b.path.length - a.path.length);
|
|
215
|
+
// Assign each file to its module
|
|
216
|
+
const moduleFiles = new Map();
|
|
217
|
+
const orphans = [];
|
|
218
|
+
for (const file of files) {
|
|
219
|
+
const normalized = file.path.replace(/\\/g, '/');
|
|
220
|
+
let assigned = false;
|
|
221
|
+
for (const mod of sortedModules) {
|
|
222
|
+
const modPath = mod.path.replace(/\\/g, '/');
|
|
223
|
+
if (normalized === modPath || normalized.startsWith(modPath + '/')) {
|
|
224
|
+
const existing = moduleFiles.get(mod.path) || [];
|
|
225
|
+
existing.push(file);
|
|
226
|
+
moduleFiles.set(mod.path, existing);
|
|
227
|
+
assigned = true;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (!assigned) {
|
|
232
|
+
orphans.push(file);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Build adjacency: modules that should be batched together (via dependencies)
|
|
236
|
+
const depMap = new Map();
|
|
237
|
+
for (const mod of modules) {
|
|
238
|
+
if (!depMap.has(mod.path))
|
|
239
|
+
depMap.set(mod.path, new Set());
|
|
240
|
+
for (const dep of mod.dependencies || []) {
|
|
241
|
+
// Only link if both modules have files in this scan
|
|
242
|
+
if (moduleFiles.has(dep)) {
|
|
243
|
+
depMap.get(mod.path).add(dep);
|
|
244
|
+
if (!depMap.has(dep))
|
|
245
|
+
depMap.set(dep, new Set());
|
|
246
|
+
depMap.get(dep).add(mod.path);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Group connected modules via union-find
|
|
251
|
+
const parent = new Map();
|
|
252
|
+
const find = (x) => {
|
|
253
|
+
if (!parent.has(x))
|
|
254
|
+
parent.set(x, x);
|
|
255
|
+
if (parent.get(x) !== x)
|
|
256
|
+
parent.set(x, find(parent.get(x)));
|
|
257
|
+
return parent.get(x);
|
|
258
|
+
};
|
|
259
|
+
const union = (a, b) => {
|
|
260
|
+
parent.set(find(a), find(b));
|
|
261
|
+
};
|
|
262
|
+
for (const [mod, deps] of depMap) {
|
|
263
|
+
for (const dep of deps) {
|
|
264
|
+
union(mod, dep);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Collect module clusters
|
|
268
|
+
const clusters = new Map();
|
|
269
|
+
for (const modPath of moduleFiles.keys()) {
|
|
270
|
+
const root = find(modPath);
|
|
271
|
+
const existing = clusters.get(root) || [];
|
|
272
|
+
existing.push(modPath);
|
|
273
|
+
clusters.set(root, existing);
|
|
274
|
+
}
|
|
275
|
+
// Build batches: pack each cluster into batches respecting token budget
|
|
276
|
+
const batches = [];
|
|
277
|
+
for (const clusterMods of clusters.values()) {
|
|
278
|
+
// Collect all files from this cluster
|
|
279
|
+
const clusterFiles = [];
|
|
280
|
+
for (const mod of clusterMods) {
|
|
281
|
+
clusterFiles.push(...(moduleFiles.get(mod) || []));
|
|
282
|
+
}
|
|
283
|
+
// Pack within the cluster using token budget
|
|
284
|
+
let current = [];
|
|
285
|
+
let currentTokens = 0;
|
|
286
|
+
for (const file of clusterFiles) {
|
|
287
|
+
const tokens = estimateTokens(file.content);
|
|
288
|
+
if (tokens >= maxTokensPerBatch) {
|
|
289
|
+
if (current.length > 0) {
|
|
290
|
+
batches.push(current);
|
|
291
|
+
current = [];
|
|
292
|
+
currentTokens = 0;
|
|
293
|
+
}
|
|
294
|
+
batches.push([file]);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (currentTokens + tokens > maxTokensPerBatch && current.length > 0) {
|
|
298
|
+
batches.push(current);
|
|
299
|
+
current = [];
|
|
300
|
+
currentTokens = 0;
|
|
301
|
+
}
|
|
302
|
+
current.push(file);
|
|
303
|
+
currentTokens += tokens;
|
|
304
|
+
}
|
|
305
|
+
if (current.length > 0)
|
|
306
|
+
batches.push(current);
|
|
307
|
+
}
|
|
308
|
+
// Batch orphans
|
|
309
|
+
if (orphans.length > 0) {
|
|
310
|
+
const orphanBatches = batchFilesByTokens(orphans, maxTokensPerBatch);
|
|
311
|
+
batches.push(...orphanBatches);
|
|
312
|
+
}
|
|
313
|
+
return batches;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scout/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout types - Shared type definitions for codebase scanning
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Proposal categories
|
|
6
|
+
*/
|
|
7
|
+
export type ProposalCategory = 'refactor' | 'docs' | 'test' | 'perf' | 'security' | 'fix' | 'cleanup' | 'types';
|
|
8
|
+
/**
|
|
9
|
+
* Complexity levels
|
|
10
|
+
*/
|
|
11
|
+
export type ComplexityLevel = 'trivial' | 'simple' | 'moderate' | 'complex';
|
|
12
|
+
/**
|
|
13
|
+
* A ticket proposal generated by the scout
|
|
14
|
+
*/
|
|
15
|
+
export interface TicketProposal {
|
|
16
|
+
/** Unique ID (scout-{timestamp}-{random}) */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Category of improvement */
|
|
19
|
+
category: ProposalCategory;
|
|
20
|
+
/** Short, actionable title */
|
|
21
|
+
title: string;
|
|
22
|
+
/** What needs to be done and why */
|
|
23
|
+
description: string;
|
|
24
|
+
/** Verifiable acceptance criteria */
|
|
25
|
+
acceptance_criteria: string[];
|
|
26
|
+
/** Commands to verify the fix */
|
|
27
|
+
verification_commands: string[];
|
|
28
|
+
/** Files that can be modified */
|
|
29
|
+
allowed_paths: string[];
|
|
30
|
+
/** Specific files identified for change */
|
|
31
|
+
files: string[];
|
|
32
|
+
/** Confidence score (0-100) */
|
|
33
|
+
confidence: number;
|
|
34
|
+
/** Impact score (1-10, optional) — how much this matters */
|
|
35
|
+
impact_score?: number;
|
|
36
|
+
/** Why this improvement matters */
|
|
37
|
+
rationale: string;
|
|
38
|
+
/** Estimated complexity */
|
|
39
|
+
estimated_complexity: ComplexityLevel;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scout configuration options
|
|
43
|
+
*/
|
|
44
|
+
export interface ScoutOptions {
|
|
45
|
+
/** Glob pattern for files to scan (e.g., "src/**") */
|
|
46
|
+
scope: string;
|
|
47
|
+
/** Filter to specific categories */
|
|
48
|
+
types?: ProposalCategory[];
|
|
49
|
+
/** Categories to exclude */
|
|
50
|
+
excludeTypes?: ProposalCategory[];
|
|
51
|
+
/** Glob patterns to exclude */
|
|
52
|
+
exclude?: string[];
|
|
53
|
+
/** Maximum proposals to generate (default: 10) */
|
|
54
|
+
maxProposals?: number;
|
|
55
|
+
/** Minimum confidence threshold (default: 50) */
|
|
56
|
+
minConfidence?: number;
|
|
57
|
+
/** Working directory (default: cwd) */
|
|
58
|
+
projectPath?: string;
|
|
59
|
+
/** Timeout per batch in ms (default: 120000) */
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
/** Cancellation signal */
|
|
62
|
+
signal?: AbortSignal;
|
|
63
|
+
/** Progress callback */
|
|
64
|
+
onProgress?: (progress: ScoutProgress) => void;
|
|
65
|
+
/** Raw output streaming callback (per-batch stdout/stderr) */
|
|
66
|
+
onRawOutput?: (batchIndex: number, chunk: string) => void;
|
|
67
|
+
/** Recently completed ticket titles to avoid duplicates */
|
|
68
|
+
recentlyCompletedTitles?: string[];
|
|
69
|
+
/** Model to use (default: opus) */
|
|
70
|
+
model?: 'haiku' | 'sonnet' | 'opus';
|
|
71
|
+
/** Custom prompt from formula — tells the AI what to focus on */
|
|
72
|
+
customPrompt?: string;
|
|
73
|
+
/** Scout backend to use (default: ClaudeScoutBackend) */
|
|
74
|
+
backend?: import('./runner.js').ScoutBackend;
|
|
75
|
+
/** Files the scout can read but must NOT propose changes to */
|
|
76
|
+
protectedFiles?: string[];
|
|
77
|
+
/** Token budget per batch (default: auto based on backend) */
|
|
78
|
+
batchTokenBudget?: number;
|
|
79
|
+
/** Maximum files to scan per cycle (default: 60) */
|
|
80
|
+
maxFiles?: number;
|
|
81
|
+
/** Max parallel scout batches (default: auto — 4 for codex, 3 for claude) */
|
|
82
|
+
scoutConcurrency?: number;
|
|
83
|
+
/** Module groups for dependency-aware batching. When provided, files are grouped by module instead of arbitrary token packing. */
|
|
84
|
+
moduleGroups?: import('./scanner.js').ModuleGroup[];
|
|
85
|
+
/** Coverage context passed through to the scout prompt */
|
|
86
|
+
coverageContext?: {
|
|
87
|
+
sectorPath: string;
|
|
88
|
+
scannedSectors: number;
|
|
89
|
+
totalSectors: number;
|
|
90
|
+
percent: number;
|
|
91
|
+
sectorPercent: number;
|
|
92
|
+
classificationConfidence: string;
|
|
93
|
+
scanCount: number;
|
|
94
|
+
proposalYield: number;
|
|
95
|
+
sectorSummary?: string;
|
|
96
|
+
sectorDifficulty?: 'easy' | 'moderate' | 'hard';
|
|
97
|
+
sectorCategoryAffinity?: {
|
|
98
|
+
boost: string[];
|
|
99
|
+
suppress: string[];
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Progress update during scanning
|
|
105
|
+
*/
|
|
106
|
+
export interface BatchStatus {
|
|
107
|
+
index: number;
|
|
108
|
+
status: 'waiting' | 'running' | 'done' | 'failed';
|
|
109
|
+
proposals?: number;
|
|
110
|
+
startedAt?: number;
|
|
111
|
+
durationMs?: number;
|
|
112
|
+
error?: string;
|
|
113
|
+
}
|
|
114
|
+
export interface ScoutProgress {
|
|
115
|
+
/** Current phase */
|
|
116
|
+
phase: 'discovering' | 'analyzing' | 'generating' | 'complete';
|
|
117
|
+
/** Files scanned so far */
|
|
118
|
+
filesScanned: number;
|
|
119
|
+
/** Total files to scan */
|
|
120
|
+
totalFiles: number;
|
|
121
|
+
/** Proposals found so far */
|
|
122
|
+
proposalsFound: number;
|
|
123
|
+
/** Current batch number */
|
|
124
|
+
currentBatch: number;
|
|
125
|
+
/** Total batches */
|
|
126
|
+
totalBatches: number;
|
|
127
|
+
/** Current file being processed */
|
|
128
|
+
currentFile?: string;
|
|
129
|
+
/** Per-batch status for multi-line display */
|
|
130
|
+
batchStatuses?: BatchStatus[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Scout result
|
|
134
|
+
*/
|
|
135
|
+
export interface ScoutResult {
|
|
136
|
+
/** Whether the scan completed successfully */
|
|
137
|
+
success: boolean;
|
|
138
|
+
/** Generated proposals */
|
|
139
|
+
proposals: TicketProposal[];
|
|
140
|
+
/** Any errors encountered */
|
|
141
|
+
errors: string[];
|
|
142
|
+
/** Total files scanned */
|
|
143
|
+
scannedFiles: number;
|
|
144
|
+
/** Total scan duration in ms */
|
|
145
|
+
scanDurationMs: number;
|
|
146
|
+
/** Sector reclassification suggested by the LLM */
|
|
147
|
+
sectorReclassification?: {
|
|
148
|
+
production?: boolean;
|
|
149
|
+
confidence?: string;
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Schema for validating LLM output
|
|
154
|
+
*/
|
|
155
|
+
export declare const PROPOSAL_SCHEMA: {
|
|
156
|
+
readonly type: "object";
|
|
157
|
+
readonly properties: {
|
|
158
|
+
readonly proposals: {
|
|
159
|
+
readonly type: "array";
|
|
160
|
+
readonly items: {
|
|
161
|
+
readonly type: "object";
|
|
162
|
+
readonly required: readonly ["category", "title", "description", "acceptance_criteria", "verification_commands", "allowed_paths", "files", "confidence", "rationale", "estimated_complexity"];
|
|
163
|
+
readonly properties: {
|
|
164
|
+
readonly category: {
|
|
165
|
+
readonly type: "string";
|
|
166
|
+
readonly enum: readonly ["refactor", "docs", "test", "perf", "security", "fix", "cleanup", "types"];
|
|
167
|
+
};
|
|
168
|
+
readonly title: {
|
|
169
|
+
readonly type: "string";
|
|
170
|
+
};
|
|
171
|
+
readonly description: {
|
|
172
|
+
readonly type: "string";
|
|
173
|
+
};
|
|
174
|
+
readonly acceptance_criteria: {
|
|
175
|
+
readonly type: "array";
|
|
176
|
+
readonly items: {
|
|
177
|
+
readonly type: "string";
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
readonly verification_commands: {
|
|
181
|
+
readonly type: "array";
|
|
182
|
+
readonly items: {
|
|
183
|
+
readonly type: "string";
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
readonly allowed_paths: {
|
|
187
|
+
readonly type: "array";
|
|
188
|
+
readonly items: {
|
|
189
|
+
readonly type: "string";
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
readonly files: {
|
|
193
|
+
readonly type: "array";
|
|
194
|
+
readonly items: {
|
|
195
|
+
readonly type: "string";
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
readonly confidence: {
|
|
199
|
+
readonly type: "number";
|
|
200
|
+
readonly minimum: 0;
|
|
201
|
+
readonly maximum: 100;
|
|
202
|
+
};
|
|
203
|
+
readonly impact_score: {
|
|
204
|
+
readonly type: "number";
|
|
205
|
+
readonly minimum: 1;
|
|
206
|
+
readonly maximum: 10;
|
|
207
|
+
};
|
|
208
|
+
readonly rationale: {
|
|
209
|
+
readonly type: "string";
|
|
210
|
+
};
|
|
211
|
+
readonly estimated_complexity: {
|
|
212
|
+
readonly type: "string";
|
|
213
|
+
readonly enum: readonly ["trivial", "simple", "moderate", "complex"];
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
readonly required: readonly ["proposals"];
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scout/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout types - Shared type definitions for codebase scanning
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Schema for validating LLM output
|
|
6
|
+
*/
|
|
7
|
+
export const PROPOSAL_SCHEMA = {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
proposals: {
|
|
11
|
+
type: 'array',
|
|
12
|
+
items: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
required: [
|
|
15
|
+
'category',
|
|
16
|
+
'title',
|
|
17
|
+
'description',
|
|
18
|
+
'acceptance_criteria',
|
|
19
|
+
'verification_commands',
|
|
20
|
+
'allowed_paths',
|
|
21
|
+
'files',
|
|
22
|
+
'confidence',
|
|
23
|
+
'rationale',
|
|
24
|
+
'estimated_complexity',
|
|
25
|
+
],
|
|
26
|
+
properties: {
|
|
27
|
+
category: { type: 'string', enum: ['refactor', 'docs', 'test', 'perf', 'security', 'fix', 'cleanup', 'types'] },
|
|
28
|
+
title: { type: 'string' },
|
|
29
|
+
description: { type: 'string' },
|
|
30
|
+
acceptance_criteria: { type: 'array', items: { type: 'string' } },
|
|
31
|
+
verification_commands: { type: 'array', items: { type: 'string' } },
|
|
32
|
+
allowed_paths: { type: 'array', items: { type: 'string' } },
|
|
33
|
+
files: { type: 'array', items: { type: 'string' } },
|
|
34
|
+
confidence: { type: 'number', minimum: 0, maximum: 100 },
|
|
35
|
+
impact_score: { type: 'number', minimum: 1, maximum: 10 },
|
|
36
|
+
rationale: { type: 'string' },
|
|
37
|
+
estimated_complexity: { type: 'string', enum: ['trivial', 'simple', 'moderate', 'complex'] },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ['proposals'],
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scout/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuJH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE;oBACR,UAAU;oBACV,OAAO;oBACP,aAAa;oBACb,qBAAqB;oBACrB,uBAAuB;oBACvB,eAAe;oBACf,OAAO;oBACP,YAAY;oBACZ,WAAW;oBACX,sBAAsB;iBACvB;gBACD,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;oBAC/G,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC/B,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACjE,qBAAqB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACnE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBAC3D,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACnD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;oBACxD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;oBACzD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC7B,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;iBAC7F;aACF;SACF;KACF;IACD,QAAQ,EAAE,CAAC,WAAW,CAAC;CACf,CAAC"}
|