@kanon-pm/setup 0.2.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/assets/.gitkeep +0 -0
- package/assets/skills/kanon-create-issue/SKILL.md +435 -0
- package/assets/skills/kanon-init/SKILL.md +363 -0
- package/assets/skills/kanon-mcp/SKILL.md +248 -0
- package/assets/skills/kanon-orchestrator-hooks/SKILL.md +43 -0
- package/assets/skills/kanon-roadmap/SKILL.md +466 -0
- package/assets/templates/claude-code-snippet.md +13 -0
- package/assets/templates/cursor-rules.mdc +29 -0
- package/assets/templates/gemini-instructions.md +19 -0
- package/assets/workflows/kanon-create-issue.md +9 -0
- package/assets/workflows/kanon-init.md +10 -0
- package/dist/auth.d.ts +14 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +33 -0
- package/dist/auth.js.map +1 -0
- package/dist/detect.d.ts +14 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +50 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/index.d.ts +5 -0
- package/dist/installers/index.d.ts.map +1 -0
- package/dist/installers/index.js +7 -0
- package/dist/installers/index.js.map +1 -0
- package/dist/mcp-config.d.ts +35 -0
- package/dist/mcp-config.d.ts.map +1 -0
- package/dist/mcp-config.js +125 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/registry.d.ts +12 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +109 -0
- package/dist/registry.js.map +1 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +56 -0
- package/dist/skills.js.map +1 -0
- package/dist/templates.d.ts +17 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +86 -0
- package/dist/templates.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/workflows.d.ts +12 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +61 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +29 -0
package/dist/detect.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// ─── Detection Utilities ─────────────────────────────────────────────────────
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
/**
|
|
5
|
+
* Check if running inside WSL by reading /proc/version.
|
|
6
|
+
*/
|
|
7
|
+
export function isWsl() {
|
|
8
|
+
try {
|
|
9
|
+
const version = fs.readFileSync("/proc/version", "utf8");
|
|
10
|
+
return /microsoft/i.test(version);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve Windows home directory from within WSL.
|
|
18
|
+
* Uses cmd.exe to get %USERNAME% and constructs /mnt/c/Users/<user>.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveWinHome() {
|
|
21
|
+
try {
|
|
22
|
+
const username = execSync('cmd.exe /c "echo %USERNAME%"', {
|
|
23
|
+
encoding: "utf8",
|
|
24
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
25
|
+
}).replace(/[\r\n]+/g, "");
|
|
26
|
+
if (!username)
|
|
27
|
+
return undefined;
|
|
28
|
+
const winHome = `/mnt/c/Users/${username}`;
|
|
29
|
+
if (fs.existsSync(winHome)) {
|
|
30
|
+
return winHome;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a command exists on the system.
|
|
40
|
+
*/
|
|
41
|
+
export function commandExists(cmd) {
|
|
42
|
+
try {
|
|
43
|
+
execSync(`which ${cmd}`, { stdio: ["pipe", "pipe", "pipe"] });
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ─── Kanon Setup ───────────────────────────────────────────────────────────────
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { isWsl, resolveWinHome } from "./detect.js";
|
|
6
|
+
import { resolveAuth } from "./auth.js";
|
|
7
|
+
import { detectTools, getToolByName } from "./registry.js";
|
|
8
|
+
import { buildMcpEntry, mergeConfig, removeConfig, resolveMcpServerPath, resolveNodeBin, } from "./mcp-config.js";
|
|
9
|
+
import { installSkills, removeSkills } from "./skills.js";
|
|
10
|
+
import { installTemplate, removeTemplate } from "./templates.js";
|
|
11
|
+
import { installWorkflows, removeWorkflows } from "./workflows.js";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
function getAssetsDir() {
|
|
16
|
+
// In dist: __dirname is dist/, assets are at ../assets/
|
|
17
|
+
const fromDist = path.resolve(__dirname, "../assets");
|
|
18
|
+
// In dev: __dirname is src/, assets are at ../assets/
|
|
19
|
+
const fromSrc = path.resolve(__dirname, "../assets");
|
|
20
|
+
// Both resolve to the same relative path
|
|
21
|
+
return fromDist || fromSrc;
|
|
22
|
+
}
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name("kanon-setup")
|
|
26
|
+
.version("0.2.0")
|
|
27
|
+
.description("Configure Kanon AI tool integrations — MCP servers, skills, templates, and workflows")
|
|
28
|
+
.option("--api-url <url>", "Kanon API URL")
|
|
29
|
+
.option("--api-key <key>", "Kanon API key")
|
|
30
|
+
.option("--tool <name>", "Target a specific tool (claude-code, cursor, antigravity)")
|
|
31
|
+
.option("--all", "Configure all detected tools")
|
|
32
|
+
.option("--remove", "Remove Kanon configuration from tools");
|
|
33
|
+
program.action(async (options) => {
|
|
34
|
+
try {
|
|
35
|
+
await run(options);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
39
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
async function run(options) {
|
|
44
|
+
const removeMode = options.remove === true;
|
|
45
|
+
const assetsDir = getAssetsDir();
|
|
46
|
+
// ── WSL Detection ──────────────────────────────────────────────────
|
|
47
|
+
const wslMode = isWsl();
|
|
48
|
+
let winHome;
|
|
49
|
+
if (wslMode) {
|
|
50
|
+
winHome = resolveWinHome();
|
|
51
|
+
if (winHome) {
|
|
52
|
+
console.log(chalk.cyan("[info]") +
|
|
53
|
+
` WSL detected — Windows home: ${chalk.bold(winHome)}`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(chalk.yellow("[warn]") +
|
|
57
|
+
" WSL detected but could not resolve Windows home directory");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
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) ────────────────────────────
|
|
89
|
+
let apiUrl = "";
|
|
90
|
+
let apiKey = "";
|
|
91
|
+
if (!removeMode) {
|
|
92
|
+
const auth = await resolveAuth({
|
|
93
|
+
apiUrl: options.apiUrl,
|
|
94
|
+
apiKey: options.apiKey,
|
|
95
|
+
});
|
|
96
|
+
apiUrl = auth.apiUrl;
|
|
97
|
+
apiKey = auth.apiKey;
|
|
98
|
+
}
|
|
99
|
+
// ── MCP Server Path ────────────────────────────────────────────────
|
|
100
|
+
const mcpResolution = resolveMcpServerPath();
|
|
101
|
+
const nodeBin = resolveNodeBin();
|
|
102
|
+
// ── Apply Configuration ────────────────────────────────────────────
|
|
103
|
+
console.log("");
|
|
104
|
+
if (removeMode) {
|
|
105
|
+
console.log(chalk.bold("Removing Kanon configuration from selected tools..."));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log(chalk.bold("Configuring Kanon for selected tools..."));
|
|
109
|
+
}
|
|
110
|
+
console.log("");
|
|
111
|
+
let successCount = 0;
|
|
112
|
+
for (const tool of selectedTools) {
|
|
113
|
+
const useWslPaths = wslMode && tool.isWindowsNative;
|
|
114
|
+
const pathArg = useWslPaths ? winHome : undefined;
|
|
115
|
+
if (removeMode) {
|
|
116
|
+
// ── Remove Mode ──────────────────────────────────────────────
|
|
117
|
+
const configPath = tool.configPath(pathArg);
|
|
118
|
+
const removed = removeConfig(configPath, tool.rootKey);
|
|
119
|
+
if (removed) {
|
|
120
|
+
console.log(chalk.green(" ✓") +
|
|
121
|
+
` Removed MCP config from ${chalk.bold(tool.displayName)}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log(chalk.yellow(" ⚠") +
|
|
125
|
+
` MCP config not found for ${tool.displayName} — nothing to remove`);
|
|
126
|
+
}
|
|
127
|
+
// Remove skills
|
|
128
|
+
const skillDir = tool.skillDest(pathArg);
|
|
129
|
+
const removedSkills = removeSkills(skillDir);
|
|
130
|
+
if (removedSkills.length > 0) {
|
|
131
|
+
console.log(chalk.green(" ✓") +
|
|
132
|
+
` Removed ${removedSkills.length} skills from ${chalk.bold(tool.displayName)}`);
|
|
133
|
+
}
|
|
134
|
+
// Remove template
|
|
135
|
+
const templatePath = tool.templateTarget(pathArg);
|
|
136
|
+
const removedTemplate = removeTemplate(templatePath, tool.templateMode);
|
|
137
|
+
if (removedTemplate) {
|
|
138
|
+
console.log(chalk.green(" ✓") +
|
|
139
|
+
` Removed template from ${chalk.bold(tool.displayName)}`);
|
|
140
|
+
}
|
|
141
|
+
// Remove workflows
|
|
142
|
+
if (tool.workflowDest) {
|
|
143
|
+
const wfDir = tool.workflowDest(pathArg);
|
|
144
|
+
const removedWfs = removeWorkflows(wfDir);
|
|
145
|
+
if (removedWfs.length > 0) {
|
|
146
|
+
console.log(chalk.green(" ✓") +
|
|
147
|
+
` Removed ${removedWfs.length} workflows from ${chalk.bold(tool.displayName)}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
successCount++;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// ── Install Mode ─────────────────────────────────────────────
|
|
154
|
+
const configPath = tool.configPath(pathArg);
|
|
155
|
+
const entry = buildMcpEntry(mcpResolution, apiUrl, apiKey, wslMode, tool.isWindowsNative, nodeBin);
|
|
156
|
+
// 1. MCP config
|
|
157
|
+
mergeConfig(configPath, tool.rootKey, entry);
|
|
158
|
+
console.log(chalk.green(" ✓") +
|
|
159
|
+
` Configured MCP for ${chalk.bold(tool.displayName)} (${configPath})`);
|
|
160
|
+
// 2. Skills
|
|
161
|
+
const skillDir = tool.skillDest(pathArg);
|
|
162
|
+
const installedSkills = installSkills(skillDir, assetsDir);
|
|
163
|
+
if (installedSkills.length > 0) {
|
|
164
|
+
console.log(chalk.green(" ✓") +
|
|
165
|
+
` Installed ${installedSkills.length} skills to ${chalk.cyan(skillDir)}`);
|
|
166
|
+
}
|
|
167
|
+
// 3. Template
|
|
168
|
+
const templatePath = tool.templateTarget(pathArg);
|
|
169
|
+
installTemplate(templatePath, tool.templateSource, assetsDir, tool.templateMode);
|
|
170
|
+
console.log(chalk.green(" ✓") +
|
|
171
|
+
` Installed template for ${chalk.bold(tool.displayName)} (${templatePath})`);
|
|
172
|
+
// 4. Workflows
|
|
173
|
+
if (tool.workflowDest) {
|
|
174
|
+
const wfDir = tool.workflowDest(pathArg);
|
|
175
|
+
const installedWfs = installWorkflows(wfDir, assetsDir);
|
|
176
|
+
if (installedWfs.length > 0) {
|
|
177
|
+
console.log(chalk.green(" ✓") +
|
|
178
|
+
` Installed ${installedWfs.length} workflows to ${chalk.cyan(wfDir)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
successCount++;
|
|
182
|
+
}
|
|
183
|
+
console.log("");
|
|
184
|
+
}
|
|
185
|
+
// ── Summary ────────────────────────────────────────────────────────
|
|
186
|
+
if (removeMode) {
|
|
187
|
+
console.log(chalk.green(`✓ Removed Kanon configuration from ${successCount} tool(s).`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log(chalk.green(`✓ Kanon configured for ${successCount} tool(s)!`));
|
|
191
|
+
console.log("");
|
|
192
|
+
console.log(` API URL: ${chalk.cyan(apiUrl)}`);
|
|
193
|
+
console.log(` MCP: ${chalk.cyan(mcpResolution.mode === "local" ? mcpResolution.path : "npx @kanon/mcp")}`);
|
|
194
|
+
console.log("");
|
|
195
|
+
console.log(chalk.yellow(" Restart your AI coding tool(s) to pick up the new configuration."));
|
|
196
|
+
}
|
|
197
|
+
console.log("");
|
|
198
|
+
}
|
|
199
|
+
program.parse();
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { mergeConfig, removeConfig, buildMcpEntry, type McpResolution } from "../mcp-config.js";
|
|
2
|
+
export { installSkills, removeSkills } from "../skills.js";
|
|
3
|
+
export { installTemplate, removeTemplate } from "../templates.js";
|
|
4
|
+
export { installWorkflows, removeWorkflows } from "../workflows.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ─── Installers ────────────────────────────────────────────────────────────────
|
|
2
|
+
// Re-exports from individual installer modules.
|
|
3
|
+
export { mergeConfig, removeConfig, buildMcpEntry } from "../mcp-config.js";
|
|
4
|
+
export { installSkills, removeSkills } from "../skills.js";
|
|
5
|
+
export { installTemplate, removeTemplate } from "../templates.js";
|
|
6
|
+
export { installWorkflows, removeWorkflows } from "../workflows.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,gDAAgD;AAEhD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAsB,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { McpServerEntry } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Merge a Kanon MCP server entry into a tool's JSON config file.
|
|
4
|
+
* Creates the file and parent directories if they don't exist.
|
|
5
|
+
* Idempotent — overwrites the "kanon-mcp" key without touching other servers.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mergeConfig(configPath: string, rootKey: string, entry: McpServerEntry): void;
|
|
8
|
+
/**
|
|
9
|
+
* Remove the "kanon-mcp" entry from a tool's JSON config.
|
|
10
|
+
* Returns true if the entry was found and removed, false otherwise.
|
|
11
|
+
*/
|
|
12
|
+
export declare function removeConfig(configPath: string, rootKey: string): boolean;
|
|
13
|
+
export type McpResolution = {
|
|
14
|
+
mode: "local";
|
|
15
|
+
path: string;
|
|
16
|
+
} | {
|
|
17
|
+
mode: "npx";
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
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.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildMcpEntry(resolution: McpResolution, apiUrl: string, apiKey: string, wslMode: boolean, isWindowsNative: boolean, nodeBin: string): McpServerEntry;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve how to invoke the Kanon MCP server.
|
|
27
|
+
* When running from the monorepo or with @kanon/mcp installed locally,
|
|
28
|
+
* returns a local path. Otherwise falls back to npx for dynamic resolution.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveMcpServerPath(): McpResolution;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the path to the node binary.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveNodeBin(): string;
|
|
35
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// ─── MCP Config Merger ───────────────────────────────────────────────────────
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Merge a Kanon MCP server entry into a tool's JSON config file.
|
|
6
|
+
* Creates the file and parent directories if they don't exist.
|
|
7
|
+
* Idempotent — overwrites the "kanon-mcp" key without touching other servers.
|
|
8
|
+
*/
|
|
9
|
+
export function mergeConfig(configPath, rootKey, entry) {
|
|
10
|
+
let config = {};
|
|
11
|
+
try {
|
|
12
|
+
const content = fs.readFileSync(configPath, "utf8");
|
|
13
|
+
config = JSON.parse(content);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// File doesn't exist or is invalid JSON — start fresh
|
|
17
|
+
}
|
|
18
|
+
const servers = config[rootKey] || {};
|
|
19
|
+
delete servers["kanon"]; // cleanup legacy entry from old setup-mcp.sh
|
|
20
|
+
servers["kanon-mcp"] = entry;
|
|
21
|
+
config[rootKey] = servers;
|
|
22
|
+
const dir = path.dirname(configPath);
|
|
23
|
+
if (!fs.existsSync(dir)) {
|
|
24
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Remove the "kanon-mcp" entry from a tool's JSON config.
|
|
30
|
+
* Returns true if the entry was found and removed, false otherwise.
|
|
31
|
+
*/
|
|
32
|
+
export function removeConfig(configPath, rootKey) {
|
|
33
|
+
if (!fs.existsSync(configPath)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
let config;
|
|
37
|
+
try {
|
|
38
|
+
const content = fs.readFileSync(configPath, "utf8");
|
|
39
|
+
config = JSON.parse(content);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const servers = config[rootKey];
|
|
45
|
+
if (!servers || !("kanon-mcp" in servers)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
delete servers["kanon-mcp"];
|
|
49
|
+
config[rootKey] = servers;
|
|
50
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 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
|
+
export function buildMcpEntry(resolution, apiUrl, apiKey, wslMode, isWindowsNative, nodeBin) {
|
|
59
|
+
const isNpx = resolution.mode === "npx";
|
|
60
|
+
if (wslMode && isWindowsNative) {
|
|
61
|
+
// Windows-native tools invoke via WSL
|
|
62
|
+
const envArgs = [`KANON_API_URL=${apiUrl}`];
|
|
63
|
+
if (apiKey) {
|
|
64
|
+
envArgs.push(`KANON_API_KEY=${apiKey}`);
|
|
65
|
+
}
|
|
66
|
+
if (isNpx) {
|
|
67
|
+
return {
|
|
68
|
+
command: "wsl",
|
|
69
|
+
args: ["env", ...envArgs, "npx", "@kanon/mcp"],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
command: "wsl",
|
|
74
|
+
args: ["env", ...envArgs, nodeBin, resolution.path],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const env = { KANON_API_URL: apiUrl };
|
|
78
|
+
if (apiKey) {
|
|
79
|
+
env["KANON_API_KEY"] = apiKey;
|
|
80
|
+
}
|
|
81
|
+
if (isNpx) {
|
|
82
|
+
return {
|
|
83
|
+
command: "npx",
|
|
84
|
+
args: ["@kanon/mcp"],
|
|
85
|
+
env,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
command: nodeBin,
|
|
90
|
+
args: [resolution.path],
|
|
91
|
+
env,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resolve how to invoke the Kanon MCP server.
|
|
96
|
+
* When running from the monorepo or with @kanon/mcp installed locally,
|
|
97
|
+
* returns a local path. Otherwise falls back to npx for dynamic resolution.
|
|
98
|
+
*/
|
|
99
|
+
export function resolveMcpServerPath() {
|
|
100
|
+
// Try to find the local monorepo MCP dist
|
|
101
|
+
const scriptDir = new URL(".", import.meta.url).pathname;
|
|
102
|
+
const localMcp = path.resolve(scriptDir, "../../mcp/dist/index.js");
|
|
103
|
+
if (fs.existsSync(localMcp)) {
|
|
104
|
+
return { mode: "local", path: localMcp };
|
|
105
|
+
}
|
|
106
|
+
// Fallback: try to find it in node_modules
|
|
107
|
+
try {
|
|
108
|
+
const resolved = path.resolve(scriptDir, "../../../node_modules/@kanon/mcp/dist/index.js");
|
|
109
|
+
if (fs.existsSync(resolved)) {
|
|
110
|
+
return { mode: "local", path: resolved };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore
|
|
115
|
+
}
|
|
116
|
+
// Final fallback — resolve dynamically via npx at runtime
|
|
117
|
+
return { mode: "npx" };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve the path to the node binary.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveNodeBin() {
|
|
123
|
+
return process.execPath;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../src/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolDefinition } from "./types.js";
|
|
2
|
+
export declare const toolRegistry: ToolDefinition[];
|
|
3
|
+
/**
|
|
4
|
+
* Detect which tools are available on the system.
|
|
5
|
+
* In WSL mode, Windows-native tools are detected via their wslDetect method.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectTools(wslMode: boolean, winHome?: string): Promise<ToolDefinition[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Find a tool by name from the registry.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getToolByName(name: string): ToolDefinition | undefined;
|
|
12
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// ─── Tool Registry ───────────────────────────────────────────────────────────
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { commandExists } from "./detect.js";
|
|
5
|
+
const home = os.homedir();
|
|
6
|
+
export const toolRegistry = [
|
|
7
|
+
// ── Claude Code ──────────────────────────────────────────────────────
|
|
8
|
+
{
|
|
9
|
+
name: "claude-code",
|
|
10
|
+
displayName: "Claude Code",
|
|
11
|
+
configPath: () => `${home}/.claude.json`,
|
|
12
|
+
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
|
+
templateSource: "claude-code-snippet.md",
|
|
19
|
+
templateTarget: () => `${home}/.claude/CLAUDE.md`,
|
|
20
|
+
templateMode: "marker-inject",
|
|
21
|
+
isWindowsNative: false,
|
|
22
|
+
},
|
|
23
|
+
// ── Cursor ───────────────────────────────────────────────────────────
|
|
24
|
+
{
|
|
25
|
+
name: "cursor",
|
|
26
|
+
displayName: "Cursor",
|
|
27
|
+
configPath: (winHome) => {
|
|
28
|
+
const base = winHome || home;
|
|
29
|
+
return `${base}/.cursor/mcp.json`;
|
|
30
|
+
},
|
|
31
|
+
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
|
+
templateSource: "cursor-rules.mdc",
|
|
44
|
+
templateTarget: (winHome) => {
|
|
45
|
+
const base = winHome || home;
|
|
46
|
+
return `${base}/.cursor/rules/kanon.mdc`;
|
|
47
|
+
},
|
|
48
|
+
templateMode: "file-copy",
|
|
49
|
+
isWindowsNative: true,
|
|
50
|
+
},
|
|
51
|
+
// ── Antigravity (Gemini) ─────────────────────────────────────────────
|
|
52
|
+
{
|
|
53
|
+
name: "antigravity",
|
|
54
|
+
displayName: "Antigravity",
|
|
55
|
+
configPath: (winHome) => {
|
|
56
|
+
const base = winHome || home;
|
|
57
|
+
return `${base}/.gemini/antigravity/mcp_config.json`;
|
|
58
|
+
},
|
|
59
|
+
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
|
+
templateSource: "gemini-instructions.md",
|
|
75
|
+
templateTarget: (winHome) => {
|
|
76
|
+
const base = winHome || home;
|
|
77
|
+
return `${base}/.gemini/GEMINI.md`;
|
|
78
|
+
},
|
|
79
|
+
templateMode: "marker-inject",
|
|
80
|
+
isWindowsNative: true,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Detect which tools are available on the system.
|
|
85
|
+
* In WSL mode, Windows-native tools are detected via their wslDetect method.
|
|
86
|
+
*/
|
|
87
|
+
export async function detectTools(wslMode, winHome) {
|
|
88
|
+
const detected = [];
|
|
89
|
+
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();
|
|
96
|
+
}
|
|
97
|
+
if (found) {
|
|
98
|
+
detected.push(tool);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return detected;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Find a tool by name from the registry.
|
|
105
|
+
*/
|
|
106
|
+
export function getToolByName(name) {
|
|
107
|
+
return toolRegistry.find((t) => t.name === name);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install product skills from assets directory to the tool's skill directory.
|
|
3
|
+
* Creates parent directories if needed. Idempotent — overwrites on re-run.
|
|
4
|
+
*/
|
|
5
|
+
export declare function installSkills(skillDest: string, assetsDir: string): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Remove Kanon product skill directories from the tool's skill directory.
|
|
8
|
+
* Returns the list of skills that were removed.
|
|
9
|
+
*/
|
|
10
|
+
export declare function removeSkills(skillDest: string): string[];
|
|
11
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B5E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAYxD"}
|