ccjk 9.5.6 → 9.7.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 (103) hide show
  1. package/dist/chunks/agent.mjs +1 -1
  2. package/dist/chunks/api-providers.mjs +1 -1
  3. package/dist/chunks/api.mjs +3 -3
  4. package/dist/chunks/auto-bootstrap.mjs +1 -1
  5. package/dist/chunks/auto-updater.mjs +1 -1
  6. package/dist/chunks/boost.mjs +160 -0
  7. package/dist/chunks/ccjk-agents.mjs +1 -1
  8. package/dist/chunks/ccjk-all.mjs +1 -1
  9. package/dist/chunks/ccjk-config.mjs +1 -1
  10. package/dist/chunks/ccjk-hooks.mjs +1 -1
  11. package/dist/chunks/ccjk-mcp.mjs +2 -2
  12. package/dist/chunks/ccjk-setup.mjs +1 -1
  13. package/dist/chunks/ccjk-skills.mjs +1 -1
  14. package/dist/chunks/ccr.mjs +25 -30
  15. package/dist/chunks/ccu.mjs +1 -1
  16. package/dist/chunks/check-updates.mjs +3 -4
  17. package/dist/chunks/claude-code-config-manager.mjs +7 -7
  18. package/dist/chunks/claude-code-incremental-manager.mjs +2 -2
  19. package/dist/chunks/claude-config.mjs +4 -4
  20. package/dist/chunks/claude-wrapper.mjs +2 -2
  21. package/dist/chunks/codex-config-switch.mjs +4 -5
  22. package/dist/chunks/codex-provider-manager.mjs +2 -3
  23. package/dist/chunks/codex-uninstaller.mjs +2 -2
  24. package/dist/chunks/codex.mjs +207 -6
  25. package/dist/chunks/commands.mjs +391 -88
  26. package/dist/chunks/commands2.mjs +88 -391
  27. package/dist/chunks/completion.mjs +1 -1
  28. package/dist/chunks/config-consolidator.mjs +2 -2
  29. package/dist/chunks/config-switch.mjs +3 -4
  30. package/dist/chunks/config.mjs +78 -7
  31. package/dist/chunks/config2.mjs +400 -410
  32. package/dist/chunks/config3.mjs +410 -400
  33. package/dist/chunks/constants.mjs +1 -1
  34. package/dist/chunks/doctor.mjs +4 -4
  35. package/dist/chunks/features.mjs +24 -17
  36. package/dist/chunks/index.mjs +178 -7
  37. package/dist/chunks/index2.mjs +1162 -169
  38. package/dist/chunks/index3.mjs +910 -1076
  39. package/dist/chunks/index4.mjs +137 -947
  40. package/dist/chunks/index5.mjs +635 -167
  41. package/dist/chunks/init.mjs +141 -99
  42. package/dist/chunks/installer.mjs +147 -649
  43. package/dist/chunks/installer2.mjs +649 -147
  44. package/dist/chunks/interview.mjs +2 -2
  45. package/dist/chunks/marketplace.mjs +1 -1
  46. package/dist/chunks/mcp.mjs +1058 -17
  47. package/dist/chunks/menu.mjs +147 -56
  48. package/dist/chunks/monitor.mjs +2 -2
  49. package/dist/chunks/notification.mjs +1 -1
  50. package/dist/chunks/onboarding.mjs +2 -2
  51. package/dist/chunks/package.mjs +2 -210
  52. package/dist/chunks/permission-manager.mjs +2 -2
  53. package/dist/chunks/permissions.mjs +1 -1
  54. package/dist/chunks/platform.mjs +1 -1
  55. package/dist/chunks/plugin.mjs +1 -1
  56. package/dist/chunks/prompts.mjs +1 -1
  57. package/dist/chunks/providers.mjs +1 -1
  58. package/dist/chunks/quick-setup.mjs +16 -20
  59. package/dist/chunks/silent-updater.mjs +1 -1
  60. package/dist/chunks/simple-config.mjs +2 -2
  61. package/dist/chunks/skill.mjs +1 -1
  62. package/dist/chunks/skills-sync.mjs +1 -1
  63. package/dist/chunks/skills.mjs +1 -1
  64. package/dist/chunks/startup.mjs +1 -1
  65. package/dist/chunks/stats.mjs +1 -1
  66. package/dist/chunks/status.mjs +159 -0
  67. package/dist/chunks/team.mjs +1 -1
  68. package/dist/chunks/thinking.mjs +2 -2
  69. package/dist/chunks/uninstall.mjs +6 -6
  70. package/dist/chunks/update.mjs +6 -9
  71. package/dist/chunks/upgrade-manager.mjs +2 -2
  72. package/dist/chunks/version-checker.mjs +3 -3
  73. package/dist/chunks/vim.mjs +1 -1
  74. package/dist/chunks/workflows.mjs +616 -215
  75. package/dist/cli.mjs +70 -121
  76. package/dist/index.d.mts +17 -1482
  77. package/dist/index.d.ts +17 -1482
  78. package/dist/index.mjs +950 -4740
  79. package/dist/shared/{ccjk.zCqdxT2Y.mjs → ccjk.Br91zBIG.mjs} +2 -2
  80. package/dist/shared/ccjk.CSkyCZIM.mjs +638 -0
  81. package/dist/shared/{ccjk.BKoi8-Hy.mjs → ccjk.DE91nClQ.mjs} +1 -1
  82. package/dist/shared/{ccjk.f40us0yY.mjs → ccjk.DvIrK0wz.mjs} +2 -2
  83. package/dist/shared/ccjk.LsPZ2PYo.mjs +1048 -0
  84. package/dist/shared/{ccjk.DRweXU5F.mjs → ccjk.q1koQxEE.mjs} +2 -2
  85. package/package.json +1 -1
  86. package/templates/claude-code/common/settings.json +15 -111
  87. package/dist/chunks/api-adapter.mjs +0 -180
  88. package/dist/chunks/cli.mjs +0 -2227
  89. package/dist/chunks/context-menu.mjs +0 -913
  90. package/dist/chunks/hooks-sync.mjs +0 -1627
  91. package/dist/chunks/index6.mjs +0 -663
  92. package/dist/chunks/mcp-market.mjs +0 -1077
  93. package/dist/chunks/mcp-server.mjs +0 -776
  94. package/dist/chunks/project-detector.mjs +0 -131
  95. package/dist/chunks/provider-registry.mjs +0 -92
  96. package/dist/chunks/setup-wizard.mjs +0 -362
  97. package/dist/chunks/tools.mjs +0 -143
  98. package/dist/chunks/workflows2.mjs +0 -633
  99. package/dist/shared/ccjk.BM_HZogn.mjs +0 -347
  100. package/dist/shared/ccjk.BaEp4UHQ.mjs +0 -75
  101. package/dist/shared/ccjk.CS0ybJCf.mjs +0 -490
  102. package/dist/shared/ccjk.CZgIwikC.mjs +0 -209
  103. package/dist/shared/ccjk.tO8zeFh1.mjs +0 -397
@@ -1,195 +1,663 @@
1
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join, dirname } from 'pathe';
2
3
  import { homedir } from 'node:os';
3
- import process__default from 'node:process';
4
- import { join } from 'pathe';
5
- import { i as installSuperpowers } from '../shared/ccjk.BKoi8-Hy.mjs';
6
- import 'node:child_process';
7
- import 'node:fs/promises';
8
- import 'node:util';
9
- import './index2.mjs';
10
- import 'node:url';
11
- import 'i18next';
12
- import 'i18next-fs-backend';
4
+ import { fileURLToPath } from 'node:url';
13
5
 
14
- const CORE_SKILLS = [
15
- "agent-browser",
16
- "tdd",
17
- "debugging",
18
- "code-review",
19
- "git-worktrees"
20
- ];
21
-
22
- function getSuperpowersDir$1() {
23
- return join(homedir(), ".claude", "plugins", "superpowers");
24
- }
25
- function isSuperpowersInstalled() {
26
- const superpowersDir = getSuperpowersDir$1();
27
- return existsSync(superpowersDir) && existsSync(join(superpowersDir, "skills"));
28
- }
29
- function areCoreSkillsInstalled() {
30
- const skillsDir = join(getSuperpowersDir$1(), "skills");
31
- if (!existsSync(skillsDir)) {
32
- return false;
33
- }
34
- for (const skill of CORE_SKILLS) {
35
- const skillPath = join(skillsDir, skill);
36
- if (!existsSync(skillPath) || !existsSync(join(skillPath, "skill.json"))) {
37
- return false;
38
- }
6
+ class ProjectAnalyzer {
7
+ projectRoot;
8
+ constructor(projectRoot = process.cwd()) {
9
+ this.projectRoot = projectRoot;
39
10
  }
40
- return true;
41
- }
42
- async function autoInstallSuperpowers(lang = "zh-CN") {
43
- try {
44
- if (isSuperpowersInstalled() && areCoreSkillsInstalled()) {
45
- return true;
46
- }
47
- const result = await installSuperpowers({
48
- lang,
49
- skipPrompt: true
50
- // Skip user prompts for silent installation
51
- });
52
- if (!result.success) {
53
- if (process__default.env.DEBUG) {
54
- console.error("[CCJK Zero-Config] Installation failed:", result.error || result.message);
55
- }
56
- return false;
11
+ /**
12
+ * Analyze project and return comprehensive analysis
13
+ */
14
+ async analyze() {
15
+ const packageJson = this.readPackageJson();
16
+ const techStack = this.detectTechStack(packageJson);
17
+ const projectType = this.detectProjectType(techStack, packageJson);
18
+ const frameworks = this.detectFrameworks(packageJson);
19
+ const hasTests = this.detectTestFramework(packageJson);
20
+ const hasDatabase = this.detectDatabase(packageJson);
21
+ const hasApi = this.detectApiEndpoints();
22
+ const buildTool = this.detectBuildTool(packageJson);
23
+ const cicd = this.detectCICD();
24
+ const patterns = this.detectPatterns();
25
+ const confidence = this.calculateConfidence(techStack, frameworks);
26
+ return {
27
+ projectRoot: this.projectRoot,
28
+ projectType,
29
+ techStack,
30
+ frameworks,
31
+ hasTests,
32
+ hasDatabase,
33
+ hasApi,
34
+ buildTool,
35
+ cicd,
36
+ patterns,
37
+ confidence,
38
+ packageJson: packageJson ?? void 0
39
+ };
40
+ }
41
+ /**
42
+ * Read and parse package.json
43
+ */
44
+ readPackageJson() {
45
+ const packageJsonPath = join(this.projectRoot, "package.json");
46
+ if (!existsSync(packageJsonPath)) {
47
+ return null;
57
48
  }
58
- return isSuperpowersInstalled() && areCoreSkillsInstalled();
59
- } catch (error) {
60
- if (process__default.env.DEBUG) {
61
- console.error("[CCJK Zero-Config] Auto-install failed:", error);
49
+ try {
50
+ const content = readFileSync(packageJsonPath, "utf-8");
51
+ return JSON.parse(content);
52
+ } catch {
53
+ return null;
62
54
  }
63
- return false;
64
55
  }
65
- }
66
-
67
- function getSkillsDir() {
68
- return join(homedir(), ".claude", "plugins", "superpowers", "skills");
69
- }
70
- function isSkillInstalled(skillName) {
71
- const skillPath = join(getSkillsDir(), skillName);
72
- return existsSync(skillPath) && existsSync(join(skillPath, "skill.json"));
73
- }
74
- async function loadSkill(skillName) {
75
- try {
76
- if (!isSkillInstalled(skillName)) {
56
+ /**
57
+ * Detect technology stack from dependencies
58
+ */
59
+ detectTechStack(packageJson) {
60
+ if (!packageJson) {
77
61
  return {
78
- skill: skillName,
79
- success: false,
80
- error: "Skill not installed"
62
+ languages: ["javascript"],
63
+ runtime: "node",
64
+ packageManager: this.detectPackageManager()
81
65
  };
82
66
  }
83
- const skillJsonPath = join(getSkillsDir(), skillName, "skill.json");
84
- const skillJson = JSON.parse(readFileSync(skillJsonPath, "utf-8"));
85
- if (!skillJson.name || !skillJson.version) {
86
- return {
87
- skill: skillName,
88
- success: false,
89
- error: "Invalid skill.json format"
90
- };
67
+ const deps = {
68
+ ...packageJson.dependencies,
69
+ ...packageJson.devDependencies
70
+ };
71
+ const languages = [];
72
+ let runtime = "node";
73
+ if (deps.typescript || existsSync(join(this.projectRoot, "tsconfig.json"))) {
74
+ languages.push("typescript");
75
+ } else {
76
+ languages.push("javascript");
77
+ }
78
+ if (existsSync(join(this.projectRoot, "deno.json")) || existsSync(join(this.projectRoot, "deno.jsonc"))) {
79
+ runtime = "deno";
80
+ }
81
+ if (existsSync(join(this.projectRoot, "bun.lockb"))) {
82
+ runtime = "bun";
91
83
  }
92
84
  return {
93
- skill: skillName,
94
- success: true
85
+ languages,
86
+ runtime,
87
+ packageManager: this.detectPackageManager()
95
88
  };
96
- } catch (error) {
97
- return {
98
- skill: skillName,
99
- success: false,
100
- error: error instanceof Error ? error.message : "Unknown error"
89
+ }
90
+ /**
91
+ * Detect package manager
92
+ */
93
+ detectPackageManager() {
94
+ if (existsSync(join(this.projectRoot, "pnpm-lock.yaml"))) {
95
+ return "pnpm";
96
+ }
97
+ if (existsSync(join(this.projectRoot, "yarn.lock"))) {
98
+ return "yarn";
99
+ }
100
+ if (existsSync(join(this.projectRoot, "bun.lockb"))) {
101
+ return "bun";
102
+ }
103
+ if (existsSync(join(this.projectRoot, "package-lock.json"))) {
104
+ return "npm";
105
+ }
106
+ return "npm";
107
+ }
108
+ /**
109
+ * Detect project type
110
+ */
111
+ detectProjectType(techStack, packageJson) {
112
+ if (!packageJson) {
113
+ return "unknown";
114
+ }
115
+ const deps = {
116
+ ...packageJson.dependencies,
117
+ ...packageJson.devDependencies
101
118
  };
119
+ const hasFrontend = deps.react || deps.vue || deps["@angular/core"] || deps.svelte;
120
+ const hasBackend = deps.express || deps.fastify || deps.koa || deps["@nestjs/core"] || deps.hapi;
121
+ if (deps.next || deps.nuxt || deps["@remix-run/react"] || deps["@sveltejs/kit"]) {
122
+ return "fullstack";
123
+ }
124
+ if (packageJson.bin || deps.commander || deps.yargs || deps.cac) {
125
+ return "cli";
126
+ }
127
+ if (packageJson.main && !hasFrontend && !hasBackend) {
128
+ return "library";
129
+ }
130
+ if (hasFrontend && hasBackend) {
131
+ return "fullstack";
132
+ }
133
+ if (hasFrontend) {
134
+ return "frontend";
135
+ }
136
+ if (hasBackend) {
137
+ return "backend";
138
+ }
139
+ return "unknown";
140
+ }
141
+ /**
142
+ * Detect frameworks
143
+ */
144
+ detectFrameworks(packageJson) {
145
+ if (!packageJson) {
146
+ return [];
147
+ }
148
+ const deps = {
149
+ ...packageJson.dependencies,
150
+ ...packageJson.devDependencies
151
+ };
152
+ const frameworks = [];
153
+ if (deps.react)
154
+ frameworks.push("react");
155
+ if (deps.vue)
156
+ frameworks.push("vue");
157
+ if (deps["@angular/core"])
158
+ frameworks.push("angular");
159
+ if (deps.svelte)
160
+ frameworks.push("svelte");
161
+ if (deps.next)
162
+ frameworks.push("next.js");
163
+ if (deps.nuxt)
164
+ frameworks.push("nuxt");
165
+ if (deps["@remix-run/react"])
166
+ frameworks.push("remix");
167
+ if (deps["@sveltejs/kit"])
168
+ frameworks.push("sveltekit");
169
+ if (deps.express)
170
+ frameworks.push("express");
171
+ if (deps.fastify)
172
+ frameworks.push("fastify");
173
+ if (deps.koa)
174
+ frameworks.push("koa");
175
+ if (deps["@nestjs/core"])
176
+ frameworks.push("nestjs");
177
+ if (deps.hapi)
178
+ frameworks.push("hapi");
179
+ return frameworks;
180
+ }
181
+ /**
182
+ * Detect test framework
183
+ */
184
+ detectTestFramework(packageJson) {
185
+ if (!packageJson) {
186
+ return false;
187
+ }
188
+ const deps = {
189
+ ...packageJson.dependencies,
190
+ ...packageJson.devDependencies
191
+ };
192
+ return !!(deps.vitest || deps.jest || deps.mocha || deps.ava || deps["@playwright/test"] || deps.cypress);
193
+ }
194
+ /**
195
+ * Detect database usage
196
+ */
197
+ detectDatabase(packageJson) {
198
+ if (!packageJson) {
199
+ return false;
200
+ }
201
+ const deps = {
202
+ ...packageJson.dependencies,
203
+ ...packageJson.devDependencies
204
+ };
205
+ return !!(deps.prisma || deps["@prisma/client"] || deps.drizzle || deps["drizzle-orm"] || deps.typeorm || deps.sequelize || deps.mongoose || deps.pg || deps.mysql || deps.mysql2 || deps.sqlite3 || deps["better-sqlite3"]);
206
+ }
207
+ /**
208
+ * Detect API endpoints
209
+ */
210
+ detectApiEndpoints() {
211
+ const apiDirs = [
212
+ "src/api",
213
+ "src/routes",
214
+ "api",
215
+ "routes",
216
+ "pages/api",
217
+ // Next.js
218
+ "app/api"
219
+ // Next.js App Router
220
+ ];
221
+ return apiDirs.some((dir) => existsSync(join(this.projectRoot, dir)));
222
+ }
223
+ /**
224
+ * Detect build tool
225
+ */
226
+ detectBuildTool(packageJson) {
227
+ if (!packageJson) {
228
+ return void 0;
229
+ }
230
+ const deps = {
231
+ ...packageJson.dependencies,
232
+ ...packageJson.devDependencies
233
+ };
234
+ if (deps.vite || existsSync(join(this.projectRoot, "vite.config.ts"))) {
235
+ return "vite";
236
+ }
237
+ if (deps.webpack || existsSync(join(this.projectRoot, "webpack.config.js"))) {
238
+ return "webpack";
239
+ }
240
+ if (deps.rollup || existsSync(join(this.projectRoot, "rollup.config.js"))) {
241
+ return "rollup";
242
+ }
243
+ if (deps.esbuild) {
244
+ return "esbuild";
245
+ }
246
+ if (deps.turbo || existsSync(join(this.projectRoot, "turbo.json"))) {
247
+ return "turbo";
248
+ }
249
+ return void 0;
250
+ }
251
+ /**
252
+ * Detect CI/CD configuration
253
+ */
254
+ detectCICD() {
255
+ const cicd = [];
256
+ if (existsSync(join(this.projectRoot, ".github", "workflows"))) {
257
+ cicd.push("github-actions");
258
+ }
259
+ if (existsSync(join(this.projectRoot, ".gitlab-ci.yml"))) {
260
+ cicd.push("gitlab-ci");
261
+ }
262
+ if (existsSync(join(this.projectRoot, ".circleci", "config.yml"))) {
263
+ cicd.push("circleci");
264
+ }
265
+ if (existsSync(join(this.projectRoot, ".travis.yml"))) {
266
+ cicd.push("travis-ci");
267
+ }
268
+ return cicd;
269
+ }
270
+ /**
271
+ * Detect common patterns in the project
272
+ */
273
+ detectPatterns() {
274
+ const patterns = [];
275
+ if (existsSync(join(this.projectRoot, "packages")) || existsSync(join(this.projectRoot, "apps"))) {
276
+ patterns.push("monorepo");
277
+ }
278
+ if (existsSync(join(this.projectRoot, "tsconfig.json"))) {
279
+ patterns.push("typescript");
280
+ }
281
+ if (existsSync(join(this.projectRoot, ".eslintrc.js")) || existsSync(join(this.projectRoot, "eslint.config.js"))) {
282
+ patterns.push("eslint");
283
+ }
284
+ if (existsSync(join(this.projectRoot, ".prettierrc")) || existsSync(join(this.projectRoot, "prettier.config.js"))) {
285
+ patterns.push("prettier");
286
+ }
287
+ if (existsSync(join(this.projectRoot, "Dockerfile")) || existsSync(join(this.projectRoot, "docker-compose.yml"))) {
288
+ patterns.push("docker");
289
+ }
290
+ if (existsSync(join(this.projectRoot, ".env.example")) || existsSync(join(this.projectRoot, ".env.local"))) {
291
+ patterns.push("env-config");
292
+ }
293
+ return patterns;
294
+ }
295
+ /**
296
+ * Calculate confidence score based on detected information
297
+ */
298
+ calculateConfidence(techStack, frameworks) {
299
+ let confidence = 0.5;
300
+ if (techStack.languages.length > 0)
301
+ confidence += 0.1;
302
+ if (techStack.runtime !== "unknown")
303
+ confidence += 0.1;
304
+ if (techStack.packageManager)
305
+ confidence += 0.1;
306
+ if (frameworks.length > 0)
307
+ confidence += 0.1;
308
+ if (frameworks.length > 2)
309
+ confidence += 0.1;
310
+ return Math.min(confidence, 1);
311
+ }
312
+ /**
313
+ * Get file count in directory
314
+ */
315
+ getFileCount(dir) {
316
+ try {
317
+ if (!existsSync(dir)) {
318
+ return 0;
319
+ }
320
+ let count = 0;
321
+ const items = readdirSync(dir);
322
+ for (const item of items) {
323
+ const fullPath = join(dir, item);
324
+ const stat = statSync(fullPath);
325
+ if (stat.isDirectory()) {
326
+ count += this.getFileCount(fullPath);
327
+ } else {
328
+ count++;
329
+ }
330
+ }
331
+ return count;
332
+ } catch {
333
+ return 0;
334
+ }
102
335
  }
103
336
  }
104
- async function loadCoreSkills(_lang = "zh-CN") {
105
- const results = await Promise.all(
106
- CORE_SKILLS.map((skill) => loadSkill(skill))
107
- );
108
- if (process__default.env.DEBUG) {
109
- const successful = results.filter((r) => r.success);
110
- const failed = results.filter((r) => !r.success);
111
- console.log(`[Zero-Config] Loaded ${successful.length}/${CORE_SKILLS.length} core skills`);
112
- if (failed.length > 0) {
113
- console.log(`[Zero-Config] Failed skills: ${failed.map((r) => r.skill).join(", ")}`);
114
- }
115
- }
116
- return results;
337
+ async function analyzeProject(projectRoot) {
338
+ const analyzer = new ProjectAnalyzer(projectRoot);
339
+ return analyzer.analyze();
117
340
  }
118
341
 
119
- function getActivationStatePath() {
120
- return join(homedir(), ".claude", "plugins", "superpowers", ".activation-state.json");
121
- }
122
- function getSuperpowersDir() {
123
- return join(homedir(), ".claude", "plugins", "superpowers");
124
- }
125
- function loadActivationState() {
126
- try {
127
- const statePath = getActivationStatePath();
128
- if (!existsSync(statePath)) {
129
- return null;
342
+ const __filename$1 = fileURLToPath(import.meta.url);
343
+ const __dirname$1 = dirname(__filename$1);
344
+ class ConfigGenerator {
345
+ templatesDir;
346
+ outputDir;
347
+ constructor(templatesDir, outputDir) {
348
+ this.templatesDir = templatesDir || join(__dirname$1, "..", "templates");
349
+ this.outputDir = outputDir || join(homedir(), ".config", "claude");
350
+ }
351
+ /**
352
+ * Generate configurations from template selection
353
+ */
354
+ async generate(selection) {
355
+ const agentConfigs = await this.generateAgents(selection.agents);
356
+ const skillConfigs = await this.generateSkills(selection.skills);
357
+ return {
358
+ agents: agentConfigs,
359
+ skills: skillConfigs,
360
+ summary: this.generateSummary(agentConfigs, skillConfigs)
361
+ };
362
+ }
363
+ /**
364
+ * Generate agent configurations
365
+ */
366
+ async generateAgents(agents) {
367
+ const configs = [];
368
+ for (const agent of agents) {
369
+ const templatePath = join(this.templatesDir, "agents", agent.file);
370
+ if (!existsSync(templatePath)) {
371
+ console.warn(`Agent template not found: ${agent.file}`);
372
+ continue;
373
+ }
374
+ const content = readFileSync(templatePath, "utf-8");
375
+ const outputPath = join(this.outputDir, "agents", agent.file);
376
+ configs.push({
377
+ id: agent.id,
378
+ path: outputPath,
379
+ content
380
+ });
130
381
  }
131
- const stateJson = readFileSync(statePath, "utf-8");
132
- return JSON.parse(stateJson);
133
- } catch (error) {
134
- if (process__default.env.DEBUG) {
135
- console.error("[Zero-Config] Failed to load activation state:", error);
382
+ return configs;
383
+ }
384
+ /**
385
+ * Generate skill configurations
386
+ */
387
+ async generateSkills(skills) {
388
+ const configs = [];
389
+ for (const skill of skills) {
390
+ const templatePath = join(this.templatesDir, "skills", skill.file);
391
+ if (!existsSync(templatePath)) {
392
+ console.warn(`Skill template not found: ${skill.file}`);
393
+ continue;
394
+ }
395
+ const content = readFileSync(templatePath, "utf-8");
396
+ const outputPath = join(this.outputDir, "skills", skill.file);
397
+ configs.push({
398
+ id: skill.id,
399
+ path: outputPath,
400
+ content
401
+ });
136
402
  }
137
- return null;
403
+ return configs;
138
404
  }
139
- }
140
- function saveActivationState(status) {
141
- try {
142
- const statePath = getActivationStatePath();
143
- writeFileSync(statePath, JSON.stringify(status, null, 2), "utf-8");
144
- } catch (error) {
145
- if (process__default.env.DEBUG) {
146
- console.error("[Zero-Config] Failed to save activation state:", error);
405
+ /**
406
+ * Write configurations to disk
407
+ */
408
+ async write(config) {
409
+ const agentsDir = join(this.outputDir, "agents");
410
+ const skillsDir = join(this.outputDir, "skills");
411
+ if (!existsSync(agentsDir)) {
412
+ mkdirSync(agentsDir, { recursive: true });
413
+ }
414
+ if (!existsSync(skillsDir)) {
415
+ mkdirSync(skillsDir, { recursive: true });
416
+ }
417
+ for (const agent of config.agents) {
418
+ const dir = join(agent.path, "..");
419
+ if (!existsSync(dir)) {
420
+ mkdirSync(dir, { recursive: true });
421
+ }
422
+ writeFileSync(agent.path, agent.content, "utf-8");
147
423
  }
424
+ for (const skill of config.skills) {
425
+ const dir = join(skill.path, "..");
426
+ if (!existsSync(dir)) {
427
+ mkdirSync(dir, { recursive: true });
428
+ }
429
+ writeFileSync(skill.path, skill.content, "utf-8");
430
+ }
431
+ }
432
+ /**
433
+ * Generate summary
434
+ */
435
+ generateSummary(agents, skills) {
436
+ const lines = [];
437
+ lines.push("# Generated Configuration Summary\n");
438
+ lines.push(`Generated at: ${(/* @__PURE__ */ new Date()).toISOString()}
439
+ `);
440
+ lines.push("## Agents\n");
441
+ for (const agent of agents) {
442
+ lines.push(`- ${agent.id}: ${agent.path}`);
443
+ }
444
+ lines.push("\n## Skills\n");
445
+ for (const skill of skills) {
446
+ lines.push(`- ${skill.id}: ${skill.path}`);
447
+ }
448
+ lines.push("\n## Usage\n");
449
+ lines.push("1. Agents are automatically loaded by Claude Code");
450
+ lines.push("2. Skills can be triggered using their command triggers");
451
+ lines.push("3. Use `claude` command to start coding with AI assistance");
452
+ return lines.join("\n");
148
453
  }
149
454
  }
150
- function checkActivationStatus() {
151
- const superpowersInstalled = existsSync(getSuperpowersDir());
152
- const savedState = loadActivationState();
153
- if (savedState) {
154
- return savedState;
155
- }
156
- return {
157
- isInstalled: superpowersInstalled,
158
- coreSkillsLoaded: false,
159
- loadedSkills: [],
160
- needsActivation: true,
161
- lastActivation: void 0
162
- };
455
+ async function generateConfigs(selection) {
456
+ const generator = new ConfigGenerator();
457
+ return generator.generate(selection);
163
458
  }
164
- async function activateSuperpowers(lang = "zh-CN") {
165
- const currentStatus = checkActivationStatus();
166
- if (!currentStatus.needsActivation) {
167
- return currentStatus;
168
- }
169
- if (!currentStatus.isInstalled) {
170
- const installSuccess = await autoInstallSuperpowers(lang);
171
- if (!installSuccess) {
172
- return {
173
- isInstalled: false,
174
- coreSkillsLoaded: false,
175
- loadedSkills: [],
176
- needsActivation: true,
177
- lastActivation: void 0
178
- };
459
+ async function writeConfigs(config) {
460
+ const generator = new ConfigGenerator();
461
+ await generator.write(config);
462
+ }
463
+
464
+ const __filename = fileURLToPath(import.meta.url);
465
+ const __dirname = dirname(__filename);
466
+ class TemplateSelector {
467
+ templatesDir;
468
+ constructor(templatesDir) {
469
+ this.templatesDir = templatesDir || join(__dirname, "..", "..", "..", "templates");
470
+ }
471
+ /**
472
+ * Select templates based on project analysis
473
+ */
474
+ async select(analysis) {
475
+ const agents = await this.selectAgents(analysis);
476
+ const skills = await this.selectSkills(analysis);
477
+ return {
478
+ agents,
479
+ skills,
480
+ reasoning: this.generateReasoning(analysis, agents, skills)
481
+ };
482
+ }
483
+ /**
484
+ * Select agent templates
485
+ */
486
+ async selectAgents(analysis) {
487
+ const selectedAgents = [];
488
+ const agentIndex = this.loadAgentIndex();
489
+ switch (analysis.projectType) {
490
+ case "frontend":
491
+ selectedAgents.push(
492
+ ...this.findAgentsByCategory(agentIndex, "frontend")
493
+ );
494
+ break;
495
+ case "backend":
496
+ selectedAgents.push(
497
+ ...this.findAgentsByCategory(agentIndex, "backend")
498
+ );
499
+ break;
500
+ case "fullstack":
501
+ selectedAgents.push(
502
+ ...this.findAgentsByCategory(agentIndex, "fullstack")
503
+ );
504
+ selectedAgents.push(
505
+ ...this.findAgentsByCategory(agentIndex, "frontend").slice(0, 1),
506
+ ...this.findAgentsByCategory(agentIndex, "backend").slice(0, 1)
507
+ );
508
+ break;
509
+ case "cli":
510
+ case "library":
511
+ selectedAgents.push(
512
+ ...this.findAgentsByCategory(agentIndex, "backend")
513
+ );
514
+ break;
515
+ }
516
+ if (analysis.hasTests) {
517
+ selectedAgents.push(
518
+ ...this.findAgentsByCategory(agentIndex, "testing")
519
+ );
520
+ }
521
+ if (analysis.cicd && analysis.cicd.length > 0) {
522
+ selectedAgents.push(
523
+ ...this.findAgentsByCategory(agentIndex, "devops")
524
+ );
525
+ }
526
+ if (analysis.hasApi || analysis.hasDatabase) {
527
+ selectedAgents.push(
528
+ ...this.findAgentsByCategory(agentIndex, "security")
529
+ );
530
+ }
531
+ return this.deduplicateAndSort(selectedAgents);
532
+ }
533
+ /**
534
+ * Select skill templates
535
+ */
536
+ async selectSkills(analysis) {
537
+ const selectedSkills = [];
538
+ const skillIndex = this.loadSkillIndex();
539
+ selectedSkills.push(
540
+ ...this.findSkillsByCategory(skillIndex, "git")
541
+ );
542
+ selectedSkills.push(
543
+ ...this.findSkillsByCategory(skillIndex, "code-quality")
544
+ );
545
+ if (analysis.hasTests) {
546
+ selectedSkills.push(
547
+ ...this.findSkillsByIds(skillIndex, ["generate-tests"])
548
+ );
549
+ }
550
+ if (analysis.hasApi) {
551
+ selectedSkills.push(
552
+ ...this.findSkillsByIds(skillIndex, ["api-docs"])
553
+ );
554
+ }
555
+ if (analysis.hasDatabase) {
556
+ selectedSkills.push(
557
+ ...this.findSkillsByIds(skillIndex, ["database-migration"])
558
+ );
559
+ }
560
+ if (analysis.projectType === "frontend" || analysis.projectType === "fullstack") {
561
+ selectedSkills.push(
562
+ ...this.findSkillsByIds(skillIndex, ["performance-optimization"])
563
+ );
564
+ }
565
+ if (analysis.packageJson) {
566
+ selectedSkills.push(
567
+ ...this.findSkillsByIds(skillIndex, ["dependency-update"])
568
+ );
569
+ }
570
+ selectedSkills.push(
571
+ ...this.findSkillsByIds(skillIndex, ["refactor-code"])
572
+ );
573
+ return this.deduplicateAndSort(selectedSkills);
574
+ }
575
+ /**
576
+ * Load agent index
577
+ */
578
+ loadAgentIndex() {
579
+ try {
580
+ const indexPath = join(this.templatesDir, "agents", "index.json");
581
+ const content = readFileSync(indexPath, "utf-8");
582
+ return JSON.parse(content);
583
+ } catch {
584
+ return { templates: [] };
179
585
  }
180
586
  }
181
- const loadResults = await loadCoreSkills(lang);
182
- const successfulLoads = loadResults.filter((r) => r.success);
183
- const allCoreSkillsLoaded = successfulLoads.length === loadResults.length;
184
- const newStatus = {
185
- isInstalled: true,
186
- coreSkillsLoaded: allCoreSkillsLoaded,
187
- loadedSkills: successfulLoads.map((r) => r.skill),
188
- needsActivation: false,
189
- lastActivation: (/* @__PURE__ */ new Date()).toISOString()
190
- };
191
- saveActivationState(newStatus);
192
- return newStatus;
587
+ /**
588
+ * Load skill index
589
+ */
590
+ loadSkillIndex() {
591
+ try {
592
+ const indexPath = join(this.templatesDir, "skills", "index.json");
593
+ const content = readFileSync(indexPath, "utf-8");
594
+ return JSON.parse(content);
595
+ } catch {
596
+ return { templates: [] };
597
+ }
598
+ }
599
+ /**
600
+ * Find agents by category
601
+ */
602
+ findAgentsByCategory(index, category) {
603
+ return index.templates.filter((agent) => agent.category === category);
604
+ }
605
+ /**
606
+ * Find skills by category
607
+ */
608
+ findSkillsByCategory(index, category) {
609
+ return index.templates.filter((skill) => skill.category === category);
610
+ }
611
+ /**
612
+ * Find skills by IDs
613
+ */
614
+ findSkillsByIds(index, ids) {
615
+ return index.templates.filter((skill) => ids.includes(skill.id));
616
+ }
617
+ /**
618
+ * Deduplicate and sort templates by priority
619
+ */
620
+ deduplicateAndSort(templates) {
621
+ const seen = /* @__PURE__ */ new Set();
622
+ const unique = [];
623
+ for (const template of templates) {
624
+ if (!seen.has(template.id)) {
625
+ seen.add(template.id);
626
+ unique.push(template);
627
+ }
628
+ }
629
+ return unique.sort((a, b) => b.priority - a.priority);
630
+ }
631
+ /**
632
+ * Generate reasoning for template selection
633
+ */
634
+ generateReasoning(analysis, agents, skills) {
635
+ const reasons = [];
636
+ reasons.push(`Detected ${analysis.projectType} project`);
637
+ if (analysis.frameworks.length > 0) {
638
+ reasons.push(`Using frameworks: ${analysis.frameworks.join(", ")}`);
639
+ }
640
+ reasons.push(`Tech stack: ${analysis.techStack.languages.join(", ")} on ${analysis.techStack.runtime}`);
641
+ if (analysis.hasTests) {
642
+ reasons.push("Tests detected - including test engineer and test generation");
643
+ }
644
+ if (analysis.hasDatabase) {
645
+ reasons.push("Database detected - including migration skills");
646
+ }
647
+ if (analysis.hasApi) {
648
+ reasons.push("API endpoints detected - including API documentation");
649
+ }
650
+ if (analysis.cicd && analysis.cicd.length > 0) {
651
+ reasons.push(`CI/CD detected (${analysis.cicd.join(", ")}) - including DevOps engineer`);
652
+ }
653
+ reasons.push(`
654
+ Selected ${agents.length} agents and ${skills.length} skills`);
655
+ return reasons.join("\n");
656
+ }
657
+ }
658
+ async function selectTemplates(analysis) {
659
+ const selector = new TemplateSelector();
660
+ return selector.select(analysis);
193
661
  }
194
662
 
195
- export { activateSuperpowers, autoInstallSuperpowers, checkActivationStatus, loadCoreSkills, loadSkill };
663
+ export { ConfigGenerator, ProjectAnalyzer, TemplateSelector, analyzeProject, generateConfigs, selectTemplates, writeConfigs };