@kanon-pm/setup 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/auth.d.ts CHANGED
@@ -1,14 +1,28 @@
1
- interface AuthResult {
2
- apiUrl: string;
3
- apiKey: string;
4
- }
1
+ import type { AuthResult, AuthDeps, PlatformContext } from "./types.js";
5
2
  /**
6
- * Resolve API URL and key with precedence: CLI flags > env vars > interactive prompt.
7
- * apiUrl is required; apiKey is optional (some setups don't need it).
3
+ * Check if a URL points to a localhost address.
4
+ * Matches: localhost, 127.0.0.1, ::1, 0.0.0.0
5
+ */
6
+ export declare function isLocalhost(url: string): boolean;
7
+ /**
8
+ * Auto-generate an API key by logging in with dev credentials.
9
+ * Only works against localhost URLs — returns null for remote or on any error.
10
+ */
11
+ export declare function autoGenerateApiKey(apiUrl: string, fetchFn?: typeof globalThis.fetch): Promise<string | null>;
12
+ /**
13
+ * Resolve API URL and key with a 5-step cascade:
14
+ * 1. CLI flags
15
+ * 2. Environment variables
16
+ * 3. Existing MCP config extraction
17
+ * 4. Auto-generation (localhost only)
18
+ * 5. Interactive prompt
19
+ *
20
+ * URL is resolved first (steps 1-5), then key (steps 1-5),
21
+ * because auto-generating a key requires a resolved URL.
8
22
  */
9
23
  export declare function resolveAuth(options: {
10
24
  apiUrl?: string;
11
25
  apiKey?: string;
12
- }): Promise<AuthResult>;
13
- export {};
26
+ yes?: boolean;
27
+ }, ctx: PlatformContext, deps?: AuthDeps): Promise<AuthResult>;
14
28
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBtB"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGxE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAchD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,GAClD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,EAC5D,GAAG,EAAE,eAAe,EACpB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAAC,UAAU,CAAC,CAgHrB"}
package/dist/auth.js CHANGED
@@ -1,33 +1,177 @@
1
1
  // ─── Auth Resolution ─────────────────────────────────────────────────────────
2
- import readline from "node:readline";
2
+ import { input, password } from "@inquirer/prompts";
3
+ import { extractExistingAuth } from "./mcp-config.js";
3
4
  /**
4
- * Resolve API URL and key with precedence: CLI flags > env vars > interactive prompt.
5
- * apiUrl is required; apiKey is optional (some setups don't need it).
5
+ * Check if a URL points to a localhost address.
6
+ * Matches: localhost, 127.0.0.1, ::1, 0.0.0.0
6
7
  */
7
- export async function resolveAuth(options) {
8
- let apiUrl = options.apiUrl || process.env["KANON_API_URL"] || "";
9
- let apiKey = options.apiKey || process.env["KANON_API_KEY"] || "";
8
+ export function isLocalhost(url) {
9
+ try {
10
+ const parsed = new URL(url);
11
+ const host = parsed.hostname;
12
+ return (host === "localhost" ||
13
+ host === "127.0.0.1" ||
14
+ host === "::1" ||
15
+ host === "[::1]" ||
16
+ host === "0.0.0.0");
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * Auto-generate an API key by logging in with dev credentials.
24
+ * Only works against localhost URLs — returns null for remote or on any error.
25
+ */
26
+ export async function autoGenerateApiKey(apiUrl, fetchFn = globalThis.fetch) {
27
+ if (!isLocalhost(apiUrl)) {
28
+ return null;
29
+ }
30
+ try {
31
+ // Step 1: Login with dev credentials
32
+ const loginResp = await fetchFn(`${apiUrl}/api/auth/login`, {
33
+ method: "POST",
34
+ headers: { "Content-Type": "application/json" },
35
+ body: JSON.stringify({
36
+ email: "dev@kanon.io",
37
+ password: "Password1!",
38
+ workspaceId: "kanon-dev",
39
+ }),
40
+ });
41
+ if (!loginResp.ok)
42
+ return null;
43
+ const loginData = (await loginResp.json());
44
+ const accessToken = loginData.accessToken;
45
+ if (!accessToken)
46
+ return null;
47
+ // Step 2: Generate API key
48
+ const keyResp = await fetchFn(`${apiUrl}/api/auth/api-key`, {
49
+ method: "POST",
50
+ headers: { Authorization: `Bearer ${accessToken}` },
51
+ });
52
+ if (!keyResp.ok)
53
+ return null;
54
+ const keyData = (await keyResp.json());
55
+ return keyData.apiKey ?? null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Resolve API URL and key with a 5-step cascade:
63
+ * 1. CLI flags
64
+ * 2. Environment variables
65
+ * 3. Existing MCP config extraction
66
+ * 4. Auto-generation (localhost only)
67
+ * 5. Interactive prompt
68
+ *
69
+ * URL is resolved first (steps 1-5), then key (steps 1-5),
70
+ * because auto-generating a key requires a resolved URL.
71
+ */
72
+ export async function resolveAuth(options, ctx, deps) {
73
+ const _extractExisting = deps?.extractExisting ?? extractExistingAuth;
74
+ const _autoGenerateKey = deps?.autoGenerateKey ?? autoGenerateApiKey;
75
+ const _promptUrl = deps?.promptUrl ?? defaultPromptUrl;
76
+ const _promptKey = deps?.promptKey ?? defaultPromptKey;
77
+ const _fetchFn = deps?.fetchFn ?? globalThis.fetch;
78
+ let apiUrl;
79
+ let urlSource = "flag";
80
+ // ── Resolve URL ────────────────────────────────────────────────────
81
+ // Step 1: Flag
82
+ if (options.apiUrl) {
83
+ apiUrl = options.apiUrl;
84
+ urlSource = "flag";
85
+ }
86
+ // Step 2: Env
87
+ if (!apiUrl && process.env["KANON_API_URL"]) {
88
+ apiUrl = process.env["KANON_API_URL"];
89
+ urlSource = "env";
90
+ }
91
+ // Step 3: Existing config
92
+ if (!apiUrl) {
93
+ const existing = _extractExisting(ctx);
94
+ if (existing.apiUrl) {
95
+ apiUrl = existing.apiUrl;
96
+ urlSource = "existing-config";
97
+ }
98
+ }
99
+ // Step 4: Auto-detect localhost
10
100
  if (!apiUrl) {
11
- apiUrl = await prompt("Kanon API URL: ");
101
+ try {
102
+ const healthResp = await _fetchFn("http://localhost:3000/health");
103
+ if (healthResp.ok) {
104
+ apiUrl = "http://localhost:3000";
105
+ urlSource = "auto-generated";
106
+ }
107
+ }
108
+ catch {
109
+ // localhost not running — fall through
110
+ }
111
+ }
112
+ // Step 5: Interactive prompt
113
+ if (!apiUrl) {
114
+ if (options.yes || !process.stdin.isTTY) {
115
+ throw new Error("API URL could not be resolved automatically. " +
116
+ "Provide via --api-url flag or KANON_API_URL env var.");
117
+ }
118
+ apiUrl = await _promptUrl();
119
+ urlSource = "prompt";
12
120
  }
13
121
  if (!apiUrl) {
14
122
  throw new Error("API URL is required. Provide via --api-url, KANON_API_URL env var, or enter it when prompted.");
15
123
  }
124
+ // ── Resolve Key ────────────────────────────────────────────────────
125
+ let apiKey;
126
+ let keySource = "flag";
127
+ // Step 1: Flag
128
+ if (options.apiKey) {
129
+ apiKey = options.apiKey;
130
+ keySource = "flag";
131
+ }
132
+ // Step 2: Env
133
+ if (!apiKey && process.env["KANON_API_KEY"]) {
134
+ apiKey = process.env["KANON_API_KEY"];
135
+ keySource = "env";
136
+ }
137
+ // Step 3: Existing config
16
138
  if (!apiKey) {
17
- apiKey = await prompt("Kanon API Key (press Enter to skip): ");
139
+ const existing = _extractExisting(ctx);
140
+ if (existing.apiKey) {
141
+ apiKey = existing.apiKey;
142
+ keySource = "existing-config";
143
+ }
18
144
  }
19
- return { apiUrl, apiKey };
145
+ // Step 4: Auto-generate (localhost only)
146
+ if (!apiKey) {
147
+ const generated = await _autoGenerateKey(apiUrl);
148
+ if (generated) {
149
+ apiKey = generated;
150
+ keySource = "auto-generated";
151
+ }
152
+ }
153
+ // Step 5: Interactive prompt
154
+ if (!apiKey) {
155
+ if (options.yes || !process.stdin.isTTY) {
156
+ throw new Error("API key could not be resolved automatically. " +
157
+ "Provide via --api-key flag or KANON_API_KEY env var.");
158
+ }
159
+ apiKey = await _promptKey();
160
+ keySource = "prompt";
161
+ }
162
+ return { apiUrl, apiKey: apiKey ?? "", urlSource, keySource };
20
163
  }
21
- function prompt(question) {
22
- const rl = readline.createInterface({
23
- input: process.stdin,
24
- output: process.stdout,
164
+ // ── Default prompt implementations ──────────────────────────────────────────
165
+ async function defaultPromptUrl() {
166
+ return input({
167
+ message: "Kanon API URL:",
168
+ default: "http://localhost:3000",
25
169
  });
26
- return new Promise((resolve) => {
27
- rl.question(question, (answer) => {
28
- rl.close();
29
- resolve(answer.trim());
30
- });
170
+ }
171
+ async function defaultPromptKey() {
172
+ return password({
173
+ message: "Kanon API Key:",
174
+ mask: "*",
31
175
  });
32
176
  }
33
177
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,QAAQ,MAAM,eAAe,CAAC;AAOrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAGjC;IACC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAClE,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAElE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/detect.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Platform, PlatformContext } from "./types.js";
1
2
  /**
2
3
  * Check if running inside WSL by reading /proc/version.
3
4
  */
@@ -7,8 +8,21 @@ export declare function isWsl(): boolean;
7
8
  * Uses cmd.exe to get %USERNAME% and constructs /mnt/c/Users/<user>.
8
9
  */
9
10
  export declare function resolveWinHome(): string | undefined;
11
+ /**
12
+ * Detect the current platform as a tri-state: win32, wsl, or linux.
13
+ * Accepts an optional override for testing.
14
+ */
15
+ export declare function detectPlatform(override?: Platform): Platform;
16
+ /**
17
+ * Build a PlatformContext once at startup. All downstream functions receive
18
+ * this context instead of threading winHome/wslMode booleans.
19
+ *
20
+ * Overrides allow test injection without mocking globals.
21
+ */
22
+ export declare function buildPlatformContext(overrides?: Partial<PlatformContext>): Promise<PlatformContext>;
10
23
  /**
11
24
  * Check if a command exists on the system.
25
+ * Uses `where` on win32 and `which` on linux/wsl.
12
26
  */
13
- export declare function commandExists(cmd: string): boolean;
27
+ export declare function commandExists(cmd: string, platform?: Platform): boolean;
14
28
  //# sourceMappingURL=detect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAO/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAiBnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI5D;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAO/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAiBnD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAM5D;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACnC,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAQvE"}
package/dist/detect.js CHANGED
@@ -1,6 +1,8 @@
1
1
  // ─── Detection Utilities ─────────────────────────────────────────────────────
2
2
  import fs from "node:fs";
3
+ import os from "node:os";
3
4
  import { execSync } from "node:child_process";
5
+ // ─── Internal Helpers ────────────────────────────────────────────────────────
4
6
  /**
5
7
  * Check if running inside WSL by reading /proc/version.
6
8
  */
@@ -35,12 +37,52 @@ export function resolveWinHome() {
35
37
  return undefined;
36
38
  }
37
39
  }
40
+ // ─── Platform Detection ──────────────────────────────────────────────────────
41
+ /**
42
+ * Detect the current platform as a tri-state: win32, wsl, or linux.
43
+ * Accepts an optional override for testing.
44
+ */
45
+ export function detectPlatform(override) {
46
+ if (override)
47
+ return override;
48
+ if (process.platform === "win32")
49
+ return "win32";
50
+ if (isWsl())
51
+ return "wsl";
52
+ return "linux";
53
+ }
54
+ /**
55
+ * Build a PlatformContext once at startup. All downstream functions receive
56
+ * this context instead of threading winHome/wslMode booleans.
57
+ *
58
+ * Overrides allow test injection without mocking globals.
59
+ */
60
+ export async function buildPlatformContext(overrides) {
61
+ const platform = overrides?.platform ?? detectPlatform();
62
+ const homedir = overrides?.homedir ?? os.homedir();
63
+ const ctx = { platform, homedir };
64
+ switch (platform) {
65
+ case "win32":
66
+ ctx.appDataDir = overrides?.appDataDir ?? process.env["APPDATA"];
67
+ break;
68
+ case "wsl":
69
+ ctx.winHome = overrides?.winHome ?? resolveWinHome();
70
+ break;
71
+ case "linux":
72
+ // No extra fields needed
73
+ break;
74
+ }
75
+ return ctx;
76
+ }
77
+ // ─── Command Existence ───────────────────────────────────────────────────────
38
78
  /**
39
79
  * Check if a command exists on the system.
80
+ * Uses `where` on win32 and `which` on linux/wsl.
40
81
  */
41
- export function commandExists(cmd) {
82
+ export function commandExists(cmd, platform) {
83
+ const whichCmd = platform === "win32" ? "where" : "which";
42
84
  try {
43
- execSync(`which ${cmd}`, { stdio: ["pipe", "pipe", "pipe"] });
85
+ execSync(`${whichCmd} ${cmd}`, { stdio: ["pipe", "pipe", "pipe"] });
44
86
  return true;
45
87
  }
46
88
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,8BAA8B,EAAE;YACxD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,MAAM,OAAO,GAAG,gBAAgB,QAAQ,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,8BAA8B,EAAE;YACxD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,MAAM,OAAO,GAAG,gBAAgB,QAAQ,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAmB;IAChD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACjD,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAoC;IAEpC,MAAM,QAAQ,GAAG,SAAS,EAAE,QAAQ,IAAI,cAAc,EAAE,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAEnD,MAAM,GAAG,GAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAEnD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,GAAG,CAAC,UAAU,GAAG,SAAS,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjE,MAAM;QACR,KAAK,KAAK;YACR,GAAG,CAAC,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC;YACrD,MAAM;QACR,KAAK,OAAO;YACV,yBAAyB;YACzB,MAAM;IACV,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,QAAmB;IAC5D,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,QAAQ,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,22 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ import type { ToolDefinition, PlatformContext } from "./types.js";
3
+ /**
4
+ * Select which tools to configure based on flags or interactive checkbox.
5
+ *
6
+ * - --tool <name> → single tool (validated against registry)
7
+ * - --all or --yes → all detected tools
8
+ * - interactive (TTY, no flags) → checkbox with all pre-selected
9
+ * - non-interactive (no TTY, no flags) → all detected tools
10
+ */
11
+ export declare function selectTools(detected: ToolDefinition[], flags: {
12
+ tool?: string;
13
+ all?: boolean;
14
+ yes?: boolean;
15
+ }, isInteractive: boolean, ctx: PlatformContext, deps?: {
16
+ promptTools?: (choices: Array<{
17
+ name: string;
18
+ value: string;
19
+ checked: boolean;
20
+ }>) => Promise<string[]>;
21
+ }): Promise<ToolDefinition[]>;
3
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AA4R9E;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,EACtD,aAAa,EAAE,OAAO,EACtB,GAAG,EAAE,eAAe,EACpB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAChH,OAAO,CAAC,cAAc,EAAE,CAAC,CAoD3B"}
package/dist/index.js CHANGED
@@ -2,7 +2,8 @@
2
2
  // ─── Kanon Setup ───────────────────────────────────────────────────────────────
3
3
  import { Command } from "commander";
4
4
  import chalk from "chalk";
5
- import { isWsl, resolveWinHome } from "./detect.js";
5
+ import { checkbox } from "@inquirer/prompts";
6
+ import { buildPlatformContext } from "./detect.js";
6
7
  import { resolveAuth } from "./auth.js";
7
8
  import { detectTools, getToolByName } from "./registry.js";
8
9
  import { buildMcpEntry, mergeConfig, removeConfig, resolveMcpServerPath, resolveNodeBin, } from "./mcp-config.js";
@@ -29,7 +30,8 @@ program
29
30
  .option("--api-key <key>", "Kanon API key")
30
31
  .option("--tool <name>", "Target a specific tool (claude-code, cursor, antigravity)")
31
32
  .option("--all", "Configure all detected tools")
32
- .option("--remove", "Remove Kanon configuration from tools");
33
+ .option("--remove", "Remove Kanon configuration from tools")
34
+ .option("-y, --yes", "Accept all defaults without interactive prompts");
33
35
  program.action(async (options) => {
34
36
  try {
35
37
  await run(options);
@@ -43,56 +45,35 @@ program.action(async (options) => {
43
45
  async function run(options) {
44
46
  const removeMode = options.remove === true;
45
47
  const assetsDir = getAssetsDir();
46
- // ── WSL Detection ──────────────────────────────────────────────────
47
- const wslMode = isWsl();
48
- let winHome;
49
- if (wslMode) {
50
- winHome = resolveWinHome();
51
- if (winHome) {
48
+ const isInteractive = !options.yes && !options.tool && !options.all && !!process.stdin.isTTY;
49
+ // ── 1. Platform Detection ──────────────────────────────────────────
50
+ const ctx = await buildPlatformContext();
51
+ const platformLabel = ctx.platform === "wsl" ? "WSL2" : ctx.platform.charAt(0).toUpperCase() + ctx.platform.slice(1);
52
+ console.log(chalk.cyan("[info]") + ` Detected platform: ${chalk.bold(platformLabel)}`);
53
+ if (ctx.platform === "wsl") {
54
+ if (ctx.winHome) {
52
55
  console.log(chalk.cyan("[info]") +
53
- ` WSL detected — Windows home: ${chalk.bold(winHome)}`);
56
+ ` Windows home: ${chalk.bold(ctx.winHome)}`);
54
57
  }
55
58
  else {
56
59
  console.log(chalk.yellow("[warn]") +
57
60
  " WSL detected but could not resolve Windows home directory");
58
61
  }
59
62
  }
60
- // ── Tool Detection & Selection ─────────────────────────────────────
61
- let selectedTools;
62
- if (options.tool) {
63
- const tool = getToolByName(options.tool);
64
- if (!tool) {
65
- throw new Error(`Unknown tool: '${options.tool}'. Supported: claude-code, cursor, antigravity`);
66
- }
67
- selectedTools = [tool];
68
- }
69
- else if (options.all) {
70
- selectedTools = await detectTools(wslMode, winHome);
71
- if (selectedTools.length === 0) {
72
- throw new Error("No supported tools detected. Install at least one supported AI coding tool.");
73
- }
74
- }
75
- else {
76
- // Detect and show what's available
77
- selectedTools = await detectTools(wslMode, winHome);
78
- if (selectedTools.length === 0) {
79
- throw new Error("No supported tools detected. Install at least one supported AI coding tool.");
80
- }
81
- console.log("");
82
- console.log(chalk.bold("Detected AI coding tools:"));
83
- for (const tool of selectedTools) {
84
- console.log(` ${chalk.cyan("-")} ${tool.displayName}`);
85
- }
86
- console.log("");
87
- }
88
- // ── Auth Resolution (skip for --remove) ────────────────────────────
63
+ // ── 2. Detect all tools ────────────────────────────────────────────
64
+ const detectedTools = await detectTools(ctx);
65
+ // ── 3. Select tools (interactive or flag-based) ────────────────────
66
+ const selectedTools = await selectTools(detectedTools, { tool: options.tool, all: options.all, yes: options.yes }, isInteractive, ctx);
67
+ // ── 4. Auth Resolution (skip for --remove) ─────────────────────────
89
68
  let apiUrl = "";
90
69
  let apiKey = "";
70
+ let auth;
91
71
  if (!removeMode) {
92
- const auth = await resolveAuth({
72
+ auth = await resolveAuth({
93
73
  apiUrl: options.apiUrl,
94
74
  apiKey: options.apiKey,
95
- });
75
+ yes: options.yes,
76
+ }, ctx);
96
77
  apiUrl = auth.apiUrl;
97
78
  apiKey = auth.apiKey;
98
79
  }
@@ -110,11 +91,18 @@ async function run(options) {
110
91
  console.log("");
111
92
  let successCount = 0;
112
93
  for (const tool of selectedTools) {
113
- const useWslPaths = wslMode && tool.isWindowsNative;
114
- const pathArg = useWslPaths ? winHome : undefined;
94
+ const platformPaths = tool.platforms[ctx.platform];
95
+ if (!platformPaths) {
96
+ console.log(chalk.yellow(" ⚠") +
97
+ ` ${tool.displayName} is not supported on ${ctx.platform} — skipping`);
98
+ console.log("");
99
+ continue;
100
+ }
101
+ const configPath = platformPaths.config(ctx);
102
+ const skillDir = platformPaths.skills(ctx);
103
+ const templatePath = platformPaths.template(ctx);
115
104
  if (removeMode) {
116
105
  // ── Remove Mode ──────────────────────────────────────────────
117
- const configPath = tool.configPath(pathArg);
118
106
  const removed = removeConfig(configPath, tool.rootKey);
119
107
  if (removed) {
120
108
  console.log(chalk.green(" ✓") +
@@ -125,22 +113,20 @@ async function run(options) {
125
113
  ` MCP config not found for ${tool.displayName} — nothing to remove`);
126
114
  }
127
115
  // Remove skills
128
- const skillDir = tool.skillDest(pathArg);
129
116
  const removedSkills = removeSkills(skillDir);
130
117
  if (removedSkills.length > 0) {
131
118
  console.log(chalk.green(" ✓") +
132
119
  ` Removed ${removedSkills.length} skills from ${chalk.bold(tool.displayName)}`);
133
120
  }
134
121
  // Remove template
135
- const templatePath = tool.templateTarget(pathArg);
136
122
  const removedTemplate = removeTemplate(templatePath, tool.templateMode);
137
123
  if (removedTemplate) {
138
124
  console.log(chalk.green(" ✓") +
139
125
  ` Removed template from ${chalk.bold(tool.displayName)}`);
140
126
  }
141
127
  // Remove workflows
142
- if (tool.workflowDest) {
143
- const wfDir = tool.workflowDest(pathArg);
128
+ if (platformPaths.workflows) {
129
+ const wfDir = platformPaths.workflows(ctx);
144
130
  const removedWfs = removeWorkflows(wfDir);
145
131
  if (removedWfs.length > 0) {
146
132
  console.log(chalk.green(" ✓") +
@@ -151,27 +137,24 @@ async function run(options) {
151
137
  }
152
138
  else {
153
139
  // ── Install Mode ─────────────────────────────────────────────
154
- const configPath = tool.configPath(pathArg);
155
- const entry = buildMcpEntry(mcpResolution, apiUrl, apiKey, wslMode, tool.isWindowsNative, nodeBin);
140
+ const entry = buildMcpEntry(mcpResolution, apiUrl, apiKey, ctx, platformPaths.mcpMode, nodeBin);
156
141
  // 1. MCP config
157
142
  mergeConfig(configPath, tool.rootKey, entry);
158
143
  console.log(chalk.green(" ✓") +
159
144
  ` Configured MCP for ${chalk.bold(tool.displayName)} (${configPath})`);
160
145
  // 2. Skills
161
- const skillDir = tool.skillDest(pathArg);
162
146
  const installedSkills = installSkills(skillDir, assetsDir);
163
147
  if (installedSkills.length > 0) {
164
148
  console.log(chalk.green(" ✓") +
165
149
  ` Installed ${installedSkills.length} skills to ${chalk.cyan(skillDir)}`);
166
150
  }
167
151
  // 3. Template
168
- const templatePath = tool.templateTarget(pathArg);
169
152
  installTemplate(templatePath, tool.templateSource, assetsDir, tool.templateMode);
170
153
  console.log(chalk.green(" ✓") +
171
154
  ` Installed template for ${chalk.bold(tool.displayName)} (${templatePath})`);
172
155
  // 4. Workflows
173
- if (tool.workflowDest) {
174
- const wfDir = tool.workflowDest(pathArg);
156
+ if (platformPaths.workflows) {
157
+ const wfDir = platformPaths.workflows(ctx);
175
158
  const installedWfs = installWorkflows(wfDir, assetsDir);
176
159
  if (installedWfs.length > 0) {
177
160
  console.log(chalk.green(" ✓") +
@@ -182,19 +165,75 @@ async function run(options) {
182
165
  }
183
166
  console.log("");
184
167
  }
185
- // ── Summary ────────────────────────────────────────────────────────
168
+ // ── 6. Summary ─────────────────────────────────────────────────────
186
169
  if (removeMode) {
187
170
  console.log(chalk.green(`✓ Removed Kanon configuration from ${successCount} tool(s).`));
188
171
  }
189
172
  else {
190
- console.log(chalk.green(`✓ Kanon configured for ${successCount} tool(s)!`));
173
+ console.log(chalk.green(`✓ Configured ${successCount} tool(s)!`));
191
174
  console.log("");
192
- console.log(` API URL: ${chalk.cyan(apiUrl)}`);
193
- console.log(` MCP: ${chalk.cyan(mcpResolution.mode === "local" ? mcpResolution.path : "npx @kanon/mcp")}`);
175
+ if (auth) {
176
+ const maskKey = (key) => key.length > 4 ? "****" + key.slice(-4) : "****";
177
+ console.log(` API URL: ${chalk.cyan(apiUrl)} ${chalk.dim(`(from ${auth.urlSource})`)}`);
178
+ console.log(` API Key: ${chalk.cyan(maskKey(apiKey))} ${chalk.dim(`(${auth.keySource})`)}`);
179
+ }
194
180
  console.log("");
195
181
  console.log(chalk.yellow(" Restart your AI coding tool(s) to pick up the new configuration."));
196
182
  }
197
183
  console.log("");
198
184
  }
185
+ // ─── Tool Selection ──────────────────────────────────────────────────────────
186
+ /**
187
+ * Select which tools to configure based on flags or interactive checkbox.
188
+ *
189
+ * - --tool <name> → single tool (validated against registry)
190
+ * - --all or --yes → all detected tools
191
+ * - interactive (TTY, no flags) → checkbox with all pre-selected
192
+ * - non-interactive (no TTY, no flags) → all detected tools
193
+ */
194
+ export async function selectTools(detected, flags, isInteractive, ctx, deps) {
195
+ // --tool flag: single tool by name
196
+ if (flags.tool) {
197
+ const tool = getToolByName(flags.tool);
198
+ if (!tool) {
199
+ throw new Error(`Unknown tool: '${flags.tool}'. Supported: claude-code, cursor, antigravity`);
200
+ }
201
+ if (!tool.platforms[ctx.platform]) {
202
+ throw new Error(`${tool.displayName} is not supported on ${ctx.platform}`);
203
+ }
204
+ return [tool];
205
+ }
206
+ // No tools detected → error
207
+ if (detected.length === 0) {
208
+ throw new Error("No supported tools detected. Install at least one supported AI coding tool.");
209
+ }
210
+ // --all or --yes → all detected
211
+ if (flags.all || flags.yes) {
212
+ return detected;
213
+ }
214
+ // Non-interactive (no TTY) → all detected
215
+ if (!isInteractive) {
216
+ return detected;
217
+ }
218
+ // Interactive → checkbox with all pre-selected
219
+ const _promptTools = deps?.promptTools ?? defaultPromptTools;
220
+ console.log("");
221
+ const selectedNames = await _promptTools(detected.map((t) => ({
222
+ name: t.displayName,
223
+ value: t.name,
224
+ checked: true,
225
+ })));
226
+ if (selectedNames.length === 0) {
227
+ console.log(chalk.yellow("No tools selected — nothing to do."));
228
+ process.exit(0);
229
+ }
230
+ return detected.filter((t) => selectedNames.includes(t.name));
231
+ }
232
+ async function defaultPromptTools(choices) {
233
+ return checkbox({
234
+ message: "Select tools to configure:",
235
+ choices,
236
+ });
237
+ }
199
238
  program.parse();
200
239
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { McpServerEntry } from "./types.js";
1
+ import type { McpServerEntry, McpMode, PlatformContext } from "./types.js";
2
2
  /**
3
3
  * Merge a Kanon MCP server entry into a tool's JSON config file.
4
4
  * Creates the file and parent directories if they don't exist.
@@ -18,10 +18,12 @@ export type McpResolution = {
18
18
  };
19
19
  /**
20
20
  * Build the MCP server entry for Kanon.
21
- * In WSL mode for Windows-native tools, uses "wsl" as command.
22
- * When resolution mode is "npx", uses npx to invoke @kanon/mcp dynamically.
21
+ *
22
+ * Uses PlatformContext + McpMode to determine the entry format:
23
+ * - 'direct': linux, wsl-native tools, or win32 — uses node/npx directly
24
+ * - 'wsl-bridge': Windows-side tools invoked from WSL — uses `wsl` wrapper
23
25
  */
24
- export declare function buildMcpEntry(resolution: McpResolution, apiUrl: string, apiKey: string, wslMode: boolean, isWindowsNative: boolean, nodeBin: string): McpServerEntry;
26
+ export declare function buildMcpEntry(resolution: McpResolution, apiUrl: string, apiKey: string, ctx: PlatformContext, mcpMode: McpMode, nodeBin: string): McpServerEntry;
25
27
  /**
26
28
  * Resolve how to invoke the Kanon MCP server.
27
29
  * When running from the monorepo or with @kanon/mcp installed locally,
@@ -32,4 +34,19 @@ export declare function resolveMcpServerPath(): McpResolution;
32
34
  * Resolve the path to the node binary.
33
35
  */
34
36
  export declare function resolveNodeBin(): string;
37
+ /**
38
+ * Extract auth credentials from existing kanon-mcp entries across all tool configs.
39
+ *
40
+ * Scans each tool in the registry that supports the current platform, reads its
41
+ * MCP config file, and looks for a "kanon-mcp" entry. Extracts KANON_API_URL and
42
+ * KANON_API_KEY from:
43
+ * - Direct mode: `entry.env.KANON_API_URL` / `entry.env.KANON_API_KEY`
44
+ * - WSL bridge mode: parses `entry.args` array for `KANON_API_URL=xxx` patterns
45
+ *
46
+ * Returns the first values found. Missing files/entries are handled gracefully.
47
+ */
48
+ export declare function extractExistingAuth(ctx: PlatformContext): {
49
+ apiUrl?: string;
50
+ apiKey?: string;
51
+ };
35
52
  //# sourceMappingURL=mcp-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,GACpB,IAAI,CAqBN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAsBzE;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,OAAO,EACxB,OAAO,EAAE,MAAM,GACd,cAAc,CAuChB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,CAuBpD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,GACpB,IAAI,CAqBN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAsBzE;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,cAAc,CAwChB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,CAwBpD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,GACnB;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA2DtC"}
@@ -1,6 +1,8 @@
1
1
  // ─── MCP Config Merger ───────────────────────────────────────────────────────
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { toolRegistry } from "./registry.js";
4
6
  /**
5
7
  * Merge a Kanon MCP server entry into a tool's JSON config file.
6
8
  * Creates the file and parent directories if they don't exist.
@@ -52,13 +54,15 @@ export function removeConfig(configPath, rootKey) {
52
54
  }
53
55
  /**
54
56
  * Build the MCP server entry for Kanon.
55
- * In WSL mode for Windows-native tools, uses "wsl" as command.
56
- * When resolution mode is "npx", uses npx to invoke @kanon/mcp dynamically.
57
+ *
58
+ * Uses PlatformContext + McpMode to determine the entry format:
59
+ * - 'direct': linux, wsl-native tools, or win32 — uses node/npx directly
60
+ * - 'wsl-bridge': Windows-side tools invoked from WSL — uses `wsl` wrapper
57
61
  */
58
- export function buildMcpEntry(resolution, apiUrl, apiKey, wslMode, isWindowsNative, nodeBin) {
62
+ export function buildMcpEntry(resolution, apiUrl, apiKey, ctx, mcpMode, nodeBin) {
59
63
  const isNpx = resolution.mode === "npx";
60
- if (wslMode && isWindowsNative) {
61
- // Windows-native tools invoke via WSL
64
+ if (mcpMode === "wsl-bridge") {
65
+ // Windows-side tools invoked via WSL wrapper
62
66
  const envArgs = [`KANON_API_URL=${apiUrl}`];
63
67
  if (apiKey) {
64
68
  envArgs.push(`KANON_API_KEY=${apiKey}`);
@@ -74,6 +78,7 @@ export function buildMcpEntry(resolution, apiUrl, apiKey, wslMode, isWindowsNati
74
78
  args: ["env", ...envArgs, nodeBin, resolution.path],
75
79
  };
76
80
  }
81
+ // Direct mode (linux, wsl-native tools, or win32)
77
82
  const env = { KANON_API_URL: apiUrl };
78
83
  if (apiKey) {
79
84
  env["KANON_API_KEY"] = apiKey;
@@ -98,7 +103,8 @@ export function buildMcpEntry(resolution, apiUrl, apiKey, wslMode, isWindowsNati
98
103
  */
99
104
  export function resolveMcpServerPath() {
100
105
  // Try to find the local monorepo MCP dist
101
- const scriptDir = new URL(".", import.meta.url).pathname;
106
+ // Use fileURLToPath() instead of .pathname to handle Windows drive letters correctly
107
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
102
108
  const localMcp = path.resolve(scriptDir, "../../mcp/dist/index.js");
103
109
  if (fs.existsSync(localMcp)) {
104
110
  return { mode: "local", path: localMcp };
@@ -122,4 +128,69 @@ export function resolveMcpServerPath() {
122
128
  export function resolveNodeBin() {
123
129
  return process.execPath;
124
130
  }
131
+ /**
132
+ * Extract auth credentials from existing kanon-mcp entries across all tool configs.
133
+ *
134
+ * Scans each tool in the registry that supports the current platform, reads its
135
+ * MCP config file, and looks for a "kanon-mcp" entry. Extracts KANON_API_URL and
136
+ * KANON_API_KEY from:
137
+ * - Direct mode: `entry.env.KANON_API_URL` / `entry.env.KANON_API_KEY`
138
+ * - WSL bridge mode: parses `entry.args` array for `KANON_API_URL=xxx` patterns
139
+ *
140
+ * Returns the first values found. Missing files/entries are handled gracefully.
141
+ */
142
+ export function extractExistingAuth(ctx) {
143
+ let apiUrl;
144
+ let apiKey;
145
+ for (const tool of toolRegistry) {
146
+ const platformPaths = tool.platforms[ctx.platform];
147
+ if (!platformPaths)
148
+ continue;
149
+ const configPath = platformPaths.config(ctx);
150
+ let config;
151
+ try {
152
+ const content = fs.readFileSync(configPath, "utf8");
153
+ config = JSON.parse(content);
154
+ }
155
+ catch {
156
+ // File doesn't exist or is invalid JSON — skip
157
+ continue;
158
+ }
159
+ const servers = config[tool.rootKey];
160
+ if (!servers)
161
+ continue;
162
+ const entry = servers["kanon-mcp"];
163
+ if (!entry)
164
+ continue;
165
+ // Try direct mode: env object
166
+ if (entry.env) {
167
+ if (!apiUrl && entry.env["KANON_API_URL"]) {
168
+ apiUrl = entry.env["KANON_API_URL"];
169
+ }
170
+ if (!apiKey && entry.env["KANON_API_KEY"]) {
171
+ apiKey = entry.env["KANON_API_KEY"];
172
+ }
173
+ }
174
+ // Try WSL bridge mode: parse args array for KEY=VALUE patterns
175
+ if (entry.args) {
176
+ for (const arg of entry.args) {
177
+ if (!apiUrl && arg.startsWith("KANON_API_URL=")) {
178
+ apiUrl = arg.slice("KANON_API_URL=".length);
179
+ }
180
+ if (!apiKey && arg.startsWith("KANON_API_KEY=")) {
181
+ apiKey = arg.slice("KANON_API_KEY=".length);
182
+ }
183
+ }
184
+ }
185
+ // Stop early if we have both values
186
+ if (apiUrl && apiKey)
187
+ break;
188
+ }
189
+ const result = {};
190
+ if (apiUrl)
191
+ result.apiUrl = apiUrl;
192
+ if (apiKey)
193
+ result.apiKey = apiKey;
194
+ return result;
195
+ }
125
196
  //# sourceMappingURL=mcp-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB,EAClB,OAAe,EACf,KAAqB;IAErB,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,MAAM,OAAO,GAAI,MAAM,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;IACnE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAE,6CAA6C;IACvE,OAAO,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,OAAe;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAwC,CAAC;IACvE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,IAAI,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC1B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAMD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAyB,EACzB,MAAc,EACd,MAAc,EACd,GAAoB,EACpB,OAAgB,EAChB,OAAe;IAEf,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC;IAExC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,6CAA6C;QAC7C,MAAM,OAAO,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC;aAC/C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,MAAM,GAAG,GAA2B,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;IAChC,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,YAAY,CAAC;YACpB,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB,GAAG;KACJ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,0CAA0C;IAC1C,qFAAqF;IACrF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAED,2CAA2C;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B,SAAS,EACT,gDAAgD,CACjD,CAAC;QACF,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,0DAA0D;IAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAoB;IAEpB,IAAI,MAA0B,CAAC;IAC/B,IAAI,MAA0B,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;YAC/C,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAEtB,CAAC;QACd,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAEpB,CAAC;QACd,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,8BAA8B;QAC9B,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1C,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1C,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAChD,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,CAAC;gBACD,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAChD,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,IAAI,MAAM;YAAE,MAAM;IAC9B,CAAC;IAED,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,10 +1,10 @@
1
- import type { ToolDefinition } from "./types.js";
1
+ import type { ToolDefinition, PlatformContext } from "./types.js";
2
2
  export declare const toolRegistry: ToolDefinition[];
3
3
  /**
4
4
  * Detect which tools are available on the system.
5
- * In WSL mode, Windows-native tools are detected via their wslDetect method.
5
+ * Uses the per-platform paths map to check support and run detection.
6
6
  */
7
- export declare function detectTools(wslMode: boolean, winHome?: string): Promise<ToolDefinition[]>;
7
+ export declare function detectTools(ctx: PlatformContext): Promise<ToolDefinition[]>;
8
8
  /**
9
9
  * Find a tool by name from the registry.
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,eAAO,MAAM,YAAY,EAAE,cAAc,EA8ExC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlE,eAAO,MAAM,YAAY,EAAE,cAAc,EA2HxC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAiB3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE"}
package/dist/registry.js CHANGED
@@ -1,99 +1,125 @@
1
1
  // ─── Tool Registry ───────────────────────────────────────────────────────────
2
2
  import fs from "node:fs";
3
- import os from "node:os";
4
3
  import { commandExists } from "./detect.js";
5
- const home = os.homedir();
6
4
  export const toolRegistry = [
7
5
  // ── Claude Code ──────────────────────────────────────────────────────
8
6
  {
9
7
  name: "claude-code",
10
8
  displayName: "Claude Code",
11
- configPath: () => `${home}/.claude.json`,
12
9
  rootKey: "mcpServers",
13
- detect: async () => {
14
- return fs.existsSync(`${home}/.claude`) || commandExists("claude");
15
- },
16
- skillDest: () => `${home}/.claude/skills`,
17
- workflowDest: () => `${home}/.claude/workflows`,
18
10
  templateSource: "claude-code-snippet.md",
19
- templateTarget: () => `${home}/.claude/CLAUDE.md`,
20
11
  templateMode: "marker-inject",
21
- isWindowsNative: false,
12
+ platforms: {
13
+ // Claude Code is NOT supported on win32 — no entry
14
+ wsl: {
15
+ detect: async (ctx) => fs.existsSync(`${ctx.homedir}/.claude`) ||
16
+ commandExists("claude", ctx.platform),
17
+ config: (ctx) => `${ctx.homedir}/.claude.json`,
18
+ skills: (ctx) => `${ctx.homedir}/.claude/skills`,
19
+ workflows: (ctx) => `${ctx.homedir}/.claude/workflows`,
20
+ template: (ctx) => `${ctx.homedir}/.claude/CLAUDE.md`,
21
+ mcpMode: "direct",
22
+ },
23
+ linux: {
24
+ detect: async (ctx) => fs.existsSync(`${ctx.homedir}/.claude`) ||
25
+ commandExists("claude", ctx.platform),
26
+ config: (ctx) => `${ctx.homedir}/.claude.json`,
27
+ skills: (ctx) => `${ctx.homedir}/.claude/skills`,
28
+ workflows: (ctx) => `${ctx.homedir}/.claude/workflows`,
29
+ template: (ctx) => `${ctx.homedir}/.claude/CLAUDE.md`,
30
+ mcpMode: "direct",
31
+ },
32
+ },
22
33
  },
23
34
  // ── Cursor ───────────────────────────────────────────────────────────
24
35
  {
25
36
  name: "cursor",
26
37
  displayName: "Cursor",
27
- configPath: (winHome) => {
28
- const base = winHome || home;
29
- return `${base}/.cursor/mcp.json`;
30
- },
31
38
  rootKey: "mcpServers",
32
- detect: async () => {
33
- return fs.existsSync(`${home}/.cursor`);
34
- },
35
- wslDetect: async (winHome) => {
36
- return fs.existsSync(`${winHome}/.cursor`);
37
- },
38
- skillDest: (winHome) => {
39
- const base = winHome || home;
40
- return `${base}/.cursor/skills`;
41
- },
42
- // Cursor has no global workflows
43
39
  templateSource: "cursor-rules.mdc",
44
- templateTarget: (winHome) => {
45
- const base = winHome || home;
46
- return `${base}/.cursor/rules/kanon.mdc`;
47
- },
48
40
  templateMode: "file-copy",
49
- isWindowsNative: true,
41
+ platforms: {
42
+ win32: {
43
+ detect: async (ctx) => {
44
+ const appData = ctx.appDataDir;
45
+ return !!appData && fs.existsSync(`${appData}\\Cursor\\User`);
46
+ },
47
+ config: (ctx) => {
48
+ const appData = ctx.appDataDir;
49
+ return `${appData}\\Cursor\\User\\mcp.json`;
50
+ },
51
+ skills: (ctx) => `${ctx.homedir}\\.cursor\\skills`,
52
+ template: (ctx) => `${ctx.homedir}\\.cursor\\rules\\kanon.mdc`,
53
+ mcpMode: "direct",
54
+ },
55
+ wsl: {
56
+ detect: async (ctx) => {
57
+ return !!ctx.winHome && fs.existsSync(`${ctx.winHome}/.cursor`);
58
+ },
59
+ config: (ctx) => `${ctx.winHome}/.cursor/mcp.json`,
60
+ skills: (ctx) => `${ctx.winHome}/.cursor/skills`,
61
+ template: (ctx) => `${ctx.winHome}/.cursor/rules/kanon.mdc`,
62
+ mcpMode: "wsl-bridge",
63
+ },
64
+ linux: {
65
+ detect: async (ctx) => fs.existsSync(`${ctx.homedir}/.cursor`),
66
+ config: (ctx) => `${ctx.homedir}/.cursor/mcp.json`,
67
+ skills: (ctx) => `${ctx.homedir}/.cursor/skills`,
68
+ template: (ctx) => `${ctx.homedir}/.cursor/rules/kanon.mdc`,
69
+ mcpMode: "direct",
70
+ },
71
+ },
50
72
  },
51
73
  // ── Antigravity (Gemini) ─────────────────────────────────────────────
52
74
  {
53
75
  name: "antigravity",
54
76
  displayName: "Antigravity",
55
- configPath: (winHome) => {
56
- const base = winHome || home;
57
- return `${base}/.gemini/antigravity/mcp_config.json`;
58
- },
59
77
  rootKey: "mcpServers",
60
- detect: async () => {
61
- return fs.existsSync(`${home}/.gemini`);
62
- },
63
- wslDetect: async (winHome) => {
64
- return fs.existsSync(`${winHome}/.gemini`);
65
- },
66
- skillDest: (winHome) => {
67
- const base = winHome || home;
68
- return `${base}/.gemini/antigravity/skills`;
69
- },
70
- workflowDest: (winHome) => {
71
- const base = winHome || home;
72
- return `${base}/.gemini/antigravity/global_workflows`;
73
- },
74
78
  templateSource: "gemini-instructions.md",
75
- templateTarget: (winHome) => {
76
- const base = winHome || home;
77
- return `${base}/.gemini/GEMINI.md`;
78
- },
79
79
  templateMode: "marker-inject",
80
- isWindowsNative: true,
80
+ platforms: {
81
+ win32: {
82
+ detect: async (ctx) => fs.existsSync(`${ctx.homedir}\\.gemini`),
83
+ config: (ctx) => `${ctx.homedir}\\.gemini\\antigravity\\mcp_config.json`,
84
+ skills: (ctx) => `${ctx.homedir}\\.gemini\\antigravity\\skills`,
85
+ workflows: (ctx) => `${ctx.homedir}\\.gemini\\antigravity\\global_workflows`,
86
+ template: (ctx) => `${ctx.homedir}\\.gemini\\GEMINI.md`,
87
+ mcpMode: "direct",
88
+ },
89
+ wsl: {
90
+ detect: async (ctx) => {
91
+ return !!ctx.winHome && fs.existsSync(`${ctx.winHome}/.gemini`);
92
+ },
93
+ config: (ctx) => `${ctx.winHome}/.gemini/antigravity/mcp_config.json`,
94
+ skills: (ctx) => `${ctx.winHome}/.gemini/antigravity/skills`,
95
+ workflows: (ctx) => `${ctx.winHome}/.gemini/antigravity/global_workflows`,
96
+ template: (ctx) => `${ctx.winHome}/.gemini/GEMINI.md`,
97
+ mcpMode: "wsl-bridge",
98
+ },
99
+ linux: {
100
+ detect: async (ctx) => fs.existsSync(`${ctx.homedir}/.gemini`),
101
+ config: (ctx) => `${ctx.homedir}/.gemini/antigravity/mcp_config.json`,
102
+ skills: (ctx) => `${ctx.homedir}/.gemini/antigravity/skills`,
103
+ workflows: (ctx) => `${ctx.homedir}/.gemini/antigravity/global_workflows`,
104
+ template: (ctx) => `${ctx.homedir}/.gemini/GEMINI.md`,
105
+ mcpMode: "direct",
106
+ },
107
+ },
81
108
  },
82
109
  ];
83
110
  /**
84
111
  * Detect which tools are available on the system.
85
- * In WSL mode, Windows-native tools are detected via their wslDetect method.
112
+ * Uses the per-platform paths map to check support and run detection.
86
113
  */
87
- export async function detectTools(wslMode, winHome) {
114
+ export async function detectTools(ctx) {
88
115
  const detected = [];
89
116
  for (const tool of toolRegistry) {
90
- let found = false;
91
- if (wslMode && tool.isWindowsNative && tool.wslDetect && winHome) {
92
- found = await tool.wslDetect(winHome);
93
- }
94
- else if (!tool.isWindowsNative || !wslMode) {
95
- found = await tool.detect();
117
+ const platformPaths = tool.platforms[ctx.platform];
118
+ if (!platformPaths) {
119
+ // Tool doesn't support this platform — skip silently
120
+ continue;
96
121
  }
122
+ const found = await platformPaths.detect(ctx);
97
123
  if (found) {
98
124
  detected.push(tool);
99
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,28 +1,53 @@
1
+ export type Platform = "win32" | "wsl" | "linux";
2
+ export interface PlatformContext {
3
+ platform: Platform;
4
+ homedir: string;
5
+ winHome?: string;
6
+ appDataDir?: string;
7
+ }
8
+ export type McpMode = "direct" | "wsl-bridge";
9
+ export interface PlatformPaths {
10
+ detect: (ctx: PlatformContext) => Promise<boolean>;
11
+ config: (ctx: PlatformContext) => string;
12
+ skills: (ctx: PlatformContext) => string;
13
+ workflows?: (ctx: PlatformContext) => string;
14
+ template: (ctx: PlatformContext) => string;
15
+ mcpMode: McpMode;
16
+ }
1
17
  export interface ToolDefinition {
2
18
  name: string;
3
19
  displayName: string;
4
- configPath: (winHome?: string) => string;
5
20
  rootKey: string;
6
- detect: () => Promise<boolean>;
7
- wslDetect?: (winHome: string) => Promise<boolean>;
8
- skillDest: (winHome?: string) => string;
9
- workflowDest?: (winHome?: string) => string;
10
21
  templateSource: string;
11
- templateTarget: (winHome?: string) => string;
12
22
  templateMode: "marker-inject" | "file-copy";
13
- isWindowsNative: boolean;
14
- }
15
- export interface SetupOptions {
16
- apiUrl: string;
17
- apiKey: string;
18
- tools: ToolDefinition[];
19
- remove: boolean;
20
- wslMode: boolean;
21
- winHome?: string;
23
+ platforms: Partial<Record<Platform, PlatformPaths>>;
22
24
  }
23
25
  export interface McpServerEntry {
24
26
  command: string;
25
27
  args: string[];
26
28
  env?: Record<string, string>;
27
29
  }
30
+ /** Source that resolved an auth field, for logging */
31
+ export type AuthSource = "flag" | "env" | "existing-config" | "auto-generated" | "prompt";
32
+ export interface AuthResult {
33
+ apiUrl: string;
34
+ apiKey: string;
35
+ urlSource: AuthSource;
36
+ keySource: AuthSource;
37
+ }
38
+ /** Injectable dependencies for resolveAuth — enables testing without mocks */
39
+ export interface AuthDeps {
40
+ extractExisting?: (ctx: PlatformContext) => {
41
+ apiUrl?: string;
42
+ apiKey?: string;
43
+ };
44
+ autoGenerateKey?: (apiUrl: string) => Promise<string | null>;
45
+ promptUrl?: () => Promise<string>;
46
+ promptKey?: () => Promise<string>;
47
+ fetchFn?: typeof globalThis.fetch;
48
+ }
49
+ export interface InteractiveOptions {
50
+ yes: boolean;
51
+ interactive: boolean;
52
+ }
28
53
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,YAAY,EAAE,eAAe,GAAG,WAAW,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,eAAe,GAAG,WAAW,CAAC;IAG5C,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAID,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,KAAK,GACL,iBAAiB,GACjB,gBAAgB,GAChB,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,EAAE,CAChB,GAAG,EAAE,eAAe,KACjB;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACnC;AAID,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanon-pm/setup",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Setup and configure Kanon AI tool integrations (Claude Code, Cursor, Antigravity)",
6
6
  "bin": {
@@ -18,6 +18,7 @@
18
18
  "assets/"
19
19
  ],
20
20
  "dependencies": {
21
+ "@inquirer/prompts": "^8.3.2",
21
22
  "chalk": "^5.3.0",
22
23
  "commander": "^12.0.0"
23
24
  },