@cg3/equip 0.10.1 → 0.11.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/README.md +10 -6
- package/dist/lib/auth.d.ts +19 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +73 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/commands/doctor.d.ts.map +1 -1
- package/dist/lib/commands/doctor.js +15 -0
- package/dist/lib/commands/doctor.js.map +1 -1
- package/dist/lib/commands/update.d.ts.map +1 -1
- package/dist/lib/commands/update.js +19 -5
- package/dist/lib/commands/update.js.map +1 -1
- package/dist/lib/migrate.d.ts +14 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +166 -0
- package/dist/lib/migrate.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Equip
|
|
2
2
|
|
|
3
3
|
Cross-platform installer for MCP tools, behavioral rules, agent skills, and lifecycle hooks.
|
|
4
4
|
|
|
5
|
-
[
|
|
5
|
+
[](https://www.npmjs.com/package/@cg3/equip)
|
|
6
|
+
|
|
7
|
+
[Discord](https://discord.gg/bBcRHT4J) | [Tool Author Guide](./docs/tool-author.md)
|
|
6
8
|
|
|
7
9
|
## What It Does
|
|
8
10
|
|
|
9
11
|
You build an MCP tool. You want it to work on Claude Code, Cursor, VS Code, Windsurf, Cline, Roo Code, Codex, Gemini CLI, and more. Each platform has its own config format, file paths, root keys, URL fields, and quirks.
|
|
10
12
|
|
|
11
|
-
Equip handles all of that. One setup script,
|
|
13
|
+
Equip handles all of that. One setup script, every platform.
|
|
12
14
|
|
|
13
15
|
## Install
|
|
14
16
|
|
|
@@ -61,9 +63,9 @@ Equip distributes your tool through four complementary layers:
|
|
|
61
63
|
|
|
62
64
|
| Layer | What It Does | Reliability | Coverage |
|
|
63
65
|
|---|---|---|---|
|
|
64
|
-
| [MCP Config](./docs/mcp-servers.md) | Makes the tool *available* — agent can call it | Baseline |
|
|
65
|
-
| [Behavioral Rules](./docs/rules.md) | Teaches the agent *when* to call it | Strong |
|
|
66
|
-
| [Agent Skills](./docs/skills.md) | Gives the agent *detailed knowledge* of how to use it | Strong (varies) |
|
|
66
|
+
| [MCP Config](./docs/mcp-servers.md) | Makes the tool *available* — agent can call it | Baseline | All platforms |
|
|
67
|
+
| [Behavioral Rules](./docs/rules.md) | Teaches the agent *when* to call it | Strong | Most platforms + clipboard |
|
|
68
|
+
| [Agent Skills](./docs/skills.md) | Gives the agent *detailed knowledge* of how to use it | Strong (varies) | Most platforms |
|
|
67
69
|
| [Lifecycle Hooks](./docs/hooks.md) | *Structurally enforces* behavior at key moments | Strongest | 1 platform (Claude Code) |
|
|
68
70
|
|
|
69
71
|
Each layer compensates for the limitations of the one before it. Tool descriptions alone don't reliably trigger behavior. Rules are stronger but can be compacted. Skills add depth but may not auto-invoke on all platforms. Hooks fire automatically, independent of the agent's memory.
|
|
@@ -85,6 +87,8 @@ No layer is a silver bullet. Together, they give you the best coverage available
|
|
|
85
87
|
| Junie | Yes | -- | -- | -- |
|
|
86
88
|
| Copilot (JetBrains) | Yes | -- | -- | -- |
|
|
87
89
|
| Copilot CLI | Yes | -- | -- | -- |
|
|
90
|
+
| Amazon Q | Yes | -- | -- | -- |
|
|
91
|
+
| Tabnine | Yes | Yes | -- | -- |
|
|
88
92
|
|
|
89
93
|
See [Platforms](./docs/platforms.md) for full details — config paths, detection, and per-platform quirks.
|
|
90
94
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface AuthCheckResult {
|
|
2
|
+
/** "ok" = valid JWT with future exp, "present" = exists but can't validate,
|
|
3
|
+
* "missing" = no auth header, "expired" = JWT with past exp */
|
|
4
|
+
status: "ok" | "present" | "missing" | "expired";
|
|
5
|
+
detail?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check auth headers in an MCP config entry.
|
|
9
|
+
* Extracts the Authorization header from all possible locations
|
|
10
|
+
* (top-level headers, http_headers, nested requestInit.headers).
|
|
11
|
+
* If the token looks like a JWT, checks the exp claim.
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkAuth(entry: Record<string, unknown>): AuthCheckResult;
|
|
14
|
+
/**
|
|
15
|
+
* Extract the Authorization header from an MCP config entry,
|
|
16
|
+
* checking all known header locations across platforms.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractAuthHeader(entry: Record<string, unknown>): string | null;
|
|
19
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B;oEACgE;IAChE,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAezE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAc/E"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Auth checking — detects missing, expired, or invalid auth in MCP config entries.
|
|
3
|
+
// No network calls. Checks config structure and JWT exp claims only.
|
|
4
|
+
// Zero dependencies.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkAuth = checkAuth;
|
|
7
|
+
exports.extractAuthHeader = extractAuthHeader;
|
|
8
|
+
// ─── Check ──────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Check auth headers in an MCP config entry.
|
|
11
|
+
* Extracts the Authorization header from all possible locations
|
|
12
|
+
* (top-level headers, http_headers, nested requestInit.headers).
|
|
13
|
+
* If the token looks like a JWT, checks the exp claim.
|
|
14
|
+
*/
|
|
15
|
+
function checkAuth(entry) {
|
|
16
|
+
const authValue = extractAuthHeader(entry);
|
|
17
|
+
if (!authValue)
|
|
18
|
+
return { status: "missing" };
|
|
19
|
+
// If it starts with "Bearer ", extract the token
|
|
20
|
+
const token = authValue.startsWith("Bearer ") ? authValue.slice(7) : authValue;
|
|
21
|
+
// Check if it looks like a JWT (three base64 segments separated by dots)
|
|
22
|
+
const parts = token.split(".");
|
|
23
|
+
if (parts.length === 3) {
|
|
24
|
+
return checkJwtExpiry(parts[1]);
|
|
25
|
+
}
|
|
26
|
+
// Not a JWT — it's a static API key. Can't validate without a network call.
|
|
27
|
+
return { status: "present" };
|
|
28
|
+
}
|
|
29
|
+
// ─── Helpers ────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Extract the Authorization header from an MCP config entry,
|
|
32
|
+
* checking all known header locations across platforms.
|
|
33
|
+
*/
|
|
34
|
+
function extractAuthHeader(entry) {
|
|
35
|
+
// Top-level headers (most platforms)
|
|
36
|
+
const headers = entry.headers;
|
|
37
|
+
if (headers?.Authorization)
|
|
38
|
+
return headers.Authorization;
|
|
39
|
+
// http_headers (Codex)
|
|
40
|
+
const httpHeaders = entry.http_headers;
|
|
41
|
+
if (httpHeaders?.Authorization)
|
|
42
|
+
return httpHeaders.Authorization;
|
|
43
|
+
// Nested in requestInit (Tabnine)
|
|
44
|
+
const requestInit = entry.requestInit;
|
|
45
|
+
if (requestInit?.headers?.Authorization)
|
|
46
|
+
return requestInit.headers.Authorization;
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function checkJwtExpiry(payloadB64) {
|
|
50
|
+
try {
|
|
51
|
+
// JWT payload is base64url encoded — normalize to standard base64
|
|
52
|
+
const normalized = payloadB64.replace(/-/g, "+").replace(/_/g, "/");
|
|
53
|
+
const padded = normalized + "=".repeat((4 - normalized.length % 4) % 4);
|
|
54
|
+
const payload = JSON.parse(Buffer.from(padded, "base64").toString("utf-8"));
|
|
55
|
+
if (typeof payload.exp === "number") {
|
|
56
|
+
const now = Math.floor(Date.now() / 1000);
|
|
57
|
+
if (payload.exp < now) {
|
|
58
|
+
const expiredAgo = now - payload.exp;
|
|
59
|
+
const hours = Math.floor(expiredAgo / 3600);
|
|
60
|
+
const detail = hours > 0 ? `expired ${hours}h ago` : `expired ${Math.floor(expiredAgo / 60)}m ago`;
|
|
61
|
+
return { status: "expired", detail };
|
|
62
|
+
}
|
|
63
|
+
return { status: "ok" };
|
|
64
|
+
}
|
|
65
|
+
// JWT but no exp claim — can't determine expiry
|
|
66
|
+
return { status: "present" };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Couldn't decode — treat as opaque token
|
|
70
|
+
return { status: "present" };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/doctor.ts"],"names":[],"mappings":"AAUA,wBAAgB,SAAS,IAAI,IAAI,CA4KhC"}
|
|
@@ -41,6 +41,7 @@ const mcp_1 = require("../mcp");
|
|
|
41
41
|
const state_1 = require("../state");
|
|
42
42
|
const detect_1 = require("../detect");
|
|
43
43
|
const cli = __importStar(require("../cli"));
|
|
44
|
+
const auth_1 = require("../auth");
|
|
44
45
|
function runDoctor() {
|
|
45
46
|
cli.log(`\n${cli.BOLD}equip doctor${cli.RESET}\n`);
|
|
46
47
|
const state = (0, state_1.readState)();
|
|
@@ -95,6 +96,20 @@ function runDoctor() {
|
|
|
95
96
|
cli.warn(` ${def.name}: server URL is not HTTPS (${url})`);
|
|
96
97
|
issues++;
|
|
97
98
|
}
|
|
99
|
+
// Check auth headers
|
|
100
|
+
if (record.transport === "http") {
|
|
101
|
+
checks++;
|
|
102
|
+
const authResult = (0, auth_1.checkAuth)(entry);
|
|
103
|
+
if (authResult.status === "missing") {
|
|
104
|
+
cli.warn(` ${def.name}: no auth header found in config`);
|
|
105
|
+
issues++;
|
|
106
|
+
}
|
|
107
|
+
else if (authResult.status === "expired") {
|
|
108
|
+
cli.fail(` ${def.name}: auth token expired (${authResult.detail})`);
|
|
109
|
+
issues++;
|
|
110
|
+
}
|
|
111
|
+
// "ok" and "present" are fine — no warning needed
|
|
112
|
+
}
|
|
98
113
|
// Check rules if tracked
|
|
99
114
|
let rulesOk = true;
|
|
100
115
|
if (record.rulesVersion) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/lib/commands/doctor.ts"],"names":[],"mappings":";AAAA,6DAA6D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/lib/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/update.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,IAAI,IAAI,CAyDhC"}
|
|
@@ -38,6 +38,7 @@ exports.runUpdate = runUpdate;
|
|
|
38
38
|
const child_process_1 = require("child_process");
|
|
39
39
|
const state_1 = require("../state");
|
|
40
40
|
const fs_1 = require("../fs");
|
|
41
|
+
const migrate_1 = require("../migrate");
|
|
41
42
|
const cli = __importStar(require("../cli"));
|
|
42
43
|
function runUpdate() {
|
|
43
44
|
cli.log(`\n${cli.BOLD}equip update${cli.RESET}\n`);
|
|
@@ -61,20 +62,33 @@ function runUpdate() {
|
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
catch (err) {
|
|
64
|
-
// npm update might fail if installed via npx or locally
|
|
65
65
|
cli.warn(`npm update failed — you may need to run: npm install -g @cg3/equip`);
|
|
66
66
|
cli.log(` ${cli.DIM}${err.message?.split("\n")[0] || "unknown error"}${cli.RESET}`);
|
|
67
67
|
}
|
|
68
|
-
// Step 2:
|
|
69
|
-
cli.log(`\n${cli.BOLD}[2/2]
|
|
68
|
+
// Step 2: Migrate configs
|
|
69
|
+
cli.log(`\n${cli.BOLD}[2/2] Migrating configs${cli.RESET}`);
|
|
70
70
|
const state = (0, state_1.readState)();
|
|
71
71
|
const toolCount = Object.keys(state.tools).length;
|
|
72
72
|
if (toolCount === 0) {
|
|
73
73
|
cli.ok("No tracked tools — nothing to migrate");
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
const results = (0, migrate_1.migrateConfigs)();
|
|
77
|
+
const migrated = results.filter(r => r.action === "migrated");
|
|
78
|
+
const errors = results.filter(r => r.action === "error");
|
|
79
|
+
if (migrated.length > 0) {
|
|
80
|
+
for (const r of migrated) {
|
|
81
|
+
cli.ok(`${r.platform}/${r.toolName}: migrated (${r.detail})`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (errors.length > 0) {
|
|
85
|
+
for (const r of errors) {
|
|
86
|
+
cli.fail(`${r.platform}/${r.toolName}: ${r.detail}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (migrated.length === 0 && errors.length === 0) {
|
|
90
|
+
cli.ok(`${toolCount} tool${toolCount === 1 ? "" : "s"} — all configs current`);
|
|
91
|
+
}
|
|
78
92
|
}
|
|
79
93
|
// Mark updated
|
|
80
94
|
(0, state_1.markUpdated)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/lib/commands/update.ts"],"names":[],"mappings":";AAAA,kEAAkE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/lib/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface MigrationResult {
|
|
2
|
+
platform: string;
|
|
3
|
+
toolName: string;
|
|
4
|
+
action: "migrated" | "skipped" | "error";
|
|
5
|
+
detail?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check all tracked tools across all platforms for config entries
|
|
9
|
+
* that don't match the current platform definitions, and fix them.
|
|
10
|
+
*
|
|
11
|
+
* Returns a list of migration actions taken.
|
|
12
|
+
*/
|
|
13
|
+
export declare function migrateConfigs(): MigrationResult[];
|
|
14
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAqDlD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Config migration — detects and fixes MCP config entries that were written
|
|
3
|
+
// by older equip versions with different platform definitions.
|
|
4
|
+
//
|
|
5
|
+
// Migration scenarios:
|
|
6
|
+
// - Type field added (Roo Code v0.9.4: added "streamable-http")
|
|
7
|
+
// - Type field removed (Cursor v0.9.4: removed "streamable-http")
|
|
8
|
+
// - Type field changed (hypothetical future)
|
|
9
|
+
// - Headers wrapper changed (hypothetical future)
|
|
10
|
+
// - URL field name changed (hypothetical future)
|
|
11
|
+
//
|
|
12
|
+
// Zero dependencies.
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.migrateConfigs = migrateConfigs;
|
|
15
|
+
const platforms_1 = require("./platforms");
|
|
16
|
+
const mcp_1 = require("./mcp");
|
|
17
|
+
const state_1 = require("./state");
|
|
18
|
+
const fs_1 = require("./fs");
|
|
19
|
+
// ─── Migration ──────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Check all tracked tools across all platforms for config entries
|
|
22
|
+
* that don't match the current platform definitions, and fix them.
|
|
23
|
+
*
|
|
24
|
+
* Returns a list of migration actions taken.
|
|
25
|
+
*/
|
|
26
|
+
function migrateConfigs() {
|
|
27
|
+
const state = (0, state_1.readState)();
|
|
28
|
+
const results = [];
|
|
29
|
+
for (const [toolName, tool] of Object.entries(state.tools)) {
|
|
30
|
+
for (const [platformId, record] of Object.entries(tool.platforms)) {
|
|
31
|
+
const def = platforms_1.PLATFORM_REGISTRY.get(platformId);
|
|
32
|
+
if (!def)
|
|
33
|
+
continue;
|
|
34
|
+
const configPath = record.configPath || def.configPath();
|
|
35
|
+
// Read the existing entry
|
|
36
|
+
const existing = (0, mcp_1.readMcpEntry)(configPath, def.rootKey, toolName, def.configFormat);
|
|
37
|
+
if (!existing) {
|
|
38
|
+
results.push({ platform: platformId, toolName, action: "skipped", detail: "no MCP entry found" });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// TOML migration is not supported yet — too complex for the minimal parser
|
|
42
|
+
if (def.configFormat === "toml") {
|
|
43
|
+
results.push({ platform: platformId, toolName, action: "skipped", detail: "TOML migration not supported" });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Check if migration is needed
|
|
47
|
+
const issues = detectIssues(existing, def);
|
|
48
|
+
if (issues.length === 0) {
|
|
49
|
+
results.push({ platform: platformId, toolName, action: "skipped", detail: "config is current" });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// Rebuild the entry with current platform shape
|
|
53
|
+
try {
|
|
54
|
+
const migrated = rebuildEntry(existing, def);
|
|
55
|
+
writeEntry(configPath, def.rootKey, toolName, migrated);
|
|
56
|
+
results.push({
|
|
57
|
+
platform: platformId,
|
|
58
|
+
toolName,
|
|
59
|
+
action: "migrated",
|
|
60
|
+
detail: issues.join("; "),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
results.push({
|
|
65
|
+
platform: platformId,
|
|
66
|
+
toolName,
|
|
67
|
+
action: "error",
|
|
68
|
+
detail: err.message,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
// ─── Issue Detection ────────────────────────────────────────
|
|
76
|
+
function detectIssues(entry, def) {
|
|
77
|
+
const issues = [];
|
|
78
|
+
const shape = def.httpShape;
|
|
79
|
+
// Check type field
|
|
80
|
+
if (shape.typeField) {
|
|
81
|
+
if (entry.type !== shape.typeField) {
|
|
82
|
+
issues.push(`type field should be "${shape.typeField}", got "${entry.type ?? "missing"}"`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (entry.type !== undefined) {
|
|
87
|
+
issues.push(`type field should not be present, got "${entry.type}"`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check URL field name
|
|
91
|
+
const hasCorrectUrl = entry[shape.urlField] !== undefined;
|
|
92
|
+
if (!hasCorrectUrl) {
|
|
93
|
+
// Check if URL exists under a different field name
|
|
94
|
+
const altUrlFields = ["url", "serverUrl", "httpUrl"];
|
|
95
|
+
const foundUrl = altUrlFields.find(f => entry[f] !== undefined);
|
|
96
|
+
if (foundUrl && foundUrl !== shape.urlField) {
|
|
97
|
+
issues.push(`URL in "${foundUrl}" field, should be "${shape.urlField}"`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Check headers wrapper
|
|
101
|
+
if (shape.headersWrapper) {
|
|
102
|
+
// Should have nested headers (e.g., requestInit.headers)
|
|
103
|
+
const wrapper = entry[shape.headersWrapper];
|
|
104
|
+
if (!wrapper && entry[shape.headersField]) {
|
|
105
|
+
issues.push(`headers should be nested in "${shape.headersWrapper}", found at top level`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Should have top-level headers
|
|
110
|
+
if (entry.requestInit && !entry[shape.headersField]) {
|
|
111
|
+
issues.push(`headers nested in wrapper, should be top-level "${shape.headersField}"`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return issues;
|
|
115
|
+
}
|
|
116
|
+
// ─── Entry Rebuilding ───────────────────────────────────────
|
|
117
|
+
function rebuildEntry(existing, def) {
|
|
118
|
+
const shape = def.httpShape;
|
|
119
|
+
// Extract the server URL from whichever field it's in
|
|
120
|
+
const serverUrl = (existing[shape.urlField] || existing.url || existing.serverUrl || existing.httpUrl);
|
|
121
|
+
if (!serverUrl) {
|
|
122
|
+
throw new Error("Cannot migrate: no server URL found in existing entry");
|
|
123
|
+
}
|
|
124
|
+
// Extract auth headers from wherever they are
|
|
125
|
+
let authHeaders;
|
|
126
|
+
if (shape.headersWrapper) {
|
|
127
|
+
const wrapper = existing[shape.headersWrapper];
|
|
128
|
+
authHeaders = wrapper?.[shape.headersField];
|
|
129
|
+
}
|
|
130
|
+
if (!authHeaders) {
|
|
131
|
+
authHeaders = (existing[shape.headersField] || existing.headers || existing.http_headers);
|
|
132
|
+
}
|
|
133
|
+
// Build new entry with current platform shape
|
|
134
|
+
const result = { [shape.urlField]: serverUrl };
|
|
135
|
+
if (shape.typeField)
|
|
136
|
+
result.type = shape.typeField;
|
|
137
|
+
if (authHeaders) {
|
|
138
|
+
if (shape.headersWrapper) {
|
|
139
|
+
result[shape.headersWrapper] = { [shape.headersField]: authHeaders };
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
result[shape.headersField] = authHeaders;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Preserve any extra fields that aren't part of the shape (e.g., alwaysAllow, disabled, timeout)
|
|
146
|
+
const shapeKeys = new Set([shape.urlField, "url", "serverUrl", "httpUrl", "type", shape.headersField, "headers", "http_headers", "requestInit"]);
|
|
147
|
+
for (const [k, v] of Object.entries(existing)) {
|
|
148
|
+
if (!shapeKeys.has(k) && !(k in result)) {
|
|
149
|
+
result[k] = v;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
// ─── Write ──────────────────────────────────────────────────
|
|
155
|
+
function writeEntry(configPath, rootKey, serverName, entry) {
|
|
156
|
+
const { data, status, error } = (0, fs_1.safeReadJsonSync)(configPath);
|
|
157
|
+
if (status === "corrupt") {
|
|
158
|
+
throw new Error(`Config file corrupt: ${error}`);
|
|
159
|
+
}
|
|
160
|
+
const config = data || {};
|
|
161
|
+
if (!config[rootKey])
|
|
162
|
+
config[rootKey] = {};
|
|
163
|
+
config[rootKey][serverName] = entry;
|
|
164
|
+
(0, fs_1.atomicWriteFileSync)(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"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"}
|