@knowledgine/cli 0.2.1 → 0.3.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/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +11 -15
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/deprecation-check.d.ts +7 -0
- package/dist/commands/deprecation-check.d.ts.map +1 -0
- package/dist/commands/deprecation-check.js +75 -0
- package/dist/commands/deprecation-check.js.map +1 -0
- package/dist/commands/explain.d.ts +10 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +252 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/feedback-suggest.d.ts +8 -0
- package/dist/commands/feedback-suggest.d.ts.map +1 -0
- package/dist/commands/feedback-suggest.js +43 -0
- package/dist/commands/feedback-suggest.js.map +1 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +1 -6
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +15 -2
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +42 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +1 -1
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/recall.d.ts +10 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +199 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +22 -3
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/serve.d.ts +8 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +60 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup-rules.d.ts +27 -0
- package/dist/commands/setup-rules.d.ts.map +1 -0
- package/dist/commands/setup-rules.js +309 -0
- package/dist/commands/setup-rules.js.map +1 -0
- package/dist/commands/setup-skills.d.ts +55 -0
- package/dist/commands/setup-skills.d.ts.map +1 -0
- package/dist/commands/setup-skills.js +356 -0
- package/dist/commands/setup-skills.js.map +1 -0
- package/dist/commands/setup.d.ts +14 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +103 -13
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/suggest.d.ts +11 -0
- package/dist/commands/suggest.d.ts.map +1 -0
- package/dist/commands/suggest.js +255 -0
- package/dist/commands/suggest.js.map +1 -0
- package/dist/commands/undeprecate.d.ts +5 -0
- package/dist/commands/undeprecate.d.ts.map +1 -0
- package/dist/commands/undeprecate.js +27 -0
- package/dist/commands/undeprecate.js.map +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.js +44 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/content-extractor.d.ts +8 -0
- package/dist/lib/content-extractor.d.ts.map +1 -0
- package/dist/lib/content-extractor.js +50 -0
- package/dist/lib/content-extractor.js.map +1 -0
- package/dist/lib/diff-parser.d.ts +14 -0
- package/dist/lib/diff-parser.d.ts.map +1 -0
- package/dist/lib/diff-parser.js +108 -0
- package/dist/lib/diff-parser.js.map +1 -0
- package/dist/lib/entity-extractor.d.ts +2 -0
- package/dist/lib/entity-extractor.d.ts.map +1 -1
- package/dist/lib/entity-extractor.js +13 -76
- package/dist/lib/entity-extractor.js.map +1 -1
- package/dist/lib/formatter.d.ts.map +1 -1
- package/dist/lib/formatter.js +1 -5
- package/dist/lib/formatter.js.map +1 -1
- package/dist/lib/ingest-watcher.d.ts.map +1 -1
- package/dist/lib/ingest-watcher.js +1 -0
- package/dist/lib/ingest-watcher.js.map +1 -1
- package/dist/lib/plugin-loader.d.ts.map +1 -1
- package/dist/lib/plugin-loader.js +3 -1
- package/dist/lib/plugin-loader.js.map +1 -1
- package/dist/lib/progress.d.ts +2 -0
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +4 -2
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/ui/box.d.ts.map +1 -1
- package/dist/lib/ui/box.js.map +1 -1
- package/dist/lib/ui/error-formatter.d.ts.map +1 -1
- package/dist/lib/ui/error-formatter.js +1 -3
- package/dist/lib/ui/error-formatter.js.map +1 -1
- package/dist/lib/ui/table.js +1 -1
- package/dist/lib/ui/table.js.map +1 -1
- package/dist/templates/rules/antigravity.d.ts +6 -0
- package/dist/templates/rules/antigravity.d.ts.map +1 -0
- package/dist/templates/rules/antigravity.js +30 -0
- package/dist/templates/rules/antigravity.js.map +1 -0
- package/dist/templates/rules/claude-code.d.ts +6 -0
- package/dist/templates/rules/claude-code.d.ts.map +1 -0
- package/dist/templates/rules/claude-code.js +32 -0
- package/dist/templates/rules/claude-code.js.map +1 -0
- package/dist/templates/rules/cline.d.ts +6 -0
- package/dist/templates/rules/cline.d.ts.map +1 -0
- package/dist/templates/rules/cline.js +35 -0
- package/dist/templates/rules/cline.js.map +1 -0
- package/dist/templates/rules/codex.d.ts +6 -0
- package/dist/templates/rules/codex.d.ts.map +1 -0
- package/dist/templates/rules/codex.js +37 -0
- package/dist/templates/rules/codex.js.map +1 -0
- package/dist/templates/rules/continue.d.ts +6 -0
- package/dist/templates/rules/continue.d.ts.map +1 -0
- package/dist/templates/rules/continue.js +31 -0
- package/dist/templates/rules/continue.js.map +1 -0
- package/dist/templates/rules/core-rules.d.ts +6 -0
- package/dist/templates/rules/core-rules.d.ts.map +1 -0
- package/dist/templates/rules/core-rules.js +33 -0
- package/dist/templates/rules/core-rules.js.map +1 -0
- package/dist/templates/rules/cursor.d.ts +6 -0
- package/dist/templates/rules/cursor.d.ts.map +1 -0
- package/dist/templates/rules/cursor.js +29 -0
- package/dist/templates/rules/cursor.js.map +1 -0
- package/dist/templates/rules/gemini.d.ts +6 -0
- package/dist/templates/rules/gemini.d.ts.map +1 -0
- package/dist/templates/rules/gemini.js +30 -0
- package/dist/templates/rules/gemini.js.map +1 -0
- package/dist/templates/rules/github-copilot.d.ts +6 -0
- package/dist/templates/rules/github-copilot.d.ts.map +1 -0
- package/dist/templates/rules/github-copilot.js +42 -0
- package/dist/templates/rules/github-copilot.js.map +1 -0
- package/dist/templates/rules/index.d.ts +13 -0
- package/dist/templates/rules/index.d.ts.map +1 -0
- package/dist/templates/rules/index.js +13 -0
- package/dist/templates/rules/index.js.map +1 -0
- package/dist/templates/rules/opencode.d.ts +6 -0
- package/dist/templates/rules/opencode.d.ts.map +1 -0
- package/dist/templates/rules/opencode.js +30 -0
- package/dist/templates/rules/opencode.js.map +1 -0
- package/dist/templates/rules/windsurf.d.ts +6 -0
- package/dist/templates/rules/windsurf.d.ts.map +1 -0
- package/dist/templates/rules/windsurf.js +24 -0
- package/dist/templates/rules/windsurf.js.map +1 -0
- package/dist/templates/rules/zed.d.ts +6 -0
- package/dist/templates/rules/zed.d.ts.map +1 -0
- package/dist/templates/rules/zed.js +34 -0
- package/dist/templates/rules/zed.js.map +1 -0
- package/dist/templates/skills/index.d.ts +26 -0
- package/dist/templates/skills/index.d.ts.map +1 -0
- package/dist/templates/skills/index.js +75 -0
- package/dist/templates/skills/index.js.map +1 -0
- package/dist/templates/skills/knowledgine-capture/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-capture/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-capture/references.js +414 -0
- package/dist/templates/skills/knowledgine-capture/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.js +97 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-debrief/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/references.js +140 -0
- package/dist/templates/skills/knowledgine-debrief/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.js +74 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-explain/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/references.js +183 -0
- package/dist/templates/skills/knowledgine-explain/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js +89 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-feedback/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/references.js +214 -0
- package/dist/templates/skills/knowledgine-feedback/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.js +107 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-ingest/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/references.js +243 -0
- package/dist/templates/skills/knowledgine-ingest/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.js +80 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.js +207 -0
- package/dist/templates/skills/knowledgine-recall/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js +86 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.js +121 -0
- package/dist/templates/skills/knowledgine-suggest/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js +94 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
import { existsSync, writeFileSync, mkdirSync } from "fs";
|
|
3
|
+
import * as p from "@clack/prompts";
|
|
4
|
+
import { colors, symbols } from "../lib/ui/index.js";
|
|
5
|
+
import { SKILL_NAMES, getSkillTemplate } from "../templates/skills/index.js";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Targets
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Sentinel used for unsupported targets — getSkillDir should never be called
|
|
10
|
+
// on them, but TypeScript requires the field to be present.
|
|
11
|
+
const unsupportedSkillDir = (_root) => {
|
|
12
|
+
throw new Error("This target does not support skills.");
|
|
13
|
+
};
|
|
14
|
+
export const SKILL_TARGETS = [
|
|
15
|
+
{
|
|
16
|
+
value: "claude-code",
|
|
17
|
+
label: "Claude Code",
|
|
18
|
+
description: "CLI agent for developers",
|
|
19
|
+
supported: true,
|
|
20
|
+
getSkillDir: (root) => join(root, ".claude", "skills"),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
value: "codex",
|
|
24
|
+
label: "Codex CLI",
|
|
25
|
+
description: "OpenAI's coding agent",
|
|
26
|
+
supported: true,
|
|
27
|
+
getSkillDir: (root) => join(root, "skills"),
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
value: "cursor",
|
|
31
|
+
label: "Cursor",
|
|
32
|
+
description: "AI-first code editor",
|
|
33
|
+
supported: true,
|
|
34
|
+
getSkillDir: (root) => join(root, ".cursor", "skills"),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
value: "windsurf",
|
|
38
|
+
label: "Windsurf",
|
|
39
|
+
description: "Codeium's AI IDE",
|
|
40
|
+
supported: true,
|
|
41
|
+
getSkillDir: (root) => join(root, ".windsurf", "skills"),
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
value: "cline",
|
|
45
|
+
label: "Cline",
|
|
46
|
+
description: "Cline VS Code extension",
|
|
47
|
+
supported: true,
|
|
48
|
+
getSkillDir: (root) => join(root, ".cline", "skills"),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
value: "github-copilot",
|
|
52
|
+
label: "GitHub Copilot CLI",
|
|
53
|
+
description: "AI pair programmer CLI",
|
|
54
|
+
supported: true,
|
|
55
|
+
getSkillDir: (root) => join(root, ".copilot", "skills"),
|
|
56
|
+
sharedDir: "copilot-skills",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
value: "vscode",
|
|
60
|
+
label: "VS Code",
|
|
61
|
+
description: "GitHub Copilot MCP",
|
|
62
|
+
supported: true,
|
|
63
|
+
getSkillDir: (root) => join(root, ".copilot", "skills"),
|
|
64
|
+
sharedDir: "copilot-skills",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
value: "gemini",
|
|
68
|
+
label: "Gemini CLI",
|
|
69
|
+
description: "Google's AI coding agent",
|
|
70
|
+
supported: true,
|
|
71
|
+
getSkillDir: (root) => join(root, ".gemini", "skills"),
|
|
72
|
+
sharedDir: "gemini-skills",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
value: "opencode",
|
|
76
|
+
label: "OpenCode",
|
|
77
|
+
description: "opencode.ai MCP configuration",
|
|
78
|
+
supported: true,
|
|
79
|
+
getSkillDir: (root) => join(root, ".opencode", "skills"),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
value: "antigravity",
|
|
83
|
+
label: "Antigravity",
|
|
84
|
+
description: "Google's AI development platform",
|
|
85
|
+
supported: true,
|
|
86
|
+
getSkillDir: (root) => join(root, ".gemini", "skills"),
|
|
87
|
+
sharedDir: "gemini-skills",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
value: "continue",
|
|
91
|
+
label: "Continue",
|
|
92
|
+
description: "Continue.dev MCP configuration",
|
|
93
|
+
supported: false,
|
|
94
|
+
getSkillDir: unsupportedSkillDir,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
value: "zed",
|
|
98
|
+
label: "Zed",
|
|
99
|
+
description: "High-performance editor",
|
|
100
|
+
supported: false,
|
|
101
|
+
getSkillDir: unsupportedSkillDir,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
value: "claude-desktop",
|
|
105
|
+
label: "Claude Desktop",
|
|
106
|
+
description: "Anthropic's desktop app",
|
|
107
|
+
supported: false,
|
|
108
|
+
getSkillDir: unsupportedSkillDir,
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// writeSkills
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Writes skill files (SKILL.md + references/) for a single target agent.
|
|
116
|
+
*
|
|
117
|
+
* When `dryRun` is true, the function computes what would be written and
|
|
118
|
+
* returns the result without touching the filesystem.
|
|
119
|
+
*
|
|
120
|
+
* When `force` is false (default) and the skill directory already exists,
|
|
121
|
+
* the write is skipped.
|
|
122
|
+
*/
|
|
123
|
+
export function writeSkills(target, projectRoot, skillNames, options) {
|
|
124
|
+
const { dryRun = false, force = false } = options;
|
|
125
|
+
const skillDir = target.getSkillDir(projectRoot);
|
|
126
|
+
// Guard: skip if the skill dir exists and force is not set
|
|
127
|
+
if (!force && existsSync(skillDir)) {
|
|
128
|
+
return {
|
|
129
|
+
target: target.label,
|
|
130
|
+
status: "skipped",
|
|
131
|
+
skillDir,
|
|
132
|
+
skillCount: 0,
|
|
133
|
+
note: "skill directory already exists; use --force to overwrite",
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (dryRun) {
|
|
137
|
+
return {
|
|
138
|
+
target: target.label,
|
|
139
|
+
status: "ok",
|
|
140
|
+
skillDir,
|
|
141
|
+
skillCount: skillNames.length,
|
|
142
|
+
note: "dry-run: no files written",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
let writtenCount = 0;
|
|
147
|
+
for (const name of skillNames) {
|
|
148
|
+
const template = getSkillTemplate(name);
|
|
149
|
+
const skillNameDir = join(skillDir, name);
|
|
150
|
+
const refsDir = join(skillNameDir, "references");
|
|
151
|
+
mkdirSync(skillNameDir, { recursive: true });
|
|
152
|
+
writeFileSync(join(skillNameDir, "SKILL.md"), template.skillMd, "utf-8");
|
|
153
|
+
mkdirSync(refsDir, { recursive: true });
|
|
154
|
+
for (const [filename, content] of Object.entries(template.references)) {
|
|
155
|
+
writeFileSync(join(refsDir, filename), content, "utf-8");
|
|
156
|
+
}
|
|
157
|
+
writtenCount++;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
target: target.label,
|
|
161
|
+
status: "ok",
|
|
162
|
+
skillDir,
|
|
163
|
+
skillCount: writtenCount,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
target: target.label,
|
|
169
|
+
status: "fail",
|
|
170
|
+
skillDir,
|
|
171
|
+
skillCount: 0,
|
|
172
|
+
error: error instanceof Error ? error.message : String(error),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// interactiveSkillsSetup
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
/**
|
|
180
|
+
* Interactive wizard for the "Skills" step of `kg setup`.
|
|
181
|
+
*
|
|
182
|
+
* @param projectRoot - Absolute path to the project root.
|
|
183
|
+
* @param preselectedMcpTargets - Agent values already chosen in the MCP step,
|
|
184
|
+
* used to pre-populate the multiselect.
|
|
185
|
+
*/
|
|
186
|
+
export async function interactiveSkillsSetup(projectRoot, preselectedMcpTargets) {
|
|
187
|
+
// Step 1: ask whether to install skills at all
|
|
188
|
+
const shouldInstall = await p.confirm({
|
|
189
|
+
message: "Install knowledgine skills to your AI tools?",
|
|
190
|
+
});
|
|
191
|
+
if (p.isCancel(shouldInstall) || !shouldInstall) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
// Step 2: select target agents
|
|
195
|
+
const supportedTargets = SKILL_TARGETS.filter((t) => t.supported);
|
|
196
|
+
const preselected = new Set(preselectedMcpTargets ?? []);
|
|
197
|
+
const selectedTargetsRaw = await p.multiselect({
|
|
198
|
+
message: "Which AI tools should receive the skills? (space to select, enter to confirm)",
|
|
199
|
+
options: SKILL_TARGETS.map((t) => ({
|
|
200
|
+
value: t.value,
|
|
201
|
+
label: t.label,
|
|
202
|
+
hint: t.supported ? t.description : `${t.description} (not supported yet)`,
|
|
203
|
+
})).filter((opt) => supportedTargets.some((st) => st.value === opt.value)),
|
|
204
|
+
initialValues: supportedTargets.filter((t) => preselected.has(t.value)).map((t) => t.value),
|
|
205
|
+
required: true,
|
|
206
|
+
});
|
|
207
|
+
if (p.isCancel(selectedTargetsRaw)) {
|
|
208
|
+
p.cancel("Skills setup cancelled.");
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const selectedTargetValues = selectedTargetsRaw;
|
|
212
|
+
// Step 3: choose skill set (all or individual selection)
|
|
213
|
+
const installMode = await p.select({
|
|
214
|
+
message: "Which skills to install?",
|
|
215
|
+
options: [
|
|
216
|
+
{
|
|
217
|
+
value: "all",
|
|
218
|
+
label: "All (recommended)",
|
|
219
|
+
hint: `${SKILL_NAMES.length} skills`,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
value: "select",
|
|
223
|
+
label: "Select individually...",
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
});
|
|
227
|
+
if (p.isCancel(installMode)) {
|
|
228
|
+
p.cancel("Skills setup cancelled.");
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
let skillsToInstall;
|
|
232
|
+
if (installMode === "select") {
|
|
233
|
+
const selectedSkillsRaw = await p.multiselect({
|
|
234
|
+
message: "Which skills to install? (space to select, enter to confirm)",
|
|
235
|
+
options: SKILL_NAMES.map((name) => ({ value: name, label: name })),
|
|
236
|
+
required: true,
|
|
237
|
+
});
|
|
238
|
+
if (p.isCancel(selectedSkillsRaw)) {
|
|
239
|
+
p.cancel("Skills setup cancelled.");
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
skillsToInstall = selectedSkillsRaw;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
skillsToInstall = [...SKILL_NAMES];
|
|
246
|
+
}
|
|
247
|
+
// Step 4: write skills, deduplicating shared directories
|
|
248
|
+
const results = [];
|
|
249
|
+
const writtenSharedDirs = new Set();
|
|
250
|
+
for (const targetValue of selectedTargetValues) {
|
|
251
|
+
const target = SKILL_TARGETS.find((t) => t.value === targetValue);
|
|
252
|
+
if (!target)
|
|
253
|
+
continue;
|
|
254
|
+
// Dedup: agents sharing the same physical directory (e.g. github-copilot + vscode)
|
|
255
|
+
if (target.sharedDir) {
|
|
256
|
+
if (writtenSharedDirs.has(target.sharedDir)) {
|
|
257
|
+
results.push({
|
|
258
|
+
target: target.label,
|
|
259
|
+
status: "skipped",
|
|
260
|
+
skillDir: target.getSkillDir(projectRoot),
|
|
261
|
+
skillCount: 0,
|
|
262
|
+
note: `shared with ${target.sharedDir} (already written)`,
|
|
263
|
+
});
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
writtenSharedDirs.add(target.sharedDir);
|
|
267
|
+
}
|
|
268
|
+
const s = p.spinner();
|
|
269
|
+
s.start(`Installing skills for ${target.label}...`);
|
|
270
|
+
const result = writeSkills(target, projectRoot, skillsToInstall, { force: false });
|
|
271
|
+
if (result.status === "ok") {
|
|
272
|
+
s.stop(`${symbols.success} ${colors.success(target.label)} — ${result.skillCount} skill(s) installed`);
|
|
273
|
+
}
|
|
274
|
+
else if (result.status === "skipped") {
|
|
275
|
+
s.stop(`${symbols.warning} ${colors.warning(target.label)} — skipped: ${result.note}`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
s.stop(`${symbols.error} ${colors.error(target.label)} — failed: ${result.error}`);
|
|
279
|
+
}
|
|
280
|
+
results.push(result);
|
|
281
|
+
}
|
|
282
|
+
// Summary note
|
|
283
|
+
const ok = results.filter((r) => r.status === "ok");
|
|
284
|
+
const skipped = results.filter((r) => r.status === "skipped");
|
|
285
|
+
const failed = results.filter((r) => r.status === "fail");
|
|
286
|
+
const summaryLines = [];
|
|
287
|
+
for (const r of ok) {
|
|
288
|
+
summaryLines.push(`${symbols.success} ${r.target} ${colors.dim(r.skillDir)} (${r.skillCount} skills)`);
|
|
289
|
+
}
|
|
290
|
+
for (const r of skipped) {
|
|
291
|
+
summaryLines.push(`${symbols.warning} ${r.target} ${colors.dim(r.note ?? "skipped")}`);
|
|
292
|
+
}
|
|
293
|
+
for (const r of failed) {
|
|
294
|
+
summaryLines.push(`${symbols.error} ${r.target} ${colors.dim(r.error ?? "unknown error")}`);
|
|
295
|
+
}
|
|
296
|
+
if (summaryLines.length > 0) {
|
|
297
|
+
const title = failed.length > 0
|
|
298
|
+
? `Skills: ${ok.length} installed, ${skipped.length} skipped, ${failed.length} failed`
|
|
299
|
+
: `Skills installed (${ok.length} agents)`;
|
|
300
|
+
p.note(summaryLines.join("\n"), title);
|
|
301
|
+
}
|
|
302
|
+
return results;
|
|
303
|
+
}
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
// nonInteractiveSkillsSetup
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
/**
|
|
308
|
+
* Non-interactive (scripted) variant used when `--target` is specified on the
|
|
309
|
+
* command line.
|
|
310
|
+
*
|
|
311
|
+
* @param target - Agent value string (e.g. "claude-code").
|
|
312
|
+
* @param projectRoot - Absolute path to the project root.
|
|
313
|
+
* @param options.write - When false (default) only prints a preview.
|
|
314
|
+
*/
|
|
315
|
+
export function nonInteractiveSkillsSetup(target, projectRoot, options) {
|
|
316
|
+
const skillTarget = SKILL_TARGETS.find((t) => t.value === target);
|
|
317
|
+
if (!skillTarget) {
|
|
318
|
+
console.error(`${symbols.error} Unknown target: ${target}. Supported: ${SKILL_TARGETS.filter((t) => t.supported)
|
|
319
|
+
.map((t) => t.value)
|
|
320
|
+
.join(", ")}`);
|
|
321
|
+
process.exitCode = 1;
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (!skillTarget.supported) {
|
|
325
|
+
console.error(`${symbols.error} Skills are not yet supported for ${skillTarget.label}.`);
|
|
326
|
+
process.exitCode = 1;
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const skillDir = skillTarget.getSkillDir(projectRoot);
|
|
330
|
+
if (!options.write) {
|
|
331
|
+
// Preview mode: list what would be written
|
|
332
|
+
console.error(`\n${colors.bold("Skills preview")} for ${colors.accent(skillTarget.label)}\n`);
|
|
333
|
+
console.error(`${colors.hint("Skill directory:")} ${skillDir}\n`);
|
|
334
|
+
for (const name of SKILL_NAMES) {
|
|
335
|
+
const template = getSkillTemplate(name);
|
|
336
|
+
const refCount = Object.keys(template.references).length;
|
|
337
|
+
console.error(` ${symbols.bullet} ${name} ${colors.dim(`(SKILL.md + ${refCount} reference file(s))`)}`);
|
|
338
|
+
}
|
|
339
|
+
console.error("");
|
|
340
|
+
console.error(`${symbols.arrow} ${colors.hint(`To write: kg setup skills --target ${target} --write`)}`);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
// Write mode
|
|
344
|
+
const result = writeSkills(skillTarget, projectRoot, [...SKILL_NAMES], { force: false });
|
|
345
|
+
if (result.status === "ok") {
|
|
346
|
+
console.error(`${symbols.success} ${colors.success(`Skills written to ${result.skillDir}`)} (${result.skillCount} skills)`);
|
|
347
|
+
}
|
|
348
|
+
else if (result.status === "skipped") {
|
|
349
|
+
console.error(`${symbols.warning} ${colors.warning("Skipped:")} ${result.note}`);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
console.error(`${symbols.error} ${colors.error("Failed:")} ${result.error}`);
|
|
353
|
+
process.exitCode = 1;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=setup-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/commands/setup-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export interface SetupOptions {
|
|
|
3
3
|
path?: string;
|
|
4
4
|
dryRun?: boolean;
|
|
5
5
|
write?: boolean;
|
|
6
|
+
rules?: boolean;
|
|
7
|
+
skills?: boolean;
|
|
6
8
|
}
|
|
7
9
|
export declare const TARGETS: readonly [{
|
|
8
10
|
readonly value: "claude-desktop";
|
|
@@ -44,6 +46,18 @@ export declare const TARGETS: readonly [{
|
|
|
44
46
|
readonly value: "antigravity";
|
|
45
47
|
readonly label: "Antigravity";
|
|
46
48
|
readonly description: "Google's AI development platform";
|
|
49
|
+
}, {
|
|
50
|
+
readonly value: "opencode";
|
|
51
|
+
readonly label: "OpenCode";
|
|
52
|
+
readonly description: "opencode.ai MCP configuration";
|
|
53
|
+
}, {
|
|
54
|
+
readonly value: "cline";
|
|
55
|
+
readonly label: "Cline";
|
|
56
|
+
readonly description: "Cline VS Code extension MCP configuration";
|
|
57
|
+
}, {
|
|
58
|
+
readonly value: "continue";
|
|
59
|
+
readonly label: "Continue";
|
|
60
|
+
readonly description: "Continue.dev MCP configuration";
|
|
47
61
|
}];
|
|
48
62
|
export declare function getConfigPath(target: string): string;
|
|
49
63
|
export declare function getTargetLabel(target: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcV,CAAC;AAOX,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6FpD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrD;AAqHD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAMlF,CAAC;AAqJF,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoIf"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -5,6 +5,8 @@ import { resolveDefaultPath } from "@knowledgine/core";
|
|
|
5
5
|
import { createBox, colors, symbols } from "../lib/ui/index.js";
|
|
6
6
|
import * as p from "@clack/prompts";
|
|
7
7
|
import * as TOML from "smol-toml";
|
|
8
|
+
import { interactiveRulesSetup, nonInteractiveRulesSetup } from "./setup-rules.js";
|
|
9
|
+
import { interactiveSkillsSetup, nonInteractiveSkillsSetup } from "./setup-skills.js";
|
|
8
10
|
export const TARGETS = [
|
|
9
11
|
{ value: "claude-desktop", label: "Claude Desktop", description: "Anthropic's desktop app" },
|
|
10
12
|
{ value: "cursor", label: "Cursor", description: "AI-first code editor" },
|
|
@@ -16,6 +18,9 @@ export const TARGETS = [
|
|
|
16
18
|
{ value: "github-copilot", label: "GitHub Copilot CLI", description: "AI pair programmer CLI" },
|
|
17
19
|
{ value: "gemini", label: "Gemini CLI", description: "Google's AI coding agent" },
|
|
18
20
|
{ value: "antigravity", label: "Antigravity", description: "Google's AI development platform" },
|
|
21
|
+
{ value: "opencode", label: "OpenCode", description: "opencode.ai MCP configuration" },
|
|
22
|
+
{ value: "cline", label: "Cline", description: "Cline VS Code extension MCP configuration" },
|
|
23
|
+
{ value: "continue", label: "Continue", description: "Continue.dev MCP configuration" },
|
|
19
24
|
];
|
|
20
25
|
// Zed uses "context_servers" key instead of "mcpServers"
|
|
21
26
|
const ZED_MCP_KEY = "context_servers";
|
|
@@ -60,6 +65,19 @@ export function getConfigPath(target) {
|
|
|
60
65
|
return join(home, ".gemini", "settings.json");
|
|
61
66
|
case "antigravity":
|
|
62
67
|
return join(home, ".gemini", "antigravity", "mcp_config.json");
|
|
68
|
+
case "opencode":
|
|
69
|
+
return join(home, ".config", "opencode", "config.json");
|
|
70
|
+
case "cline":
|
|
71
|
+
switch (process.platform) {
|
|
72
|
+
case "darwin":
|
|
73
|
+
return join(home, "Library", "Application Support", "Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json");
|
|
74
|
+
case "win32":
|
|
75
|
+
return join(appdata, "Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json");
|
|
76
|
+
default:
|
|
77
|
+
return join(home, ".config", "Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json");
|
|
78
|
+
}
|
|
79
|
+
case "continue":
|
|
80
|
+
return join(home, ".continue", "config.json");
|
|
63
81
|
default:
|
|
64
82
|
throw new Error(`Unknown target: ${target}. Supported: ${TARGETS.map((t) => t.value).join(", ")}`);
|
|
65
83
|
}
|
|
@@ -137,7 +155,9 @@ function writeConfig(configPath, config, target) {
|
|
|
137
155
|
try {
|
|
138
156
|
existing = TOML.parse(readFileSync(configPath, "utf-8"));
|
|
139
157
|
}
|
|
140
|
-
catch {
|
|
158
|
+
catch {
|
|
159
|
+
/* start fresh */
|
|
160
|
+
}
|
|
141
161
|
}
|
|
142
162
|
existing["mcp_servers"] = {
|
|
143
163
|
...(existing["mcp_servers"] ?? {}),
|
|
@@ -155,7 +175,9 @@ function writeConfig(configPath, config, target) {
|
|
|
155
175
|
try {
|
|
156
176
|
existing = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
157
177
|
}
|
|
158
|
-
catch {
|
|
178
|
+
catch {
|
|
179
|
+
/* start fresh */
|
|
180
|
+
}
|
|
159
181
|
}
|
|
160
182
|
existing[mcpKey] = {
|
|
161
183
|
...(existing[mcpKey] ?? {}),
|
|
@@ -244,7 +266,9 @@ async function interactiveSetup(rootPath) {
|
|
|
244
266
|
const mergedConfig = mergeConfig(existingConfig, rootPath);
|
|
245
267
|
writeConfig(configPath, mergedConfig, target);
|
|
246
268
|
s.stop(`${symbols.success} ${colors.success(targetLabel)} configured (${actualScope})`);
|
|
247
|
-
const note = !useProject && scope === "project"
|
|
269
|
+
const note = !useProject && scope === "project"
|
|
270
|
+
? "project config not supported, used global"
|
|
271
|
+
: undefined;
|
|
248
272
|
results.push({ target, status: "ok", configPath, note });
|
|
249
273
|
}
|
|
250
274
|
catch (error) {
|
|
@@ -253,7 +277,7 @@ async function interactiveSetup(rootPath) {
|
|
|
253
277
|
results.push({ target, status: "fail", configPath: "", error: msg });
|
|
254
278
|
}
|
|
255
279
|
}
|
|
256
|
-
// Summary
|
|
280
|
+
// MCP Summary
|
|
257
281
|
const ok = results.filter((r) => r.status === "ok");
|
|
258
282
|
const fail = results.filter((r) => r.status === "fail");
|
|
259
283
|
if (ok.length > 0) {
|
|
@@ -261,11 +285,35 @@ async function interactiveSetup(rootPath) {
|
|
|
261
285
|
const extra = r.note ? ` ${colors.dim(`(${r.note})`)}` : "";
|
|
262
286
|
return `${symbols.success} ${getTargetLabel(r.target)} ${colors.dim(r.configPath)}${extra}`;
|
|
263
287
|
});
|
|
264
|
-
p.note(lines.join("\n"), "Configured");
|
|
288
|
+
p.note(lines.join("\n"), "MCP Configured");
|
|
265
289
|
}
|
|
266
290
|
if (fail.length > 0) {
|
|
267
291
|
const lines = fail.map((r) => `${symbols.error} ${getTargetLabel(r.target)} ${colors.dim(r.error ?? "")}`);
|
|
268
|
-
p.note(lines.join("\n"), "Failed");
|
|
292
|
+
p.note(lines.join("\n"), "MCP Failed");
|
|
293
|
+
}
|
|
294
|
+
// Step 4: Agent Rules
|
|
295
|
+
const ruleResults = await interactiveRulesSetup(rootPath, targets);
|
|
296
|
+
// Step 5: Agent Skills
|
|
297
|
+
const skillResults = await interactiveSkillsSetup(rootPath, targets);
|
|
298
|
+
// Final Summary
|
|
299
|
+
const summaryLines = [];
|
|
300
|
+
if (ok.length > 0) {
|
|
301
|
+
summaryLines.push(`MCP: ${ok.map((r) => getTargetLabel(r.target)).join(", ")}`);
|
|
302
|
+
}
|
|
303
|
+
if (ruleResults.length > 0) {
|
|
304
|
+
const ruleOk = ruleResults.filter((r) => r.status === "ok");
|
|
305
|
+
if (ruleOk.length > 0) {
|
|
306
|
+
summaryLines.push(`Rules: ${ruleOk.map((r) => r.target).join(", ")}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (skillResults.length > 0) {
|
|
310
|
+
const skillOk = skillResults.filter((r) => r.status === "ok");
|
|
311
|
+
if (skillOk.length > 0) {
|
|
312
|
+
summaryLines.push(`Skills: ${skillOk.map((r) => `${r.target} (${r.skillCount} skills)`).join(", ")}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (summaryLines.length > 0) {
|
|
316
|
+
p.note(summaryLines.join("\n"), "Summary");
|
|
269
317
|
}
|
|
270
318
|
p.outro(`${colors.success("Setup complete!")} Restart your AI tools to activate knowledgine.`);
|
|
271
319
|
}
|
|
@@ -274,15 +322,46 @@ export async function setupCommand(options, ioOrCommand) {
|
|
|
274
322
|
const io = ioOrCommand && typeof ioOrCommand.isTTY === "boolean"
|
|
275
323
|
? ioOrCommand
|
|
276
324
|
: undefined;
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
325
|
+
// For --rules and --skills, default to cwd (project root), not knowledge base path
|
|
326
|
+
const rulesOrSkillsOnly = options.rules || options.skills;
|
|
327
|
+
const rootPath = rulesOrSkillsOnly
|
|
328
|
+
? options.path
|
|
329
|
+
? resolve(options.path)
|
|
330
|
+
: process.cwd()
|
|
331
|
+
: resolveDefaultPath(options.path);
|
|
332
|
+
// --rules and --skills don't require knowledgine init
|
|
333
|
+
const needsInit = !rulesOrSkillsOnly;
|
|
334
|
+
if (needsInit) {
|
|
335
|
+
const knowledgineDir = resolve(rootPath, ".knowledgine");
|
|
336
|
+
if (!existsSync(knowledgineDir)) {
|
|
337
|
+
console.error(`${symbols.error} Not initialized. Run 'knowledgine init --path ${rootPath}' first.`);
|
|
338
|
+
process.exitCode = 1;
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
283
341
|
}
|
|
284
342
|
// Interactive mode when no --target specified
|
|
285
343
|
if (!options.target) {
|
|
344
|
+
// --rules or --skills only (no --target) → use cwd as project root
|
|
345
|
+
if (options.rules) {
|
|
346
|
+
const tty = io ? io.isTTY : isTTY();
|
|
347
|
+
if (!tty) {
|
|
348
|
+
console.error("Error: --target is required in non-interactive mode.");
|
|
349
|
+
process.exitCode = 1;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
await interactiveRulesSetup(rootPath);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
if (options.skills) {
|
|
356
|
+
const tty = io ? io.isTTY : isTTY();
|
|
357
|
+
if (!tty) {
|
|
358
|
+
console.error("Error: --target is required in non-interactive mode.");
|
|
359
|
+
process.exitCode = 1;
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
await interactiveSkillsSetup(rootPath);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
286
365
|
const tty = io ? io.isTTY : isTTY();
|
|
287
366
|
if (!tty) {
|
|
288
367
|
console.error("Error: --target is required in non-interactive mode.");
|
|
@@ -294,9 +373,20 @@ export async function setupCommand(options, ioOrCommand) {
|
|
|
294
373
|
return;
|
|
295
374
|
}
|
|
296
375
|
const target = options.target;
|
|
376
|
+
const shouldWrite = options.write === true;
|
|
377
|
+
// Non-interactive: --rules flag
|
|
378
|
+
if (options.rules) {
|
|
379
|
+
nonInteractiveRulesSetup(target, rootPath, { write: shouldWrite });
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
// Non-interactive: --skills flag
|
|
383
|
+
if (options.skills) {
|
|
384
|
+
nonInteractiveSkillsSetup(target, rootPath, { write: shouldWrite });
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
// Non-interactive: MCP setup (default)
|
|
297
388
|
const configPath = getConfigPath(target);
|
|
298
389
|
const targetLabel = getTargetLabel(target);
|
|
299
|
-
const shouldWrite = options.write === true;
|
|
300
390
|
let existingConfig;
|
|
301
391
|
try {
|
|
302
392
|
existingConfig = readExistingConfig(configPath, target);
|