ccjk 13.3.5 → 13.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/chunks/agent-teams.mjs +7 -5
  2. package/dist/chunks/agent.mjs +2 -2
  3. package/dist/chunks/agents.mjs +16 -16
  4. package/dist/chunks/api-cli.mjs +6 -6
  5. package/dist/chunks/api-providers.mjs +1 -1
  6. package/dist/chunks/api.mjs +4 -4
  7. package/dist/chunks/auto-bootstrap.mjs +1 -1
  8. package/dist/chunks/auto-fix.mjs +49 -4
  9. package/dist/chunks/auto-fixer.mjs +7 -5
  10. package/dist/chunks/auto-init.mjs +9 -7208
  11. package/dist/chunks/auto-memory-bridge.mjs +9 -3
  12. package/dist/chunks/auto-updater.mjs +9 -9
  13. package/dist/chunks/auto-upgrade.mjs +5 -3
  14. package/dist/chunks/banner.mjs +4 -3
  15. package/dist/chunks/boost.mjs +118 -62
  16. package/dist/chunks/ccjk-agents.mjs +3 -3
  17. package/dist/chunks/ccjk-all.mjs +7 -7
  18. package/dist/chunks/ccjk-config.mjs +2 -2
  19. package/dist/chunks/ccjk-hooks.mjs +4 -4
  20. package/dist/chunks/ccjk-mcp.mjs +5 -5
  21. package/dist/chunks/ccjk-setup.mjs +5 -5
  22. package/dist/chunks/ccjk-skills.mjs +5 -5
  23. package/dist/chunks/ccr.mjs +18 -16
  24. package/dist/chunks/ccu.mjs +2 -2
  25. package/dist/chunks/check-updates.mjs +8 -8
  26. package/dist/chunks/claude-code-config-manager.mjs +11 -8
  27. package/dist/chunks/claude-code-incremental-manager.mjs +7 -7
  28. package/dist/chunks/claude-config.mjs +1 -1
  29. package/dist/chunks/claude-wrapper.mjs +1 -1
  30. package/dist/chunks/cli-hook.mjs +15 -15
  31. package/dist/chunks/codex-config-switch.mjs +7 -7
  32. package/dist/chunks/codex-provider-manager.mjs +7 -7
  33. package/dist/chunks/codex-uninstaller.mjs +2 -2
  34. package/dist/chunks/codex.mjs +5 -5
  35. package/dist/chunks/commands.mjs +2 -2
  36. package/dist/chunks/commands2.mjs +3 -3
  37. package/dist/chunks/commit.mjs +2 -2
  38. package/dist/chunks/completion.mjs +2 -2
  39. package/dist/chunks/config-consolidator.mjs +2 -2
  40. package/dist/chunks/config-switch.mjs +8 -8
  41. package/dist/chunks/config.mjs +6 -5
  42. package/dist/chunks/config2.mjs +5 -5
  43. package/dist/chunks/config3.mjs +4 -4
  44. package/dist/chunks/constants.mjs +1 -1
  45. package/dist/chunks/context-opt.mjs +92 -90
  46. package/dist/chunks/context.mjs +659 -0
  47. package/dist/chunks/dashboard.mjs +14 -9
  48. package/dist/chunks/doctor.mjs +4 -4
  49. package/dist/chunks/eval.mjs +502 -0
  50. package/dist/chunks/evolution.mjs +46 -39
  51. package/dist/chunks/health-alerts.mjs +9 -9
  52. package/dist/chunks/help.mjs +1 -1
  53. package/dist/chunks/hook-installer.mjs +6 -3
  54. package/dist/chunks/index.mjs +23 -0
  55. package/dist/chunks/index10.mjs +634 -571
  56. package/dist/chunks/index11.mjs +1061 -569
  57. package/dist/chunks/index12.mjs +914 -1076
  58. package/dist/chunks/index13.mjs +136 -951
  59. package/dist/chunks/index14.mjs +209 -185
  60. package/dist/chunks/index2.mjs +19 -24
  61. package/dist/chunks/index3.mjs +19085 -12
  62. package/dist/chunks/index4.mjs +16 -19092
  63. package/dist/chunks/index5.mjs +7602 -16
  64. package/dist/chunks/index6.mjs +159 -7590
  65. package/dist/chunks/index7.mjs +1602 -171
  66. package/dist/chunks/index8.mjs +19 -1602
  67. package/dist/chunks/index9.mjs +612 -15
  68. package/dist/chunks/init.mjs +26 -19
  69. package/dist/chunks/installer.mjs +5 -5
  70. package/dist/chunks/installer2.mjs +2 -2
  71. package/dist/chunks/intent-engine.mjs +1 -1
  72. package/dist/chunks/interview.mjs +4 -4
  73. package/dist/chunks/manager.mjs +1 -1
  74. package/dist/chunks/marketplace.mjs +2 -2
  75. package/dist/chunks/mcp-cli.mjs +12 -12
  76. package/dist/chunks/mcp.mjs +8 -8
  77. package/dist/chunks/memory.mjs +8 -8
  78. package/dist/chunks/menu-hierarchical.mjs +24 -22
  79. package/dist/chunks/menu.mjs +27 -22
  80. package/dist/chunks/metrics-display.mjs +2 -2
  81. package/dist/chunks/migrator.mjs +1 -1
  82. package/dist/chunks/monitor.mjs +2 -2
  83. package/dist/chunks/notification.mjs +6 -6
  84. package/dist/chunks/onboarding-wizard.mjs +6 -5
  85. package/dist/chunks/onboarding.mjs +4 -4
  86. package/dist/chunks/package.mjs +1 -1
  87. package/dist/chunks/paradigm.mjs +2 -2
  88. package/dist/chunks/permission-manager.mjs +2 -2
  89. package/dist/chunks/permissions.mjs +3 -3
  90. package/dist/chunks/persistence-manager.mjs +19 -12
  91. package/dist/chunks/persistence.mjs +5 -3
  92. package/dist/chunks/plugin.mjs +2 -2
  93. package/dist/chunks/prompts.mjs +5 -5
  94. package/dist/chunks/providers.mjs +2 -2
  95. package/dist/chunks/quick-actions.mjs +7 -6
  96. package/dist/chunks/quick-provider.mjs +5 -4
  97. package/dist/chunks/quick-setup.mjs +20 -15
  98. package/dist/chunks/remote.mjs +15 -16
  99. package/dist/chunks/{convoy-manager.mjs → session-manager.mjs} +1129 -1095
  100. package/dist/chunks/session.mjs +2 -2
  101. package/dist/chunks/sessions.mjs +3 -3
  102. package/dist/chunks/silent-updater.mjs +1 -1
  103. package/dist/chunks/simple-config.mjs +2 -2
  104. package/dist/chunks/skill2.mjs +3 -3
  105. package/dist/chunks/skills-sync.mjs +5 -5
  106. package/dist/chunks/skills.mjs +3 -3
  107. package/dist/chunks/slash-commands.mjs +9 -8
  108. package/dist/chunks/smart-defaults.mjs +9 -5
  109. package/dist/chunks/startup.mjs +1 -1
  110. package/dist/chunks/stats.mjs +2 -2
  111. package/dist/chunks/status.mjs +37 -22
  112. package/dist/chunks/team.mjs +3 -3
  113. package/dist/chunks/thinking.mjs +4 -4
  114. package/dist/chunks/trace.mjs +2 -2
  115. package/dist/chunks/uninstall.mjs +9 -9
  116. package/dist/chunks/update.mjs +14 -11
  117. package/dist/chunks/upgrade-manager.mjs +3 -3
  118. package/dist/chunks/upgrade.mjs +25 -9
  119. package/dist/chunks/version-checker.mjs +4 -4
  120. package/dist/chunks/vim.mjs +3 -3
  121. package/dist/chunks/workflows.mjs +1 -1
  122. package/dist/chunks/wsl.mjs +1 -1
  123. package/dist/chunks/zero-config.mjs +4 -4
  124. package/dist/cli.mjs +60 -26
  125. package/dist/index.d.mts +4392 -4392
  126. package/dist/index.d.ts +4392 -4392
  127. package/dist/index.mjs +4314 -4314
  128. package/dist/shared/{ccjk.DcKLglJQ.mjs → ccjk.BIxuVL3_.mjs} +2 -2
  129. package/dist/shared/{ccjk.DJdmgr2d.mjs → ccjk.BJMRY2Ra.mjs} +5 -3
  130. package/dist/shared/{ccjk.B1TwPltj.mjs → ccjk.BOu1yav7.mjs} +3 -2
  131. package/dist/shared/{ccjk.mJpVRDZ8.mjs → ccjk.BWFpnOr3.mjs} +1 -1
  132. package/dist/shared/{ccjk.BfIpomdz.mjs → ccjk.CHUEFqmw.mjs} +3 -2
  133. package/dist/shared/{ccjk.CqdbaXqU.mjs → ccjk.CLUL0pAV.mjs} +9 -5
  134. package/dist/shared/{ccjk.Cot9p9_n.mjs → ccjk.Cjj8SVrn.mjs} +1 -1
  135. package/dist/shared/{ccjk.CfrpIIKy.mjs → ccjk.Crd_nEfj.mjs} +38 -20
  136. package/dist/shared/{ccjk.DCw2WnZU.mjs → ccjk.CvChMYvB.mjs} +1 -1
  137. package/dist/shared/{ccjk.CXzjn01x.mjs → ccjk.D8ZLYSZZ.mjs} +1 -1
  138. package/dist/shared/{ccjk.BrPUmTqm.mjs → ccjk.DJuyfrlL.mjs} +164 -82
  139. package/dist/shared/{ccjk.DHXfsrwn.mjs → ccjk.DRfdq6yl.mjs} +4 -4
  140. package/dist/shared/{ccjk.DXRAZcix.mjs → ccjk.DScm_NnL.mjs} +8 -4
  141. package/dist/shared/{ccjk.XsJWJuQP.mjs → ccjk.DfZKjHvG.mjs} +6 -128
  142. package/dist/shared/{ccjk.BFxsJM0k.mjs → ccjk.DwSebGy0.mjs} +4 -3
  143. package/dist/shared/ccjk.DxWqH-EF.mjs +170 -0
  144. package/dist/shared/{ccjk.Cwa_FiTX.mjs → ccjk.I6IuYdc_.mjs} +2 -2
  145. package/dist/shared/{ccjk.DpstNaeR.mjs → ccjk.KpFl2RDA.mjs} +3 -3
  146. package/dist/shared/{ccjk.dYDLfmph.mjs → ccjk._dESH4Rk.mjs} +1 -1
  147. package/dist/shared/{ccjk.BxSmJ8B7.mjs → ccjk.wLJHO0Af.mjs} +2 -1
  148. package/package.json +65 -67
  149. package/dist/chunks/index15.mjs +0 -218
  150. package/dist/shared/{ccjk.c-ETfBZ_.mjs → ccjk.eIn-g1yI.mjs} +96 -96
@@ -1,1009 +1,194 @@
1
- import a from './index3.mjs';
2
- import ora from './index8.mjs';
3
- import fs from 'node:fs/promises';
4
- import os__default from 'node:os';
5
- import path__default from 'node:path';
6
- import { exec } from 'node:child_process';
7
- import { promisify } from 'node:util';
8
- import '../shared/ccjk.BAGoDD49.mjs';
9
- import 'node:process';
10
- import '../shared/ccjk.Cjgrln_h.mjs';
11
- import '../shared/ccjk.DeWpAShp.mjs';
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import process__default from 'node:process';
4
+ import { i as installSuperpowers } from '../shared/ccjk._dESH4Rk.mjs';
5
+ import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
6
+ import 'node:child_process';
7
+ import 'node:fs/promises';
8
+ import 'node:util';
9
+ import './index5.mjs';
10
+ import 'node:url';
12
11
 
13
- function getCcjkConfigDir() {
14
- if (process.env.CCJK_CONFIG_DIR) {
15
- return process.env.CCJK_CONFIG_DIR;
16
- }
17
- return path__default.join(os__default.homedir(), ".ccjk");
12
+ const CORE_SKILLS = [
13
+ "brainstorming",
14
+ "writing-plans",
15
+ "executing-plans",
16
+ "systematic-debugging",
17
+ "test-driven-development",
18
+ "using-git-worktrees"
19
+ ];
20
+
21
+ function getSuperpowersDir$1() {
22
+ return join(homedir(), ".claude", "plugins", "superpowers");
18
23
  }
19
- function getInstallPath(pluginType, name) {
20
- const configDir = getCcjkConfigDir();
21
- const typeDir = {
22
- skill: "skills",
23
- mcp: "mcp-servers",
24
- agent: "agents",
25
- hook: "hooks"
26
- }[pluginType];
27
- return path__default.join(configDir, typeDir, name);
24
+ function isSuperpowersInstalled() {
25
+ const superpowersDir = getSuperpowersDir$1();
26
+ return existsSync(superpowersDir) && existsSync(join(superpowersDir, "skills"));
28
27
  }
29
- async function copyDirectory(src, dest) {
30
- await fs.mkdir(dest, { recursive: true });
31
- const entries = await fs.readdir(src, { withFileTypes: true });
32
- for (const entry of entries) {
33
- const srcPath = path__default.join(src, entry.name);
34
- const destPath = path__default.join(dest, entry.name);
35
- if (entry.isDirectory()) {
36
- await copyDirectory(srcPath, destPath);
37
- } else {
38
- await fs.copyFile(srcPath, destPath);
39
- }
28
+ function areCoreSkillsInstalled() {
29
+ const skillsDir = join(getSuperpowersDir$1(), "skills");
30
+ if (!existsSync(skillsDir)) {
31
+ return false;
40
32
  }
41
- }
42
- async function downloadFile(url, destPath) {
43
- const response = await fetch(url, {
44
- headers: {
45
- "User-Agent": "ccjk-cli"
46
- },
47
- redirect: "follow"
48
- });
49
- if (!response.ok) {
50
- throw new Error(`Failed to download: ${response.statusText}`);
33
+ for (const skill of CORE_SKILLS) {
34
+ const skillPath = join(skillsDir, skill);
35
+ if (!existsSync(skillPath) || !existsSync(join(skillPath, "skill.json"))) {
36
+ return false;
37
+ }
51
38
  }
52
- const buffer = Buffer.from(await response.arrayBuffer());
53
- await fs.writeFile(destPath, buffer);
39
+ return true;
54
40
  }
55
-
56
- async function installFromGitHub(sourceInfo, pluginType, options = {}) {
57
- const { force = false, dryRun = false } = options;
58
- const { owner, repo, ref = "main", subpath } = sourceInfo;
41
+ async function autoInstallSuperpowers(lang = "zh-CN") {
59
42
  try {
60
- const repoInfo = await fetchRepoInfo(owner, repo);
61
- const defaultBranch = repoInfo.default_branch || "main";
62
- const actualRef = ref || defaultBranch;
63
- const installPath = getInstallPath(pluginType, repo);
64
- if (!force) {
65
- try {
66
- await fs.access(installPath);
67
- return {
68
- success: false,
69
- source: sourceInfo.originalUrl,
70
- sourceType: "github",
71
- pluginType,
72
- error: `Plugin already exists at ${installPath}. Use --force to overwrite.`
73
- };
74
- } catch {
75
- }
76
- }
77
- if (dryRun) {
78
- const files = await listRepoFiles(owner, repo, actualRef, subpath);
79
- return {
80
- success: true,
81
- source: sourceInfo.originalUrl,
82
- sourceType: "github",
83
- pluginType,
84
- installedPath: installPath,
85
- details: {
86
- name: repo,
87
- version: actualRef,
88
- description: repoInfo.description || void 0,
89
- files: files.slice(0, 20)
90
- }
91
- };
43
+ if (isSuperpowersInstalled() && areCoreSkillsInstalled()) {
44
+ return true;
92
45
  }
93
- const tempDir = await downloadRepo(owner, repo, actualRef);
94
- const sourcePath = subpath ? path__default.join(tempDir, subpath) : tempDir;
95
- await fs.mkdir(path__default.dirname(installPath), { recursive: true });
96
- await copyDirectory(sourcePath, installPath);
97
- await fs.rm(tempDir, { recursive: true, force: true });
98
- const installedFiles = await listInstalledFiles$1(installPath);
99
- return {
100
- success: true,
101
- source: sourceInfo.originalUrl,
102
- sourceType: "github",
103
- pluginType,
104
- installedPath: installPath,
105
- details: {
106
- name: repo,
107
- version: actualRef,
108
- description: repoInfo.description || void 0,
109
- files: installedFiles
46
+ const result = await installSuperpowers({
47
+ lang,
48
+ skipPrompt: true
49
+ // Skip user prompts for silent installation
50
+ });
51
+ if (!result.success) {
52
+ if (process__default.env.DEBUG) {
53
+ console.error("[CCJK Zero-Config] Installation failed:", result.error || result.message);
110
54
  }
111
- };
112
- } catch (error) {
113
- return {
114
- success: false,
115
- source: sourceInfo.originalUrl,
116
- sourceType: "github",
117
- pluginType,
118
- error: error instanceof Error ? error.message : String(error)
119
- };
120
- }
121
- }
122
- async function fetchRepoInfo(owner, repo) {
123
- const url = `https://api.github.com/repos/${owner}/${repo}`;
124
- const response = await fetch(url, {
125
- headers: {
126
- "Accept": "application/vnd.github.v3+json",
127
- "User-Agent": "ccjk-cli"
128
- }
129
- });
130
- if (!response.ok) {
131
- if (response.status === 404) {
132
- throw new Error(`Repository not found: ${owner}/${repo}`);
55
+ return false;
133
56
  }
134
- throw new Error(`Failed to fetch repository info: ${response.statusText}`);
135
- }
136
- return response.json();
137
- }
138
- async function listRepoFiles(owner, repo, ref, subpath) {
139
- const treePath = subpath || "";
140
- const url = `https://api.github.com/repos/${owner}/${repo}/git/trees/${ref}?recursive=1`;
141
- const response = await fetch(url, {
142
- headers: {
143
- "Accept": "application/vnd.github.v3+json",
144
- "User-Agent": "ccjk-cli"
57
+ return isSuperpowersInstalled() && areCoreSkillsInstalled();
58
+ } catch (error) {
59
+ if (process__default.env.DEBUG) {
60
+ console.error("[CCJK Zero-Config] Auto-install failed:", error);
145
61
  }
146
- });
147
- if (!response.ok) {
148
- return [];
62
+ return false;
149
63
  }
150
- const data = await response.json();
151
- const files = (data.tree || []).filter((item) => item.type === "blob").map((item) => item.path).filter((filePath) => !treePath || filePath.startsWith(treePath));
152
- return files;
153
- }
154
- async function downloadRepo(owner, repo, ref) {
155
- const zipUrl = `https://github.com/${owner}/${repo}/archive/${ref}.zip`;
156
- const tempDir = path__default.join(os__default.tmpdir(), `ccjk-${repo}-${Date.now()}`);
157
- const zipPath = path__default.join(tempDir, "repo.zip");
158
- await fs.mkdir(tempDir, { recursive: true });
159
- await downloadFile(zipUrl, zipPath);
160
- const extractedDir = await extractZip(zipPath, tempDir);
161
- await fs.unlink(zipPath);
162
- return extractedDir;
163
64
  }
164
- async function extractZip(zipPath, destDir) {
165
- const { exec } = await import('node:child_process');
166
- const { promisify } = await import('node:util');
167
- const execAsync = promisify(exec);
168
- try {
169
- await execAsync(`unzip -q "${zipPath}" -d "${destDir}"`);
170
- } catch {
171
- try {
172
- await execAsync(`tar -xf "${zipPath}" -C "${destDir}"`);
173
- } catch {
174
- throw new Error("Failed to extract archive. Please ensure unzip or tar is installed.");
175
- }
176
- }
177
- const entries = await fs.readdir(destDir);
178
- const extractedDir = entries.find((entry) => !entry.endsWith(".zip"));
179
- if (!extractedDir) {
180
- throw new Error("Failed to find extracted directory");
181
- }
182
- return path__default.join(destDir, extractedDir);
65
+
66
+ function getSkillsDir() {
67
+ return join(homedir(), ".claude", "plugins", "superpowers", "skills");
183
68
  }
184
- async function listInstalledFiles$1(dir) {
185
- const files = [];
186
- async function walk(currentDir, prefix = "") {
187
- const entries = await fs.readdir(currentDir, { withFileTypes: true });
188
- for (const entry of entries) {
189
- const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
190
- if (entry.isDirectory()) {
191
- await walk(path__default.join(currentDir, entry.name), relativePath);
192
- } else {
193
- files.push(relativePath);
194
- }
195
- }
196
- }
197
- await walk(dir);
198
- return files;
69
+ function isSkillInstalled(skillName) {
70
+ const skillPath = join(getSkillsDir(), skillName);
71
+ return existsSync(skillPath) && existsSync(join(skillPath, "skill.json"));
199
72
  }
200
-
201
- async function installFromLocal(sourceInfo, pluginType, options = {}) {
202
- const { force = false, dryRun = false } = options;
203
- const { absolutePath, originalPath } = sourceInfo;
73
+ async function loadSkill(skillName) {
204
74
  try {
205
- const stat = await fs.stat(absolutePath);
206
- const isFile = stat.isFile();
207
- const isDirectory = stat.isDirectory();
208
- if (!isFile && !isDirectory) {
75
+ if (!isSkillInstalled(skillName)) {
209
76
  return {
77
+ skill: skillName,
210
78
  success: false,
211
- source: originalPath,
212
- sourceType: "local",
213
- pluginType,
214
- error: `Source path is neither a file nor a directory: ${absolutePath}`
79
+ error: "Skill not installed"
215
80
  };
216
81
  }
217
- const pluginName = path__default.basename(absolutePath, path__default.extname(absolutePath));
218
- const installPath = getInstallPath(pluginType, pluginName);
219
- if (!force) {
220
- try {
221
- await fs.access(installPath);
222
- return {
223
- success: false,
224
- source: originalPath,
225
- sourceType: "local",
226
- pluginType,
227
- error: `Plugin already exists at ${installPath}. Use --force to overwrite.`
228
- };
229
- } catch {
230
- }
231
- }
232
- const files = isFile ? [path__default.basename(absolutePath)] : await listFiles(absolutePath);
233
- const pluginInfo = await readPluginInfo(absolutePath, isFile);
234
- if (dryRun) {
82
+ const skillJsonPath = join(getSkillsDir(), skillName, "skill.json");
83
+ const skillJson = JSON.parse(readFileSync(skillJsonPath, "utf-8"));
84
+ if (!skillJson.name || !skillJson.version) {
235
85
  return {
236
- success: true,
237
- source: originalPath,
238
- sourceType: "local",
239
- pluginType,
240
- installedPath: installPath,
241
- details: {
242
- name: pluginInfo.name || pluginName,
243
- version: pluginInfo.version,
244
- description: pluginInfo.description,
245
- files
246
- }
86
+ skill: skillName,
87
+ success: false,
88
+ error: "Invalid skill.json format"
247
89
  };
248
90
  }
249
- if (isFile) {
250
- await fs.mkdir(path__default.dirname(installPath), { recursive: true });
251
- if (absolutePath.endsWith(".md")) {
252
- await fs.copyFile(absolutePath, installPath);
253
- } else {
254
- await fs.mkdir(installPath, { recursive: true });
255
- await fs.copyFile(
256
- absolutePath,
257
- path__default.join(installPath, path__default.basename(absolutePath))
258
- );
259
- }
260
- } else {
261
- await fs.mkdir(path__default.dirname(installPath), { recursive: true });
262
- await copyDirectory(absolutePath, installPath);
263
- }
264
- const installedFiles = isFile ? [path__default.basename(absolutePath)] : await listFiles(installPath);
265
91
  return {
266
- success: true,
267
- source: originalPath,
268
- sourceType: "local",
269
- pluginType,
270
- installedPath: installPath,
271
- details: {
272
- name: pluginInfo.name || pluginName,
273
- version: pluginInfo.version,
274
- description: pluginInfo.description,
275
- files: installedFiles
276
- }
92
+ skill: skillName,
93
+ success: true
277
94
  };
278
95
  } catch (error) {
279
96
  return {
97
+ skill: skillName,
280
98
  success: false,
281
- source: originalPath,
282
- sourceType: "local",
283
- pluginType,
284
- error: error instanceof Error ? error.message : String(error)
99
+ error: error instanceof Error ? error.message : "Unknown error"
285
100
  };
286
101
  }
287
102
  }
288
- async function listFiles(dir) {
289
- const files = [];
290
- async function walk(currentDir, prefix = "") {
291
- const entries = await fs.readdir(currentDir, { withFileTypes: true });
292
- for (const entry of entries) {
293
- if (entry.name.startsWith(".") || entry.name === "node_modules") {
294
- continue;
295
- }
296
- const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
297
- if (entry.isDirectory()) {
298
- await walk(path__default.join(currentDir, entry.name), relativePath);
299
- } else {
300
- files.push(relativePath);
301
- }
302
- }
303
- }
304
- await walk(dir);
305
- return files;
306
- }
307
- async function readPluginInfo(sourcePath, isFile) {
308
- if (isFile) {
309
- const name = path__default.basename(sourcePath, path__default.extname(sourcePath));
310
- return { name };
311
- }
312
- try {
313
- const packageJsonPath = path__default.join(sourcePath, "package.json");
314
- const content = await fs.readFile(packageJsonPath, "utf-8");
315
- const packageJson = JSON.parse(content);
316
- return {
317
- name: packageJson.name,
318
- version: packageJson.version,
319
- description: packageJson.description
320
- };
321
- } catch {
322
- }
323
- const metaFiles = ["SKILL.md", "skill.md", "README.md", "readme.md"];
324
- for (const metaFile of metaFiles) {
325
- try {
326
- const metaPath = path__default.join(sourcePath, metaFile);
327
- const content = await fs.readFile(metaPath, "utf-8");
328
- const titleMatch = content.match(/^#\s+(.+)$/m);
329
- if (titleMatch) {
330
- return { name: titleMatch[1].trim() };
331
- }
332
- } catch {
103
+ async function loadCoreSkills(_lang = "zh-CN") {
104
+ const results = await Promise.all(
105
+ CORE_SKILLS.map((skill) => loadSkill(skill))
106
+ );
107
+ if (process__default.env.DEBUG) {
108
+ const successful = results.filter((r) => r.success);
109
+ const failed = results.filter((r) => !r.success);
110
+ console.log(`[Zero-Config] Loaded ${successful.length}/${CORE_SKILLS.length} core skills`);
111
+ if (failed.length > 0) {
112
+ console.log(`[Zero-Config] Failed skills: ${failed.map((r) => r.skill).join(", ")}`);
333
113
  }
334
114
  }
335
- return {};
115
+ return results;
336
116
  }
337
117
 
338
- const execAsync = promisify(exec);
339
- async function installFromNpm(sourceInfo, pluginType, options = {}) {
340
- const { force = false, dryRun = false } = options;
341
- const { packageName, version } = sourceInfo;
342
- try {
343
- const packageInfo = await fetchPackageInfo(packageName, version);
344
- const packageVersion = version || packageInfo.version;
345
- const shortName = getShortName(packageName);
346
- const installPath = getInstallPath(pluginType, shortName);
347
- if (!force) {
348
- try {
349
- await fs.access(installPath);
350
- return {
351
- success: false,
352
- source: packageName,
353
- sourceType: "npm",
354
- pluginType,
355
- error: `Plugin already exists at ${installPath}. Use --force to overwrite.`
356
- };
357
- } catch {
358
- }
359
- }
360
- if (dryRun) {
361
- const files = packageInfo.files || ["(package files)"];
362
- return {
363
- success: true,
364
- source: packageName,
365
- sourceType: "npm",
366
- pluginType,
367
- installedPath: installPath,
368
- details: {
369
- name: packageName,
370
- version: packageVersion,
371
- description: packageInfo.description,
372
- files
373
- }
374
- };
375
- }
376
- if (pluginType === "mcp") {
377
- await installMcpPackage(packageName, packageVersion, installPath);
378
- } else {
379
- await installGenericPackage(packageName, packageVersion, installPath);
380
- }
381
- const installedFiles = await listInstalledFiles(installPath);
382
- return {
383
- success: true,
384
- source: packageName,
385
- sourceType: "npm",
386
- pluginType,
387
- installedPath: installPath,
388
- details: {
389
- name: packageName,
390
- version: packageVersion,
391
- description: packageInfo.description,
392
- files: installedFiles
393
- }
394
- };
395
- } catch (error) {
396
- return {
397
- success: false,
398
- source: packageName,
399
- sourceType: "npm",
400
- pluginType,
401
- error: error instanceof Error ? error.message : String(error)
402
- };
403
- }
118
+ function getActivationStatePath() {
119
+ return join(homedir(), ".claude", "plugins", "superpowers", ".activation-state.json");
404
120
  }
405
- async function fetchPackageInfo(packageName, version) {
406
- const url = version ? `https://registry.npmjs.org/${packageName}/${version}` : `https://registry.npmjs.org/${packageName}/latest`;
407
- const response = await fetch(url);
408
- if (!response.ok) {
409
- if (response.status === 404) {
410
- throw new Error(`Package not found: ${packageName}`);
411
- }
412
- throw new Error(`Failed to fetch package info: ${response.statusText}`);
413
- }
414
- const data = await response.json();
415
- return {
416
- version: data.version,
417
- description: data.description,
418
- files: data.files
419
- };
420
- }
421
- function getShortName(packageName) {
422
- if (packageName.startsWith("@")) {
423
- const parts = packageName.split("/");
424
- return parts[1] || packageName;
425
- }
426
- return packageName;
121
+ function getSuperpowersDir() {
122
+ return join(homedir(), ".claude", "plugins", "superpowers");
427
123
  }
428
- async function installMcpPackage(packageName, version, installPath) {
429
- await fs.mkdir(installPath, { recursive: true });
430
- const packageJson = {
431
- name: `ccjk-mcp-${getShortName(packageName)}`,
432
- version: "1.0.0",
433
- private: true,
434
- dependencies: {
435
- [packageName]: version
436
- }
437
- };
438
- await fs.writeFile(
439
- path__default.join(installPath, "package.json"),
440
- JSON.stringify(packageJson, null, 2)
441
- );
124
+ function loadActivationState() {
442
125
  try {
443
- await execAsync("npm install", { cwd: installPath });
126
+ const statePath = getActivationStatePath();
127
+ if (!existsSync(statePath)) {
128
+ return null;
129
+ }
130
+ const stateJson = readFileSync(statePath, "utf-8");
131
+ return JSON.parse(stateJson);
444
132
  } catch (error) {
445
- try {
446
- await execAsync("pnpm install", { cwd: installPath });
447
- } catch {
448
- throw new Error(
449
- `Failed to install package. Original error: ${error instanceof Error ? error.message : String(error)}`
450
- );
133
+ if (process__default.env.DEBUG) {
134
+ console.error("[Zero-Config] Failed to load activation state:", error);
451
135
  }
136
+ return null;
452
137
  }
453
138
  }
454
- async function installGenericPackage(packageName, version, installPath) {
455
- const registryUrl = `https://registry.npmjs.org/${packageName}/${version}`;
456
- const response = await fetch(registryUrl);
457
- if (!response.ok) {
458
- throw new Error(`Failed to fetch package info: ${response.statusText}`);
459
- }
460
- const data = await response.json();
461
- const tarballUrl = data.dist?.tarball;
462
- if (!tarballUrl) {
463
- throw new Error("Failed to get tarball URL");
464
- }
465
- const tarballResponse = await fetch(tarballUrl);
466
- if (!tarballResponse.ok) {
467
- throw new Error(`Failed to download tarball: ${tarballResponse.statusText}`);
468
- }
469
- await fs.mkdir(installPath, { recursive: true });
470
- const tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());
471
- const tarballPath = path__default.join(installPath, "package.tgz");
472
- await fs.writeFile(tarballPath, tarballBuffer);
139
+ function saveActivationState(status) {
473
140
  try {
474
- await execAsync(`tar -xzf package.tgz --strip-components=1`, { cwd: installPath });
475
- } finally {
476
- await fs.unlink(tarballPath).catch(() => {
477
- });
478
- }
479
- }
480
- async function listInstalledFiles(dir) {
481
- const files = [];
482
- async function walk(currentDir, prefix = "") {
483
- try {
484
- const entries = await fs.readdir(currentDir, { withFileTypes: true });
485
- for (const entry of entries) {
486
- if (entry.name === "node_modules")
487
- continue;
488
- const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
489
- if (entry.isDirectory()) {
490
- await walk(path__default.join(currentDir, entry.name), relativePath);
491
- } else {
492
- files.push(relativePath);
493
- }
494
- }
495
- } catch {
496
- }
497
- }
498
- await walk(dir);
499
- return files;
500
- }
501
-
502
- function parseSource(source) {
503
- const trimmed = source.trim();
504
- const githubInfo = parseGitHubSource(trimmed);
505
- if (githubInfo) {
506
- return githubInfo;
507
- }
508
- const localInfo = parseLocalSource(trimmed);
509
- if (localInfo) {
510
- return localInfo;
511
- }
512
- return parseNpmSource(trimmed);
513
- }
514
- function parseGitHubSource(source) {
515
- const prefixMatch = source.match(/^(?:github|gh):([^/]+)\/([^#@/]+)(?:#(.+))?$/);
516
- if (prefixMatch) {
517
- return {
518
- type: "github",
519
- owner: prefixMatch[1],
520
- repo: prefixMatch[2],
521
- ref: prefixMatch[3],
522
- originalUrl: source
523
- };
524
- }
525
- const urlMatch = source.match(
526
- /^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?(?:\/tree\/([^/]+))?(?:\/(.+))?$/
527
- );
528
- if (urlMatch) {
529
- return {
530
- type: "github",
531
- owner: urlMatch[1],
532
- repo: urlMatch[2],
533
- ref: urlMatch[3],
534
- subpath: urlMatch[4],
535
- originalUrl: source
536
- };
537
- }
538
- const shortMatch = source.match(/^([\w-]+)\/([\w.-]+)(?:#(.+))?$/);
539
- if (shortMatch && !source.startsWith(".") && !source.startsWith("/") && !source.startsWith("~")) {
540
- return {
541
- type: "github",
542
- owner: shortMatch[1],
543
- repo: shortMatch[2],
544
- ref: shortMatch[3],
545
- originalUrl: source
546
- };
547
- }
548
- return null;
549
- }
550
- function parseLocalSource(source) {
551
- if (source.startsWith("./") || source.startsWith("../") || source.startsWith("/") || source.startsWith("~/")) {
552
- let absolutePath;
553
- if (source.startsWith("~/")) {
554
- absolutePath = path__default.join(os__default.homedir(), source.slice(2));
555
- } else if (path__default.isAbsolute(source)) {
556
- absolutePath = source;
557
- } else {
558
- absolutePath = path__default.resolve(process.cwd(), source);
141
+ const statePath = getActivationStatePath();
142
+ writeFileSync(statePath, JSON.stringify(status, null, 2), "utf-8");
143
+ } catch (error) {
144
+ if (process__default.env.DEBUG) {
145
+ console.error("[Zero-Config] Failed to save activation state:", error);
559
146
  }
560
- return {
561
- type: "local",
562
- absolutePath,
563
- originalPath: source
564
- };
565
- }
566
- if (/^[a-z]:[\\/]/i.test(source)) {
567
- return {
568
- type: "local",
569
- absolutePath: path__default.resolve(source),
570
- originalPath: source
571
- };
572
147
  }
573
- return null;
574
148
  }
575
- function parseNpmSource(source) {
576
- const npmPrefixMatch = source.match(/^npm:(.+)$/);
577
- const packageStr = npmPrefixMatch ? npmPrefixMatch[1] : source;
578
- const scopedMatch = packageStr.match(/^(@[^/]+)\/([^@]+)(?:@(.+))?$/);
579
- if (scopedMatch) {
580
- return {
581
- type: "npm",
582
- scope: scopedMatch[1],
583
- packageName: `${scopedMatch[1]}/${scopedMatch[2]}`,
584
- version: scopedMatch[3]
585
- };
586
- }
587
- const versionMatch = packageStr.match(/^([^@]+)@(.+)$/);
588
- if (versionMatch) {
589
- return {
590
- type: "npm",
591
- packageName: versionMatch[1],
592
- version: versionMatch[2]
593
- };
149
+ function checkActivationStatus() {
150
+ const superpowersInstalled = existsSync(getSuperpowersDir());
151
+ const savedState = loadActivationState();
152
+ if (savedState) {
153
+ return savedState;
594
154
  }
595
155
  return {
596
- type: "npm",
597
- packageName: packageStr
156
+ isInstalled: superpowersInstalled,
157
+ coreSkillsLoaded: false,
158
+ loadedSkills: [],
159
+ needsActivation: true,
160
+ lastActivation: void 0
598
161
  };
599
162
  }
600
- function buildGitHubRawUrl(info, filePath) {
601
- const ref = info.ref || "main";
602
- return `https://raw.githubusercontent.com/${info.owner}/${info.repo}/${ref}/${filePath}`;
603
- }
604
-
605
- async function detectPluginType(sourceInfo) {
606
- const result = await detectPluginTypeWithConfidence(sourceInfo);
607
- return result.type;
608
- }
609
- async function detectPluginTypeWithConfidence(sourceInfo) {
610
- switch (sourceInfo.type) {
611
- case "github":
612
- return detectFromGitHub(sourceInfo);
613
- case "npm":
614
- return detectFromNpm(sourceInfo);
615
- case "local":
616
- return detectFromLocal(sourceInfo);
617
- default:
618
- return { type: "skill", confidence: "low", reason: "Unknown source type" };
619
- }
620
- }
621
- async function detectFromGitHub(info) {
622
- const repoNameResult = detectFromRepoName(info.repo);
623
- if (repoNameResult.confidence === "high") {
624
- return repoNameResult;
163
+ async function activateSuperpowers(lang = "zh-CN") {
164
+ const currentStatus = checkActivationStatus();
165
+ if (!currentStatus.needsActivation) {
166
+ return currentStatus;
625
167
  }
626
- try {
627
- const packageJsonUrl = buildGitHubRawUrl(info, "package.json");
628
- const response = await fetch(packageJsonUrl);
629
- if (response.ok) {
630
- const packageJson = await response.json();
631
- const pkgResult = detectFromPackageJson(packageJson);
632
- if (pkgResult.confidence !== "low") {
633
- return pkgResult;
634
- }
635
- }
636
- } catch {
637
- }
638
- const filePatterns = [
639
- { file: "SKILL.md", type: "skill" },
640
- { file: "skill.md", type: "skill" },
641
- { file: "AGENT.md", type: "agent" },
642
- { file: "agent.md", type: "agent" },
643
- { file: "mcp.json", type: "mcp" },
644
- { file: "hook.json", type: "hook" }
645
- ];
646
- for (const pattern of filePatterns) {
647
- try {
648
- const fileUrl = buildGitHubRawUrl(info, pattern.file);
649
- const response = await fetch(fileUrl, { method: "HEAD" });
650
- if (response.ok) {
651
- return {
652
- type: pattern.type,
653
- confidence: "high",
654
- reason: `Found ${pattern.file}`
655
- };
656
- }
657
- } catch {
658
- }
659
- }
660
- return repoNameResult.confidence !== "low" ? repoNameResult : { type: "skill", confidence: "low", reason: "Default type" };
661
- }
662
- async function detectFromNpm(info) {
663
- const nameResult = detectFromPackageName(info.packageName);
664
- if (nameResult.confidence === "high") {
665
- return nameResult;
666
- }
667
- try {
668
- const registryUrl = `https://registry.npmjs.org/${info.packageName}`;
669
- const response = await fetch(registryUrl);
670
- if (response.ok) {
671
- const data = await response.json();
672
- const latestVersion = data["dist-tags"]?.latest;
673
- if (latestVersion && data.versions?.[latestVersion]) {
674
- const packageJson = data.versions[latestVersion];
675
- const pkgResult = detectFromPackageJson(packageJson);
676
- if (pkgResult.confidence !== "low") {
677
- return pkgResult;
678
- }
679
- }
680
- }
681
- } catch {
682
- }
683
- return nameResult.confidence !== "low" ? nameResult : { type: "skill", confidence: "low", reason: "Default type" };
684
- }
685
- async function detectFromLocal(info) {
686
- const { absolutePath } = info;
687
- const dirName = path__default.basename(absolutePath);
688
- const dirResult = detectFromRepoName(dirName);
689
- if (dirResult.confidence === "high") {
690
- return dirResult;
691
- }
692
- try {
693
- const packageJsonPath = path__default.join(absolutePath, "package.json");
694
- const content = await fs.readFile(packageJsonPath, "utf-8");
695
- const packageJson = JSON.parse(content);
696
- const pkgResult = detectFromPackageJson(packageJson);
697
- if (pkgResult.confidence !== "low") {
698
- return pkgResult;
699
- }
700
- } catch {
701
- }
702
- const filePatterns = [
703
- { file: "SKILL.md", type: "skill" },
704
- { file: "skill.md", type: "skill" },
705
- { file: "AGENT.md", type: "agent" },
706
- { file: "agent.md", type: "agent" },
707
- { file: "mcp.json", type: "mcp" },
708
- { file: "hook.json", type: "hook" }
709
- ];
710
- for (const pattern of filePatterns) {
711
- try {
712
- const filePath = path__default.join(absolutePath, pattern.file);
713
- await fs.access(filePath);
168
+ if (!currentStatus.isInstalled) {
169
+ const installSuccess = await autoInstallSuperpowers(lang);
170
+ if (!installSuccess) {
714
171
  return {
715
- type: pattern.type,
716
- confidence: "high",
717
- reason: `Found ${pattern.file}`
172
+ isInstalled: false,
173
+ coreSkillsLoaded: false,
174
+ loadedSkills: [],
175
+ needsActivation: true,
176
+ lastActivation: void 0
718
177
  };
719
- } catch {
720
- }
721
- }
722
- try {
723
- const stat = await fs.stat(absolutePath);
724
- if (stat.isFile() && absolutePath.endsWith(".md")) {
725
- return {
726
- type: "skill",
727
- confidence: "high",
728
- reason: "Single markdown file"
729
- };
730
- }
731
- } catch {
732
- }
733
- return dirResult.confidence !== "low" ? dirResult : { type: "skill", confidence: "low", reason: "Default type" };
734
- }
735
- function detectFromRepoName(name) {
736
- const lowerName = name.toLowerCase();
737
- if (lowerName.includes("mcp-server") || lowerName.includes("mcp_server") || lowerName.startsWith("mcp-") || lowerName.endsWith("-mcp")) {
738
- return { type: "mcp", confidence: "high", reason: `Name contains MCP pattern: ${name}` };
739
- }
740
- if (lowerName.includes("agent") || lowerName.includes("-agent") || lowerName.endsWith("-agent")) {
741
- return { type: "agent", confidence: "medium", reason: `Name contains agent pattern: ${name}` };
742
- }
743
- if (lowerName.includes("hook") || lowerName.includes("-hook") || lowerName.endsWith("-hook")) {
744
- return { type: "hook", confidence: "medium", reason: `Name contains hook pattern: ${name}` };
745
- }
746
- if (lowerName.includes("skill") || lowerName.includes("-skill") || lowerName.endsWith("-skill")) {
747
- return { type: "skill", confidence: "medium", reason: `Name contains skill pattern: ${name}` };
748
- }
749
- return { type: "skill", confidence: "low", reason: "No pattern matched" };
750
- }
751
- function detectFromPackageName(packageName) {
752
- const lowerName = packageName.toLowerCase();
753
- if (lowerName.startsWith("@modelcontextprotocol/")) {
754
- return { type: "mcp", confidence: "high", reason: "MCP official scope" };
755
- }
756
- if (lowerName.includes("mcp-server") || lowerName.includes("mcp_server")) {
757
- return { type: "mcp", confidence: "high", reason: "MCP server pattern in name" };
758
- }
759
- return detectFromRepoName(packageName);
760
- }
761
- function detectFromPackageJson(packageJson) {
762
- if (packageJson.ccjk && typeof packageJson.ccjk === "object") {
763
- const ccjk = packageJson.ccjk;
764
- if (ccjk.type && typeof ccjk.type === "string") {
765
- const type = ccjk.type;
766
- if (["skill", "mcp", "agent", "hook"].includes(type)) {
767
- return { type, confidence: "high", reason: "Explicit ccjk.type field" };
768
- }
769
- }
770
- }
771
- if (Array.isArray(packageJson.keywords)) {
772
- const keywords = packageJson.keywords;
773
- const keywordMap = {
774
- "mcp-server": "mcp",
775
- "mcp": "mcp",
776
- "model-context-protocol": "mcp",
777
- "ccjk-skill": "skill",
778
- "claude-skill": "skill",
779
- "ccjk-agent": "agent",
780
- "ccjk-hook": "hook"
781
- };
782
- for (const keyword of keywords) {
783
- const type = keywordMap[keyword.toLowerCase()];
784
- if (type) {
785
- return { type, confidence: "high", reason: `Keyword: ${keyword}` };
786
- }
787
- }
788
- }
789
- if (packageJson.bin) {
790
- const binKeys = Object.keys(packageJson.bin);
791
- for (const key of binKeys) {
792
- if (key.includes("mcp") || key.includes("server")) {
793
- return { type: "mcp", confidence: "medium", reason: `Binary name: ${key}` };
794
- }
795
- }
796
- }
797
- if (typeof packageJson.main === "string") {
798
- const main = packageJson.main.toLowerCase();
799
- if (main.includes("server") || main.includes("mcp")) {
800
- return { type: "mcp", confidence: "low", reason: `Main file: ${packageJson.main}` };
801
178
  }
802
179
  }
803
- return { type: "skill", confidence: "low", reason: "No specific indicators" };
804
- }
805
-
806
- async function addCommand(source, options = {}) {
807
- const { force = false, dryRun = false, json = false, lang = "en" } = options;
808
- const i18n = getI18n(lang);
809
- const spinner = json ? null : ora(i18n.parsing).start();
810
- let sourceInfo;
811
- try {
812
- sourceInfo = parseSource(source);
813
- spinner?.succeed(i18n.parsed(sourceInfo.type));
814
- } catch (error) {
815
- spinner?.fail(i18n.parseFailed);
816
- const result = {
817
- success: false,
818
- source,
819
- sourceType: "local",
820
- pluginType: "skill",
821
- error: error instanceof Error ? error.message : String(error)
822
- };
823
- if (json) {
824
- console.log(JSON.stringify(result, null, 2));
825
- } else {
826
- console.error(a.red(`
827
- ${i18n.error}: ${result.error}
828
- `));
829
- }
830
- return result;
831
- }
832
- let pluginType = options.type;
833
- if (!pluginType) {
834
- spinner?.start(i18n.detectingType);
835
- try {
836
- pluginType = await detectPluginType(sourceInfo);
837
- spinner?.succeed(i18n.detectedType(pluginType));
838
- } catch {
839
- spinner?.info(i18n.defaultType);
840
- pluginType = "skill";
841
- }
842
- }
843
- spinner?.start(dryRun ? i18n.previewInstall : i18n.installing);
844
- try {
845
- let result;
846
- switch (sourceInfo.type) {
847
- case "github":
848
- result = await installFromGitHub(sourceInfo, pluginType, { force, dryRun });
849
- break;
850
- case "npm":
851
- result = await installFromNpm(sourceInfo, pluginType, { force, dryRun });
852
- break;
853
- case "local":
854
- result = await installFromLocal(sourceInfo, pluginType, { force, dryRun });
855
- break;
856
- default:
857
- throw new Error(`Unsupported source type: ${sourceInfo.type}`);
858
- }
859
- if (result.success) {
860
- spinner?.succeed(dryRun ? i18n.previewSuccess : i18n.installSuccess);
861
- } else {
862
- spinner?.fail(i18n.installFailed);
863
- }
864
- if (json) {
865
- console.log(JSON.stringify(result, null, 2));
866
- } else if (result.success && !dryRun) {
867
- printSuccessMessage(result, i18n);
868
- } else if (result.success && dryRun) {
869
- printPreviewMessage(result, i18n);
870
- } else {
871
- console.error(a.red(`
872
- ${i18n.error}: ${result.error}
873
- `));
874
- }
875
- return result;
876
- } catch (error) {
877
- spinner?.fail(i18n.installFailed);
878
- const result = {
879
- success: false,
880
- source,
881
- sourceType: sourceInfo.type,
882
- pluginType,
883
- error: error instanceof Error ? error.message : String(error)
884
- };
885
- if (json) {
886
- console.log(JSON.stringify(result, null, 2));
887
- } else {
888
- console.error(a.red(`
889
- ${i18n.error}: ${result.error}
890
- `));
891
- }
892
- return result;
893
- }
894
- }
895
- function printSuccessMessage(result, i18n) {
896
- console.log();
897
- console.log(a.green.bold(`\u2713 ${i18n.installed}`));
898
- console.log();
899
- console.log(` ${a.gray(i18n.name)}: ${result.details?.name || result.source}`);
900
- if (result.details?.version) {
901
- console.log(` ${a.gray(i18n.version)}: ${result.details.version}`);
902
- }
903
- console.log(` ${a.gray(i18n.type)}: ${result.pluginType}`);
904
- console.log(` ${a.gray(i18n.path)}: ${result.installedPath}`);
905
- console.log();
906
- console.log(a.cyan(i18n.nextSteps));
907
- switch (result.pluginType) {
908
- case "skill":
909
- console.log(` ${a.gray("\u2022")} ${i18n.skillHint}`);
910
- break;
911
- case "mcp":
912
- console.log(` ${a.gray("\u2022")} ${i18n.mcpHint}`);
913
- break;
914
- case "agent":
915
- console.log(` ${a.gray("\u2022")} ${i18n.agentHint}`);
916
- break;
917
- case "hook":
918
- console.log(` ${a.gray("\u2022")} ${i18n.hookHint}`);
919
- break;
920
- }
921
- console.log();
922
- }
923
- function printPreviewMessage(result, i18n) {
924
- console.log();
925
- console.log(a.yellow.bold(`\u26A1 ${i18n.preview}`));
926
- console.log();
927
- console.log(` ${a.gray(i18n.source)}: ${result.source}`);
928
- console.log(` ${a.gray(i18n.type)}: ${result.pluginType}`);
929
- console.log(` ${a.gray(i18n.target)}: ${result.installedPath}`);
930
- if (result.details?.files?.length) {
931
- console.log(` ${a.gray(i18n.files)}:`);
932
- for (const file of result.details.files.slice(0, 5)) {
933
- console.log(` ${a.gray("\u2022")} ${file}`);
934
- }
935
- if (result.details.files.length > 5) {
936
- console.log(` ${a.gray("...")} ${i18n.andMore(result.details.files.length - 5)}`);
937
- }
938
- }
939
- console.log();
940
- console.log(a.gray(i18n.dryRunNote));
941
- console.log();
942
- }
943
- function getI18n(lang) {
944
- const texts = {
945
- "zh-CN": {
946
- parsing: "\u89E3\u6790\u6765\u6E90...",
947
- parsed: (type) => `\u6765\u6E90\u7C7B\u578B: ${type}`,
948
- parseFailed: "\u89E3\u6790\u6765\u6E90\u5931\u8D25",
949
- detectingType: "\u68C0\u6D4B\u63D2\u4EF6\u7C7B\u578B...",
950
- detectedType: (type) => `\u68C0\u6D4B\u5230\u7C7B\u578B: ${type}`,
951
- defaultType: "\u4F7F\u7528\u9ED8\u8BA4\u7C7B\u578B: skill",
952
- installing: "\u5B89\u88C5\u4E2D...",
953
- previewInstall: "\u9884\u89C8\u5B89\u88C5...",
954
- installSuccess: "\u5B89\u88C5\u6210\u529F",
955
- previewSuccess: "\u9884\u89C8\u5B8C\u6210",
956
- installFailed: "\u5B89\u88C5\u5931\u8D25",
957
- error: "\u9519\u8BEF",
958
- installed: "\u63D2\u4EF6\u5DF2\u5B89\u88C5",
959
- preview: "\u5B89\u88C5\u9884\u89C8 (dry-run)",
960
- name: "\u540D\u79F0",
961
- version: "\u7248\u672C",
962
- type: "\u7C7B\u578B",
963
- path: "\u8DEF\u5F84",
964
- source: "\u6765\u6E90",
965
- target: "\u76EE\u6807",
966
- files: "\u6587\u4EF6",
967
- nextSteps: "\u4E0B\u4E00\u6B65:",
968
- skillHint: "\u4F7F\u7528 /skill-name \u5728 Claude Code \u4E2D\u8C03\u7528",
969
- mcpHint: "\u8FD0\u884C ccjk mcp status \u67E5\u770B\u72B6\u6001",
970
- agentHint: "\u4F7F\u7528 ccjk agent list \u67E5\u770B\u5DF2\u5B89\u88C5\u7684 agent",
971
- hookHint: "\u8FD0\u884C ccjk hooks list \u67E5\u770B\u5DF2\u5B89\u88C5\u7684 hook",
972
- dryRunNote: "\u8FD9\u662F\u9884\u89C8\u6A21\u5F0F\uFF0C\u672A\u5B9E\u9645\u5B89\u88C5\u3002\u79FB\u9664 --dry-run \u6267\u884C\u5B89\u88C5\u3002",
973
- andMore: (n) => `\u8FD8\u6709 ${n} \u4E2A\u6587\u4EF6`
974
- },
975
- "en": {
976
- parsing: "Parsing source...",
977
- parsed: (type) => `Source type: ${type}`,
978
- parseFailed: "Failed to parse source",
979
- detectingType: "Detecting plugin type...",
980
- detectedType: (type) => `Detected type: ${type}`,
981
- defaultType: "Using default type: skill",
982
- installing: "Installing...",
983
- previewInstall: "Previewing installation...",
984
- installSuccess: "Installation successful",
985
- previewSuccess: "Preview complete",
986
- installFailed: "Installation failed",
987
- error: "Error",
988
- installed: "Plugin installed",
989
- preview: "Installation preview (dry-run)",
990
- name: "Name",
991
- version: "Version",
992
- type: "Type",
993
- path: "Path",
994
- source: "Source",
995
- target: "Target",
996
- files: "Files",
997
- nextSteps: "Next steps:",
998
- skillHint: "Use /skill-name in Claude Code to invoke",
999
- mcpHint: "Run ccjk mcp status to check status",
1000
- agentHint: "Use ccjk agent list to see installed agents",
1001
- hookHint: "Run ccjk hooks list to see installed hooks",
1002
- dryRunNote: "This is preview mode, nothing was installed. Remove --dry-run to install.",
1003
- andMore: (n) => `and ${n} more files`
1004
- }
180
+ const loadResults = await loadCoreSkills(lang);
181
+ const successfulLoads = loadResults.filter((r) => r.success);
182
+ const allCoreSkillsLoaded = successfulLoads.length === loadResults.length;
183
+ const newStatus = {
184
+ isInstalled: true,
185
+ coreSkillsLoaded: allCoreSkillsLoaded,
186
+ loadedSkills: successfulLoads.map((r) => r.skill),
187
+ needsActivation: false,
188
+ lastActivation: (/* @__PURE__ */ new Date()).toISOString()
1005
189
  };
1006
- return texts[lang];
190
+ saveActivationState(newStatus);
191
+ return newStatus;
1007
192
  }
1008
193
 
1009
- export { addCommand, parseSource };
194
+ export { activateSuperpowers, autoInstallSuperpowers, checkActivationStatus, loadCoreSkills, loadSkill };