ccjk 12.0.7 → 12.0.9

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 (47) hide show
  1. package/dist/chunks/agents.mjs +1 -1
  2. package/dist/chunks/auto-fixer.mjs +93 -0
  3. package/dist/chunks/auto-updater.mjs +3 -2
  4. package/dist/chunks/boost.mjs +1 -1
  5. package/dist/chunks/ccr.mjs +4 -3
  6. package/dist/chunks/check-updates.mjs +3 -2
  7. package/dist/chunks/claude-code-incremental-manager.mjs +3 -2
  8. package/dist/chunks/codex-config-switch.mjs +2 -1
  9. package/dist/chunks/codex-provider-manager.mjs +2 -1
  10. package/dist/chunks/codex-uninstaller.mjs +1 -1
  11. package/dist/chunks/codex.mjs +1 -1
  12. package/dist/chunks/config-switch.mjs +2 -1
  13. package/dist/chunks/config2.mjs +2 -1
  14. package/dist/chunks/doctor.mjs +1 -0
  15. package/dist/chunks/features.mjs +3 -2
  16. package/dist/chunks/index10.mjs +569 -1061
  17. package/dist/chunks/index11.mjs +1076 -913
  18. package/dist/chunks/index12.mjs +951 -135
  19. package/dist/chunks/index13.mjs +184 -209
  20. package/dist/chunks/index14.mjs +210 -655
  21. package/dist/chunks/index4.mjs +1 -1
  22. package/dist/chunks/index7.mjs +201 -2182
  23. package/dist/chunks/init.mjs +5 -5
  24. package/dist/chunks/installer.mjs +2 -1
  25. package/dist/chunks/mcp-cli.mjs +2 -1
  26. package/dist/chunks/mcp.mjs +2 -1
  27. package/dist/chunks/menu.mjs +22 -11
  28. package/dist/chunks/onboarding-wizard.mjs +93 -0
  29. package/dist/chunks/onboarding.mjs +1 -0
  30. package/dist/chunks/package.mjs +1 -1
  31. package/dist/chunks/prompts.mjs +2 -1
  32. package/dist/chunks/quick-actions.mjs +1 -1
  33. package/dist/chunks/quick-provider.mjs +1 -0
  34. package/dist/chunks/quick-setup.mjs +3 -2
  35. package/dist/chunks/remote.mjs +1 -0
  36. package/dist/chunks/status.mjs +7 -2
  37. package/dist/chunks/uninstall.mjs +3 -2
  38. package/dist/chunks/update.mjs +3 -2
  39. package/dist/chunks/upgrade-manager.mjs +1 -1
  40. package/dist/chunks/wsl.mjs +1 -1
  41. package/dist/cli.mjs +19 -3
  42. package/dist/shared/{ccjk.DOwtZMk8.mjs → ccjk.BWFpnOr3.mjs} +7 -1831
  43. package/dist/shared/{ccjk.D5MFQT7w.mjs → ccjk.CNMWk_mE.mjs} +7 -7
  44. package/dist/shared/{ccjk.BRZ9ww8S.mjs → ccjk.CvChMYvB.mjs} +1 -1
  45. package/dist/shared/ccjk.DeWpAShp.mjs +1828 -0
  46. package/dist/shared/{ccjk.BwfbSKN2.mjs → ccjk.Dx-O9dWz.mjs} +1 -1
  47. package/package.json +2 -2
@@ -1,663 +1,218 @@
1
- import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, writeFileSync } from 'node:fs';
2
- import { j as join, d as dirname } from '../shared/ccjk.bQ7Dh1g4.mjs';
3
- import { homedir } from 'node:os';
4
- import { fileURLToPath } from 'node:url';
5
-
6
- class ProjectAnalyzer {
7
- projectRoot;
8
- constructor(projectRoot = process.cwd()) {
9
- this.projectRoot = projectRoot;
10
- }
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;
48
- }
49
- try {
50
- const content = readFileSync(packageJsonPath, "utf-8");
51
- return JSON.parse(content);
52
- } catch {
53
- return null;
54
- }
55
- }
56
- /**
57
- * Detect technology stack from dependencies
58
- */
59
- detectTechStack(packageJson) {
60
- if (!packageJson) {
61
- return {
62
- languages: ["javascript"],
63
- runtime: "node",
64
- packageManager: this.detectPackageManager()
65
- };
66
- }
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";
83
- }
84
- return {
85
- languages,
86
- runtime,
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
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
- }
335
- }
336
- }
337
- async function analyzeProject(projectRoot) {
338
- const analyzer = new ProjectAnalyzer(projectRoot);
339
- return analyzer.analyze();
340
- }
1
+ import { promisify } from 'node:util';
2
+ import childProcess from 'node:child_process';
3
+ import fs, { constants } from 'node:fs/promises';
4
+ import process__default from 'node:process';
5
+ import os__default from 'node:os';
6
+ import fs__default from 'node:fs';
7
+ import 'node:buffer';
8
+
9
+ let isDockerCached;
341
10
 
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
- });
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
- }
11
+ function hasDockerEnv() {
12
+ try {
13
+ fs__default.statSync('/.dockerenv');
14
+ return true;
15
+ } catch {
16
+ return false;
17
+ }
454
18
  }
455
- async function generateConfigs(selection) {
456
- const generator = new ConfigGenerator();
457
- return generator.generate(selection);
19
+
20
+ function hasDockerCGroup() {
21
+ try {
22
+ return fs__default.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');
23
+ } catch {
24
+ return false;
25
+ }
458
26
  }
459
- async function writeConfigs(config) {
460
- const generator = new ConfigGenerator();
461
- await generator.write(config);
27
+
28
+ function isDocker() {
29
+ // TODO: Use `??=` when targeting Node.js 16.
30
+ if (isDockerCached === undefined) {
31
+ isDockerCached = hasDockerEnv() || hasDockerCGroup();
32
+ }
33
+
34
+ return isDockerCached;
462
35
  }
463
36
 
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: [] };
585
- }
586
- }
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
- }
37
+ let cachedResult;
38
+
39
+ // Podman detection
40
+ const hasContainerEnv = () => {
41
+ try {
42
+ fs__default.statSync('/run/.containerenv');
43
+ return true;
44
+ } catch {
45
+ return false;
46
+ }
47
+ };
48
+
49
+ function isInsideContainer() {
50
+ // TODO: Use `??=` when targeting Node.js 16.
51
+ if (cachedResult === undefined) {
52
+ cachedResult = hasContainerEnv() || isDocker();
53
+ }
54
+
55
+ return cachedResult;
657
56
  }
658
- async function selectTemplates(analysis) {
659
- const selector = new TemplateSelector();
660
- return selector.select(analysis);
57
+
58
+ const isWsl = () => {
59
+ if (process__default.platform !== 'linux') {
60
+ return false;
61
+ }
62
+
63
+ if (os__default.release().toLowerCase().includes('microsoft')) {
64
+ if (isInsideContainer()) {
65
+ return false;
66
+ }
67
+
68
+ return true;
69
+ }
70
+
71
+ try {
72
+ if (fs__default.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {
73
+ return !isInsideContainer();
74
+ }
75
+ } catch {}
76
+
77
+ // Fallback for custom kernels: check WSL-specific paths.
78
+ if (
79
+ fs__default.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')
80
+ || fs__default.existsSync('/run/WSL')
81
+ ) {
82
+ return !isInsideContainer();
83
+ }
84
+
85
+ return false;
86
+ };
87
+
88
+ const isWsl$1 = process__default.env.__IS_WSL_TEST__ ? isWsl : isWsl();
89
+
90
+ promisify(childProcess.execFile);
91
+
92
+ const powerShellPath$1 = () => `${process__default.env.SYSTEMROOT || process__default.env.windir || String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
93
+
94
+ function parseMountPointFromConfig(content) {
95
+ for (const line of content.split('\n')) {
96
+ // Skip comment lines
97
+ if (/^\s*#/.test(line)) {
98
+ continue;
99
+ }
100
+
101
+ // Match root at start of line (after optional whitespace)
102
+ const match = /^\s*root\s*=\s*(?<mountPoint>"[^"]*"|'[^']*'|[^#]*)/.exec(line);
103
+ if (!match) {
104
+ continue;
105
+ }
106
+
107
+ return match.groups.mountPoint
108
+ .trim()
109
+ // Strip surrounding quotes
110
+ .replaceAll(/^["']|["']$/g, '');
111
+ }
661
112
  }
662
113
 
663
- export { ConfigGenerator, ProjectAnalyzer, TemplateSelector, analyzeProject, generateConfigs, selectTemplates, writeConfigs };
114
+ const execFile = promisify(childProcess.execFile);
115
+
116
+ const wslDrivesMountPoint = (() => {
117
+ // Default value for "root" param
118
+ // according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config
119
+ const defaultMountPoint = '/mnt/';
120
+
121
+ let mountPoint;
122
+
123
+ return async function () {
124
+ if (mountPoint) {
125
+ // Return memoized mount point value
126
+ return mountPoint;
127
+ }
128
+
129
+ const configFilePath = '/etc/wsl.conf';
130
+
131
+ let isConfigFileExists = false;
132
+ try {
133
+ await fs.access(configFilePath, constants.F_OK);
134
+ isConfigFileExists = true;
135
+ } catch {}
136
+
137
+ if (!isConfigFileExists) {
138
+ return defaultMountPoint;
139
+ }
140
+
141
+ const configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});
142
+ const parsedMountPoint = parseMountPointFromConfig(configContent);
143
+
144
+ if (parsedMountPoint === undefined) {
145
+ return defaultMountPoint;
146
+ }
147
+
148
+ mountPoint = parsedMountPoint;
149
+ mountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;
150
+
151
+ return mountPoint;
152
+ };
153
+ })();
154
+
155
+ const powerShellPathFromWsl = async () => {
156
+ const mountPoint = await wslDrivesMountPoint();
157
+ return `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;
158
+ };
159
+
160
+ const powerShellPath = isWsl$1 ? powerShellPathFromWsl : powerShellPath$1;
161
+
162
+ // Cache for PowerShell accessibility check
163
+ let canAccessPowerShellPromise;
164
+
165
+ const canAccessPowerShell = async () => {
166
+ canAccessPowerShellPromise ??= (async () => {
167
+ try {
168
+ const psPath = await powerShellPath();
169
+ await fs.access(psPath, constants.X_OK);
170
+ return true;
171
+ } catch {
172
+ // PowerShell is not accessible (either doesn't exist, no execute permission, or other error)
173
+ return false;
174
+ }
175
+ })();
176
+
177
+ return canAccessPowerShellPromise;
178
+ };
179
+
180
+ const isUrl = path => /^[a-z]+:\/\//i.test(path);
181
+
182
+ const convertWslPathToWindows = async paths => {
183
+ const isBatch = Array.isArray(paths);
184
+ const pathArray = isBatch ? paths : [paths];
185
+
186
+ // Find indices of non-URL paths that need conversion
187
+ const indicesToConvert = [];
188
+ const pathsToConvert = [];
189
+
190
+ for (const [index, path] of pathArray.entries()) {
191
+ if (!isUrl(path)) {
192
+ indicesToConvert.push(index);
193
+ pathsToConvert.push(path);
194
+ }
195
+ }
196
+
197
+ // Start with original paths (URLs stay as-is)
198
+ const results = [...pathArray];
199
+
200
+ if (pathsToConvert.length > 0) {
201
+ try {
202
+ const {stdout} = await execFile('wslpath', ['-aw', ...pathsToConvert], {encoding: 'utf8'});
203
+ const convertedPaths = stdout.split(/\r?\n/).filter(Boolean);
204
+
205
+ for (const [index, originalIndex] of indicesToConvert.entries()) {
206
+ results[originalIndex] = convertedPaths[index] ?? pathArray[originalIndex];
207
+ }
208
+ } catch {
209
+ // If wslpath fails, keep original paths
210
+ }
211
+ }
212
+
213
+ return isBatch ? results : results[0];
214
+ };
215
+
216
+ const isUncPath = path => /^\\\\/u.test(path);
217
+
218
+ export { canAccessPowerShell, convertWslPathToWindows, isUncPath, isWsl$1 as isWsl, powerShellPath, powerShellPathFromWsl, wslDrivesMountPoint };