clast-ai 0.2.0 → 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/plugin.json +1 -1
- package/README.md +28 -4
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/migrate.d.ts +35 -0
- package/dist/migrate.js +194 -0
- package/dist/migrate.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/plugin/server.mjs +34 -12
- package/src/cli.ts +10 -1
- package/src/migrate.ts +213 -0
- package/src/version.ts +1 -1
- package/tsconfig.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clast",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Code index for coding agents: symbol search, exact symbol source, type-aware call graph, references, type hierarchy, change impact, dead code and exact counts for any repository. TypeScript, JavaScript, Python, Java, C#, Go, Rust, C, C++, Ruby, PHP, Swift and Dart.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Thomas"
|
package/README.md
CHANGED
|
@@ -51,8 +51,23 @@ and four slash commands:
|
|
|
51
51
|
| `/clast:audit [path]` | Inventory for due diligence or onboarding: size, structure, endpoints, database access, dependencies, dead code |
|
|
52
52
|
| `/clast:status` | State of the index |
|
|
53
53
|
|
|
54
|
-
The plugin starts the server from a global `clast-ai`
|
|
55
|
-
`npx clast-ai
|
|
54
|
+
The plugin starts the server from a global `clast-ai` that is at least as new as the plugin, otherwise
|
|
55
|
+
through `npx clast-ai@<plugin version>` (downloaded on first use). Update with
|
|
56
|
+
`/plugin marketplace update clast` and `/plugin update clast@clast`.
|
|
57
|
+
|
|
58
|
+
**Coming from an older install?** Nothing to do. The first session after installing or updating the
|
|
59
|
+
plugin removes what earlier installs left behind: clast registrations made with `claude mcp add` (for
|
|
60
|
+
all projects or for single ones) and by the old VS Code extension, which would otherwise list every
|
|
61
|
+
tool twice, and the v0.1 index file `.clast/clast.db`. It runs once per plugin version, in the
|
|
62
|
+
background, and writes what it did to `migrate.log` in the plugin's data folder. A `.mcp.json` that
|
|
63
|
+
is shared with a team is never changed. To see or do the same by hand:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
clast-ai migrate # report only
|
|
67
|
+
clast-ai migrate --apply # remove the leftovers
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Set `CLAST_NO_MIGRATE=1` to switch the automatic run off.
|
|
56
71
|
|
|
57
72
|
### As a plain MCP server
|
|
58
73
|
|
|
@@ -62,7 +77,8 @@ claude mcp add -s user clast clast-ai
|
|
|
62
77
|
```
|
|
63
78
|
|
|
64
79
|
`-s user` registers the server for all projects. This gives the tools without the skill and the slash
|
|
65
|
-
commands. Use one of the two ways, not both: with both, every tool is listed twice
|
|
80
|
+
commands. Use one of the two ways, not both: with both, every tool is listed twice (the plugin removes
|
|
81
|
+
a registration made this way when it is installed later).
|
|
66
82
|
|
|
67
83
|
Either way, restart Claude Code (or "Developer: Reload Window" in VS Code) and run `/mcp`: `clast`
|
|
68
84
|
should be listed with 15 tools. The first start indexes the project in the background (seconds, about
|
|
@@ -398,6 +414,14 @@ Known limitations).
|
|
|
398
414
|
|
|
399
415
|
## Changelog
|
|
400
416
|
|
|
417
|
+
### 0.2.1
|
|
418
|
+
|
|
419
|
+
- `clast-ai migrate`: finds and removes what older installs left behind (duplicate MCP registrations
|
|
420
|
+
next to the plugin, entries written by the old VS Code extension, the v0.1 index file). The plugin
|
|
421
|
+
runs it automatically, once per version, at the first session after an install or update.
|
|
422
|
+
- The plugin uses a global `clast-ai` only when it is at least as new as the plugin itself, so a
|
|
423
|
+
plugin update is not held back by an older global install.
|
|
424
|
+
|
|
401
425
|
### 0.2.0
|
|
402
426
|
|
|
403
427
|
New tools (7 to 13):
|
|
@@ -450,7 +474,7 @@ Other:
|
|
|
450
474
|
|
|
451
475
|
- Swift and Dart added (14 languages).
|
|
452
476
|
- All dependencies updated (MCP SDK 1.32, web-tree-sitter 0.27).
|
|
453
|
-
-
|
|
477
|
+
- 290 tests, plus `bench/bench.mjs`, `bench/resolution.mjs` and the A/B harness `bench/ab.mjs`.
|
|
454
478
|
- Installable as a Claude Code plugin from this repository (`/plugin marketplace add xls/clast`,
|
|
455
479
|
`/plugin install clast@clast`): the MCP server, a usage skill, and the slash commands
|
|
456
480
|
`/clast:deadcode`, `/clast:impact`, `/clast:audit` and `/clast:status`. The old VS Code extension
|
package/dist/cli.js
CHANGED
|
@@ -33,6 +33,8 @@ usage: clast-ai [command] [args] [--root <dir>]
|
|
|
33
33
|
unused [path] dead code [--kind k] [--lang l] [--limit n] [--no-exported]
|
|
34
34
|
stats [what] [name] exact counts: inventory | symbols | subtypes | calls | text | imports | endpoints | database
|
|
35
35
|
[--kind k] [--on receiver] [--path p] [--lang l] [--group-by g] [--depth n] [--limit n] [--tests]
|
|
36
|
+
migrate [--apply] find (and with --apply remove) what older installs left behind: duplicate
|
|
37
|
+
MCP registrations next to the plugin, the v0.1 index file
|
|
36
38
|
parse <file> [--json] debug: show what the extractor produces for a file
|
|
37
39
|
ast <file> debug: dump the tree-sitter syntax tree
|
|
38
40
|
|
|
@@ -54,7 +56,7 @@ const CLI_NAMES = {
|
|
|
54
56
|
clast_status: 'clast-ai status',
|
|
55
57
|
};
|
|
56
58
|
const BOOLEAN_FLAGS = new Set([
|
|
57
|
-
'force', 'json', 'regex', 'no-body', 'no-scan', 'no-tests', 'tests', 'uncertain', 'help', 'version', 'all', 'no-exported',
|
|
59
|
+
'force', 'json', 'regex', 'no-body', 'no-scan', 'no-tests', 'tests', 'uncertain', 'help', 'version', 'all', 'no-exported', 'apply', 'auto',
|
|
58
60
|
]);
|
|
59
61
|
function parseArgs(argv) {
|
|
60
62
|
const positional = [];
|
|
@@ -100,6 +102,13 @@ async function main() {
|
|
|
100
102
|
await startServer();
|
|
101
103
|
return;
|
|
102
104
|
}
|
|
105
|
+
if (cmd === 'migrate') {
|
|
106
|
+
const { migrate } = await import('./migrate.js');
|
|
107
|
+
const out = await migrate({ apply: flags.has('apply'), auto: flags.has('auto'), force: flags.has('force'), cwd: str('root') });
|
|
108
|
+
if (out)
|
|
109
|
+
console.log(out);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
103
112
|
if (cmd === 'parse' || cmd === 'ast') {
|
|
104
113
|
const file = positional[0];
|
|
105
114
|
if (!file)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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>;
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { VERSION } from './version.js';
|
|
6
|
+
/** A registration of this server: by name, by the `clast-ai` binary, or by a path to its cli.js. */
|
|
7
|
+
function isClast(_name, entry) {
|
|
8
|
+
if (!entry || typeof entry !== 'object')
|
|
9
|
+
return false;
|
|
10
|
+
const command = String(entry.command ?? '');
|
|
11
|
+
const args = Array.isArray(entry.args) ? entry.args.map(String) : [];
|
|
12
|
+
if (/(^|[\\/])clast-ai(\.cmd|\.exe)?$/i.test(command))
|
|
13
|
+
return true;
|
|
14
|
+
if (args.some(a => /clast[^\\/]*[\\/]dist[\\/]cli\.js$/i.test(a)))
|
|
15
|
+
return true;
|
|
16
|
+
// `npx clast-ai`, `npx -y clast-ai@0.1`
|
|
17
|
+
if (/(^|[\\/])npx(\.cmd)?$/i.test(command) && args.some(a => /^clast-ai(@|$)/.test(a)))
|
|
18
|
+
return true;
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function readJson(path) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function describe(entry) {
|
|
30
|
+
return [entry.command ?? '', ...(Array.isArray(entry.args) ? entry.args.map(String) : [])].join(' ').trim();
|
|
31
|
+
}
|
|
32
|
+
/** Is the clast plugin installed for this user? */
|
|
33
|
+
export function pluginInstalled(home) {
|
|
34
|
+
const installed = readJson(join(home, '.claude', 'plugins', 'installed_plugins.json'));
|
|
35
|
+
const plugins = (installed?.plugins ?? {});
|
|
36
|
+
return Object.keys(plugins).some(id => /^clast@/.test(id));
|
|
37
|
+
}
|
|
38
|
+
/** Everything an older install left behind, without changing anything. */
|
|
39
|
+
export function planMigration(home, cwd) {
|
|
40
|
+
const actions = [];
|
|
41
|
+
const config = readJson(join(home, '.claude.json'));
|
|
42
|
+
const servers = (config?.mcpServers ?? {});
|
|
43
|
+
for (const [name, entry] of Object.entries(servers)) {
|
|
44
|
+
if (isClast(name, entry))
|
|
45
|
+
actions.push({ kind: 'mcp', scope: 'user', name, dir: cwd, command: describe(entry) });
|
|
46
|
+
}
|
|
47
|
+
const projects = (config?.projects ?? {});
|
|
48
|
+
for (const [dir, project] of Object.entries(projects)) {
|
|
49
|
+
for (const [name, entry] of Object.entries(project?.mcpServers ?? {})) {
|
|
50
|
+
if (isClast(name, entry))
|
|
51
|
+
actions.push({ kind: 'mcp', scope: 'local', name, dir, command: describe(entry) });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Written by the old VS Code extension.
|
|
55
|
+
const settingsFile = join(cwd, '.claude', 'settings.local.json');
|
|
56
|
+
const settings = readJson(settingsFile);
|
|
57
|
+
for (const [name, entry] of Object.entries((settings?.mcpServers ?? {}))) {
|
|
58
|
+
if (isClast(name, entry))
|
|
59
|
+
actions.push({ kind: 'settings', file: settingsFile, name });
|
|
60
|
+
}
|
|
61
|
+
// The v0.1 index. v0.2 keeps its own file (.clast/index.db) and never reads this one.
|
|
62
|
+
const old = ['clast.db', 'clast.db-wal', 'clast.db-shm'].map(f => join(cwd, '.clast', f)).filter(f => existsSync(f));
|
|
63
|
+
if (old.length)
|
|
64
|
+
actions.push({ kind: 'index', files: old });
|
|
65
|
+
// A team's shared file is theirs to change.
|
|
66
|
+
const sharedFile = join(cwd, '.mcp.json');
|
|
67
|
+
const shared = readJson(sharedFile);
|
|
68
|
+
for (const [name, entry] of Object.entries((shared?.mcpServers ?? {}))) {
|
|
69
|
+
if (isClast(name, entry))
|
|
70
|
+
actions.push({ kind: 'shared', file: sharedFile, name });
|
|
71
|
+
}
|
|
72
|
+
return actions;
|
|
73
|
+
}
|
|
74
|
+
function claudeRemove(name, scope, cwd) {
|
|
75
|
+
const windows = process.platform === 'win32';
|
|
76
|
+
// Fixed words plus a server name restricted to safe characters: nothing to escape.
|
|
77
|
+
if (!/^[\w.-]+$/.test(name))
|
|
78
|
+
return false;
|
|
79
|
+
const result = windows
|
|
80
|
+
? spawnSync(`claude mcp remove ${name} -s ${scope}`, { cwd, shell: true, stdio: 'ignore', windowsHide: true, timeout: 30_000 })
|
|
81
|
+
: spawnSync('claude', ['mcp', 'remove', name, '-s', scope], { cwd, stdio: 'ignore', timeout: 30_000 });
|
|
82
|
+
return result.status === 0;
|
|
83
|
+
}
|
|
84
|
+
function line(a) {
|
|
85
|
+
switch (a.kind) {
|
|
86
|
+
case 'mcp':
|
|
87
|
+
return a.scope === 'user'
|
|
88
|
+
? `server "${a.name}" registered for all projects (${a.command})`
|
|
89
|
+
: `server "${a.name}" registered for ${a.dir} (${a.command})`;
|
|
90
|
+
case 'settings':
|
|
91
|
+
return `server "${a.name}" in ${a.file} (written by the old VS Code extension)`;
|
|
92
|
+
case 'index':
|
|
93
|
+
return `v0.1 index: ${a.files.join(', ')}`;
|
|
94
|
+
case 'shared':
|
|
95
|
+
return `server "${a.name}" in ${a.file} (shared with your team: not changed; remove it there if everyone uses the plugin)`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function migrate(opts = {}) {
|
|
99
|
+
const home = opts.home ?? homedir();
|
|
100
|
+
const cwd = resolve(opts.cwd ?? process.env.CLAST_PROJECT_DIR ?? process.env.CLAUDE_PROJECT_DIR ?? process.cwd());
|
|
101
|
+
const stateDir = process.env.CLAUDE_PLUGIN_DATA || join(home, '.clast-ai');
|
|
102
|
+
const marker = join(stateDir, 'migrated.json');
|
|
103
|
+
const plugin = pluginInstalled(home);
|
|
104
|
+
if (opts.auto) {
|
|
105
|
+
// Only the plugin starts this, but be sure: without it the registrations are the only install there is.
|
|
106
|
+
if (!plugin)
|
|
107
|
+
return '';
|
|
108
|
+
const done = readJson(marker);
|
|
109
|
+
const fresh = done?.version !== VERSION;
|
|
110
|
+
// The registrations are checked once per version; a project's old index whenever it is seen.
|
|
111
|
+
const plan = planMigration(home, cwd).filter(a => a.kind === 'index' || (fresh && a.kind !== 'shared'));
|
|
112
|
+
const report = plan.length ? apply(plan, opts) : [];
|
|
113
|
+
try {
|
|
114
|
+
mkdirSync(stateDir, { recursive: true });
|
|
115
|
+
if (fresh)
|
|
116
|
+
writeFileSync(marker, JSON.stringify({ version: VERSION, at: new Date().toISOString() }) + '\n');
|
|
117
|
+
if (report.length) {
|
|
118
|
+
appendFileSync(join(stateDir, 'migrate.log'), `${new Date().toISOString()} clast ${VERSION}\n${report.map(r => ' ' + r).join('\n')}\n`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// A read-only home directory must not stop the server.
|
|
123
|
+
}
|
|
124
|
+
return report.join('\n');
|
|
125
|
+
}
|
|
126
|
+
const plan = planMigration(home, cwd);
|
|
127
|
+
const out = [];
|
|
128
|
+
const removable = plan.filter(a => a.kind !== 'shared');
|
|
129
|
+
const blocked = !plugin && !opts.force;
|
|
130
|
+
if (plan.length === 0) {
|
|
131
|
+
out.push('nothing to migrate: no older clast registration or index found.');
|
|
132
|
+
}
|
|
133
|
+
else if (!opts.apply) {
|
|
134
|
+
out.push(`found ${plan.length} leftover${plan.length === 1 ? '' : 's'} of an older clast install:`);
|
|
135
|
+
for (const a of plan)
|
|
136
|
+
out.push(` - ${line(a)}`);
|
|
137
|
+
if (removable.length) {
|
|
138
|
+
out.push(blocked
|
|
139
|
+
? 'The clast plugin is not installed, so the registrations above are your only install. Install the plugin ' +
|
|
140
|
+
'(/plugin marketplace add xls/clast, /plugin install clast@clast) and run this again, or pass --force.'
|
|
141
|
+
: 'Run `clast-ai migrate --apply` to remove them (the plugin provides the server).');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const todo = blocked ? removable.filter(a => a.kind === 'index') : removable;
|
|
146
|
+
out.push(...apply(todo, opts));
|
|
147
|
+
for (const a of plan.filter(p => p.kind === 'shared'))
|
|
148
|
+
out.push(`left alone: ${line(a)}`);
|
|
149
|
+
if (blocked && removable.some(a => a.kind !== 'index')) {
|
|
150
|
+
out.push('registrations kept: the clast plugin is not installed (pass --force to remove them anyway).');
|
|
151
|
+
}
|
|
152
|
+
if (todo.some(a => a.kind === 'mcp' || a.kind === 'settings'))
|
|
153
|
+
out.push('Restart Claude Code to apply.');
|
|
154
|
+
}
|
|
155
|
+
if (!plugin)
|
|
156
|
+
out.push('plugin: not installed.');
|
|
157
|
+
return out.join('\n');
|
|
158
|
+
}
|
|
159
|
+
function apply(plan, opts) {
|
|
160
|
+
const remove = opts.remove ?? claudeRemove;
|
|
161
|
+
const report = [];
|
|
162
|
+
for (const a of plan) {
|
|
163
|
+
try {
|
|
164
|
+
if (a.kind === 'mcp') {
|
|
165
|
+
if (a.scope === 'local' && !existsSync(a.dir)) {
|
|
166
|
+
report.push(`skipped (directory no longer exists): ${line(a)}`);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
report.push(`${remove(a.name, a.scope, a.dir) ? 'removed' : 'could not remove (is the claude CLI on PATH?)'}: ${line(a)}`);
|
|
170
|
+
}
|
|
171
|
+
else if (a.kind === 'settings') {
|
|
172
|
+
const settings = readJson(a.file);
|
|
173
|
+
const servers = settings?.mcpServers;
|
|
174
|
+
if (settings && servers && a.name in servers) {
|
|
175
|
+
delete servers[a.name];
|
|
176
|
+
if (Object.keys(servers).length === 0)
|
|
177
|
+
delete settings.mcpServers;
|
|
178
|
+
writeFileSync(a.file, JSON.stringify(settings, null, 2) + '\n');
|
|
179
|
+
report.push(`removed: ${line(a)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (a.kind === 'index') {
|
|
183
|
+
for (const f of a.files)
|
|
184
|
+
rmSync(f, { force: true });
|
|
185
|
+
report.push(`deleted: ${line(a)}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
report.push(`failed: ${line(a)}: ${err instanceof Error ? err.message : err}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return report;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Package version (keep in sync with package.json; checked by a test). */
|
|
2
|
-
export declare const VERSION = "0.2.
|
|
2
|
+
export declare const VERSION = "0.2.1";
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clast-ai",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Code index MCP server for LLM coding agents: ranked symbol search, exact symbol source, type-aware call graph, references, type hierarchy and git change impact",
|
|
5
5
|
"main": "dist/engine.js",
|
|
6
6
|
"bin": {
|
package/plugin/server.mjs
CHANGED
|
@@ -2,16 +2,22 @@
|
|
|
2
2
|
// Starts the clast MCP server for the Claude Code plugin. A plugin is installed by cloning the
|
|
3
3
|
// repository, which has no build output, so the server is taken from the first place that has one:
|
|
4
4
|
// 1. this checkout, when it has been built (a development clone),
|
|
5
|
-
// 2. a global `clast-ai` of the same
|
|
6
|
-
// 3. `npx clast-ai@<
|
|
5
|
+
// 2. a global `clast-ai` of the same minor version that is at least as new as the plugin,
|
|
6
|
+
// 3. `npx clast-ai@<plugin version>` (downloaded on first use, cached afterwards).
|
|
7
7
|
// Standard input and output are passed straight through: they carry the MCP protocol.
|
|
8
|
+
//
|
|
9
|
+
// After the server is up it also runs `clast-ai migrate --apply --auto` in the background. That
|
|
10
|
+
// removes, once per version, what an older install left behind (hand-made MCP registrations that
|
|
11
|
+
// would list every tool twice, the v0.1 index file), so installing or upgrading the plugin is
|
|
12
|
+
// all a user has to do.
|
|
8
13
|
import { spawn, spawnSync } from 'node:child_process';
|
|
9
14
|
import { existsSync, readFileSync } from 'node:fs';
|
|
10
15
|
import { dirname, join } from 'node:path';
|
|
11
16
|
import { fileURLToPath } from 'node:url';
|
|
12
17
|
|
|
13
18
|
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
14
|
-
const
|
|
19
|
+
const version = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')).version;
|
|
20
|
+
const [major, minor, patch] = version.split('.').map(Number);
|
|
15
21
|
const windows = process.platform === 'win32';
|
|
16
22
|
const log = msg => process.stderr.write(`[clast plugin] ${msg}\n`);
|
|
17
23
|
|
|
@@ -24,27 +30,43 @@ function pick() {
|
|
|
24
30
|
? spawnSync('clast-ai --version', { encoding: 'utf8', shell: true, windowsHide: true })
|
|
25
31
|
: spawnSync('clast-ai', ['--version'], { encoding: 'utf8', windowsHide: true });
|
|
26
32
|
const found = probe.status === 0 ? probe.stdout.trim() : '';
|
|
27
|
-
|
|
33
|
+
const [fMajor, fMinor, fPatch] = found.split('.').map(Number);
|
|
34
|
+
if (found && fMajor === major && fMinor === minor && fPatch >= patch) {
|
|
28
35
|
return { command: 'clast-ai', args: [], shell: windows, what: `global clast-ai ${found}` };
|
|
29
36
|
}
|
|
30
|
-
if (found) log(`global clast-ai is ${found}, the plugin
|
|
31
|
-
return { command: 'npx', args: ['-y', `clast-ai@${
|
|
37
|
+
if (found) log(`global clast-ai is ${found}, the plugin is ${version}: using npx instead (npm install -g clast-ai updates it)`);
|
|
38
|
+
return { command: 'npx', args: ['-y', `clast-ai@${version}`], shell: windows, what: `npx clast-ai@${version}` };
|
|
32
39
|
}
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
/** Run the chosen clast-ai with extra arguments. Through a shell (.cmd shims on Windows) the command is one string of fixed words. */
|
|
42
|
+
function run(choice, extra, options) {
|
|
43
|
+
const args = [...choice.args, ...extra];
|
|
44
|
+
return choice.shell
|
|
45
|
+
? spawn([choice.command, ...args].join(' '), { ...options, shell: true, windowsHide: true })
|
|
46
|
+
: spawn(choice.command, args, { ...options, windowsHide: true });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (Number(process.versions.node.split('.')[0]) < 22) {
|
|
36
50
|
log(`Node.js 22.22 or newer is required (this is ${process.versions.node}).`);
|
|
37
51
|
process.exit(1);
|
|
38
52
|
}
|
|
39
53
|
const choice = pick();
|
|
40
54
|
log(`starting ${choice.what}`);
|
|
41
|
-
|
|
42
|
-
const child = choice.shell
|
|
43
|
-
? spawn([choice.command, ...choice.args].join(' '), { stdio: 'inherit', shell: true, windowsHide: true })
|
|
44
|
-
: spawn(choice.command, choice.args, { stdio: 'inherit', windowsHide: true });
|
|
55
|
+
const child = run(choice, [], { stdio: 'inherit' });
|
|
45
56
|
child.on('error', err => {
|
|
46
57
|
log(`could not start the server: ${err.message}. Install it with: npm install -g clast-ai`);
|
|
47
58
|
process.exit(1);
|
|
48
59
|
});
|
|
49
60
|
child.on('exit', (code, signal) => process.exit(code ?? (signal ? 1 : 0)));
|
|
50
61
|
for (const sig of ['SIGINT', 'SIGTERM']) process.on(sig, () => child.kill(sig));
|
|
62
|
+
|
|
63
|
+
// Clean up after older installs, without holding up or disturbing the server (no shared stdio).
|
|
64
|
+
if (process.env.CLAST_NO_MIGRATE !== '1') {
|
|
65
|
+
try {
|
|
66
|
+
const cleanup = run(choice, ['migrate', '--apply', '--auto'], { stdio: 'ignore', detached: !windows });
|
|
67
|
+
cleanup.on('error', () => {});
|
|
68
|
+
cleanup.unref();
|
|
69
|
+
} catch {
|
|
70
|
+
// Never let the cleanup stop the server.
|
|
71
|
+
}
|
|
72
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -35,6 +35,8 @@ usage: clast-ai [command] [args] [--root <dir>]
|
|
|
35
35
|
unused [path] dead code [--kind k] [--lang l] [--limit n] [--no-exported]
|
|
36
36
|
stats [what] [name] exact counts: inventory | symbols | subtypes | calls | text | imports | endpoints | database
|
|
37
37
|
[--kind k] [--on receiver] [--path p] [--lang l] [--group-by g] [--depth n] [--limit n] [--tests]
|
|
38
|
+
migrate [--apply] find (and with --apply remove) what older installs left behind: duplicate
|
|
39
|
+
MCP registrations next to the plugin, the v0.1 index file
|
|
38
40
|
parse <file> [--json] debug: show what the extractor produces for a file
|
|
39
41
|
ast <file> debug: dump the tree-sitter syntax tree
|
|
40
42
|
|
|
@@ -63,7 +65,7 @@ interface Parsed {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
const BOOLEAN_FLAGS = new Set([
|
|
66
|
-
'force', 'json', 'regex', 'no-body', 'no-scan', 'no-tests', 'tests', 'uncertain', 'help', 'version', 'all', 'no-exported',
|
|
68
|
+
'force', 'json', 'regex', 'no-body', 'no-scan', 'no-tests', 'tests', 'uncertain', 'help', 'version', 'all', 'no-exported', 'apply', 'auto',
|
|
67
69
|
]);
|
|
68
70
|
|
|
69
71
|
function parseArgs(argv: string[]): Parsed {
|
|
@@ -105,6 +107,13 @@ async function main(): Promise<void> {
|
|
|
105
107
|
return;
|
|
106
108
|
}
|
|
107
109
|
|
|
110
|
+
if (cmd === 'migrate') {
|
|
111
|
+
const { migrate } = await import('./migrate.js');
|
|
112
|
+
const out = await migrate({ apply: flags.has('apply'), auto: flags.has('auto'), force: flags.has('force'), cwd: str('root') });
|
|
113
|
+
if (out) console.log(out);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
108
117
|
if (cmd === 'parse' || cmd === 'ast') {
|
|
109
118
|
const file = positional[0];
|
|
110
119
|
if (!file) throw new Error(`usage: clast-ai ${cmd} <file>`);
|
package/src/migrate.ts
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { VERSION } from './version.js';
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// clast-ai migrate: remove what older installs left behind
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
//
|
|
11
|
+
// Before the plugin, clast was registered by hand (`claude mcp add`) or by the old VS Code extension
|
|
12
|
+
// (`.claude/settings.local.json`). With the plugin installed those registrations start a second copy
|
|
13
|
+
// of the server and list every tool twice. This finds them, and the v0.1 index file, and removes them.
|
|
14
|
+
|
|
15
|
+
export interface MigrateOptions {
|
|
16
|
+
/** Make the changes. Default: only report. */
|
|
17
|
+
apply?: boolean;
|
|
18
|
+
/** Run from the plugin at session start: once per version, silent, only when the plugin is installed. */
|
|
19
|
+
auto?: boolean;
|
|
20
|
+
/** Remove hand-made registrations even when the plugin is not installed. */
|
|
21
|
+
force?: boolean;
|
|
22
|
+
home?: string;
|
|
23
|
+
cwd?: string;
|
|
24
|
+
/** Replaces `claude mcp remove` (tests). Returns true on success. */
|
|
25
|
+
remove?: (name: string, scope: 'user' | 'local', cwd: string) => boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type Action =
|
|
29
|
+
| { kind: 'mcp'; scope: 'user' | 'local'; name: string; dir: string; command: string }
|
|
30
|
+
| { kind: 'settings'; file: string; name: string }
|
|
31
|
+
| { kind: 'index'; files: string[] }
|
|
32
|
+
| { kind: 'shared'; file: string; name: string };
|
|
33
|
+
|
|
34
|
+
interface ServerEntry {
|
|
35
|
+
command?: string;
|
|
36
|
+
args?: unknown[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** A registration of this server: by name, by the `clast-ai` binary, or by a path to its cli.js. */
|
|
40
|
+
function isClast(_name: string, entry: ServerEntry | undefined): boolean {
|
|
41
|
+
if (!entry || typeof entry !== 'object') return false;
|
|
42
|
+
const command = String(entry.command ?? '');
|
|
43
|
+
const args = Array.isArray(entry.args) ? entry.args.map(String) : [];
|
|
44
|
+
if (/(^|[\\/])clast-ai(\.cmd|\.exe)?$/i.test(command)) return true;
|
|
45
|
+
if (args.some(a => /clast[^\\/]*[\\/]dist[\\/]cli\.js$/i.test(a))) return true;
|
|
46
|
+
// `npx clast-ai`, `npx -y clast-ai@0.1`
|
|
47
|
+
if (/(^|[\\/])npx(\.cmd)?$/i.test(command) && args.some(a => /^clast-ai(@|$)/.test(a))) return true;
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function readJson(path: string): Record<string, unknown> | null {
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(readFileSync(path, 'utf8')) as Record<string, unknown>;
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function describe(entry: ServerEntry): string {
|
|
60
|
+
return [entry.command ?? '', ...(Array.isArray(entry.args) ? entry.args.map(String) : [])].join(' ').trim();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Is the clast plugin installed for this user? */
|
|
64
|
+
export function pluginInstalled(home: string): boolean {
|
|
65
|
+
const installed = readJson(join(home, '.claude', 'plugins', 'installed_plugins.json'));
|
|
66
|
+
const plugins = (installed?.plugins ?? {}) as Record<string, unknown>;
|
|
67
|
+
return Object.keys(plugins).some(id => /^clast@/.test(id));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Everything an older install left behind, without changing anything. */
|
|
71
|
+
export function planMigration(home: string, cwd: string): Action[] {
|
|
72
|
+
const actions: Action[] = [];
|
|
73
|
+
const config = readJson(join(home, '.claude.json'));
|
|
74
|
+
const servers = (config?.mcpServers ?? {}) as Record<string, ServerEntry>;
|
|
75
|
+
for (const [name, entry] of Object.entries(servers)) {
|
|
76
|
+
if (isClast(name, entry)) actions.push({ kind: 'mcp', scope: 'user', name, dir: cwd, command: describe(entry) });
|
|
77
|
+
}
|
|
78
|
+
const projects = (config?.projects ?? {}) as Record<string, { mcpServers?: Record<string, ServerEntry> }>;
|
|
79
|
+
for (const [dir, project] of Object.entries(projects)) {
|
|
80
|
+
for (const [name, entry] of Object.entries(project?.mcpServers ?? {})) {
|
|
81
|
+
if (isClast(name, entry)) actions.push({ kind: 'mcp', scope: 'local', name, dir, command: describe(entry) });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Written by the old VS Code extension.
|
|
85
|
+
const settingsFile = join(cwd, '.claude', 'settings.local.json');
|
|
86
|
+
const settings = readJson(settingsFile);
|
|
87
|
+
for (const [name, entry] of Object.entries((settings?.mcpServers ?? {}) as Record<string, ServerEntry>)) {
|
|
88
|
+
if (isClast(name, entry)) actions.push({ kind: 'settings', file: settingsFile, name });
|
|
89
|
+
}
|
|
90
|
+
// The v0.1 index. v0.2 keeps its own file (.clast/index.db) and never reads this one.
|
|
91
|
+
const old = ['clast.db', 'clast.db-wal', 'clast.db-shm'].map(f => join(cwd, '.clast', f)).filter(f => existsSync(f));
|
|
92
|
+
if (old.length) actions.push({ kind: 'index', files: old });
|
|
93
|
+
// A team's shared file is theirs to change.
|
|
94
|
+
const sharedFile = join(cwd, '.mcp.json');
|
|
95
|
+
const shared = readJson(sharedFile);
|
|
96
|
+
for (const [name, entry] of Object.entries((shared?.mcpServers ?? {}) as Record<string, ServerEntry>)) {
|
|
97
|
+
if (isClast(name, entry)) actions.push({ kind: 'shared', file: sharedFile, name });
|
|
98
|
+
}
|
|
99
|
+
return actions;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function claudeRemove(name: string, scope: 'user' | 'local', cwd: string): boolean {
|
|
103
|
+
const windows = process.platform === 'win32';
|
|
104
|
+
// Fixed words plus a server name restricted to safe characters: nothing to escape.
|
|
105
|
+
if (!/^[\w.-]+$/.test(name)) return false;
|
|
106
|
+
const result = windows
|
|
107
|
+
? spawnSync(`claude mcp remove ${name} -s ${scope}`, { cwd, shell: true, stdio: 'ignore', windowsHide: true, timeout: 30_000 })
|
|
108
|
+
: spawnSync('claude', ['mcp', 'remove', name, '-s', scope], { cwd, stdio: 'ignore', timeout: 30_000 });
|
|
109
|
+
return result.status === 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function line(a: Action): string {
|
|
113
|
+
switch (a.kind) {
|
|
114
|
+
case 'mcp':
|
|
115
|
+
return a.scope === 'user'
|
|
116
|
+
? `server "${a.name}" registered for all projects (${a.command})`
|
|
117
|
+
: `server "${a.name}" registered for ${a.dir} (${a.command})`;
|
|
118
|
+
case 'settings':
|
|
119
|
+
return `server "${a.name}" in ${a.file} (written by the old VS Code extension)`;
|
|
120
|
+
case 'index':
|
|
121
|
+
return `v0.1 index: ${a.files.join(', ')}`;
|
|
122
|
+
case 'shared':
|
|
123
|
+
return `server "${a.name}" in ${a.file} (shared with your team: not changed; remove it there if everyone uses the plugin)`;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export async function migrate(opts: MigrateOptions = {}): Promise<string> {
|
|
128
|
+
const home = opts.home ?? homedir();
|
|
129
|
+
const cwd = resolve(opts.cwd ?? process.env.CLAST_PROJECT_DIR ?? process.env.CLAUDE_PROJECT_DIR ?? process.cwd());
|
|
130
|
+
const stateDir = process.env.CLAUDE_PLUGIN_DATA || join(home, '.clast-ai');
|
|
131
|
+
const marker = join(stateDir, 'migrated.json');
|
|
132
|
+
const plugin = pluginInstalled(home);
|
|
133
|
+
|
|
134
|
+
if (opts.auto) {
|
|
135
|
+
// Only the plugin starts this, but be sure: without it the registrations are the only install there is.
|
|
136
|
+
if (!plugin) return '';
|
|
137
|
+
const done = readJson(marker);
|
|
138
|
+
const fresh = done?.version !== VERSION;
|
|
139
|
+
// The registrations are checked once per version; a project's old index whenever it is seen.
|
|
140
|
+
const plan = planMigration(home, cwd).filter(a => a.kind === 'index' || (fresh && a.kind !== 'shared'));
|
|
141
|
+
const report = plan.length ? apply(plan, opts) : [];
|
|
142
|
+
try {
|
|
143
|
+
mkdirSync(stateDir, { recursive: true });
|
|
144
|
+
if (fresh) writeFileSync(marker, JSON.stringify({ version: VERSION, at: new Date().toISOString() }) + '\n');
|
|
145
|
+
if (report.length) {
|
|
146
|
+
appendFileSync(join(stateDir, 'migrate.log'), `${new Date().toISOString()} clast ${VERSION}\n${report.map(r => ' ' + r).join('\n')}\n`);
|
|
147
|
+
}
|
|
148
|
+
} catch {
|
|
149
|
+
// A read-only home directory must not stop the server.
|
|
150
|
+
}
|
|
151
|
+
return report.join('\n');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const plan = planMigration(home, cwd);
|
|
155
|
+
const out: string[] = [];
|
|
156
|
+
const removable = plan.filter(a => a.kind !== 'shared');
|
|
157
|
+
const blocked = !plugin && !opts.force;
|
|
158
|
+
if (plan.length === 0) {
|
|
159
|
+
out.push('nothing to migrate: no older clast registration or index found.');
|
|
160
|
+
} else if (!opts.apply) {
|
|
161
|
+
out.push(`found ${plan.length} leftover${plan.length === 1 ? '' : 's'} of an older clast install:`);
|
|
162
|
+
for (const a of plan) out.push(` - ${line(a)}`);
|
|
163
|
+
if (removable.length) {
|
|
164
|
+
out.push(
|
|
165
|
+
blocked
|
|
166
|
+
? 'The clast plugin is not installed, so the registrations above are your only install. Install the plugin ' +
|
|
167
|
+
'(/plugin marketplace add xls/clast, /plugin install clast@clast) and run this again, or pass --force.'
|
|
168
|
+
: 'Run `clast-ai migrate --apply` to remove them (the plugin provides the server).'
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
const todo = blocked ? removable.filter(a => a.kind === 'index') : removable;
|
|
173
|
+
out.push(...apply(todo, opts));
|
|
174
|
+
for (const a of plan.filter(p => p.kind === 'shared')) out.push(`left alone: ${line(a)}`);
|
|
175
|
+
if (blocked && removable.some(a => a.kind !== 'index')) {
|
|
176
|
+
out.push('registrations kept: the clast plugin is not installed (pass --force to remove them anyway).');
|
|
177
|
+
}
|
|
178
|
+
if (todo.some(a => a.kind === 'mcp' || a.kind === 'settings')) out.push('Restart Claude Code to apply.');
|
|
179
|
+
}
|
|
180
|
+
if (!plugin) out.push('plugin: not installed.');
|
|
181
|
+
return out.join('\n');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function apply(plan: Action[], opts: MigrateOptions): string[] {
|
|
185
|
+
const remove = opts.remove ?? claudeRemove;
|
|
186
|
+
const report: string[] = [];
|
|
187
|
+
for (const a of plan) {
|
|
188
|
+
try {
|
|
189
|
+
if (a.kind === 'mcp') {
|
|
190
|
+
if (a.scope === 'local' && !existsSync(a.dir)) {
|
|
191
|
+
report.push(`skipped (directory no longer exists): ${line(a)}`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
report.push(`${remove(a.name, a.scope, a.dir) ? 'removed' : 'could not remove (is the claude CLI on PATH?)'}: ${line(a)}`);
|
|
195
|
+
} else if (a.kind === 'settings') {
|
|
196
|
+
const settings = readJson(a.file);
|
|
197
|
+
const servers = settings?.mcpServers as Record<string, unknown> | undefined;
|
|
198
|
+
if (settings && servers && a.name in servers) {
|
|
199
|
+
delete servers[a.name];
|
|
200
|
+
if (Object.keys(servers).length === 0) delete settings.mcpServers;
|
|
201
|
+
writeFileSync(a.file, JSON.stringify(settings, null, 2) + '\n');
|
|
202
|
+
report.push(`removed: ${line(a)}`);
|
|
203
|
+
}
|
|
204
|
+
} else if (a.kind === 'index') {
|
|
205
|
+
for (const f of a.files) rmSync(f, { force: true });
|
|
206
|
+
report.push(`deleted: ${line(a)}`);
|
|
207
|
+
}
|
|
208
|
+
} catch (err) {
|
|
209
|
+
report.push(`failed: ${line(a)}: ${err instanceof Error ? err.message : err}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return report;
|
|
213
|
+
}
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Package version (keep in sync with package.json; checked by a test). */
|
|
2
|
-
export const VERSION = '0.2.
|
|
2
|
+
export const VERSION = '0.2.1';
|
package/tsconfig.json
CHANGED