@thanh01.pmt/domain-kit 0.1.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/README.md +1101 -0
- package/dist/assembly/index.cjs +213 -0
- package/dist/assembly/index.cjs.map +1 -0
- package/dist/assembly/index.d.cts +66 -0
- package/dist/assembly/index.d.ts +66 -0
- package/dist/assembly/index.mjs +4 -0
- package/dist/assembly/index.mjs.map +1 -0
- package/dist/chunk-3H2HX7PR.mjs +324 -0
- package/dist/chunk-3H2HX7PR.mjs.map +1 -0
- package/dist/chunk-3VVPSRAM.mjs +1297 -0
- package/dist/chunk-3VVPSRAM.mjs.map +1 -0
- package/dist/chunk-DRVOV5ZD.mjs +314 -0
- package/dist/chunk-DRVOV5ZD.mjs.map +1 -0
- package/dist/chunk-F4RZNBOE.mjs +3 -0
- package/dist/chunk-F4RZNBOE.mjs.map +1 -0
- package/dist/chunk-GEUDHZE7.mjs +446 -0
- package/dist/chunk-GEUDHZE7.mjs.map +1 -0
- package/dist/chunk-HH4UX65C.mjs +100 -0
- package/dist/chunk-HH4UX65C.mjs.map +1 -0
- package/dist/chunk-KMYENICQ.mjs +3 -0
- package/dist/chunk-KMYENICQ.mjs.map +1 -0
- package/dist/chunk-KNDBODUQ.mjs +153 -0
- package/dist/chunk-KNDBODUQ.mjs.map +1 -0
- package/dist/chunk-MM2RWYNW.mjs +3 -0
- package/dist/chunk-MM2RWYNW.mjs.map +1 -0
- package/dist/chunk-MOKNFLUD.mjs +851 -0
- package/dist/chunk-MOKNFLUD.mjs.map +1 -0
- package/dist/chunk-ONQHJ4OH.mjs +211 -0
- package/dist/chunk-ONQHJ4OH.mjs.map +1 -0
- package/dist/chunk-PM42MMDJ.mjs +516 -0
- package/dist/chunk-PM42MMDJ.mjs.map +1 -0
- package/dist/chunk-RKRNOVKO.mjs +166 -0
- package/dist/chunk-RKRNOVKO.mjs.map +1 -0
- package/dist/chunk-VFART56O.mjs +884 -0
- package/dist/chunk-VFART56O.mjs.map +1 -0
- package/dist/chunk-XMHKWHVK.mjs +218 -0
- package/dist/chunk-XMHKWHVK.mjs.map +1 -0
- package/dist/conceptEscalator-YfMKIKCZ.d.ts +40 -0
- package/dist/conceptEscalator-ltRLtPhf.d.cts +40 -0
- package/dist/concepts/index.cjs +155 -0
- package/dist/concepts/index.cjs.map +1 -0
- package/dist/concepts/index.d.cts +79 -0
- package/dist/concepts/index.d.ts +79 -0
- package/dist/concepts/index.mjs +4 -0
- package/dist/concepts/index.mjs.map +1 -0
- package/dist/curriculumFeedSchema-TEeQg2bY.d.cts +549 -0
- package/dist/curriculumFeedSchema-TEeQg2bY.d.ts +549 -0
- package/dist/detector/index.cjs +889 -0
- package/dist/detector/index.cjs.map +1 -0
- package/dist/detector/index.d.cts +112 -0
- package/dist/detector/index.d.ts +112 -0
- package/dist/detector/index.mjs +3 -0
- package/dist/detector/index.mjs.map +1 -0
- package/dist/domainProfileSchema-CwT3Ffsw.d.cts +105 -0
- package/dist/domainProfileSchema-CwT3Ffsw.d.ts +105 -0
- package/dist/extractors/index.cjs +387 -0
- package/dist/extractors/index.cjs.map +1 -0
- package/dist/extractors/index.d.cts +46 -0
- package/dist/extractors/index.d.ts +46 -0
- package/dist/extractors/index.mjs +4 -0
- package/dist/extractors/index.mjs.map +1 -0
- package/dist/feed/index.cjs +421 -0
- package/dist/feed/index.cjs.map +1 -0
- package/dist/feed/index.d.cts +23 -0
- package/dist/feed/index.d.ts +23 -0
- package/dist/feed/index.mjs +4 -0
- package/dist/feed/index.mjs.map +1 -0
- package/dist/graph/index.cjs +2167 -0
- package/dist/graph/index.cjs.map +1 -0
- package/dist/graph/index.d.cts +226 -0
- package/dist/graph/index.d.ts +226 -0
- package/dist/graph/index.mjs +4 -0
- package/dist/graph/index.mjs.map +1 -0
- package/dist/graphVerifier-DsTP9uAN.d.ts +37 -0
- package/dist/graphVerifier-QjgDAJce.d.cts +37 -0
- package/dist/hybridGraphSchema-BCgXicgA.d.cts +2840 -0
- package/dist/hybridGraphSchema-BCgXicgA.d.ts +2840 -0
- package/dist/index.cjs +5539 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/index.mjs.map +1 -0
- package/dist/keywordExtractor-CKaXqSku.d.ts +34 -0
- package/dist/keywordExtractor-zPAz2isq.d.cts +34 -0
- package/dist/llmClient-ysPhLjcH.d.cts +16 -0
- package/dist/llmClient-ysPhLjcH.d.ts +16 -0
- package/dist/parsers/index.cjs +323 -0
- package/dist/parsers/index.cjs.map +1 -0
- package/dist/parsers/index.d.cts +98 -0
- package/dist/parsers/index.d.ts +98 -0
- package/dist/parsers/index.mjs +4 -0
- package/dist/parsers/index.mjs.map +1 -0
- package/dist/pipeline/index.cjs +2166 -0
- package/dist/pipeline/index.cjs.map +1 -0
- package/dist/pipeline/index.d.cts +45 -0
- package/dist/pipeline/index.d.ts +45 -0
- package/dist/pipeline/index.mjs +8 -0
- package/dist/pipeline/index.mjs.map +1 -0
- package/dist/projectGraphSchema-DnD7orZV.d.cts +2581 -0
- package/dist/projectGraphSchema-DnD7orZV.d.ts +2581 -0
- package/dist/schemas/index.cjs +675 -0
- package/dist/schemas/index.cjs.map +1 -0
- package/dist/schemas/index.d.cts +253 -0
- package/dist/schemas/index.d.ts +253 -0
- package/dist/schemas/index.mjs +4 -0
- package/dist/schemas/index.mjs.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// src/extractors/fileRelevanceScorer.ts
|
|
2
|
+
var MAIN_DIRS = /* @__PURE__ */ new Set([
|
|
3
|
+
"src",
|
|
4
|
+
"app",
|
|
5
|
+
"lib",
|
|
6
|
+
"sources",
|
|
7
|
+
"packages",
|
|
8
|
+
"features",
|
|
9
|
+
"screens",
|
|
10
|
+
"views",
|
|
11
|
+
"components",
|
|
12
|
+
"models",
|
|
13
|
+
"services",
|
|
14
|
+
"viewmodels",
|
|
15
|
+
"controllers",
|
|
16
|
+
"repositories",
|
|
17
|
+
"utils",
|
|
18
|
+
"helpers"
|
|
19
|
+
]);
|
|
20
|
+
var LOW_RELEVANCE_DIRS = /* @__PURE__ */ new Set([
|
|
21
|
+
"test",
|
|
22
|
+
"tests",
|
|
23
|
+
"__tests__",
|
|
24
|
+
"testutils",
|
|
25
|
+
"fixtures",
|
|
26
|
+
"mocks",
|
|
27
|
+
"demo",
|
|
28
|
+
"sample",
|
|
29
|
+
"example",
|
|
30
|
+
"playground",
|
|
31
|
+
"docs",
|
|
32
|
+
"documentation",
|
|
33
|
+
"docc",
|
|
34
|
+
".build",
|
|
35
|
+
"node_modules",
|
|
36
|
+
"Pods",
|
|
37
|
+
"DerivedData"
|
|
38
|
+
]);
|
|
39
|
+
var ENTRY_NAMES = ["app.swift", "appdelegate.swift", "app.tsx", "app.jsx", "app.py", "index.ts", "index.tsx", "index.js", "main.py", "main.cpp", "main.swift"];
|
|
40
|
+
var CORE_PATTERNS = ["model", "service", "client", "manager", "controller", "repository", "viewmodel", "coordinator", "router", "store", "state", "auth", "api", "network", "database", "db"];
|
|
41
|
+
var NOISE_PATTERNS = ["test", "mock", "stub", "fake", "preview", "generated"];
|
|
42
|
+
function scoreByPath(relPath) {
|
|
43
|
+
let score = 0;
|
|
44
|
+
const signals = [];
|
|
45
|
+
const parts = relPath.toLowerCase().split(/[\\/]/);
|
|
46
|
+
const filename = parts[parts.length - 1] || "";
|
|
47
|
+
const basename = filename.replace(/\.[^.]+$/, "");
|
|
48
|
+
const isInMainDir = parts.some((p) => MAIN_DIRS.has(p));
|
|
49
|
+
const isInLowDir = parts.some((p) => LOW_RELEVANCE_DIRS.has(p));
|
|
50
|
+
if (isInMainDir) {
|
|
51
|
+
score += 3;
|
|
52
|
+
signals.push("main_dir");
|
|
53
|
+
}
|
|
54
|
+
if (isInLowDir) {
|
|
55
|
+
score -= 3;
|
|
56
|
+
signals.push("low_dir");
|
|
57
|
+
}
|
|
58
|
+
if (ENTRY_NAMES.some((n) => filename.includes(n))) {
|
|
59
|
+
score += 2;
|
|
60
|
+
signals.push("entry_point");
|
|
61
|
+
}
|
|
62
|
+
const coreHits = CORE_PATTERNS.filter((p) => basename.includes(p));
|
|
63
|
+
if (coreHits.length > 0) {
|
|
64
|
+
score += Math.min(coreHits.length, 3);
|
|
65
|
+
signals.push(`core(${coreHits.join(",")})`);
|
|
66
|
+
}
|
|
67
|
+
const noiseHits = NOISE_PATTERNS.filter((p) => basename.includes(p));
|
|
68
|
+
if (noiseHits.length > 0) {
|
|
69
|
+
score -= Math.min(noiseHits.length, 2);
|
|
70
|
+
signals.push(`noise(${noiseHits.join(",")})`);
|
|
71
|
+
}
|
|
72
|
+
if (parts.length > 5) {
|
|
73
|
+
score -= 1;
|
|
74
|
+
signals.push("deep_path");
|
|
75
|
+
}
|
|
76
|
+
return { path: relPath, score, signals };
|
|
77
|
+
}
|
|
78
|
+
function scoreByContent(relPath, content, parseResult, importCounts) {
|
|
79
|
+
const base = scoreByPath(relPath);
|
|
80
|
+
let score = base.score;
|
|
81
|
+
const signals = [...base.signals];
|
|
82
|
+
if (parseResult) {
|
|
83
|
+
const imports = "imports" in parseResult && Array.isArray(parseResult.imports) ? parseResult.imports.length : 0;
|
|
84
|
+
const types = "types" in parseResult && Array.isArray(parseResult.types) ? parseResult.types.length : 0;
|
|
85
|
+
const functions = "functions" in parseResult && Array.isArray(parseResult.functions) ? parseResult.functions.length : 0;
|
|
86
|
+
const totalSignals = imports + types + functions;
|
|
87
|
+
const signalScore = Math.min(totalSignals / 3, 5);
|
|
88
|
+
score += signalScore;
|
|
89
|
+
if (totalSignals > 5) signals.push(`ast_dense(${totalSignals})`);
|
|
90
|
+
}
|
|
91
|
+
const lines = content.split("\n").length;
|
|
92
|
+
if (lines > 200) {
|
|
93
|
+
score += 1;
|
|
94
|
+
signals.push("large_file");
|
|
95
|
+
}
|
|
96
|
+
if (lines > 500) {
|
|
97
|
+
score += 1;
|
|
98
|
+
signals.push("very_large");
|
|
99
|
+
}
|
|
100
|
+
const importCount = importCounts.get(relPath) || 0;
|
|
101
|
+
if (importCount >= 2) {
|
|
102
|
+
score += 1;
|
|
103
|
+
signals.push(`imported(${importCount})`);
|
|
104
|
+
}
|
|
105
|
+
if (importCount >= 5) {
|
|
106
|
+
score += 2;
|
|
107
|
+
signals.push("hub_file");
|
|
108
|
+
}
|
|
109
|
+
return { path: relPath, score, signals };
|
|
110
|
+
}
|
|
111
|
+
function selectRelevantFiles(filePaths, maxFiles = 40) {
|
|
112
|
+
const scores = filePaths.map((p) => scoreByPath(p));
|
|
113
|
+
scores.sort((a, b) => b.score - a.score);
|
|
114
|
+
const selected = scores.slice(0, maxFiles).map((s) => s.path);
|
|
115
|
+
return { selected, scores };
|
|
116
|
+
}
|
|
117
|
+
function scoreFiles(fileContentsMap, parseResults, _goal) {
|
|
118
|
+
const parseResultMap = /* @__PURE__ */ new Map();
|
|
119
|
+
for (const pr of parseResults) {
|
|
120
|
+
const filePath = extractFilePath(pr);
|
|
121
|
+
if (filePath) parseResultMap.set(filePath, pr);
|
|
122
|
+
}
|
|
123
|
+
const importCounts = /* @__PURE__ */ new Map();
|
|
124
|
+
for (const pr of parseResults) {
|
|
125
|
+
const imports = extractImports(pr);
|
|
126
|
+
for (const imp of imports) {
|
|
127
|
+
for (const [relPath] of fileContentsMap) {
|
|
128
|
+
if (relPath.includes(imp) || imp.includes(relPath.replace(/\.[^.]+$/, ""))) {
|
|
129
|
+
importCounts.set(relPath, (importCounts.get(relPath) || 0) + 1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const scores = [];
|
|
135
|
+
for (const [relPath, content] of fileContentsMap) {
|
|
136
|
+
scores.push(scoreByContent(relPath, content, parseResultMap.get(relPath), importCounts));
|
|
137
|
+
}
|
|
138
|
+
scores.sort((a, b) => b.score - a.score);
|
|
139
|
+
return scores;
|
|
140
|
+
}
|
|
141
|
+
function extractFilePath(pr) {
|
|
142
|
+
if ("file" in pr && typeof pr.file === "string") {
|
|
143
|
+
return pr.file;
|
|
144
|
+
}
|
|
145
|
+
const imports = "imports" in pr && Array.isArray(pr.imports) ? pr.imports : [];
|
|
146
|
+
for (const imp of imports) {
|
|
147
|
+
if (imp && typeof imp === "object" && "file" in imp) {
|
|
148
|
+
return imp.file;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
function extractImports(pr) {
|
|
154
|
+
if (!("imports" in pr) || !Array.isArray(pr.imports)) return [];
|
|
155
|
+
return pr.imports.map((imp) => {
|
|
156
|
+
if (typeof imp === "string") return imp;
|
|
157
|
+
if (imp && typeof imp === "object" && "module" in imp) {
|
|
158
|
+
return imp.module;
|
|
159
|
+
}
|
|
160
|
+
return "";
|
|
161
|
+
}).filter(Boolean);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { scoreByContent, scoreByPath, scoreFiles, selectRelevantFiles };
|
|
165
|
+
//# sourceMappingURL=chunk-RKRNOVKO.mjs.map
|
|
166
|
+
//# sourceMappingURL=chunk-RKRNOVKO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extractors/fileRelevanceScorer.ts"],"names":[],"mappings":"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","file":"chunk-RKRNOVKO.mjs","sourcesContent":["/**\n * File Relevance Scorer — determines which source files are most relevant\n * to the project goal, for pre-filtering before LLM calls.\n *\n * Inspired by knowledge-tree's 2-pass approach:\n * Pass 1: file tree (names only) → score by path heuristics → select top-K\n * Pass 2: only selected files → read content → AST parse → LLM\n *\n * Two scoring modes:\n * - scoreByPath(): lightweight, works on file names only (no content read)\n * - scoreByContent(): heavier, uses AST signals + import centrality\n */\n\nimport type { SourceContext } from './keywordExtractor';\n\nexport interface FileRelevanceScore {\n path: string;\n score: number;\n signals: string[];\n}\n\nconst MAIN_DIRS = new Set([\n 'src', 'app', 'lib', 'sources', 'packages',\n 'features', 'screens', 'views', 'components', 'models', 'services',\n 'viewmodels', 'controllers', 'repositories', 'utils', 'helpers',\n]);\n\nconst LOW_RELEVANCE_DIRS = new Set([\n 'test', 'tests', '__tests__', 'testutils', 'fixtures', 'mocks',\n 'demo', 'sample', 'example', 'playground',\n 'docs', 'documentation', 'docc',\n '.build', 'node_modules', 'Pods', 'DerivedData',\n]);\n\nconst ENTRY_NAMES = ['app.swift', 'appdelegate.swift', 'app.tsx', 'app.jsx', 'app.py', 'index.ts', 'index.tsx', 'index.js', 'main.py', 'main.cpp', 'main.swift'];\n\nconst CORE_PATTERNS = ['model', 'service', 'client', 'manager', 'controller', 'repository', 'viewmodel', 'coordinator', 'router', 'store', 'state', 'auth', 'api', 'network', 'database', 'db'];\n\nconst NOISE_PATTERNS = ['test', 'mock', 'stub', 'fake', 'preview', 'generated'];\n\n/**\n * Score a file by PATH ONLY — no content reading needed.\n * Used in Pass 1 (before any file content is loaded).\n */\nexport function scoreByPath(relPath: string): FileRelevanceScore {\n let score = 0;\n const signals: string[] = [];\n const parts = relPath.toLowerCase().split(/[\\\\/]/);\n const filename = parts[parts.length - 1] || '';\n const basename = filename.replace(/\\.[^.]+$/, '');\n\n const isInMainDir = parts.some(p => MAIN_DIRS.has(p));\n const isInLowDir = parts.some(p => LOW_RELEVANCE_DIRS.has(p));\n if (isInMainDir) { score += 3; signals.push('main_dir'); }\n if (isInLowDir) { score -= 3; signals.push('low_dir'); }\n\n if (ENTRY_NAMES.some(n => filename.includes(n))) {\n score += 2; signals.push('entry_point');\n }\n\n const coreHits = CORE_PATTERNS.filter(p => basename.includes(p));\n if (coreHits.length > 0) {\n score += Math.min(coreHits.length, 3);\n signals.push(`core(${coreHits.join(',')})`);\n }\n\n const noiseHits = NOISE_PATTERNS.filter(p => basename.includes(p));\n if (noiseHits.length > 0) {\n score -= Math.min(noiseHits.length, 2);\n signals.push(`noise(${noiseHits.join(',')})`);\n }\n\n if (parts.length > 5) { score -= 1; signals.push('deep_path'); }\n\n return { path: relPath, score, signals };\n}\n\n/**\n * Score a file by CONTENT — uses AST signals + import centrality.\n * Used in Pass 2 (after file content is loaded for selected files).\n */\nexport function scoreByContent(\n relPath: string,\n content: string,\n parseResult: SourceContext | undefined,\n importCounts: Map<string, number>,\n): FileRelevanceScore {\n const base = scoreByPath(relPath);\n let score = base.score;\n const signals = [...base.signals];\n\n if (parseResult) {\n const imports = ('imports' in parseResult && Array.isArray(parseResult.imports)) ? parseResult.imports.length : 0;\n const types = ('types' in parseResult && Array.isArray(parseResult.types)) ? parseResult.types.length : 0;\n const functions = ('functions' in parseResult && Array.isArray(parseResult.functions)) ? parseResult.functions.length : 0;\n const totalSignals = imports + types + functions;\n const signalScore = Math.min(totalSignals / 3, 5);\n score += signalScore;\n if (totalSignals > 5) signals.push(`ast_dense(${totalSignals})`);\n }\n\n const lines = content.split('\\n').length;\n if (lines > 200) { score += 1; signals.push('large_file'); }\n if (lines > 500) { score += 1; signals.push('very_large'); }\n\n const importCount = importCounts.get(relPath) || 0;\n if (importCount >= 2) { score += 1; signals.push(`imported(${importCount})`); }\n if (importCount >= 5) { score += 2; signals.push('hub_file'); }\n\n return { path: relPath, score, signals };\n}\n\n/**\n * Select top-K files by path scoring — NO content reading.\n * This is Pass 1: fast, lightweight, works on file tree only.\n */\nexport function selectRelevantFiles(\n filePaths: string[],\n maxFiles: number = 40,\n): { selected: string[]; scores: FileRelevanceScore[] } {\n const scores = filePaths.map(p => scoreByPath(p));\n scores.sort((a, b) => b.score - a.score);\n const selected = scores.slice(0, maxFiles).map(s => s.path);\n return { selected, scores };\n}\n\n/**\n * Score all files by content (Pass 2) — for use after content is loaded.\n */\nexport function scoreFiles(\n fileContentsMap: Map<string, string>,\n parseResults: SourceContext[],\n _goal: string,\n): FileRelevanceScore[] {\n const parseResultMap = new Map<string, SourceContext>();\n for (const pr of parseResults) {\n const filePath = extractFilePath(pr);\n if (filePath) parseResultMap.set(filePath, pr);\n }\n\n const importCounts = new Map<string, number>();\n for (const pr of parseResults) {\n const imports = extractImports(pr);\n for (const imp of imports) {\n for (const [relPath] of fileContentsMap) {\n if (relPath.includes(imp) || imp.includes(relPath.replace(/\\.[^.]+$/, ''))) {\n importCounts.set(relPath, (importCounts.get(relPath) || 0) + 1);\n }\n }\n }\n }\n\n const scores: FileRelevanceScore[] = [];\n for (const [relPath, content] of fileContentsMap) {\n scores.push(scoreByContent(relPath, content, parseResultMap.get(relPath), importCounts));\n }\n\n scores.sort((a, b) => b.score - a.score);\n return scores;\n}\n\nfunction extractFilePath(pr: SourceContext): string | null {\n if ('file' in pr && typeof (pr as Record<string, unknown>).file === 'string') {\n return (pr as Record<string, string>).file;\n }\n const imports = ('imports' in pr && Array.isArray(pr.imports)) ? pr.imports : [];\n for (const imp of imports) {\n if (imp && typeof imp === 'object' && 'file' in imp) {\n return (imp as { file: string }).file;\n }\n }\n return null;\n}\n\nfunction extractImports(pr: SourceContext): string[] {\n if (!('imports' in pr) || !Array.isArray(pr.imports)) return [];\n return pr.imports.map((imp) => {\n if (typeof imp === 'string') return imp;\n if (imp && typeof imp === 'object' && 'module' in imp) {\n return (imp as { module: string }).module;\n }\n return '';\n }).filter(Boolean);\n}\n"]}
|