@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.
Files changed (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. package/package.json +126 -0
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Scout service - Analyzes codebases and generates improvement proposals
3
+ *
4
+ * This is the core scout implementation that works with any DatabaseAdapter.
5
+ */
6
+ import { nanoid } from '../utils/id.js';
7
+ import { buildScoutPrompt } from './prompt.js';
8
+ import { parseClaudeOutput, ClaudeScoutBackend } from './runner.js';
9
+ import { scanFiles, batchFilesByTokens, batchFilesByModule } from './scanner.js';
10
+ export * from './types.js';
11
+ export { buildScoutPrompt, buildCategoryPrompt } from './prompt.js';
12
+ export { runClaude, parseClaudeOutput, ClaudeScoutBackend, CodexScoutBackend, CodexMcpScoutBackend } from './runner.js';
13
+ export { KimiScoutBackend } from './kimi-runner.js';
14
+ export { OpenAILocalScoutBackend } from './openai-local-runner.js';
15
+ export { McpBatchServer } from './mcp-batch-server.js';
16
+ export { scanFiles, batchFiles, batchFilesByTokens, batchFilesByModule, estimateTokens } from './scanner.js';
17
+ /**
18
+ * Default verification commands — used only when the scout returns none.
19
+ */
20
+ const DEFAULT_VERIFICATION_COMMANDS = [];
21
+ /**
22
+ * Expand allowed paths for test proposals to include test file locations
23
+ *
24
+ * When a proposal is about adding tests, we need to allow:
25
+ * 1. The original source file(s)
26
+ * 2. Corresponding test files (e.g., foo.ts -> foo.test.ts, foo.spec.ts)
27
+ * 3. Test directories (e.g., __tests__/, test/, tests/)
28
+ * 4. Config files (vitest.config.ts, jest.config.js, tsconfig.json)
29
+ */
30
+ function expandPathsForTests(paths) {
31
+ const expanded = new Set(paths);
32
+ for (const filePath of paths) {
33
+ // Skip if already a test file
34
+ if (filePath.includes('.test.') || filePath.includes('.spec.') || filePath.includes('__tests__')) {
35
+ continue;
36
+ }
37
+ // Get directory and filename parts
38
+ const lastSlash = filePath.lastIndexOf('/');
39
+ const dir = lastSlash >= 0 ? filePath.slice(0, lastSlash) : '';
40
+ const filename = lastSlash >= 0 ? filePath.slice(lastSlash + 1) : filePath;
41
+ // Get extension and base name
42
+ const lastDot = filename.lastIndexOf('.');
43
+ const ext = lastDot >= 0 ? filename.slice(lastDot) : '';
44
+ const baseName = lastDot >= 0 ? filename.slice(0, lastDot) : filename;
45
+ // Add common test file patterns
46
+ // 1. Same directory: foo.test.ts, foo.spec.ts (with multiple extensions)
47
+ const testExts = [ext, '.ts', '.js', '.tsx', '.jsx'];
48
+ const uniqueExts = [...new Set(testExts)];
49
+ for (const testExt of uniqueExts) {
50
+ if (dir) {
51
+ expanded.add(`${dir}/${baseName}.test${testExt}`);
52
+ expanded.add(`${dir}/${baseName}.spec${testExt}`);
53
+ }
54
+ else {
55
+ expanded.add(`${baseName}.test${testExt}`);
56
+ expanded.add(`${baseName}.spec${testExt}`);
57
+ }
58
+ }
59
+ // 2. Adjacent __tests__ directory (comprehensive patterns)
60
+ if (dir) {
61
+ for (const testExt of uniqueExts) {
62
+ expanded.add(`${dir}/__tests__/${baseName}.test${testExt}`);
63
+ expanded.add(`${dir}/__tests__/${baseName}.spec${testExt}`);
64
+ expanded.add(`${dir}/__tests__/${baseName}${testExt}`);
65
+ }
66
+ }
67
+ // Root-level __tests__ directory
68
+ for (const testExt of uniqueExts) {
69
+ expanded.add(`__tests__/${baseName}.test${testExt}`);
70
+ expanded.add(`__tests__/${baseName}.spec${testExt}`);
71
+ expanded.add(`__tests__/${baseName}${testExt}`);
72
+ }
73
+ // 3. Project root test/ and tests/ directories
74
+ for (const testExt of uniqueExts) {
75
+ expanded.add(`test/${baseName}.test${testExt}`);
76
+ expanded.add(`test/${baseName}.spec${testExt}`);
77
+ expanded.add(`test/${baseName}${testExt}`);
78
+ expanded.add(`tests/${baseName}.test${testExt}`);
79
+ expanded.add(`tests/${baseName}.spec${testExt}`);
80
+ expanded.add(`tests/${baseName}${testExt}`);
81
+ }
82
+ // 4. For src/ files, also allow mirrored structure in test directories
83
+ if (dir.startsWith('src/')) {
84
+ const relPath = dir.slice(4); // Remove 'src/'
85
+ for (const testExt of uniqueExts) {
86
+ // test/path/to/foo.test.ts
87
+ expanded.add(`test/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
88
+ expanded.add(`test/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
89
+ expanded.add(`test/${relPath ? relPath + '/' : ''}${baseName}${testExt}`);
90
+ // tests/path/to/foo.test.ts
91
+ expanded.add(`tests/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
92
+ expanded.add(`tests/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
93
+ expanded.add(`tests/${relPath ? relPath + '/' : ''}${baseName}${testExt}`);
94
+ // src/test/path/to/foo.test.ts (for projects that use src/test)
95
+ expanded.add(`src/test/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
96
+ expanded.add(`src/test/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
97
+ }
98
+ }
99
+ // 5. For packages/*/src/ files, allow test directories within the package
100
+ const packageMatch = dir.match(/^(packages\/[^/]+)\/(src\/)?(.*)$/);
101
+ if (packageMatch) {
102
+ const [, packageDir, , relPath] = packageMatch;
103
+ for (const testExt of uniqueExts) {
104
+ // packages/foo/test/bar.test.ts
105
+ expanded.add(`${packageDir}/test/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
106
+ expanded.add(`${packageDir}/test/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
107
+ expanded.add(`${packageDir}/tests/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
108
+ expanded.add(`${packageDir}/tests/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
109
+ // packages/foo/__tests__/bar.test.ts
110
+ expanded.add(`${packageDir}/__tests__/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
111
+ expanded.add(`${packageDir}/__tests__/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
112
+ // packages/foo/src/__tests__/bar.test.ts
113
+ expanded.add(`${packageDir}/src/__tests__/${relPath ? relPath + '/' : ''}${baseName}.test${testExt}`);
114
+ expanded.add(`${packageDir}/src/__tests__/${relPath ? relPath + '/' : ''}${baseName}.spec${testExt}`);
115
+ }
116
+ }
117
+ }
118
+ return Array.from(expanded);
119
+ }
120
+ /**
121
+ * Validate and normalize a proposal
122
+ */
123
+ function normalizeProposal(raw, category) {
124
+ try {
125
+ const proposal = raw;
126
+ // Validate required fields
127
+ if (!proposal.category || !proposal.title || !proposal.description) {
128
+ return null;
129
+ }
130
+ // Validate category (case-insensitive — LLMs sometimes emit "Refactor" or "SECURITY")
131
+ const validCategories = ['refactor', 'docs', 'test', 'perf', 'security', 'fix', 'cleanup', 'types'];
132
+ const rawCategory = String(proposal.category || '').toLowerCase();
133
+ if (!validCategories.includes(rawCategory)) {
134
+ return null;
135
+ }
136
+ proposal.category = rawCategory;
137
+ // Filter by category if specified
138
+ if (category && proposal.category !== category) {
139
+ return null;
140
+ }
141
+ // Ensure arrays
142
+ proposal.acceptance_criteria = Array.isArray(proposal.acceptance_criteria)
143
+ ? proposal.acceptance_criteria
144
+ : [];
145
+ proposal.verification_commands = Array.isArray(proposal.verification_commands)
146
+ ? proposal.verification_commands
147
+ : [];
148
+ proposal.allowed_paths = Array.isArray(proposal.allowed_paths)
149
+ ? proposal.allowed_paths
150
+ : [];
151
+ proposal.files = Array.isArray(proposal.files)
152
+ ? proposal.files
153
+ : [];
154
+ // Validate minimum requirements
155
+ if (proposal.acceptance_criteria.length === 0) {
156
+ proposal.acceptance_criteria = ['Implementation verified by tests'];
157
+ }
158
+ // Ensure at least default verification commands
159
+ if (proposal.verification_commands.length === 0) {
160
+ proposal.verification_commands = [...DEFAULT_VERIFICATION_COMMANDS];
161
+ }
162
+ // Ensure allowed_paths
163
+ if (proposal.allowed_paths.length === 0 && proposal.files.length > 0) {
164
+ proposal.allowed_paths = [...proposal.files];
165
+ }
166
+ // For test proposals, expand allowed_paths to include test file locations
167
+ // Combine files and allowed_paths since LLM may list source files in 'files' but test files in 'allowed_paths'
168
+ if (proposal.category === 'test') {
169
+ const allPaths = [...new Set([...proposal.allowed_paths, ...proposal.files])];
170
+ proposal.allowed_paths = expandPathsForTests(allPaths);
171
+ // Always allow config files for test tickets
172
+ const configFiles = [
173
+ 'package.json',
174
+ 'package-lock.json',
175
+ 'tsconfig.json',
176
+ 'vitest.config.ts',
177
+ 'vitest.config.js',
178
+ 'vitest.config.mts',
179
+ 'vitest.config.mjs',
180
+ 'jest.config.ts',
181
+ 'jest.config.js',
182
+ 'jest.config.mjs',
183
+ 'jest.config.json',
184
+ ];
185
+ for (const configFile of configFiles) {
186
+ if (!proposal.allowed_paths.includes(configFile)) {
187
+ proposal.allowed_paths.push(configFile);
188
+ }
189
+ }
190
+ }
191
+ // Generate ID
192
+ proposal.id = `scout-${Date.now()}-${nanoid(6)}`;
193
+ // Normalize confidence
194
+ proposal.confidence = Math.max(0, Math.min(100, proposal.confidence || 50));
195
+ // Normalize impact_score (optional, 1-10)
196
+ if (proposal.impact_score !== null && proposal.impact_score !== undefined) {
197
+ proposal.impact_score = Math.max(1, Math.min(10, proposal.impact_score));
198
+ }
199
+ // Validate complexity
200
+ const validComplexities = ['trivial', 'simple', 'moderate', 'complex'];
201
+ if (!validComplexities.includes(proposal.estimated_complexity)) {
202
+ proposal.estimated_complexity = 'simple';
203
+ }
204
+ return proposal;
205
+ }
206
+ catch (err) {
207
+ if (process.env.PROMPTWHEEL_VERBOSE) {
208
+ console.error(`normalizeProposal failed: ${err instanceof Error ? err.message : err}`);
209
+ }
210
+ return null;
211
+ }
212
+ }
213
+ /**
214
+ * Scout a codebase for improvement opportunities
215
+ */
216
+ export async function scout(options) {
217
+ const { scope, types, excludeTypes, exclude = [], maxProposals = 10, minConfidence = 50, projectPath = process.cwd(), timeoutMs: userTimeoutMs, signal, onProgress, recentlyCompletedTitles, model, customPrompt, backend, protectedFiles, scoutConcurrency, coverageContext, } = options;
218
+ const scoutBackend = backend ?? new ClaudeScoutBackend();
219
+ // Codex needs more time per batch: cold start + large token-packed batches
220
+ const defaultTimeout = scoutBackend.name === 'codex' ? 600000 : 120000;
221
+ const timeoutMs = userTimeoutMs ?? defaultTimeout;
222
+ const startTime = Date.now();
223
+ const errors = [];
224
+ const proposals = [];
225
+ // Report progress
226
+ const report = (progress) => {
227
+ onProgress?.({
228
+ phase: 'discovering',
229
+ filesScanned: 0,
230
+ totalFiles: 0,
231
+ proposalsFound: 0,
232
+ currentBatch: 0,
233
+ totalBatches: 0,
234
+ ...progress,
235
+ });
236
+ };
237
+ try {
238
+ // Phase 1: Discover files
239
+ report({ phase: 'discovering' });
240
+ const files = scanFiles({
241
+ cwd: projectPath,
242
+ include: [scope],
243
+ exclude,
244
+ maxFiles: options.maxFiles ?? 60,
245
+ });
246
+ if (files.length === 0) {
247
+ return {
248
+ success: true,
249
+ proposals: [],
250
+ errors: ['No files found matching scope'],
251
+ scannedFiles: 0,
252
+ scanDurationMs: Date.now() - startTime,
253
+ };
254
+ }
255
+ report({
256
+ phase: 'analyzing',
257
+ totalFiles: files.length,
258
+ });
259
+ // Phase 2: Batch files and analyze
260
+ const backendName = scoutBackend.name;
261
+ const defaultBudget = backendName === 'codex' ? 20000 : 10000;
262
+ const budget = options.batchTokenBudget ?? defaultBudget;
263
+ const batches = options.moduleGroups?.length
264
+ ? batchFilesByModule(files, options.moduleGroups, budget)
265
+ : batchFilesByTokens(files, budget);
266
+ const maxBatches = Math.min(batches.length, 50); // Cap at 50 batches
267
+ // Track last-seen sector reclassification across batches
268
+ let lastSectorReclassification;
269
+ // Helper to process a single batch result
270
+ const processBatchResult = (result, batchIndex) => {
271
+ if (!result.success) {
272
+ errors.push(`Batch ${batchIndex + 1} failed: ${result.error}`);
273
+ return;
274
+ }
275
+ const parsed = parseClaudeOutput(result.output);
276
+ // Capture sector reclassification if present
277
+ if (parsed?.sector_reclassification) {
278
+ lastSectorReclassification = parsed.sector_reclassification;
279
+ }
280
+ if (!parsed?.proposals) {
281
+ errors.push(`Batch ${batchIndex + 1}: Failed to parse output`);
282
+ return;
283
+ }
284
+ for (const raw of parsed.proposals) {
285
+ const proposal = normalizeProposal(raw);
286
+ if (!proposal)
287
+ continue;
288
+ if (types?.length && !types.includes(proposal.category))
289
+ continue;
290
+ if (excludeTypes?.length && excludeTypes.includes(proposal.category))
291
+ continue;
292
+ if (proposal.confidence < minConfidence)
293
+ continue;
294
+ const isDuplicate = proposals.some(p => p.title.toLowerCase() === proposal.title.toLowerCase());
295
+ if (isDuplicate)
296
+ continue;
297
+ proposals.push(proposal);
298
+ if (proposals.length >= maxProposals)
299
+ break;
300
+ }
301
+ };
302
+ // Build all prompts upfront
303
+ const batchSlice = batches.slice(0, maxBatches);
304
+ const allPrompts = batchSlice.map(batch => buildScoutPrompt({
305
+ files: batch.map(f => ({ path: f.path, content: f.content })),
306
+ scope,
307
+ types,
308
+ excludeTypes,
309
+ maxProposals: Math.min(10, maxProposals),
310
+ minConfidence,
311
+ recentlyCompletedTitles,
312
+ customPrompt,
313
+ protectedFiles,
314
+ coverageContext,
315
+ }));
316
+ // Optimization 2 path: if backend supports runAll(), use single session
317
+ if (scoutBackend.runAll) {
318
+ let filesProcessed = 0;
319
+ for (const batch of batchSlice)
320
+ filesProcessed += batch.length;
321
+ report({
322
+ phase: 'analyzing',
323
+ filesScanned: filesProcessed,
324
+ totalFiles: files.length,
325
+ proposalsFound: 0,
326
+ currentBatch: 1,
327
+ totalBatches: maxBatches,
328
+ });
329
+ const allOptions = allPrompts.map((prompt, i) => ({
330
+ prompt, cwd: projectPath, timeoutMs, model, signal,
331
+ onRawOutput: options.onRawOutput ? (chunk) => options.onRawOutput(i, chunk) : undefined,
332
+ }));
333
+ const results = await scoutBackend.runAll(allOptions);
334
+ for (let i = 0; i < results.length; i++) {
335
+ processBatchResult(results[i], i);
336
+ }
337
+ }
338
+ else {
339
+ // Optimization 1: parallel semaphore-gated batch loop
340
+ const concurrency = scoutConcurrency ?? (scoutBackend.name === 'codex' ? 4 : 3);
341
+ let permits = concurrency;
342
+ const waiting = [];
343
+ const acquire = async () => {
344
+ if (permits > 0) {
345
+ permits--;
346
+ return;
347
+ }
348
+ return new Promise(r => { waiting.push(r); });
349
+ };
350
+ const release = () => {
351
+ if (waiting.length > 0)
352
+ waiting.shift()();
353
+ else
354
+ permits++;
355
+ };
356
+ // Pre-compute cumulative file counts per batch for accurate progress
357
+ const cumulativeFiles = [];
358
+ let cumSum = 0;
359
+ for (const batch of batchSlice) {
360
+ cumSum += batch.length;
361
+ cumulativeFiles.push(cumSum);
362
+ }
363
+ let batchesCompleted = 0;
364
+ // Per-batch status tracking for multi-line display
365
+ const batchStatuses = batchSlice.map((_, i) => ({ index: i, status: 'waiting' }));
366
+ const emitProgress = () => {
367
+ report({
368
+ phase: 'analyzing',
369
+ filesScanned: cumulativeFiles[Math.min(batchesCompleted, batchSlice.length - 1)] ?? 0,
370
+ totalFiles: files.length,
371
+ proposalsFound: proposals.length,
372
+ batchStatuses: [...batchStatuses],
373
+ totalBatches: maxBatches,
374
+ });
375
+ };
376
+ emitProgress();
377
+ const tasks = batchSlice.map(async (batch, i) => {
378
+ await acquire();
379
+ try {
380
+ if (signal?.aborted || proposals.length >= maxProposals)
381
+ return;
382
+ batchStatuses[i] = { index: i, status: 'running', startedAt: Date.now() };
383
+ emitProgress();
384
+ const result = await scoutBackend.run({
385
+ prompt: allPrompts[i],
386
+ cwd: projectPath,
387
+ timeoutMs,
388
+ model,
389
+ signal,
390
+ onRawOutput: options.onRawOutput ? (chunk) => options.onRawOutput(i, chunk) : undefined,
391
+ });
392
+ // JS is single-threaded between awaits — safe to mutate proposals
393
+ const beforeCount = proposals.length;
394
+ batchesCompleted++;
395
+ processBatchResult(result, i);
396
+ const batchProposals = proposals.length - beforeCount;
397
+ if (result.success) {
398
+ batchStatuses[i] = { index: i, status: 'done', proposals: batchProposals, durationMs: Date.now() - (batchStatuses[i].startedAt ?? Date.now()) };
399
+ }
400
+ else {
401
+ batchStatuses[i] = { index: i, status: 'failed', error: result.error, durationMs: Date.now() - (batchStatuses[i].startedAt ?? Date.now()) };
402
+ }
403
+ emitProgress();
404
+ }
405
+ finally {
406
+ release();
407
+ }
408
+ });
409
+ await Promise.allSettled(tasks);
410
+ }
411
+ // Sort proposals by impact * confidence (descending)
412
+ proposals.sort((a, b) => {
413
+ const scoreA = (a.impact_score ?? 5) * a.confidence;
414
+ const scoreB = (b.impact_score ?? 5) * b.confidence;
415
+ return scoreB - scoreA;
416
+ });
417
+ // Phase 3: Complete
418
+ report({
419
+ phase: 'complete',
420
+ filesScanned: files.length,
421
+ totalFiles: files.length,
422
+ proposalsFound: proposals.length,
423
+ currentBatch: maxBatches,
424
+ totalBatches: maxBatches,
425
+ });
426
+ return {
427
+ success: true,
428
+ proposals,
429
+ errors,
430
+ scannedFiles: files.length,
431
+ scanDurationMs: Date.now() - startTime,
432
+ sectorReclassification: lastSectorReclassification,
433
+ };
434
+ }
435
+ catch (error) {
436
+ return {
437
+ success: false,
438
+ proposals,
439
+ errors: [...errors, error instanceof Error ? error.message : String(error)],
440
+ scannedFiles: 0,
441
+ scanDurationMs: Date.now() - startTime,
442
+ };
443
+ }
444
+ }
445
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scout/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Kimi CLI scout backend
3
+ *
4
+ * Spawns `kimi --print -p <prompt> --model <model>` with cwd.
5
+ * Collects stdout, extracts JSON using parseClaudeOutput.
6
+ *
7
+ * --print auto-enables --yolo (no confirmation prompts).
8
+ * No --output-schema or --output-last-message — output is on stdout.
9
+ */
10
+ import type { ScoutBackend, RunnerOptions, RunnerResult } from './runner.js';
11
+ export declare class KimiScoutBackend implements ScoutBackend {
12
+ readonly name = "kimi";
13
+ private apiKey?;
14
+ private defaultModel;
15
+ constructor(opts?: {
16
+ apiKey?: string;
17
+ model?: string;
18
+ });
19
+ run(options: RunnerOptions): Promise<RunnerResult>;
20
+ }
21
+ //# sourceMappingURL=kimi-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi-runner.d.ts","sourceRoot":"","sources":["../../src/scout/kimi-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7E,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAKhD,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAsEzD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Kimi CLI scout backend
3
+ *
4
+ * Spawns `kimi --print -p <prompt> --model <model>` with cwd.
5
+ * Collects stdout, extracts JSON using parseClaudeOutput.
6
+ *
7
+ * --print auto-enables --yolo (no confirmation prompts).
8
+ * No --output-schema or --output-last-message — output is on stdout.
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ export class KimiScoutBackend {
12
+ name = 'kimi';
13
+ apiKey;
14
+ defaultModel;
15
+ constructor(opts) {
16
+ this.apiKey = opts?.apiKey;
17
+ this.defaultModel = opts?.model ?? 'kimi-k2.5';
18
+ }
19
+ async run(options) {
20
+ const { prompt, cwd, timeoutMs, model, signal } = options;
21
+ const start = Date.now();
22
+ if (signal?.aborted) {
23
+ return { success: false, output: '', error: 'Aborted before start', durationMs: 0 };
24
+ }
25
+ const effectiveModel = model ?? this.defaultModel;
26
+ const args = [
27
+ '--print',
28
+ '-p', prompt,
29
+ '--model', effectiveModel,
30
+ '--output-format', 'stream-json',
31
+ ];
32
+ const env = { ...process.env };
33
+ if (this.apiKey) {
34
+ env.MOONSHOT_API_KEY = this.apiKey;
35
+ }
36
+ return new Promise((resolve) => {
37
+ const proc = spawn('kimi', args, {
38
+ cwd,
39
+ env,
40
+ stdio: ['ignore', 'pipe', 'pipe'],
41
+ });
42
+ let stdout = '';
43
+ let stderr = '';
44
+ let killed = false;
45
+ const timeout = setTimeout(() => {
46
+ killed = true;
47
+ proc.kill('SIGTERM');
48
+ setTimeout(() => proc.kill('SIGKILL'), 5000);
49
+ }, timeoutMs);
50
+ const abortHandler = () => { killed = true; proc.kill('SIGTERM'); };
51
+ signal?.addEventListener('abort', abortHandler);
52
+ proc.stdout.on('data', (d) => { stdout += d.toString(); });
53
+ proc.stderr.on('data', (d) => { stderr += d.toString(); });
54
+ proc.on('close', (code) => {
55
+ clearTimeout(timeout);
56
+ signal?.removeEventListener('abort', abortHandler);
57
+ const durationMs = Date.now() - start;
58
+ if (killed) {
59
+ resolve({ success: false, output: stdout, error: signal?.aborted ? 'Aborted by signal' : 'Timeout exceeded', durationMs });
60
+ return;
61
+ }
62
+ if (code !== 0) {
63
+ resolve({ success: false, output: stdout, error: stderr || `kimi exited with code ${code}`, durationMs });
64
+ return;
65
+ }
66
+ resolve({ success: true, output: stdout, durationMs });
67
+ });
68
+ proc.on('error', (err) => {
69
+ clearTimeout(timeout);
70
+ signal?.removeEventListener('abort', abortHandler);
71
+ resolve({ success: false, output: '', error: err.message, durationMs: Date.now() - start });
72
+ });
73
+ });
74
+ }
75
+ }
76
+ //# sourceMappingURL=kimi-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi-runner.js","sourceRoot":"","sources":["../../src/scout/kimi-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,MAAM,CAAC;IACf,MAAM,CAAU;IAChB,YAAY,CAAS;IAE7B,YAAY,IAA0C;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,KAAK,IAAI,WAAW,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAsB;QAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtF,CAAC;QAED,MAAM,cAAc,GAAG,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAElD,MAAM,IAAI,GAAG;YACX,SAAS;YACT,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,cAAc;YACzB,iBAAiB,EAAE,aAAa;SACjC,CAAC;QAEF,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B,CAAC;QACjF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC/B,GAAG;gBACH,GAAG;gBACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,KAAK,CAAC;YAEnB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBAEtC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC3H,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,yBAAyB,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC1G,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACnD,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * MCP Batch Server for persistent Codex sessions
3
+ *
4
+ * A lightweight stdio MCP server that exposes batch analysis tools.
5
+ * Codex connects to this server and loops: get_next_batch → analyze → submit_results.
6
+ *
7
+ * Usage:
8
+ * node dist/scout/mcp-batch-server.js --data <path-to-json>
9
+ *
10
+ * The JSON file contains an array of batch prompt strings.
11
+ */
12
+ export interface McpBatchServerOptions {
13
+ /** Pre-built batch prompts */
14
+ batchPrompts: string[];
15
+ }
16
+ /**
17
+ * MCP server that serves batches to a Codex session.
18
+ *
19
+ * Tools exposed:
20
+ * - get_next_batch: Returns { batchId, prompt } or { done: true }
21
+ * - submit_results: Accepts { batchId, output }
22
+ * - signal_done: Confirms all batches processed
23
+ */
24
+ export declare class McpBatchServer {
25
+ private batches;
26
+ private cursor;
27
+ private results;
28
+ private doneResolve?;
29
+ private server;
30
+ constructor(opts: McpBatchServerOptions);
31
+ /**
32
+ * Start the MCP server on stdio.
33
+ * Returns a promise that resolves with collected results when signal_done is called.
34
+ */
35
+ start(): Promise<Map<number, string>>;
36
+ }
37
+ //# sourceMappingURL=mcp-batch-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-batch-server.d.ts","sourceRoot":"","sources":["../../src/scout/mcp-batch-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,qBAAqB;IAwEvC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAa5C"}