ccjk 11.1.2 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/agent-teams.mjs +1 -1
- package/dist/chunks/agent.mjs +1 -1
- package/dist/chunks/api-cli.mjs +118 -0
- package/dist/chunks/api-providers.mjs +1 -1
- package/dist/chunks/api.mjs +8 -759
- package/dist/chunks/auto-bootstrap.mjs +1 -1
- package/dist/chunks/auto-init.mjs +1 -1
- package/dist/chunks/auto-updater.mjs +1 -1
- package/dist/chunks/banner.mjs +1 -1
- package/dist/chunks/boost.mjs +1 -1
- package/dist/chunks/ccjk-agents.mjs +1 -1
- package/dist/chunks/ccjk-all.mjs +1 -1
- package/dist/chunks/ccjk-config.mjs +1 -1
- package/dist/chunks/ccjk-hooks.mjs +1 -1
- package/dist/chunks/ccjk-mcp.mjs +1 -1
- package/dist/chunks/ccjk-setup.mjs +1 -1
- package/dist/chunks/ccjk-skills.mjs +1 -1
- package/dist/chunks/ccr.mjs +6 -6
- package/dist/chunks/ccu.mjs +1 -1
- package/dist/chunks/check-updates.mjs +2 -2
- package/dist/chunks/claude-code-config-manager.mjs +2 -2
- package/dist/chunks/claude-code-incremental-manager.mjs +2 -2
- package/dist/chunks/claude-config.mjs +1 -1
- package/dist/chunks/claude-wrapper.mjs +1 -1
- package/dist/chunks/codex-config-switch.mjs +1 -1
- package/dist/chunks/codex-provider-manager.mjs +1 -1
- package/dist/chunks/codex-uninstaller.mjs +1 -1
- package/dist/chunks/codex.mjs +1 -1
- package/dist/chunks/commands.mjs +1 -1
- package/dist/chunks/completion.mjs +1 -1
- package/dist/chunks/config-consolidator.mjs +1 -1
- package/dist/chunks/config-switch.mjs +2 -2
- package/dist/chunks/config.mjs +1 -1
- package/dist/chunks/config2.mjs +1 -1
- package/dist/chunks/config3.mjs +1 -1
- package/dist/chunks/constants.mjs +1 -1
- package/dist/chunks/dashboard.mjs +1 -1
- package/dist/chunks/doctor.mjs +31 -7
- package/dist/chunks/evolution.mjs +1 -1
- package/dist/chunks/features.mjs +5 -5
- package/dist/chunks/index.mjs +7 -7
- package/dist/chunks/index2.mjs +10 -177
- package/dist/chunks/index3.mjs +168 -1162
- package/dist/chunks/index4.mjs +1076 -910
- package/dist/chunks/index5.mjs +947 -137
- package/dist/chunks/index6.mjs +167 -635
- package/dist/chunks/index7.mjs +663 -0
- package/dist/chunks/init.mjs +17 -17
- package/dist/chunks/installer.mjs +1 -1
- package/dist/chunks/interview.mjs +2 -2
- package/dist/chunks/marketplace.mjs +1 -1
- package/dist/chunks/mcp-cli.mjs +191 -0
- package/dist/chunks/mcp.mjs +2 -2
- package/dist/chunks/menu.mjs +3 -3
- package/dist/chunks/migrator.mjs +1 -1
- package/dist/chunks/monitor.mjs +1 -1
- package/dist/chunks/notification.mjs +1 -1
- package/dist/chunks/onboarding.mjs +1 -1
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/permission-manager.mjs +1 -1
- package/dist/chunks/permissions.mjs +1 -1
- package/dist/chunks/persistence-manager.mjs +1 -1
- package/dist/chunks/plugin.mjs +1 -1
- package/dist/chunks/prompts.mjs +1 -1
- package/dist/chunks/providers.mjs +1 -1
- package/dist/chunks/quick-actions.mjs +1 -1
- package/dist/chunks/quick-setup.mjs +5 -5
- package/dist/chunks/remote.mjs +2 -2
- package/dist/chunks/silent-updater.mjs +1 -1
- package/dist/chunks/simple-config.mjs +1 -1
- package/dist/chunks/skill.mjs +1 -1
- package/dist/chunks/skills-sync.mjs +1 -1
- package/dist/chunks/skills.mjs +1 -1
- package/dist/chunks/slash-commands.mjs +2 -2
- package/dist/chunks/startup.mjs +1 -1
- package/dist/chunks/stats.mjs +1 -1
- package/dist/chunks/status.mjs +1 -1
- package/dist/chunks/team.mjs +1 -1
- package/dist/chunks/thinking.mjs +2 -2
- package/dist/chunks/uninstall.mjs +3 -3
- package/dist/chunks/update.mjs +4 -4
- package/dist/chunks/upgrade-manager.mjs +1 -1
- package/dist/chunks/version-checker.mjs +1 -1
- package/dist/chunks/vim.mjs +1 -1
- package/dist/chunks/zero-config.mjs +1 -1
- package/dist/cli.mjs +76 -16
- package/dist/index.d.mts +37 -10
- package/dist/index.d.ts +37 -10
- package/dist/index.mjs +2 -2
- package/dist/shared/{ccjk.DB2UYcq0.mjs → ccjk.BOIUTf5z.mjs} +2 -2
- package/dist/shared/ccjk.CL4Yat0G.mjs +303 -0
- package/dist/shared/{ccjk.CxtuJxaS.mjs → ccjk.CN0edl87.mjs} +1 -1
- package/dist/shared/{ccjk.BKoi8-Hy.mjs → ccjk.CrB6OYHv.mjs} +1 -1
- package/dist/shared/{ccjk.DVBW2wxp.mjs → ccjk.Dk1HDseQ.mjs} +1 -1
- package/dist/shared/ccjk.bhFAMRyc.mjs +460 -0
- package/dist/shared/ccjk.cChAaGgT.mjs +88 -0
- package/dist/shared/{ccjk.DrMygfCF.mjs → ccjk.j4uut26D.mjs} +1 -1
- package/package.json +2 -3
- package/dist/shared/ccjk.Cu_R2MbQ.mjs +0 -75
package/dist/chunks/index6.mjs
CHANGED
|
@@ -1,663 +1,195 @@
|
|
|
1
|
-
import { existsSync, readFileSync,
|
|
2
|
-
import { join, dirname } from 'pathe';
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
2
|
import { homedir } from 'node:os';
|
|
4
|
-
import
|
|
3
|
+
import process__default from 'node:process';
|
|
4
|
+
import { join } from 'pathe';
|
|
5
|
+
import { i as installSuperpowers } from '../shared/ccjk.CrB6OYHv.mjs';
|
|
6
|
+
import 'node:child_process';
|
|
7
|
+
import 'node:fs/promises';
|
|
8
|
+
import 'node:util';
|
|
9
|
+
import './index3.mjs';
|
|
10
|
+
import 'node:url';
|
|
11
|
+
import 'i18next';
|
|
12
|
+
import 'i18next-fs-backend';
|
|
5
13
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
hasTests,
|
|
32
|
-
hasDatabase,
|
|
33
|
-
hasApi,
|
|
34
|
-
buildTool,
|
|
35
|
-
cicd,
|
|
36
|
-
patterns,
|
|
37
|
-
confidence,
|
|
38
|
-
packageJson: packageJson ?? void 0
|
|
39
|
-
};
|
|
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
|
+
}
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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;
|
|
48
57
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return null;
|
|
58
|
+
return isSuperpowersInstalled() && areCoreSkillsInstalled();
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (process__default.env.DEBUG) {
|
|
61
|
+
console.error("[CCJK Zero-Config] Auto-install failed:", error);
|
|
54
62
|
}
|
|
63
|
+
return false;
|
|
55
64
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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)) {
|
|
61
77
|
return {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
78
|
+
skill: skillName,
|
|
79
|
+
success: false,
|
|
80
|
+
error: "Skill not installed"
|
|
65
81
|
};
|
|
66
82
|
}
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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";
|
|
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
|
+
};
|
|
83
91
|
}
|
|
84
92
|
return {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
packageManager: this.detectPackageManager()
|
|
88
|
-
};
|
|
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
|
|
93
|
+
skill: skillName,
|
|
94
|
+
success: true
|
|
118
95
|
};
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
96
|
+
} catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
skill: skillName,
|
|
99
|
+
success: false,
|
|
100
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
233
101
|
};
|
|
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
|
-
}
|
|
335
102
|
}
|
|
336
103
|
}
|
|
337
|
-
async function
|
|
338
|
-
const
|
|
339
|
-
|
|
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;
|
|
340
117
|
}
|
|
341
118
|
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
});
|
|
381
|
-
}
|
|
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
|
-
});
|
|
402
|
-
}
|
|
403
|
-
return configs;
|
|
404
|
-
}
|
|
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");
|
|
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");
|
|
453
|
-
}
|
|
119
|
+
function getActivationStatePath() {
|
|
120
|
+
return join(homedir(), ".claude", "plugins", "superpowers", ".activation-state.json");
|
|
454
121
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
return generator.generate(selection);
|
|
122
|
+
function getSuperpowersDir() {
|
|
123
|
+
return join(homedir(), ".claude", "plugins", "superpowers");
|
|
458
124
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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
|
-
);
|
|
125
|
+
function loadActivationState() {
|
|
126
|
+
try {
|
|
127
|
+
const statePath = getActivationStatePath();
|
|
128
|
+
if (!existsSync(statePath)) {
|
|
129
|
+
return null;
|
|
569
130
|
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
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: [] };
|
|
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);
|
|
585
136
|
}
|
|
137
|
+
return null;
|
|
586
138
|
}
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
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
|
-
}
|
|
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);
|
|
628
147
|
}
|
|
629
|
-
return unique.sort((a, b) => b.priority - a.priority);
|
|
630
148
|
}
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
149
|
+
}
|
|
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
|
+
};
|
|
163
|
+
}
|
|
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
|
+
};
|
|
652
179
|
}
|
|
653
|
-
reasons.push(`
|
|
654
|
-
Selected ${agents.length} agents and ${skills.length} skills`);
|
|
655
|
-
return reasons.join("\n");
|
|
656
180
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
const
|
|
660
|
-
|
|
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;
|
|
661
193
|
}
|
|
662
194
|
|
|
663
|
-
export {
|
|
195
|
+
export { activateSuperpowers, autoInstallSuperpowers, checkActivationStatus, loadCoreSkills, loadSkill };
|