@wootsup/mcp 0.1.0-rc.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/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/SECURITY.md +163 -0
- package/dist/auth/keychain.d.ts +47 -0
- package/dist/auth/keychain.js +262 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/oauth-provider.d.ts +68 -0
- package/dist/auth/oauth-provider.js +232 -0
- package/dist/auth/oauth-provider.js.map +1 -0
- package/dist/auth/profiles.d.ts +52 -0
- package/dist/auth/profiles.js +200 -0
- package/dist/auth/profiles.js.map +1 -0
- package/dist/auth/token.d.ts +27 -0
- package/dist/auth/token.js +88 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/install-skill.d.ts +23 -0
- package/dist/install-skill.js +73 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/modules/apimapper/cache.d.ts +2 -0
- package/dist/modules/apimapper/cache.js +71 -0
- package/dist/modules/apimapper/cache.js.map +1 -0
- package/dist/modules/apimapper/client.d.ts +85 -0
- package/dist/modules/apimapper/client.js +523 -0
- package/dist/modules/apimapper/client.js.map +1 -0
- package/dist/modules/apimapper/connections.d.ts +2 -0
- package/dist/modules/apimapper/connections.js +406 -0
- package/dist/modules/apimapper/connections.js.map +1 -0
- package/dist/modules/apimapper/credential-sanitizer.d.ts +7 -0
- package/dist/modules/apimapper/credential-sanitizer.js +70 -0
- package/dist/modules/apimapper/credential-sanitizer.js.map +1 -0
- package/dist/modules/apimapper/credentials.d.ts +2 -0
- package/dist/modules/apimapper/credentials.js +258 -0
- package/dist/modules/apimapper/credentials.js.map +1 -0
- package/dist/modules/apimapper/diagnose.d.ts +18 -0
- package/dist/modules/apimapper/diagnose.js +305 -0
- package/dist/modules/apimapper/diagnose.js.map +1 -0
- package/dist/modules/apimapper/flows.d.ts +2 -0
- package/dist/modules/apimapper/flows.js +372 -0
- package/dist/modules/apimapper/flows.js.map +1 -0
- package/dist/modules/apimapper/get-skill.d.ts +4 -0
- package/dist/modules/apimapper/get-skill.js +88 -0
- package/dist/modules/apimapper/get-skill.js.map +1 -0
- package/dist/modules/apimapper/graph-builder.d.ts +47 -0
- package/dist/modules/apimapper/graph-builder.js +117 -0
- package/dist/modules/apimapper/graph-builder.js.map +1 -0
- package/dist/modules/apimapper/graph.d.ts +2 -0
- package/dist/modules/apimapper/graph.js +117 -0
- package/dist/modules/apimapper/graph.js.map +1 -0
- package/dist/modules/apimapper/index.d.ts +2 -0
- package/dist/modules/apimapper/index.js +43 -0
- package/dist/modules/apimapper/index.js.map +1 -0
- package/dist/modules/apimapper/inspect.d.ts +20 -0
- package/dist/modules/apimapper/inspect.js +86 -0
- package/dist/modules/apimapper/inspect.js.map +1 -0
- package/dist/modules/apimapper/library.d.ts +2 -0
- package/dist/modules/apimapper/library.js +237 -0
- package/dist/modules/apimapper/library.js.map +1 -0
- package/dist/modules/apimapper/license.d.ts +2 -0
- package/dist/modules/apimapper/license.js +142 -0
- package/dist/modules/apimapper/license.js.map +1 -0
- package/dist/modules/apimapper/local-sources.d.ts +2 -0
- package/dist/modules/apimapper/local-sources.js +123 -0
- package/dist/modules/apimapper/local-sources.js.map +1 -0
- package/dist/modules/apimapper/misc.d.ts +2 -0
- package/dist/modules/apimapper/misc.js +149 -0
- package/dist/modules/apimapper/misc.js.map +1 -0
- package/dist/modules/apimapper/node-schema.d.ts +217 -0
- package/dist/modules/apimapper/node-schema.js +218 -0
- package/dist/modules/apimapper/node-schema.js.map +1 -0
- package/dist/modules/apimapper/normalizers.d.ts +13 -0
- package/dist/modules/apimapper/normalizers.js +37 -0
- package/dist/modules/apimapper/normalizers.js.map +1 -0
- package/dist/modules/apimapper/onboarding.d.ts +51 -0
- package/dist/modules/apimapper/onboarding.js +201 -0
- package/dist/modules/apimapper/onboarding.js.map +1 -0
- package/dist/modules/apimapper/schema.d.ts +2 -0
- package/dist/modules/apimapper/schema.js +84 -0
- package/dist/modules/apimapper/schema.js.map +1 -0
- package/dist/modules/apimapper/settings.d.ts +2 -0
- package/dist/modules/apimapper/settings.js +157 -0
- package/dist/modules/apimapper/settings.js.map +1 -0
- package/dist/modules/apimapper/skill-resources.d.ts +4 -0
- package/dist/modules/apimapper/skill-resources.js +85 -0
- package/dist/modules/apimapper/skill-resources.js.map +1 -0
- package/dist/modules/apimapper/types.d.ts +111 -0
- package/dist/modules/apimapper/types.js +14 -0
- package/dist/modules/apimapper/types.js.map +1 -0
- package/dist/modules/apimapper/use-profile.d.ts +34 -0
- package/dist/modules/apimapper/use-profile.js +176 -0
- package/dist/modules/apimapper/use-profile.js.map +1 -0
- package/dist/modules/apimapper/workflows.d.ts +2 -0
- package/dist/modules/apimapper/workflows.js +301 -0
- package/dist/modules/apimapper/workflows.js.map +1 -0
- package/dist/platform/index.d.ts +71 -0
- package/dist/platform/index.js +377 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/server-http.d.ts +22 -0
- package/dist/server-http.js +159 -0
- package/dist/server-http.js.map +1 -0
- package/dist/setup/detect-clients.d.ts +39 -0
- package/dist/setup/detect-clients.js +152 -0
- package/dist/setup/detect-clients.js.map +1 -0
- package/dist/setup/probe-handshake.d.ts +26 -0
- package/dist/setup/probe-handshake.js +159 -0
- package/dist/setup/probe-handshake.js.map +1 -0
- package/dist/setup/write-config.d.ts +25 -0
- package/dist/setup/write-config.js +247 -0
- package/dist/setup/write-config.js.map +1 -0
- package/dist/setup-cli.d.ts +49 -0
- package/dist/setup-cli.js +292 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/skill-instructions.d.ts +10 -0
- package/dist/skill-instructions.js +68 -0
- package/dist/skill-instructions.js.map +1 -0
- package/dist/transports/http.d.ts +29 -0
- package/dist/transports/http.js +267 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +9 -0
- package/dist/transports/stdio.js +19 -0
- package/dist/transports/stdio.js.map +1 -0
- package/docs/architecture.md +140 -0
- package/docs/customgraph-internal-migration.md +210 -0
- package/docs/security.md +126 -0
- package/docs/tools.md +230 -0
- package/manifest.json +76 -0
- package/package.json +61 -0
- package/skills/apimapper/SKILL.md +57 -0
- package/skills/apimapper/reference/joomla.md +85 -0
- package/skills/apimapper/reference/oauth.md +94 -0
- package/skills/apimapper/reference/troubleshooting.md +123 -0
- package/skills/apimapper/reference/yootheme.md +96 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// src/setup/write-config.ts — Phase 6.3.
|
|
2
|
+
//
|
|
3
|
+
// Idempotent JSON + TOML config writers. The writer:
|
|
4
|
+
//
|
|
5
|
+
// • adds an `mcpServers.<key>` entry (or `[mcp_servers.<key>]` TOML block)
|
|
6
|
+
// • marks the entry with a managed-marker so future runs can recognise it
|
|
7
|
+
// • PRESERVES unrelated user config (theme settings, other MCP servers,
|
|
8
|
+
// comments outside our managed block)
|
|
9
|
+
// • refuses to clobber an existing unmanaged entry of the same key
|
|
10
|
+
// • writes atomically via tmp-then-rename
|
|
11
|
+
// • returns an `undo()` handle that can roll back the write
|
|
12
|
+
//
|
|
13
|
+
// We don't use a TOML parser library — Codex CLI configs are simple enough
|
|
14
|
+
// that a hand-rolled, block-scoped writer keeps us dependency-free and
|
|
15
|
+
// trivially safe to roll back.
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
17
|
+
import { dirname } from "node:path";
|
|
18
|
+
export const MANAGED_MARKER = "x-managed-by";
|
|
19
|
+
export const MANAGED_VALUE = "@wootsup/mcp";
|
|
20
|
+
export const TOML_MANAGED_COMMENT = "# @apimapper-managed";
|
|
21
|
+
// ── helpers ────────────────────────────────────────────────────────────
|
|
22
|
+
function ensureDir(path) {
|
|
23
|
+
const dir = dirname(path);
|
|
24
|
+
if (!existsSync(dir))
|
|
25
|
+
mkdirSync(dir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
function atomicWrite(path, contents) {
|
|
28
|
+
ensureDir(path);
|
|
29
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
30
|
+
try {
|
|
31
|
+
writeFileSync(tmp, contents, "utf8");
|
|
32
|
+
renameSync(tmp, path);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
// Best-effort cleanup of the staging file on failure.
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(tmp))
|
|
38
|
+
unlinkSync(tmp);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* ignore */
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function readIfExists(path) {
|
|
47
|
+
if (!existsSync(path))
|
|
48
|
+
return null;
|
|
49
|
+
return readFileSync(path, "utf8");
|
|
50
|
+
}
|
|
51
|
+
function makeUndo(path, beforeContent) {
|
|
52
|
+
return async () => {
|
|
53
|
+
if (beforeContent === null) {
|
|
54
|
+
// The file didn't exist before our write — remove it entirely.
|
|
55
|
+
if (existsSync(path)) {
|
|
56
|
+
try {
|
|
57
|
+
unlinkSync(path);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
/* swallow — best-effort rollback */
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
atomicWrite(path, beforeContent);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// ── JSON writer ────────────────────────────────────────────────────────
|
|
69
|
+
export async function writeJsonConfig(path, key, entry) {
|
|
70
|
+
const before = readIfExists(path);
|
|
71
|
+
const noopUndo = makeUndo(path, before);
|
|
72
|
+
let parsed;
|
|
73
|
+
if (before === null) {
|
|
74
|
+
parsed = {};
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
try {
|
|
78
|
+
const raw = JSON.parse(before);
|
|
79
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
80
|
+
// Treat non-object root as empty config — preserves nothing but
|
|
81
|
+
// also doesn't crash on a malformed file.
|
|
82
|
+
parsed = {};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
parsed = raw;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
parsed = {};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Ensure mcpServers is a plain object.
|
|
93
|
+
let servers;
|
|
94
|
+
const existing = parsed.mcpServers;
|
|
95
|
+
if (existing &&
|
|
96
|
+
typeof existing === "object" &&
|
|
97
|
+
!Array.isArray(existing)) {
|
|
98
|
+
servers = existing;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
servers = {};
|
|
102
|
+
}
|
|
103
|
+
const existingEntry = servers[key];
|
|
104
|
+
const isManaged = existingEntry &&
|
|
105
|
+
typeof existingEntry === "object" &&
|
|
106
|
+
!Array.isArray(existingEntry) &&
|
|
107
|
+
existingEntry[MANAGED_MARKER] ===
|
|
108
|
+
MANAGED_VALUE;
|
|
109
|
+
const keyPresent = existingEntry !== undefined;
|
|
110
|
+
if (keyPresent && !isManaged) {
|
|
111
|
+
// Don't clobber a user-managed entry of the same key.
|
|
112
|
+
return { added: false, alreadyManaged: false, undo: noopUndo };
|
|
113
|
+
}
|
|
114
|
+
// Build the new entry. Preserve unrelated fields the user may have
|
|
115
|
+
// added (e.g. transport metadata) when we're updating a managed entry.
|
|
116
|
+
const merged = isManaged && typeof existingEntry === "object" && existingEntry !== null
|
|
117
|
+
? { ...existingEntry }
|
|
118
|
+
: {};
|
|
119
|
+
merged.command = entry.command;
|
|
120
|
+
merged.args = entry.args;
|
|
121
|
+
if (entry.env) {
|
|
122
|
+
merged.env = entry.env;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
delete merged.env;
|
|
126
|
+
}
|
|
127
|
+
merged[MANAGED_MARKER] = MANAGED_VALUE;
|
|
128
|
+
servers[key] = merged;
|
|
129
|
+
parsed.mcpServers = servers;
|
|
130
|
+
atomicWrite(path, `${JSON.stringify(parsed, null, 2)}\n`);
|
|
131
|
+
return {
|
|
132
|
+
added: true,
|
|
133
|
+
alreadyManaged: Boolean(isManaged),
|
|
134
|
+
undo: makeUndo(path, before),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// ── TOML writer ────────────────────────────────────────────────────────
|
|
138
|
+
function tomlEscape(s) {
|
|
139
|
+
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
140
|
+
}
|
|
141
|
+
function renderTomlEntry(key, entry) {
|
|
142
|
+
const lines = [];
|
|
143
|
+
lines.push(TOML_MANAGED_COMMENT);
|
|
144
|
+
lines.push(`[mcp_servers.${key}]`);
|
|
145
|
+
lines.push(`command = "${tomlEscape(entry.command)}"`);
|
|
146
|
+
const args = entry.args.map((a) => `"${tomlEscape(a)}"`).join(", ");
|
|
147
|
+
lines.push(`args = [${args}]`);
|
|
148
|
+
if (entry.env && Object.keys(entry.env).length > 0) {
|
|
149
|
+
lines.push(`[mcp_servers.${key}.env]`);
|
|
150
|
+
for (const [k, v] of Object.entries(entry.env)) {
|
|
151
|
+
lines.push(`${k} = "${tomlEscape(v)}"`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
lines.push(""); // trailing blank line for readability
|
|
155
|
+
return lines.join("\n");
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Find the block boundaries for `[mcp_servers.<key>]` in `lines`. A block
|
|
159
|
+
* ends at the next `[...]` heading or at EOF. The "start" line is the
|
|
160
|
+
* managed-marker comment if it directly precedes the header, otherwise
|
|
161
|
+
* the header line itself.
|
|
162
|
+
*/
|
|
163
|
+
function findTomlBlock(lines, key) {
|
|
164
|
+
const headerExact = `[mcp_servers.${key}]`;
|
|
165
|
+
const subPrefix = `[mcp_servers.${key}.`;
|
|
166
|
+
let headerIdx = -1;
|
|
167
|
+
for (let i = 0; i < lines.length; i++) {
|
|
168
|
+
const trimmed = lines[i].trim();
|
|
169
|
+
if (trimmed === headerExact) {
|
|
170
|
+
headerIdx = i;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (headerIdx === -1)
|
|
175
|
+
return null;
|
|
176
|
+
let endExclusive = lines.length;
|
|
177
|
+
for (let i = headerIdx + 1; i < lines.length; i++) {
|
|
178
|
+
const trimmed = lines[i].trim();
|
|
179
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
180
|
+
// Sub-tables (e.g. `[mcp_servers.<key>.env]`) belong to this block.
|
|
181
|
+
if (trimmed.startsWith(subPrefix))
|
|
182
|
+
continue;
|
|
183
|
+
endExclusive = i;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Detect marker on the line immediately above the header.
|
|
188
|
+
let start = headerIdx;
|
|
189
|
+
let hasMarker = false;
|
|
190
|
+
if (headerIdx > 0 && lines[headerIdx - 1].trim() === TOML_MANAGED_COMMENT) {
|
|
191
|
+
start = headerIdx - 1;
|
|
192
|
+
hasMarker = true;
|
|
193
|
+
}
|
|
194
|
+
// Trim trailing blank lines from this block into the block-span so undo
|
|
195
|
+
// doesn't leave a double blank when the block is removed.
|
|
196
|
+
while (endExclusive > start &&
|
|
197
|
+
lines[endExclusive - 1] !== undefined &&
|
|
198
|
+
lines[endExclusive - 1].trim() === "") {
|
|
199
|
+
endExclusive--;
|
|
200
|
+
}
|
|
201
|
+
return { start, endExclusive, hasMarker };
|
|
202
|
+
}
|
|
203
|
+
export async function writeTomlConfig(path, key, entry) {
|
|
204
|
+
const before = readIfExists(path);
|
|
205
|
+
const noopUndo = makeUndo(path, before);
|
|
206
|
+
const original = before ?? "";
|
|
207
|
+
const lines = original.length === 0 ? [] : original.split("\n");
|
|
208
|
+
const span = findTomlBlock(lines, key);
|
|
209
|
+
if (span && !span.hasMarker) {
|
|
210
|
+
// Unmanaged user block — leave it alone.
|
|
211
|
+
return { added: false, alreadyManaged: false, undo: noopUndo };
|
|
212
|
+
}
|
|
213
|
+
const rendered = renderTomlEntry(key, entry);
|
|
214
|
+
let nextText;
|
|
215
|
+
if (span && span.hasMarker) {
|
|
216
|
+
// Replace the managed block in-place.
|
|
217
|
+
const head = lines.slice(0, span.start);
|
|
218
|
+
const tail = lines.slice(span.endExclusive);
|
|
219
|
+
// Re-join + ensure exactly one blank line separator between rendered
|
|
220
|
+
// block and following content (if any).
|
|
221
|
+
const headText = head.join("\n");
|
|
222
|
+
const tailText = tail.join("\n");
|
|
223
|
+
const sep = headText.length > 0 && !headText.endsWith("\n\n")
|
|
224
|
+
? (headText.endsWith("\n") ? "" : "\n")
|
|
225
|
+
: "";
|
|
226
|
+
nextText = `${headText}${sep}${rendered}${tailText.length > 0 ? `\n${tailText.replace(/^\n+/, "")}` : ""}`;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// Append rendered block to end.
|
|
230
|
+
const sep = original.length === 0 || original.endsWith("\n\n")
|
|
231
|
+
? ""
|
|
232
|
+
: original.endsWith("\n")
|
|
233
|
+
? "\n"
|
|
234
|
+
: "\n\n";
|
|
235
|
+
nextText = `${original}${sep}${rendered}`;
|
|
236
|
+
}
|
|
237
|
+
// Normalise trailing newline.
|
|
238
|
+
if (!nextText.endsWith("\n"))
|
|
239
|
+
nextText += "\n";
|
|
240
|
+
atomicWrite(path, nextText);
|
|
241
|
+
return {
|
|
242
|
+
added: true,
|
|
243
|
+
alreadyManaged: Boolean(span && span.hasMarker),
|
|
244
|
+
undo: makeUndo(path, before),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=write-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-config.js","sourceRoot":"","sources":["../../src/setup/write-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { installSkill as defaultInstallSkill } from "./install-skill.js";
|
|
3
|
+
import { type TokenPayload } from "./auth/token.js";
|
|
4
|
+
import { type DetectedClient } from "./setup/detect-clients.js";
|
|
5
|
+
import { type McpEntry, type WriteConfigResult } from "./setup/write-config.js";
|
|
6
|
+
import { type ProbeOptions, type ProbeResult } from "./setup/probe-handshake.js";
|
|
7
|
+
export interface IdentityResponse {
|
|
8
|
+
platform: "wordpress" | "joomla" | "unknown";
|
|
9
|
+
siteurl: string;
|
|
10
|
+
plugin_version: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WizardAnswers {
|
|
13
|
+
token: string;
|
|
14
|
+
siteUrl: string;
|
|
15
|
+
profileName: string;
|
|
16
|
+
/** IDs of clients the user wants wired up. */
|
|
17
|
+
selectedClients: string[];
|
|
18
|
+
confirmIdentity: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface WizardDeps {
|
|
21
|
+
/**
|
|
22
|
+
* Drive the wizard prompts. Returns the collected answers or `null` if
|
|
23
|
+
* the user cancelled at any step.
|
|
24
|
+
*
|
|
25
|
+
* The real implementation in this module uses @clack/prompts under the
|
|
26
|
+
* hood; tests inject a deterministic fake.
|
|
27
|
+
*/
|
|
28
|
+
prompt: (input: {
|
|
29
|
+
detected: DetectedClient[];
|
|
30
|
+
decodeToken: (t: string) => TokenPayload | null;
|
|
31
|
+
}) => Promise<WizardAnswers | null>;
|
|
32
|
+
detectClients: () => Promise<DetectedClient[]>;
|
|
33
|
+
probeIdentity: (siteUrl: string) => Promise<IdentityResponse>;
|
|
34
|
+
writeJsonConfig: (path: string, key: string, entry: McpEntry) => Promise<WriteConfigResult>;
|
|
35
|
+
writeTomlConfig: (path: string, key: string, entry: McpEntry) => Promise<WriteConfigResult>;
|
|
36
|
+
probeHandshake: (opts: ProbeOptions) => Promise<ProbeResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Sink for human-facing status lines. The default writes to stderr;
|
|
39
|
+
* tests can stub to a buffer.
|
|
40
|
+
*/
|
|
41
|
+
log?: (line: string) => void;
|
|
42
|
+
}
|
|
43
|
+
interface RunCliDeps {
|
|
44
|
+
installSkill: typeof defaultInstallSkill;
|
|
45
|
+
runWizard: () => Promise<number>;
|
|
46
|
+
}
|
|
47
|
+
export declare function runWizard(deps?: WizardDeps): Promise<number>;
|
|
48
|
+
export declare function runCli(argv: string[], deps?: Partial<RunCliDeps>): Promise<number>;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// src/setup-cli.ts — Phase 6.1.
|
|
3
|
+
//
|
|
4
|
+
// Top-level CLI entry. Three subcommands:
|
|
5
|
+
//
|
|
6
|
+
// setup (default) — interactive @clack/prompts first-run wizard
|
|
7
|
+
// install-skill — copy the bundled skill to ~/.claude/skills/
|
|
8
|
+
// (preserved verbatim from Phase 7.5)
|
|
9
|
+
// --help / help — usage
|
|
10
|
+
//
|
|
11
|
+
// The wizard logic lives in runWizard(), which accepts a WizardDeps
|
|
12
|
+
// bag so the unit tests can drive a deterministic prompt/probe/write/
|
|
13
|
+
// handshake sequence without touching real subprocesses or filesystems.
|
|
14
|
+
// The default DEPS object plugs in the real @clack/prompts UI, the
|
|
15
|
+
// real detect-clients, write-config, and probe-handshake modules.
|
|
16
|
+
import { intro, outro, text, multiselect, spinner, cancel, isCancel, note, } from "@clack/prompts";
|
|
17
|
+
import { installSkill as defaultInstallSkill } from "./install-skill.js";
|
|
18
|
+
import { decodeToken } from "./auth/token.js";
|
|
19
|
+
import { detectClients as defaultDetectClients, } from "./setup/detect-clients.js";
|
|
20
|
+
import { writeJsonConfig as defaultWriteJsonConfig, writeTomlConfig as defaultWriteTomlConfig, } from "./setup/write-config.js";
|
|
21
|
+
import { probeHandshake as defaultProbeHandshake, rollbackAll, } from "./setup/probe-handshake.js";
|
|
22
|
+
const HELP_TEXT = `Usage: apimapper-mcp <command>
|
|
23
|
+
|
|
24
|
+
Commands:
|
|
25
|
+
setup Interactive first-run wizard (default if no command)
|
|
26
|
+
install-skill Copy the bundled apimapper skill to ~/.claude/skills/
|
|
27
|
+
and register it in ~/AGENTS.md.
|
|
28
|
+
help Show this message.
|
|
29
|
+
`;
|
|
30
|
+
// ── identity probe (default impl) ───────────────────────────────────────
|
|
31
|
+
const PROBE_TIMEOUT_MS = 5_000;
|
|
32
|
+
/**
|
|
33
|
+
* Try WordPress + Joomla identity endpoints in parallel; the first
|
|
34
|
+
* successful response wins. Throws if neither responds (or both 404).
|
|
35
|
+
*/
|
|
36
|
+
async function probeIdentity(siteUrl) {
|
|
37
|
+
const base = siteUrl.replace(/\/+$/, "");
|
|
38
|
+
const wpUrl = `${base}/wp-json/api-mapper/v1/identity`;
|
|
39
|
+
const joomlaUrl = `${base}/index.php?option=com_ajax&plugin=apimapper&task=getIdentity&format=json`;
|
|
40
|
+
const ctrl = new AbortController();
|
|
41
|
+
const deadline = setTimeout(() => ctrl.abort(), PROBE_TIMEOUT_MS);
|
|
42
|
+
const fetchOne = async (url, expectPlatform) => {
|
|
43
|
+
const r = await fetch(url, { signal: ctrl.signal });
|
|
44
|
+
if (!r.ok)
|
|
45
|
+
throw new Error(`${expectPlatform} probe HTTP ${r.status}`);
|
|
46
|
+
const raw = (await r.json());
|
|
47
|
+
// Joomla wraps in {success, data}; WP returns the payload directly.
|
|
48
|
+
const body = expectPlatform === "joomla" && raw && typeof raw === "object" && "data" in raw
|
|
49
|
+
? raw.data
|
|
50
|
+
: raw;
|
|
51
|
+
return {
|
|
52
|
+
platform: expectPlatform,
|
|
53
|
+
siteurl: typeof body.siteurl === "string" ? body.siteurl : base,
|
|
54
|
+
plugin_version: typeof body.plugin_version === "string" ? body.plugin_version : "unknown",
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
return await Promise.any([
|
|
59
|
+
fetchOne(wpUrl, "wordpress"),
|
|
60
|
+
fetchOne(joomlaUrl, "joomla"),
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof AggregateError) {
|
|
65
|
+
const messages = err.errors.map((e) => e instanceof Error ? e.message : String(e));
|
|
66
|
+
throw new Error(`Identity probe failed (no WP or Joomla endpoint responded): ${messages.join("; ")}`);
|
|
67
|
+
}
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
clearTimeout(deadline);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── default @clack/prompts driver ───────────────────────────────────────
|
|
75
|
+
function bail(value, errStream) {
|
|
76
|
+
if (isCancel(value)) {
|
|
77
|
+
cancel("Setup cancelled. No config files were written.");
|
|
78
|
+
errStream("Setup cancelled by user.");
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
async function defaultPromptDriver(input) {
|
|
84
|
+
intro("🔌 Welcome to API Mapper MCP setup");
|
|
85
|
+
// 1. token
|
|
86
|
+
const tokenAns = await text({
|
|
87
|
+
message: "Paste your MCP key",
|
|
88
|
+
placeholder: "amk_live_…",
|
|
89
|
+
validate: (v) => typeof v === "string" && /^amk_(live|test)_/.test(v)
|
|
90
|
+
? undefined
|
|
91
|
+
: "Must start with amk_live_ or amk_test_",
|
|
92
|
+
});
|
|
93
|
+
const token = bail(tokenAns, (s) => process.stderr.write(`${s}\n`));
|
|
94
|
+
if (token === null)
|
|
95
|
+
return null;
|
|
96
|
+
const payload = input.decodeToken(token);
|
|
97
|
+
if (!payload) {
|
|
98
|
+
cancel("Could not decode token (malformed payload).");
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
note([
|
|
102
|
+
`Key ID: ${payload.kid}`,
|
|
103
|
+
`Issuer: ${payload.iss}`,
|
|
104
|
+
`Scope: ${payload.scope.join(", ") || "<none>"}`,
|
|
105
|
+
].join("\n"), "Token payload");
|
|
106
|
+
// 2. site URL
|
|
107
|
+
const siteAns = await text({
|
|
108
|
+
message: "Site URL",
|
|
109
|
+
placeholder: "https://example.com",
|
|
110
|
+
initialValue: payload.iss,
|
|
111
|
+
validate: (v) => typeof v === "string" && /^https?:\/\//.test(v)
|
|
112
|
+
? undefined
|
|
113
|
+
: "Must be a fully-qualified URL",
|
|
114
|
+
});
|
|
115
|
+
const siteUrl = bail(siteAns, (s) => process.stderr.write(`${s}\n`));
|
|
116
|
+
if (siteUrl === null)
|
|
117
|
+
return null;
|
|
118
|
+
// 3. profile name
|
|
119
|
+
const profileAns = await text({
|
|
120
|
+
message: "Profile name (for switching between sites)",
|
|
121
|
+
initialValue: "default",
|
|
122
|
+
validate: (v) => typeof v === "string" && /^[a-zA-Z0-9_-]+$/.test(v)
|
|
123
|
+
? undefined
|
|
124
|
+
: "Use letters, digits, dashes, or underscores only",
|
|
125
|
+
});
|
|
126
|
+
const profileName = bail(profileAns, (s) => process.stderr.write(`${s}\n`));
|
|
127
|
+
if (profileName === null)
|
|
128
|
+
return null;
|
|
129
|
+
// 4. client selection
|
|
130
|
+
const clientAns = await multiselect({
|
|
131
|
+
message: "Which AI clients to wire up?",
|
|
132
|
+
options: input.detected.map((c) => ({
|
|
133
|
+
value: c.id,
|
|
134
|
+
label: `${c.label}${c.installed ? "" : " (not detected)"}`,
|
|
135
|
+
})),
|
|
136
|
+
required: true,
|
|
137
|
+
});
|
|
138
|
+
const selectedClients = bail(clientAns, (s) => process.stderr.write(`${s}\n`));
|
|
139
|
+
if (selectedClients === null)
|
|
140
|
+
return null;
|
|
141
|
+
// 5. identity confirmation gate (defer the actual confirm until after
|
|
142
|
+
// identity probe in the wizard body — see runWizard).
|
|
143
|
+
return {
|
|
144
|
+
token,
|
|
145
|
+
siteUrl,
|
|
146
|
+
profileName,
|
|
147
|
+
selectedClients,
|
|
148
|
+
confirmIdentity: true,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// ── wizard ──────────────────────────────────────────────────────────────
|
|
152
|
+
const DEFAULT_DEPS = {
|
|
153
|
+
prompt: defaultPromptDriver,
|
|
154
|
+
detectClients: () => defaultDetectClients(),
|
|
155
|
+
probeIdentity,
|
|
156
|
+
writeJsonConfig: (p, k, e) => defaultWriteJsonConfig(p, k, e),
|
|
157
|
+
writeTomlConfig: (p, k, e) => defaultWriteTomlConfig(p, k, e),
|
|
158
|
+
probeHandshake: (o) => defaultProbeHandshake(o),
|
|
159
|
+
};
|
|
160
|
+
export async function runWizard(deps = DEFAULT_DEPS) {
|
|
161
|
+
const log = deps.log ?? ((line) => process.stderr.write(`${line}\n`));
|
|
162
|
+
// 1. Detect installed clients.
|
|
163
|
+
const detected = await deps.detectClients();
|
|
164
|
+
// 2. Collect answers via the prompt driver.
|
|
165
|
+
const answers = await deps.prompt({ detected, decodeToken });
|
|
166
|
+
if (!answers)
|
|
167
|
+
return 130; // standard "user cancelled" exit code
|
|
168
|
+
// 3. Re-decode token (defence in depth — drivers may not have done it).
|
|
169
|
+
const payload = decodeToken(answers.token);
|
|
170
|
+
if (!payload) {
|
|
171
|
+
log("Invalid MCP key — could not decode payload.");
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
// 4. Probe identity (with a visible spinner in the default UI).
|
|
175
|
+
let identity;
|
|
176
|
+
const spin = deps.log === undefined
|
|
177
|
+
? spinner()
|
|
178
|
+
: { start: () => { }, stop: (_msg) => { } };
|
|
179
|
+
try {
|
|
180
|
+
spin.start("Probing site for API Mapper plugin…");
|
|
181
|
+
identity = await deps.probeIdentity(answers.siteUrl);
|
|
182
|
+
spin.stop(`Detected ${identity.platform} (plugin v${identity.plugin_version})`);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
spin.stop("Identity probe failed");
|
|
186
|
+
log(`Could not reach ${answers.siteUrl}: ${err instanceof Error ? err.message : String(err)}`);
|
|
187
|
+
return 2;
|
|
188
|
+
}
|
|
189
|
+
// 5. Write configs to selected clients.
|
|
190
|
+
const undos = [];
|
|
191
|
+
const selectedDef = new Set(answers.selectedClients);
|
|
192
|
+
const entry = {
|
|
193
|
+
command: "npx",
|
|
194
|
+
args: ["-y", "@wootsup/mcp@latest"],
|
|
195
|
+
env: { APIMAPPER_PROFILE: answers.profileName },
|
|
196
|
+
};
|
|
197
|
+
for (const client of detected) {
|
|
198
|
+
if (!selectedDef.has(client.id))
|
|
199
|
+
continue;
|
|
200
|
+
try {
|
|
201
|
+
const writer = client.format === "toml"
|
|
202
|
+
? deps.writeTomlConfig
|
|
203
|
+
: deps.writeJsonConfig;
|
|
204
|
+
const res = await writer(client.configPath, "apimapper", entry);
|
|
205
|
+
if (res.added) {
|
|
206
|
+
undos.push(res.undo);
|
|
207
|
+
log(`✓ ${client.label}: config written (${client.configPath})`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
log(`! ${client.label}: existing unmanaged entry found — left untouched`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
log(`✗ ${client.label}: write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
215
|
+
await rollbackAll(undos);
|
|
216
|
+
return 3;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (undos.length === 0) {
|
|
220
|
+
log("No client configs were written.");
|
|
221
|
+
return 4;
|
|
222
|
+
}
|
|
223
|
+
// 6. Post-write probe — spawn the new MCP via stdio and verify the
|
|
224
|
+
// health tool is registered.
|
|
225
|
+
const probe = await deps.probeHandshake({
|
|
226
|
+
command: entry.command,
|
|
227
|
+
args: entry.args,
|
|
228
|
+
env: entry.env,
|
|
229
|
+
});
|
|
230
|
+
if (!probe.ok) {
|
|
231
|
+
log(`MCP handshake failed: ${probe.error ?? "unknown error"}`);
|
|
232
|
+
await rollbackAll(undos);
|
|
233
|
+
return 5;
|
|
234
|
+
}
|
|
235
|
+
outro(`🎉 Setup complete (${undos.length} client${undos.length === 1 ? "" : "s"} wired). ` +
|
|
236
|
+
"Restart your AI client and try: \"What MCP tools do I have?\"");
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
// ── CLI dispatcher ──────────────────────────────────────────────────────
|
|
240
|
+
export async function runCli(argv, deps) {
|
|
241
|
+
const installSkill = deps?.installSkill ?? defaultInstallSkill;
|
|
242
|
+
const wizard = deps?.runWizard ?? (() => runWizard());
|
|
243
|
+
const [subcommand] = argv;
|
|
244
|
+
// Default subcommand (no args, or `setup`) runs the wizard.
|
|
245
|
+
if (!subcommand || subcommand === "setup") {
|
|
246
|
+
return wizard();
|
|
247
|
+
}
|
|
248
|
+
switch (subcommand) {
|
|
249
|
+
case "install-skill":
|
|
250
|
+
case "install": {
|
|
251
|
+
try {
|
|
252
|
+
const result = await installSkill();
|
|
253
|
+
if (result.markerAlreadyPresent) {
|
|
254
|
+
console.log("apimapper-mcp: skill refreshed (marker already in AGENTS.md).");
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
console.log("apimapper-mcp: skill installed + AGENTS.md updated.");
|
|
258
|
+
}
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
263
|
+
console.error(`apimapper-mcp: install-skill failed: ${msg}`);
|
|
264
|
+
return 2;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
case "--help":
|
|
268
|
+
case "-h":
|
|
269
|
+
case "help": {
|
|
270
|
+
console.log(HELP_TEXT);
|
|
271
|
+
return 0;
|
|
272
|
+
}
|
|
273
|
+
default: {
|
|
274
|
+
console.error(`apimapper-mcp: unknown command "${subcommand}".`);
|
|
275
|
+
console.error(HELP_TEXT);
|
|
276
|
+
return 1;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Direct CLI entry — only run main() when this file is invoked, not when
|
|
281
|
+
// it's imported from tests.
|
|
282
|
+
const isMain = typeof process !== "undefined" &&
|
|
283
|
+
process.argv[1] &&
|
|
284
|
+
// Resolve __filename without relying on commonjs globals.
|
|
285
|
+
import.meta.url === `file://${process.argv[1]}`;
|
|
286
|
+
if (isMain) {
|
|
287
|
+
runCli(process.argv.slice(2)).then((code) => process.exit(code), (err) => {
|
|
288
|
+
console.error("apimapper-mcp: fatal error:", err);
|
|
289
|
+
process.exit(99);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=setup-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const FALLBACK_INSTRUCTIONS = "Use this MCP to manage API Mapper flows, connections, and sources across WordPress + Joomla.";
|
|
2
|
+
/**
|
|
3
|
+
* Loads MCP server instructions from skills/apimapper/SKILL.md.
|
|
4
|
+
*
|
|
5
|
+
* @param rootDir - Override the package root directory (used by tests).
|
|
6
|
+
* Defaults to the directory two levels up from this file
|
|
7
|
+
* (i.e. the package root), so that `skills/apimapper/SKILL.md`
|
|
8
|
+
* resolves correctly both in dev (src/) and in build (dist/).
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadSkillInstructions(rootDir?: string): string;
|