clast-ai 0.1.2 → 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.
Files changed (294) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/.claude-plugin/plugin.json +11 -9
  3. package/README.md +468 -398
  4. package/bench/ab/onair-concept.json +22 -0
  5. package/bench/ab/onair-deadcode.json +7 -0
  6. package/bench/ab/onair-hard.json +32 -0
  7. package/bench/ab/onair-impact.json +17 -0
  8. package/bench/ab/onair-refactors.json +18 -0
  9. package/bench/ab/onair-survey.json +17 -0
  10. package/bench/ab/onair-tasks.json +20 -0
  11. package/bench/ab/onair.json +52 -0
  12. package/bench/ab/vscode-concept.json +22 -0
  13. package/bench/ab/vscode-hard.json +32 -0
  14. package/bench/ab/vscode-impact.json +17 -0
  15. package/bench/ab/vscode-refactors.json +18 -0
  16. package/bench/ab/vscode-tasks.json +20 -0
  17. package/bench/ab/vscode.json +52 -0
  18. package/bench/ab.mjs +213 -0
  19. package/bench/bench.mjs +98 -0
  20. package/bench/resolution.mjs +75 -0
  21. package/dist/cli.d.ts +2 -0
  22. package/dist/cli.js +266 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/config/defaults.d.ts +12 -2
  25. package/dist/config/defaults.js +38 -31
  26. package/dist/config/defaults.js.map +1 -1
  27. package/dist/config/index.d.ts +1 -1
  28. package/dist/config/index.js +26 -14
  29. package/dist/config/index.js.map +1 -1
  30. package/dist/db/index.d.ts +73 -13
  31. package/dist/db/index.js +481 -39
  32. package/dist/db/index.js.map +1 -1
  33. package/dist/engine.d.ts +15 -0
  34. package/dist/engine.js +28 -0
  35. package/dist/engine.js.map +1 -0
  36. package/dist/indexer/imports.d.ts +6 -0
  37. package/dist/indexer/imports.js +254 -0
  38. package/dist/indexer/imports.js.map +1 -0
  39. package/dist/indexer/index.d.ts +63 -0
  40. package/dist/indexer/index.js +360 -0
  41. package/dist/indexer/index.js.map +1 -0
  42. package/dist/indexer/process.d.ts +22 -0
  43. package/dist/indexer/process.js +42 -0
  44. package/dist/indexer/process.js.map +1 -0
  45. package/dist/indexer/scan.d.ts +43 -0
  46. package/dist/indexer/scan.js +223 -0
  47. package/dist/indexer/scan.js.map +1 -0
  48. package/dist/indexer/worker.d.ts +1 -0
  49. package/dist/indexer/worker.js +23 -0
  50. package/dist/indexer/worker.js.map +1 -0
  51. package/dist/llm/comment-generator.d.ts +17 -19
  52. package/dist/llm/comment-generator.js +46 -80
  53. package/dist/llm/comment-generator.js.map +1 -1
  54. package/dist/llm/index.d.ts +0 -1
  55. package/dist/llm/index.js.map +1 -1
  56. package/dist/llm/prompts.d.ts +0 -1
  57. package/dist/llm/prompts.js +16 -16
  58. package/dist/migrate.d.ts +35 -0
  59. package/dist/migrate.js +194 -0
  60. package/dist/migrate.js.map +1 -0
  61. package/dist/parser/extractor.d.ts +21 -16
  62. package/dist/parser/extractor.js +700 -228
  63. package/dist/parser/extractor.js.map +1 -1
  64. package/dist/parser/index.d.ts +17 -21
  65. package/dist/parser/index.js +115 -171
  66. package/dist/parser/index.js.map +1 -1
  67. package/dist/parser/langs/c.d.ts +3 -0
  68. package/dist/parser/langs/c.js +879 -0
  69. package/dist/parser/langs/c.js.map +1 -0
  70. package/dist/parser/langs/csharp.d.ts +2 -0
  71. package/dist/parser/langs/csharp.js +548 -0
  72. package/dist/parser/langs/csharp.js.map +1 -0
  73. package/dist/parser/langs/dart.d.ts +2 -0
  74. package/dist/parser/langs/dart.js +893 -0
  75. package/dist/parser/langs/dart.js.map +1 -0
  76. package/dist/parser/langs/go.d.ts +2 -0
  77. package/dist/parser/langs/go.js +455 -0
  78. package/dist/parser/langs/go.js.map +1 -0
  79. package/dist/parser/langs/java.d.ts +2 -0
  80. package/dist/parser/langs/java.js +390 -0
  81. package/dist/parser/langs/java.js.map +1 -0
  82. package/dist/parser/langs/php.d.ts +2 -0
  83. package/dist/parser/langs/php.js +486 -0
  84. package/dist/parser/langs/php.js.map +1 -0
  85. package/dist/parser/langs/python.d.ts +2 -0
  86. package/dist/parser/langs/python.js +216 -0
  87. package/dist/parser/langs/python.js.map +1 -0
  88. package/dist/parser/langs/ruby.d.ts +2 -0
  89. package/dist/parser/langs/ruby.js +602 -0
  90. package/dist/parser/langs/ruby.js.map +1 -0
  91. package/dist/parser/langs/rust.d.ts +2 -0
  92. package/dist/parser/langs/rust.js +931 -0
  93. package/dist/parser/langs/rust.js.map +1 -0
  94. package/dist/parser/langs/swift.d.ts +2 -0
  95. package/dist/parser/langs/swift.js +616 -0
  96. package/dist/parser/langs/swift.js.map +1 -0
  97. package/dist/parser/langs/typescript.d.ts +4 -0
  98. package/dist/parser/langs/typescript.js +535 -0
  99. package/dist/parser/langs/typescript.js.map +1 -0
  100. package/dist/parser/registry.d.ts +16 -0
  101. package/dist/parser/registry.js +87 -0
  102. package/dist/parser/registry.js.map +1 -0
  103. package/dist/parser/returns.d.ts +9 -0
  104. package/dist/parser/returns.js +152 -0
  105. package/dist/parser/returns.js.map +1 -0
  106. package/dist/parser/spec.d.ts +165 -0
  107. package/dist/parser/spec.js +188 -0
  108. package/dist/parser/spec.js.map +1 -0
  109. package/dist/query/arity.d.ts +27 -0
  110. package/dist/query/arity.js +187 -0
  111. package/dist/query/arity.js.map +1 -0
  112. package/dist/query/callgraph.d.ts +113 -0
  113. package/dist/query/callgraph.js +332 -0
  114. package/dist/query/callgraph.js.map +1 -0
  115. package/dist/query/format.d.ts +36 -0
  116. package/dist/query/format.js +136 -0
  117. package/dist/query/format.js.map +1 -0
  118. package/dist/query/hierarchy.d.ts +44 -0
  119. package/dist/query/hierarchy.js +441 -0
  120. package/dist/query/hierarchy.js.map +1 -0
  121. package/dist/query/resolve.d.ts +265 -0
  122. package/dist/query/resolve.js +1957 -0
  123. package/dist/query/resolve.js.map +1 -0
  124. package/dist/query/search.d.ts +35 -0
  125. package/dist/query/search.js +379 -0
  126. package/dist/query/search.js.map +1 -0
  127. package/dist/query/words.d.ts +30 -0
  128. package/dist/query/words.js +201 -0
  129. package/dist/query/words.js.map +1 -0
  130. package/dist/server/index.d.ts +1 -3
  131. package/dist/server/index.js +313 -73
  132. package/dist/server/index.js.map +1 -1
  133. package/dist/tools/context.d.ts +35 -0
  134. package/dist/tools/context.js +79 -0
  135. package/dist/tools/context.js.map +1 -0
  136. package/dist/tools/explore.d.ts +51 -0
  137. package/dist/tools/explore.js +779 -0
  138. package/dist/tools/explore.js.map +1 -0
  139. package/dist/tools/impact.d.ts +21 -0
  140. package/dist/tools/impact.js +743 -0
  141. package/dist/tools/impact.js.map +1 -0
  142. package/dist/tools/search.d.ts +59 -0
  143. package/dist/tools/search.js +843 -0
  144. package/dist/tools/search.js.map +1 -0
  145. package/dist/tools/stats.d.ts +26 -0
  146. package/dist/tools/stats.js +604 -0
  147. package/dist/tools/stats.js.map +1 -0
  148. package/dist/types.d.ts +95 -40
  149. package/dist/types.js +9 -1
  150. package/dist/types.js.map +1 -1
  151. package/dist/version.d.ts +2 -0
  152. package/dist/version.js +3 -0
  153. package/dist/version.js.map +1 -0
  154. package/dist/watcher/index.d.ts +18 -16
  155. package/dist/watcher/index.js +94 -77
  156. package/dist/watcher/index.js.map +1 -1
  157. package/package.json +21 -24
  158. package/plugin/server.mjs +72 -0
  159. package/skills/audit/SKILL.md +37 -0
  160. package/skills/deadcode/SKILL.md +33 -0
  161. package/skills/explore/SKILL.md +54 -0
  162. package/skills/impact/SKILL.md +24 -0
  163. package/skills/status/SKILL.md +11 -0
  164. package/src/cli.ts +265 -0
  165. package/src/config/defaults.ts +50 -32
  166. package/src/config/index.ts +23 -14
  167. package/src/db/index.ts +540 -43
  168. package/src/engine.ts +30 -0
  169. package/src/indexer/imports.ts +241 -0
  170. package/src/indexer/index.ts +369 -0
  171. package/src/indexer/process.ts +63 -0
  172. package/src/indexer/scan.ts +226 -0
  173. package/src/indexer/worker.ts +24 -0
  174. package/src/llm/comment-generator.ts +52 -103
  175. package/src/llm/index.ts +80 -80
  176. package/src/llm/prompts.ts +95 -95
  177. package/src/migrate.ts +213 -0
  178. package/src/parser/extractor.ts +643 -256
  179. package/src/parser/index.ts +105 -205
  180. package/src/parser/langs/c.ts +860 -0
  181. package/src/parser/langs/csharp.ts +519 -0
  182. package/src/parser/langs/dart.ts +820 -0
  183. package/src/parser/langs/go.ts +437 -0
  184. package/src/parser/langs/java.ts +361 -0
  185. package/src/parser/langs/php.ts +450 -0
  186. package/src/parser/langs/python.ts +206 -0
  187. package/src/parser/langs/ruby.ts +554 -0
  188. package/src/parser/langs/rust.ts +904 -0
  189. package/src/parser/langs/swift.ts +590 -0
  190. package/src/parser/langs/typescript.ts +499 -0
  191. package/src/parser/registry.ts +88 -0
  192. package/src/parser/returns.ts +137 -0
  193. package/src/parser/spec.ts +309 -0
  194. package/src/query/arity.ts +173 -0
  195. package/src/query/callgraph.ts +473 -0
  196. package/src/query/format.ts +136 -0
  197. package/src/query/hierarchy.ts +447 -0
  198. package/src/query/resolve.ts +1972 -0
  199. package/src/query/search.ts +430 -0
  200. package/src/query/words.ts +183 -0
  201. package/src/server/index.ts +390 -79
  202. package/src/tools/context.ts +82 -0
  203. package/src/tools/explore.ts +860 -0
  204. package/src/tools/impact.ts +748 -0
  205. package/src/tools/search.ts +886 -0
  206. package/src/tools/stats.ts +633 -0
  207. package/src/types.ts +113 -45
  208. package/src/version.ts +2 -0
  209. package/src/watcher/index.ts +82 -88
  210. package/tsconfig.json +6 -3
  211. package/.mcp.json +0 -8
  212. package/commands/clast-status.md +0 -9
  213. package/dist/config/defaults.d.ts.map +0 -1
  214. package/dist/config/index.d.ts.map +0 -1
  215. package/dist/db/index.d.ts.map +0 -1
  216. package/dist/db/queries.d.ts +0 -44
  217. package/dist/db/queries.d.ts.map +0 -1
  218. package/dist/db/queries.js +0 -251
  219. package/dist/db/queries.js.map +0 -1
  220. package/dist/db/schema.d.ts +0 -3
  221. package/dist/db/schema.d.ts.map +0 -1
  222. package/dist/db/schema.js +0 -94
  223. package/dist/db/schema.js.map +0 -1
  224. package/dist/db/types.d.ts +0 -44
  225. package/dist/db/types.d.ts.map +0 -1
  226. package/dist/db/types.js +0 -2
  227. package/dist/db/types.js.map +0 -1
  228. package/dist/llm/comment-generator.d.ts.map +0 -1
  229. package/dist/llm/index.d.ts.map +0 -1
  230. package/dist/llm/prompts.d.ts.map +0 -1
  231. package/dist/parser/call-resolver.d.ts +0 -15
  232. package/dist/parser/call-resolver.d.ts.map +0 -1
  233. package/dist/parser/call-resolver.js +0 -16
  234. package/dist/parser/call-resolver.js.map +0 -1
  235. package/dist/parser/extractor.d.ts.map +0 -1
  236. package/dist/parser/index.d.ts.map +0 -1
  237. package/dist/parser/languages.d.ts +0 -11
  238. package/dist/parser/languages.d.ts.map +0 -1
  239. package/dist/parser/languages.js +0 -74
  240. package/dist/parser/languages.js.map +0 -1
  241. package/dist/server/index.d.ts.map +0 -1
  242. package/dist/server/register-tools.d.ts +0 -7
  243. package/dist/server/register-tools.d.ts.map +0 -1
  244. package/dist/server/register-tools.js +0 -17
  245. package/dist/server/register-tools.js.map +0 -1
  246. package/dist/server/tools/clast-call-graph.d.ts +0 -4
  247. package/dist/server/tools/clast-call-graph.d.ts.map +0 -1
  248. package/dist/server/tools/clast-call-graph.js +0 -70
  249. package/dist/server/tools/clast-call-graph.js.map +0 -1
  250. package/dist/server/tools/clast-comment.d.ts +0 -5
  251. package/dist/server/tools/clast-comment.d.ts.map +0 -1
  252. package/dist/server/tools/clast-comment.js +0 -64
  253. package/dist/server/tools/clast-comment.js.map +0 -1
  254. package/dist/server/tools/clast-file-summary.d.ts +0 -4
  255. package/dist/server/tools/clast-file-summary.d.ts.map +0 -1
  256. package/dist/server/tools/clast-file-summary.js +0 -42
  257. package/dist/server/tools/clast-file-summary.js.map +0 -1
  258. package/dist/server/tools/clast-get-context.d.ts +0 -4
  259. package/dist/server/tools/clast-get-context.d.ts.map +0 -1
  260. package/dist/server/tools/clast-get-context.js +0 -80
  261. package/dist/server/tools/clast-get-context.js.map +0 -1
  262. package/dist/server/tools/clast-reindex.d.ts +0 -5
  263. package/dist/server/tools/clast-reindex.d.ts.map +0 -1
  264. package/dist/server/tools/clast-reindex.js +0 -36
  265. package/dist/server/tools/clast-reindex.js.map +0 -1
  266. package/dist/server/tools/clast-search.d.ts +0 -4
  267. package/dist/server/tools/clast-search.d.ts.map +0 -1
  268. package/dist/server/tools/clast-search.js +0 -29
  269. package/dist/server/tools/clast-search.js.map +0 -1
  270. package/dist/server/tools/clast-status.d.ts +0 -5
  271. package/dist/server/tools/clast-status.d.ts.map +0 -1
  272. package/dist/server/tools/clast-status.js +0 -23
  273. package/dist/server/tools/clast-status.js.map +0 -1
  274. package/dist/types.d.ts.map +0 -1
  275. package/dist/watcher/gitignore.d.ts +0 -9
  276. package/dist/watcher/gitignore.d.ts.map +0 -1
  277. package/dist/watcher/gitignore.js +0 -38
  278. package/dist/watcher/gitignore.js.map +0 -1
  279. package/dist/watcher/index.d.ts.map +0 -1
  280. package/skills/clast-explore/SKILL.md +0 -41
  281. package/src/db/queries.ts +0 -332
  282. package/src/db/schema.ts +0 -106
  283. package/src/db/types.ts +0 -47
  284. package/src/parser/call-resolver.ts +0 -17
  285. package/src/parser/languages.ts +0 -86
  286. package/src/server/register-tools.ts +0 -30
  287. package/src/server/tools/clast-call-graph.ts +0 -82
  288. package/src/server/tools/clast-comment.ts +0 -76
  289. package/src/server/tools/clast-file-summary.ts +0 -59
  290. package/src/server/tools/clast-get-context.ts +0 -97
  291. package/src/server/tools/clast-reindex.ts +0 -52
  292. package/src/server/tools/clast-search.ts +0 -38
  293. package/src/server/tools/clast-status.ts +0 -37
  294. package/src/watcher/gitignore.ts +0 -42
@@ -0,0 +1,254 @@
1
+ import { posix } from 'node:path';
2
+ const JS_LANGS = new Set(['typescript', 'tsx', 'javascript', 'vue']);
3
+ const EXT_RE = /\.[A-Za-z0-9]+$/;
4
+ /**
5
+ * In-memory lookup from path shapes to file ids, used to resolve import
6
+ * specifiers to indexed files.
7
+ */
8
+ class PathIndex {
9
+ /** Exact path -> id. */
10
+ exact = new Map();
11
+ /** Path without extension -> ids. */
12
+ noExt = new Map();
13
+ /** Last path segment (without extension) -> [pathNoExt, id][]. */
14
+ byBase = new Map();
15
+ constructor(files) {
16
+ for (const f of files) {
17
+ this.exact.set(f.path, f.id);
18
+ const stem = f.path.replace(EXT_RE, '');
19
+ const list = this.noExt.get(stem);
20
+ if (list)
21
+ list.push(f.id);
22
+ else
23
+ this.noExt.set(stem, [f.id]);
24
+ const base = stem.slice(stem.lastIndexOf('/') + 1);
25
+ const bl = this.byBase.get(base);
26
+ if (bl)
27
+ bl.push([stem, f.id, f.path]);
28
+ else
29
+ this.byBase.set(base, [[stem, f.id, f.path]]);
30
+ }
31
+ }
32
+ /** Resolve a concrete project-relative path, trying extensions and index files. */
33
+ lookup(p) {
34
+ const direct = this.exact.get(p);
35
+ if (direct !== undefined)
36
+ return direct;
37
+ const stemmed = this.noExt.get(p);
38
+ if (stemmed)
39
+ return stemmed[0];
40
+ // foo.js -> foo.ts (ESM-style TypeScript imports)
41
+ if (EXT_RE.test(p)) {
42
+ const alt = this.noExt.get(p.replace(EXT_RE, ''));
43
+ if (alt)
44
+ return alt[0];
45
+ }
46
+ for (const idx of ['/index', '/__init__', '/mod']) {
47
+ const hit = this.noExt.get(p + idx);
48
+ if (hit)
49
+ return hit[0];
50
+ }
51
+ return undefined;
52
+ }
53
+ /**
54
+ * Resolve a non-relative specifier by path suffix. When several files match,
55
+ * prefer the one closest to the importing file; give up if still ambiguous.
56
+ */
57
+ suffix(spec, fromPath) {
58
+ const stem = spec.replace(EXT_RE, '');
59
+ const base = stem.slice(stem.lastIndexOf('/') + 1);
60
+ const candidates = this.byBase.get(base) ?? (EXT_RE.test(spec) ? undefined : this.byBase.get(spec));
61
+ const hits = [];
62
+ const hasExt = spec !== stem;
63
+ for (const c of candidates ?? []) {
64
+ if (c[0] === stem || c[0].endsWith('/' + stem)) {
65
+ if (hasExt && !c[2].endsWith(spec))
66
+ continue;
67
+ hits.push(c);
68
+ }
69
+ }
70
+ if (hits.length === 0) {
71
+ // Package directory: a/b -> a/b/index.*, a/b/__init__.py, a/b/mod.rs
72
+ for (const idx of ['index', '__init__', 'mod']) {
73
+ for (const c of this.byBase.get(idx) ?? []) {
74
+ const dir = c[0].slice(0, -(idx.length + 1));
75
+ if (dir === stem || dir.endsWith('/' + stem))
76
+ hits.push(c);
77
+ }
78
+ if (hits.length)
79
+ break;
80
+ }
81
+ }
82
+ if (hits.length === 0)
83
+ return undefined;
84
+ if (hits.length === 1)
85
+ return hits[0][1];
86
+ let best;
87
+ let bestScore = -1;
88
+ let tie = false;
89
+ for (const h of hits) {
90
+ const score = commonPrefixSegments(h[0], fromPath);
91
+ if (score > bestScore) {
92
+ bestScore = score;
93
+ best = h[1];
94
+ tie = false;
95
+ }
96
+ else if (score === bestScore)
97
+ tie = true;
98
+ }
99
+ return tie ? undefined : best;
100
+ }
101
+ }
102
+ function commonPrefixSegments(a, b) {
103
+ const as = a.split('/');
104
+ const bs = b.split('/');
105
+ let n = 0;
106
+ while (n < as.length && n < bs.length && as[n] === bs[n])
107
+ n++;
108
+ return n;
109
+ }
110
+ function resolveOne(row, index) {
111
+ const dir = posix.dirname(row.path);
112
+ let src = row.source;
113
+ if (JS_LANGS.has(row.lang)) {
114
+ src = src.replace(/[?#].*$/, '');
115
+ if (src.startsWith('.')) {
116
+ const target = posix.normalize(posix.join(dir, src)).replace(/\/$/, '');
117
+ // require('..') / import '.' name a directory: its index file.
118
+ if (target === '.' || target === '')
119
+ return index.lookup('index');
120
+ return index.lookup(target);
121
+ }
122
+ if (src.startsWith('/'))
123
+ return index.lookup(src.slice(1));
124
+ // tsconfig-style aliases: "@/x", "~/x", "src/x", bare "vs/base/common/x"
125
+ const stripped = src.replace(/^(@|~)\//, '');
126
+ if (!stripped.includes('/'))
127
+ return undefined; // bare package name
128
+ return index.lookup(stripped) ?? index.lookup('src/' + stripped) ?? index.suffix(stripped, row.path);
129
+ }
130
+ if (row.lang === 'python') {
131
+ const m = /^(\.+)(.*)$/.exec(src);
132
+ if (m) {
133
+ let base = dir;
134
+ for (let i = 1; i < m[1].length; i++)
135
+ base = posix.dirname(base);
136
+ const rest = m[2].replace(/\./g, '/');
137
+ return index.lookup(posix.normalize(posix.join(base, rest || '.')));
138
+ }
139
+ const p = src.replace(/\./g, '/');
140
+ const direct = index.lookup(p) ?? index.lookup('src/' + p) ?? index.lookup('lib/' + p);
141
+ if (direct !== undefined)
142
+ return direct;
143
+ // A bare top-level module (`import datetime`) that is not at a source
144
+ // root is almost always the standard library or a dependency.
145
+ if (!p.includes('/'))
146
+ return undefined;
147
+ return index.suffix(p, row.path);
148
+ }
149
+ if (row.lang === 'c' || row.lang === 'cpp' || row.lang === 'objc') {
150
+ // <system.h> includes only resolve to an exact project path (a public
151
+ // include dir), never by suffix: <math.h> is not some vendored test/math.h.
152
+ const sys = /^<(.*)>$/.exec(src);
153
+ if (sys) {
154
+ const p = sys[1];
155
+ return index.lookup(p) ?? index.lookup('include/' + p) ?? index.lookup('src/' + p);
156
+ }
157
+ return (index.lookup(posix.normalize(posix.join(dir, src))) ??
158
+ index.lookup(src) ??
159
+ index.suffix(src, row.path));
160
+ }
161
+ if (row.lang === 'rust') {
162
+ let parts = src.replace(/\{.*$/s, '').replace(/::\*?$/, '').split('::').filter(Boolean);
163
+ let base = '';
164
+ if (parts[0] === 'crate')
165
+ parts = parts.slice(1);
166
+ else if (parts[0] === 'self') {
167
+ parts = parts.slice(1);
168
+ base = dir;
169
+ }
170
+ else if (parts[0] === 'super') {
171
+ base = dir;
172
+ while (parts[0] === 'super') {
173
+ parts = parts.slice(1);
174
+ base = posix.dirname(base);
175
+ }
176
+ }
177
+ // Trailing segments are usually items inside the module: try shorter paths.
178
+ for (let n = parts.length; n >= 1 && n >= parts.length - 2; n--) {
179
+ const p = parts.slice(0, n).join('/');
180
+ const hit = base ? index.lookup(posix.join(base, p)) : index.suffix(p, row.path);
181
+ if (hit !== undefined)
182
+ return hit;
183
+ }
184
+ return undefined;
185
+ }
186
+ if (row.lang === 'go')
187
+ return undefined; // Go imports name packages (directories), not files.
188
+ // Java / C# / PHP / Ruby / Kotlin / Swift / Dart ...: dotted or slashed names.
189
+ if (row.lang === 'ruby' || row.lang === 'dart') {
190
+ const clean = src.replace(/^package:[^/]+\//, '');
191
+ return (index.lookup(posix.normalize(posix.join(dir, clean))) ??
192
+ index.lookup('lib/' + clean) ??
193
+ index.suffix(clean, row.path));
194
+ }
195
+ const p = src.replace(/^\\/, '').replace(/[.\\]|::/g, '/').replace(/\/\*$/, '');
196
+ const hit = index.suffix(p, row.path);
197
+ if (hit !== undefined || row.lang !== 'java' || !p.includes('/'))
198
+ return hit;
199
+ // `import static pkg.Utils.mkEntry;` / `import pkg.Outer.Inner;`: the last segment is a member of the class file.
200
+ return index.suffix(p.slice(0, p.lastIndexOf('/')), row.path);
201
+ }
202
+ /**
203
+ * Resolve import specifiers to indexed files. With `fileIds`, only imports of
204
+ * those files are (re)resolved; otherwise every import is.
205
+ */
206
+ export function resolveImports(db, fileIds, newPaths) {
207
+ const files = db.all(`SELECT id, path FROM files`);
208
+ const index = new PathIndex(files);
209
+ const base = `SELECT i.rowid AS rowid, i.file_id, i.source, f.path, f.lang
210
+ FROM imports i JOIN files f ON f.id = i.file_id`;
211
+ let rows;
212
+ if (fileIds) {
213
+ rows = [];
214
+ for (const id of fileIds)
215
+ rows.push(...db.all(`${base} WHERE i.file_id = ?`, id));
216
+ // Files that just appeared may satisfy imports that could not be resolved before:
217
+ // retry only the unresolved imports that mention such a file's name.
218
+ const seen = new Set(rows.map(r => r.rowid));
219
+ for (const p of newPaths ?? []) {
220
+ const stem = p.slice(p.lastIndexOf('/') + 1).replace(/\.[A-Za-z0-9]+$/, '');
221
+ if (stem.length < 2)
222
+ continue;
223
+ const like = '%' + stem.replace(/[\\%_]/g, c => '\\' + c) + '%';
224
+ for (const r of db.all(`${base} WHERE i.resolved_id IS NULL AND i.source LIKE ? ESCAPE '\\'`, like)) {
225
+ if (!seen.has(r.rowid)) {
226
+ seen.add(r.rowid);
227
+ rows.push(r);
228
+ }
229
+ }
230
+ }
231
+ }
232
+ else {
233
+ rows = db.all(base);
234
+ }
235
+ let resolved = 0;
236
+ db.transaction(() => {
237
+ for (const row of rows) {
238
+ let target;
239
+ try {
240
+ target = resolveOne(row, index);
241
+ }
242
+ catch {
243
+ target = undefined;
244
+ }
245
+ if (target === row.file_id)
246
+ target = undefined;
247
+ db.run(`UPDATE imports SET resolved_id = ? WHERE rowid = ?`, target ?? null, row.rowid);
248
+ if (target !== undefined)
249
+ resolved++;
250
+ }
251
+ });
252
+ return resolved;
253
+ }
254
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/indexer/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { ClastConfig } from '../config/index.js';
2
+ import type { ClastDb } from '../db/index.js';
3
+ import { SourceParser } from '../parser/index.js';
4
+ import { IgnoreRules, type ScannedFile } from './scan.js';
5
+ export interface IndexResult {
6
+ scanned: number;
7
+ parsed: number;
8
+ unchanged: number;
9
+ removed: number;
10
+ durationMs: number;
11
+ workers: number;
12
+ }
13
+ export interface IndexProgress {
14
+ phase: 'idle' | 'scanning' | 'parsing' | 'finalizing';
15
+ done: number;
16
+ total: number;
17
+ }
18
+ /**
19
+ * Keeps the database in sync with the working tree: bulk (re)indexing with a
20
+ * worker pool, single-file updates, and on-demand freshness checks.
21
+ */
22
+ export declare class Indexer {
23
+ private readonly config;
24
+ private readonly db;
25
+ readonly root: string;
26
+ readonly rules: IgnoreRules;
27
+ readonly parser: SourceParser;
28
+ progress: IndexProgress;
29
+ lastResult: IndexResult | null;
30
+ /** True while a first-time index is being loaded (secondary indexes are not built yet). */
31
+ coldBuild: boolean;
32
+ private running;
33
+ private structureChanged;
34
+ constructor(root: string, config: ClastConfig, db: ClastDb);
35
+ get isIndexing(): boolean;
36
+ /** Resolves when the in-flight bulk index (if any) is finished. */
37
+ whenIdle(timeoutMs?: number): Promise<boolean>;
38
+ toRel(path: string): string;
39
+ /** Bring the whole index up to date. Concurrent calls share one run. */
40
+ indexAll(opts?: {
41
+ force?: boolean;
42
+ }): Promise<IndexResult>;
43
+ private runIndexAll;
44
+ /** Write one processing result. Must run inside a transaction. */
45
+ private apply;
46
+ private workerCount;
47
+ private runPool;
48
+ /**
49
+ * Re-index a single file inline. Returns true if the index changed.
50
+ * Accepts absolute or project-relative paths.
51
+ */
52
+ indexFile(path: string, opts?: {
53
+ force?: boolean;
54
+ }): Promise<boolean>;
55
+ removeFile(path: string): boolean;
56
+ /**
57
+ * Make sure the given indexed files reflect what is on disk right now
58
+ * (cheap stat check, inline re-parse when stale). Query paths call this
59
+ * before returning line numbers or source text.
60
+ */
61
+ ensureFresh(paths: Iterable<string>): Promise<number>;
62
+ scan(): Promise<ScannedFile[]>;
63
+ }