ccjk 2.6.1 → 3.0.2

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 (53) hide show
  1. package/dist/chunks/agent.mjs +1412 -0
  2. package/dist/chunks/api.mjs +7 -7
  3. package/dist/chunks/auto-updater.mjs +9 -9
  4. package/dist/chunks/ccr.mjs +4 -4
  5. package/dist/chunks/ccu.mjs +1 -1
  6. package/dist/chunks/claude-code-incremental-manager.mjs +6 -6
  7. package/dist/chunks/claude-wrapper.mjs +18 -5
  8. package/dist/chunks/codex.mjs +4 -4
  9. package/dist/chunks/commands2.mjs +5 -5
  10. package/dist/chunks/commit.mjs +2 -2
  11. package/dist/chunks/config-consolidator.mjs +2 -2
  12. package/dist/chunks/config-switch.mjs +6 -6
  13. package/dist/chunks/config.mjs +1 -1
  14. package/dist/chunks/config2.mjs +14 -14
  15. package/dist/chunks/doctor.mjs +3 -3
  16. package/dist/chunks/features.mjs +12 -12
  17. package/dist/chunks/help.mjs +35 -35
  18. package/dist/chunks/index.mjs +12 -11
  19. package/dist/chunks/init.mjs +21 -21
  20. package/dist/chunks/interview.mjs +33 -33
  21. package/dist/chunks/marketplace.mjs +8 -8
  22. package/dist/chunks/mcp.mjs +8 -8
  23. package/dist/chunks/menu.mjs +302 -293
  24. package/dist/chunks/notification.mjs +5 -5
  25. package/dist/chunks/onboarding.mjs +17 -346
  26. package/dist/chunks/package.mjs +1 -1
  27. package/dist/chunks/permission-manager.mjs +3 -3
  28. package/dist/chunks/plugin.mjs +1937 -0
  29. package/dist/chunks/prompts.mjs +3 -3
  30. package/dist/chunks/providers.mjs +13 -13
  31. package/dist/chunks/session.mjs +17 -17
  32. package/dist/chunks/skill.mjs +304 -0
  33. package/dist/chunks/skills-sync.mjs +4 -4
  34. package/dist/chunks/skills.mjs +2 -2
  35. package/dist/chunks/team.mjs +1 -1
  36. package/dist/chunks/uninstall.mjs +8 -8
  37. package/dist/chunks/update.mjs +4 -4
  38. package/dist/chunks/upgrade-manager.mjs +3 -3
  39. package/dist/chunks/version-checker.mjs +6 -6
  40. package/dist/chunks/workflows.mjs +2 -2
  41. package/dist/cli.mjs +57 -4
  42. package/dist/index.d.mts +157 -14
  43. package/dist/index.d.ts +157 -14
  44. package/dist/index.mjs +6 -5
  45. package/dist/shared/ccjk.B2Aos9HI.mjs +333 -0
  46. package/dist/shared/{ccjk.rLRHmcqD.mjs → ccjk.BQzWKmC3.mjs} +3 -3
  47. package/dist/shared/{ccjk.uVUeWAt8.mjs → ccjk.BZT_f2go.mjs} +7 -7
  48. package/dist/shared/{ccjk.-FoZ3zat.mjs → ccjk.BlPCiSHj.mjs} +10 -10
  49. package/dist/shared/ccjk.DH6cOJsf.mjs +1674 -0
  50. package/dist/shared/{ccjk.tB4-Y4Qb.mjs → ccjk.DrMygfCF.mjs} +1 -1
  51. package/dist/shared/ccjk.tJ08-yZt.mjs +179 -0
  52. package/package.json +1 -1
  53. package/dist/shared/ccjk.BhKlRJ0h.mjs +0 -114
package/dist/index.mjs CHANGED
@@ -1,16 +1,17 @@
1
1
  export { l as createHomebrewSymlink, f as detectInstalledVersion, m as displayVerificationResult, j as executeInstallMethod, g as getInstallationStatus, k as handleInstallFailure, i as init, b as installClaudeCode, d as installCodex, a as isClaudeCodeInstalled, c as isCodexInstalled, e as isLocalClaudeCodeInstalled, r as removeLocalClaudeCode, h as selectInstallMethod, s as setInstallMethod, u as uninstallCodeTool, v as verifyInstallation } from './chunks/init.mjs';
2
2
  export { AIDER_CONFIG_FILE, AIDER_DIR, AIDER_ENV_FILE, AI_OUTPUT_LANGUAGES, API_DEFAULT_URL, API_ENV_KEY, CCJK_CLOUD_API_URL, CCJK_CLOUD_PLUGINS_API, CCJK_CLOUD_PLUGINS_CACHE_DIR, CCJK_CLOUD_PLUGINS_CACHE_FILE, CCJK_CLOUD_PLUGINS_DIR, CCJK_CLOUD_PLUGINS_INSTALLED_DIR, CCJK_CONFIG_DIR, CCJK_CONFIG_FILE, CCJK_GROUPS_DIR, CCJK_PLUGINS_DIR, CCJK_SKILLS_DIR, CLAUDE_DIR, CLAUDE_MD_FILE, CLAUDE_VSC_CONFIG_FILE, CLINE_CONFIG_FILE, CLINE_DIR, CLOUD_PLUGINS_CACHE_TTL, CLOUD_PLUGINS_MAX_CACHE_SIZE, CODEX_AGENTS_FILE, CODEX_AUTH_FILE, CODEX_CONFIG_FILE, CODEX_DIR, CODEX_PROMPTS_DIR, CODE_TOOL_ALIASES, CODE_TOOL_BANNERS, CODE_TOOL_INFO, CODE_TOOL_TYPES, CONTINUE_CONFIG_FILE, CONTINUE_DIR, CURSOR_CONFIG_FILE, CURSOR_DIR, ClAUDE_CONFIG_FILE, DEFAULT_CODE_TOOL_TYPE, LANG_LABELS, LEGACY_ZCF_CONFIG_DIR, LEGACY_ZCF_CONFIG_FILE, LEGACY_ZCF_CONFIG_FILES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_DIR, ZCF_CONFIG_FILE, getAiOutputLanguageLabel, isCodeToolType, resolveCodeToolType } from './chunks/constants.mjs';
3
- export { C as COLORS, S as STATUS, b as boxify, d as displayBanner, a as displayBannerWithInfo, g as getDisplayWidth, m as menuItem, p as padToDisplayWidth, r as renderProgressBar, s as sectionDivider } from './shared/ccjk.BhKlRJ0h.mjs';
3
+ export { t as COLORS, S as STATUS, b as box, a as boxify, f as displayBanner, i as displayBannerWithInfo, d as divider, g as getDisplayWidth, h as header, m as menuItem, e as padToDisplayWidth, p as progress, r as renderProgressBar, s as sectionDivider, c as status, t as theme } from './shared/ccjk.tJ08-yZt.mjs';
4
4
  export { e as addCompletedOnboarding, y as applyAiLanguageDirective, l as backupExistingConfig, b as backupMcpConfig, d as buildMcpServerConfig, c as cleanupPermissions, o as configureApi, n as copyConfigFiles, h as ensureApiKeyApproved, k as ensureClaudeDir, f as fixWindowsMcpConfig, x as getExistingApiConfig, v as getExistingModelConfig, g as getMcpConfigPath, j as manageApiKeyApproval, m as mergeAndCleanPermissions, p as mergeConfigs, a as mergeMcpServers, t as mergeSettingsFile, A as promptApiConfigurationAction, r as readMcpConfig, i as removeApiKeyFromRejected, s as setPrimaryApiKey, z as switchToOfficialLogin, u as updateCustomModel, q as updateDefaultModel, w as writeMcpConfig } from './chunks/config.mjs';
5
5
  export { compareConfigs, consolidateConfigs, detectAllConfigs, displayConfigScan, removeRedundantConfigs, writeConsolidatedConfig } from './chunks/config-consolidator.mjs';
6
6
  export { d as detectProjectContext, k as formatFileSize, e as generateContextContent, b as getApplicableRules, j as getContextFileTypeLabel, c as getContextFiles, g as getContextRules, h as getProjectTypeLabel, f as getRecommendedRules, i as importRecommendedEnv, a as importRecommendedPermissions, m as mergeContextContent, o as openSettingsJson, r as readContextFile, w as writeContextFile } from './shared/ccjk.Dut3wyoP.mjs';
7
7
  export { U as CodexUninstaller, al as MenuBuilder, a2 as addContinueCustomCommand, a1 as addContinueMcpServer, Z as addContinueModel, o as addGroup, Q as addProviderToExisting, M as configureAiderApi, a0 as configureContinueApi, P as configureIncrementalManagement, an as confirm, S as deleteProviders, p as disableGroup, f as disablePlugin, d as discoverPlugins, aj as displayHealthReport, R as editExistingProvider, a3 as enableContinueContextProvider, q as enableGroup, c as enablePlugin, J as ensureAiderDir, V as ensureContinueDir, s as ensureGroupsDir, e as ensurePluginsDir, t as exportGroups, ag as formatToolStatus, N as getAiderModelPresets, H as getAiderVersion, v as getAllGroups, ae as getAllToolsInfo, aa as getAllToolsStatus, $ as getContinueProviderPresets, x as getEnabledAgents, y as getEnabledSkillIds, z as getGroup, A as getGroupRegistry, ab as getInstalledTools, g as getLoadedPlugins, i as getPluginAgents, a as getPluginInfo, j as getPluginMcpServices, k as getPluginOutputStyles, m as getPluginSkills, h as getPluginWorkflows, ah as getRecommendedTools, a5 as getToolConfigPath, a6 as getToolDir, ad as getToolInfo, a9 as getToolStatus, a8 as getToolVersion, af as getToolsByCategory, B as importGroups, n as initializePlugins, I as installAider, ac as installTool, G as isAiderInstalled, W as isContinueConfigured, C as isGroupEnabled, a7 as isToolInstalled, b as listPlugins, l as loadPlugin, K as readAiderConfig, X as readContinueConfig, r as readPluginConfig, D as refreshGroupRegistry, _ as removeContinueModel, E as removeGroup, O as runAider, ak as runDoctor, ai as runHealthCheck, F as searchGroups, am as showQuickMenu, ao as showStatus, a4 as syncSkillsToContinue, u as unloadPlugin, T as validateProviderData, L as writeAiderConfig, Y as writeContinueConfig, w as writePluginConfig } from './chunks/index.mjs';
8
- export { b as detectBuildTools, e as detectCICDSystems, a as detectFrameworks, f as detectLanguages, d as detectPackageManager, h as detectProject, c as detectTestFrameworks, g as determineProjectType, m as exportProjectKnowledge, i as generateSuggestions, k as getProjectKnowledge, j as getProjectSummary, l as loadKnowledgeBase, q as quickSync, r as runOnboarding, s as saveKnowledgeBase } from './chunks/onboarding.mjs';
8
+ export { exportProjectKnowledge, getProjectKnowledge, loadKnowledgeBase, quickSync, runOnboarding, saveKnowledgeBase } from './chunks/onboarding.mjs';
9
9
  export { PERMISSION_TEMPLATES, addAutoApprovePattern, applyTemplate, displayPermissions, exportPermissions, getCurrentTemplateId, importPermissions, isDirectoryTrusted, isPermissionAllowed, readPermissions, removeAutoApprovePattern, resetPermissions, trustDirectory, untrustDirectory, writePermissions } from './chunks/permission-manager.mjs';
10
10
  export { commandExists, getPlatform } from './chunks/platform.mjs';
11
11
  export { checkAllVersions, checkCcjkVersion, checkClaudeCodeVersion, checkPluginVersions, upgradeAll, upgradeAllPlugins, upgradeCcjk, upgradeClaudeCode, upgradePlugin } from './chunks/upgrade-manager.mjs';
12
- export { d as displayCurrentStatus, r as runConfigWizard } from './shared/ccjk.-FoZ3zat.mjs';
12
+ export { d as displayCurrentStatus, r as runConfigWizard } from './shared/ccjk.BlPCiSHj.mjs';
13
13
  export { a as addSkill, c as createBatchSkills, e as ensureSkillsDir, b as exportSkills, g as getAllSkills, d as getBatchCategories, f as getBuiltinSkill, h as getBuiltinSkills, i as getSkill, j as getSkillRegistry, k as importSkills, l as isBuiltinSkill, r as refreshSkillRegistry, m as removeSkill, s as searchSkills, n as setSkillEnabled } from './shared/ccjk.B-lZxV2u.mjs';
14
+ export { b as detectBuildTools, e as detectCICDSystems, a as detectFrameworks, f as detectLanguages, d as detectPackageManager, h as detectProject, c as detectTestFrameworks, g as determineProjectType, i as generateSuggestions, j as getProjectSummary } from './shared/ccjk.B2Aos9HI.mjs';
14
15
  export { L as applyCodexPlatformCommand, c as backupCodexAgents, b as backupCodexComplete, e as backupCodexConfig, f as backupCodexFiles, g as backupCodexPrompts, h as checkCodexUpdate, s as codexSwitchToOfficialLogin, i as configureCodexApi, K as configureCodexMcp, j as createBackupDirectory, d as detectConfigManagementMode, k as ensureEnvKeyMigration, J as getAvailableManagementActions, l as getBackupMessage, m as getCodexVersion, n as getCurrentCodexProvider, o as installCodexCli, p as isCodexCliInstalled, q as listCodexProviders, t as migrateEnvKeyInContent, u as migrateEnvKeyToTempEnvKey, v as needsEnvKeyMigration, x as parseCodexConfig, r as readCodexConfig, y as renderCodexConfig, z as runCodexFullInit, A as runCodexSystemPromptSelection, B as runCodexUninstall, C as runCodexUpdate, D as runCodexWorkflowImport, E as runCodexWorkflowImportWithLanguageSelection, F as runCodexWorkflowSelection, I as shouldShowManagementMode, G as switchCodexProvider, H as switchToProvider, a as writeAuthFile, w as writeCodexConfig } from './chunks/codex.mjs';
15
16
  import 'node:fs';
16
17
  import 'node:process';
@@ -42,8 +43,8 @@ import './chunks/version-checker.mjs';
42
43
  import 'node:path';
43
44
  import 'semver';
44
45
  import './shared/ccjk.CUdzQluX.mjs';
45
- import './shared/ccjk.rLRHmcqD.mjs';
46
- import './shared/ccjk.tB4-Y4Qb.mjs';
46
+ import './shared/ccjk.BQzWKmC3.mjs';
47
+ import './shared/ccjk.DrMygfCF.mjs';
47
48
  import './chunks/prompts.mjs';
48
49
  import 'fs-extra';
49
50
  import './shared/ccjk.DGjQxTq_.mjs';
@@ -0,0 +1,333 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import process__default from 'node:process';
3
+ import { join } from 'pathe';
4
+
5
+ function readPackageJson(dir) {
6
+ const pkgPath = join(dir, "package.json");
7
+ if (!existsSync(pkgPath))
8
+ return null;
9
+ try {
10
+ return JSON.parse(readFileSync(pkgPath, "utf-8"));
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ function detectPackageManager(dir) {
16
+ if (existsSync(join(dir, "bun.lockb")))
17
+ return "bun";
18
+ if (existsSync(join(dir, "pnpm-lock.yaml")))
19
+ return "pnpm";
20
+ if (existsSync(join(dir, "yarn.lock")))
21
+ return "yarn";
22
+ if (existsSync(join(dir, "package-lock.json")))
23
+ return "npm";
24
+ const pkg = readPackageJson(dir);
25
+ if (pkg?.packageManager) {
26
+ if (pkg.packageManager.startsWith("pnpm"))
27
+ return "pnpm";
28
+ if (pkg.packageManager.startsWith("yarn"))
29
+ return "yarn";
30
+ if (pkg.packageManager.startsWith("bun"))
31
+ return "bun";
32
+ }
33
+ return "unknown";
34
+ }
35
+ function detectFrameworks(dir) {
36
+ const frameworks = [];
37
+ const pkg = readPackageJson(dir);
38
+ if (!pkg)
39
+ return frameworks;
40
+ const allDeps = {
41
+ ...pkg.dependencies,
42
+ ...pkg.devDependencies
43
+ };
44
+ if (allDeps.react)
45
+ frameworks.push("react");
46
+ if (allDeps.vue)
47
+ frameworks.push("vue");
48
+ if (allDeps["@angular/core"])
49
+ frameworks.push("angular");
50
+ if (allDeps.svelte)
51
+ frameworks.push("svelte");
52
+ if (allDeps.next)
53
+ frameworks.push("nextjs");
54
+ if (allDeps.nuxt)
55
+ frameworks.push("nuxt");
56
+ if (allDeps["@remix-run/react"])
57
+ frameworks.push("remix");
58
+ if (allDeps.astro)
59
+ frameworks.push("astro");
60
+ if (allDeps.express)
61
+ frameworks.push("express");
62
+ if (allDeps.fastify)
63
+ frameworks.push("fastify");
64
+ if (allDeps["@nestjs/core"])
65
+ frameworks.push("nestjs");
66
+ if (allDeps.koa)
67
+ frameworks.push("koa");
68
+ if (allDeps.hono)
69
+ frameworks.push("hono");
70
+ if (allDeps.electron)
71
+ frameworks.push("electron");
72
+ if (allDeps["@tauri-apps/api"])
73
+ frameworks.push("tauri");
74
+ if (allDeps["react-native"])
75
+ frameworks.push("react-native");
76
+ if (existsSync(join(dir, "requirements.txt")) || existsSync(join(dir, "pyproject.toml"))) {
77
+ const reqPath = join(dir, "requirements.txt");
78
+ if (existsSync(reqPath)) {
79
+ const reqs = readFileSync(reqPath, "utf-8").toLowerCase();
80
+ if (reqs.includes("django"))
81
+ frameworks.push("django");
82
+ if (reqs.includes("flask"))
83
+ frameworks.push("flask");
84
+ if (reqs.includes("fastapi"))
85
+ frameworks.push("fastapi");
86
+ }
87
+ }
88
+ if (existsSync(join(dir, "Gemfile"))) {
89
+ const gemfile = readFileSync(join(dir, "Gemfile"), "utf-8").toLowerCase();
90
+ if (gemfile.includes("rails"))
91
+ frameworks.push("rails");
92
+ }
93
+ if (existsSync(join(dir, "composer.json"))) {
94
+ try {
95
+ const composer = JSON.parse(readFileSync(join(dir, "composer.json"), "utf-8"));
96
+ if (composer.require?.["laravel/framework"])
97
+ frameworks.push("laravel");
98
+ } catch {
99
+ }
100
+ }
101
+ return frameworks;
102
+ }
103
+ function detectBuildTools(dir) {
104
+ const tools = [];
105
+ const pkg = readPackageJson(dir);
106
+ if (existsSync(join(dir, "vite.config.ts")) || existsSync(join(dir, "vite.config.js")))
107
+ tools.push("vite");
108
+ if (existsSync(join(dir, "webpack.config.js")) || existsSync(join(dir, "webpack.config.ts")))
109
+ tools.push("webpack");
110
+ if (existsSync(join(dir, "rollup.config.js")) || existsSync(join(dir, "rollup.config.ts")))
111
+ tools.push("rollup");
112
+ if (existsSync(join(dir, "tsup.config.ts")) || existsSync(join(dir, "tsup.config.js")))
113
+ tools.push("tsup");
114
+ if (pkg) {
115
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
116
+ if (allDeps.esbuild)
117
+ tools.push("esbuild");
118
+ if (allDeps["@swc/core"])
119
+ tools.push("swc");
120
+ if (allDeps.turbo)
121
+ tools.push("turbopack");
122
+ if (allDeps.parcel)
123
+ tools.push("parcel");
124
+ if (allDeps.unbuild)
125
+ tools.push("unbuild");
126
+ }
127
+ return tools;
128
+ }
129
+ function detectTestFrameworks(dir) {
130
+ const frameworks = [];
131
+ const pkg = readPackageJson(dir);
132
+ if (existsSync(join(dir, "vitest.config.ts")) || existsSync(join(dir, "vitest.config.js")))
133
+ frameworks.push("vitest");
134
+ if (existsSync(join(dir, "jest.config.js")) || existsSync(join(dir, "jest.config.ts")))
135
+ frameworks.push("jest");
136
+ if (existsSync(join(dir, "cypress.config.ts")) || existsSync(join(dir, "cypress.config.js")))
137
+ frameworks.push("cypress");
138
+ if (existsSync(join(dir, "playwright.config.ts")))
139
+ frameworks.push("playwright");
140
+ if (existsSync(join(dir, "pytest.ini")) || existsSync(join(dir, "conftest.py")))
141
+ frameworks.push("pytest");
142
+ if (pkg) {
143
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
144
+ if (allDeps.vitest && !frameworks.includes("vitest"))
145
+ frameworks.push("vitest");
146
+ if (allDeps.jest && !frameworks.includes("jest"))
147
+ frameworks.push("jest");
148
+ if (allDeps.mocha)
149
+ frameworks.push("mocha");
150
+ if (allDeps.cypress && !frameworks.includes("cypress"))
151
+ frameworks.push("cypress");
152
+ if (allDeps["@playwright/test"] && !frameworks.includes("playwright"))
153
+ frameworks.push("playwright");
154
+ }
155
+ return frameworks;
156
+ }
157
+ function detectCICDSystems(dir) {
158
+ const systems = [];
159
+ if (existsSync(join(dir, ".github", "workflows")))
160
+ systems.push("github-actions");
161
+ if (existsSync(join(dir, ".gitlab-ci.yml")))
162
+ systems.push("gitlab-ci");
163
+ if (existsSync(join(dir, "Jenkinsfile")))
164
+ systems.push("jenkins");
165
+ if (existsSync(join(dir, ".circleci")))
166
+ systems.push("circleci");
167
+ if (existsSync(join(dir, ".travis.yml")))
168
+ systems.push("travis");
169
+ if (existsSync(join(dir, "azure-pipelines.yml")))
170
+ systems.push("azure-pipelines");
171
+ return systems;
172
+ }
173
+ function detectLanguages(dir) {
174
+ const languages = [];
175
+ if (existsSync(join(dir, "tsconfig.json")))
176
+ languages.push("typescript");
177
+ if (existsSync(join(dir, "package.json"))) {
178
+ if (!languages.includes("typescript"))
179
+ languages.push("javascript");
180
+ }
181
+ if (existsSync(join(dir, "requirements.txt")) || existsSync(join(dir, "pyproject.toml")) || existsSync(join(dir, "setup.py")))
182
+ languages.push("python");
183
+ if (existsSync(join(dir, "Gemfile")))
184
+ languages.push("ruby");
185
+ if (existsSync(join(dir, "go.mod")))
186
+ languages.push("go");
187
+ if (existsSync(join(dir, "Cargo.toml")))
188
+ languages.push("rust");
189
+ if (existsSync(join(dir, "pom.xml")) || existsSync(join(dir, "build.gradle"))) {
190
+ languages.push("java");
191
+ if (existsSync(join(dir, "build.gradle.kts")))
192
+ languages.push("kotlin");
193
+ }
194
+ if (existsSync(join(dir, "composer.json")))
195
+ languages.push("php");
196
+ if (existsSync(join(dir, "Package.swift")))
197
+ languages.push("swift");
198
+ if (existsSync(join(dir, "pubspec.yaml")))
199
+ languages.push("dart");
200
+ return languages;
201
+ }
202
+ function determineProjectType(info) {
203
+ const frameworks = info.frameworks || [];
204
+ if (frameworks.includes("react-native") || frameworks.includes("flutter"))
205
+ return "mobile";
206
+ if (frameworks.includes("electron") || frameworks.includes("tauri"))
207
+ return "desktop";
208
+ const pkg = info.rootDir ? readPackageJson(info.rootDir) : null;
209
+ if (pkg?.bin)
210
+ return "cli";
211
+ if (pkg?.main || pkg?.exports) {
212
+ const hasAppFramework = frameworks.some(
213
+ (f) => ["react", "vue", "angular", "svelte", "nextjs", "nuxt", "express", "fastify", "nestjs"].includes(f)
214
+ );
215
+ if (!hasAppFramework)
216
+ return "library";
217
+ }
218
+ const frontendFrameworks = ["react", "vue", "angular", "svelte"];
219
+ const backendFrameworks = ["express", "fastify", "nestjs", "koa", "hono", "django", "flask", "fastapi", "rails", "laravel"];
220
+ const metaFrameworks = ["nextjs", "nuxt", "remix", "astro"];
221
+ const hasFrontend = frameworks.some((f) => frontendFrameworks.includes(f));
222
+ const hasBackend = frameworks.some((f) => backendFrameworks.includes(f));
223
+ const hasMeta = frameworks.some((f) => metaFrameworks.includes(f));
224
+ if (hasMeta)
225
+ return "fullstack";
226
+ if (hasFrontend && hasBackend)
227
+ return "fullstack";
228
+ if (hasFrontend)
229
+ return "frontend";
230
+ if (hasBackend)
231
+ return "backend";
232
+ return "unknown";
233
+ }
234
+ function detectProject(dir = process__default.cwd()) {
235
+ const pkg = readPackageJson(dir);
236
+ const frameworks = detectFrameworks(dir);
237
+ const languages = detectLanguages(dir);
238
+ const info = {
239
+ name: pkg?.name || "unknown",
240
+ type: "unknown",
241
+ packageManager: detectPackageManager(dir),
242
+ frameworks,
243
+ buildTools: detectBuildTools(dir),
244
+ testFrameworks: detectTestFrameworks(dir),
245
+ cicd: detectCICDSystems(dir),
246
+ languages,
247
+ hasTypeScript: existsSync(join(dir, "tsconfig.json")),
248
+ hasDocker: existsSync(join(dir, "Dockerfile")) || existsSync(join(dir, "docker-compose.yml")),
249
+ hasMonorepo: existsSync(join(dir, "pnpm-workspace.yaml")) || existsSync(join(dir, "lerna.json")) || pkg?.workspaces != null,
250
+ rootDir: dir
251
+ };
252
+ info.type = determineProjectType(info);
253
+ return info;
254
+ }
255
+ function generateSuggestions(project) {
256
+ const suggestions = {
257
+ workflows: ["git"],
258
+ mcpServices: [],
259
+ agents: [],
260
+ skills: [],
261
+ subagentGroups: [],
262
+ outputStyle: "technical-precise"
263
+ };
264
+ if (project.hasTypeScript || project.languages.includes("typescript")) {
265
+ suggestions.subagentGroups.push("typescript-dev");
266
+ suggestions.skills.push("ts-debug", "ts-refactor", "ts-test");
267
+ }
268
+ if (project.languages.includes("python")) {
269
+ suggestions.subagentGroups.push("python-dev");
270
+ suggestions.skills.push("py-debug", "py-refactor", "py-test");
271
+ }
272
+ if (project.frameworks.includes("nextjs") || project.frameworks.includes("nuxt")) {
273
+ suggestions.workflows.push("frontend", "testing");
274
+ suggestions.agents.push("ccjk-performance-expert");
275
+ }
276
+ if (project.frameworks.includes("express") || project.frameworks.includes("fastify") || project.frameworks.includes("nestjs")) {
277
+ suggestions.workflows.push("backend", "testing");
278
+ suggestions.agents.push("ccjk-security-expert");
279
+ }
280
+ if (project.hasDocker || project.cicd.length > 0) {
281
+ suggestions.workflows.push("devops");
282
+ suggestions.subagentGroups.push("devops-team");
283
+ suggestions.skills.push("devops-docker", "devops-ci");
284
+ }
285
+ if (project.testFrameworks.length > 0) {
286
+ suggestions.workflows.push("testing");
287
+ suggestions.agents.push("ccjk-testing-specialist");
288
+ }
289
+ if (project.hasMonorepo) {
290
+ suggestions.agents.push("ccjk-code-reviewer");
291
+ }
292
+ if (project.type === "frontend" || project.type === "fullstack") {
293
+ suggestions.subagentGroups.push("seo-team");
294
+ suggestions.skills.push("seo-meta", "seo-schema");
295
+ }
296
+ suggestions.subagentGroups.push("security-team");
297
+ suggestions.workflows = [...new Set(suggestions.workflows)];
298
+ suggestions.agents = [...new Set(suggestions.agents)];
299
+ suggestions.skills = [...new Set(suggestions.skills)];
300
+ suggestions.subagentGroups = [...new Set(suggestions.subagentGroups)];
301
+ return suggestions;
302
+ }
303
+ function getProjectSummary(project) {
304
+ const parts = [];
305
+ parts.push(`Project: ${project.name}`);
306
+ parts.push(`Type: ${project.type}`);
307
+ if (project.languages.length > 0) {
308
+ parts.push(`Languages: ${project.languages.join(", ")}`);
309
+ }
310
+ if (project.frameworks.length > 0) {
311
+ parts.push(`Frameworks: ${project.frameworks.join(", ")}`);
312
+ }
313
+ if (project.buildTools.length > 0) {
314
+ parts.push(`Build: ${project.buildTools.join(", ")}`);
315
+ }
316
+ if (project.testFrameworks.length > 0) {
317
+ parts.push(`Testing: ${project.testFrameworks.join(", ")}`);
318
+ }
319
+ parts.push(`Package Manager: ${project.packageManager}`);
320
+ const features = [];
321
+ if (project.hasTypeScript)
322
+ features.push("TypeScript");
323
+ if (project.hasDocker)
324
+ features.push("Docker");
325
+ if (project.hasMonorepo)
326
+ features.push("Monorepo");
327
+ if (features.length > 0) {
328
+ parts.push(`Features: ${features.join(", ")}`);
329
+ }
330
+ return parts.join("\n");
331
+ }
332
+
333
+ export { detectFrameworks as a, detectBuildTools as b, detectTestFrameworks as c, detectPackageManager as d, detectCICDSystems as e, detectLanguages as f, determineProjectType as g, detectProject as h, generateSuggestions as i, getProjectSummary as j };
@@ -416,7 +416,7 @@ async function updatePromptOnly(aiOutputLang) {
416
416
  await configureOutputStyle();
417
417
  console.log(ansis.green(`\u2714 ${i18n.t("configuration:configSuccess")} ${CLAUDE_DIR}`));
418
418
  console.log(`
419
- ${ansis.cyan(i18n.t("common:complete"))}`);
419
+ ${ansis.green(i18n.t("common:complete"))}`);
420
420
  }
421
421
 
422
422
  function getRootDir() {
@@ -501,7 +501,7 @@ async function installWorkflowWithDependencies(config, configLang) {
501
501
  interviewWorkflow: i18n.t("workflow:workflowOption.interviewWorkflow")
502
502
  };
503
503
  const workflowName = WORKFLOW_OPTION_KEYS[config.id] || config.id;
504
- console.log(ansis.cyan(`
504
+ console.log(ansis.green(`
505
505
  \u{1F4E6} ${i18n.t("workflow:installingWorkflow")}: ${workflowName}...`));
506
506
  const commandsDir = join(CLAUDE_DIR, "commands", "ccjk");
507
507
  if (!existsSync(commandsDir)) {
@@ -584,7 +584,7 @@ async function installWorkflowWithDependencies(config, configLang) {
584
584
  }
585
585
  async function cleanupOldVersionFiles() {
586
586
  ensureI18nInitialized();
587
- console.log(ansis.cyan(`
587
+ console.log(ansis.green(`
588
588
  \u{1F9F9} ${i18n.t("workflow:cleaningOldFiles")}...`));
589
589
  const oldCommandFiles = [
590
590
  join(CLAUDE_DIR, "commands", "workflow.md"),
@@ -761,7 +761,7 @@ async function displayInstalledMcpServices(tool) {
761
761
  console.log(ansis.yellow(i18n.t("mcp:installer.noServicesInstalled")));
762
762
  return;
763
763
  }
764
- console.log(ansis.cyan.bold(`
764
+ console.log(ansis.green.bold(`
765
765
  ${i18n.t("mcp:installer.installedServices", { tool: targetTool })}
766
766
  `));
767
767
  services.forEach((service, idx) => {
@@ -827,7 +827,7 @@ async function mcpSearch(keyword, options = {}) {
827
827
  ${i18n.t("mcp:market.noResults", { keyword })}`));
828
828
  return;
829
829
  }
830
- console.log(ansis.cyan.bold(`
830
+ console.log(ansis.green.bold(`
831
831
  ${i18n.t("mcp:market.searchResults", { count: result.total, keyword })}
832
832
  `));
833
833
  result.packages.forEach((pkg, idx) => {
@@ -856,7 +856,7 @@ ${i18n.t("mcp:market.apiUnavailable")}`));
856
856
  ${i18n.t("mcp:market.noResults", { keyword })}`));
857
857
  return;
858
858
  }
859
- console.log(ansis.cyan.bold(`
859
+ console.log(ansis.green.bold(`
860
860
  ${i18n.t("mcp:market.searchResults", { count: results.length, keyword })}
861
861
  `));
862
862
  results.forEach((server, idx) => {
@@ -876,7 +876,7 @@ async function mcpTrending(options = {}) {
876
876
  ${i18n.t("mcp:market.noTrending")}`));
877
877
  return;
878
878
  }
879
- console.log(ansis.cyan.bold(`
879
+ console.log(ansis.green.bold(`
880
880
  ${i18n.t("mcp:market.trending")}
881
881
  `));
882
882
  trending.forEach((pkg, idx) => {
@@ -892,7 +892,7 @@ ${i18n.t("mcp:market.trending")}
892
892
  console.log(ansis.yellow(`
893
893
  ${i18n.t("mcp:market.apiUnavailable")}`));
894
894
  console.log(ansis.dim(i18n.t("mcp:market.usingLocalData")));
895
- console.log(ansis.cyan.bold(`
895
+ console.log(ansis.green.bold(`
896
896
  ${i18n.t("mcp:market.trending")}
897
897
  `));
898
898
  const localServers = getLocalFallbackServices();
@@ -931,7 +931,7 @@ ${i18n.t("mcp:market.serverNotFound", { name: serverName })}`));
931
931
  ${i18n.t("mcp:installer.alreadyInstalled", { name: server.name })}`));
932
932
  return;
933
933
  }
934
- console.log(ansis.cyan(`
934
+ console.log(ansis.green(`
935
935
  ${i18n.t("mcp:market.installing", { name: server.name })}`));
936
936
  if (server.requiresApiKey) {
937
937
  console.log(ansis.dim(i18n.t("mcp:installer.requiresApiKey")));
@@ -960,7 +960,7 @@ ${i18n.t("mcp:installer.installFailed", { name: server.name })}`));
960
960
  }
961
961
  }
962
962
  } else {
963
- console.log(ansis.cyan(`
963
+ console.log(ansis.green(`
964
964
  ${i18n.t("mcp:market.installing", { name: server.name })}`));
965
965
  console.log(ansis.dim(`Package: ${server.package}
966
966
  `));
@@ -487,9 +487,9 @@ function displayCurrentStatus(lang = "en") {
487
487
  const { mode, provider } = detectCurrentMode();
488
488
  const config = getCurrentConfig();
489
489
  console.log("");
490
- console.log(ansis.cyan("\u2550".repeat(50)));
490
+ console.log(ansis.green("\u2550".repeat(50)));
491
491
  console.log(ansis.bold.cyan(lang === "zh-CN" ? " \u5F53\u524D API \u914D\u7F6E" : " Current API Configuration"));
492
- console.log(ansis.cyan("\u2550".repeat(50)));
492
+ console.log(ansis.green("\u2550".repeat(50)));
493
493
  console.log("");
494
494
  if (mode === "none") {
495
495
  console.log(ansis.yellow(lang === "zh-CN" ? " \u26A0 \u672A\u914D\u7F6E API" : " \u26A0 No API configured"));
@@ -505,7 +505,7 @@ function displayCurrentStatus(lang = "en") {
505
505
  if (provider) {
506
506
  const preset = getPresetById(provider);
507
507
  const providerName = preset ? lang === "zh-CN" ? preset.nameZh : preset.name : provider;
508
- console.log(` ${ansis.bold(lang === "zh-CN" ? "\u63D0\u4F9B\u5546:" : "Provider:")} ${ansis.cyan(providerName)}`);
508
+ console.log(` ${ansis.bold(lang === "zh-CN" ? "\u63D0\u4F9B\u5546:" : "Provider:")} ${ansis.green(providerName)}`);
509
509
  }
510
510
  if (config?.ANTHROPIC_BASE_URL) {
511
511
  console.log(` ${ansis.bold("Base URL:")} ${ansis.gray(config.ANTHROPIC_BASE_URL)}`);
@@ -518,9 +518,9 @@ function displayCurrentStatus(lang = "en") {
518
518
  }
519
519
  async function runConfigWizard(lang = "en") {
520
520
  console.log("");
521
- console.log(ansis.cyan("\u2550".repeat(50)));
521
+ console.log(ansis.green("\u2550".repeat(50)));
522
522
  console.log(ansis.bold.cyan(lang === "zh-CN" ? " API \u914D\u7F6E\u5411\u5BFC" : " API Configuration Wizard"));
523
- console.log(ansis.cyan("\u2550".repeat(50)));
523
+ console.log(ansis.green("\u2550".repeat(50)));
524
524
  console.log("");
525
525
  const modeChoices = [
526
526
  {
@@ -607,7 +607,7 @@ async function runQuickSetup(lang) {
607
607
  return { success: false, mode: "simple", error: "Provider not found" };
608
608
  }
609
609
  console.log("");
610
- console.log(ansis.cyan(`\u{1F4CB} ${lang === "zh-CN" ? preset.nameZh : preset.name}`));
610
+ console.log(ansis.green(`\u{1F4CB} ${lang === "zh-CN" ? preset.nameZh : preset.name}`));
611
611
  if (preset.instructions) {
612
612
  console.log(ansis.gray(` ${lang === "zh-CN" ? preset.instructions.zh : preset.instructions.en}`));
613
613
  }
@@ -639,7 +639,7 @@ async function runQuickSetup(lang) {
639
639
  }
640
640
  async function runOfficialSetup(lang) {
641
641
  console.log("");
642
- console.log(ansis.cyan(lang === "zh-CN" ? "\u{1F4CB} \u5B98\u65B9 Anthropic API" : "\u{1F4CB} Official Anthropic API"));
642
+ console.log(ansis.green(lang === "zh-CN" ? "\u{1F4CB} \u5B98\u65B9 Anthropic API" : "\u{1F4CB} Official Anthropic API"));
643
643
  console.log(ansis.gray(lang === "zh-CN" ? " \u4ECE https://console.anthropic.com/settings/keys \u83B7\u53D6 API \u5BC6\u94A5" : " Get your API key from https://console.anthropic.com/settings/keys"));
644
644
  console.log("");
645
645
  const { apiKey } = await inquirer.prompt({
@@ -666,7 +666,7 @@ async function runOfficialSetup(lang) {
666
666
  }
667
667
  async function runCustomSetup(lang) {
668
668
  console.log("");
669
- console.log(ansis.cyan(lang === "zh-CN" ? "\u{1F4CB} \u81EA\u5B9A\u4E49 API \u914D\u7F6E" : "\u{1F4CB} Custom API Configuration"));
669
+ console.log(ansis.green(lang === "zh-CN" ? "\u{1F4CB} \u81EA\u5B9A\u4E49 API \u914D\u7F6E" : "\u{1F4CB} Custom API Configuration"));
670
670
  console.log("");
671
671
  const { baseUrl } = await inquirer.prompt({
672
672
  type: "input",
@@ -707,7 +707,7 @@ async function runCustomSetup(lang) {
707
707
  }
708
708
  async function runCcrSetup(lang) {
709
709
  console.log("");
710
- console.log(ansis.cyan(lang === "zh-CN" ? "\u{1F4CB} CCR \u9AD8\u7EA7\u8DEF\u7531\u914D\u7F6E" : "\u{1F4CB} CCR Advanced Router Configuration"));
710
+ console.log(ansis.green(lang === "zh-CN" ? "\u{1F4CB} CCR \u9AD8\u7EA7\u8DEF\u7531\u914D\u7F6E" : "\u{1F4CB} CCR Advanced Router Configuration"));
711
711
  console.log(ansis.gray(lang === "zh-CN" ? " CCR \u63D0\u4F9B\u5B8C\u6574\u7684\u6A21\u578B\u8DEF\u7531\u3001\u8F6C\u6362\u548C\u591A\u63D0\u4F9B\u5546\u652F\u6301" : " CCR provides full model routing, transformation, and multi-provider support"));
712
712
  console.log("");
713
713
  try {
@@ -733,7 +733,7 @@ async function testApiConnection(lang = "en") {
733
733
  console.log(ansis.yellow(lang === "zh-CN" ? "\u26A0 \u672A\u914D\u7F6E API" : "\u26A0 No API configured"));
734
734
  return false;
735
735
  }
736
- console.log(ansis.cyan(lang === "zh-CN" ? "\u{1F50D} \u6D4B\u8BD5 API \u8FDE\u63A5..." : "\u{1F50D} Testing API connection..."));
736
+ console.log(ansis.green(lang === "zh-CN" ? "\u{1F50D} \u6D4B\u8BD5 API \u8FDE\u63A5..." : "\u{1F50D} Testing API connection..."));
737
737
  try {
738
738
  const baseUrl = config.ANTHROPIC_BASE_URL || "https://api.anthropic.com";
739
739
  const testUrl = baseUrl.includes("v1") ? baseUrl : `${baseUrl}/v1/models`;