@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,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codebase index shared algorithms — pure functions for module classification,
|
|
3
|
+
* import extraction, dependency resolution, and prompt formatting.
|
|
4
|
+
*
|
|
5
|
+
* No filesystem, git, or child_process I/O. The I/O-heavy functions
|
|
6
|
+
* (buildCodebaseIndex, refreshCodebaseIndex, hasStructuralChanges) live
|
|
7
|
+
* in ./index.ts and import these pure algorithms.
|
|
8
|
+
*/
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Constants
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const SOURCE_EXTENSIONS = new Set([
|
|
14
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
15
|
+
'.py',
|
|
16
|
+
'.rs',
|
|
17
|
+
'.go',
|
|
18
|
+
'.rb',
|
|
19
|
+
'.java', '.kt', '.kts', '.scala',
|
|
20
|
+
'.cs',
|
|
21
|
+
'.ex', '.exs',
|
|
22
|
+
'.php',
|
|
23
|
+
'.swift',
|
|
24
|
+
'.dart',
|
|
25
|
+
'.c', '.cpp', '.h', '.hpp',
|
|
26
|
+
'.hs',
|
|
27
|
+
'.lua',
|
|
28
|
+
'.zig',
|
|
29
|
+
]);
|
|
30
|
+
/** Directory-name hint — fast path when the name is unambiguous. */
|
|
31
|
+
export const PURPOSE_HINT = {
|
|
32
|
+
api: 'api', apis: 'api', routes: 'api', handlers: 'api',
|
|
33
|
+
controllers: 'api', endpoints: 'api',
|
|
34
|
+
services: 'services', service: 'services', lib: 'services', core: 'services',
|
|
35
|
+
ui: 'ui', components: 'ui', views: 'ui', pages: 'ui', screens: 'ui',
|
|
36
|
+
utils: 'utils', util: 'utils', helpers: 'utils', shared: 'utils', common: 'utils',
|
|
37
|
+
};
|
|
38
|
+
export const NON_PRODUCTION_PURPOSES = new Set([
|
|
39
|
+
'tests', 'config', 'fixtures', 'docs', 'scripts', 'generated',
|
|
40
|
+
]);
|
|
41
|
+
/** Chunk size for prompt rendering. */
|
|
42
|
+
export const CHUNK_SIZE = 15;
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Regex patterns
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/** File-name patterns that indicate non-production files (even within production modules). */
|
|
47
|
+
export const NON_PROD_FILE_RE = /\.(test|spec|e2e|integration|stories|story)\./i;
|
|
48
|
+
/**
|
|
49
|
+
* Polyglot test-content patterns — matches test framework calls across languages.
|
|
50
|
+
*/
|
|
51
|
+
export const TEST_CONTENT_RE = new RegExp([
|
|
52
|
+
/\b(describe|it|test|expect|assert|beforeEach|afterEach|beforeAll|afterAll|jest|vitest|mocha|chai)\s*[.(]/.source,
|
|
53
|
+
/\b(pytest|unittest|def test_)\b/.source,
|
|
54
|
+
/#\[(test|cfg\(test\))\]/.source,
|
|
55
|
+
/\bfunc\s+Test[A-Z]/.source,
|
|
56
|
+
/@(Test|TestMethod)\b/.source,
|
|
57
|
+
/\b(RSpec\.|Minitest|should\s)/.source,
|
|
58
|
+
/\b(ExUnit|use ExUnit)/.source,
|
|
59
|
+
/\b(PHPUnit|->assert[A-Z])/.source,
|
|
60
|
+
/\b(XCTestCase|func\s+test[A-Z])/.source,
|
|
61
|
+
].join('|'));
|
|
62
|
+
export const GENERATED_RE = /(@generated|DO NOT EDIT|auto-generated|THIS FILE IS GENERATED|generated by)/i;
|
|
63
|
+
export const CONFIG_CONTENT_RE = /\b(module\.exports|export default|defineConfig|createConfig)\b/;
|
|
64
|
+
export const CONFIG_EXT_RE = /\.(json|ya?ml|toml|ini|env)$/i;
|
|
65
|
+
export const FIXTURE_CONTENT_RE = /\b(mock[A-Z]\w*|fake[A-Z]\w*|stub[A-Z]\w*|fixture[A-Z]\w*)\s*[=:]|\bexport\s+(const|function)\s+(mock|fake|stub|fixture|seed|sample)/i;
|
|
66
|
+
// JS/TS: import ... from '...' or require('...')
|
|
67
|
+
export const JS_IMPORT_RE = /(?:import\s+.*?\s+from\s+['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\))/g;
|
|
68
|
+
// Python: from X import ... or import X
|
|
69
|
+
export const PY_IMPORT_RE = /(?:from\s+([\w.]+)\s+import|^import\s+([\w.]+))/gm;
|
|
70
|
+
// Go: import "..."
|
|
71
|
+
export const GO_IMPORT_RE = /import\s+"([^"]+)"/g;
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Pure functions
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
/** Map directory name to a purpose hint. Returns 'unknown' if no match. */
|
|
76
|
+
export function purposeHintFromDirName(dirName) {
|
|
77
|
+
return PURPOSE_HINT[dirName.toLowerCase()] ?? 'unknown';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Pick up to `count` items, evenly spaced across the array.
|
|
81
|
+
* Avoids alphabetical bias of always sampling the first N.
|
|
82
|
+
*/
|
|
83
|
+
export function sampleEvenly(arr, count) {
|
|
84
|
+
if (arr.length <= count)
|
|
85
|
+
return arr;
|
|
86
|
+
const step = arr.length / count;
|
|
87
|
+
const result = [];
|
|
88
|
+
for (let i = 0; i < count; i++) {
|
|
89
|
+
result.push(arr[Math.floor(i * step)]);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/** Count non-production files by name pattern within a file list. */
|
|
94
|
+
export function countNonProdFiles(fileNames) {
|
|
95
|
+
return fileNames.filter(f => NON_PROD_FILE_RE.test(f)).length;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Classify a module by analyzing its file names and content snippets.
|
|
99
|
+
*
|
|
100
|
+
* Uses file-name patterns (checked against ALL files — cheap string matching)
|
|
101
|
+
* and content analysis (sampled snippets from evenly-distributed files).
|
|
102
|
+
*
|
|
103
|
+
* Thresholds use both ratio AND absolute count to avoid misclassifying
|
|
104
|
+
* large mixed modules (40% test in a 500-file module ≠ production).
|
|
105
|
+
*/
|
|
106
|
+
export function classifyModule(dirName, allFileNames, contentSnippets, totalFileCount) {
|
|
107
|
+
const nonProdFiles = countNonProdFiles(allFileNames);
|
|
108
|
+
const nonProdRatio = allFileNames.length > 0 ? nonProdFiles / allFileNames.length : 0;
|
|
109
|
+
// 1. Majority of files are test/story files → whole module is non-production
|
|
110
|
+
if (nonProdRatio > 0.5 || (nonProdFiles >= 10 && nonProdRatio > 0.4)) {
|
|
111
|
+
return { purpose: 'tests', production: false, productionFileCount: 0, confidence: 'high' };
|
|
112
|
+
}
|
|
113
|
+
// 2. Check content signals across sampled snippets
|
|
114
|
+
let testHits = 0;
|
|
115
|
+
let generatedHits = 0;
|
|
116
|
+
let configHits = 0;
|
|
117
|
+
let fixtureHits = 0;
|
|
118
|
+
const total = contentSnippets.length || 1;
|
|
119
|
+
for (const snippet of contentSnippets) {
|
|
120
|
+
if (TEST_CONTENT_RE.test(snippet))
|
|
121
|
+
testHits++;
|
|
122
|
+
if (GENERATED_RE.test(snippet))
|
|
123
|
+
generatedHits++;
|
|
124
|
+
if (CONFIG_CONTENT_RE.test(snippet))
|
|
125
|
+
configHits++;
|
|
126
|
+
if (FIXTURE_CONTENT_RE.test(snippet))
|
|
127
|
+
fixtureHits++;
|
|
128
|
+
}
|
|
129
|
+
if (generatedHits / total > 0.5) {
|
|
130
|
+
return { purpose: 'generated', production: false, productionFileCount: 0, confidence: 'high' };
|
|
131
|
+
}
|
|
132
|
+
if (testHits / total > 0.5) {
|
|
133
|
+
return { purpose: 'tests', production: false, productionFileCount: 0, confidence: 'high' };
|
|
134
|
+
}
|
|
135
|
+
if (fixtureHits / total > 0.5) {
|
|
136
|
+
return { purpose: 'fixtures', production: false, productionFileCount: 0, confidence: 'high' };
|
|
137
|
+
}
|
|
138
|
+
// 3. Config: mostly config-extension files or config content
|
|
139
|
+
const configFileCount = allFileNames.filter(f => CONFIG_EXT_RE.test(f)).length;
|
|
140
|
+
const configFileRatio = allFileNames.length > 0 ? configFileCount / allFileNames.length : 0;
|
|
141
|
+
if (configFileRatio > 0.5 || (configHits / total > 0.5 && configFileRatio > 0.3)) {
|
|
142
|
+
return { purpose: 'config', production: false, productionFileCount: 0, confidence: 'high' };
|
|
143
|
+
}
|
|
144
|
+
// 4. Production module — subtract non-prod files from count
|
|
145
|
+
const hint = purposeHintFromDirName(dirName);
|
|
146
|
+
const prodCount = Math.max(0, totalFileCount - nonProdFiles);
|
|
147
|
+
const hasContentSignals = contentSnippets.length > 0 && (testHits > 0 || generatedHits > 0 || configHits > 0 || fixtureHits > 0);
|
|
148
|
+
const hasHint = hint !== 'unknown';
|
|
149
|
+
const confidence = hasHint ? 'high' :
|
|
150
|
+
hasContentSignals ? 'medium' :
|
|
151
|
+
'low';
|
|
152
|
+
return { purpose: hint, production: true, productionFileCount: prodCount, confidence };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Extract import specifiers from file content using polyglot regex patterns.
|
|
156
|
+
* Supports JS/TS, Python, and Go.
|
|
157
|
+
*/
|
|
158
|
+
export function extractImports(content, filePath) {
|
|
159
|
+
const ext = path.extname(filePath);
|
|
160
|
+
const imports = [];
|
|
161
|
+
if (ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs') {
|
|
162
|
+
for (const m of content.matchAll(new RegExp(JS_IMPORT_RE.source, 'g'))) {
|
|
163
|
+
const spec = m[1] ?? m[2];
|
|
164
|
+
if (spec)
|
|
165
|
+
imports.push(spec);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else if (ext === '.py') {
|
|
169
|
+
for (const m of content.matchAll(new RegExp(PY_IMPORT_RE.source, 'gm'))) {
|
|
170
|
+
const spec = m[1] ?? m[2];
|
|
171
|
+
if (spec)
|
|
172
|
+
imports.push(spec);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else if (ext === '.go') {
|
|
176
|
+
for (const m of content.matchAll(new RegExp(GO_IMPORT_RE.source, 'g'))) {
|
|
177
|
+
if (m[1])
|
|
178
|
+
imports.push(m[1]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (ext === '.rs') {
|
|
182
|
+
// Rust: use crate::..., use std::..., use super::...
|
|
183
|
+
for (const m of content.matchAll(/\buse\s+((?:crate|super|self|std)\b[\w:]+)/g)) {
|
|
184
|
+
if (m[1])
|
|
185
|
+
imports.push(m[1]);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (ext === '.java' || ext === '.kt' || ext === '.kts' || ext === '.scala') {
|
|
189
|
+
// Java/Kotlin/Scala: import package.Class
|
|
190
|
+
for (const m of content.matchAll(/\bimport\s+([\w.]+)/g)) {
|
|
191
|
+
if (m[1])
|
|
192
|
+
imports.push(m[1]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (ext === '.rb') {
|
|
196
|
+
// Ruby: require 'lib' or require_relative 'path'
|
|
197
|
+
for (const m of content.matchAll(/\brequire(?:_relative)?\s+['"]([^'"]+)['"]/g)) {
|
|
198
|
+
if (m[1])
|
|
199
|
+
imports.push(m[1]);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (ext === '.cs') {
|
|
203
|
+
// C#: using Namespace;
|
|
204
|
+
for (const m of content.matchAll(/\busing\s+([\w.]+)\s*;/g)) {
|
|
205
|
+
if (m[1])
|
|
206
|
+
imports.push(m[1]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if (ext === '.swift') {
|
|
210
|
+
// Swift: import Module
|
|
211
|
+
for (const m of content.matchAll(/\bimport\s+(\w+)/g)) {
|
|
212
|
+
if (m[1])
|
|
213
|
+
imports.push(m[1]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else if (ext === '.ex' || ext === '.exs') {
|
|
217
|
+
// Elixir: alias/import/use Module
|
|
218
|
+
for (const m of content.matchAll(/\b(?:alias|import|use)\s+([\w.]+)/g)) {
|
|
219
|
+
if (m[1])
|
|
220
|
+
imports.push(m[1]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else if (ext === '.php') {
|
|
224
|
+
// PHP: use Namespace\Class;
|
|
225
|
+
for (const m of content.matchAll(/\buse\s+([\w\\]+)/g)) {
|
|
226
|
+
if (m[1])
|
|
227
|
+
imports.push(m[1]);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (ext === '.dart') {
|
|
231
|
+
// Dart: import 'package:...';
|
|
232
|
+
for (const m of content.matchAll(/\bimport\s+['"]([^'"]+)['"]/g)) {
|
|
233
|
+
if (m[1])
|
|
234
|
+
imports.push(m[1]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else if (ext === '.c' || ext === '.cpp' || ext === '.h' || ext === '.hpp') {
|
|
238
|
+
// C/C++: #include "local.h" (skip <system.h>)
|
|
239
|
+
for (const m of content.matchAll(/#include\s+"([^"]+)"/g)) {
|
|
240
|
+
if (m[1])
|
|
241
|
+
imports.push(m[1]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else if (ext === '.hs') {
|
|
245
|
+
// Haskell: import Module.Name
|
|
246
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
247
|
+
for (const m of content.matchAll(/\bimport\s+(?:qualified\s+)?([\w.]+)/g)) {
|
|
248
|
+
if (m[1])
|
|
249
|
+
imports.push(m[1]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return imports;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Resolve a relative import specifier to a module path relative to projectRoot.
|
|
256
|
+
* Returns null for non-relative (package) imports.
|
|
257
|
+
*/
|
|
258
|
+
export function resolveImportToModule(specifier, sourceFile, projectRoot, modulePaths) {
|
|
259
|
+
if (!specifier.startsWith('.'))
|
|
260
|
+
return null;
|
|
261
|
+
const sourceDir = path.dirname(sourceFile);
|
|
262
|
+
const resolved = path.resolve(sourceDir, specifier);
|
|
263
|
+
const relative = path.relative(projectRoot, resolved);
|
|
264
|
+
for (const mod of modulePaths) {
|
|
265
|
+
if (relative === mod || relative.startsWith(mod + '/') || relative.startsWith(mod + path.sep)) {
|
|
266
|
+
return mod;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Format a codebase index for injection into a scout prompt.
|
|
273
|
+
*
|
|
274
|
+
* Chunks modules (15 per chunk) and rotates by cycle number so all modules
|
|
275
|
+
* get exposure over multiple cycles. Includes untested modules, hotspots,
|
|
276
|
+
* and entrypoints.
|
|
277
|
+
*/
|
|
278
|
+
export function formatIndexForPrompt(index, scoutCycle) {
|
|
279
|
+
const { modules, dependency_edges, untested_modules, large_files, entrypoints } = index;
|
|
280
|
+
if (modules.length === 0) {
|
|
281
|
+
return '## Codebase Structure\n\nNo modules detected.';
|
|
282
|
+
}
|
|
283
|
+
const totalChunks = Math.max(1, Math.ceil(modules.length / CHUNK_SIZE));
|
|
284
|
+
const chunkIndex = scoutCycle % totalChunks;
|
|
285
|
+
const offset = chunkIndex * CHUNK_SIZE;
|
|
286
|
+
const focusModules = modules.slice(offset, offset + CHUNK_SIZE);
|
|
287
|
+
const otherModules = modules.filter((_, i) => i < offset || i >= offset + CHUNK_SIZE);
|
|
288
|
+
const parts = [];
|
|
289
|
+
parts.push(`## Codebase Structure (chunk ${chunkIndex + 1}/${totalChunks})`);
|
|
290
|
+
parts.push('');
|
|
291
|
+
parts.push('### Modules in Focus This Cycle');
|
|
292
|
+
for (const mod of focusModules) {
|
|
293
|
+
const deps = dependency_edges[mod.path];
|
|
294
|
+
const depStr = deps ? ` → imports: ${deps.join(', ')}` : '';
|
|
295
|
+
parts.push(`${mod.path}/ — ${mod.file_count} files (${mod.purpose})${depStr}`);
|
|
296
|
+
}
|
|
297
|
+
if (otherModules.length > 0) {
|
|
298
|
+
parts.push('');
|
|
299
|
+
parts.push('### Other Modules (not in focus — available for future cycles)');
|
|
300
|
+
parts.push(otherModules.map(m => m.path + '/').join(', '));
|
|
301
|
+
}
|
|
302
|
+
if (untested_modules.length > 0) {
|
|
303
|
+
parts.push('');
|
|
304
|
+
parts.push('### Untested Modules (context only — do NOT prioritize writing tests for these)');
|
|
305
|
+
parts.push(untested_modules.map(m => m + '/').join(', '));
|
|
306
|
+
}
|
|
307
|
+
if (large_files.length > 0) {
|
|
308
|
+
parts.push('');
|
|
309
|
+
parts.push('### Complexity Hotspots (>300 LOC)');
|
|
310
|
+
parts.push(large_files.map(f => `${f.path} (${f.lines})`).join(', '));
|
|
311
|
+
}
|
|
312
|
+
if (entrypoints.length > 0) {
|
|
313
|
+
parts.push('');
|
|
314
|
+
parts.push('### Entrypoints');
|
|
315
|
+
parts.push(entrypoints.join(', '));
|
|
316
|
+
}
|
|
317
|
+
return parts.join('\n');
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/codebase-index/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized default constants for PromptWheel.
|
|
3
|
+
*
|
|
4
|
+
* Both CLI (solo-config.ts) and MCP (run-manager.ts) must agree on these values.
|
|
5
|
+
* Add new defaults here — not scattered across packages.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SESSION_DEFAULTS: {
|
|
8
|
+
/** Max advance() calls per session */
|
|
9
|
+
readonly STEP_BUDGET: 200;
|
|
10
|
+
/** Max steps per ticket (relaxed in continuous/hours mode) */
|
|
11
|
+
readonly TICKET_STEP_BUDGET: 12;
|
|
12
|
+
/** Max line changes per ticket before scope-creep guard triggers */
|
|
13
|
+
readonly MAX_LINES_PER_TICKET: 500;
|
|
14
|
+
/** Max tool calls per ticket */
|
|
15
|
+
readonly MAX_TOOL_CALLS_PER_TICKET: 50;
|
|
16
|
+
/** Default PRs per session (non-continuous) */
|
|
17
|
+
readonly MAX_PRS: 5;
|
|
18
|
+
/** Default scout→execute cycles (non-continuous) */
|
|
19
|
+
readonly MAX_CYCLES: 1;
|
|
20
|
+
};
|
|
21
|
+
export declare const SCOUT_DEFAULTS: {
|
|
22
|
+
/** Minimum confidence to accept a proposal (MCP plugin mode) */
|
|
23
|
+
readonly MIN_CONFIDENCE: 55;
|
|
24
|
+
/** Maximum proposals per scout cycle */
|
|
25
|
+
readonly MAX_PROPOSALS_PER_SCOUT: 5;
|
|
26
|
+
/** Minimum impact score for proposals (matches PROPOSALS_DEFAULTS.DEFAULT_MIN_IMPACT) */
|
|
27
|
+
readonly MIN_IMPACT_SCORE: 3;
|
|
28
|
+
/** Retries when scout returns zero proposals */
|
|
29
|
+
readonly MAX_SCOUT_RETRIES: 3;
|
|
30
|
+
/** Default scope glob */
|
|
31
|
+
readonly SCOPE: "**";
|
|
32
|
+
/** Default trust ladder categories */
|
|
33
|
+
readonly CATEGORIES: readonly string[];
|
|
34
|
+
/** Directories excluded from scanning */
|
|
35
|
+
readonly EXCLUDE_DIRS: readonly string[];
|
|
36
|
+
};
|
|
37
|
+
export declare const EXECUTION_DEFAULTS: {
|
|
38
|
+
/** Max QA retry attempts before failing a ticket */
|
|
39
|
+
readonly MAX_QA_RETRIES: 3;
|
|
40
|
+
/** Default parallel ticket count */
|
|
41
|
+
readonly PARALLEL: 2;
|
|
42
|
+
/** Maximum parallel tickets allowed */
|
|
43
|
+
readonly MAX_PARALLEL: 5;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,gBAAgB;IAC3B,sCAAsC;;IAEtC,8DAA8D;;IAE9D,oEAAoE;;IAEpE,gCAAgC;;IAEhC,+CAA+C;;IAE/C,oDAAoD;;CAE5C,CAAC;AAMX,eAAO,MAAM,cAAc;IACzB,gEAAgE;;IAEhE,wCAAwC;;IAExC,yFAAyF;;IAEzF,gDAAgD;;IAEhD,yBAAyB;;IAEzB,sCAAsC;yBAC6C,SAAS,MAAM,EAAE;IACpG,yCAAyC;2BA0BpC,SAAS,MAAM,EAAE;CACd,CAAC;AAMX,eAAO,MAAM,kBAAkB;IAC7B,oDAAoD;;IAEpD,oCAAoC;;IAEpC,uCAAuC;;CAE/B,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized default constants for PromptWheel.
|
|
3
|
+
*
|
|
4
|
+
* Both CLI (solo-config.ts) and MCP (run-manager.ts) must agree on these values.
|
|
5
|
+
* Add new defaults here — not scattered across packages.
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Session budgets
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export const SESSION_DEFAULTS = {
|
|
11
|
+
/** Max advance() calls per session */
|
|
12
|
+
STEP_BUDGET: 200,
|
|
13
|
+
/** Max steps per ticket (relaxed in continuous/hours mode) */
|
|
14
|
+
TICKET_STEP_BUDGET: 12,
|
|
15
|
+
/** Max line changes per ticket before scope-creep guard triggers */
|
|
16
|
+
MAX_LINES_PER_TICKET: 500,
|
|
17
|
+
/** Max tool calls per ticket */
|
|
18
|
+
MAX_TOOL_CALLS_PER_TICKET: 50,
|
|
19
|
+
/** Default PRs per session (non-continuous) */
|
|
20
|
+
MAX_PRS: 5,
|
|
21
|
+
/** Default scout→execute cycles (non-continuous) */
|
|
22
|
+
MAX_CYCLES: 1,
|
|
23
|
+
};
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Scout defaults
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
export const SCOUT_DEFAULTS = {
|
|
28
|
+
/** Minimum confidence to accept a proposal (MCP plugin mode) */
|
|
29
|
+
MIN_CONFIDENCE: 55,
|
|
30
|
+
/** Maximum proposals per scout cycle */
|
|
31
|
+
MAX_PROPOSALS_PER_SCOUT: 5,
|
|
32
|
+
/** Minimum impact score for proposals (matches PROPOSALS_DEFAULTS.DEFAULT_MIN_IMPACT) */
|
|
33
|
+
MIN_IMPACT_SCORE: 3,
|
|
34
|
+
/** Retries when scout returns zero proposals */
|
|
35
|
+
MAX_SCOUT_RETRIES: 3,
|
|
36
|
+
/** Default scope glob */
|
|
37
|
+
SCOPE: '**',
|
|
38
|
+
/** Default trust ladder categories */
|
|
39
|
+
CATEGORIES: ['refactor', 'docs', 'perf', 'security', 'fix', 'cleanup', 'types'],
|
|
40
|
+
/** Directories excluded from scanning */
|
|
41
|
+
EXCLUDE_DIRS: [
|
|
42
|
+
// JS/TS
|
|
43
|
+
'node_modules', 'dist', 'build', '.next', 'coverage',
|
|
44
|
+
// Python
|
|
45
|
+
'__pycache__', '.venv', 'venv', '.tox', '*.egg-info',
|
|
46
|
+
// Rust
|
|
47
|
+
'target',
|
|
48
|
+
// Java/Kotlin
|
|
49
|
+
'.gradle', '.mvn',
|
|
50
|
+
// Elixir
|
|
51
|
+
'_build', 'deps',
|
|
52
|
+
// Ruby
|
|
53
|
+
'.bundle',
|
|
54
|
+
// C#
|
|
55
|
+
'bin', 'obj',
|
|
56
|
+
// Swift
|
|
57
|
+
'.build', '.swiftpm',
|
|
58
|
+
// Dart
|
|
59
|
+
'.dart_tool',
|
|
60
|
+
// Haskell
|
|
61
|
+
'.stack-work', 'dist-newstyle', '.cabal-sandbox',
|
|
62
|
+
// Zig
|
|
63
|
+
'zig-cache', 'zig-out',
|
|
64
|
+
// General
|
|
65
|
+
'assets', 'public/static', 'vendor', '.git',
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Execution defaults
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export const EXECUTION_DEFAULTS = {
|
|
72
|
+
/** Max QA retry attempts before failing a ticket */
|
|
73
|
+
MAX_QA_RETRIES: 3,
|
|
74
|
+
/** Default parallel ticket count */
|
|
75
|
+
PARALLEL: 2,
|
|
76
|
+
/** Maximum parallel tickets allowed */
|
|
77
|
+
MAX_PARALLEL: 5,
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sCAAsC;IACtC,WAAW,EAAE,GAAG;IAChB,8DAA8D;IAC9D,kBAAkB,EAAE,EAAE;IACtB,oEAAoE;IACpE,oBAAoB,EAAE,GAAG;IACzB,gCAAgC;IAChC,yBAAyB,EAAE,EAAE;IAC7B,+CAA+C;IAC/C,OAAO,EAAE,CAAC;IACV,oDAAoD;IACpD,UAAU,EAAE,CAAC;CACL,CAAC;AAEX,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gEAAgE;IAChE,cAAc,EAAE,EAAE;IAClB,wCAAwC;IACxC,uBAAuB,EAAE,CAAC;IAC1B,yFAAyF;IACzF,gBAAgB,EAAE,CAAC;IACnB,gDAAgD;IAChD,iBAAiB,EAAE,CAAC;IACpB,yBAAyB;IACzB,KAAK,EAAE,IAAI;IACX,sCAAsC;IACtC,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAsB;IACpG,yCAAyC;IACzC,YAAY,EAAE;QACZ,QAAQ;QACR,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU;QACpD,SAAS;QACT,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;QACpD,OAAO;QACP,QAAQ;QACR,cAAc;QACd,SAAS,EAAE,MAAM;QACjB,SAAS;QACT,QAAQ,EAAE,MAAM;QAChB,OAAO;QACP,SAAS;QACT,KAAK;QACL,KAAK,EAAE,KAAK;QACZ,QAAQ;QACR,QAAQ,EAAE,UAAU;QACpB,OAAO;QACP,YAAY;QACZ,UAAU;QACV,aAAa,EAAE,eAAe,EAAE,gBAAgB;QAChD,MAAM;QACN,WAAW,EAAE,SAAS;QACtB,UAAU;QACV,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM;KACvB;CACd,CAAC;AAEX,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,oDAAoD;IACpD,cAAc,EAAE,CAAC;IACjB,oCAAoC;IACpC,QAAQ,EAAE,CAAC;IACX,uCAAuC;IACvC,YAAY,EAAE,CAAC;CACP,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Critic Scoring — pure algorithms for retry guidance.
|
|
3
|
+
*
|
|
4
|
+
* When QA fails or a plan is rejected, these functions analyze structured
|
|
5
|
+
* learnings to build targeted guidance for the retry prompt.
|
|
6
|
+
*
|
|
7
|
+
* No I/O — callers provide learnings and failure context.
|
|
8
|
+
*/
|
|
9
|
+
import type { Learning } from '../learnings/shared.js';
|
|
10
|
+
export interface FailureContext {
|
|
11
|
+
failed_commands: string[];
|
|
12
|
+
error_output: string;
|
|
13
|
+
attempt: number;
|
|
14
|
+
max_attempts: number;
|
|
15
|
+
}
|
|
16
|
+
export interface RetryRiskScore {
|
|
17
|
+
score: number;
|
|
18
|
+
level: 'low' | 'medium' | 'high';
|
|
19
|
+
signals: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface CriticStrategy {
|
|
22
|
+
label: string;
|
|
23
|
+
instruction: string;
|
|
24
|
+
confidence: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compute retry risk based on learnings overlap with the failing ticket.
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeRetryRisk(ticketPaths: string[], ticketCommands: string[], learnings: Learning[], failureContext: FailureContext): RetryRiskScore;
|
|
30
|
+
/**
|
|
31
|
+
* Generate ranked strategies for a retry based on learnings.
|
|
32
|
+
* Returns top 3 by confidence.
|
|
33
|
+
*/
|
|
34
|
+
export declare function scoreStrategies(ticketPaths: string[], failureContext: FailureContext, learnings: Learning[]): CriticStrategy[];
|
|
35
|
+
/**
|
|
36
|
+
* Build a critic review block for QA retry prompts.
|
|
37
|
+
* Returns empty string if risk is low and no high-confidence strategies exist.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildCriticBlock(failureContext: FailureContext, risk: RetryRiskScore, strategies: CriticStrategy[], _learnings: Learning[]): string;
|
|
40
|
+
/**
|
|
41
|
+
* Build a critic block for plan rejection retries.
|
|
42
|
+
* Returns empty string if no actionable guidance exists.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildPlanRejectionCriticBlock(context: {
|
|
45
|
+
rejection_reason: string;
|
|
46
|
+
attempt: number;
|
|
47
|
+
max_attempts: number;
|
|
48
|
+
}, learnings: Learning[], ticketPaths: string[]): string;
|
|
49
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/critic/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAMvD,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,EAAE,MAAM,EAAE,EACxB,SAAS,EAAE,QAAQ,EAAE,EACrB,cAAc,EAAE,cAAc,GAC7B,cAAc,CA8ChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,QAAQ,EAAE,GACpB,cAAc,EAAE,CA+DlB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,cAAc,EAAE,EAC5B,UAAU,EAAE,QAAQ,EAAE,GACrB,MAAM,CAqCR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAC5E,SAAS,EAAE,QAAQ,EAAE,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CA0CR"}
|