@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.
Files changed (213) hide show
  1. package/dist/commands/capture.d.ts.map +1 -1
  2. package/dist/commands/capture.js +11 -15
  3. package/dist/commands/capture.js.map +1 -1
  4. package/dist/commands/deprecation-check.d.ts +7 -0
  5. package/dist/commands/deprecation-check.d.ts.map +1 -0
  6. package/dist/commands/deprecation-check.js +75 -0
  7. package/dist/commands/deprecation-check.js.map +1 -0
  8. package/dist/commands/explain.d.ts +10 -0
  9. package/dist/commands/explain.d.ts.map +1 -0
  10. package/dist/commands/explain.js +252 -0
  11. package/dist/commands/explain.js.map +1 -0
  12. package/dist/commands/feedback-suggest.d.ts +8 -0
  13. package/dist/commands/feedback-suggest.d.ts.map +1 -0
  14. package/dist/commands/feedback-suggest.js +43 -0
  15. package/dist/commands/feedback-suggest.js.map +1 -0
  16. package/dist/commands/feedback.d.ts.map +1 -1
  17. package/dist/commands/feedback.js +1 -6
  18. package/dist/commands/feedback.js.map +1 -1
  19. package/dist/commands/ingest.d.ts.map +1 -1
  20. package/dist/commands/ingest.js +15 -2
  21. package/dist/commands/ingest.js.map +1 -1
  22. package/dist/commands/init.d.ts +2 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +42 -5
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/plugins.d.ts.map +1 -1
  27. package/dist/commands/plugins.js +1 -1
  28. package/dist/commands/plugins.js.map +1 -1
  29. package/dist/commands/recall.d.ts +10 -0
  30. package/dist/commands/recall.d.ts.map +1 -0
  31. package/dist/commands/recall.js +199 -0
  32. package/dist/commands/recall.js.map +1 -0
  33. package/dist/commands/search.d.ts +3 -0
  34. package/dist/commands/search.d.ts.map +1 -1
  35. package/dist/commands/search.js +22 -3
  36. package/dist/commands/search.js.map +1 -1
  37. package/dist/commands/serve.d.ts +8 -0
  38. package/dist/commands/serve.d.ts.map +1 -0
  39. package/dist/commands/serve.js +60 -0
  40. package/dist/commands/serve.js.map +1 -0
  41. package/dist/commands/setup-rules.d.ts +27 -0
  42. package/dist/commands/setup-rules.d.ts.map +1 -0
  43. package/dist/commands/setup-rules.js +309 -0
  44. package/dist/commands/setup-rules.js.map +1 -0
  45. package/dist/commands/setup-skills.d.ts +55 -0
  46. package/dist/commands/setup-skills.d.ts.map +1 -0
  47. package/dist/commands/setup-skills.js +356 -0
  48. package/dist/commands/setup-skills.js.map +1 -0
  49. package/dist/commands/setup.d.ts +14 -0
  50. package/dist/commands/setup.d.ts.map +1 -1
  51. package/dist/commands/setup.js +103 -13
  52. package/dist/commands/setup.js.map +1 -1
  53. package/dist/commands/start.d.ts.map +1 -1
  54. package/dist/commands/start.js.map +1 -1
  55. package/dist/commands/status.js +1 -1
  56. package/dist/commands/status.js.map +1 -1
  57. package/dist/commands/suggest.d.ts +11 -0
  58. package/dist/commands/suggest.d.ts.map +1 -0
  59. package/dist/commands/suggest.js +255 -0
  60. package/dist/commands/suggest.js.map +1 -0
  61. package/dist/commands/undeprecate.d.ts +5 -0
  62. package/dist/commands/undeprecate.d.ts.map +1 -0
  63. package/dist/commands/undeprecate.js +27 -0
  64. package/dist/commands/undeprecate.js.map +1 -0
  65. package/dist/commands/upgrade.d.ts.map +1 -1
  66. package/dist/commands/upgrade.js.map +1 -1
  67. package/dist/index.js +44 -6
  68. package/dist/index.js.map +1 -1
  69. package/dist/lib/content-extractor.d.ts +8 -0
  70. package/dist/lib/content-extractor.d.ts.map +1 -0
  71. package/dist/lib/content-extractor.js +50 -0
  72. package/dist/lib/content-extractor.js.map +1 -0
  73. package/dist/lib/diff-parser.d.ts +14 -0
  74. package/dist/lib/diff-parser.d.ts.map +1 -0
  75. package/dist/lib/diff-parser.js +108 -0
  76. package/dist/lib/diff-parser.js.map +1 -0
  77. package/dist/lib/entity-extractor.d.ts +2 -0
  78. package/dist/lib/entity-extractor.d.ts.map +1 -1
  79. package/dist/lib/entity-extractor.js +13 -76
  80. package/dist/lib/entity-extractor.js.map +1 -1
  81. package/dist/lib/formatter.d.ts.map +1 -1
  82. package/dist/lib/formatter.js +1 -5
  83. package/dist/lib/formatter.js.map +1 -1
  84. package/dist/lib/ingest-watcher.d.ts.map +1 -1
  85. package/dist/lib/ingest-watcher.js +1 -0
  86. package/dist/lib/ingest-watcher.js.map +1 -1
  87. package/dist/lib/plugin-loader.d.ts.map +1 -1
  88. package/dist/lib/plugin-loader.js +3 -1
  89. package/dist/lib/plugin-loader.js.map +1 -1
  90. package/dist/lib/progress.d.ts +2 -0
  91. package/dist/lib/progress.d.ts.map +1 -1
  92. package/dist/lib/progress.js +4 -2
  93. package/dist/lib/progress.js.map +1 -1
  94. package/dist/lib/ui/box.d.ts.map +1 -1
  95. package/dist/lib/ui/box.js.map +1 -1
  96. package/dist/lib/ui/error-formatter.d.ts.map +1 -1
  97. package/dist/lib/ui/error-formatter.js +1 -3
  98. package/dist/lib/ui/error-formatter.js.map +1 -1
  99. package/dist/lib/ui/table.js +1 -1
  100. package/dist/lib/ui/table.js.map +1 -1
  101. package/dist/templates/rules/antigravity.d.ts +6 -0
  102. package/dist/templates/rules/antigravity.d.ts.map +1 -0
  103. package/dist/templates/rules/antigravity.js +30 -0
  104. package/dist/templates/rules/antigravity.js.map +1 -0
  105. package/dist/templates/rules/claude-code.d.ts +6 -0
  106. package/dist/templates/rules/claude-code.d.ts.map +1 -0
  107. package/dist/templates/rules/claude-code.js +32 -0
  108. package/dist/templates/rules/claude-code.js.map +1 -0
  109. package/dist/templates/rules/cline.d.ts +6 -0
  110. package/dist/templates/rules/cline.d.ts.map +1 -0
  111. package/dist/templates/rules/cline.js +35 -0
  112. package/dist/templates/rules/cline.js.map +1 -0
  113. package/dist/templates/rules/codex.d.ts +6 -0
  114. package/dist/templates/rules/codex.d.ts.map +1 -0
  115. package/dist/templates/rules/codex.js +37 -0
  116. package/dist/templates/rules/codex.js.map +1 -0
  117. package/dist/templates/rules/continue.d.ts +6 -0
  118. package/dist/templates/rules/continue.d.ts.map +1 -0
  119. package/dist/templates/rules/continue.js +31 -0
  120. package/dist/templates/rules/continue.js.map +1 -0
  121. package/dist/templates/rules/core-rules.d.ts +6 -0
  122. package/dist/templates/rules/core-rules.d.ts.map +1 -0
  123. package/dist/templates/rules/core-rules.js +33 -0
  124. package/dist/templates/rules/core-rules.js.map +1 -0
  125. package/dist/templates/rules/cursor.d.ts +6 -0
  126. package/dist/templates/rules/cursor.d.ts.map +1 -0
  127. package/dist/templates/rules/cursor.js +29 -0
  128. package/dist/templates/rules/cursor.js.map +1 -0
  129. package/dist/templates/rules/gemini.d.ts +6 -0
  130. package/dist/templates/rules/gemini.d.ts.map +1 -0
  131. package/dist/templates/rules/gemini.js +30 -0
  132. package/dist/templates/rules/gemini.js.map +1 -0
  133. package/dist/templates/rules/github-copilot.d.ts +6 -0
  134. package/dist/templates/rules/github-copilot.d.ts.map +1 -0
  135. package/dist/templates/rules/github-copilot.js +42 -0
  136. package/dist/templates/rules/github-copilot.js.map +1 -0
  137. package/dist/templates/rules/index.d.ts +13 -0
  138. package/dist/templates/rules/index.d.ts.map +1 -0
  139. package/dist/templates/rules/index.js +13 -0
  140. package/dist/templates/rules/index.js.map +1 -0
  141. package/dist/templates/rules/opencode.d.ts +6 -0
  142. package/dist/templates/rules/opencode.d.ts.map +1 -0
  143. package/dist/templates/rules/opencode.js +30 -0
  144. package/dist/templates/rules/opencode.js.map +1 -0
  145. package/dist/templates/rules/windsurf.d.ts +6 -0
  146. package/dist/templates/rules/windsurf.d.ts.map +1 -0
  147. package/dist/templates/rules/windsurf.js +24 -0
  148. package/dist/templates/rules/windsurf.js.map +1 -0
  149. package/dist/templates/rules/zed.d.ts +6 -0
  150. package/dist/templates/rules/zed.d.ts.map +1 -0
  151. package/dist/templates/rules/zed.js +34 -0
  152. package/dist/templates/rules/zed.js.map +1 -0
  153. package/dist/templates/skills/index.d.ts +26 -0
  154. package/dist/templates/skills/index.d.ts.map +1 -0
  155. package/dist/templates/skills/index.js +75 -0
  156. package/dist/templates/skills/index.js.map +1 -0
  157. package/dist/templates/skills/knowledgine-capture/references.d.ts +2 -0
  158. package/dist/templates/skills/knowledgine-capture/references.d.ts.map +1 -0
  159. package/dist/templates/skills/knowledgine-capture/references.js +414 -0
  160. package/dist/templates/skills/knowledgine-capture/references.js.map +1 -0
  161. package/dist/templates/skills/knowledgine-capture/skill-md.d.ts +2 -0
  162. package/dist/templates/skills/knowledgine-capture/skill-md.d.ts.map +1 -0
  163. package/dist/templates/skills/knowledgine-capture/skill-md.js +97 -0
  164. package/dist/templates/skills/knowledgine-capture/skill-md.js.map +1 -0
  165. package/dist/templates/skills/knowledgine-debrief/references.d.ts +2 -0
  166. package/dist/templates/skills/knowledgine-debrief/references.d.ts.map +1 -0
  167. package/dist/templates/skills/knowledgine-debrief/references.js +140 -0
  168. package/dist/templates/skills/knowledgine-debrief/references.js.map +1 -0
  169. package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts +2 -0
  170. package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts.map +1 -0
  171. package/dist/templates/skills/knowledgine-debrief/skill-md.js +74 -0
  172. package/dist/templates/skills/knowledgine-debrief/skill-md.js.map +1 -0
  173. package/dist/templates/skills/knowledgine-explain/references.d.ts +2 -0
  174. package/dist/templates/skills/knowledgine-explain/references.d.ts.map +1 -0
  175. package/dist/templates/skills/knowledgine-explain/references.js +183 -0
  176. package/dist/templates/skills/knowledgine-explain/references.js.map +1 -0
  177. package/dist/templates/skills/knowledgine-explain/skill-md.d.ts +2 -0
  178. package/dist/templates/skills/knowledgine-explain/skill-md.d.ts.map +1 -0
  179. package/dist/templates/skills/knowledgine-explain/skill-md.js +89 -0
  180. package/dist/templates/skills/knowledgine-explain/skill-md.js.map +1 -0
  181. package/dist/templates/skills/knowledgine-feedback/references.d.ts +2 -0
  182. package/dist/templates/skills/knowledgine-feedback/references.d.ts.map +1 -0
  183. package/dist/templates/skills/knowledgine-feedback/references.js +214 -0
  184. package/dist/templates/skills/knowledgine-feedback/references.js.map +1 -0
  185. package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts +2 -0
  186. package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts.map +1 -0
  187. package/dist/templates/skills/knowledgine-feedback/skill-md.js +107 -0
  188. package/dist/templates/skills/knowledgine-feedback/skill-md.js.map +1 -0
  189. package/dist/templates/skills/knowledgine-ingest/references.d.ts +2 -0
  190. package/dist/templates/skills/knowledgine-ingest/references.d.ts.map +1 -0
  191. package/dist/templates/skills/knowledgine-ingest/references.js +243 -0
  192. package/dist/templates/skills/knowledgine-ingest/references.js.map +1 -0
  193. package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts +2 -0
  194. package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts.map +1 -0
  195. package/dist/templates/skills/knowledgine-ingest/skill-md.js +80 -0
  196. package/dist/templates/skills/knowledgine-ingest/skill-md.js.map +1 -0
  197. package/dist/templates/skills/knowledgine-recall/references.d.ts +2 -0
  198. package/dist/templates/skills/knowledgine-recall/references.d.ts.map +1 -0
  199. package/dist/templates/skills/knowledgine-recall/references.js +207 -0
  200. package/dist/templates/skills/knowledgine-recall/references.js.map +1 -0
  201. package/dist/templates/skills/knowledgine-recall/skill-md.d.ts +2 -0
  202. package/dist/templates/skills/knowledgine-recall/skill-md.d.ts.map +1 -0
  203. package/dist/templates/skills/knowledgine-recall/skill-md.js +86 -0
  204. package/dist/templates/skills/knowledgine-recall/skill-md.js.map +1 -0
  205. package/dist/templates/skills/knowledgine-suggest/references.d.ts +2 -0
  206. package/dist/templates/skills/knowledgine-suggest/references.d.ts.map +1 -0
  207. package/dist/templates/skills/knowledgine-suggest/references.js +121 -0
  208. package/dist/templates/skills/knowledgine-suggest/references.js.map +1 -0
  209. package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts +2 -0
  210. package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts.map +1 -0
  211. package/dist/templates/skills/knowledgine-suggest/skill-md.js +94 -0
  212. package/dist/templates/skills/knowledgine-suggest/skill-md.js.map +1 -0
  213. 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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AA4B7F,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,6EAA6E;AAC7E,4DAA4D;AAC5D,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAU,EAAE;IACpD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C;QACE,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;KACvD;IACD;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,uBAAuB;QACpC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,sBAAsB;QACnC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;KACvD;IACD;QACE,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,kBAAkB;QAC/B,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;KACzD;IACD;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;KACtD;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,wBAAwB;QACrC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;QACvD,SAAS,EAAE,gBAAgB;KAC5B;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;QACvD,SAAS,EAAE,gBAAgB;KAC5B;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtD,SAAS,EAAE,eAAe;KAC3B;IACD;QACE,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,+BAA+B;QAC5C,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;KACzD;IACD;QACE,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,kCAAkC;QAC/C,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtD,SAAS,EAAE,eAAe;KAC3B;IACD;QACE,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,gCAAgC;QAC7C,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,mBAAmB;KACjC;CACF,CAAC;AAEF,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,MAAwB,EACxB,WAAmB,EACnB,UAAuB,EACvB,OAA8C;IAE9C,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEjD,2DAA2D;IAC3D,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,MAAM,EAAE,SAAS;YACjB,QAAQ;YACR,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,0DAA0D;SACjE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,MAAM,EAAE,IAAI;YACZ,QAAQ;YACR,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,IAAI,EAAE,2BAA2B;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAEjD,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEzE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC;YAED,YAAY,EAAE,CAAC;QACjB,CAAC;QAED,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,MAAM,EAAE,IAAI;YACZ,QAAQ;YACR,UAAU,EAAE,YAAY;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,qBAAgC;IAEhC,+CAA+C;IAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,8CAA8C;KACxD,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+BAA+B;IAC/B,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAEzD,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC;QAC7C,OAAO,EAAE,+EAA+E;QACxF,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,sBAAsB;SAC3E,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1E,aAAa,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3F,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnC,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,oBAAoB,GAAG,kBAA8B,CAAC;IAE5D,yDAAyD;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QACjC,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,SAAS;aACrC;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,wBAAwB;aAChC;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,eAA4B,CAAC;IAEjC,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC;YAC5C,OAAO,EAAE,8DAA8D;YACvE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,eAAe,GAAG,iBAAgC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,yDAAyD;IACzD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,WAAW,IAAI,oBAAoB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,mFAAmF;QACnF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC;oBACX,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;oBACzC,UAAU,EAAE,CAAC;oBACb,IAAI,EAAE,eAAe,MAAM,CAAC,SAAS,oBAAoB;iBAC1D,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,CAAC,CAAC,IAAI,CACJ,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,UAAU,qBAAqB,CAC/F,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,eAAe;IACf,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAE1D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,IAAI,CACf,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,UAAU,UAAU,CACtF,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,MAAM,SAAS;YACtF,CAAC,CAAC,qBAAqB,EAAE,CAAC,MAAM,UAAU,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAc,EACd,WAAmB,EACnB,OAA4B;IAE5B,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAElE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CACX,GAAG,OAAO,CAAC,KAAK,oBAAoB,MAAM,gBAAgB,aAAa,CAAC,MAAM,CAC5E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CACnB;aACE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,qCAAqC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,2CAA2C;QAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;YACzD,OAAO,CAAC,KAAK,CACX,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,qBAAqB,CAAC,EAAE,CAC3F,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CACX,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,sCAAsC,MAAM,UAAU,CAAC,EAAE,CAC1F,CAAC;QACF,OAAO;IACT,CAAC;IAED,aAAa;IACb,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CACX,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,MAAM,CAAC,UAAU,UAAU,CAC7G,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -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":"AAQA,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;CACjB;AAWD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWV,CAAC;AAOX,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA+CpD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrD;AAgHD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAMlF,CAAC;AAiHF,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,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFxG"}
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"}
@@ -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 { /* start fresh */ }
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 { /* start fresh */ }
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" ? "project config not supported, used global" : undefined;
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
- const rootPath = resolveDefaultPath(options.path);
278
- const knowledgineDir = resolve(rootPath, ".knowledgine");
279
- if (!existsSync(knowledgineDir)) {
280
- console.error(`${symbols.error} Not initialized. Run 'knowledgine init --path ${rootPath}' first.`);
281
- process.exitCode = 1;
282
- return;
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);