@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
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle Validation — Pre-flight Warnings
|
|
3
|
+
*
|
|
4
|
+
* Catches obviously-bad bundles before the agent wastes turns. Validates
|
|
5
|
+
* bundle quality against the task description and raises warnings for
|
|
6
|
+
* common failure modes.
|
|
7
|
+
*/
|
|
8
|
+
/** Keywords that suggest the task involves testing */
|
|
9
|
+
const TEST_KEYWORDS = ['test', 'tests', 'testing', 'spec', 'specs', 'jest', 'vitest', 'mocha'];
|
|
10
|
+
/** Keywords that suggest the task involves configuration */
|
|
11
|
+
const CONFIG_KEYWORDS = ['config', 'configuration', 'settings', 'setup', 'env', 'environment'];
|
|
12
|
+
/** Keywords that suggest the task involves database operations */
|
|
13
|
+
const DB_KEYWORDS = ['database', 'migration', 'schema', 'sql', 'query', 'model', 'table'];
|
|
14
|
+
/**
|
|
15
|
+
* Validate a generated bundle and produce diagnostic warnings.
|
|
16
|
+
* Called after the bundle is fully assembled.
|
|
17
|
+
*/
|
|
18
|
+
export function validateBundle(files, taskKeywords, allScored, taskText) {
|
|
19
|
+
const warnings = [];
|
|
20
|
+
const taskLower = taskText.toLowerCase();
|
|
21
|
+
// Warning 1: No keyword matches at all
|
|
22
|
+
const hasKeywordMatch = files.some((f) => !f.is_stub && !f.is_exemplar && f.reasons.includes('keyword_match'));
|
|
23
|
+
if (!hasKeywordMatch && files.length > 0) {
|
|
24
|
+
warnings.push({
|
|
25
|
+
level: 'warning',
|
|
26
|
+
code: 'no_keyword_match',
|
|
27
|
+
message: 'No files matched task keywords. Bundle is based on churn/centrality signals only — consider rephrasing the task.',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// Warning 2: Task mentions tests but no test files in bundle
|
|
31
|
+
const mentionsTests = taskKeywords.some((kw) => TEST_KEYWORDS.includes(kw)) ||
|
|
32
|
+
TEST_KEYWORDS.some((kw) => taskLower.includes(kw));
|
|
33
|
+
const hasTestFile = files.some((f) => f.path.includes('.test.') || f.path.includes('.spec.') || f.path.includes('__tests__'));
|
|
34
|
+
if (mentionsTests && !hasTestFile) {
|
|
35
|
+
warnings.push({
|
|
36
|
+
level: 'warning',
|
|
37
|
+
code: 'missing_test_files',
|
|
38
|
+
message: 'Task mentions testing but no test files are in the bundle. Test files may have been filtered or out of budget.',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Warning 3: Task mentions config but no config-like files
|
|
42
|
+
const mentionsConfig = taskKeywords.some((kw) => CONFIG_KEYWORDS.includes(kw));
|
|
43
|
+
const hasConfigFile = files.some((f) => {
|
|
44
|
+
const lower = f.path.toLowerCase();
|
|
45
|
+
return lower.includes('config') || lower.includes('.env') ||
|
|
46
|
+
lower.includes('tsconfig') || lower.includes('package.json');
|
|
47
|
+
});
|
|
48
|
+
if (mentionsConfig && !hasConfigFile) {
|
|
49
|
+
warnings.push({
|
|
50
|
+
level: 'info',
|
|
51
|
+
code: 'missing_config_files',
|
|
52
|
+
message: 'Task mentions configuration but no config files are in the bundle.',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Warning 4: Task mentions DB/schema but no DB files
|
|
56
|
+
const mentionsDb = taskKeywords.some((kw) => DB_KEYWORDS.includes(kw));
|
|
57
|
+
const hasDbFile = files.some((f) => {
|
|
58
|
+
const lower = f.path.toLowerCase();
|
|
59
|
+
return lower.includes('model') || lower.includes('migration') ||
|
|
60
|
+
lower.includes('schema') || lower.includes('.sql') ||
|
|
61
|
+
lower.includes('db/') || lower.includes('database');
|
|
62
|
+
});
|
|
63
|
+
if (mentionsDb && !hasDbFile) {
|
|
64
|
+
warnings.push({
|
|
65
|
+
level: 'info',
|
|
66
|
+
code: 'missing_db_files',
|
|
67
|
+
message: 'Task mentions database/schema but no database files are in the bundle.',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Warning 5: Very low score concentration — bundle is diluted
|
|
71
|
+
const nonStubFiles = files.filter((f) => !f.is_stub && !f.is_exemplar);
|
|
72
|
+
if (nonStubFiles.length >= 5) {
|
|
73
|
+
const topScore = nonStubFiles[0]?.score ?? 0;
|
|
74
|
+
const bottomScore = nonStubFiles[nonStubFiles.length - 1]?.score ?? 0;
|
|
75
|
+
if (topScore > 0 && bottomScore > 0) {
|
|
76
|
+
const ratio = bottomScore / topScore;
|
|
77
|
+
if (ratio > 0.85) {
|
|
78
|
+
warnings.push({
|
|
79
|
+
level: 'info',
|
|
80
|
+
code: 'score_plateau',
|
|
81
|
+
message: 'File scores are very close together — no strong signal file. The task may be too broad or generic.',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Warning 6: Bundle is empty
|
|
87
|
+
if (nonStubFiles.length === 0) {
|
|
88
|
+
warnings.push({
|
|
89
|
+
level: 'warning',
|
|
90
|
+
code: 'empty_bundle',
|
|
91
|
+
message: 'Bundle contains no source files. The task may not match any files in the repository.',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Warning 7: High-scoring files were excluded (budget too tight)
|
|
95
|
+
if (allScored.length > 0 && nonStubFiles.length > 0) {
|
|
96
|
+
const lastIncludedScore = nonStubFiles[nonStubFiles.length - 1].score;
|
|
97
|
+
const excludedHighScorers = allScored.filter((s) => s.score > lastIncludedScore && !files.some((f) => f.path === s.path));
|
|
98
|
+
if (excludedHighScorers.length > 3) {
|
|
99
|
+
warnings.push({
|
|
100
|
+
level: 'info',
|
|
101
|
+
code: 'budget_squeeze',
|
|
102
|
+
message: `${excludedHighScorers.length} files with strong scores were excluded by budget constraints. Consider increasing --budget or --max-files.`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return warnings;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeledger/selector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Deterministic context selection algorithm for CodeLedger",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@codeledger/types": "0.
|
|
27
|
+
"@codeledger/types": "0.2.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"typescript": "^5.4.0"
|