@codeledger/selector 0.1.1 → 0.2.1
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 +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge-bundle.d.ts +41 -0
- package/dist/knowledge-bundle.d.ts.map +1 -0
- package/dist/knowledge-bundle.js +200 -0
- package/dist/knowledge-bundle.js.map +1 -0
- package/dist/knowledge-candidates.d.ts +27 -0
- package/dist/knowledge-candidates.d.ts.map +1 -0
- package/dist/knowledge-candidates.js +123 -0
- package/dist/knowledge-candidates.js.map +1 -0
- package/dist/knowledge-excerpt.d.ts +26 -0
- package/dist/knowledge-excerpt.d.ts.map +1 -0
- package/dist/knowledge-excerpt.js +179 -0
- package/dist/knowledge-excerpt.js.map +1 -0
- package/dist/knowledge-scorer.d.ts +33 -0
- package/dist/knowledge-scorer.d.ts.map +1 -0
- package/dist/knowledge-scorer.js +234 -0
- package/dist/knowledge-scorer.js.map +1 -0
- 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/mode-detect.d.ts +23 -0
- package/dist/mode-detect.d.ts.map +1 -0
- package/dist/mode-detect.js +76 -0
- package/dist/mode-detect.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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architectural Layer Ordering (Feature 15)
|
|
3
|
+
*
|
|
4
|
+
* Defines a configurable layer hierarchy for sorting bundle files.
|
|
5
|
+
* When enabled, files are ordered by their architectural layer
|
|
6
|
+
* (types → models → services → routes → tests) within the bundle,
|
|
7
|
+
* giving agents a clear top-down reading order.
|
|
8
|
+
*
|
|
9
|
+
* Default layers (configurable via selector config):
|
|
10
|
+
* 0: types/interfaces (lowest = read first)
|
|
11
|
+
* 1: models/entities
|
|
12
|
+
* 2: repositories/data access
|
|
13
|
+
* 3: services/business logic
|
|
14
|
+
* 4: controllers/routes/handlers
|
|
15
|
+
* 5: middleware
|
|
16
|
+
* 6: configuration/infrastructure
|
|
17
|
+
* 7: tests
|
|
18
|
+
*/
|
|
19
|
+
export interface LayerRule {
|
|
20
|
+
/** Pattern to match against file path (substring match) */
|
|
21
|
+
pattern: string;
|
|
22
|
+
/** Layer priority (lower = earlier in the reading order) */
|
|
23
|
+
layer: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Determine the architectural layer for a file path.
|
|
27
|
+
* Returns the layer number (lower = earlier in reading order).
|
|
28
|
+
*/
|
|
29
|
+
export declare function getFileLayer(filePath: string, customLayers?: LayerRule[]): number;
|
|
30
|
+
/**
|
|
31
|
+
* Sort file paths by architectural layer, preserving score order within
|
|
32
|
+
* each layer. Returns a new array (does not mutate the input).
|
|
33
|
+
*/
|
|
34
|
+
export declare function sortByLayer<T extends {
|
|
35
|
+
path: string;
|
|
36
|
+
}>(files: T[], customLayers?: LayerRule[]): T[];
|
|
37
|
+
//# sourceMappingURL=layer-ordering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-ordering.d.ts","sourceRoot":"","sources":["../src/layer-ordering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAoDD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,SAAS,EAAE,GACzB,MAAM,CAWR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpD,KAAK,EAAE,CAAC,EAAE,EACV,YAAY,CAAC,EAAE,SAAS,EAAE,GACzB,CAAC,EAAE,CAOL"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architectural Layer Ordering (Feature 15)
|
|
3
|
+
*
|
|
4
|
+
* Defines a configurable layer hierarchy for sorting bundle files.
|
|
5
|
+
* When enabled, files are ordered by their architectural layer
|
|
6
|
+
* (types → models → services → routes → tests) within the bundle,
|
|
7
|
+
* giving agents a clear top-down reading order.
|
|
8
|
+
*
|
|
9
|
+
* Default layers (configurable via selector config):
|
|
10
|
+
* 0: types/interfaces (lowest = read first)
|
|
11
|
+
* 1: models/entities
|
|
12
|
+
* 2: repositories/data access
|
|
13
|
+
* 3: services/business logic
|
|
14
|
+
* 4: controllers/routes/handlers
|
|
15
|
+
* 5: middleware
|
|
16
|
+
* 6: configuration/infrastructure
|
|
17
|
+
* 7: tests
|
|
18
|
+
*/
|
|
19
|
+
/** Default architectural layer rules */
|
|
20
|
+
const DEFAULT_LAYERS = [
|
|
21
|
+
// Types and interfaces — define contracts first
|
|
22
|
+
{ pattern: '/types/', layer: 0 },
|
|
23
|
+
{ pattern: '/types.', layer: 0 },
|
|
24
|
+
{ pattern: '/interfaces/', layer: 0 },
|
|
25
|
+
// Models and entities
|
|
26
|
+
{ pattern: '/models/', layer: 1 },
|
|
27
|
+
{ pattern: '/entities/', layer: 1 },
|
|
28
|
+
{ pattern: '/schemas/', layer: 1 },
|
|
29
|
+
// Data access / repositories
|
|
30
|
+
{ pattern: '/repo/', layer: 2 },
|
|
31
|
+
{ pattern: '/repositories/', layer: 2 },
|
|
32
|
+
{ pattern: '/db/', layer: 2 },
|
|
33
|
+
{ pattern: '/database/', layer: 2 },
|
|
34
|
+
{ pattern: '/migrations/', layer: 2 },
|
|
35
|
+
// Services / business logic
|
|
36
|
+
{ pattern: '/services/', layer: 3 },
|
|
37
|
+
{ pattern: '/service.', layer: 3 },
|
|
38
|
+
{ pattern: '/use-cases/', layer: 3 },
|
|
39
|
+
{ pattern: '/domain/', layer: 3 },
|
|
40
|
+
// Routes / controllers / handlers
|
|
41
|
+
{ pattern: '/api/', layer: 4 },
|
|
42
|
+
{ pattern: '/routes/', layer: 4 },
|
|
43
|
+
{ pattern: '/controllers/', layer: 4 },
|
|
44
|
+
{ pattern: '/handlers/', layer: 4 },
|
|
45
|
+
{ pattern: '/pages/', layer: 4 },
|
|
46
|
+
{ pattern: '/components/', layer: 4 },
|
|
47
|
+
// Middleware
|
|
48
|
+
{ pattern: '/middleware/', layer: 5 },
|
|
49
|
+
// Infrastructure / config
|
|
50
|
+
{ pattern: '/config/', layer: 6 },
|
|
51
|
+
{ pattern: '/utils/', layer: 6 },
|
|
52
|
+
{ pattern: '/helpers/', layer: 6 },
|
|
53
|
+
{ pattern: '/lib/', layer: 6 },
|
|
54
|
+
// Jobs / workers
|
|
55
|
+
{ pattern: '/jobs/', layer: 7 },
|
|
56
|
+
{ pattern: '/workers/', layer: 7 },
|
|
57
|
+
{ pattern: '/tasks/', layer: 7 },
|
|
58
|
+
// Tests — always last
|
|
59
|
+
{ pattern: '/tests/', layer: 8 },
|
|
60
|
+
{ pattern: '/test/', layer: 8 },
|
|
61
|
+
{ pattern: '/__tests__/', layer: 8 },
|
|
62
|
+
{ pattern: '.test.', layer: 8 },
|
|
63
|
+
{ pattern: '.spec.', layer: 8 },
|
|
64
|
+
];
|
|
65
|
+
/** Layer for files that don't match any rule */
|
|
66
|
+
const DEFAULT_LAYER = 5;
|
|
67
|
+
/**
|
|
68
|
+
* Determine the architectural layer for a file path.
|
|
69
|
+
* Returns the layer number (lower = earlier in reading order).
|
|
70
|
+
*/
|
|
71
|
+
export function getFileLayer(filePath, customLayers) {
|
|
72
|
+
const rules = customLayers ?? DEFAULT_LAYERS;
|
|
73
|
+
const pathLower = filePath.toLowerCase();
|
|
74
|
+
for (const rule of rules) {
|
|
75
|
+
if (pathLower.includes(rule.pattern)) {
|
|
76
|
+
return rule.layer;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return DEFAULT_LAYER;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Sort file paths by architectural layer, preserving score order within
|
|
83
|
+
* each layer. Returns a new array (does not mutate the input).
|
|
84
|
+
*/
|
|
85
|
+
export function sortByLayer(files, customLayers) {
|
|
86
|
+
return [...files].sort((a, b) => {
|
|
87
|
+
const layerA = getFileLayer(a.path, customLayers);
|
|
88
|
+
const layerB = getFileLayer(b.path, customLayers);
|
|
89
|
+
return layerA - layerB;
|
|
90
|
+
// Within same layer, preserve original order (score-based)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=layer-ordering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-ordering.js","sourceRoot":"","sources":["../src/layer-ordering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode auto-detection: determine whether a workspace should use
|
|
3
|
+
* code mode or knowledge mode.
|
|
4
|
+
*
|
|
5
|
+
* Detection rules:
|
|
6
|
+
* 1. IF package.json OR pyproject.toml OR go.mod OR Cargo.toml → code mode
|
|
7
|
+
* 2. ELSE → knowledge mode
|
|
8
|
+
* 3. Override: IF 70%+ files are .md, .txt, .json → knowledge mode
|
|
9
|
+
* 4. Override: IF 50%+ files are .ts, .js, .py, .go, .rs, .java → code mode
|
|
10
|
+
* 5. Explicit --mode flag always overrides
|
|
11
|
+
*/
|
|
12
|
+
import type { SelectionMode } from '@codeledger/types';
|
|
13
|
+
export interface ModeDetectionInput {
|
|
14
|
+
/** File paths relative to workspace root */
|
|
15
|
+
filePaths: string[];
|
|
16
|
+
/** Basenames of files in the workspace root directory */
|
|
17
|
+
rootFiles: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Auto-detect selection mode based on workspace contents.
|
|
21
|
+
*/
|
|
22
|
+
export declare function detectSelectionMode(input: ModeDetectionInput): SelectionMode;
|
|
23
|
+
//# sourceMappingURL=mode-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-detect.d.ts","sourceRoot":"","sources":["../src/mode-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA8BvD,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAoC5E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode auto-detection: determine whether a workspace should use
|
|
3
|
+
* code mode or knowledge mode.
|
|
4
|
+
*
|
|
5
|
+
* Detection rules:
|
|
6
|
+
* 1. IF package.json OR pyproject.toml OR go.mod OR Cargo.toml → code mode
|
|
7
|
+
* 2. ELSE → knowledge mode
|
|
8
|
+
* 3. Override: IF 70%+ files are .md, .txt, .json → knowledge mode
|
|
9
|
+
* 4. Override: IF 50%+ files are .ts, .js, .py, .go, .rs, .java → code mode
|
|
10
|
+
* 5. Explicit --mode flag always overrides
|
|
11
|
+
*/
|
|
12
|
+
/** Project root markers that indicate a code repository */
|
|
13
|
+
const CODE_ROOT_MARKERS = [
|
|
14
|
+
'package.json',
|
|
15
|
+
'pyproject.toml',
|
|
16
|
+
'go.mod',
|
|
17
|
+
'Cargo.toml',
|
|
18
|
+
'Gemfile',
|
|
19
|
+
'pom.xml',
|
|
20
|
+
'build.gradle',
|
|
21
|
+
'CMakeLists.txt',
|
|
22
|
+
'Makefile',
|
|
23
|
+
];
|
|
24
|
+
/** Extensions that indicate code files */
|
|
25
|
+
const CODE_EXTENSIONS = new Set([
|
|
26
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
27
|
+
'.py', '.go', '.rs', '.java', '.kt', '.cs',
|
|
28
|
+
'.c', '.cpp', '.h', '.hpp', '.rb', '.php',
|
|
29
|
+
'.swift', '.scala', '.dart',
|
|
30
|
+
]);
|
|
31
|
+
/** Extensions that indicate knowledge/document files */
|
|
32
|
+
const KNOWLEDGE_EXTENSIONS = new Set([
|
|
33
|
+
'.md', '.mdx', '.txt', '.json', '.yaml', '.yml',
|
|
34
|
+
'.csv', '.pdf', '.docx', '.xlsx', '.pptx',
|
|
35
|
+
'.rst', '.adoc', '.org',
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* Auto-detect selection mode based on workspace contents.
|
|
39
|
+
*/
|
|
40
|
+
export function detectSelectionMode(input) {
|
|
41
|
+
const { filePaths, rootFiles } = input;
|
|
42
|
+
// Rule 1: Check for code project root markers
|
|
43
|
+
const hasCodeMarker = CODE_ROOT_MARKERS.some((marker) => rootFiles.some((f) => f === marker));
|
|
44
|
+
// Count file types
|
|
45
|
+
let codeCount = 0;
|
|
46
|
+
let knowledgeCount = 0;
|
|
47
|
+
const total = filePaths.length;
|
|
48
|
+
for (const fp of filePaths) {
|
|
49
|
+
const ext = getExtension(fp);
|
|
50
|
+
if (CODE_EXTENSIONS.has(ext))
|
|
51
|
+
codeCount++;
|
|
52
|
+
if (KNOWLEDGE_EXTENSIONS.has(ext))
|
|
53
|
+
knowledgeCount++;
|
|
54
|
+
}
|
|
55
|
+
// Rule 3: If 70%+ are knowledge files → knowledge mode (even if code marker present)
|
|
56
|
+
if (total > 0 && knowledgeCount / total >= 0.7) {
|
|
57
|
+
return 'knowledge';
|
|
58
|
+
}
|
|
59
|
+
// Rule 4: If 50%+ are code files → code mode
|
|
60
|
+
if (total > 0 && codeCount / total >= 0.5) {
|
|
61
|
+
return 'code';
|
|
62
|
+
}
|
|
63
|
+
// Rule 1 fallback: Code marker present → code mode
|
|
64
|
+
if (hasCodeMarker) {
|
|
65
|
+
return 'code';
|
|
66
|
+
}
|
|
67
|
+
// Default: knowledge mode
|
|
68
|
+
return 'knowledge';
|
|
69
|
+
}
|
|
70
|
+
function getExtension(filePath) {
|
|
71
|
+
const lastDot = filePath.lastIndexOf('.');
|
|
72
|
+
if (lastDot < 0)
|
|
73
|
+
return '';
|
|
74
|
+
return filePath.slice(lastDot).toLowerCase();
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=mode-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-detect.js","sourceRoot":"","sources":["../src/mode-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,2DAA2D;AAC3D,MAAM,iBAAiB,GAAG;IACxB,cAAc;IACd,gBAAgB;IAChB,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,UAAU;CACX,CAAC;AAEF,0CAA0C;AAC1C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC5C,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;IAC1C,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IACzC,QAAQ,EAAE,QAAQ,EAAE,OAAO;CAC5B,CAAC,CAAC;AAEH,wDAAwD;AACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;IACzC,MAAM,EAAE,OAAO,EAAE,MAAM;CACxB,CAAC,CAAC;AASH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEvC,8CAA8C;IAC9C,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACtD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CACpC,CAAC;IAEF,mBAAmB;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,cAAc,EAAE,CAAC;IACtD,CAAC;IAED,qFAAqF;IACrF,IAAI,KAAK,GAAG,CAAC,IAAI,cAAc,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;QAC/C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,6CAA6C;IAC7C,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mDAAmD;IACnD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0BAA0B;IAC1B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NearMiss, ScoredFile, BundleFile } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Compute near-miss entries: files that were scored and ranked but didn't
|
|
4
|
+
* make it into the final bundle.
|
|
5
|
+
*/
|
|
6
|
+
export declare function computeNearMisses(allScored: ScoredFile[], selectedFiles: BundleFile[], tokenBudgetUsed: number, tokenBudgetTotal: number | undefined, maxNearMisses?: number,
|
|
7
|
+
/** Actual line counts per file path — avoids size_penalty cap at 1000 lines */
|
|
8
|
+
fileLineCounts?: Map<string, number>): NearMiss[];
|
|
9
|
+
//# sourceMappingURL=near-miss.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-miss.d.ts","sourceRoot":"","sources":["../src/near-miss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAc,MAAM,mBAAmB,CAAC;AActF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,UAAU,EAAE,EACvB,aAAa,EAAE,UAAU,EAAE,EAC3B,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,aAAa,CAAC,EAAE,MAAM;AACtB,+EAA+E;AAC/E,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,QAAQ,EAAE,CA6CZ"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { estimateTokensByExtension } from './token-calibration.js';
|
|
2
|
+
/**
|
|
3
|
+
* Near-Miss Explanation
|
|
4
|
+
*
|
|
5
|
+
* Shows files that almost made the bundle cut — useful for diagnostics,
|
|
6
|
+
* weight tuning, and task refinement. For each near-miss, explains
|
|
7
|
+
* why it was excluded and suggests how to include it.
|
|
8
|
+
*/
|
|
9
|
+
/** Maximum near-misses to report */
|
|
10
|
+
const DEFAULT_MAX_NEAR_MISSES = 5;
|
|
11
|
+
/**
|
|
12
|
+
* Compute near-miss entries: files that were scored and ranked but didn't
|
|
13
|
+
* make it into the final bundle.
|
|
14
|
+
*/
|
|
15
|
+
export function computeNearMisses(allScored, selectedFiles, tokenBudgetUsed, tokenBudgetTotal, maxNearMisses,
|
|
16
|
+
/** Actual line counts per file path — avoids size_penalty cap at 1000 lines */
|
|
17
|
+
fileLineCounts) {
|
|
18
|
+
const selectedPaths = new Set(selectedFiles.map((f) => f.path));
|
|
19
|
+
const max = maxNearMisses ?? DEFAULT_MAX_NEAR_MISSES;
|
|
20
|
+
// Find files that were scored but not selected (and aren't stubs/exemplars)
|
|
21
|
+
const misses = [];
|
|
22
|
+
let rank = 0;
|
|
23
|
+
for (const scored of allScored) {
|
|
24
|
+
rank++;
|
|
25
|
+
if (selectedPaths.has(scored.path))
|
|
26
|
+
continue;
|
|
27
|
+
if (scored.score <= 0)
|
|
28
|
+
continue; // Don't report zero/negative-score files
|
|
29
|
+
if (misses.length >= max)
|
|
30
|
+
break;
|
|
31
|
+
// Estimate the file's token cost using language-aware calibration.
|
|
32
|
+
// Prefer actual line count from the repo index (avoids size_penalty cap at 1000).
|
|
33
|
+
const actualLines = fileLineCounts?.get(scored.path);
|
|
34
|
+
const estimatedLines = actualLines ?? Math.max(1, Math.round(scored.features.size_penalty * 1000));
|
|
35
|
+
const fileExt = scored.path.includes('.')
|
|
36
|
+
? '.' + scored.path.split('.').pop()
|
|
37
|
+
: '';
|
|
38
|
+
const estimatedTokens = estimateTokensByExtension(estimatedLines, fileExt);
|
|
39
|
+
// How many tokens short of including this file?
|
|
40
|
+
const budgetRemaining = tokenBudgetTotal
|
|
41
|
+
? tokenBudgetTotal - tokenBudgetUsed
|
|
42
|
+
: Infinity;
|
|
43
|
+
const gapTokens = Math.max(0, estimatedTokens - budgetRemaining);
|
|
44
|
+
// Generate a suggestion based on the file's characteristics
|
|
45
|
+
const suggestion = generateSuggestion(scored, gapTokens);
|
|
46
|
+
const reasons = [...scored.reasons];
|
|
47
|
+
misses.push({
|
|
48
|
+
path: scored.path,
|
|
49
|
+
score: Math.round(scored.score * 1000) / 1000,
|
|
50
|
+
rank,
|
|
51
|
+
reasons,
|
|
52
|
+
budget_gap_tokens: gapTokens,
|
|
53
|
+
suggestion,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return misses;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a human-readable suggestion for how to include a near-miss file.
|
|
60
|
+
*/
|
|
61
|
+
function generateSuggestion(scored, gapTokens) {
|
|
62
|
+
const parts = [];
|
|
63
|
+
// Extract the file's basename stem for keyword suggestion
|
|
64
|
+
const pathParts = scored.path.split('/');
|
|
65
|
+
const filename = pathParts[pathParts.length - 1] ?? '';
|
|
66
|
+
const stem = filename.replace(/\.\w+$/, '').split(/[-_.]/).join(' ');
|
|
67
|
+
if (gapTokens > 0) {
|
|
68
|
+
parts.push(`increase budget by ~${gapTokens} tokens`);
|
|
69
|
+
}
|
|
70
|
+
if (scored.features.keyword === 0 && stem) {
|
|
71
|
+
parts.push(`add "${stem}" to your task description`);
|
|
72
|
+
}
|
|
73
|
+
if (parts.length === 0) {
|
|
74
|
+
parts.push('increase --max-files or --budget');
|
|
75
|
+
}
|
|
76
|
+
return parts.join('; or ');
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=near-miss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-miss.js","sourceRoot":"","sources":["../src/near-miss.ts"],"names":[],"mappings":"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"}
|
package/dist/scorer.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export interface LedgerStats {
|
|
|
3
3
|
success_files: Set<string>;
|
|
4
4
|
fail_files: Set<string>;
|
|
5
5
|
}
|
|
6
|
-
export declare function computeFeatures(file: FileInfo, taskKeywords: string[], repoIndex: RepoIndex, ledgerStats?: LedgerStats, tokenWeights?: Map<string, number>): FileFeatures;
|
|
6
|
+
export declare function computeFeatures(file: FileInfo, taskKeywords: string[], repoIndex: RepoIndex, ledgerStats?: LedgerStats, tokenWeights?: Map<string, number>, branchChangedFiles?: Set<string>): FileFeatures;
|
|
7
7
|
/**
|
|
8
8
|
* Scale temporal signals (churn, recent_touch) by keyword strength.
|
|
9
9
|
*
|
|
@@ -20,5 +20,5 @@ export declare function computeFeatures(file: FileInfo, taskKeywords: string[],
|
|
|
20
20
|
export declare function gateTemporalFeatures(features: FileFeatures): FileFeatures;
|
|
21
21
|
export declare function scoreFile(features: FileFeatures, weights: SelectorWeights): number;
|
|
22
22
|
export declare function deriveReasons(features: FileFeatures): ReasonCode[];
|
|
23
|
-
export declare function scoreAllCandidates(candidates: Set<string>, taskKeywords: string[], repoIndex: RepoIndex, weights: SelectorWeights, ledgerStats?: LedgerStats, tokenWeights?: Map<string, number>, fanoutFiles?: Set<string>): ScoredFile[];
|
|
23
|
+
export declare function scoreAllCandidates(candidates: Set<string>, taskKeywords: string[], repoIndex: RepoIndex, weights: SelectorWeights, ledgerStats?: LedgerStats, tokenWeights?: Map<string, number>, fanoutFiles?: Set<string>, branchChangedFiles?: Set<string>, surfaceFiles?: Set<string>): ScoredFile[];
|
|
24
24
|
//# sourceMappingURL=scorer.d.ts.map
|
package/dist/scorer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAkCD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAkCD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC/B,YAAY,CAiHd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAoBzE;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,eAAe,GACvB,MAAM,CAaR;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,EAAE,CAgBlE;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,EACxB,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,UAAU,EAAE,CA0Cd"}
|
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"}
|