ccjk 12.2.2 → 12.3.1

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 (135) hide show
  1. package/dist/chunks/agent-teams.mjs +3 -3
  2. package/dist/chunks/agent.mjs +2 -2
  3. package/dist/chunks/agents.mjs +4 -5
  4. package/dist/chunks/api-cli.mjs +5 -5
  5. package/dist/chunks/api-providers.mjs +1 -1
  6. package/dist/chunks/api.mjs +4 -4
  7. package/dist/chunks/auto-bootstrap.mjs +1 -1
  8. package/dist/chunks/auto-fixer.mjs +3 -3
  9. package/dist/chunks/auto-init.mjs +3 -3
  10. package/dist/chunks/auto-updater.mjs +9 -9
  11. package/dist/chunks/banner.mjs +2 -2
  12. package/dist/chunks/boost.mjs +4 -4
  13. package/dist/chunks/ccjk-agents.mjs +3 -3
  14. package/dist/chunks/ccjk-all.mjs +6 -6
  15. package/dist/chunks/ccjk-config.mjs +2 -2
  16. package/dist/chunks/ccjk-hooks.mjs +4 -4
  17. package/dist/chunks/ccjk-mcp.mjs +5 -5
  18. package/dist/chunks/ccjk-setup.mjs +5 -5
  19. package/dist/chunks/ccjk-skills.mjs +5 -5
  20. package/dist/chunks/ccr.mjs +14 -14
  21. package/dist/chunks/ccu.mjs +2 -2
  22. package/dist/chunks/check-updates.mjs +6 -6
  23. package/dist/chunks/claude-code-config-manager.mjs +5 -4
  24. package/dist/chunks/claude-code-incremental-manager.mjs +6 -6
  25. package/dist/chunks/claude-config.mjs +1 -1
  26. package/dist/chunks/claude-wrapper.mjs +1 -1
  27. package/dist/chunks/cli-hook.mjs +9 -10
  28. package/dist/chunks/codex-config-switch.mjs +6 -6
  29. package/dist/chunks/codex-provider-manager.mjs +6 -6
  30. package/dist/chunks/codex-uninstaller.mjs +2 -2
  31. package/dist/chunks/codex.mjs +5 -5
  32. package/dist/chunks/commands.mjs +2 -2
  33. package/dist/chunks/commands2.mjs +1 -1
  34. package/dist/chunks/commit.mjs +2 -2
  35. package/dist/chunks/completion.mjs +2 -2
  36. package/dist/chunks/config-consolidator.mjs +2 -2
  37. package/dist/chunks/config-switch.mjs +7 -7
  38. package/dist/chunks/config.mjs +3 -3
  39. package/dist/chunks/config2.mjs +4 -4
  40. package/dist/chunks/config3.mjs +3 -3
  41. package/dist/chunks/constants.mjs +1 -1
  42. package/dist/chunks/context-opt.mjs +442 -0
  43. package/dist/chunks/convoy-manager.mjs +355 -3
  44. package/dist/chunks/dashboard.mjs +2 -2
  45. package/dist/chunks/doctor.mjs +4 -4
  46. package/dist/chunks/evolution.mjs +2 -2
  47. package/dist/chunks/health-alerts.mjs +530 -4
  48. package/dist/chunks/help.mjs +1 -1
  49. package/dist/chunks/index.mjs +0 -23
  50. package/dist/chunks/index10.mjs +571 -634
  51. package/dist/chunks/index11.mjs +569 -1061
  52. package/dist/chunks/index12.mjs +1076 -914
  53. package/dist/chunks/index13.mjs +951 -135
  54. package/dist/chunks/index14.mjs +184 -209
  55. package/dist/chunks/index15.mjs +218 -0
  56. package/dist/chunks/index2.mjs +24 -19
  57. package/dist/chunks/index3.mjs +12 -19085
  58. package/dist/chunks/index4.mjs +19092 -16
  59. package/dist/chunks/index5.mjs +16 -7602
  60. package/dist/chunks/index6.mjs +7590 -159
  61. package/dist/chunks/index7.mjs +171 -1602
  62. package/dist/chunks/index8.mjs +1602 -19
  63. package/dist/chunks/index9.mjs +15 -612
  64. package/dist/chunks/init.mjs +13 -13
  65. package/dist/chunks/installer.mjs +5 -5
  66. package/dist/chunks/installer2.mjs +1 -1
  67. package/dist/chunks/interview.mjs +4 -4
  68. package/dist/chunks/manager.mjs +1 -1
  69. package/dist/chunks/marketplace.mjs +2 -2
  70. package/dist/chunks/mcp-cli.mjs +9 -9
  71. package/dist/chunks/mcp.mjs +7 -7
  72. package/dist/chunks/memory.mjs +3 -3
  73. package/dist/chunks/menu-hierarchical.mjs +14 -14
  74. package/dist/chunks/menu.mjs +12 -12
  75. package/dist/chunks/metrics-display.mjs +1 -1
  76. package/dist/chunks/migrator.mjs +1 -1
  77. package/dist/chunks/monitor.mjs +2 -2
  78. package/dist/chunks/notification.mjs +4 -4
  79. package/dist/chunks/onboarding-wizard.mjs +2 -2
  80. package/dist/chunks/onboarding.mjs +4 -4
  81. package/dist/chunks/package.mjs +1 -1
  82. package/dist/chunks/paradigm.mjs +1 -1
  83. package/dist/chunks/permission-manager.mjs +2 -2
  84. package/dist/chunks/permissions.mjs +3 -3
  85. package/dist/chunks/persistence-manager.mjs +3 -3
  86. package/dist/chunks/plugin.mjs +2 -2
  87. package/dist/chunks/prompts.mjs +5 -5
  88. package/dist/chunks/providers.mjs +2 -2
  89. package/dist/chunks/quick-actions.mjs +2 -2
  90. package/dist/chunks/quick-provider.mjs +6 -5
  91. package/dist/chunks/quick-setup.mjs +10 -10
  92. package/dist/chunks/remote.mjs +5 -5
  93. package/dist/chunks/session.mjs +2 -2
  94. package/dist/chunks/sessions.mjs +1 -1
  95. package/dist/chunks/silent-updater.mjs +1 -1
  96. package/dist/chunks/simple-config.mjs +1 -1
  97. package/dist/chunks/skill2.mjs +3 -3
  98. package/dist/chunks/skills-sync.mjs +4 -4
  99. package/dist/chunks/skills.mjs +3 -3
  100. package/dist/chunks/slash-commands.mjs +3 -3
  101. package/dist/chunks/startup.mjs +1 -1
  102. package/dist/chunks/stats.mjs +2 -2
  103. package/dist/chunks/status.mjs +2 -2
  104. package/dist/chunks/team.mjs +3 -3
  105. package/dist/chunks/thinking.mjs +4 -4
  106. package/dist/chunks/trace.mjs +2 -2
  107. package/dist/chunks/uninstall.mjs +8 -8
  108. package/dist/chunks/update.mjs +9 -9
  109. package/dist/chunks/upgrade-manager.mjs +3 -3
  110. package/dist/chunks/version-checker.mjs +4 -4
  111. package/dist/chunks/vim.mjs +3 -3
  112. package/dist/chunks/workflows.mjs +1 -1
  113. package/dist/chunks/wsl.mjs +1 -1
  114. package/dist/chunks/zero-config.mjs +3 -3
  115. package/dist/cli.mjs +56 -23
  116. package/dist/index.mjs +5 -5
  117. package/dist/shared/{ccjk.CCcQfbni.mjs → ccjk.B1TwPltj.mjs} +1 -1
  118. package/dist/shared/{ccjk.CePkJq2S.mjs → ccjk.BfIpomdz.mjs} +1 -1
  119. package/dist/shared/{ccjk.D8ZLYSZZ.mjs → ccjk.CXzjn01x.mjs} +1 -1
  120. package/dist/shared/{ccjk.Cjj8SVrn.mjs → ccjk.Cot9p9_n.mjs} +1 -1
  121. package/dist/shared/{ccjk.CvChMYvB.mjs → ccjk.DCw2WnZU.mjs} +1 -1
  122. package/dist/shared/{ccjk.DG_o24cZ.mjs → ccjk.DJdmgr2d.mjs} +1 -1
  123. package/dist/shared/{ccjk.BIxuVL3_.mjs → ccjk.DcKLglJQ.mjs} +2 -2
  124. package/dist/shared/{ccjk.DLLw-h4Y.mjs → ccjk.DfXjf8EC.mjs} +2 -2
  125. package/dist/shared/{ccjk.KpFl2RDA.mjs → ccjk.DpstNaeR.mjs} +3 -3
  126. package/dist/shared/{ccjk.DOBWBkFR.mjs → ccjk.XsJWJuQP.mjs} +5 -5
  127. package/dist/shared/{ccjk._dESH4Rk.mjs → ccjk.dYDLfmph.mjs} +1 -1
  128. package/dist/shared/{ccjk.DS7UESmF.mjs → ccjk.hrRv8G6j.mjs} +4 -4
  129. package/dist/shared/{ccjk.BWFpnOr3.mjs → ccjk.mJpVRDZ8.mjs} +1 -1
  130. package/dist/templates/claude-code/common/settings.json +3 -1
  131. package/package.json +20 -18
  132. package/templates/claude-code/common/settings.json +3 -1
  133. package/dist/chunks/context-loader.mjs +0 -351
  134. package/dist/chunks/context.mjs +0 -372
  135. package/dist/chunks/health-check.mjs +0 -532
@@ -1,679 +1,616 @@
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';
1
+ import { EventEmitter } from 'events';
5
2
 
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);
3
+ function toArr(any) {
4
+ return any == null ? [] : Array.isArray(any) ? any : [any];
5
+ }
6
+
7
+ function toVal(out, key, val, opts) {
8
+ var x, old=out[key], nxt=(
9
+ !!~opts.string.indexOf(key) ? (val == null || val === true ? '' : String(val))
10
+ : typeof val === 'boolean' ? val
11
+ : !!~opts.boolean.indexOf(key) ? (val === 'false' ? false : val === 'true' || (out._.push((x = +val,x * 0 === 0) ? x : val),!!val))
12
+ : (x = +val,x * 0 === 0) ? x : val
13
+ );
14
+ out[key] = old == null ? nxt : (Array.isArray(old) ? old.concat(nxt) : [old, nxt]);
15
+ }
16
+
17
+ function mri2 (args, opts) {
18
+ args = args || [];
19
+ opts = opts || {};
20
+
21
+ var k, arr, arg, name, val, out={ _:[] };
22
+ var i=0, j=0, idx=0, len=args.length;
23
+
24
+ const alibi = opts.alias !== void 0;
25
+ const strict = opts.unknown !== void 0;
26
+ const defaults = opts.default !== void 0;
27
+
28
+ opts.alias = opts.alias || {};
29
+ opts.string = toArr(opts.string);
30
+ opts.boolean = toArr(opts.boolean);
31
+
32
+ if (alibi) {
33
+ for (k in opts.alias) {
34
+ arr = opts.alias[k] = toArr(opts.alias[k]);
35
+ for (i=0; i < arr.length; i++) {
36
+ (opts.alias[arr[i]] = arr.concat(k)).splice(i, 1);
37
+ }
38
+ }
39
+ }
40
+
41
+ for (i=opts.boolean.length; i-- > 0;) {
42
+ arr = opts.alias[opts.boolean[i]] || [];
43
+ for (j=arr.length; j-- > 0;) opts.boolean.push(arr[j]);
44
+ }
45
+
46
+ for (i=opts.string.length; i-- > 0;) {
47
+ arr = opts.alias[opts.string[i]] || [];
48
+ for (j=arr.length; j-- > 0;) opts.string.push(arr[j]);
49
+ }
50
+
51
+ if (defaults) {
52
+ for (k in opts.default) {
53
+ name = typeof opts.default[k];
54
+ arr = opts.alias[k] = opts.alias[k] || [];
55
+ if (opts[name] !== void 0) {
56
+ opts[name].push(k);
57
+ for (i=0; i < arr.length; i++) {
58
+ opts[name].push(arr[i]);
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ const keys = strict ? Object.keys(opts.alias) : [];
65
+
66
+ for (i=0; i < len; i++) {
67
+ arg = args[i];
68
+
69
+ if (arg === '--') {
70
+ out._ = out._.concat(args.slice(++i));
71
+ break;
72
+ }
73
+
74
+ for (j=0; j < arg.length; j++) {
75
+ if (arg.charCodeAt(j) !== 45) break; // "-"
76
+ }
77
+
78
+ if (j === 0) {
79
+ out._.push(arg);
80
+ } else if (arg.substring(j, j + 3) === 'no-') {
81
+ name = arg.substring(j + 3);
82
+ if (strict && !~keys.indexOf(name)) {
83
+ return opts.unknown(arg);
84
+ }
85
+ out[name] = false;
86
+ } else {
87
+ for (idx=j+1; idx < arg.length; idx++) {
88
+ if (arg.charCodeAt(idx) === 61) break; // "="
89
+ }
90
+
91
+ name = arg.substring(j, idx);
92
+ val = arg.substring(++idx) || (i+1 === len || (''+args[i+1]).charCodeAt(0) === 45 || args[++i]);
93
+ arr = (j === 2 ? [name] : name);
94
+
95
+ for (idx=0; idx < arr.length; idx++) {
96
+ name = arr[idx];
97
+ if (strict && !~keys.indexOf(name)) return opts.unknown('-'.repeat(j) + name);
98
+ toVal(out, name, (idx + 1 < arr.length) || val, opts);
99
+ }
100
+ }
101
+ }
102
+
103
+ if (defaults) {
104
+ for (k in opts.default) {
105
+ if (out[k] === void 0) {
106
+ out[k] = opts.default[k];
107
+ }
108
+ }
109
+ }
110
+
111
+ if (alibi) {
112
+ for (k in out) {
113
+ arr = opts.alias[k] || [];
114
+ while (arr.length > 0) {
115
+ out[arr.shift()] = out[k];
116
+ }
117
+ }
118
+ }
119
+
120
+ return out;
121
+ }
122
+
123
+ const removeBrackets = (v) => v.replace(/[<[].+/, "").trim();
124
+ const findAllBrackets = (v) => {
125
+ const ANGLED_BRACKET_RE_GLOBAL = /<([^>]+)>/g;
126
+ const SQUARE_BRACKET_RE_GLOBAL = /\[([^\]]+)\]/g;
127
+ const res = [];
128
+ const parse = (match) => {
129
+ let variadic = false;
130
+ let value = match[1];
131
+ if (value.startsWith("...")) {
132
+ value = value.slice(3);
133
+ variadic = true;
134
+ }
26
135
  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
136
+ required: match[0].startsWith("<"),
137
+ value,
138
+ variadic
39
139
  };
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;
140
+ };
141
+ let angledMatch;
142
+ while (angledMatch = ANGLED_BRACKET_RE_GLOBAL.exec(v)) {
143
+ res.push(parse(angledMatch));
144
+ }
145
+ let squareMatch;
146
+ while (squareMatch = SQUARE_BRACKET_RE_GLOBAL.exec(v)) {
147
+ res.push(parse(squareMatch));
148
+ }
149
+ return res;
150
+ };
151
+ const getMriOptions = (options) => {
152
+ const result = {alias: {}, boolean: []};
153
+ for (const [index, option] of options.entries()) {
154
+ if (option.names.length > 1) {
155
+ result.alias[option.names[0]] = option.names.slice(1);
156
+ }
157
+ if (option.isBoolean) {
158
+ if (option.negated) {
159
+ const hasStringTypeOption = options.some((o, i) => {
160
+ return i !== index && o.names.some((name) => option.names.includes(name)) && typeof o.required === "boolean";
161
+ });
162
+ if (!hasStringTypeOption) {
163
+ result.boolean.push(option.names[0]);
164
+ }
165
+ } else {
166
+ result.boolean.push(option.names[0]);
167
+ }
54
168
  }
55
169
  }
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
- };
170
+ return result;
171
+ };
172
+ const findLongest = (arr) => {
173
+ return arr.sort((a, b) => {
174
+ return a.length > b.length ? -1 : 1;
175
+ })[0];
176
+ };
177
+ const padRight = (str, length) => {
178
+ return str.length >= length ? str : `${str}${" ".repeat(length - str.length)}`;
179
+ };
180
+ const camelcase = (input) => {
181
+ return input.replace(/([a-z])-([a-z])/g, (_, p1, p2) => {
182
+ return p1 + p2.toUpperCase();
183
+ });
184
+ };
185
+ const setDotProp = (obj, keys, val) => {
186
+ let i = 0;
187
+ let length = keys.length;
188
+ let t = obj;
189
+ let x;
190
+ for (; i < length; ++i) {
191
+ x = t[keys[i]];
192
+ t = t[keys[i]] = i === length - 1 ? val : x != null ? x : !!~keys[i + 1].indexOf(".") || !(+keys[i + 1] > -1) ? {} : [];
193
+ }
194
+ };
195
+ const setByType = (obj, transforms) => {
196
+ for (const key of Object.keys(transforms)) {
197
+ const transform = transforms[key];
198
+ if (transform.shouldTransform) {
199
+ obj[key] = Array.prototype.concat.call([], obj[key]);
200
+ if (typeof transform.transformFunction === "function") {
201
+ obj[key] = obj[key].map(transform.transformFunction);
202
+ }
66
203
  }
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");
204
+ }
205
+ };
206
+ const getFileName = (input) => {
207
+ const m = /([^\\\/]+)$/.exec(input);
208
+ return m ? m[1] : "";
209
+ };
210
+ const camelcaseOptionName = (name) => {
211
+ return name.split(".").map((v, i) => {
212
+ return i === 0 ? camelcase(v) : v;
213
+ }).join(".");
214
+ };
215
+ class CACError extends Error {
216
+ constructor(message) {
217
+ super(message);
218
+ this.name = this.constructor.name;
219
+ if (typeof Error.captureStackTrace === "function") {
220
+ Error.captureStackTrace(this, this.constructor);
75
221
  } else {
76
- languages.push("javascript");
222
+ this.stack = new Error(message).stack;
77
223
  }
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
224
  }
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
- }
225
+ }
226
+
227
+ class Option {
228
+ constructor(rawName, description, config) {
229
+ this.rawName = rawName;
230
+ this.description = description;
231
+ this.config = Object.assign({}, config);
232
+ rawName = rawName.replace(/\.\*/g, "");
233
+ this.negated = false;
234
+ this.names = removeBrackets(rawName).split(",").map((v) => {
235
+ let name = v.trim().replace(/^-{1,2}/, "");
236
+ if (name.startsWith("no-")) {
237
+ this.negated = true;
238
+ name = name.replace(/^no-/, "");
330
239
  }
331
- return count;
332
- } catch {
333
- return 0;
240
+ return camelcaseOptionName(name);
241
+ }).sort((a, b) => a.length > b.length ? 1 : -1);
242
+ this.name = this.names[this.names.length - 1];
243
+ if (this.negated && this.config.default == null) {
244
+ this.config.default = true;
245
+ }
246
+ if (rawName.includes("<")) {
247
+ this.required = true;
248
+ } else if (rawName.includes("[")) {
249
+ this.required = false;
250
+ } else {
251
+ this.isBoolean = true;
334
252
  }
335
253
  }
336
254
  }
337
- async function analyzeProject(projectRoot) {
338
- const analyzer = new ProjectAnalyzer(projectRoot);
339
- return analyzer.analyze();
340
- }
341
255
 
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;
256
+ const processArgs = process.argv;
257
+ const platformInfo = `${process.platform}-${process.arch} node-${process.version}`;
258
+
259
+ class Command {
260
+ constructor(rawName, description, config = {}, cli) {
261
+ this.rawName = rawName;
262
+ this.description = description;
263
+ this.config = config;
264
+ this.cli = cli;
265
+ this.options = [];
266
+ this.aliasNames = [];
267
+ this.name = removeBrackets(rawName);
268
+ this.args = findAllBrackets(rawName);
269
+ this.examples = [];
270
+ }
271
+ usage(text) {
272
+ this.usageText = text;
273
+ return this;
274
+ }
275
+ allowUnknownOptions() {
276
+ this.config.allowUnknownOptions = true;
277
+ return this;
278
+ }
279
+ ignoreOptionDefaultValue() {
280
+ this.config.ignoreOptionDefaultValue = true;
281
+ return this;
282
+ }
283
+ version(version, customFlags = "-v, --version") {
284
+ this.versionNumber = version;
285
+ this.option(customFlags, "Display version number");
286
+ return this;
287
+ }
288
+ example(example) {
289
+ this.examples.push(example);
290
+ return this;
291
+ }
292
+ option(rawName, description, config) {
293
+ const option = new Option(rawName, description, config);
294
+ this.options.push(option);
295
+ return this;
296
+ }
297
+ alias(name) {
298
+ this.aliasNames.push(name);
299
+ return this;
300
+ }
301
+ action(callback) {
302
+ this.commandAction = callback;
303
+ return this;
304
+ }
305
+ isMatched(name) {
306
+ return this.name === name || this.aliasNames.includes(name);
307
+ }
308
+ get isDefaultCommand() {
309
+ return this.name === "" || this.aliasNames.includes("!");
310
+ }
311
+ get isGlobalCommand() {
312
+ return this instanceof GlobalCommand;
313
+ }
314
+ hasOption(name) {
315
+ name = name.split(".")[0];
316
+ return this.options.find((option) => {
317
+ return option.names.includes(name);
318
+ });
319
+ }
320
+ outputHelp() {
321
+ const {name, commands} = this.cli;
322
+ const {
323
+ versionNumber,
324
+ options: globalOptions,
325
+ helpCallback
326
+ } = this.cli.globalCommand;
327
+ let sections = [
328
+ {
329
+ body: `${name}${versionNumber ? `/${versionNumber}` : ""}`
373
330
  }
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
331
+ ];
332
+ sections.push({
333
+ title: "Usage",
334
+ body: ` $ ${name} ${this.usageText || this.rawName}`
335
+ });
336
+ const showCommands = (this.isGlobalCommand || this.isDefaultCommand) && commands.length > 0;
337
+ if (showCommands) {
338
+ const longestCommandName = findLongest(commands.map((command) => command.rawName));
339
+ sections.push({
340
+ title: "Commands",
341
+ body: commands.map((command) => {
342
+ return ` ${padRight(command.rawName, longestCommandName.length)} ${command.description}`;
343
+ }).join("\n")
344
+ });
345
+ sections.push({
346
+ title: `For more info, run any command with the \`--help\` flag`,
347
+ body: commands.map((command) => ` $ ${name}${command.name === "" ? "" : ` ${command.name}`} --help`).join("\n")
380
348
  });
381
349
  }
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
350
+ let options = this.isGlobalCommand ? globalOptions : [...this.options, ...globalOptions || []];
351
+ if (!this.isGlobalCommand && !this.isDefaultCommand) {
352
+ options = options.filter((option) => option.name !== "version");
353
+ }
354
+ if (options.length > 0) {
355
+ const longestOptionName = findLongest(options.map((option) => option.rawName));
356
+ sections.push({
357
+ title: "Options",
358
+ body: options.map((option) => {
359
+ return ` ${padRight(option.rawName, longestOptionName.length)} ${option.description} ${option.config.default === void 0 ? "" : `(default: ${option.config.default})`}`;
360
+ }).join("\n")
401
361
  });
402
362
  }
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 });
363
+ if (this.examples.length > 0) {
364
+ sections.push({
365
+ title: "Examples",
366
+ body: this.examples.map((example) => {
367
+ if (typeof example === "function") {
368
+ return example(name);
369
+ }
370
+ return example;
371
+ }).join("\n")
372
+ });
413
373
  }
414
- if (!existsSync(skillsDir)) {
415
- mkdirSync(skillsDir, { recursive: true });
374
+ if (helpCallback) {
375
+ sections = helpCallback(sections) || sections;
416
376
  }
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");
377
+ console.log(sections.map((section) => {
378
+ return section.title ? `${section.title}:
379
+ ${section.body}` : section.body;
380
+ }).join("\n\n"));
381
+ }
382
+ outputVersion() {
383
+ const {name} = this.cli;
384
+ const {versionNumber} = this.cli.globalCommand;
385
+ if (versionNumber) {
386
+ console.log(`${name}/${versionNumber} ${platformInfo}`);
423
387
  }
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");
388
+ }
389
+ checkRequiredArgs() {
390
+ const minimalArgsCount = this.args.filter((arg) => arg.required).length;
391
+ if (this.cli.args.length < minimalArgsCount) {
392
+ throw new CACError(`missing required args for command \`${this.rawName}\``);
430
393
  }
431
394
  }
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}`);
395
+ checkUnknownOptions() {
396
+ const {options, globalCommand} = this.cli;
397
+ if (!this.config.allowUnknownOptions) {
398
+ for (const name of Object.keys(options)) {
399
+ if (name !== "--" && !this.hasOption(name) && !globalCommand.hasOption(name)) {
400
+ throw new CACError(`Unknown option \`${name.length > 1 ? `--${name}` : `-${name}`}\``);
401
+ }
402
+ }
443
403
  }
444
- lines.push("\n## Skills\n");
445
- for (const skill of skills) {
446
- lines.push(`- ${skill.id}: ${skill.path}`);
404
+ }
405
+ checkOptionValue() {
406
+ const {options: parsedOptions, globalCommand} = this.cli;
407
+ const options = [...globalCommand.options, ...this.options];
408
+ for (const option of options) {
409
+ const value = parsedOptions[option.name.split(".")[0]];
410
+ if (option.required) {
411
+ const hasNegated = options.some((o) => o.negated && o.names.includes(option.name));
412
+ if (value === true || value === false && !hasNegated) {
413
+ throw new CACError(`option \`${option.rawName}\` value is missing`);
414
+ }
415
+ }
447
416
  }
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
417
  }
454
418
  }
455
- async function generateConfigs(selection) {
456
- const generator = new ConfigGenerator();
457
- return generator.generate(selection);
458
- }
459
- async function writeConfigs(config) {
460
- const generator = new ConfigGenerator();
461
- await generator.write(config);
419
+ class GlobalCommand extends Command {
420
+ constructor(cli) {
421
+ super("@@global@@", "", {}, cli);
422
+ }
462
423
  }
463
424
 
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
- );
425
+ var __assign = Object.assign;
426
+ class CAC extends EventEmitter {
427
+ constructor(name = "") {
428
+ super();
429
+ this.name = name;
430
+ this.commands = [];
431
+ this.rawArgs = [];
432
+ this.args = [];
433
+ this.options = {};
434
+ this.globalCommand = new GlobalCommand(this);
435
+ this.globalCommand.usage("<command> [options]");
436
+ }
437
+ usage(text) {
438
+ this.globalCommand.usage(text);
439
+ return this;
440
+ }
441
+ command(rawName, description, config) {
442
+ const command = new Command(rawName, description || "", config, this);
443
+ command.globalCommand = this.globalCommand;
444
+ this.commands.push(command);
445
+ return command;
446
+ }
447
+ option(rawName, description, config) {
448
+ this.globalCommand.option(rawName, description, config);
449
+ return this;
450
+ }
451
+ help(callback) {
452
+ this.globalCommand.option("-h, --help", "Display this message");
453
+ this.globalCommand.helpCallback = callback;
454
+ this.showHelpOnExit = true;
455
+ return this;
456
+ }
457
+ version(version, customFlags = "-v, --version") {
458
+ this.globalCommand.version(version, customFlags);
459
+ this.showVersionOnExit = true;
460
+ return this;
461
+ }
462
+ example(example) {
463
+ this.globalCommand.example(example);
464
+ return this;
465
+ }
466
+ outputHelp() {
467
+ if (this.matchedCommand) {
468
+ this.matchedCommand.outputHelp();
469
+ } else {
470
+ this.globalCommand.outputHelp();
471
+ }
472
+ }
473
+ outputVersion() {
474
+ this.globalCommand.outputVersion();
475
+ }
476
+ setParsedInfo({args, options}, matchedCommand, matchedCommandName) {
477
+ this.args = args;
478
+ this.options = options;
479
+ if (matchedCommand) {
480
+ this.matchedCommand = matchedCommand;
481
+ }
482
+ if (matchedCommandName) {
483
+ this.matchedCommandName = matchedCommandName;
484
+ }
485
+ return this;
486
+ }
487
+ unsetMatchedCommand() {
488
+ this.matchedCommand = void 0;
489
+ this.matchedCommandName = void 0;
490
+ }
491
+ parse(argv = processArgs, {
492
+ run = true
493
+ } = {}) {
494
+ this.rawArgs = argv;
495
+ if (!this.name) {
496
+ this.name = argv[1] ? getFileName(argv[1]) : "cli";
497
+ }
498
+ let shouldParse = true;
499
+ for (const command of this.commands) {
500
+ const parsed = this.mri(argv.slice(2), command);
501
+ const commandName = parsed.args[0];
502
+ if (command.isMatched(commandName)) {
503
+ shouldParse = false;
504
+ const parsedInfo = __assign(__assign({}, parsed), {
505
+ args: parsed.args.slice(1)
506
+ });
507
+ this.setParsedInfo(parsedInfo, command, commandName);
508
+ this.emit(`command:${commandName}`, command);
509
+ }
549
510
  }
550
- if (analysis.hasApi) {
551
- selectedSkills.push(
552
- ...this.findSkillsByIds(skillIndex, ["api-docs"])
553
- );
511
+ if (shouldParse) {
512
+ for (const command of this.commands) {
513
+ if (command.name === "") {
514
+ shouldParse = false;
515
+ const parsed = this.mri(argv.slice(2), command);
516
+ this.setParsedInfo(parsed, command);
517
+ this.emit(`command:!`, command);
518
+ }
519
+ }
554
520
  }
555
- if (analysis.hasDatabase) {
556
- selectedSkills.push(
557
- ...this.findSkillsByIds(skillIndex, ["database-migration"])
558
- );
521
+ if (shouldParse) {
522
+ const parsed = this.mri(argv.slice(2));
523
+ this.setParsedInfo(parsed);
559
524
  }
560
- if (analysis.projectType === "frontend" || analysis.projectType === "fullstack") {
561
- selectedSkills.push(
562
- ...this.findSkillsByIds(skillIndex, ["performance-optimization"])
563
- );
525
+ if (this.options.help && this.showHelpOnExit) {
526
+ this.outputHelp();
527
+ run = false;
528
+ this.unsetMatchedCommand();
564
529
  }
565
- if (analysis.packageJson) {
566
- selectedSkills.push(
567
- ...this.findSkillsByIds(skillIndex, ["dependency-update"])
568
- );
530
+ if (this.options.version && this.showVersionOnExit && this.matchedCommandName == null) {
531
+ this.outputVersion();
532
+ run = false;
533
+ this.unsetMatchedCommand();
569
534
  }
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: [] };
535
+ const parsedArgv = {args: this.args, options: this.options};
536
+ if (run) {
537
+ this.runMatchedCommand();
585
538
  }
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: [] };
539
+ if (!this.matchedCommand && this.args[0]) {
540
+ this.emit("command:*");
597
541
  }
542
+ return parsedArgv;
598
543
  }
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);
544
+ mri(argv, command) {
545
+ const cliOptions = [
546
+ ...this.globalCommand.options,
547
+ ...command ? command.options : []
548
+ ];
549
+ const mriOptions = getMriOptions(cliOptions);
550
+ let argsAfterDoubleDashes = [];
551
+ const doubleDashesIndex = argv.indexOf("--");
552
+ if (doubleDashesIndex > -1) {
553
+ argsAfterDoubleDashes = argv.slice(doubleDashesIndex + 1);
554
+ argv = argv.slice(0, doubleDashesIndex);
555
+ }
556
+ let parsed = mri2(argv, mriOptions);
557
+ parsed = Object.keys(parsed).reduce((res, name) => {
558
+ return __assign(__assign({}, res), {
559
+ [camelcaseOptionName(name)]: parsed[name]
560
+ });
561
+ }, {_: []});
562
+ const args = parsed._;
563
+ const options = {
564
+ "--": argsAfterDoubleDashes
565
+ };
566
+ const ignoreDefault = command && command.config.ignoreOptionDefaultValue ? command.config.ignoreOptionDefaultValue : this.globalCommand.config.ignoreOptionDefaultValue;
567
+ let transforms = Object.create(null);
568
+ for (const cliOption of cliOptions) {
569
+ if (!ignoreDefault && cliOption.config.default !== void 0) {
570
+ for (const name of cliOption.names) {
571
+ options[name] = cliOption.config.default;
572
+ }
573
+ }
574
+ if (Array.isArray(cliOption.config.type)) {
575
+ if (transforms[cliOption.name] === void 0) {
576
+ transforms[cliOption.name] = Object.create(null);
577
+ transforms[cliOption.name]["shouldTransform"] = true;
578
+ transforms[cliOption.name]["transformFunction"] = cliOption.config.type[0];
579
+ }
627
580
  }
628
581
  }
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`);
582
+ for (const key of Object.keys(parsed)) {
583
+ if (key !== "_") {
584
+ const keys = key.split(".");
585
+ setDotProp(options, keys, parsed[key]);
586
+ setByType(options, transforms);
587
+ }
652
588
  }
653
- reasons.push(`
654
- Selected ${agents.length} agents and ${skills.length} skills`);
655
- return reasons.join("\n");
589
+ return {
590
+ args,
591
+ options
592
+ };
593
+ }
594
+ runMatchedCommand() {
595
+ const {args, options, matchedCommand: command} = this;
596
+ if (!command || !command.commandAction)
597
+ return;
598
+ command.checkUnknownOptions();
599
+ command.checkOptionValue();
600
+ command.checkRequiredArgs();
601
+ const actionArgs = [];
602
+ command.args.forEach((arg, index) => {
603
+ if (arg.variadic) {
604
+ actionArgs.push(args.slice(index));
605
+ } else {
606
+ actionArgs.push(args[index]);
607
+ }
608
+ });
609
+ actionArgs.push(options);
610
+ return command.commandAction.apply(this, actionArgs);
656
611
  }
657
- }
658
- async function selectTemplates(analysis) {
659
- const selector = new TemplateSelector();
660
- return selector.select(analysis);
661
612
  }
662
613
 
663
- async function smartGenerate(projectRoot) {
664
- const analysis = await analyzeProject(projectRoot);
665
- const selection = await selectTemplates(analysis);
666
- const config = await generateConfigs(selection);
667
- return {
668
- analysis,
669
- selection,
670
- config
671
- };
672
- }
673
- async function smartGenerateAndInstall(projectRoot) {
674
- const result = await smartGenerate(projectRoot);
675
- await writeConfigs(result.config);
676
- return result;
677
- }
614
+ const cac = (name = "") => new CAC(name);
678
615
 
679
- export { ConfigGenerator, ProjectAnalyzer, TemplateSelector, analyzeProject, generateConfigs, selectTemplates, smartGenerate, smartGenerateAndInstall, writeConfigs };
616
+ export { CAC, Command, cac, cac as default };