clast-ai 0.1.2 → 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.
Files changed (290) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/.claude-plugin/plugin.json +11 -9
  3. package/README.md +447 -401
  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 +257 -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/parser/extractor.d.ts +21 -16
  59. package/dist/parser/extractor.js +700 -228
  60. package/dist/parser/extractor.js.map +1 -1
  61. package/dist/parser/index.d.ts +17 -21
  62. package/dist/parser/index.js +115 -171
  63. package/dist/parser/index.js.map +1 -1
  64. package/dist/parser/langs/c.d.ts +3 -0
  65. package/dist/parser/langs/c.js +879 -0
  66. package/dist/parser/langs/c.js.map +1 -0
  67. package/dist/parser/langs/csharp.d.ts +2 -0
  68. package/dist/parser/langs/csharp.js +548 -0
  69. package/dist/parser/langs/csharp.js.map +1 -0
  70. package/dist/parser/langs/dart.d.ts +2 -0
  71. package/dist/parser/langs/dart.js +893 -0
  72. package/dist/parser/langs/dart.js.map +1 -0
  73. package/dist/parser/langs/go.d.ts +2 -0
  74. package/dist/parser/langs/go.js +455 -0
  75. package/dist/parser/langs/go.js.map +1 -0
  76. package/dist/parser/langs/java.d.ts +2 -0
  77. package/dist/parser/langs/java.js +390 -0
  78. package/dist/parser/langs/java.js.map +1 -0
  79. package/dist/parser/langs/php.d.ts +2 -0
  80. package/dist/parser/langs/php.js +486 -0
  81. package/dist/parser/langs/php.js.map +1 -0
  82. package/dist/parser/langs/python.d.ts +2 -0
  83. package/dist/parser/langs/python.js +216 -0
  84. package/dist/parser/langs/python.js.map +1 -0
  85. package/dist/parser/langs/ruby.d.ts +2 -0
  86. package/dist/parser/langs/ruby.js +602 -0
  87. package/dist/parser/langs/ruby.js.map +1 -0
  88. package/dist/parser/langs/rust.d.ts +2 -0
  89. package/dist/parser/langs/rust.js +931 -0
  90. package/dist/parser/langs/rust.js.map +1 -0
  91. package/dist/parser/langs/swift.d.ts +2 -0
  92. package/dist/parser/langs/swift.js +616 -0
  93. package/dist/parser/langs/swift.js.map +1 -0
  94. package/dist/parser/langs/typescript.d.ts +4 -0
  95. package/dist/parser/langs/typescript.js +535 -0
  96. package/dist/parser/langs/typescript.js.map +1 -0
  97. package/dist/parser/registry.d.ts +16 -0
  98. package/dist/parser/registry.js +87 -0
  99. package/dist/parser/registry.js.map +1 -0
  100. package/dist/parser/returns.d.ts +9 -0
  101. package/dist/parser/returns.js +152 -0
  102. package/dist/parser/returns.js.map +1 -0
  103. package/dist/parser/spec.d.ts +165 -0
  104. package/dist/parser/spec.js +188 -0
  105. package/dist/parser/spec.js.map +1 -0
  106. package/dist/query/arity.d.ts +27 -0
  107. package/dist/query/arity.js +187 -0
  108. package/dist/query/arity.js.map +1 -0
  109. package/dist/query/callgraph.d.ts +113 -0
  110. package/dist/query/callgraph.js +332 -0
  111. package/dist/query/callgraph.js.map +1 -0
  112. package/dist/query/format.d.ts +36 -0
  113. package/dist/query/format.js +136 -0
  114. package/dist/query/format.js.map +1 -0
  115. package/dist/query/hierarchy.d.ts +44 -0
  116. package/dist/query/hierarchy.js +441 -0
  117. package/dist/query/hierarchy.js.map +1 -0
  118. package/dist/query/resolve.d.ts +265 -0
  119. package/dist/query/resolve.js +1957 -0
  120. package/dist/query/resolve.js.map +1 -0
  121. package/dist/query/search.d.ts +35 -0
  122. package/dist/query/search.js +379 -0
  123. package/dist/query/search.js.map +1 -0
  124. package/dist/query/words.d.ts +30 -0
  125. package/dist/query/words.js +201 -0
  126. package/dist/query/words.js.map +1 -0
  127. package/dist/server/index.d.ts +1 -3
  128. package/dist/server/index.js +313 -73
  129. package/dist/server/index.js.map +1 -1
  130. package/dist/tools/context.d.ts +35 -0
  131. package/dist/tools/context.js +79 -0
  132. package/dist/tools/context.js.map +1 -0
  133. package/dist/tools/explore.d.ts +51 -0
  134. package/dist/tools/explore.js +779 -0
  135. package/dist/tools/explore.js.map +1 -0
  136. package/dist/tools/impact.d.ts +21 -0
  137. package/dist/tools/impact.js +743 -0
  138. package/dist/tools/impact.js.map +1 -0
  139. package/dist/tools/search.d.ts +59 -0
  140. package/dist/tools/search.js +843 -0
  141. package/dist/tools/search.js.map +1 -0
  142. package/dist/tools/stats.d.ts +26 -0
  143. package/dist/tools/stats.js +604 -0
  144. package/dist/tools/stats.js.map +1 -0
  145. package/dist/types.d.ts +95 -40
  146. package/dist/types.js +9 -1
  147. package/dist/types.js.map +1 -1
  148. package/dist/version.d.ts +2 -0
  149. package/dist/version.js +3 -0
  150. package/dist/version.js.map +1 -0
  151. package/dist/watcher/index.d.ts +18 -16
  152. package/dist/watcher/index.js +94 -77
  153. package/dist/watcher/index.js.map +1 -1
  154. package/package.json +21 -24
  155. package/plugin/server.mjs +50 -0
  156. package/skills/audit/SKILL.md +37 -0
  157. package/skills/deadcode/SKILL.md +33 -0
  158. package/skills/explore/SKILL.md +54 -0
  159. package/skills/impact/SKILL.md +24 -0
  160. package/skills/status/SKILL.md +11 -0
  161. package/src/cli.ts +256 -0
  162. package/src/config/defaults.ts +50 -32
  163. package/src/config/index.ts +23 -14
  164. package/src/db/index.ts +540 -43
  165. package/src/engine.ts +30 -0
  166. package/src/indexer/imports.ts +241 -0
  167. package/src/indexer/index.ts +369 -0
  168. package/src/indexer/process.ts +63 -0
  169. package/src/indexer/scan.ts +226 -0
  170. package/src/indexer/worker.ts +24 -0
  171. package/src/llm/comment-generator.ts +52 -103
  172. package/src/llm/index.ts +80 -80
  173. package/src/llm/prompts.ts +95 -95
  174. package/src/parser/extractor.ts +643 -256
  175. package/src/parser/index.ts +105 -205
  176. package/src/parser/langs/c.ts +860 -0
  177. package/src/parser/langs/csharp.ts +519 -0
  178. package/src/parser/langs/dart.ts +820 -0
  179. package/src/parser/langs/go.ts +437 -0
  180. package/src/parser/langs/java.ts +361 -0
  181. package/src/parser/langs/php.ts +450 -0
  182. package/src/parser/langs/python.ts +206 -0
  183. package/src/parser/langs/ruby.ts +554 -0
  184. package/src/parser/langs/rust.ts +904 -0
  185. package/src/parser/langs/swift.ts +590 -0
  186. package/src/parser/langs/typescript.ts +499 -0
  187. package/src/parser/registry.ts +88 -0
  188. package/src/parser/returns.ts +137 -0
  189. package/src/parser/spec.ts +309 -0
  190. package/src/query/arity.ts +173 -0
  191. package/src/query/callgraph.ts +473 -0
  192. package/src/query/format.ts +136 -0
  193. package/src/query/hierarchy.ts +447 -0
  194. package/src/query/resolve.ts +1972 -0
  195. package/src/query/search.ts +430 -0
  196. package/src/query/words.ts +183 -0
  197. package/src/server/index.ts +390 -79
  198. package/src/tools/context.ts +82 -0
  199. package/src/tools/explore.ts +860 -0
  200. package/src/tools/impact.ts +748 -0
  201. package/src/tools/search.ts +886 -0
  202. package/src/tools/stats.ts +633 -0
  203. package/src/types.ts +113 -45
  204. package/src/version.ts +2 -0
  205. package/src/watcher/index.ts +82 -88
  206. package/tsconfig.json +7 -4
  207. package/.mcp.json +0 -8
  208. package/commands/clast-status.md +0 -9
  209. package/dist/config/defaults.d.ts.map +0 -1
  210. package/dist/config/index.d.ts.map +0 -1
  211. package/dist/db/index.d.ts.map +0 -1
  212. package/dist/db/queries.d.ts +0 -44
  213. package/dist/db/queries.d.ts.map +0 -1
  214. package/dist/db/queries.js +0 -251
  215. package/dist/db/queries.js.map +0 -1
  216. package/dist/db/schema.d.ts +0 -3
  217. package/dist/db/schema.d.ts.map +0 -1
  218. package/dist/db/schema.js +0 -94
  219. package/dist/db/schema.js.map +0 -1
  220. package/dist/db/types.d.ts +0 -44
  221. package/dist/db/types.d.ts.map +0 -1
  222. package/dist/db/types.js +0 -2
  223. package/dist/db/types.js.map +0 -1
  224. package/dist/llm/comment-generator.d.ts.map +0 -1
  225. package/dist/llm/index.d.ts.map +0 -1
  226. package/dist/llm/prompts.d.ts.map +0 -1
  227. package/dist/parser/call-resolver.d.ts +0 -15
  228. package/dist/parser/call-resolver.d.ts.map +0 -1
  229. package/dist/parser/call-resolver.js +0 -16
  230. package/dist/parser/call-resolver.js.map +0 -1
  231. package/dist/parser/extractor.d.ts.map +0 -1
  232. package/dist/parser/index.d.ts.map +0 -1
  233. package/dist/parser/languages.d.ts +0 -11
  234. package/dist/parser/languages.d.ts.map +0 -1
  235. package/dist/parser/languages.js +0 -74
  236. package/dist/parser/languages.js.map +0 -1
  237. package/dist/server/index.d.ts.map +0 -1
  238. package/dist/server/register-tools.d.ts +0 -7
  239. package/dist/server/register-tools.d.ts.map +0 -1
  240. package/dist/server/register-tools.js +0 -17
  241. package/dist/server/register-tools.js.map +0 -1
  242. package/dist/server/tools/clast-call-graph.d.ts +0 -4
  243. package/dist/server/tools/clast-call-graph.d.ts.map +0 -1
  244. package/dist/server/tools/clast-call-graph.js +0 -70
  245. package/dist/server/tools/clast-call-graph.js.map +0 -1
  246. package/dist/server/tools/clast-comment.d.ts +0 -5
  247. package/dist/server/tools/clast-comment.d.ts.map +0 -1
  248. package/dist/server/tools/clast-comment.js +0 -64
  249. package/dist/server/tools/clast-comment.js.map +0 -1
  250. package/dist/server/tools/clast-file-summary.d.ts +0 -4
  251. package/dist/server/tools/clast-file-summary.d.ts.map +0 -1
  252. package/dist/server/tools/clast-file-summary.js +0 -42
  253. package/dist/server/tools/clast-file-summary.js.map +0 -1
  254. package/dist/server/tools/clast-get-context.d.ts +0 -4
  255. package/dist/server/tools/clast-get-context.d.ts.map +0 -1
  256. package/dist/server/tools/clast-get-context.js +0 -80
  257. package/dist/server/tools/clast-get-context.js.map +0 -1
  258. package/dist/server/tools/clast-reindex.d.ts +0 -5
  259. package/dist/server/tools/clast-reindex.d.ts.map +0 -1
  260. package/dist/server/tools/clast-reindex.js +0 -36
  261. package/dist/server/tools/clast-reindex.js.map +0 -1
  262. package/dist/server/tools/clast-search.d.ts +0 -4
  263. package/dist/server/tools/clast-search.d.ts.map +0 -1
  264. package/dist/server/tools/clast-search.js +0 -29
  265. package/dist/server/tools/clast-search.js.map +0 -1
  266. package/dist/server/tools/clast-status.d.ts +0 -5
  267. package/dist/server/tools/clast-status.d.ts.map +0 -1
  268. package/dist/server/tools/clast-status.js +0 -23
  269. package/dist/server/tools/clast-status.js.map +0 -1
  270. package/dist/types.d.ts.map +0 -1
  271. package/dist/watcher/gitignore.d.ts +0 -9
  272. package/dist/watcher/gitignore.d.ts.map +0 -1
  273. package/dist/watcher/gitignore.js +0 -38
  274. package/dist/watcher/gitignore.js.map +0 -1
  275. package/dist/watcher/index.d.ts.map +0 -1
  276. package/skills/clast-explore/SKILL.md +0 -41
  277. package/src/db/queries.ts +0 -332
  278. package/src/db/schema.ts +0 -106
  279. package/src/db/types.ts +0 -47
  280. package/src/parser/call-resolver.ts +0 -17
  281. package/src/parser/languages.ts +0 -86
  282. package/src/server/register-tools.ts +0 -30
  283. package/src/server/tools/clast-call-graph.ts +0 -82
  284. package/src/server/tools/clast-comment.ts +0 -76
  285. package/src/server/tools/clast-file-summary.ts +0 -59
  286. package/src/server/tools/clast-get-context.ts +0 -97
  287. package/src/server/tools/clast-reindex.ts +0 -52
  288. package/src/server/tools/clast-search.ts +0 -38
  289. package/src/server/tools/clast-status.ts +0 -37
  290. package/src/watcher/gitignore.ts +0 -42
@@ -0,0 +1,223 @@
1
+ import ignoreFactory from 'ignore';
2
+ import { readdirSync, readFileSync, existsSync } from 'node:fs';
3
+ import { stat } from 'node:fs/promises';
4
+ import { extname, join } from 'node:path';
5
+ import { supportedExtensions } from '../parser/registry.js';
6
+ // `ignore` is CJS; under NodeNext the default import may be the module object.
7
+ const createIgnore = ignoreFactory.default ?? ignoreFactory;
8
+ const BINARY_EXTENSIONS = new Set([
9
+ '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.webp', '.tiff', '.psd', '.svgz', '.pdf', '.zip', '.gz',
10
+ '.tgz', '.bz2', '.xz', '.7z', '.rar', '.tar', '.jar', '.war', '.class', '.exe', '.dll', '.so', '.dylib', '.a',
11
+ '.o', '.obj', '.lib', '.pdb', '.wasm', '.woff', '.woff2', '.ttf', '.otf', '.eot', '.mp3', '.mp4', '.mov',
12
+ '.avi', '.wav', '.ogg', '.flac', '.webm', '.bin', '.dat', '.db', '.sqlite', '.pyc', '.pyo', '.node', '.snap',
13
+ '.map', '.min.js', '.icns', '.cur', '.keystore', '.p12', '.pfx', '.der', '.nupkg', '.dmg', '.iso', '.blend',
14
+ ]);
15
+ const LOCK_FILES = new Set([
16
+ 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'Cargo.lock', 'composer.lock', 'Gemfile.lock', 'poetry.lock',
17
+ 'go.sum', 'bun.lockb', 'npm-shrinkwrap.json',
18
+ ]);
19
+ /**
20
+ * Ignore decisions shared by the scanner and the watcher: config patterns plus
21
+ * (optionally) every .gitignore from the project root down to the file.
22
+ */
23
+ export class IgnoreRules {
24
+ root;
25
+ useGitignore;
26
+ rootRule;
27
+ dirRules = new Map();
28
+ extensions;
29
+ maxFileSize;
30
+ constructor(root, config) {
31
+ this.root = root;
32
+ this.useGitignore = config.respectGitignore;
33
+ this.rootRule = { base: '', ig: createIgnore().add(config.ignoredPaths) };
34
+ this.extensions = supportedExtensions(config.languages);
35
+ this.maxFileSize = config.maxFileSize;
36
+ this.maxFiles = config.maxFiles;
37
+ }
38
+ /** Forget cached .gitignore contents (call when a .gitignore changes). */
39
+ invalidate() {
40
+ this.dirRules.clear();
41
+ }
42
+ /** Rule for the .gitignore inside `dirRel` ('' or 'a/b/'), if any. */
43
+ ruleFor(dirRel) {
44
+ if (!this.useGitignore)
45
+ return null;
46
+ let rule = this.dirRules.get(dirRel);
47
+ if (rule !== undefined)
48
+ return rule;
49
+ rule = null;
50
+ const file = join(this.root, dirRel, '.gitignore');
51
+ try {
52
+ if (existsSync(file)) {
53
+ rule = { base: dirRel, ig: createIgnore().add(readFileSync(file, 'utf-8')) };
54
+ }
55
+ }
56
+ catch {
57
+ rule = null;
58
+ }
59
+ this.dirRules.set(dirRel, rule);
60
+ return rule;
61
+ }
62
+ static test(rules, rel, isDir) {
63
+ let ignored = false;
64
+ for (const r of rules) {
65
+ const sub = rel.slice(r.base.length) + (isDir ? '/' : '');
66
+ if (!sub)
67
+ continue;
68
+ const t = r.ig.test(sub);
69
+ if (t.ignored)
70
+ ignored = true;
71
+ else if (t.unignored)
72
+ ignored = false;
73
+ }
74
+ return ignored;
75
+ }
76
+ /** Full check for an arbitrary project-relative path (used by the watcher). */
77
+ isIgnored(rel) {
78
+ const parts = rel.split('/');
79
+ const rules = [this.rootRule];
80
+ const rootGit = this.ruleFor('');
81
+ if (rootGit)
82
+ rules.push(rootGit);
83
+ let prefix = '';
84
+ for (let i = 0; i < parts.length; i++) {
85
+ const name = parts[i];
86
+ const isDir = i < parts.length - 1;
87
+ if (isDir && name.startsWith('.'))
88
+ return true;
89
+ const path = prefix + name;
90
+ if (IgnoreRules.test(rules, path, isDir))
91
+ return true;
92
+ if (isDir) {
93
+ prefix = path + '/';
94
+ const r = this.ruleFor(prefix);
95
+ if (r)
96
+ rules.push(r);
97
+ }
98
+ }
99
+ return false;
100
+ }
101
+ isSupported(rel) {
102
+ return this.extensions.has(extname(rel).toLowerCase());
103
+ }
104
+ /** Files skipped by the last scan because they exceed maxFileSize. */
105
+ skippedLarge = 0;
106
+ /** True when the last scan stopped at the maxFiles cap. */
107
+ truncated = false;
108
+ maxFiles;
109
+ /**
110
+ * Project-relative paths of text-like files that are NOT indexed (config,
111
+ * docs, data, unsupported languages) but pass the ignore rules. Used by
112
+ * text search so it can replace a plain grep.
113
+ */
114
+ otherTextFiles(limit = 60000) {
115
+ const out = [];
116
+ const visit = (dirRel, parentRules, depth) => {
117
+ if (depth > 40 || out.length >= limit)
118
+ return;
119
+ const rule = this.ruleFor(dirRel);
120
+ const rules = rule ? [...parentRules, rule] : parentRules;
121
+ let entries;
122
+ try {
123
+ entries = readdirSync(join(this.root, dirRel), { withFileTypes: true });
124
+ }
125
+ catch {
126
+ return;
127
+ }
128
+ for (const e of entries) {
129
+ const name = e.name;
130
+ if (e.isDirectory()) {
131
+ if (name.startsWith('.') && name !== '.github')
132
+ continue;
133
+ const rel = dirRel + name;
134
+ if (IgnoreRules.test(rules, rel, true))
135
+ continue;
136
+ visit(rel + '/', rules, depth + 1);
137
+ }
138
+ else if (e.isFile()) {
139
+ const ext = extname(name).toLowerCase();
140
+ if (this.extensions.has(ext) || BINARY_EXTENSIONS.has(ext) || LOCK_FILES.has(name))
141
+ continue;
142
+ const rel = dirRel + name;
143
+ if (IgnoreRules.test(rules, rel, false))
144
+ continue;
145
+ out.push(rel);
146
+ if (out.length >= limit)
147
+ return;
148
+ }
149
+ }
150
+ };
151
+ visit('', [this.rootRule], 0);
152
+ return out;
153
+ }
154
+ /** Walk the project and return every indexable file. */
155
+ async scan() {
156
+ const candidates = [];
157
+ this.skippedLarge = 0;
158
+ this.truncated = false;
159
+ const rules = [this.rootRule];
160
+ this.walk('', rules, candidates, 0);
161
+ // stat() dominates a warm start (especially on Windows); run it on the
162
+ // libuv thread pool instead of serially on the main thread.
163
+ const out = new Array(candidates.length);
164
+ let next = 0;
165
+ const worker = async () => {
166
+ while (next < candidates.length) {
167
+ const i = next++;
168
+ const rel = candidates[i];
169
+ const abs = join(this.root, rel);
170
+ try {
171
+ const st = await stat(abs);
172
+ if (st.size <= this.maxFileSize)
173
+ out[i] = { abs, rel, mtime: st.mtimeMs, size: st.size };
174
+ else
175
+ this.skippedLarge++;
176
+ }
177
+ catch {
178
+ // vanished between readdir and stat
179
+ }
180
+ }
181
+ };
182
+ await Promise.all(Array.from({ length: Math.min(32, candidates.length) }, worker));
183
+ return out.filter(Boolean);
184
+ }
185
+ walk(dirRel, parentRules, out, depth) {
186
+ if (depth > 40)
187
+ return;
188
+ if (out.length >= this.maxFiles) {
189
+ this.truncated = true;
190
+ return;
191
+ }
192
+ const rule = this.ruleFor(dirRel);
193
+ const rules = rule ? [...parentRules, rule] : parentRules;
194
+ let entries;
195
+ try {
196
+ entries = readdirSync(join(this.root, dirRel), { withFileTypes: true });
197
+ }
198
+ catch {
199
+ return;
200
+ }
201
+ for (const e of entries) {
202
+ const name = e.name;
203
+ if (e.isDirectory()) {
204
+ if (name.startsWith('.'))
205
+ continue;
206
+ const rel = dirRel + name;
207
+ if (IgnoreRules.test(rules, rel, true))
208
+ continue;
209
+ this.walk(rel + '/', rules, out, depth + 1);
210
+ }
211
+ else if (e.isFile()) {
212
+ if (!this.extensions.has(extname(name).toLowerCase()))
213
+ continue;
214
+ const rel = dirRel + name;
215
+ if (IgnoreRules.test(rules, rel, false))
216
+ continue;
217
+ out.push(rel);
218
+ }
219
+ // Symlinks are skipped: they cause cycles and duplicate symbols.
220
+ }
221
+ }
222
+ }
223
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/indexer/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { parentPort, workerData } from 'node:worker_threads';
2
+ import { SourceParser } from '../parser/index.js';
3
+ import { processFile } from './process.js';
4
+ /**
5
+ * Indexing worker: receives batches of files, reads + parses them, and posts
6
+ * the extraction results back. The main thread owns the database.
7
+ */
8
+ const { maxFileSize } = workerData;
9
+ const parser = new SourceParser();
10
+ if (parentPort) {
11
+ const port = parentPort;
12
+ port.on('message', async (tasks) => {
13
+ if (tasks === null) {
14
+ process.exit(0);
15
+ }
16
+ const results = [];
17
+ for (const task of tasks) {
18
+ results.push(await processFile(parser, task, maxFileSize));
19
+ }
20
+ port.postMessage(results);
21
+ });
22
+ }
23
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/indexer/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAkC,MAAM,cAAc,CAAC;AAE3E;;;GAGG;AACH,MAAM,EAAE,WAAW,EAAE,GAAG,UAAqC,CAAC;AAC9D,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAElC,IAAI,UAAU,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE;QACpD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,26 +1,24 @@
1
- import { LlmClient } from './index.js';
2
- import type { Queries } from '../db/queries.js';
1
+ import type { ClastDb } from '../db/index.js';
3
2
  import type { ClastConfig } from '../config/index.js';
3
+ import { type SymbolRow } from '../types.js';
4
+ import type { LineCache } from '../query/format.js';
5
+ /**
6
+ * Generates documentation for undocumented symbols with an OpenAI-compatible
7
+ * endpoint. Generated text is stored by (path, qualified name) so it survives
8
+ * re-indexing of the file.
9
+ */
4
10
  export declare class CommentGenerator {
11
+ private readonly db;
12
+ private readonly config;
13
+ private readonly lines;
5
14
  private client;
6
- private queries;
7
- private config;
8
- constructor(client: LlmClient, queries: Queries, config: ClastConfig);
15
+ constructor(db: ClastDb, config: ClastConfig, lines: LineCache);
9
16
  get isAvailable(): boolean;
17
+ /** Previously generated doc for a symbol, if any. */
18
+ stored(sym: SymbolRow): string | null;
10
19
  /**
11
- * Generate a comment for a specific node.
12
- * Returns the generated comment text, or null if generation is disabled/failed.
20
+ * Returns the doc for a symbol: the original comment when present (unless
21
+ * alwaysGenerate), else a stored or freshly generated one. Null on failure.
13
22
  */
14
- generateForNode(nodeId: number): Promise<string | null>;
15
- /**
16
- * Batch generate comments for nodes without any comments.
17
- * Returns counts of successes and failures.
18
- */
19
- batchGenerate(limit?: number, onProgress?: (current: number, total: number) => void): Promise<{
20
- success: number;
21
- failed: number;
22
- skipped: number;
23
- }>;
24
- private buildPrompt;
23
+ generate(sym: SymbolRow, force?: boolean): Promise<string | null>;
25
24
  }
26
- //# sourceMappingURL=comment-generator.d.ts.map
@@ -1,106 +1,72 @@
1
+ import { LlmClient } from './index.js';
1
2
  import { buildFunctionCommentPrompt, buildClassCommentPrompt } from './prompts.js';
3
+ import { CONTAINER_KINDS } from '../types.js';
4
+ /**
5
+ * Generates documentation for undocumented symbols with an OpenAI-compatible
6
+ * endpoint. Generated text is stored by (path, qualified name) so it survives
7
+ * re-indexing of the file.
8
+ */
2
9
  export class CommentGenerator {
3
- client;
4
- queries;
10
+ db;
5
11
  config;
6
- constructor(client, queries, config) {
7
- this.client = client;
8
- this.queries = queries;
12
+ lines;
13
+ client;
14
+ constructor(db, config, lines) {
15
+ this.db = db;
9
16
  this.config = config;
17
+ this.lines = lines;
18
+ this.client = new LlmClient(config.llm.endpoint, config.llm.model, config.llm.apiKey);
10
19
  }
11
20
  get isAvailable() {
12
21
  return this.client.isConfigured;
13
22
  }
23
+ /** Previously generated doc for a symbol, if any. */
24
+ stored(sym) {
25
+ const row = this.db.get(`SELECT text FROM gen_docs WHERE path = ? AND qname = ?`, sym.path, sym.qname);
26
+ return row?.text ?? null;
27
+ }
14
28
  /**
15
- * Generate a comment for a specific node.
16
- * Returns the generated comment text, or null if generation is disabled/failed.
29
+ * Returns the doc for a symbol: the original comment when present (unless
30
+ * alwaysGenerate), else a stored or freshly generated one. Null on failure.
17
31
  */
18
- async generateForNode(nodeId) {
32
+ async generate(sym, force = false) {
33
+ if (sym.doc && !this.config.llm.alwaysGenerate && !force)
34
+ return sym.doc;
35
+ if (!force) {
36
+ const existing = this.stored(sym);
37
+ if (existing)
38
+ return existing;
39
+ }
19
40
  if (!this.client.isConfigured)
20
41
  return null;
21
- const node = this.queries.getNodeById(nodeId);
22
- if (!node)
23
- return null;
24
- // Check if original comment exists
25
- const existingComments = this.queries.getCommentsForNode(nodeId);
26
- const hasOriginal = existingComments.some(c => c.source === 'original');
27
- if (hasOriginal && !this.config.llm.alwaysGenerate) {
28
- // Original comment exists and we're not forcing generation
29
- return existingComments.find(c => c.source === 'original')?.text ?? null;
42
+ let prompt;
43
+ if (CONTAINER_KINDS.has(sym.kind)) {
44
+ const members = this.db
45
+ .all(`SELECT name FROM symbols WHERE parent_id = ? AND kind IN ('method', 'function') LIMIT 60`, sym.id)
46
+ .map(m => m.name);
47
+ prompt = buildClassCommentPrompt(sym.name, sym.signature, members, sym.lang);
48
+ }
49
+ else {
50
+ const src = this.lines.lines(sym.path);
51
+ const body = src ? src.slice(sym.start_line - 1, Math.min(sym.end_line, sym.start_line + 80)).join('\n') : '';
52
+ prompt = buildFunctionCommentPrompt(sym.signature, body, sym.lang);
30
53
  }
31
54
  try {
32
- const prompt = this.buildPrompt(node);
33
55
  const response = await this.client.complete([
34
56
  { role: 'system', content: prompt.system },
35
57
  { role: 'user', content: prompt.user },
36
58
  ]);
37
- const comment = response.content.trim();
38
- if (!comment)
59
+ const text = response.content.trim();
60
+ if (!text)
39
61
  return null;
40
- // Remove existing generated comment if any
41
- this.queries.deleteCommentsBySource(nodeId, 'generated');
42
- // Store the generated comment
43
- this.queries.insertComment(nodeId, comment, 'generated');
44
- return comment;
62
+ this.db.run(`INSERT INTO gen_docs (path, qname, text, created_at) VALUES (?, ?, ?, ?)
63
+ ON CONFLICT(path, qname) DO UPDATE SET text = excluded.text, created_at = excluded.created_at`, sym.path, sym.qname, text, Date.now());
64
+ return text;
45
65
  }
46
66
  catch (err) {
47
- console.error(`[clast] Failed to generate comment for node ${nodeId}:`, err);
67
+ console.error(`[clast] comment generation failed for ${sym.qname}:`, err instanceof Error ? err.message : err);
48
68
  return null;
49
69
  }
50
70
  }
51
- /**
52
- * Batch generate comments for nodes without any comments.
53
- * Returns counts of successes and failures.
54
- */
55
- async batchGenerate(limit = 100, onProgress) {
56
- if (!this.client.isConfigured) {
57
- return { success: 0, failed: 0, skipped: 0 };
58
- }
59
- const nodes = this.queries.getNodesWithoutComments(limit);
60
- let success = 0;
61
- let failed = 0;
62
- let skipped = 0;
63
- // Process with concurrency limit
64
- const concurrency = this.config.llm.maxConcurrent;
65
- const chunks = chunkArray(nodes, concurrency);
66
- let processed = 0;
67
- for (const chunk of chunks) {
68
- const results = await Promise.allSettled(chunk.map(node => this.generateForNode(node.id)));
69
- for (const result of results) {
70
- processed++;
71
- onProgress?.(processed, nodes.length);
72
- if (result.status === 'fulfilled') {
73
- if (result.value) {
74
- success++;
75
- }
76
- else {
77
- skipped++;
78
- }
79
- }
80
- else {
81
- failed++;
82
- }
83
- }
84
- }
85
- return { success, failed, skipped };
86
- }
87
- buildPrompt(node) {
88
- if (node.type === 'class' || node.type === 'interface' || node.type === 'struct' || node.type === 'trait') {
89
- // Get method names for context
90
- const children = this.queries.searchNodes(node.name, 'method', 50);
91
- const methodNames = children
92
- .filter(c => c.file_path === node.file_path)
93
- .map(c => c.name);
94
- return buildClassCommentPrompt(node.name, node.signature, methodNames, node.language);
95
- }
96
- return buildFunctionCommentPrompt(node.signature, node.body_text, node.language);
97
- }
98
- }
99
- function chunkArray(arr, size) {
100
- const chunks = [];
101
- for (let i = 0; i < arr.length; i += size) {
102
- chunks.push(arr.slice(i, i + size));
103
- }
104
- return chunks;
105
71
  }
106
72
  //# sourceMappingURL=comment-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment-generator.js","sourceRoot":"","sources":["../../src/llm/comment-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comment-generator.js","sourceRoot":"","sources":["../../src/llm/comment-generator.ts"],"names":[],"mappings":"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"}
@@ -21,4 +21,3 @@ export declare class LlmClient {
21
21
  maxTokens?: number;
22
22
  }): Promise<LlmResponse>;
23
23
  }
24
- //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,SAAS;IACZ,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,MAAM,CAAS;IAEvB,YAAY,QAAgB,EAAE,KAAa,EAAE,SAAiB,EAAE;QAC9D,8CAA8C;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAuB,EACvB,UAAwD,EAAE;QAE1D,MAAM,EAAE,WAAW,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;QAEvD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,mBAAmB,CAAC;QAChD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ;oBACR,WAAW;oBACX,UAAU,EAAE,SAAS;iBACtB,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YAC1D,OAAO;gBACL,OAAO;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,SAAS;IACZ,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,MAAM,CAAS;IAEvB,YAAY,QAAgB,EAAE,KAAa,EAAE,MAAM,GAAW,EAAE;QAC9D,8CAA8C;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAuB,EACvB,OAAO,GAAiD,EAAE;QAE1D,MAAM,EAAE,WAAW,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;QAEvD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,mBAAmB,CAAC;QAChD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ;oBACR,WAAW;oBACX,UAAU,EAAE,SAAS;iBACtB,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YAC1D,OAAO;gBACL,OAAO;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
@@ -6,4 +6,3 @@ export declare function buildClassCommentPrompt(name: string, signature: string,
6
6
  system: string;
7
7
  user: string;
8
8
  };
9
- //# sourceMappingURL=prompts.d.ts.map
@@ -51,28 +51,28 @@ const LANGUAGE_COMMENT_STYLES = {
51
51
  export function buildFunctionCommentPrompt(signature, bodyText, language) {
52
52
  const style = LANGUAGE_COMMENT_STYLES[language] ?? LANGUAGE_COMMENT_STYLES['typescript'];
53
53
  const system = `You are a code documentation expert. Generate a concise, clear documentation comment for the given function or method. Use the ${language} documentation style. Output ONLY the comment text (no code fences, no extra explanation). Keep it brief: 1-3 sentences describing what the function does, its parameters, and return value if applicable.`;
54
- const user = `Language: ${language}
55
- Comment style example: ${style.example}
56
-
57
- Signature:
58
- ${signature}
59
-
60
- Body:
61
- ${bodyText.slice(0, 1500)}
62
-
54
+ const user = `Language: ${language}
55
+ Comment style example: ${style.example}
56
+
57
+ Signature:
58
+ ${signature}
59
+
60
+ Body:
61
+ ${bodyText.slice(0, 1500)}
62
+
63
63
  Generate a documentation comment for this function.`;
64
64
  return { system, user };
65
65
  }
66
66
  export function buildClassCommentPrompt(name, signature, methodNames, language) {
67
67
  const style = LANGUAGE_COMMENT_STYLES[language] ?? LANGUAGE_COMMENT_STYLES['typescript'];
68
68
  const system = `You are a code documentation expert. Generate a concise, clear documentation comment for the given class or type. Use the ${language} documentation style. Output ONLY the comment text (no code fences, no extra explanation). Keep it brief: 1-3 sentences describing the class purpose and responsibilities.`;
69
- const user = `Language: ${language}
70
- Comment style example: ${style.example}
71
-
72
- Class: ${name}
73
- Signature: ${signature}
74
- Methods: ${methodNames.join(', ') || 'none'}
75
-
69
+ const user = `Language: ${language}
70
+ Comment style example: ${style.example}
71
+
72
+ Class: ${name}
73
+ Signature: ${signature}
74
+ Methods: ${methodNames.join(', ') || 'none'}
75
+
76
76
  Generate a documentation comment for this class.`;
77
77
  return { system, user };
78
78
  }
@@ -1,17 +1,22 @@
1
- import type TreeSitter from 'web-tree-sitter';
2
- import type { AstNode } from '../types.js';
3
- export interface ExtractionResult {
4
- nodes: AstNode[];
5
- edges: Array<{
6
- callerNodeIndex: number;
7
- calleeName: string;
8
- line: number;
9
- }>;
10
- comments: Array<{
11
- nodeIndex: number;
12
- text: string;
13
- source: 'original';
14
- }>;
1
+ import type { Language, Tree } from 'web-tree-sitter';
2
+ import { type Extraction } from '../types.js';
3
+ import { type LangSpec, type Visitor } from './spec.js';
4
+ /** A language spec bound to a loaded grammar (node types resolved to ids). */
5
+ export interface CompiledSpec {
6
+ spec: LangSpec;
7
+ language: Language;
8
+ visitors: Array<Visitor | undefined>;
9
+ isIdent: Uint8Array;
10
+ isComment: Uint8Array;
11
+ /** Node types skipped between a doc comment and its item (attributes). */
12
+ isDocSkip: Uint8Array;
13
+ /** Visitor / identifier node types that do not exist in the grammar. */
14
+ unknownTypes: string[];
15
15
  }
16
- export declare function extractFromTree(tree: TreeSitter.Tree, filePath: string, language: string, source: string, maxBodySize?: number): ExtractionResult;
17
- //# sourceMappingURL=extractor.d.ts.map
16
+ export declare function compileSpec(spec: LangSpec, language: Language): CompiledSpec;
17
+ export declare function cleanComment(raw: string): string;
18
+ /**
19
+ * Walk a parsed tree and extract symbols, calls, imports, heritage and
20
+ * identifier occurrences according to the language spec.
21
+ */
22
+ export declare function extract(tree: Tree, source: string, compiled: CompiledSpec): Extraction;