ferrycat 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -10
- package/README_zh.md +54 -10
- package/bin/ferrycat.js +1 -0
- package/dist/cli.js +157 -14
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +137 -1
- package/dist/daemon.js +673 -10
- package/dist/daemon.js.map +1 -1
- package/dist/delivery.d.ts +48 -0
- package/dist/delivery.js +158 -0
- package/dist/delivery.js.map +1 -0
- package/dist/demo.js +10 -7
- package/dist/demo.js.map +1 -1
- package/dist/engine.d.ts +15 -1
- package/dist/engine.js +287 -29
- package/dist/engine.js.map +1 -1
- package/dist/fingerprint.d.ts +60 -4
- package/dist/fingerprint.js +438 -9
- package/dist/fingerprint.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +62 -0
- package/dist/init.js +356 -0
- package/dist/init.js.map +1 -0
- package/dist/schemas.d.ts +64 -0
- package/dist/schemas.js +30 -0
- package/dist/schemas.js.map +1 -1
- package/dist/supervisor.d.ts +10 -0
- package/dist/supervisor.js +34 -26
- package/dist/supervisor.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/package.json +16 -4
- package/server.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;QACjF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;AAEzC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IACE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAC1B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type ConfigFormat = 'mcpServers' | 'vscode';
|
|
2
|
+
export type ConfigScope = 'user' | 'project';
|
|
3
|
+
export interface McpClientSpec {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
scope: ConfigScope;
|
|
7
|
+
format: ConfigFormat;
|
|
8
|
+
/** Directories whose existence indicates the host is installed. */
|
|
9
|
+
detectPaths: string[];
|
|
10
|
+
configPath: string;
|
|
11
|
+
defaultAgent: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InitEnvironment {
|
|
14
|
+
homeDir: string;
|
|
15
|
+
cwd: string;
|
|
16
|
+
platform: NodeJS.Platform;
|
|
17
|
+
env: NodeJS.ProcessEnv;
|
|
18
|
+
}
|
|
19
|
+
export interface InitOptions {
|
|
20
|
+
/** Restrict to these client ids (default: all detected). */
|
|
21
|
+
clients?: string[];
|
|
22
|
+
/** Override AGENT_NAME for every selected client. */
|
|
23
|
+
agent?: string;
|
|
24
|
+
/** MCP server key inside the host config (default: "ferrycat"). */
|
|
25
|
+
serverName?: string;
|
|
26
|
+
/** Override config file path (requires a single --client). */
|
|
27
|
+
configPath?: string;
|
|
28
|
+
/** Point entry at the local dist/index.js build instead of `npx -y ferrycat`. */
|
|
29
|
+
local?: boolean;
|
|
30
|
+
yes?: boolean;
|
|
31
|
+
dryRun?: boolean;
|
|
32
|
+
force?: boolean;
|
|
33
|
+
/** Only list detection results; never write. */
|
|
34
|
+
list?: boolean;
|
|
35
|
+
json?: boolean;
|
|
36
|
+
/** Ask per client before writing (TTY only). */
|
|
37
|
+
interactive?: boolean;
|
|
38
|
+
environment?: Partial<InitEnvironment>;
|
|
39
|
+
write?: (line: string) => void;
|
|
40
|
+
prompt?: (question: string) => Promise<string>;
|
|
41
|
+
}
|
|
42
|
+
export type ClientAction = 'CREATED' | 'UPDATED' | 'UNCHANGED' | 'CONFLICT' | 'UNPARSEABLE' | 'SKIPPED' | 'PLANNED' | 'NOT_DETECTED' | 'ERROR';
|
|
43
|
+
export interface ClientResult {
|
|
44
|
+
id: string;
|
|
45
|
+
label: string;
|
|
46
|
+
detected: boolean;
|
|
47
|
+
config_path: string;
|
|
48
|
+
agent_name: string;
|
|
49
|
+
action: ClientAction;
|
|
50
|
+
backup_path?: string;
|
|
51
|
+
message?: string;
|
|
52
|
+
snippet: Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
export interface InitResult {
|
|
55
|
+
ok: boolean;
|
|
56
|
+
dry_run: boolean;
|
|
57
|
+
server_name: string;
|
|
58
|
+
clients: ClientResult[];
|
|
59
|
+
}
|
|
60
|
+
export declare function buildClientRegistry(e: InitEnvironment): McpClientSpec[];
|
|
61
|
+
export declare function buildServerEntry(format: ConfigFormat, agentName: string, local?: boolean): Record<string, unknown>;
|
|
62
|
+
export declare function runInit(options?: InitOptions): Promise<InitResult>;
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ferrycat-cli init`: interactive MCP client wizard (REQ-EXP-02).
|
|
3
|
+
*
|
|
4
|
+
* Detects locally installed MCP hosts (Antigravity, WorkBuddy, Cursor, VS Code, Windsurf,
|
|
5
|
+
* Claude Desktop, Claude Code) and merges a `ferrycat` stdio server entry into each host's
|
|
6
|
+
* MCP configuration file, with a distinct AGENT_NAME per host.
|
|
7
|
+
*
|
|
8
|
+
* Safety rules (this command edits files owned by other applications):
|
|
9
|
+
* - Never overwrites a config it cannot parse (JSONC comments, broken JSON): the entry is
|
|
10
|
+
* printed for manual paste instead.
|
|
11
|
+
* - Never replaces an existing, different `ferrycat` entry unless --force is given.
|
|
12
|
+
* - Every existing file is backed up next to itself before the first write, and writes go
|
|
13
|
+
* through a temp file + rename so a crash cannot leave a half-written config.
|
|
14
|
+
* - Non-interactive runs without --yes only print the plan (dry run).
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs';
|
|
17
|
+
import os from 'node:os';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import readline from 'node:readline/promises';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
function resolveEnvironment(partial = {}) {
|
|
22
|
+
return {
|
|
23
|
+
homeDir: partial.homeDir ?? os.homedir(),
|
|
24
|
+
cwd: partial.cwd ?? process.cwd(),
|
|
25
|
+
platform: partial.platform ?? process.platform,
|
|
26
|
+
env: partial.env ?? process.env,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Per-OS application data root (where VS Code / Claude Desktop keep user settings). */
|
|
30
|
+
function appDataDir(e) {
|
|
31
|
+
if (e.platform === 'win32')
|
|
32
|
+
return e.env.APPDATA ?? path.join(e.homeDir, 'AppData', 'Roaming');
|
|
33
|
+
if (e.platform === 'darwin')
|
|
34
|
+
return path.join(e.homeDir, 'Library', 'Application Support');
|
|
35
|
+
return e.env.XDG_CONFIG_HOME ?? path.join(e.homeDir, '.config');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Host config filenames can vary across releases (a live WorkBuddy install stores its
|
|
39
|
+
* `mcpServers` map in `~/.workbuddy/.mcp.json`, while some docs reference `mcp.json`).
|
|
40
|
+
* Reuse whichever candidate already exists on disk so we never write a sibling file the
|
|
41
|
+
* host ignores; default to the first (canonical) candidate when none exist yet.
|
|
42
|
+
*/
|
|
43
|
+
function firstExistingConfig(dir, names) {
|
|
44
|
+
const hit = names.map((n) => path.join(dir, n)).find((p) => fs.existsSync(p));
|
|
45
|
+
return hit ?? path.join(dir, names[0]);
|
|
46
|
+
}
|
|
47
|
+
export function buildClientRegistry(e) {
|
|
48
|
+
const home = e.homeDir;
|
|
49
|
+
const appData = appDataDir(e);
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
id: 'antigravity',
|
|
53
|
+
label: 'Google Antigravity',
|
|
54
|
+
scope: 'user',
|
|
55
|
+
format: 'mcpServers',
|
|
56
|
+
detectPaths: [path.join(home, '.gemini', 'antigravity')],
|
|
57
|
+
configPath: path.join(home, '.gemini', 'antigravity', 'mcp_config.json'),
|
|
58
|
+
defaultAgent: 'antigravity',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'workbuddy',
|
|
62
|
+
label: 'WorkBuddy',
|
|
63
|
+
scope: 'user',
|
|
64
|
+
format: 'mcpServers',
|
|
65
|
+
detectPaths: [path.join(home, '.workbuddy')],
|
|
66
|
+
configPath: firstExistingConfig(path.join(home, '.workbuddy'), ['.mcp.json', 'mcp.json']),
|
|
67
|
+
defaultAgent: 'workbuddy',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'cursor',
|
|
71
|
+
label: 'Cursor',
|
|
72
|
+
scope: 'user',
|
|
73
|
+
format: 'mcpServers',
|
|
74
|
+
detectPaths: [path.join(home, '.cursor')],
|
|
75
|
+
configPath: path.join(home, '.cursor', 'mcp.json'),
|
|
76
|
+
defaultAgent: 'cursor',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'vscode',
|
|
80
|
+
label: 'VS Code (user mcp.json)',
|
|
81
|
+
scope: 'user',
|
|
82
|
+
format: 'vscode',
|
|
83
|
+
detectPaths: [path.join(appData, 'Code', 'User')],
|
|
84
|
+
configPath: path.join(appData, 'Code', 'User', 'mcp.json'),
|
|
85
|
+
defaultAgent: 'vscode',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 'windsurf',
|
|
89
|
+
label: 'Windsurf',
|
|
90
|
+
scope: 'user',
|
|
91
|
+
format: 'mcpServers',
|
|
92
|
+
detectPaths: [path.join(home, '.codeium', 'windsurf')],
|
|
93
|
+
configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),
|
|
94
|
+
defaultAgent: 'windsurf',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'claude-desktop',
|
|
98
|
+
label: 'Claude Desktop',
|
|
99
|
+
scope: 'user',
|
|
100
|
+
format: 'mcpServers',
|
|
101
|
+
detectPaths: [path.join(appData, 'Claude')],
|
|
102
|
+
configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),
|
|
103
|
+
defaultAgent: 'claude-desktop',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
// Claude Code's user-level ~/.claude.json holds unrelated state; only the project-scoped
|
|
107
|
+
// .mcp.json in the current directory is touched.
|
|
108
|
+
id: 'claude-code',
|
|
109
|
+
label: 'Claude Code (project .mcp.json)',
|
|
110
|
+
scope: 'project',
|
|
111
|
+
format: 'mcpServers',
|
|
112
|
+
detectPaths: [path.join(home, '.claude')],
|
|
113
|
+
configPath: path.join(e.cwd, '.mcp.json'),
|
|
114
|
+
defaultAgent: 'claude-code',
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
export function buildServerEntry(format, agentName, local = false) {
|
|
119
|
+
const localEntry = fileURLToPath(new URL('./index.js', import.meta.url));
|
|
120
|
+
const base = local
|
|
121
|
+
? { command: process.execPath, args: ['--experimental-sqlite', localEntry], env: { AGENT_NAME: agentName } }
|
|
122
|
+
: { command: 'npx', args: ['-y', 'ferrycat'], env: { AGENT_NAME: agentName } };
|
|
123
|
+
return format === 'vscode' ? { type: 'stdio', ...base } : base;
|
|
124
|
+
}
|
|
125
|
+
function containerKey(format) {
|
|
126
|
+
return format === 'vscode' ? 'servers' : 'mcpServers';
|
|
127
|
+
}
|
|
128
|
+
function isPlainObject(v) {
|
|
129
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
130
|
+
}
|
|
131
|
+
/** Order-insensitive structural equality for small JSON values. */
|
|
132
|
+
function jsonEqual(a, b) {
|
|
133
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
134
|
+
return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((x, i) => jsonEqual(x, b[i]));
|
|
135
|
+
}
|
|
136
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
137
|
+
const ka = Object.keys(a);
|
|
138
|
+
const kb = Object.keys(b);
|
|
139
|
+
return ka.length === kb.length && ka.every((k) => k in b && jsonEqual(a[k], b[k]));
|
|
140
|
+
}
|
|
141
|
+
return a === b;
|
|
142
|
+
}
|
|
143
|
+
function writeFileAtomic(file, content) {
|
|
144
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
145
|
+
const tmp = `${file}.ferrycat-tmp-${process.pid}`;
|
|
146
|
+
fs.writeFileSync(tmp, content, 'utf8');
|
|
147
|
+
try {
|
|
148
|
+
fs.renameSync(tmp, file);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// A host holding the config open makes MoveFileEx fail with EPERM on Windows. Never leave
|
|
152
|
+
// the temp file behind in the user's config directory.
|
|
153
|
+
try {
|
|
154
|
+
fs.rmSync(tmp, { force: true });
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
/* best-effort cleanup; preserve original rename error */
|
|
158
|
+
}
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function planClient(spec, serverName, entry, force) {
|
|
163
|
+
const key = containerKey(spec.format);
|
|
164
|
+
if (!fs.existsSync(spec.configPath)) {
|
|
165
|
+
const doc = { [key]: { [serverName]: entry } };
|
|
166
|
+
return { action: 'CREATED', existed: false, nextContent: `${JSON.stringify(doc, null, 2)}\n` };
|
|
167
|
+
}
|
|
168
|
+
const raw = fs.readFileSync(spec.configPath, 'utf8').replace(/^\uFEFF/, '');
|
|
169
|
+
let doc;
|
|
170
|
+
if (raw.trim() === '') {
|
|
171
|
+
doc = {};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
try {
|
|
175
|
+
doc = JSON.parse(raw);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return {
|
|
179
|
+
action: 'UNPARSEABLE',
|
|
180
|
+
existed: true,
|
|
181
|
+
message: `Cannot parse existing config as strict JSON (comments or syntax error: ${err instanceof Error ? err.message : String(err)}). File left untouched; paste the snippet manually.`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!isPlainObject(doc)) {
|
|
186
|
+
return { action: 'UNPARSEABLE', existed: true, message: 'Existing config root is not a JSON object. File left untouched.' };
|
|
187
|
+
}
|
|
188
|
+
const container = doc[key];
|
|
189
|
+
if (container !== undefined && !isPlainObject(container)) {
|
|
190
|
+
return { action: 'UNPARSEABLE', existed: true, message: `"${key}" in existing config is not an object. File left untouched.` };
|
|
191
|
+
}
|
|
192
|
+
const servers = (container ?? {});
|
|
193
|
+
const current = servers[serverName];
|
|
194
|
+
if (current !== undefined) {
|
|
195
|
+
if (jsonEqual(current, entry)) {
|
|
196
|
+
return { action: 'UNCHANGED', existed: true, message: 'Entry already up to date.' };
|
|
197
|
+
}
|
|
198
|
+
if (!force) {
|
|
199
|
+
return {
|
|
200
|
+
action: 'CONFLICT',
|
|
201
|
+
existed: true,
|
|
202
|
+
message: `A different "${serverName}" entry already exists. Re-run with --force to replace it (a backup is written first).`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const next = { ...doc, [key]: { ...servers, [serverName]: entry } };
|
|
207
|
+
return {
|
|
208
|
+
action: current === undefined ? 'CREATED' : 'UPDATED',
|
|
209
|
+
existed: true,
|
|
210
|
+
nextContent: `${JSON.stringify(next, null, 2)}\n`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function defaultPrompt(question) {
|
|
214
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
215
|
+
try {
|
|
216
|
+
return await rl.question(question);
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
rl.close();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export async function runInit(options = {}) {
|
|
223
|
+
const e = resolveEnvironment(options.environment);
|
|
224
|
+
const write = options.write ?? ((line) => process.stdout.write(`${line}\n`));
|
|
225
|
+
const say = (line = '') => {
|
|
226
|
+
if (!options.json)
|
|
227
|
+
write(line);
|
|
228
|
+
};
|
|
229
|
+
const serverName = options.serverName ?? 'ferrycat';
|
|
230
|
+
const registry = buildClientRegistry(e);
|
|
231
|
+
const knownIds = new Set(registry.map((c) => c.id));
|
|
232
|
+
const requested = options.clients?.map((c) => c.trim().toLowerCase()).filter(Boolean);
|
|
233
|
+
if (requested && requested.length > 0) {
|
|
234
|
+
const unknown = requested.filter((c) => !knownIds.has(c));
|
|
235
|
+
if (unknown.length > 0) {
|
|
236
|
+
throw new Error(`Unknown --client value(s): ${unknown.join(', ')}. Supported: ${[...knownIds].join(', ')}.`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (options.configPath) {
|
|
240
|
+
if (!requested || requested.length !== 1) {
|
|
241
|
+
throw new Error('--config-path requires exactly one --client <id> to be specified.');
|
|
242
|
+
}
|
|
243
|
+
const targetSpec = registry.find((c) => c.id === requested[0]);
|
|
244
|
+
if (targetSpec) {
|
|
245
|
+
targetSpec.configPath = path.resolve(e.cwd, options.configPath);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const willWrite = !options.list && !options.dryRun && (options.yes || options.interactive);
|
|
249
|
+
const dryRun = !willWrite;
|
|
250
|
+
const results = [];
|
|
251
|
+
say(`FerryCat init: MCP client setup${dryRun && !options.list ? ' (dry run: nothing will be written)' : ''}`);
|
|
252
|
+
say('');
|
|
253
|
+
for (const spec of registry) {
|
|
254
|
+
const explicitlyRequested = requested?.includes(spec.id) ?? false;
|
|
255
|
+
if (requested && requested.length > 0 && !explicitlyRequested)
|
|
256
|
+
continue;
|
|
257
|
+
const detected = spec.detectPaths.some((p) => fs.existsSync(p));
|
|
258
|
+
const agentName = options.agent?.trim() || spec.defaultAgent;
|
|
259
|
+
const entry = buildServerEntry(spec.format, agentName, Boolean(options.local));
|
|
260
|
+
const snippet = { [containerKey(spec.format)]: { [serverName]: entry } };
|
|
261
|
+
const result = {
|
|
262
|
+
id: spec.id,
|
|
263
|
+
label: spec.label,
|
|
264
|
+
detected,
|
|
265
|
+
config_path: spec.configPath,
|
|
266
|
+
agent_name: agentName,
|
|
267
|
+
action: 'NOT_DETECTED',
|
|
268
|
+
snippet,
|
|
269
|
+
};
|
|
270
|
+
results.push(result);
|
|
271
|
+
// Undetected hosts are only configured when explicitly requested via --client.
|
|
272
|
+
if (!detected && !explicitlyRequested) {
|
|
273
|
+
say(` - ${spec.label}: not detected`);
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
say(` * ${spec.label}${detected ? '' : ' (not detected, explicitly requested)'}`);
|
|
277
|
+
say(` config : ${spec.configPath}`);
|
|
278
|
+
say(` agent : AGENT_NAME=${agentName}`);
|
|
279
|
+
if (options.list) {
|
|
280
|
+
result.action = 'SKIPPED';
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
let plan;
|
|
284
|
+
try {
|
|
285
|
+
plan = planClient(spec, serverName, entry, Boolean(options.force));
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
result.action = 'ERROR';
|
|
289
|
+
result.message = err instanceof Error ? err.message : String(err);
|
|
290
|
+
say(` result : ERROR ${result.message}`);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (!plan.nextContent) {
|
|
294
|
+
result.action = plan.action;
|
|
295
|
+
result.message = plan.message;
|
|
296
|
+
say(` result : ${plan.action}${plan.message ? ` (${plan.message})` : ''}`);
|
|
297
|
+
if (plan.action === 'UNPARSEABLE' || plan.action === 'CONFLICT') {
|
|
298
|
+
say(' snippet:');
|
|
299
|
+
for (const line of JSON.stringify(snippet, null, 2).split('\n'))
|
|
300
|
+
say(` ${line}`);
|
|
301
|
+
}
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
if (dryRun) {
|
|
305
|
+
result.action = 'PLANNED';
|
|
306
|
+
result.message = `Would ${plan.action === 'UPDATED' ? 'replace' : 'add'} "${serverName}" entry.`;
|
|
307
|
+
say(` result : PLANNED (${result.message})`);
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
if (options.interactive && !options.yes) {
|
|
311
|
+
const prompt = options.prompt ?? defaultPrompt;
|
|
312
|
+
const answer = (await prompt(` Write ${spec.configPath}? [y/N] `)).trim().toLowerCase();
|
|
313
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
314
|
+
result.action = 'SKIPPED';
|
|
315
|
+
say(' result : SKIPPED by user');
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
if (plan.existed) {
|
|
321
|
+
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
322
|
+
const backup = `${spec.configPath}.ferrycat-bak-${suffix}`;
|
|
323
|
+
fs.copyFileSync(spec.configPath, backup);
|
|
324
|
+
result.backup_path = backup;
|
|
325
|
+
}
|
|
326
|
+
writeFileAtomic(spec.configPath, plan.nextContent);
|
|
327
|
+
result.action = plan.action;
|
|
328
|
+
say(` result : ${plan.action}${result.backup_path ? ` (backup: ${result.backup_path})` : ''}`);
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
332
|
+
result.action = 'ERROR';
|
|
333
|
+
result.message = result.backup_path
|
|
334
|
+
? `${errMsg} (backup preserved at ${result.backup_path})`
|
|
335
|
+
: errMsg;
|
|
336
|
+
say(` result : ERROR ${result.message}`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const touched = results.filter((r) => r.action !== 'NOT_DETECTED');
|
|
340
|
+
say('');
|
|
341
|
+
if (touched.length === 0) {
|
|
342
|
+
say('No supported MCP host detected. Use --client <id> to configure one explicitly:');
|
|
343
|
+
say(` ${registry.map((c) => c.id).join(', ')}`);
|
|
344
|
+
}
|
|
345
|
+
else if (dryRun && !options.list) {
|
|
346
|
+
say('Dry run only. Re-run with --yes to apply, or run in an interactive terminal to confirm per host.');
|
|
347
|
+
}
|
|
348
|
+
else if (!options.list) {
|
|
349
|
+
say('Restart (or reload MCP servers in) each updated host. Some hosts, e.g. WorkBuddy, also');
|
|
350
|
+
say('require you to trust/enable the new server in their connector settings.');
|
|
351
|
+
say('Next: run "npx ferrycat demo" to see a full contract lifecycle in a sandbox.');
|
|
352
|
+
}
|
|
353
|
+
const ok = !results.some((r) => r.action === 'ERROR');
|
|
354
|
+
return { ok, dry_run: dryRun, server_name: serverName, clients: results };
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|