@runcofactor/cli 0.10.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.
Files changed (150) hide show
  1. package/README.md +125 -0
  2. package/dist/api-catalog-GFGCLVS4.js +401 -0
  3. package/dist/api-catalog-GFGCLVS4.js.map +1 -0
  4. package/dist/attachment-SJC7D7FY.js +276 -0
  5. package/dist/attachment-SJC7D7FY.js.map +1 -0
  6. package/dist/auth-EN6NQCJY.js +31 -0
  7. package/dist/auth-EN6NQCJY.js.map +1 -0
  8. package/dist/bin.js +7 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/chunk-3CZU7XCS.js +272 -0
  11. package/dist/chunk-3CZU7XCS.js.map +1 -0
  12. package/dist/chunk-4NRDONSC.js +1048 -0
  13. package/dist/chunk-4NRDONSC.js.map +1 -0
  14. package/dist/chunk-4PNOV7OV.js +51980 -0
  15. package/dist/chunk-4PNOV7OV.js.map +1 -0
  16. package/dist/chunk-52IO7ACJ.js +2941 -0
  17. package/dist/chunk-52IO7ACJ.js.map +1 -0
  18. package/dist/chunk-6LEZCKKV.js +663 -0
  19. package/dist/chunk-6LEZCKKV.js.map +1 -0
  20. package/dist/chunk-A4OFTUVV.js +170 -0
  21. package/dist/chunk-A4OFTUVV.js.map +1 -0
  22. package/dist/chunk-B2VISN2V.js +2459 -0
  23. package/dist/chunk-B2VISN2V.js.map +1 -0
  24. package/dist/chunk-CLAWT7BJ.js +271 -0
  25. package/dist/chunk-CLAWT7BJ.js.map +1 -0
  26. package/dist/chunk-GKY2KXO5.js +281 -0
  27. package/dist/chunk-GKY2KXO5.js.map +1 -0
  28. package/dist/chunk-I4QLI3JO.js +413 -0
  29. package/dist/chunk-I4QLI3JO.js.map +1 -0
  30. package/dist/chunk-IMPZAX6L.js +180 -0
  31. package/dist/chunk-IMPZAX6L.js.map +1 -0
  32. package/dist/chunk-J6SH7GQT.js +241 -0
  33. package/dist/chunk-J6SH7GQT.js.map +1 -0
  34. package/dist/chunk-JDBCZ3Z2.js +298 -0
  35. package/dist/chunk-JDBCZ3Z2.js.map +1 -0
  36. package/dist/chunk-JICSYFRJ.js +46 -0
  37. package/dist/chunk-JICSYFRJ.js.map +1 -0
  38. package/dist/chunk-JWHYXEA2.js +32 -0
  39. package/dist/chunk-JWHYXEA2.js.map +1 -0
  40. package/dist/chunk-N7HFALX3.js +88 -0
  41. package/dist/chunk-N7HFALX3.js.map +1 -0
  42. package/dist/chunk-Q4BO4Z5V.js +178 -0
  43. package/dist/chunk-Q4BO4Z5V.js.map +1 -0
  44. package/dist/chunk-QFDOWABX.js +195 -0
  45. package/dist/chunk-QFDOWABX.js.map +1 -0
  46. package/dist/chunk-SJJW77WN.js +605 -0
  47. package/dist/chunk-SJJW77WN.js.map +1 -0
  48. package/dist/chunk-VKVL7WBN.js +50 -0
  49. package/dist/chunk-VKVL7WBN.js.map +1 -0
  50. package/dist/chunk-WOHL4FTB.js +353 -0
  51. package/dist/chunk-WOHL4FTB.js.map +1 -0
  52. package/dist/chunk-XQXVG7RA.js +426 -0
  53. package/dist/chunk-XQXVG7RA.js.map +1 -0
  54. package/dist/chunk-ZD3KHESI.js +94 -0
  55. package/dist/chunk-ZD3KHESI.js.map +1 -0
  56. package/dist/credential-COLTBV6D.js +450 -0
  57. package/dist/credential-COLTBV6D.js.map +1 -0
  58. package/dist/credential-template-EEPYFG7R.js +291 -0
  59. package/dist/credential-template-EEPYFG7R.js.map +1 -0
  60. package/dist/debug-workflow-KOVH5GOP.js +259 -0
  61. package/dist/debug-workflow-KOVH5GOP.js.map +1 -0
  62. package/dist/dist-44PZR7BQ.js +423 -0
  63. package/dist/dist-44PZR7BQ.js.map +1 -0
  64. package/dist/docs-3SSORHB5.js +366 -0
  65. package/dist/docs-3SSORHB5.js.map +1 -0
  66. package/dist/doctor-OTSIWV6G.js +132 -0
  67. package/dist/doctor-OTSIWV6G.js.map +1 -0
  68. package/dist/feature-flag-T2LRZME3.js +283 -0
  69. package/dist/feature-flag-T2LRZME3.js.map +1 -0
  70. package/dist/file-type-S3UUBVCT.js +4205 -0
  71. package/dist/file-type-S3UUBVCT.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.js +982 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/init-TGWRECT2.js +208 -0
  76. package/dist/init-TGWRECT2.js.map +1 -0
  77. package/dist/install-DXSNWZKO.js +295 -0
  78. package/dist/install-DXSNWZKO.js.map +1 -0
  79. package/dist/issues-XIZOPX6T.js +564 -0
  80. package/dist/issues-XIZOPX6T.js.map +1 -0
  81. package/dist/knobs-NBINZIUB.js +295 -0
  82. package/dist/knobs-NBINZIUB.js.map +1 -0
  83. package/dist/list-3TDHK637.js +59 -0
  84. package/dist/list-3TDHK637.js.map +1 -0
  85. package/dist/local-HICVD6PU.js +100 -0
  86. package/dist/local-HICVD6PU.js.map +1 -0
  87. package/dist/login-UOIUXVUK.js +315 -0
  88. package/dist/login-UOIUXVUK.js.map +1 -0
  89. package/dist/mcp-54IJEOUA.js +1956 -0
  90. package/dist/mcp-54IJEOUA.js.map +1 -0
  91. package/dist/pdf-extract-ABWV3L5X.js +13 -0
  92. package/dist/pdf-extract-ABWV3L5X.js.map +1 -0
  93. package/dist/pdfjs-DQ2YA5S3.js +41561 -0
  94. package/dist/pdfjs-DQ2YA5S3.js.map +1 -0
  95. package/dist/property-UXLOLPTD.js +701 -0
  96. package/dist/property-UXLOLPTD.js.map +1 -0
  97. package/dist/property-skill-guide.md +189 -0
  98. package/dist/psql-BYUUNLGG.js +115 -0
  99. package/dist/psql-BYUUNLGG.js.map +1 -0
  100. package/dist/record-4TR2UIIS.js +233 -0
  101. package/dist/record-4TR2UIIS.js.map +1 -0
  102. package/dist/redis-35VBUYW7.js +116 -0
  103. package/dist/redis-35VBUYW7.js.map +1 -0
  104. package/dist/release-OOLTUBUT.js +354 -0
  105. package/dist/release-OOLTUBUT.js.map +1 -0
  106. package/dist/sandbox-XGSUU6G7.js +2046 -0
  107. package/dist/sandbox-XGSUU6G7.js.map +1 -0
  108. package/dist/scenarios-GWLJEGHA.js +280 -0
  109. package/dist/scenarios-GWLJEGHA.js.map +1 -0
  110. package/dist/session-MYFNZPRP.js +2414 -0
  111. package/dist/session-MYFNZPRP.js.map +1 -0
  112. package/dist/skill-KM34LDMO.js +1839 -0
  113. package/dist/skill-KM34LDMO.js.map +1 -0
  114. package/dist/skills/debug-run/SKILL.md +262 -0
  115. package/dist/skills/debug-run/history/1.0.0.md +244 -0
  116. package/dist/skills/debug-run/history/1.0.1.md +245 -0
  117. package/dist/skills/debug-run/history/1.0.2.md +254 -0
  118. package/dist/skills/debug-run/history/1.1.0.md +262 -0
  119. package/dist/skills/debug-run/version.json +3 -0
  120. package/dist/spec-RA3CFEKG.js +951 -0
  121. package/dist/spec-RA3CFEKG.js.map +1 -0
  122. package/dist/src-LB4HBTJQ.js +1516 -0
  123. package/dist/src-LB4HBTJQ.js.map +1 -0
  124. package/dist/src-N3TPKGTY.js +244 -0
  125. package/dist/src-N3TPKGTY.js.map +1 -0
  126. package/dist/src-UVDX5UP6.js +17 -0
  127. package/dist/src-UVDX5UP6.js.map +1 -0
  128. package/dist/start-PSEQSQA3.js +151 -0
  129. package/dist/start-PSEQSQA3.js.map +1 -0
  130. package/dist/tag-YY6YAABQ.js +22 -0
  131. package/dist/tag-YY6YAABQ.js.map +1 -0
  132. package/dist/task-IQC3YR5K.js +922 -0
  133. package/dist/task-IQC3YR5K.js.map +1 -0
  134. package/dist/test-suite-DZNJFXDW.js +394 -0
  135. package/dist/test-suite-DZNJFXDW.js.map +1 -0
  136. package/dist/trace-HXIW7U2D.js +14 -0
  137. package/dist/trace-HXIW7U2D.js.map +1 -0
  138. package/dist/triage-ORG45R5W.js +16 -0
  139. package/dist/triage-ORG45R5W.js.map +1 -0
  140. package/dist/upgrade-L2VYMP2V.js +61 -0
  141. package/dist/upgrade-L2VYMP2V.js.map +1 -0
  142. package/dist/workflow-XYFH5LTP.js +3708 -0
  143. package/dist/workflow-XYFH5LTP.js.map +1 -0
  144. package/dist/workflow-cache-NQJQFWMV.js +253 -0
  145. package/dist/workflow-cache-NQJQFWMV.js.map +1 -0
  146. package/dist/workflow-debug-BGD4UIXU.js +927 -0
  147. package/dist/workflow-debug-BGD4UIXU.js.map +1 -0
  148. package/dist/workflow-proposals-MTUDX46O.js +382 -0
  149. package/dist/workflow-proposals-MTUDX46O.js.map +1 -0
  150. package/package.json +61 -0
@@ -0,0 +1,295 @@
1
+ import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
+ import {
3
+ command
4
+ } from "./chunk-JICSYFRJ.js";
5
+ import {
6
+ promptChoice
7
+ } from "./chunk-WOHL4FTB.js";
8
+ import "./chunk-SJJW77WN.js";
9
+ import "./chunk-3CZU7XCS.js";
10
+ import {
11
+ getArgValue,
12
+ hasFlag
13
+ } from "./chunk-A4OFTUVV.js";
14
+ import "./chunk-JWHYXEA2.js";
15
+ import "./chunk-VKVL7WBN.js";
16
+
17
+ // src/install.ts
18
+ import { execSync } from "child_process";
19
+ import fs2 from "fs";
20
+ import path2 from "path";
21
+ import os2 from "os";
22
+
23
+ // src/runner/common.ts
24
+ import { spawnSync } from "child_process";
25
+ import fs from "fs";
26
+ import os from "os";
27
+ import path from "path";
28
+ function pickNodeBinary() {
29
+ const candidates = collectNodeCandidates();
30
+ let best;
31
+ let fallback;
32
+ for (const bin of candidates) {
33
+ const version = getNodeMajor(bin);
34
+ if (!version) continue;
35
+ const current = { bin, version };
36
+ if (version >= 18 && !fallback) {
37
+ fallback = current;
38
+ }
39
+ if (!best || version > (best.version ?? 0)) {
40
+ best = current;
41
+ }
42
+ }
43
+ if (fallback) return fallback;
44
+ if (best) return best;
45
+ return { bin: candidates[0] ?? "node" };
46
+ }
47
+ function collectNodeCandidates() {
48
+ const seen = /* @__PURE__ */ new Set();
49
+ const push = (value) => {
50
+ if (!value) return;
51
+ if (seen.has(value)) return;
52
+ seen.add(value);
53
+ };
54
+ const isBun = path.basename(process.execPath).includes("bun");
55
+ push(process.env.CANARY_NODE_BIN);
56
+ push(isBun ? void 0 : process.execPath);
57
+ push("node");
58
+ try {
59
+ const isWin = process.platform === "win32";
60
+ const result = isWin ? spawnSync("where", ["node"], { encoding: "utf-8", shell: true, windowsHide: true }) : spawnSync("which", ["-a", "node"], { encoding: "utf-8" });
61
+ result.stdout?.toString().split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0).forEach((line) => push(line));
62
+ } catch {
63
+ }
64
+ if (process.platform !== "win32") {
65
+ const nvmDir = process.env.NVM_DIR || path.join(os.homedir(), ".nvm");
66
+ const versionsDir = path.join(nvmDir, "versions", "node");
67
+ if (fs.existsSync(versionsDir)) {
68
+ try {
69
+ const versions = fs.readdirSync(versionsDir);
70
+ versions.sort((a, b) => a > b ? -1 : 1).forEach((v) => push(path.join(versionsDir, v, "bin", "node")));
71
+ } catch {
72
+ }
73
+ }
74
+ }
75
+ return Array.from(seen);
76
+ }
77
+ function getNodeMajor(bin) {
78
+ try {
79
+ const result = spawnSync(bin, ["-v"], { encoding: "utf-8" });
80
+ const output = (result.stdout || result.stderr || "").toString().trim();
81
+ const match = output.match(/^v(\d+)/);
82
+ if (match) return Number(match[1]);
83
+ } catch {
84
+ }
85
+ return void 0;
86
+ }
87
+
88
+ // src/install.ts
89
+ var MCP_SERVER_NAME = command;
90
+ var TARGETS = [
91
+ {
92
+ id: "claude-desktop",
93
+ label: "Claude Desktop",
94
+ configKey: "mcpServers",
95
+ configPath: () => {
96
+ if (process.platform === "win32") {
97
+ return path2.join(process.env.APPDATA || "", "Claude", "claude_desktop_config.json");
98
+ }
99
+ if (process.platform === "darwin") {
100
+ return path2.join(os2.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
101
+ }
102
+ return path2.join(os2.homedir(), ".config", "Claude", "claude_desktop_config.json");
103
+ },
104
+ buildEntry: (canaryPath, env) => ({
105
+ command: canaryPath,
106
+ args: ["mcp"],
107
+ ...env ? { env } : {}
108
+ }),
109
+ postInstallMsg: "Restart Claude Desktop to activate the MCP server."
110
+ },
111
+ {
112
+ id: "claude-code",
113
+ label: "Claude Code (project .mcp.json)",
114
+ configKey: "mcpServers",
115
+ configPath: () => path2.join(process.cwd(), ".mcp.json"),
116
+ buildEntry: (canaryPath, env) => ({
117
+ command: canaryPath,
118
+ args: ["mcp"],
119
+ ...env ? { env } : {}
120
+ })
121
+ },
122
+ {
123
+ id: "cursor",
124
+ label: "Cursor",
125
+ configKey: "mcpServers",
126
+ configPath: () => path2.join(os2.homedir(), ".cursor", "mcp.json"),
127
+ buildEntry: (canaryPath, env) => ({
128
+ command: canaryPath,
129
+ args: ["mcp"],
130
+ ...env ? { env } : {}
131
+ })
132
+ },
133
+ {
134
+ id: "windsurf",
135
+ label: "Windsurf",
136
+ configKey: "mcpServers",
137
+ configPath: () => path2.join(os2.homedir(), ".codeium", "windsurf", "mcp_config.json"),
138
+ buildEntry: (canaryPath, env) => ({
139
+ command: canaryPath,
140
+ args: ["mcp"],
141
+ ...env ? { env } : {}
142
+ })
143
+ },
144
+ {
145
+ id: "opencode",
146
+ label: "OpenCode",
147
+ configKey: "mcp",
148
+ configPath: () => path2.join(os2.homedir(), ".config", "opencode", "opencode.json"),
149
+ buildEntry: (canaryPath, env) => ({
150
+ type: "local",
151
+ command: [canaryPath, "mcp"],
152
+ enabled: true,
153
+ ...env ? { env } : {}
154
+ })
155
+ }
156
+ ];
157
+ function printHelp() {
158
+ const targetIds = TARGETS.map((t) => t.id).join(", ");
159
+ console.log(
160
+ [
161
+ "Usage: canary install [--target <id>]",
162
+ "",
163
+ "Install the Canary MCP server into an AI coding tool.",
164
+ "",
165
+ "Options:",
166
+ " --target <id> Skip interactive prompt. Valid targets:",
167
+ ` ${targetIds}`,
168
+ " -h, --help Show this help",
169
+ "",
170
+ "Examples:",
171
+ " canary install Interactive target selection",
172
+ " canary install --target claude-desktop",
173
+ " canary install --target cursor"
174
+ ].join("\n")
175
+ );
176
+ }
177
+ function resolveCanaryBinary() {
178
+ try {
179
+ const whichCmd = process.platform === "win32" ? `where ${command}` : `which ${command}`;
180
+ const out = execSync(whichCmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
181
+ const first = out.split(/\r?\n/).map((s) => s.trim()).find((s) => s.length > 0);
182
+ return first ?? command;
183
+ } catch {
184
+ console.warn(`Warning: could not resolve full path to ${command} binary, using "${command}".`);
185
+ return command;
186
+ }
187
+ }
188
+ function readConfig(filePath) {
189
+ try {
190
+ const raw = fs2.readFileSync(filePath, "utf-8");
191
+ return JSON.parse(raw);
192
+ } catch (err) {
193
+ if (err.code === "ENOENT") {
194
+ return {};
195
+ }
196
+ if (err instanceof SyntaxError) {
197
+ console.error(`Error: ${filePath} contains invalid JSON. Please fix it manually.`);
198
+ process.exit(1);
199
+ }
200
+ throw err;
201
+ }
202
+ }
203
+ function writeConfig(filePath, config) {
204
+ const dir = path2.dirname(filePath);
205
+ fs2.mkdirSync(dir, { recursive: true });
206
+ fs2.writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
207
+ }
208
+ function resolveNodeEnv() {
209
+ const { bin, version } = pickNodeBinary();
210
+ if (!version || version < 18) {
211
+ console.error(
212
+ `Error: Node.js >=18 is required (best found: ${version ? `v${version}` : "none"}).`
213
+ );
214
+ console.error("Install a supported version, then re-run canary install:");
215
+ console.error(" nvm install 22");
216
+ process.exit(1);
217
+ }
218
+ let nodeBin = bin;
219
+ if (!path2.isAbsolute(bin)) {
220
+ try {
221
+ const whichCmd = process.platform === "win32" ? `where ${bin}` : `which ${bin}`;
222
+ const out = execSync(whichCmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
223
+ nodeBin = out.split(/\r?\n/).map((s) => s.trim()).find((s) => s.length > 0) ?? bin;
224
+ } catch {
225
+ nodeBin = bin;
226
+ }
227
+ }
228
+ const nodeDir = path2.dirname(nodeBin);
229
+ const currentPath = process.env.PATH ?? "";
230
+ const firstPathEntry = currentPath.split(path2.delimiter)[0];
231
+ if (firstPathEntry === nodeDir) return void 0;
232
+ const systemPaths = ["/usr/local/bin", "/opt/homebrew/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"];
233
+ const canaryDir = path2.dirname(resolveCanaryBinary());
234
+ const pathEntries = [nodeDir, canaryDir, ...systemPaths].filter(
235
+ (v, i, a) => a.indexOf(v) === i
236
+ );
237
+ console.log(`Using Node.js v${version} from ${nodeDir}`);
238
+ return { PATH: pathEntries.join(path2.delimiter) };
239
+ }
240
+ function checkPlaywright() {
241
+ const cacheDir = process.env.PLAYWRIGHT_BROWSERS_PATH || path2.join(os2.homedir(), ".cache", "ms-playwright");
242
+ if (!fs2.existsSync(cacheDir) || fs2.readdirSync(cacheDir).length === 0) {
243
+ console.warn("\nNote: Playwright browsers not found.");
244
+ console.warn("Browser tools require Playwright. Install with:");
245
+ console.warn(" npx playwright install chromium");
246
+ console.warn("(Non-browser MCP tools will work without it.)\n");
247
+ return;
248
+ }
249
+ const hasChromium = fs2.readdirSync(cacheDir).some((d) => d.startsWith("chromium"));
250
+ if (!hasChromium) {
251
+ console.warn("\nNote: Playwright Chromium not found.");
252
+ console.warn("Browser tools require Chromium. Install with:");
253
+ console.warn(" npx playwright install chromium\n");
254
+ }
255
+ }
256
+ async function runInstall(argv) {
257
+ if (hasFlag(argv, "--help", "-h")) {
258
+ printHelp();
259
+ return;
260
+ }
261
+ let target;
262
+ const targetArg = getArgValue(argv, "--target");
263
+ if (targetArg) {
264
+ target = TARGETS.find((t) => t.id === targetArg);
265
+ if (!target) {
266
+ console.error(`Unknown target "${targetArg}".`);
267
+ console.error(`Valid targets: ${TARGETS.map((t) => t.id).join(", ")}`);
268
+ process.exit(1);
269
+ }
270
+ } else {
271
+ const choice = await promptChoice("Where would you like to install the Canary MCP server?", TARGETS.map((t) => ({ label: t.label, value: t })));
272
+ if (!choice) {
273
+ return;
274
+ }
275
+ target = choice;
276
+ }
277
+ const canaryPath = resolveCanaryBinary();
278
+ const configPath = target.configPath();
279
+ const config = readConfig(configPath);
280
+ const servers = config[target.configKey] ?? {};
281
+ const env = resolveNodeEnv();
282
+ servers[MCP_SERVER_NAME] = target.buildEntry(canaryPath, env);
283
+ config[target.configKey] = servers;
284
+ writeConfig(configPath, config);
285
+ console.log(`
286
+ Installed Canary MCP server to ${configPath}`);
287
+ checkPlaywright();
288
+ if (target.postInstallMsg) {
289
+ console.log(target.postInstallMsg);
290
+ }
291
+ }
292
+ export {
293
+ runInstall
294
+ };
295
+ //# sourceMappingURL=install-DXSNWZKO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/install.ts","../src/runner/common.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { getArgValue, hasFlag } from './auth';\nimport { command } from './brand.js';\nimport { promptChoice } from './cli-helpers';\nimport { pickNodeBinary } from './runner/common';\n\nconst MCP_SERVER_NAME = command;\n\ntype Target = {\n id: string;\n label: string;\n configPath: () => string;\n configKey: string;\n buildEntry: (canaryPath: string, env?: Record<string, string>) => Record<string, unknown>;\n postInstallMsg?: string;\n};\n\nconst TARGETS: Target[] = [\n {\n id: 'claude-desktop',\n label: 'Claude Desktop',\n configKey: 'mcpServers',\n configPath: () => {\n if (process.platform === 'win32') {\n return path.join(process.env.APPDATA || '', 'Claude', 'claude_desktop_config.json');\n }\n if (process.platform === 'darwin') {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n }\n return path.join(os.homedir(), '.config', 'Claude', 'claude_desktop_config.json');\n },\n buildEntry: (canaryPath, env) => ({\n command: canaryPath, args: ['mcp'], ...(env ? { env } : {}),\n }),\n postInstallMsg: 'Restart Claude Desktop to activate the MCP server.',\n },\n {\n id: 'claude-code',\n label: 'Claude Code (project .mcp.json)',\n configKey: 'mcpServers',\n configPath: () => path.join(process.cwd(), '.mcp.json'),\n buildEntry: (canaryPath, env) => ({\n command: canaryPath, args: ['mcp'], ...(env ? { env } : {}),\n }),\n },\n {\n id: 'cursor',\n label: 'Cursor',\n configKey: 'mcpServers',\n configPath: () => path.join(os.homedir(), '.cursor', 'mcp.json'),\n buildEntry: (canaryPath, env) => ({\n command: canaryPath, args: ['mcp'], ...(env ? { env } : {}),\n }),\n },\n {\n id: 'windsurf',\n label: 'Windsurf',\n configKey: 'mcpServers',\n configPath: () => path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json'),\n buildEntry: (canaryPath, env) => ({\n command: canaryPath, args: ['mcp'], ...(env ? { env } : {}),\n }),\n },\n {\n id: 'opencode',\n label: 'OpenCode',\n configKey: 'mcp',\n configPath: () => path.join(os.homedir(), '.config', 'opencode', 'opencode.json'),\n buildEntry: (canaryPath, env) => ({\n type: 'local', command: [canaryPath, 'mcp'], enabled: true, ...(env ? { env } : {}),\n }),\n },\n];\n\nfunction printHelp() {\n const targetIds = TARGETS.map((t) => t.id).join(', ');\n console.log(\n [\n 'Usage: canary install [--target <id>]',\n '',\n 'Install the Canary MCP server into an AI coding tool.',\n '',\n 'Options:',\n ' --target <id> Skip interactive prompt. Valid targets:',\n ` ${targetIds}`,\n ' -h, --help Show this help',\n '',\n 'Examples:',\n ' canary install Interactive target selection',\n ' canary install --target claude-desktop',\n ' canary install --target cursor',\n ].join('\\n')\n );\n}\n\nfunction resolveCanaryBinary(): string {\n try {\n const whichCmd = process.platform === 'win32' ? `where ${command}` : `which ${command}`;\n const out = execSync(whichCmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const first = out.split(/\\r?\\n/).map((s) => s.trim()).find((s) => s.length > 0);\n return first ?? command;\n } catch {\n console.warn(`Warning: could not resolve full path to ${command} binary, using \"${command}\".`);\n return command;\n }\n}\n\nfunction readConfig(filePath: string): Record<string, unknown> {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw) as Record<string, unknown>;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n if (err instanceof SyntaxError) {\n console.error(`Error: ${filePath} contains invalid JSON. Please fix it manually.`);\n process.exit(1);\n }\n throw err;\n }\n}\n\nfunction writeConfig(filePath: string, config: Record<string, unknown>) {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n');\n}\n\n/**\n * Build a PATH env that puts Node >=18 first.\n * Returns undefined if the current default node is already >=18.\n */\nfunction resolveNodeEnv(): Record<string, string> | undefined {\n const { bin, version } = pickNodeBinary();\n\n if (!version || version < 18) {\n console.error(\n `Error: Node.js >=18 is required (best found: ${version ? `v${version}` : 'none'}).`\n );\n console.error('Install a supported version, then re-run canary install:');\n console.error(' nvm install 22');\n process.exit(1);\n }\n\n // Resolve to absolute path\n let nodeBin = bin;\n if (!path.isAbsolute(bin)) {\n try {\n const whichCmd = process.platform === 'win32' ? `where ${bin}` : `which ${bin}`;\n const out = execSync(whichCmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n nodeBin = out.split(/\\r?\\n/).map((s) => s.trim()).find((s) => s.length > 0) ?? bin;\n } catch {\n nodeBin = bin;\n }\n }\n\n const nodeDir = path.dirname(nodeBin);\n\n // Check if this node dir is already first in PATH — if so, no env override needed\n const currentPath = process.env.PATH ?? '';\n const firstPathEntry = currentPath.split(path.delimiter)[0];\n if (firstPathEntry === nodeDir) return undefined;\n\n // Build PATH with the correct node dir first, followed by common system paths\n const systemPaths = ['/usr/local/bin', '/opt/homebrew/bin', '/usr/bin', '/bin', '/usr/sbin', '/sbin'];\n const canaryDir = path.dirname(resolveCanaryBinary());\n const pathEntries = [nodeDir, canaryDir, ...systemPaths].filter(\n (v, i, a) => a.indexOf(v) === i\n );\n\n console.log(`Using Node.js v${version} from ${nodeDir}`);\n return { PATH: pathEntries.join(path.delimiter) };\n}\n\n/**\n * Check if Playwright browsers are installed and print guidance if not.\n */\nfunction checkPlaywright(): void {\n // Check common Playwright browser cache locations\n const cacheDir =\n process.env.PLAYWRIGHT_BROWSERS_PATH ||\n path.join(os.homedir(), '.cache', 'ms-playwright');\n\n if (!fs.existsSync(cacheDir) || fs.readdirSync(cacheDir).length === 0) {\n console.warn('\\nNote: Playwright browsers not found.');\n console.warn('Browser tools require Playwright. Install with:');\n console.warn(' npx playwright install chromium');\n console.warn('(Non-browser MCP tools will work without it.)\\n');\n return;\n }\n\n // Check if chromium specifically exists\n const hasChromium = fs.readdirSync(cacheDir).some((d) => d.startsWith('chromium'));\n if (!hasChromium) {\n console.warn('\\nNote: Playwright Chromium not found.');\n console.warn('Browser tools require Chromium. Install with:');\n console.warn(' npx playwright install chromium\\n');\n }\n}\n\nexport async function runInstall(argv: string[]) {\n if (hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n // Resolve target\n let target: Target | undefined;\n const targetArg = getArgValue(argv, '--target');\n\n if (targetArg) {\n target = TARGETS.find((t) => t.id === targetArg);\n if (!target) {\n console.error(`Unknown target \"${targetArg}\".`);\n console.error(`Valid targets: ${TARGETS.map((t) => t.id).join(', ')}`);\n process.exit(1);\n }\n } else {\n const choice = await promptChoice('Where would you like to install the Canary MCP server?', TARGETS.map((t) => ({ label: t.label, value: t })));\n if (!choice) {\n return;\n }\n target = choice;\n }\n\n const canaryPath = resolveCanaryBinary();\n const configPath = target.configPath();\n const config = readConfig(configPath);\n\n // Ensure the config key object exists\n const servers = (config[target.configKey] ?? {}) as Record<string, unknown>;\n\n // Detect Node >=18 and build env override if needed\n const env = resolveNodeEnv();\n\n // Always update the entry (in case env or path changed)\n servers[MCP_SERVER_NAME] = target.buildEntry(canaryPath, env);\n config[target.configKey] = servers;\n\n writeConfig(configPath, config);\n\n console.log(`\\nInstalled Canary MCP server to ${configPath}`);\n\n // Check Playwright availability and print install guidance if missing\n checkPlaywright();\n\n if (target.postInstallMsg) {\n console.log(target.postInstallMsg);\n }\n}\n","import { spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport function pickNodeBinary(): { bin: string; version?: number } {\n const candidates = collectNodeCandidates();\n\n // Prefer the first viable candidate with version >=18; otherwise pick highest version found.\n let best: { bin: string; version?: number } | undefined;\n let fallback: { bin: string; version?: number } | undefined;\n\n for (const bin of candidates) {\n const version = getNodeMajor(bin);\n if (!version) continue;\n const current = { bin, version };\n if (version >= 18 && !fallback) {\n fallback = current;\n }\n if (!best || version > (best.version ?? 0)) {\n best = current;\n }\n }\n\n if (fallback) return fallback;\n if (best) return best;\n\n // Last resort\n return { bin: candidates[0] ?? 'node' };\n}\n\nfunction collectNodeCandidates(): string[] {\n const seen = new Set<string>();\n const push = (value?: string) => {\n if (!value) return;\n if (seen.has(value)) return;\n seen.add(value);\n };\n\n const isBun = path.basename(process.execPath).includes('bun');\n\n push(process.env.CANARY_NODE_BIN);\n push(isBun ? undefined : process.execPath);\n push('node'); // default PATH lookup\n\n // Collect from `which -a node` (Unix) or `where node` (Windows).\n try {\n const isWin = process.platform === 'win32';\n const result = isWin\n ? spawnSync('where', ['node'], { encoding: 'utf-8', shell: true, windowsHide: true })\n : spawnSync('which', ['-a', 'node'], { encoding: 'utf-8' });\n result.stdout\n ?.toString()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .forEach((line) => push(line));\n } catch {\n // ignore\n }\n\n // NVM installations (grab highest versions). nvm-for-Windows has a different\n // layout — skip on win32; the PATH scan above covers it.\n if (process.platform !== 'win32') {\n const nvmDir = process.env.NVM_DIR || path.join(os.homedir(), '.nvm');\n const versionsDir = path.join(nvmDir, 'versions', 'node');\n if (fs.existsSync(versionsDir)) {\n try {\n const versions = fs.readdirSync(versionsDir);\n versions\n .sort((a, b) => (a > b ? -1 : 1))\n .forEach((v) => push(path.join(versionsDir, v, 'bin', 'node')));\n } catch {\n // ignore\n }\n }\n }\n\n return Array.from(seen);\n}\n\nfunction getNodeMajor(bin: string): number | undefined {\n try {\n const result = spawnSync(bin, ['-v'], { encoding: 'utf-8' });\n const output = (result.stdout || result.stderr || '').toString().trim();\n const match = output.match(/^v(\\d+)/);\n if (match) return Number(match[1]);\n } catch {\n // ignore\n }\n return undefined;\n}\n"],"mappings":"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","names":["fs","path","os","path","os","fs"]}