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.
- package/dist/chunks/agent.mjs +1 -1
- package/dist/chunks/api-providers.mjs +1 -1
- package/dist/chunks/api.mjs +3 -3
- package/dist/chunks/auto-bootstrap.mjs +1 -1
- package/dist/chunks/auto-updater.mjs +1 -1
- package/dist/chunks/boost.mjs +160 -0
- 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 +2 -2
- package/dist/chunks/ccjk-setup.mjs +1 -1
- package/dist/chunks/ccjk-skills.mjs +1 -1
- package/dist/chunks/ccr.mjs +25 -30
- package/dist/chunks/ccu.mjs +1 -1
- package/dist/chunks/check-updates.mjs +3 -4
- package/dist/chunks/claude-code-config-manager.mjs +7 -7
- package/dist/chunks/claude-code-incremental-manager.mjs +2 -2
- package/dist/chunks/claude-config.mjs +4 -4
- package/dist/chunks/claude-wrapper.mjs +2 -2
- package/dist/chunks/codex-config-switch.mjs +4 -5
- package/dist/chunks/codex-provider-manager.mjs +2 -3
- package/dist/chunks/codex-uninstaller.mjs +2 -2
- package/dist/chunks/codex.mjs +207 -6
- package/dist/chunks/commands.mjs +391 -88
- package/dist/chunks/commands2.mjs +88 -391
- package/dist/chunks/completion.mjs +1 -1
- package/dist/chunks/config-consolidator.mjs +2 -2
- package/dist/chunks/config-switch.mjs +3 -4
- package/dist/chunks/config.mjs +78 -7
- package/dist/chunks/config2.mjs +400 -410
- package/dist/chunks/config3.mjs +410 -400
- package/dist/chunks/constants.mjs +1 -1
- package/dist/chunks/doctor.mjs +4 -4
- package/dist/chunks/features.mjs +24 -17
- package/dist/chunks/index.mjs +178 -7
- package/dist/chunks/index2.mjs +1162 -169
- package/dist/chunks/index3.mjs +910 -1076
- package/dist/chunks/index4.mjs +137 -947
- package/dist/chunks/index5.mjs +635 -167
- package/dist/chunks/init.mjs +141 -99
- package/dist/chunks/installer.mjs +147 -649
- package/dist/chunks/installer2.mjs +649 -147
- package/dist/chunks/interview.mjs +2 -2
- package/dist/chunks/marketplace.mjs +1 -1
- package/dist/chunks/mcp.mjs +1058 -17
- package/dist/chunks/menu.mjs +147 -56
- package/dist/chunks/monitor.mjs +2 -2
- package/dist/chunks/notification.mjs +1 -1
- package/dist/chunks/onboarding.mjs +2 -2
- package/dist/chunks/package.mjs +2 -210
- package/dist/chunks/permission-manager.mjs +2 -2
- package/dist/chunks/permissions.mjs +1 -1
- package/dist/chunks/platform.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-setup.mjs +16 -20
- package/dist/chunks/silent-updater.mjs +1 -1
- package/dist/chunks/simple-config.mjs +2 -2
- 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/startup.mjs +1 -1
- package/dist/chunks/stats.mjs +1 -1
- package/dist/chunks/status.mjs +159 -0
- package/dist/chunks/team.mjs +1 -1
- package/dist/chunks/thinking.mjs +2 -2
- package/dist/chunks/uninstall.mjs +6 -6
- package/dist/chunks/update.mjs +6 -9
- package/dist/chunks/upgrade-manager.mjs +2 -2
- package/dist/chunks/version-checker.mjs +3 -3
- package/dist/chunks/vim.mjs +1 -1
- package/dist/chunks/workflows.mjs +616 -215
- package/dist/cli.mjs +70 -121
- package/dist/index.d.mts +17 -1482
- package/dist/index.d.ts +17 -1482
- package/dist/index.mjs +950 -4740
- package/dist/shared/{ccjk.zCqdxT2Y.mjs → ccjk.Br91zBIG.mjs} +2 -2
- package/dist/shared/ccjk.CSkyCZIM.mjs +638 -0
- package/dist/shared/{ccjk.BKoi8-Hy.mjs → ccjk.DE91nClQ.mjs} +1 -1
- package/dist/shared/{ccjk.f40us0yY.mjs → ccjk.DvIrK0wz.mjs} +2 -2
- package/dist/shared/ccjk.LsPZ2PYo.mjs +1048 -0
- package/dist/shared/{ccjk.DRweXU5F.mjs → ccjk.q1koQxEE.mjs} +2 -2
- package/package.json +1 -1
- package/templates/claude-code/common/settings.json +15 -111
- package/dist/chunks/api-adapter.mjs +0 -180
- package/dist/chunks/cli.mjs +0 -2227
- package/dist/chunks/context-menu.mjs +0 -913
- package/dist/chunks/hooks-sync.mjs +0 -1627
- package/dist/chunks/index6.mjs +0 -663
- package/dist/chunks/mcp-market.mjs +0 -1077
- package/dist/chunks/mcp-server.mjs +0 -776
- package/dist/chunks/project-detector.mjs +0 -131
- package/dist/chunks/provider-registry.mjs +0 -92
- package/dist/chunks/setup-wizard.mjs +0 -362
- package/dist/chunks/tools.mjs +0 -143
- package/dist/chunks/workflows2.mjs +0 -633
- package/dist/shared/ccjk.BM_HZogn.mjs +0 -347
- package/dist/shared/ccjk.BaEp4UHQ.mjs +0 -75
- package/dist/shared/ccjk.CS0ybJCf.mjs +0 -490
- package/dist/shared/ccjk.CZgIwikC.mjs +0 -209
- package/dist/shared/ccjk.tO8zeFh1.mjs +0 -397
package/dist/chunks/index5.mjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
62
|
+
languages: ["javascript"],
|
|
63
|
+
runtime: "node",
|
|
64
|
+
packageManager: this.detectPackageManager()
|
|
81
65
|
};
|
|
82
66
|
}
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
94
|
-
|
|
85
|
+
languages,
|
|
86
|
+
runtime,
|
|
87
|
+
packageManager: this.detectPackageManager()
|
|
95
88
|
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
105
|
-
const
|
|
106
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
403
|
+
return configs;
|
|
138
404
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
|
|
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
|
|
151
|
-
const
|
|
152
|
-
|
|
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
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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 {
|
|
663
|
+
export { ConfigGenerator, ProjectAnalyzer, TemplateSelector, analyzeProject, generateConfigs, selectTemplates, writeConfigs };
|