@tropass/mcp-installer 0.1.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.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../src/cli.js";
3
+ main().catch((error) => {
4
+ const detail = error instanceof Error ? error.message : String(error);
5
+ process.stderr.write(`[tropass-mcp-install] fatal error: ${detail}\n`);
6
+ process.exit(1);
7
+ });
8
+ //# sourceMappingURL=tropass-mcp-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tropass-mcp-install.js","sourceRoot":"","sources":["../../bin/tropass-mcp-install.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,MAAM,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ # Tropass MCP Instructions
2
+
3
+ Use the Tropass MCP server to call ML models.
4
+
5
+ ## Tool discovery
6
+
7
+ - Call `tools/list` only on first Tropass use in the session, when `initialize.result.capabilities.tools.listChanged` is `true`, after token/environment changes, or after an unknown tool error.
8
+ - Do not call `tools/list` before every model call.
9
+ - Do not rely on memorized tool names. Tool names are generated by the gateway.
10
+
11
+ ## Tool selection
12
+
13
+ - Select models by `title`, `description`, and `inputSchema`.
14
+ - If several tools match equally, ask the user which model to use.
15
+ - If the requested model is missing, refresh the tool list once before concluding it is unavailable.
16
+
17
+ ## Arguments
18
+
19
+ - Validate arguments against `inputSchema`.
20
+ - Send only properties defined in the schema.
21
+ - Required fields must be present.
22
+ - Respect `enum`, `minimum`, and `maximum`.
23
+ - For file-like inputs, pass arrays of existing Tropass/S3 file URLs.
24
+ - Do not pass local file paths or arbitrary external URLs as file inputs.
25
+
26
+ ## Results
27
+
28
+ - Prefer `structuredContent` as the source of truth.
29
+ - Treat text `content` as serialized fallback JSON.
30
+ - If `isError` is true, surface the error directly.
31
+ - Do not retry rate-limit errors in a loop.
@@ -0,0 +1 @@
1
+ export declare function main(): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import process from "node:process";
2
+ import { Command, CommanderError } from "commander";
3
+ import { runInstall } from "./installer.js";
4
+ import { logError } from "./logging.js";
5
+ export async function main() {
6
+ const args = process.argv.slice(2);
7
+ await runInstallCommand(args[0] === "install" ? args.slice(1) : args, "tropass-mcp-install");
8
+ }
9
+ async function runInstallCommand(args, commandName) {
10
+ const command = createInstallCommand(commandName).exitOverride();
11
+ try {
12
+ await command.parseAsync(args, { from: "user" });
13
+ }
14
+ catch (error) {
15
+ if (error instanceof CommanderError && error.exitCode === 0) {
16
+ return;
17
+ }
18
+ logError("install failed", error);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ function createInstallCommand(commandName) {
23
+ return new Command()
24
+ .name(commandName)
25
+ .description("Install direct remote Tropass MCP config and agent instructions.")
26
+ .argument("[client]", "MCP client: codex, cursor, vscode, claude, or generic")
27
+ .option("--config <path>", "explicit path to the MCP config file")
28
+ .option("--url <url>", "Tropass MCP endpoint URL")
29
+ .option("--token <token>", "Tropass API token")
30
+ .option("--scope <scope>", "install scope: project or global")
31
+ .option("--global", "install into global user config")
32
+ .option("--local", "install into project/workspace config")
33
+ .option("--project <dir>", "project/workspace directory for project-local configs")
34
+ .option("-y, --yes", "accept defaults for non-secret prompts")
35
+ .action(async (client, options) => {
36
+ const rawOptions = { ...options };
37
+ if (client !== undefined) {
38
+ rawOptions.client = client;
39
+ }
40
+ await runInstall(rawOptions);
41
+ });
42
+ }
43
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAc,EAAE,WAAmB;IAClE,MAAM,OAAO,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,YAAY,EAAE,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAmB;IAC/C,OAAO,IAAI,OAAO,EAAE;SACjB,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,QAAQ,CAAC,UAAU,EAAE,uDAAuD,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;SAC7D,MAAM,CAAC,UAAU,EAAE,iCAAiC,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,uDAAuD,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAA0B,EAAE,EAAE;QACvE,MAAM,UAAU,GAAsB,EAAE,GAAG,OAAO,EAAE,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,CAAC;QACD,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { InstallClient } from "./types.js";
2
+ export declare const DEFAULT_MCP_URL = "https://xn--80aqu.xn--80a1adciab.xn--p1ai/mcp";
3
+ export declare const DEFAULT_TOKEN_HEADER = "X-API-TOKEN";
4
+ export declare const SUPPORTED_INSTALL_CLIENTS: Set<InstallClient>;
@@ -0,0 +1,10 @@
1
+ export const DEFAULT_MCP_URL = "https://xn--80aqu.xn--80a1adciab.xn--p1ai/mcp";
2
+ export const DEFAULT_TOKEN_HEADER = "X-API-TOKEN";
3
+ export const SUPPORTED_INSTALL_CLIENTS = new Set([
4
+ "codex",
5
+ "cursor",
6
+ "vscode",
7
+ "claude",
8
+ "generic",
9
+ ]);
10
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,+CAA+C,CAAC;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAgB;IAC9D,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;CACV,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallResult, RawInstallOptions } from "./types.js";
2
+ export declare function runInstall(rawOptions?: RawInstallOptions): Promise<void>;
3
+ export declare function installTropassMcp(rawOptions: RawInstallOptions): InstallResult;
@@ -0,0 +1,388 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createInterface as createPromptInterface } from "node:readline/promises";
4
+ import process from "node:process";
5
+ import { DEFAULT_MCP_URL, DEFAULT_TOKEN_HEADER, SUPPORTED_INSTALL_CLIENTS } from "./constants.js";
6
+ import { buildInstructionContent, MANAGED_INSTRUCTIONS_BEGIN, MANAGED_INSTRUCTIONS_END } from "./instructions.js";
7
+ import { expandHome, resolveCodexConfigPath, resolveCodexSkillsPath, resolveClaudeDesktopConfigPath, resolveCursorConfigPath, resolveCursorRulesPath, resolveGenericConfigPath, resolveGenericInstructionPath, resolveVSCodeUserConfigPath, resolveVSCodeUserInstructionPath } from "./path-utils.js";
8
+ const MANAGED_CODEX_CONFIG_BEGIN = "# BEGIN TROPASS MCP CONFIG";
9
+ const MANAGED_CODEX_CONFIG_END = "# END TROPASS MCP CONFIG";
10
+ export async function runInstall(rawOptions = {}) {
11
+ const options = normalizeInstallOptions(rawOptions);
12
+ const client = options.client !== undefined ? validateInstallClient(options.client) : await promptForClient();
13
+ const scope = options.scope !== undefined
14
+ ? validateInstallScope(options.scope)
15
+ : options.yes
16
+ ? resolveDefaultScope(client)
17
+ : await promptForScope(client);
18
+ const mcpUrl = options.yes ? options.mcpUrl : await promptForText("Tropass MCP URL", options.mcpUrl);
19
+ const apiToken = options.apiToken ?? await promptForSecret("Tropass API token");
20
+ const result = installTropassMcp({
21
+ ...options,
22
+ client,
23
+ scope,
24
+ mcpUrl,
25
+ apiToken
26
+ });
27
+ process.stderr.write(`Installed Tropass MCP for ${result.client}.\n`);
28
+ process.stderr.write(`Scope: ${result.scope}\n`);
29
+ process.stderr.write(`Config file: ${result.configPath}\n`);
30
+ process.stderr.write(`Instructions file: ${result.instructionPath}\n`);
31
+ process.stderr.write("Restart or reload your MCP client to pick up the new server.\n");
32
+ }
33
+ export function installTropassMcp(rawOptions) {
34
+ const options = validateInstallOptions(normalizeInstallOptions(rawOptions));
35
+ const configPath = resolveConfigPath(options.client, options);
36
+ installServerConfig(options.client, configPath, options.mcpUrl, options.apiToken);
37
+ const instructionPath = resolveInstructionPath(options.client, options, configPath);
38
+ installInstructions(options.client, options.scope, instructionPath);
39
+ return {
40
+ client: options.client,
41
+ scope: options.scope,
42
+ configPath,
43
+ instructionPath
44
+ };
45
+ }
46
+ function normalizeInstallOptions(options) {
47
+ const configPath = options.config ?? options.configPath;
48
+ const apiToken = options.token ?? options.apiToken ?? process.env.TROPASS_API_TOKEN;
49
+ const scope = normalizeScopeOption(options);
50
+ const normalizedOptions = {
51
+ mcpUrl: options.url ?? options.mcpUrl ?? process.env.TROPASS_MCP_URL ?? DEFAULT_MCP_URL,
52
+ projectDir: options.project ?? options.projectDir ?? process.cwd(),
53
+ yes: Boolean(options.yes)
54
+ };
55
+ if (options.client !== undefined) {
56
+ normalizedOptions.client = options.client;
57
+ }
58
+ if (configPath !== undefined) {
59
+ normalizedOptions.configPath = configPath;
60
+ }
61
+ if (apiToken !== undefined) {
62
+ normalizedOptions.apiToken = apiToken;
63
+ }
64
+ if (scope !== undefined) {
65
+ normalizedOptions.scope = scope;
66
+ }
67
+ return normalizedOptions;
68
+ }
69
+ function validateInstallOptions(options) {
70
+ const client = validateInstallClient(options.client);
71
+ if (!options.apiToken) {
72
+ throw new Error("Tropass API token is required.");
73
+ }
74
+ if (!options.mcpUrl) {
75
+ throw new Error("Tropass MCP URL is required.");
76
+ }
77
+ const scope = validateInstallScope(options.scope ?? resolveDefaultScope(client));
78
+ return {
79
+ ...options,
80
+ client,
81
+ apiToken: options.apiToken,
82
+ scope
83
+ };
84
+ }
85
+ function validateInstallClient(value) {
86
+ if (isInstallClient(value)) {
87
+ return value;
88
+ }
89
+ throw new Error(`Unsupported client '${value}'. Use one of: ${[...SUPPORTED_INSTALL_CLIENTS].join(", ")}.`);
90
+ }
91
+ function normalizeScopeOption(options) {
92
+ if (options.global && options.local) {
93
+ throw new Error("Use only one install scope: --global or --local.");
94
+ }
95
+ if (options.global) {
96
+ return "global";
97
+ }
98
+ if (options.local) {
99
+ return "project";
100
+ }
101
+ return options.scope;
102
+ }
103
+ function resolveDefaultScope(client) {
104
+ return client === "claude" ? "global" : "project";
105
+ }
106
+ function validateInstallScope(value) {
107
+ if (value === "project" || value === "global") {
108
+ return value;
109
+ }
110
+ if (value === "local") {
111
+ return "project";
112
+ }
113
+ throw new Error(`Unsupported install scope '${value}'. Use one of: project, global.`);
114
+ }
115
+ function isInstallClient(value) {
116
+ return typeof value === "string" && SUPPORTED_INSTALL_CLIENTS.has(value);
117
+ }
118
+ function resolveConfigPath(client, options) {
119
+ if (options.configPath) {
120
+ return path.resolve(expandHome(options.configPath));
121
+ }
122
+ const projectDir = path.resolve(expandHome(options.projectDir));
123
+ if (client === "codex") {
124
+ return options.scope === "global" ? resolveCodexConfigPath() : path.join(projectDir, ".codex", "config.toml");
125
+ }
126
+ if (client === "cursor") {
127
+ return options.scope === "global" ? resolveCursorConfigPath() : path.join(projectDir, ".cursor", "mcp.json");
128
+ }
129
+ if (client === "vscode") {
130
+ return options.scope === "global" ? resolveVSCodeUserConfigPath() : path.join(projectDir, ".vscode", "mcp.json");
131
+ }
132
+ if (client === "claude") {
133
+ return options.scope === "global" ? resolveClaudeDesktopConfigPath() : path.join(projectDir, ".mcp.json");
134
+ }
135
+ if (client === "generic") {
136
+ return options.scope === "global" ? resolveGenericConfigPath() : path.join(projectDir, "mcp.json");
137
+ }
138
+ return resolveClaudeDesktopConfigPath();
139
+ }
140
+ function resolveInstructionPath(client, options, configPath) {
141
+ const projectDir = path.resolve(expandHome(options.projectDir));
142
+ if (client === "codex") {
143
+ const skillsPath = options.scope === "global" ? resolveCodexSkillsPath() : path.join(projectDir, ".codex", "skills");
144
+ return path.join(skillsPath, "tropass-gateway", "SKILL.md");
145
+ }
146
+ if (client === "cursor") {
147
+ const rulesPath = options.scope === "global" ? resolveCursorRulesPath() : path.join(projectDir, ".cursor", "rules");
148
+ return path.join(rulesPath, "tropass-mcp.mdc");
149
+ }
150
+ if (client === "vscode") {
151
+ return options.scope === "global"
152
+ ? resolveVSCodeUserInstructionPath()
153
+ : path.join(projectDir, ".github", "copilot-instructions.md");
154
+ }
155
+ if (client === "claude" && options.scope === "project") {
156
+ return path.join(projectDir, "CLAUDE.md");
157
+ }
158
+ if (client === "generic") {
159
+ return options.scope === "global" ? resolveGenericInstructionPath() : path.join(projectDir, "AGENTS.md");
160
+ }
161
+ return path.join(path.dirname(configPath), "tropass-mcp-instructions.md");
162
+ }
163
+ function readJsonFile(filePath) {
164
+ if (!fs.existsSync(filePath)) {
165
+ return {};
166
+ }
167
+ const payload = fs.readFileSync(filePath, "utf8").trim();
168
+ if (!payload) {
169
+ return {};
170
+ }
171
+ const parsedPayload = JSON.parse(payload);
172
+ if (!isJsonObject(parsedPayload)) {
173
+ throw new Error(`${filePath} must contain a JSON object.`);
174
+ }
175
+ return parsedPayload;
176
+ }
177
+ function buildServerConfig(mcpUrl, apiToken) {
178
+ return {
179
+ url: mcpUrl,
180
+ headers: {
181
+ [DEFAULT_TOKEN_HEADER]: apiToken
182
+ }
183
+ };
184
+ }
185
+ function installServerConfig(client, configPath, mcpUrl, apiToken) {
186
+ if (client === "codex") {
187
+ installCodexServerConfig(configPath, mcpUrl, apiToken);
188
+ return;
189
+ }
190
+ const payload = readJsonFile(configPath);
191
+ const serverConfig = buildServerConfig(mcpUrl, apiToken);
192
+ if (client === "vscode") {
193
+ payload.servers = {
194
+ ...readObjectProperty(payload, "servers"),
195
+ tropass: {
196
+ type: "http",
197
+ ...serverConfig
198
+ }
199
+ };
200
+ }
201
+ else {
202
+ payload.mcpServers = {
203
+ ...readObjectProperty(payload, "mcpServers"),
204
+ tropass: serverConfig
205
+ };
206
+ }
207
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
208
+ fs.writeFileSync(configPath, `${JSON.stringify(payload, null, 2)}\n`);
209
+ }
210
+ function installCodexServerConfig(configPath, mcpUrl, apiToken) {
211
+ const managedBlock = [
212
+ MANAGED_CODEX_CONFIG_BEGIN,
213
+ "[mcp_servers.tropass]",
214
+ `url = ${stringifyTomlValue(mcpUrl)}`,
215
+ `headers = { ${stringifyTomlKey(DEFAULT_TOKEN_HEADER)} = ${stringifyTomlValue(apiToken)} }`,
216
+ MANAGED_CODEX_CONFIG_END
217
+ ].join("\n");
218
+ if (!fs.existsSync(configPath)) {
219
+ writeTextFile(configPath, managedBlock);
220
+ return;
221
+ }
222
+ const existingContent = fs.readFileSync(configPath, "utf8");
223
+ const startIndex = existingContent.indexOf(MANAGED_CODEX_CONFIG_BEGIN);
224
+ const endIndex = existingContent.indexOf(MANAGED_CODEX_CONFIG_END);
225
+ if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
226
+ const before = existingContent.slice(0, startIndex).trimEnd();
227
+ const after = existingContent.slice(endIndex + MANAGED_CODEX_CONFIG_END.length).trimStart();
228
+ writeTextFile(configPath, [before, managedBlock, after].filter(Boolean).join("\n\n"));
229
+ return;
230
+ }
231
+ writeTextFile(configPath, `${existingContent.trimEnd()}\n\n${managedBlock}\n`);
232
+ }
233
+ function stringifyTomlKey(value) {
234
+ return JSON.stringify(value);
235
+ }
236
+ function stringifyTomlValue(value) {
237
+ return JSON.stringify(value);
238
+ }
239
+ function installInstructions(client, scope, instructionPath) {
240
+ const instructionContent = buildInstructionContent(client);
241
+ if (client === "vscode" || client === "generic" || (client === "claude" && scope === "project")) {
242
+ upsertManagedInstructionBlock(instructionPath, instructionContent);
243
+ return;
244
+ }
245
+ writeTextFile(instructionPath, instructionContent);
246
+ }
247
+ function upsertManagedInstructionBlock(filePath, content) {
248
+ const managedBlock = `${MANAGED_INSTRUCTIONS_BEGIN}\n${content.trim()}\n${MANAGED_INSTRUCTIONS_END}`;
249
+ if (!fs.existsSync(filePath)) {
250
+ writeTextFile(filePath, managedBlock);
251
+ return;
252
+ }
253
+ const existingContent = fs.readFileSync(filePath, "utf8");
254
+ const startIndex = existingContent.indexOf(MANAGED_INSTRUCTIONS_BEGIN);
255
+ const endIndex = existingContent.indexOf(MANAGED_INSTRUCTIONS_END);
256
+ if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
257
+ const before = existingContent.slice(0, startIndex).trimEnd();
258
+ const after = existingContent.slice(endIndex + MANAGED_INSTRUCTIONS_END.length).trimStart();
259
+ writeTextFile(filePath, [before, managedBlock, after].filter(Boolean).join("\n\n"));
260
+ return;
261
+ }
262
+ writeTextFile(filePath, `${existingContent.trimEnd()}\n\n${managedBlock}\n`);
263
+ }
264
+ function writeTextFile(filePath, content) {
265
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
266
+ fs.writeFileSync(filePath, content.endsWith("\n") ? content : `${content}\n`);
267
+ }
268
+ function readObjectProperty(payload, key) {
269
+ const value = payload[key];
270
+ if (value === undefined) {
271
+ return {};
272
+ }
273
+ if (!isJsonObject(value)) {
274
+ throw new Error(`Config field '${key}' must be a JSON object.`);
275
+ }
276
+ return value;
277
+ }
278
+ function isJsonObject(value) {
279
+ return typeof value === "object" && value !== null && !Array.isArray(value);
280
+ }
281
+ async function promptForClient() {
282
+ const rl = createPromptInterface({
283
+ input: process.stdin,
284
+ output: process.stderr
285
+ });
286
+ try {
287
+ process.stderr.write("Choose MCP client:\n");
288
+ process.stderr.write(" 1. codex\n");
289
+ process.stderr.write(" 2. cursor\n");
290
+ process.stderr.write(" 3. vscode\n");
291
+ process.stderr.write(" 4. claude\n");
292
+ process.stderr.write(" 5. generic\n");
293
+ const answer = (await rl.question("Client [codex]: ")).trim();
294
+ if (!answer || answer === "1") {
295
+ return "codex";
296
+ }
297
+ if (answer === "2") {
298
+ return "cursor";
299
+ }
300
+ if (answer === "3") {
301
+ return "vscode";
302
+ }
303
+ if (answer === "4") {
304
+ return "claude";
305
+ }
306
+ if (answer === "5") {
307
+ return "generic";
308
+ }
309
+ if (isInstallClient(answer)) {
310
+ return answer;
311
+ }
312
+ throw new Error(`Unsupported client '${answer}'. Use one of: ${[...SUPPORTED_INSTALL_CLIENTS].join(", ")}.`);
313
+ }
314
+ finally {
315
+ rl.close();
316
+ }
317
+ }
318
+ async function promptForScope(client) {
319
+ const defaultScope = resolveDefaultScope(client);
320
+ const alternativeScope = defaultScope === "project" ? "global" : "project";
321
+ const rl = createPromptInterface({
322
+ input: process.stdin,
323
+ output: process.stderr
324
+ });
325
+ try {
326
+ process.stderr.write("Choose install scope:\n");
327
+ process.stderr.write(` 1. ${defaultScope}\n`);
328
+ process.stderr.write(` 2. ${alternativeScope}\n`);
329
+ const answer = (await rl.question(`Scope [${defaultScope}]: `)).trim();
330
+ if (!answer || answer === "1") {
331
+ return defaultScope;
332
+ }
333
+ if (answer === "2") {
334
+ return alternativeScope;
335
+ }
336
+ return validateInstallScope(answer);
337
+ }
338
+ finally {
339
+ rl.close();
340
+ }
341
+ }
342
+ async function promptForText(question, defaultValue) {
343
+ const rl = createPromptInterface({
344
+ input: process.stdin,
345
+ output: process.stderr
346
+ });
347
+ try {
348
+ const suffix = defaultValue ? ` [${defaultValue}]` : "";
349
+ const answer = (await rl.question(`${question}${suffix}: `)).trim();
350
+ return answer || defaultValue || "";
351
+ }
352
+ finally {
353
+ rl.close();
354
+ }
355
+ }
356
+ async function promptForSecret(question) {
357
+ if (!process.stdin.isTTY) {
358
+ return promptForText(question);
359
+ }
360
+ process.stderr.write(`${question}: `);
361
+ process.stdin.setRawMode(true);
362
+ process.stdin.resume();
363
+ process.stdin.setEncoding("utf8");
364
+ return await new Promise((resolve) => {
365
+ let value = "";
366
+ const onData = (char) => {
367
+ if (char === "\u0003") {
368
+ process.stderr.write("\n");
369
+ process.exit(130);
370
+ }
371
+ if (char === "\r" || char === "\n") {
372
+ process.stdin.setRawMode(false);
373
+ process.stdin.pause();
374
+ process.stdin.off("data", onData);
375
+ process.stderr.write("\n");
376
+ resolve(value);
377
+ return;
378
+ }
379
+ if (char === "\u007f" || char === "\b") {
380
+ value = value.slice(0, -1);
381
+ return;
382
+ }
383
+ value += char;
384
+ };
385
+ process.stdin.on("data", onData);
386
+ });
387
+ }
388
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,gCAAgC,EACjC,MAAM,iBAAiB,CAAC;AAgBzB,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AAChE,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAgC,EAAE;IACjE,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC;IAC9G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS;QACvC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;QACrC,CAAC,CAAC,OAAO,CAAC,GAAG;YACX,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC;YAC7B,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAEhF,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,GAAG,OAAO;QACV,MAAM;QACN,KAAK;QACL,MAAM;QACN,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA6B;IAC7D,MAAM,OAAO,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;IAE5E,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElF,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpF,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAEpE,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA0B;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACpF,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,iBAAiB,GAAmB;QACxC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,eAAe;QACvF,UAAU,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE;QAClE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;KAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,iBAAiB,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,iBAAiB,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5C,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACrD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,OAAO;QACL,GAAG,OAAO;QACV,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,kBAAkB,CAAC,GAAG,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA0B;IACtD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB;IAChD,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,iCAAiC,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAsB,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB,EAAE,OAAgC;IAChF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnH,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,8BAA8B,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAqB,EAAE,OAAgC,EAAE,UAAkB;IACzG,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrH,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACpH,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;YAC/B,CAAC,CAAC,gCAAgC,EAAE;YACpC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,6BAA6B,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,QAAgB;IACzD,OAAO;QACL,GAAG,EAAE,MAAM;QACX,OAAO,EAAE;YACP,CAAC,oBAAoB,CAAC,EAAE,QAAQ;SACjC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB,EAAE,UAAkB,EAAE,MAAc,EAAE,QAAgB;IACtG,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEzD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC;YACzC,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,GAAG,YAAY;aAChB;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,UAAU,GAAG;YACnB,GAAG,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC;YAC5C,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB,EAAE,MAAc,EAAE,QAAgB;IACpF,MAAM,YAAY,GAAG;QACnB,0BAA0B;QAC1B,uBAAuB;QACvB,SAAS,kBAAkB,CAAC,MAAM,CAAC,EAAE;QACrC,eAAe,gBAAgB,CAAC,oBAAoB,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,IAAI;QAC3F,wBAAwB;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEnE,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5F,aAAa,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,aAAa,CAAC,UAAU,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,YAAY,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB,EAAE,KAAmB,EAAE,eAAuB;IAC9F,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;QAChG,6BAA6B,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,aAAa,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,6BAA6B,CAAC,QAAgB,EAAE,OAAe;IACtE,MAAM,YAAY,GAAG,GAAG,0BAA0B,KAAK,OAAO,CAAC,IAAI,EAAE,KAAK,wBAAwB,EAAE,CAAC;IAErG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEnE,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5F,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,YAAY,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,OAAe;IACtD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAmB,EAAE,GAAW;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,0BAA0B,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,kBAAkB,CAAC,GAAG,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/G,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAqB;IACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,YAAY,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,gBAAgB,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,YAAqB;IAClE,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,OAAO,MAAM,IAAI,YAAY,IAAI,EAAE,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;YACpC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { InstallClient } from "./types.js";
2
+ export declare const MANAGED_INSTRUCTIONS_BEGIN = "<!-- BEGIN TROPASS MCP INSTRUCTIONS -->";
3
+ export declare const MANAGED_INSTRUCTIONS_END = "<!-- END TROPASS MCP INSTRUCTIONS -->";
4
+ export declare const TROPASS_MCP_INSTRUCTIONS: string;
5
+ export declare function buildInstructionContent(client: InstallClient): string;
@@ -0,0 +1,48 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export const MANAGED_INSTRUCTIONS_BEGIN = "<!-- BEGIN TROPASS MCP INSTRUCTIONS -->";
5
+ export const MANAGED_INSTRUCTIONS_END = "<!-- END TROPASS MCP INSTRUCTIONS -->";
6
+ const INSTRUCTION_FILE_NAME = "tropass-mcp.md";
7
+ const MODULE_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));
8
+ const INSTRUCTION_TEMPLATE_PATHS = [
9
+ path.resolve(MODULE_DIRECTORY, "../instructions", INSTRUCTION_FILE_NAME),
10
+ path.resolve(MODULE_DIRECTORY, "../../instructions", INSTRUCTION_FILE_NAME)
11
+ ];
12
+ export const TROPASS_MCP_INSTRUCTIONS = readInstructionTemplate();
13
+ const CODEX_SKILL_BODY = TROPASS_MCP_INSTRUCTIONS.replace("# Tropass MCP Instructions\n\n", "");
14
+ function readInstructionTemplate() {
15
+ for (const instructionTemplatePath of INSTRUCTION_TEMPLATE_PATHS) {
16
+ if (fs.existsSync(instructionTemplatePath)) {
17
+ return fs.readFileSync(instructionTemplatePath, "utf8").trimEnd();
18
+ }
19
+ }
20
+ throw new Error(`Tropass MCP instructions file not found: ${INSTRUCTION_TEMPLATE_PATHS.join(", ")}`);
21
+ }
22
+ export function buildInstructionContent(client) {
23
+ if (client === "codex") {
24
+ return `---
25
+ name: tropass-gateway
26
+ description: Use when calling Tropass ML models through the Tropass MCP server, selecting models, preparing model inputs, handling file URL arguments, or interpreting model results.
27
+ ---
28
+
29
+ # Tropass Gateway MCP
30
+
31
+ ${CODEX_SKILL_BODY}`;
32
+ }
33
+ if (client === "cursor") {
34
+ return `---
35
+ description: Use Tropass MCP for ML model calls
36
+ alwaysApply: true
37
+ ---
38
+
39
+ ${TROPASS_MCP_INSTRUCTIONS}`;
40
+ }
41
+ if (client === "claude") {
42
+ return `${TROPASS_MCP_INSTRUCTIONS}
43
+ Add these instructions to your Claude project or custom instructions together with the Tropass MCP server config.
44
+ `;
45
+ }
46
+ return TROPASS_MCP_INSTRUCTIONS;
47
+ }
48
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,CAAC,MAAM,0BAA0B,GACrC,yCAAyC,CAAC;AAC5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AAEhF,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,MAAM,0BAA0B,GAAG;IACjC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;IACxE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC;CAC5E,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,uBAAuB,EAAE,CAAC;AAClE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;AAEhG,SAAS,uBAAuB;IAC9B,KAAK,MAAM,uBAAuB,IAAI,0BAA0B,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAqB;IAC3D,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO;;;;;;;EAOT,gBAAgB,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO;;;;;EAKT,wBAAwB,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,GAAG,wBAAwB;;CAErC,CAAC;IACA,CAAC;IACD,OAAO,wBAAwB,CAAC;AAClC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function logError(message: string, error: unknown): void;
@@ -0,0 +1,5 @@
1
+ export function logError(message, error) {
2
+ const detail = error instanceof Error ? error.message : String(error);
3
+ process.stderr.write(`[tropass-mcp-install] ${message}: ${detail}\n`);
4
+ }
5
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAc;IACtD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function expandHome(filePath: string): string;
2
+ export declare function resolveClaudeDesktopConfigPath(): string;
3
+ export declare function resolveCodexConfigPath(): string;
4
+ export declare function resolveCodexSkillsPath(): string;
5
+ export declare function resolveCursorConfigPath(): string;
6
+ export declare function resolveCursorRulesPath(): string;
7
+ export declare function resolveGenericConfigPath(): string;
8
+ export declare function resolveGenericInstructionPath(): string;
9
+ export declare function resolveVSCodeUserConfigPath(): string;
10
+ export declare function resolveVSCodeUserInstructionPath(): string;
@@ -0,0 +1,59 @@
1
+ import path from "node:path";
2
+ import process from "node:process";
3
+ export function expandHome(filePath) {
4
+ if (filePath === "~") {
5
+ return process.env.HOME || process.env.USERPROFILE || filePath;
6
+ }
7
+ if (filePath.startsWith("~/")) {
8
+ const home = process.env.HOME || process.env.USERPROFILE;
9
+ return home ? path.join(home, filePath.slice(2)) : filePath;
10
+ }
11
+ return filePath;
12
+ }
13
+ export function resolveClaudeDesktopConfigPath() {
14
+ if (process.platform === "darwin") {
15
+ return path.join(process.env.HOME || "", "Library", "Application Support", "Claude", "claude_desktop_config.json");
16
+ }
17
+ if (process.platform === "win32") {
18
+ const appData = process.env.APPDATA || path.join(process.env.USERPROFILE || "", "AppData", "Roaming");
19
+ return path.join(appData, "Claude", "claude_desktop_config.json");
20
+ }
21
+ return path.join(process.env.HOME || "", ".config", "Claude", "claude_desktop_config.json");
22
+ }
23
+ export function resolveCodexConfigPath() {
24
+ return path.join(process.env.HOME || process.env.USERPROFILE || "", ".codex", "config.toml");
25
+ }
26
+ export function resolveCodexSkillsPath() {
27
+ return path.join(process.env.HOME || process.env.USERPROFILE || "", ".codex", "skills");
28
+ }
29
+ export function resolveCursorConfigPath() {
30
+ return path.join(process.env.HOME || process.env.USERPROFILE || "", ".cursor", "mcp.json");
31
+ }
32
+ export function resolveCursorRulesPath() {
33
+ return path.join(process.env.HOME || process.env.USERPROFILE || "", ".cursor", "rules");
34
+ }
35
+ export function resolveGenericConfigPath() {
36
+ const home = process.env.HOME || process.env.USERPROFILE || "";
37
+ if (process.platform === "win32") {
38
+ const appData = process.env.APPDATA || path.join(home, "AppData", "Roaming");
39
+ return path.join(appData, "tropass-agent-kit", "mcp.json");
40
+ }
41
+ return path.join(home, ".config", "tropass-agent-kit", "mcp.json");
42
+ }
43
+ export function resolveGenericInstructionPath() {
44
+ return path.join(path.dirname(resolveGenericConfigPath()), "AGENTS.md");
45
+ }
46
+ export function resolveVSCodeUserConfigPath() {
47
+ if (process.platform === "darwin") {
48
+ return path.join(process.env.HOME || "", "Library", "Application Support", "Code", "User", "mcp.json");
49
+ }
50
+ if (process.platform === "win32") {
51
+ const appData = process.env.APPDATA || path.join(process.env.USERPROFILE || "", "AppData", "Roaming");
52
+ return path.join(appData, "Code", "User", "mcp.json");
53
+ }
54
+ return path.join(process.env.HOME || "", ".config", "Code", "User", "mcp.json");
55
+ }
56
+ export function resolveVSCodeUserInstructionPath() {
57
+ return path.join(path.dirname(resolveVSCodeUserConfigPath()), "copilot-instructions.md");
58
+ }
59
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/path-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type InstallClient = "codex" | "cursor" | "vscode" | "claude" | "generic";
2
+ export type InstallScope = "project" | "global";
3
+ export type RawInstallOptions = {
4
+ client?: string;
5
+ config?: string;
6
+ configPath?: string;
7
+ url?: string;
8
+ mcpUrl?: string;
9
+ token?: string;
10
+ apiToken?: string;
11
+ project?: string;
12
+ projectDir?: string;
13
+ scope?: string;
14
+ global?: boolean;
15
+ local?: boolean;
16
+ yes?: boolean;
17
+ };
18
+ export type InstallOptions = {
19
+ client?: string;
20
+ configPath?: string;
21
+ mcpUrl: string;
22
+ apiToken?: string;
23
+ projectDir: string;
24
+ scope?: string;
25
+ yes: boolean;
26
+ };
27
+ export type ValidatedInstallOptions = Omit<InstallOptions, "client" | "apiToken" | "scope"> & {
28
+ client: InstallClient;
29
+ apiToken: string;
30
+ scope: InstallScope;
31
+ };
32
+ export type InstallResult = {
33
+ client: InstallClient;
34
+ scope: InstallScope;
35
+ configPath: string;
36
+ instructionPath: string;
37
+ };
38
+ export type JsonObject = Record<string, unknown>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@tropass/mcp-installer",
3
+ "version": "0.1.0",
4
+ "description": "Installer for configuring agents to use the Tropass remote MCP gateway.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "tropass-mcp-install": "./dist/bin/tropass-mcp-install.js"
9
+ },
10
+ "dependencies": {
11
+ "commander": "^14.0.2"
12
+ },
13
+ "devDependencies": {
14
+ "@types/node": "^24.10.1",
15
+ "typescript": "^5.9.3"
16
+ },
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "files": [
21
+ "dist/"
22
+ ],
23
+ "scripts": {
24
+ "build": "node -e \"const fs = require('node:fs'); fs.rmSync('dist', { recursive: true, force: true }); fs.mkdirSync('dist/instructions', { recursive: true }); fs.copyFileSync('instructions/tropass-mcp.md', 'dist/instructions/tropass-mcp.md')\" && tsc -p tsconfig.build.json",
25
+ "typecheck": "tsc -p tsconfig.json --noEmit",
26
+ "lint": "eslint bin src test --ext .ts",
27
+ "test": "vitest run",
28
+ "check": "npm run typecheck && npm run lint && npm run test && npm run build"
29
+ }
30
+ }