@codeledger/selector 0.1.1 → 0.2.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/blast-radius.d.ts +7 -0
- package/dist/blast-radius.d.ts.map +1 -0
- package/dist/blast-radius.js +105 -0
- package/dist/blast-radius.js.map +1 -0
- package/dist/bundle.d.ts +10 -0
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +83 -9
- package/dist/bundle.js.map +1 -1
- package/dist/candidates.d.ts +12 -1
- package/dist/candidates.d.ts.map +1 -1
- package/dist/candidates.js +147 -22
- package/dist/candidates.js.map +1 -1
- package/dist/confidence.d.ts.map +1 -1
- package/dist/confidence.js +31 -0
- package/dist/confidence.js.map +1 -1
- package/dist/exemplars.d.ts +8 -0
- package/dist/exemplars.d.ts.map +1 -0
- package/dist/exemplars.js +122 -0
- package/dist/exemplars.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/layer-ordering.d.ts +37 -0
- package/dist/layer-ordering.d.ts.map +1 -0
- package/dist/layer-ordering.js +93 -0
- package/dist/layer-ordering.js.map +1 -0
- package/dist/near-miss.d.ts +9 -0
- package/dist/near-miss.d.ts.map +1 -0
- package/dist/near-miss.js +78 -0
- package/dist/near-miss.js.map +1 -0
- package/dist/scorer.d.ts +2 -2
- package/dist/scorer.d.ts.map +1 -1
- package/dist/scorer.js +23 -6
- package/dist/scorer.js.map +1 -1
- package/dist/stubs.d.ts.map +1 -1
- package/dist/stubs.js +4 -3
- package/dist/stubs.js.map +1 -1
- package/dist/task-type.d.ts +28 -0
- package/dist/task-type.d.ts.map +1 -0
- package/dist/task-type.js +115 -0
- package/dist/task-type.js.map +1 -0
- package/dist/todo-scan.d.ts +31 -0
- package/dist/todo-scan.d.ts.map +1 -0
- package/dist/todo-scan.js +63 -0
- package/dist/todo-scan.js.map +1 -0
- package/dist/token-calibration.d.ts +27 -0
- package/dist/token-calibration.d.ts.map +1 -0
- package/dist/token-calibration.js +113 -0
- package/dist/token-calibration.js.map +1 -0
- package/dist/validation.d.ts +7 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +108 -0
- package/dist/validation.js.map +1 -0
- package/package.json +2 -2
package/dist/scorer.js
CHANGED
|
@@ -21,7 +21,7 @@ function detectErrorInfrastructure(file) {
|
|
|
21
21
|
const isErrorInfra = stems.some((stem) => ERROR_INFRA_PATTERNS.some((pat) => stem === pat || stem === pat + 's'));
|
|
22
22
|
return isErrorInfra ? 1.0 : 0;
|
|
23
23
|
}
|
|
24
|
-
export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, tokenWeights) {
|
|
24
|
+
export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, tokenWeights, branchChangedFiles) {
|
|
25
25
|
const pathLower = file.path.toLowerCase();
|
|
26
26
|
const contentKws = file.content_keywords ?? [];
|
|
27
27
|
// Extract filename stems for exact-match boosting.
|
|
@@ -101,6 +101,8 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
101
101
|
const fail_prior = ledgerStats?.fail_files.has(file.path) ? 1.0 : 0;
|
|
102
102
|
// ERROR_INFRA: detect error infrastructure files (custom errors, validators, error middleware)
|
|
103
103
|
const error_infrastructure = detectErrorInfrastructure(file);
|
|
104
|
+
// BRANCH_CHANGED: work-in-progress awareness — boost files on the current branch
|
|
105
|
+
const branch_changed = branchChangedFiles?.has(file.path) ? 1.0 : 0;
|
|
104
106
|
return {
|
|
105
107
|
keyword,
|
|
106
108
|
centrality,
|
|
@@ -111,6 +113,7 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
111
113
|
success_prior,
|
|
112
114
|
fail_prior,
|
|
113
115
|
error_infrastructure,
|
|
116
|
+
branch_changed,
|
|
114
117
|
_hasContentMatch,
|
|
115
118
|
};
|
|
116
119
|
}
|
|
@@ -158,7 +161,8 @@ export function scoreFile(features, weights) {
|
|
|
158
161
|
features.size_penalty * weights.size_penalty +
|
|
159
162
|
features.success_prior * weights.success_prior -
|
|
160
163
|
features.fail_prior * weights.fail_prior +
|
|
161
|
-
features.error_infrastructure * (weights.error_infrastructure ?? 0.08)
|
|
164
|
+
features.error_infrastructure * (weights.error_infrastructure ?? 0.08) +
|
|
165
|
+
features.branch_changed * (weights.branch_changed ?? 0));
|
|
162
166
|
}
|
|
163
167
|
export function deriveReasons(features) {
|
|
164
168
|
const reasons = [];
|
|
@@ -182,19 +186,25 @@ export function deriveReasons(features) {
|
|
|
182
186
|
reasons.push('success_prior');
|
|
183
187
|
if (features.error_infrastructure > 0)
|
|
184
188
|
reasons.push('error_infrastructure');
|
|
189
|
+
if (features.branch_changed > 0)
|
|
190
|
+
reasons.push('branch_changed');
|
|
185
191
|
return reasons;
|
|
186
192
|
}
|
|
187
|
-
export function scoreAllCandidates(candidates, taskKeywords, repoIndex, weights, ledgerStats, tokenWeights, fanoutFiles) {
|
|
193
|
+
export function scoreAllCandidates(candidates, taskKeywords, repoIndex, weights, ledgerStats, tokenWeights, fanoutFiles, branchChangedFiles, surfaceFiles) {
|
|
188
194
|
const fileMap = new Map(repoIndex.files.map((f) => [f.path, f]));
|
|
189
195
|
const results = [];
|
|
190
196
|
for (const path of candidates) {
|
|
191
197
|
const file = fileMap.get(path);
|
|
192
198
|
if (!file)
|
|
193
199
|
continue;
|
|
194
|
-
const rawFeatures = computeFeatures(file, taskKeywords, repoIndex, ledgerStats, tokenWeights);
|
|
200
|
+
const rawFeatures = computeFeatures(file, taskKeywords, repoIndex, ledgerStats, tokenWeights, branchChangedFiles);
|
|
195
201
|
const gated = gateTemporalFeatures(rawFeatures);
|
|
196
|
-
// Preserve _hasContentMatch through gating for reason derivation
|
|
197
|
-
const features = {
|
|
202
|
+
// Preserve _hasContentMatch and branch_changed through gating for reason derivation
|
|
203
|
+
const features = {
|
|
204
|
+
...gated,
|
|
205
|
+
_hasContentMatch: rawFeatures._hasContentMatch,
|
|
206
|
+
branch_changed: rawFeatures.branch_changed,
|
|
207
|
+
};
|
|
198
208
|
let score = scoreFile(features, weights);
|
|
199
209
|
const reasons = deriveReasons(features);
|
|
200
210
|
// Fan-out bonus: files pulled in via dependent expansion get a boost
|
|
@@ -205,6 +215,13 @@ export function scoreAllCandidates(candidates, taskKeywords, repoIndex, weights,
|
|
|
205
215
|
reasons.push('dependent_neighbor');
|
|
206
216
|
}
|
|
207
217
|
}
|
|
218
|
+
// Surface files get scored at 0 with a dedicated reason, so they fill
|
|
219
|
+
// remaining budget slots without competing with keyword-scored files.
|
|
220
|
+
if (surfaceFiles?.has(path) && features.keyword === 0) {
|
|
221
|
+
score = 0;
|
|
222
|
+
reasons.length = 0;
|
|
223
|
+
reasons.push('surface_auto_include');
|
|
224
|
+
}
|
|
208
225
|
results.push({ path, score, features, reasons });
|
|
209
226
|
}
|
|
210
227
|
// Sort by score descending
|
package/dist/scorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAcA,kEAAkE;AAClE,MAAM,oBAAoB,GAAG;IAC3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ;CAC1D,CAAC;AAEF,oEAAoE;AACpE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;qEACqE;AACrE,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;GAGG;AACH,SAAS,yBAAyB,CAAC,IAAc;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAErC,0DAA0D;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,CACvE,CAAC;IAEF,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAc,EACd,YAAsB,EACtB,SAAoB,EACpB,WAAyB,EACzB,YAAkC;
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
|
package/dist/stubs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;AAG1E;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,MAAM,GAC3B,UAAU,EAAE,CAuDd"}
|
package/dist/stubs.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, extname } from 'node:path';
|
|
3
|
+
import { estimateTokensByExtension } from './token-calibration.js';
|
|
3
4
|
/**
|
|
4
5
|
* Extract lightweight interface stubs for files that are imported by bundle files
|
|
5
6
|
* but didn't make the cut. These stubs contain only exported type signatures —
|
|
@@ -25,7 +26,6 @@ export function generateInterfaceStubs(root, selectedPaths, depGraph, maxStubs,
|
|
|
25
26
|
.slice(0, maxStubs);
|
|
26
27
|
const stubs = [];
|
|
27
28
|
let tokensUsed = 0;
|
|
28
|
-
const TOKENS_PER_LINE = 4;
|
|
29
29
|
for (const [filePath] of sorted) {
|
|
30
30
|
const absPath = join(root, filePath);
|
|
31
31
|
let content;
|
|
@@ -39,7 +39,8 @@ export function generateInterfaceStubs(root, selectedPaths, depGraph, maxStubs,
|
|
|
39
39
|
if (!stubContent)
|
|
40
40
|
continue;
|
|
41
41
|
const lines = stubContent.split('\n').length;
|
|
42
|
-
const
|
|
42
|
+
const fileExt = extname(filePath);
|
|
43
|
+
const tokenEstimate = estimateTokensByExtension(lines, fileExt);
|
|
43
44
|
if (tokensUsed + tokenEstimate > tokenBudgetRemaining)
|
|
44
45
|
continue;
|
|
45
46
|
const reasons = ['interface_stub'];
|
package/dist/stubs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SelectorWeights } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Task-Type Auto-Inference (Feature 12)
|
|
4
|
+
*
|
|
5
|
+
* Automatically detects the task type from the task description and
|
|
6
|
+
* returns weight adjustments that emphasize the most relevant scoring
|
|
7
|
+
* dimensions for that task type.
|
|
8
|
+
*
|
|
9
|
+
* Task types:
|
|
10
|
+
* - bug_fix: emphasizes error_infrastructure, recent_touch
|
|
11
|
+
* - feature_add: emphasizes centrality, keyword
|
|
12
|
+
* - refactor: emphasizes churn, centrality
|
|
13
|
+
* - test_update: emphasizes test_relevance, keyword
|
|
14
|
+
* - config: emphasizes keyword (infrastructure files)
|
|
15
|
+
* - general: no adjustment (default weights)
|
|
16
|
+
*/
|
|
17
|
+
export type TaskType = 'bug_fix' | 'feature_add' | 'refactor' | 'test_update' | 'config' | 'general';
|
|
18
|
+
/**
|
|
19
|
+
* Infer the task type from the task description.
|
|
20
|
+
* Returns the most likely type based on keyword pattern matching.
|
|
21
|
+
*/
|
|
22
|
+
export declare function inferTaskType(taskText: string): TaskType;
|
|
23
|
+
/**
|
|
24
|
+
* Apply task-type weight adjustments to the base weights.
|
|
25
|
+
* Returns a new weights object with scaled values.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyTaskTypeWeights(baseWeights: SelectorWeights, taskType: TaskType): SelectorWeights;
|
|
28
|
+
//# sourceMappingURL=task-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-type.d.ts","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,aAAa,GACb,UAAU,GACV,aAAa,GACb,QAAQ,GACR,SAAS,CAAC;AA8Bd;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAmCxD;AAoCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,eAAe,CAYjB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const BUG_FIX_PATTERNS = [
|
|
2
|
+
'fix', 'bug', 'broken', 'crash', 'error', 'issue', 'wrong', 'fail',
|
|
3
|
+
'incorrect', 'invalid', 'null', 'undefined', 'exception', 'regression',
|
|
4
|
+
'patch', 'hotfix',
|
|
5
|
+
];
|
|
6
|
+
const FEATURE_ADD_PATTERNS = [
|
|
7
|
+
'add', 'create', 'implement', 'build', 'new', 'introduce', 'scaffold',
|
|
8
|
+
'feature', 'endpoint', 'component', 'page', 'route', 'service',
|
|
9
|
+
];
|
|
10
|
+
const REFACTOR_PATTERNS = [
|
|
11
|
+
'refactor', 'restructure', 'reorganize', 'clean', 'simplify', 'extract',
|
|
12
|
+
'rename', 'move', 'split', 'merge', 'consolidate', 'optimize',
|
|
13
|
+
'improve', 'modernize', 'upgrade', 'migrate', 'replace',
|
|
14
|
+
];
|
|
15
|
+
const TEST_UPDATE_PATTERNS = [
|
|
16
|
+
'test', 'tests', 'testing', 'spec', 'specs', 'coverage', 'assertion',
|
|
17
|
+
'mock', 'stub', 'fixture', 'jest', 'vitest', 'mocha', 'e2e',
|
|
18
|
+
];
|
|
19
|
+
const CONFIG_PATTERNS = [
|
|
20
|
+
'config', 'configuration', 'settings', 'setup', 'env', 'environment',
|
|
21
|
+
'ci', 'pipeline', 'deploy', 'docker', 'workflow', 'lint', 'eslint',
|
|
22
|
+
'prettier', 'tsconfig', 'webpack', 'vite',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Infer the task type from the task description.
|
|
26
|
+
* Returns the most likely type based on keyword pattern matching.
|
|
27
|
+
*/
|
|
28
|
+
export function inferTaskType(taskText) {
|
|
29
|
+
const lower = taskText.toLowerCase();
|
|
30
|
+
// Split on non-alphanumeric to strip punctuation (e.g. "fix," → "fix", "test." → "test")
|
|
31
|
+
const words = lower.split(/[^\p{L}\p{N}]+/u).filter((w) => w.length > 0);
|
|
32
|
+
// Score each type by keyword hits
|
|
33
|
+
const scores = {
|
|
34
|
+
bug_fix: 0,
|
|
35
|
+
feature_add: 0,
|
|
36
|
+
refactor: 0,
|
|
37
|
+
test_update: 0,
|
|
38
|
+
config: 0,
|
|
39
|
+
general: 0,
|
|
40
|
+
};
|
|
41
|
+
for (const word of words) {
|
|
42
|
+
if (BUG_FIX_PATTERNS.includes(word))
|
|
43
|
+
scores.bug_fix += 1;
|
|
44
|
+
if (FEATURE_ADD_PATTERNS.includes(word))
|
|
45
|
+
scores.feature_add += 1;
|
|
46
|
+
if (REFACTOR_PATTERNS.includes(word))
|
|
47
|
+
scores.refactor += 1;
|
|
48
|
+
if (TEST_UPDATE_PATTERNS.includes(word))
|
|
49
|
+
scores.test_update += 1;
|
|
50
|
+
if (CONFIG_PATTERNS.includes(word))
|
|
51
|
+
scores.config += 1;
|
|
52
|
+
}
|
|
53
|
+
// Find the highest scoring type
|
|
54
|
+
let bestType = 'general';
|
|
55
|
+
let bestScore = 0;
|
|
56
|
+
for (const [type, typeScore] of Object.entries(scores)) {
|
|
57
|
+
if (typeScore > bestScore) {
|
|
58
|
+
bestScore = typeScore;
|
|
59
|
+
bestType = type;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Require at least 1 keyword hit to classify
|
|
63
|
+
return bestScore > 0 ? bestType : 'general';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Weight adjustment multipliers for each task type.
|
|
67
|
+
* Values > 1.0 emphasize, < 1.0 de-emphasize, 1.0 = no change.
|
|
68
|
+
*/
|
|
69
|
+
const WEIGHT_ADJUSTMENTS = {
|
|
70
|
+
bug_fix: {
|
|
71
|
+
error_infrastructure: 1.5,
|
|
72
|
+
recent_touch: 1.3,
|
|
73
|
+
churn: 1.2,
|
|
74
|
+
keyword: 1.1,
|
|
75
|
+
},
|
|
76
|
+
feature_add: {
|
|
77
|
+
centrality: 1.3,
|
|
78
|
+
keyword: 1.2,
|
|
79
|
+
test_relevance: 0.8,
|
|
80
|
+
},
|
|
81
|
+
refactor: {
|
|
82
|
+
churn: 1.4,
|
|
83
|
+
centrality: 1.3,
|
|
84
|
+
size_penalty: 0.7,
|
|
85
|
+
},
|
|
86
|
+
test_update: {
|
|
87
|
+
test_relevance: 1.5,
|
|
88
|
+
keyword: 1.2,
|
|
89
|
+
churn: 0.8,
|
|
90
|
+
},
|
|
91
|
+
config: {
|
|
92
|
+
keyword: 1.3,
|
|
93
|
+
churn: 0.7,
|
|
94
|
+
centrality: 0.8,
|
|
95
|
+
},
|
|
96
|
+
general: {},
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Apply task-type weight adjustments to the base weights.
|
|
100
|
+
* Returns a new weights object with scaled values.
|
|
101
|
+
*/
|
|
102
|
+
export function applyTaskTypeWeights(baseWeights, taskType) {
|
|
103
|
+
const adjustments = WEIGHT_ADJUSTMENTS[taskType];
|
|
104
|
+
if (Object.keys(adjustments).length === 0)
|
|
105
|
+
return baseWeights;
|
|
106
|
+
const adjusted = { ...baseWeights };
|
|
107
|
+
for (const [key, multiplier] of Object.entries(adjustments)) {
|
|
108
|
+
const current = adjusted[key];
|
|
109
|
+
if (typeof current === 'number') {
|
|
110
|
+
adjusted[key] = current * multiplier;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return adjusted;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=task-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-type.js","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TODO/FIXME Awareness (Feature 14)
|
|
3
|
+
*
|
|
4
|
+
* Scans file content for TODO, FIXME, HACK, and XXX comments.
|
|
5
|
+
* Returns a relevance score (0–1) based on the density and recency
|
|
6
|
+
* of these markers. Files with many TODOs are more likely to need
|
|
7
|
+
* attention and should get a small scoring boost.
|
|
8
|
+
*/
|
|
9
|
+
export interface TodoScanResult {
|
|
10
|
+
/** Total count of TODO-like markers found */
|
|
11
|
+
count: number;
|
|
12
|
+
/** Normalized score 0–1 (higher = more TODOs relative to file size) */
|
|
13
|
+
density: number;
|
|
14
|
+
/** The specific markers found */
|
|
15
|
+
markers: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Scan file content for TODO/FIXME markers.
|
|
19
|
+
* Returns count, density (normalized by file length), and matched markers.
|
|
20
|
+
*/
|
|
21
|
+
export declare function scanTodos(content: string): TodoScanResult;
|
|
22
|
+
/**
|
|
23
|
+
* Compute a TODO relevance boost for scoring.
|
|
24
|
+
* Returns a value between 0 and 1:
|
|
25
|
+
* - 0: no TODOs
|
|
26
|
+
* - 0.3: a few TODOs
|
|
27
|
+
* - 0.6: moderate TODO density
|
|
28
|
+
* - 1.0: high TODO density
|
|
29
|
+
*/
|
|
30
|
+
export declare function todoRelevanceScore(content: string): number;
|
|
31
|
+
//# sourceMappingURL=todo-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-scan.d.ts","sourceRoot":"","sources":["../src/todo-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAyBzD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM1D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TODO/FIXME Awareness (Feature 14)
|
|
3
|
+
*
|
|
4
|
+
* Scans file content for TODO, FIXME, HACK, and XXX comments.
|
|
5
|
+
* Returns a relevance score (0–1) based on the density and recency
|
|
6
|
+
* of these markers. Files with many TODOs are more likely to need
|
|
7
|
+
* attention and should get a small scoring boost.
|
|
8
|
+
*/
|
|
9
|
+
/** Patterns that indicate incomplete or problematic code */
|
|
10
|
+
const TODO_PATTERNS = [
|
|
11
|
+
/\bTODO\b/i,
|
|
12
|
+
/\bFIXME\b/i,
|
|
13
|
+
/\bHACK\b/i,
|
|
14
|
+
/\bXXX\b/i,
|
|
15
|
+
/\bBUG\b(?:\s*#?\d+)/i,
|
|
16
|
+
/\bWORKAROUND\b/i,
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Scan file content for TODO/FIXME markers.
|
|
20
|
+
* Returns count, density (normalized by file length), and matched markers.
|
|
21
|
+
*/
|
|
22
|
+
export function scanTodos(content) {
|
|
23
|
+
const lines = content.split('\n');
|
|
24
|
+
const markers = [];
|
|
25
|
+
let count = 0;
|
|
26
|
+
for (const line of lines) {
|
|
27
|
+
for (const pattern of TODO_PATTERNS) {
|
|
28
|
+
const match = pattern.exec(line);
|
|
29
|
+
if (match) {
|
|
30
|
+
count++;
|
|
31
|
+
const marker = match[0].toUpperCase();
|
|
32
|
+
if (!markers.includes(marker)) {
|
|
33
|
+
markers.push(marker);
|
|
34
|
+
}
|
|
35
|
+
break; // only count once per line
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Density: TODOs per 100 lines, capped at 1.0
|
|
40
|
+
const density = lines.length > 0
|
|
41
|
+
? Math.min(1, (count / lines.length) * 100)
|
|
42
|
+
: 0;
|
|
43
|
+
return { count, density, markers };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compute a TODO relevance boost for scoring.
|
|
47
|
+
* Returns a value between 0 and 1:
|
|
48
|
+
* - 0: no TODOs
|
|
49
|
+
* - 0.3: a few TODOs
|
|
50
|
+
* - 0.6: moderate TODO density
|
|
51
|
+
* - 1.0: high TODO density
|
|
52
|
+
*/
|
|
53
|
+
export function todoRelevanceScore(content) {
|
|
54
|
+
const { count, density } = scanTodos(content);
|
|
55
|
+
if (count === 0)
|
|
56
|
+
return 0;
|
|
57
|
+
if (count <= 2)
|
|
58
|
+
return 0.3;
|
|
59
|
+
if (density < 0.5)
|
|
60
|
+
return 0.6;
|
|
61
|
+
return 1.0;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=todo-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-scan.js","sourceRoot":"","sources":["../src/todo-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4DAA4D;AAC5D,MAAM,aAAa,GAAG;IACpB,WAAW;IACX,YAAY;IACZ,WAAW;IACX,UAAU;IACV,sBAAsB;IACtB,iBAAiB;CAClB,CAAC;AAWF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM,CAAC,2BAA2B;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAC3C,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3B,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,GAAG,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Calibration (Feature 17)
|
|
3
|
+
*
|
|
4
|
+
* Language-aware token estimation that improves on the flat 4-tokens-per-line
|
|
5
|
+
* estimate. Different languages have different average token densities.
|
|
6
|
+
*
|
|
7
|
+
* Calibrated from OpenAI tokenizer empirical data:
|
|
8
|
+
* - TypeScript/JavaScript: ~3.5 tokens/line (concise syntax)
|
|
9
|
+
* - Python: ~3.2 tokens/line (significant whitespace, shorter lines)
|
|
10
|
+
* - Go: ~3.8 tokens/line (verbose types, error handling)
|
|
11
|
+
* - Rust: ~4.2 tokens/line (lifetime annotations, verbose syntax)
|
|
12
|
+
* - Java: ~4.5 tokens/line (verbose OOP)
|
|
13
|
+
* - JSON/YAML/Config: ~2.5 tokens/line (simple key-value)
|
|
14
|
+
* - Markdown/Text: ~5.0 tokens/line (natural language)
|
|
15
|
+
* - Default: 4.0 tokens/line (conservative estimate)
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Estimate tokens for a file based on line count and language.
|
|
19
|
+
* Falls back to the default rate of 4 tokens/line for unknown languages.
|
|
20
|
+
*/
|
|
21
|
+
export declare function estimateTokensCalibrated(lines: number, language: string): number;
|
|
22
|
+
/**
|
|
23
|
+
* Estimate tokens from a file extension.
|
|
24
|
+
* Maps common extensions to their language for token rate lookup.
|
|
25
|
+
*/
|
|
26
|
+
export declare function estimateTokensByExtension(lines: number, extension: string): number;
|
|
27
|
+
//# sourceMappingURL=token-calibration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-calibration.d.ts","sourceRoot":"","sources":["../src/token-calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA6CH;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAGR"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Calibration (Feature 17)
|
|
3
|
+
*
|
|
4
|
+
* Language-aware token estimation that improves on the flat 4-tokens-per-line
|
|
5
|
+
* estimate. Different languages have different average token densities.
|
|
6
|
+
*
|
|
7
|
+
* Calibrated from OpenAI tokenizer empirical data:
|
|
8
|
+
* - TypeScript/JavaScript: ~3.5 tokens/line (concise syntax)
|
|
9
|
+
* - Python: ~3.2 tokens/line (significant whitespace, shorter lines)
|
|
10
|
+
* - Go: ~3.8 tokens/line (verbose types, error handling)
|
|
11
|
+
* - Rust: ~4.2 tokens/line (lifetime annotations, verbose syntax)
|
|
12
|
+
* - Java: ~4.5 tokens/line (verbose OOP)
|
|
13
|
+
* - JSON/YAML/Config: ~2.5 tokens/line (simple key-value)
|
|
14
|
+
* - Markdown/Text: ~5.0 tokens/line (natural language)
|
|
15
|
+
* - Default: 4.0 tokens/line (conservative estimate)
|
|
16
|
+
*/
|
|
17
|
+
const LANGUAGE_TOKEN_RATES = {
|
|
18
|
+
// Web languages
|
|
19
|
+
typescript: 3.5,
|
|
20
|
+
javascript: 3.5,
|
|
21
|
+
tsx: 3.5,
|
|
22
|
+
jsx: 3.5,
|
|
23
|
+
// Systems languages
|
|
24
|
+
go: 3.8,
|
|
25
|
+
rust: 4.2,
|
|
26
|
+
c: 3.8,
|
|
27
|
+
cpp: 4.0,
|
|
28
|
+
// Managed languages
|
|
29
|
+
java: 4.5,
|
|
30
|
+
kotlin: 3.8,
|
|
31
|
+
csharp: 4.2,
|
|
32
|
+
// Scripting languages
|
|
33
|
+
python: 3.2,
|
|
34
|
+
ruby: 3.0,
|
|
35
|
+
php: 3.8,
|
|
36
|
+
// Config/data formats
|
|
37
|
+
json: 2.5,
|
|
38
|
+
yaml: 2.5,
|
|
39
|
+
toml: 2.5,
|
|
40
|
+
xml: 4.0,
|
|
41
|
+
// Documentation
|
|
42
|
+
markdown: 5.0,
|
|
43
|
+
// Shell
|
|
44
|
+
bash: 3.5,
|
|
45
|
+
shell: 3.5,
|
|
46
|
+
// CSS
|
|
47
|
+
css: 3.0,
|
|
48
|
+
scss: 3.2,
|
|
49
|
+
// SQL
|
|
50
|
+
sql: 4.0,
|
|
51
|
+
// GraphQL/Proto
|
|
52
|
+
graphql: 3.0,
|
|
53
|
+
protobuf: 3.5,
|
|
54
|
+
prisma: 3.0,
|
|
55
|
+
};
|
|
56
|
+
/** Default rate when language is unknown */
|
|
57
|
+
const DEFAULT_RATE = 4.0;
|
|
58
|
+
/**
|
|
59
|
+
* Estimate tokens for a file based on line count and language.
|
|
60
|
+
* Falls back to the default rate of 4 tokens/line for unknown languages.
|
|
61
|
+
*/
|
|
62
|
+
export function estimateTokensCalibrated(lines, language) {
|
|
63
|
+
const rate = LANGUAGE_TOKEN_RATES[language.toLowerCase()] ?? DEFAULT_RATE;
|
|
64
|
+
return Math.ceil(lines * rate);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Estimate tokens from a file extension.
|
|
68
|
+
* Maps common extensions to their language for token rate lookup.
|
|
69
|
+
*/
|
|
70
|
+
export function estimateTokensByExtension(lines, extension) {
|
|
71
|
+
const language = extensionToLanguage(extension);
|
|
72
|
+
return estimateTokensCalibrated(lines, language);
|
|
73
|
+
}
|
|
74
|
+
const EXTENSION_MAP = {
|
|
75
|
+
'.ts': 'typescript',
|
|
76
|
+
'.tsx': 'tsx',
|
|
77
|
+
'.js': 'javascript',
|
|
78
|
+
'.jsx': 'jsx',
|
|
79
|
+
'.mjs': 'javascript',
|
|
80
|
+
'.cjs': 'javascript',
|
|
81
|
+
'.py': 'python',
|
|
82
|
+
'.go': 'go',
|
|
83
|
+
'.rs': 'rust',
|
|
84
|
+
'.java': 'java',
|
|
85
|
+
'.kt': 'kotlin',
|
|
86
|
+
'.cs': 'csharp',
|
|
87
|
+
'.rb': 'ruby',
|
|
88
|
+
'.php': 'php',
|
|
89
|
+
'.c': 'c',
|
|
90
|
+
'.cpp': 'cpp',
|
|
91
|
+
'.h': 'c',
|
|
92
|
+
'.hpp': 'cpp',
|
|
93
|
+
'.json': 'json',
|
|
94
|
+
'.yaml': 'yaml',
|
|
95
|
+
'.yml': 'yaml',
|
|
96
|
+
'.toml': 'toml',
|
|
97
|
+
'.xml': 'xml',
|
|
98
|
+
'.md': 'markdown',
|
|
99
|
+
'.mdx': 'markdown',
|
|
100
|
+
'.sh': 'bash',
|
|
101
|
+
'.bash': 'bash',
|
|
102
|
+
'.css': 'css',
|
|
103
|
+
'.scss': 'scss',
|
|
104
|
+
'.sql': 'sql',
|
|
105
|
+
'.graphql': 'graphql',
|
|
106
|
+
'.gql': 'graphql',
|
|
107
|
+
'.proto': 'protobuf',
|
|
108
|
+
'.prisma': 'prisma',
|
|
109
|
+
};
|
|
110
|
+
function extensionToLanguage(ext) {
|
|
111
|
+
return EXTENSION_MAP[ext.toLowerCase()] ?? 'unknown';
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=token-calibration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-calibration.js","sourceRoot":"","sources":["../src/token-calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,oBAAoB,GAA2B;IACnD,gBAAgB;IAChB,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,oBAAoB;IACpB,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;IACT,CAAC,EAAE,GAAG;IACN,GAAG,EAAE,GAAG;IACR,oBAAoB;IACpB,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,sBAAsB;IACtB,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,sBAAsB;IACtB,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,gBAAgB;IAChB,QAAQ,EAAE,GAAG;IACb,QAAQ;IACR,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,MAAM;IACN,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,GAAG;IACT,MAAM;IACN,GAAG,EAAE,GAAG;IACR,gBAAgB;IAChB,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF,4CAA4C;AAC5C,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAa,EACb,QAAgB;IAEhB,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,YAAY,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,SAAiB;IAEjB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BundleFile, BundleWarning, ScoredFile } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a generated bundle and produce diagnostic warnings.
|
|
4
|
+
* Called after the bundle is fully assembled.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateBundle(files: BundleFile[], taskKeywords: string[], allScored: ScoredFile[], taskText: string): BundleWarning[];
|
|
7
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmB/E;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EAAE,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,UAAU,EAAE,EACvB,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CAuGjB"}
|