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.
- package/.claude-plugin/marketplace.json +14 -0
- package/.claude-plugin/plugin.json +11 -9
- package/README.md +468 -398
- package/bench/ab/onair-concept.json +22 -0
- package/bench/ab/onair-deadcode.json +7 -0
- package/bench/ab/onair-hard.json +32 -0
- package/bench/ab/onair-impact.json +17 -0
- package/bench/ab/onair-refactors.json +18 -0
- package/bench/ab/onair-survey.json +17 -0
- package/bench/ab/onair-tasks.json +20 -0
- package/bench/ab/onair.json +52 -0
- package/bench/ab/vscode-concept.json +22 -0
- package/bench/ab/vscode-hard.json +32 -0
- package/bench/ab/vscode-impact.json +17 -0
- package/bench/ab/vscode-refactors.json +18 -0
- package/bench/ab/vscode-tasks.json +20 -0
- package/bench/ab/vscode.json +52 -0
- package/bench/ab.mjs +213 -0
- package/bench/bench.mjs +98 -0
- package/bench/resolution.mjs +75 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +266 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -2
- package/dist/config/defaults.js +38 -31
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +26 -14
- package/dist/config/index.js.map +1 -1
- package/dist/db/index.d.ts +73 -13
- package/dist/db/index.js +481 -39
- package/dist/db/index.js.map +1 -1
- package/dist/engine.d.ts +15 -0
- package/dist/engine.js +28 -0
- package/dist/engine.js.map +1 -0
- package/dist/indexer/imports.d.ts +6 -0
- package/dist/indexer/imports.js +254 -0
- package/dist/indexer/imports.js.map +1 -0
- package/dist/indexer/index.d.ts +63 -0
- package/dist/indexer/index.js +360 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/process.d.ts +22 -0
- package/dist/indexer/process.js +42 -0
- package/dist/indexer/process.js.map +1 -0
- package/dist/indexer/scan.d.ts +43 -0
- package/dist/indexer/scan.js +223 -0
- package/dist/indexer/scan.js.map +1 -0
- package/dist/indexer/worker.d.ts +1 -0
- package/dist/indexer/worker.js +23 -0
- package/dist/indexer/worker.js.map +1 -0
- package/dist/llm/comment-generator.d.ts +17 -19
- package/dist/llm/comment-generator.js +46 -80
- package/dist/llm/comment-generator.js.map +1 -1
- package/dist/llm/index.d.ts +0 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/prompts.d.ts +0 -1
- package/dist/llm/prompts.js +16 -16
- package/dist/migrate.d.ts +35 -0
- package/dist/migrate.js +194 -0
- package/dist/migrate.js.map +1 -0
- package/dist/parser/extractor.d.ts +21 -16
- package/dist/parser/extractor.js +700 -228
- package/dist/parser/extractor.js.map +1 -1
- package/dist/parser/index.d.ts +17 -21
- package/dist/parser/index.js +115 -171
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/langs/c.d.ts +3 -0
- package/dist/parser/langs/c.js +879 -0
- package/dist/parser/langs/c.js.map +1 -0
- package/dist/parser/langs/csharp.d.ts +2 -0
- package/dist/parser/langs/csharp.js +548 -0
- package/dist/parser/langs/csharp.js.map +1 -0
- package/dist/parser/langs/dart.d.ts +2 -0
- package/dist/parser/langs/dart.js +893 -0
- package/dist/parser/langs/dart.js.map +1 -0
- package/dist/parser/langs/go.d.ts +2 -0
- package/dist/parser/langs/go.js +455 -0
- package/dist/parser/langs/go.js.map +1 -0
- package/dist/parser/langs/java.d.ts +2 -0
- package/dist/parser/langs/java.js +390 -0
- package/dist/parser/langs/java.js.map +1 -0
- package/dist/parser/langs/php.d.ts +2 -0
- package/dist/parser/langs/php.js +486 -0
- package/dist/parser/langs/php.js.map +1 -0
- package/dist/parser/langs/python.d.ts +2 -0
- package/dist/parser/langs/python.js +216 -0
- package/dist/parser/langs/python.js.map +1 -0
- package/dist/parser/langs/ruby.d.ts +2 -0
- package/dist/parser/langs/ruby.js +602 -0
- package/dist/parser/langs/ruby.js.map +1 -0
- package/dist/parser/langs/rust.d.ts +2 -0
- package/dist/parser/langs/rust.js +931 -0
- package/dist/parser/langs/rust.js.map +1 -0
- package/dist/parser/langs/swift.d.ts +2 -0
- package/dist/parser/langs/swift.js +616 -0
- package/dist/parser/langs/swift.js.map +1 -0
- package/dist/parser/langs/typescript.d.ts +4 -0
- package/dist/parser/langs/typescript.js +535 -0
- package/dist/parser/langs/typescript.js.map +1 -0
- package/dist/parser/registry.d.ts +16 -0
- package/dist/parser/registry.js +87 -0
- package/dist/parser/registry.js.map +1 -0
- package/dist/parser/returns.d.ts +9 -0
- package/dist/parser/returns.js +152 -0
- package/dist/parser/returns.js.map +1 -0
- package/dist/parser/spec.d.ts +165 -0
- package/dist/parser/spec.js +188 -0
- package/dist/parser/spec.js.map +1 -0
- package/dist/query/arity.d.ts +27 -0
- package/dist/query/arity.js +187 -0
- package/dist/query/arity.js.map +1 -0
- package/dist/query/callgraph.d.ts +113 -0
- package/dist/query/callgraph.js +332 -0
- package/dist/query/callgraph.js.map +1 -0
- package/dist/query/format.d.ts +36 -0
- package/dist/query/format.js +136 -0
- package/dist/query/format.js.map +1 -0
- package/dist/query/hierarchy.d.ts +44 -0
- package/dist/query/hierarchy.js +441 -0
- package/dist/query/hierarchy.js.map +1 -0
- package/dist/query/resolve.d.ts +265 -0
- package/dist/query/resolve.js +1957 -0
- package/dist/query/resolve.js.map +1 -0
- package/dist/query/search.d.ts +35 -0
- package/dist/query/search.js +379 -0
- package/dist/query/search.js.map +1 -0
- package/dist/query/words.d.ts +30 -0
- package/dist/query/words.js +201 -0
- package/dist/query/words.js.map +1 -0
- package/dist/server/index.d.ts +1 -3
- package/dist/server/index.js +313 -73
- package/dist/server/index.js.map +1 -1
- package/dist/tools/context.d.ts +35 -0
- package/dist/tools/context.js +79 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/explore.d.ts +51 -0
- package/dist/tools/explore.js +779 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/impact.d.ts +21 -0
- package/dist/tools/impact.js +743 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.js +843 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/stats.d.ts +26 -0
- package/dist/tools/stats.js +604 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/types.d.ts +95 -40
- package/dist/types.js +9 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher/index.d.ts +18 -16
- package/dist/watcher/index.js +94 -77
- package/dist/watcher/index.js.map +1 -1
- package/package.json +21 -24
- package/plugin/server.mjs +72 -0
- package/skills/audit/SKILL.md +37 -0
- package/skills/deadcode/SKILL.md +33 -0
- package/skills/explore/SKILL.md +54 -0
- package/skills/impact/SKILL.md +24 -0
- package/skills/status/SKILL.md +11 -0
- package/src/cli.ts +265 -0
- package/src/config/defaults.ts +50 -32
- package/src/config/index.ts +23 -14
- package/src/db/index.ts +540 -43
- package/src/engine.ts +30 -0
- package/src/indexer/imports.ts +241 -0
- package/src/indexer/index.ts +369 -0
- package/src/indexer/process.ts +63 -0
- package/src/indexer/scan.ts +226 -0
- package/src/indexer/worker.ts +24 -0
- package/src/llm/comment-generator.ts +52 -103
- package/src/llm/index.ts +80 -80
- package/src/llm/prompts.ts +95 -95
- package/src/migrate.ts +213 -0
- package/src/parser/extractor.ts +643 -256
- package/src/parser/index.ts +105 -205
- package/src/parser/langs/c.ts +860 -0
- package/src/parser/langs/csharp.ts +519 -0
- package/src/parser/langs/dart.ts +820 -0
- package/src/parser/langs/go.ts +437 -0
- package/src/parser/langs/java.ts +361 -0
- package/src/parser/langs/php.ts +450 -0
- package/src/parser/langs/python.ts +206 -0
- package/src/parser/langs/ruby.ts +554 -0
- package/src/parser/langs/rust.ts +904 -0
- package/src/parser/langs/swift.ts +590 -0
- package/src/parser/langs/typescript.ts +499 -0
- package/src/parser/registry.ts +88 -0
- package/src/parser/returns.ts +137 -0
- package/src/parser/spec.ts +309 -0
- package/src/query/arity.ts +173 -0
- package/src/query/callgraph.ts +473 -0
- package/src/query/format.ts +136 -0
- package/src/query/hierarchy.ts +447 -0
- package/src/query/resolve.ts +1972 -0
- package/src/query/search.ts +430 -0
- package/src/query/words.ts +183 -0
- package/src/server/index.ts +390 -79
- package/src/tools/context.ts +82 -0
- package/src/tools/explore.ts +860 -0
- package/src/tools/impact.ts +748 -0
- package/src/tools/search.ts +886 -0
- package/src/tools/stats.ts +633 -0
- package/src/types.ts +113 -45
- package/src/version.ts +2 -0
- package/src/watcher/index.ts +82 -88
- package/tsconfig.json +6 -3
- package/.mcp.json +0 -8
- package/commands/clast-status.md +0 -9
- package/dist/config/defaults.d.ts.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/queries.d.ts +0 -44
- package/dist/db/queries.d.ts.map +0 -1
- package/dist/db/queries.js +0 -251
- package/dist/db/queries.js.map +0 -1
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -94
- package/dist/db/schema.js.map +0 -1
- package/dist/db/types.d.ts +0 -44
- package/dist/db/types.d.ts.map +0 -1
- package/dist/db/types.js +0 -2
- package/dist/db/types.js.map +0 -1
- package/dist/llm/comment-generator.d.ts.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/prompts.d.ts.map +0 -1
- package/dist/parser/call-resolver.d.ts +0 -15
- package/dist/parser/call-resolver.d.ts.map +0 -1
- package/dist/parser/call-resolver.js +0 -16
- package/dist/parser/call-resolver.js.map +0 -1
- package/dist/parser/extractor.d.ts.map +0 -1
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/languages.d.ts +0 -11
- package/dist/parser/languages.d.ts.map +0 -1
- package/dist/parser/languages.js +0 -74
- package/dist/parser/languages.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/register-tools.d.ts +0 -7
- package/dist/server/register-tools.d.ts.map +0 -1
- package/dist/server/register-tools.js +0 -17
- package/dist/server/register-tools.js.map +0 -1
- package/dist/server/tools/clast-call-graph.d.ts +0 -4
- package/dist/server/tools/clast-call-graph.d.ts.map +0 -1
- package/dist/server/tools/clast-call-graph.js +0 -70
- package/dist/server/tools/clast-call-graph.js.map +0 -1
- package/dist/server/tools/clast-comment.d.ts +0 -5
- package/dist/server/tools/clast-comment.d.ts.map +0 -1
- package/dist/server/tools/clast-comment.js +0 -64
- package/dist/server/tools/clast-comment.js.map +0 -1
- package/dist/server/tools/clast-file-summary.d.ts +0 -4
- package/dist/server/tools/clast-file-summary.d.ts.map +0 -1
- package/dist/server/tools/clast-file-summary.js +0 -42
- package/dist/server/tools/clast-file-summary.js.map +0 -1
- package/dist/server/tools/clast-get-context.d.ts +0 -4
- package/dist/server/tools/clast-get-context.d.ts.map +0 -1
- package/dist/server/tools/clast-get-context.js +0 -80
- package/dist/server/tools/clast-get-context.js.map +0 -1
- package/dist/server/tools/clast-reindex.d.ts +0 -5
- package/dist/server/tools/clast-reindex.d.ts.map +0 -1
- package/dist/server/tools/clast-reindex.js +0 -36
- package/dist/server/tools/clast-reindex.js.map +0 -1
- package/dist/server/tools/clast-search.d.ts +0 -4
- package/dist/server/tools/clast-search.d.ts.map +0 -1
- package/dist/server/tools/clast-search.js +0 -29
- package/dist/server/tools/clast-search.js.map +0 -1
- package/dist/server/tools/clast-status.d.ts +0 -5
- package/dist/server/tools/clast-status.d.ts.map +0 -1
- package/dist/server/tools/clast-status.js +0 -23
- package/dist/server/tools/clast-status.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/watcher/gitignore.d.ts +0 -9
- package/dist/watcher/gitignore.d.ts.map +0 -1
- package/dist/watcher/gitignore.js +0 -38
- package/dist/watcher/gitignore.js.map +0 -1
- package/dist/watcher/index.d.ts.map +0 -1
- package/skills/clast-explore/SKILL.md +0 -41
- package/src/db/queries.ts +0 -332
- package/src/db/schema.ts +0 -106
- package/src/db/types.ts +0 -47
- package/src/parser/call-resolver.ts +0 -17
- package/src/parser/languages.ts +0 -86
- package/src/server/register-tools.ts +0 -30
- package/src/server/tools/clast-call-graph.ts +0 -82
- package/src/server/tools/clast-comment.ts +0 -76
- package/src/server/tools/clast-file-summary.ts +0 -59
- package/src/server/tools/clast-get-context.ts +0 -97
- package/src/server/tools/clast-reindex.ts +0 -52
- package/src/server/tools/clast-search.ts +0 -38
- package/src/server/tools/clast-status.ts +0 -37
- 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 {
|
|
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
|
-
|
|
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
|
-
*
|
|
12
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
queries;
|
|
10
|
+
db;
|
|
5
11
|
config;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
*
|
|
16
|
-
*
|
|
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
|
|
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
|
-
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
38
|
-
if (!
|
|
59
|
+
const text = response.content.trim();
|
|
60
|
+
if (!text)
|
|
39
61
|
return null;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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]
|
|
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":"
|
|
1
|
+
{"version":3,"file":"comment-generator.js","sourceRoot":"","sources":["../../src/llm/comment-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/index.d.ts
CHANGED
package/dist/llm/index.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/llm/prompts.d.ts
CHANGED
package/dist/llm/prompts.js
CHANGED
|
@@ -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
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface MigrateOptions {
|
|
2
|
+
/** Make the changes. Default: only report. */
|
|
3
|
+
apply?: boolean;
|
|
4
|
+
/** Run from the plugin at session start: once per version, silent, only when the plugin is installed. */
|
|
5
|
+
auto?: boolean;
|
|
6
|
+
/** Remove hand-made registrations even when the plugin is not installed. */
|
|
7
|
+
force?: boolean;
|
|
8
|
+
home?: string;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
/** Replaces `claude mcp remove` (tests). Returns true on success. */
|
|
11
|
+
remove?: (name: string, scope: 'user' | 'local', cwd: string) => boolean;
|
|
12
|
+
}
|
|
13
|
+
export type Action = {
|
|
14
|
+
kind: 'mcp';
|
|
15
|
+
scope: 'user' | 'local';
|
|
16
|
+
name: string;
|
|
17
|
+
dir: string;
|
|
18
|
+
command: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'settings';
|
|
21
|
+
file: string;
|
|
22
|
+
name: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'index';
|
|
25
|
+
files: string[];
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'shared';
|
|
28
|
+
file: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
/** Is the clast plugin installed for this user? */
|
|
32
|
+
export declare function pluginInstalled(home: string): boolean;
|
|
33
|
+
/** Everything an older install left behind, without changing anything. */
|
|
34
|
+
export declare function planMigration(home: string, cwd: string): Action[];
|
|
35
|
+
export declare function migrate(opts?: MigrateOptions): Promise<string>;
|