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.
- package/dist/chunks/agent.mjs +1412 -0
- package/dist/chunks/api.mjs +7 -7
- package/dist/chunks/auto-updater.mjs +9 -9
- package/dist/chunks/ccr.mjs +4 -4
- package/dist/chunks/ccu.mjs +1 -1
- package/dist/chunks/claude-code-incremental-manager.mjs +6 -6
- package/dist/chunks/claude-wrapper.mjs +18 -5
- package/dist/chunks/codex.mjs +4 -4
- package/dist/chunks/commands2.mjs +5 -5
- package/dist/chunks/commit.mjs +2 -2
- package/dist/chunks/config-consolidator.mjs +2 -2
- package/dist/chunks/config-switch.mjs +6 -6
- package/dist/chunks/config.mjs +1 -1
- package/dist/chunks/config2.mjs +14 -14
- package/dist/chunks/doctor.mjs +3 -3
- package/dist/chunks/features.mjs +12 -12
- package/dist/chunks/help.mjs +35 -35
- package/dist/chunks/index.mjs +12 -11
- package/dist/chunks/init.mjs +21 -21
- package/dist/chunks/interview.mjs +33 -33
- package/dist/chunks/marketplace.mjs +8 -8
- package/dist/chunks/mcp.mjs +8 -8
- package/dist/chunks/menu.mjs +302 -293
- package/dist/chunks/notification.mjs +5 -5
- package/dist/chunks/onboarding.mjs +17 -346
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/permission-manager.mjs +3 -3
- package/dist/chunks/plugin.mjs +1937 -0
- package/dist/chunks/prompts.mjs +3 -3
- package/dist/chunks/providers.mjs +13 -13
- package/dist/chunks/session.mjs +17 -17
- package/dist/chunks/skill.mjs +304 -0
- package/dist/chunks/skills-sync.mjs +4 -4
- package/dist/chunks/skills.mjs +2 -2
- package/dist/chunks/team.mjs +1 -1
- package/dist/chunks/uninstall.mjs +8 -8
- package/dist/chunks/update.mjs +4 -4
- package/dist/chunks/upgrade-manager.mjs +3 -3
- package/dist/chunks/version-checker.mjs +6 -6
- package/dist/chunks/workflows.mjs +2 -2
- package/dist/cli.mjs +57 -4
- package/dist/index.d.mts +157 -14
- package/dist/index.d.ts +157 -14
- package/dist/index.mjs +6 -5
- package/dist/shared/ccjk.B2Aos9HI.mjs +333 -0
- package/dist/shared/{ccjk.rLRHmcqD.mjs → ccjk.BQzWKmC3.mjs} +3 -3
- package/dist/shared/{ccjk.uVUeWAt8.mjs → ccjk.BZT_f2go.mjs} +7 -7
- package/dist/shared/{ccjk.-FoZ3zat.mjs → ccjk.BlPCiSHj.mjs} +10 -10
- package/dist/shared/ccjk.DH6cOJsf.mjs +1674 -0
- package/dist/shared/{ccjk.tB4-Y4Qb.mjs → ccjk.DrMygfCF.mjs} +1 -1
- package/dist/shared/ccjk.tJ08-yZt.mjs +179 -0
- package/package.json +1 -1
- 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 {
|
|
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 {
|
|
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
|
|
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.
|
|
46
|
-
import './shared/ccjk.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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`;
|