ccjk 13.5.2 → 13.5.3

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.
@@ -24,7 +24,7 @@ import 'node:os';
24
24
  import 'node:crypto';
25
25
  import 'buffer';
26
26
  import 'string_decoder';
27
- import '../shared/ccjk.0aJQmVxS.mjs';
27
+ import '../shared/ccjk.miT0g_vA.mjs';
28
28
  import 'node:child_process';
29
29
  import './constants.mjs';
30
30
  import './ccjk-config.mjs';
@@ -81,7 +81,7 @@ import './uninstall.mjs';
81
81
  import '../shared/ccjk.CvChMYvB.mjs';
82
82
  import 'globby';
83
83
  import './update.mjs';
84
- import '../shared/ccjk.LTONy3IS.mjs';
84
+ import '../shared/ccjk.BOfPON0N.mjs';
85
85
 
86
86
  async function ccr(options = {}) {
87
87
  try {
@@ -49,7 +49,7 @@ import '../shared/ccjk.DScm_NnL.mjs';
49
49
  import '../shared/ccjk.BFQ7yr5S.mjs';
50
50
  import './prompts.mjs';
51
51
  import '../shared/ccjk.gDEDGD_t.mjs';
52
- import '../shared/ccjk.0aJQmVxS.mjs';
52
+ import '../shared/ccjk.miT0g_vA.mjs';
53
53
 
54
54
  class ToolUpdateScheduler {
55
55
  /**
@@ -45,7 +45,7 @@ import './platform.mjs';
45
45
  import '../shared/ccjk.DScm_NnL.mjs';
46
46
  import './prompts.mjs';
47
47
  import '../shared/ccjk.gDEDGD_t.mjs';
48
- import '../shared/ccjk.0aJQmVxS.mjs';
48
+ import '../shared/ccjk.miT0g_vA.mjs';
49
49
 
50
50
  async function configureIncrementalManagement() {
51
51
  ensureI18nInitialized();
@@ -44,7 +44,7 @@ import '../shared/ccjk.BFQ7yr5S.mjs';
44
44
  import './prompts.mjs';
45
45
  import '../shared/ccjk.gDEDGD_t.mjs';
46
46
  import '../shared/ccjk.BWFpnOr3.mjs';
47
- import '../shared/ccjk.0aJQmVxS.mjs';
47
+ import '../shared/ccjk.miT0g_vA.mjs';
48
48
 
49
49
  async function addProviderToExisting(provider, apiKey, allowOverwrite = false) {
50
50
  ensureI18nInitialized();
@@ -7,7 +7,7 @@ import ora from './index7.mjs';
7
7
  import { a as semver } from '../shared/ccjk.CxpGa6MC.mjs';
8
8
  import { p as parse } from '../shared/ccjk.BBtCGd_g.mjs';
9
9
  import { x as K } from './main.mjs';
10
- import { CODEX_AUTH_FILE, SUPPORTED_LANGS, CODEX_CONFIG_FILE, CODEX_DIR, CODEX_AGENTS_FILE, CODEX_PROMPTS_DIR, AI_OUTPUT_LANGUAGES, ZCF_CONFIG_FILE } from './constants.mjs';
10
+ import { CODEX_CONFIG_FILE, CODEX_AUTH_FILE, CODEX_DIR, SUPPORTED_LANGS, CODEX_AGENTS_FILE, CODEX_PROMPTS_DIR, ZCF_CONFIG_FILE, AI_OUTPUT_LANGUAGES } from './constants.mjs';
11
11
  import { ensureI18nInitialized, i18n, format } from './index5.mjs';
12
12
  import { updateZcfConfig, readZcfConfig, readDefaultTomlConfig, updateTomlConfig } from './ccjk-config.mjs';
13
13
  import { e as applyAiLanguageDirective } from './config2.mjs';
@@ -17,7 +17,7 @@ import { i as isWindows, m as getMcpCommand, l as getSystemRoot, w as wrapComman
17
17
  import { a as addNumbersToChoices } from '../shared/ccjk.BFQ7yr5S.mjs';
18
18
  import { resolveAiOutputLanguage } from './prompts.mjs';
19
19
  import { p as promptBoolean } from '../shared/ccjk.BWFpnOr3.mjs';
20
- import { M as MCP_SERVICE_CONFIGS, s as selectMcpServices, g as getMcpServices } from '../shared/ccjk.0aJQmVxS.mjs';
20
+ import { M as MCP_SERVICE_CONFIGS, s as selectMcpServices, g as getMcpServices } from '../shared/ccjk.miT0g_vA.mjs';
21
21
  import { j as join, d as dirname } from '../shared/ccjk.bQ7Dh1g4.mjs';
22
22
 
23
23
  function detectConfigManagementMode() {
@@ -56,7 +56,7 @@ const COMPLETION_COMMANDS = [
56
56
  subcommands: [
57
57
  { name: "status", description: "Quick MCP status overview" },
58
58
  { name: "doctor", description: "Health check and diagnostics" },
59
- { name: "profile", description: "Switch profile (minimal/dev/full)" },
59
+ { name: "profile", description: "Switch profile (minimal/development/full)" },
60
60
  { name: "release", description: "Release idle services" },
61
61
  { name: "market", description: "MCP service marketplace" },
62
62
  { name: "list", description: "List installed services" },
@@ -46,7 +46,7 @@ import '../shared/ccjk.CxpGa6MC.mjs';
46
46
  import './prompts.mjs';
47
47
  import '../shared/ccjk.gDEDGD_t.mjs';
48
48
  import '../shared/ccjk.BWFpnOr3.mjs';
49
- import '../shared/ccjk.0aJQmVxS.mjs';
49
+ import '../shared/ccjk.miT0g_vA.mjs';
50
50
 
51
51
  async function configSwitchCommand(options) {
52
52
  try {
@@ -3,7 +3,7 @@ import { homedir } from 'node:os';
3
3
  import process__default from 'node:process';
4
4
  import a from './index2.mjs';
5
5
  import { i as inquirer } from './index3.mjs';
6
- import { s as selectMcpServices, g as getMcpServices } from '../shared/ccjk.0aJQmVxS.mjs';
6
+ import { s as selectMcpServices, g as getMcpServices } from '../shared/ccjk.miT0g_vA.mjs';
7
7
  import { SUPPORTED_LANGS, LANG_LABELS } from './constants.mjs';
8
8
  import { ensureI18nInitialized, i18n, changeLanguage } from './index5.mjs';
9
9
  import { updateZcfConfig, readZcfConfig } from './ccjk-config.mjs';
@@ -600,7 +600,7 @@ async function mcpManagerFeature() {
600
600
  value: "list"
601
601
  },
602
602
  {
603
- name: isZh ? `\u{1F504} \u5207\u6362\u914D\u7F6E\u9884\u8BBE ${a.gray("- minimal\uFF08\u8F7B\u91CF\uFF09/ dev\uFF08\u5F00\u53D1\uFF09/ full\uFF08\u5B8C\u6574\uFF09")}` : `\u{1F504} Switch profile ${a.gray("- minimal / dev / full preset")}`,
603
+ name: isZh ? `\u{1F504} \u5207\u6362\u914D\u7F6E\u9884\u8BBE ${a.gray("- minimal\uFF08\u8F7B\u91CF\uFF09/ development\uFF08\u5F00\u53D1\uFF09/ full\uFF08\u5B8C\u6574\uFF09")}` : `\u{1F504} Switch profile ${a.gray("- minimal / development / full preset")}`,
604
604
  value: "profile"
605
605
  },
606
606
  {
@@ -636,18 +636,19 @@ async function mcpManagerFeature() {
636
636
  }
637
637
  case "profile": {
638
638
  const { listProfiles, useProfile } = await import('./mcp.mjs');
639
- await listProfiles();
639
+ const targetTool = readZcfConfig()?.codeToolType === "codex" ? "codex" : "claude-code";
640
+ await listProfiles({ tool: targetTool });
640
641
  const { profileId } = await inquirer.prompt({
641
642
  type: "list",
642
643
  name: "profileId",
643
644
  message: isZh ? "\u9009\u62E9\u8981\u5207\u6362\u7684\u9884\u8BBE:" : "Select profile to switch:",
644
645
  choices: [
645
646
  { name: isZh ? "minimal \u2014 \u4EC5\u6838\u5FC3\u670D\u52A1\uFF08\u6700\u4F4E\u8D44\u6E90\u5360\u7528\uFF09" : "minimal \u2014 Core services only (least resources)", value: "minimal" },
646
- { name: isZh ? "dev \u2014 \u5F00\u53D1\u5E38\u7528\u670D\u52A1\u5957\u88C5" : "dev \u2014 Dev-oriented service bundle", value: "dev" },
647
+ { name: isZh ? "development \u2014 \u5F00\u53D1\u5E38\u7528\u670D\u52A1\u5957\u88C5" : "development \u2014 Dev-oriented service bundle", value: "development" },
647
648
  { name: isZh ? "full \u2014 \u5B8C\u6574\u670D\u52A1\uFF08\u9AD8\u6027\u80FD\u673A\u5668\u63A8\u8350\uFF09" : "full \u2014 Full services (high-end machines)", value: "full" }
648
649
  ]
649
650
  });
650
- await useProfile(profileId);
651
+ await useProfile(profileId, { tool: targetTool });
651
652
  break;
652
653
  }
653
654
  case "release": {
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs';
2
2
  import process__default from 'node:process';
3
3
  import a from './index2.mjs';
4
4
  import { i as inquirer } from './index3.mjs';
5
- import { s as selectMcpServices, g as getMcpServices, M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.0aJQmVxS.mjs';
5
+ import { s as selectMcpServices, g as getMcpServices, M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.miT0g_vA.mjs';
6
6
  import { s as selectAndInstallWorkflows, W as WORKFLOW_CONFIG_BASE } from '../shared/ccjk.C3o4BXvM.mjs';
7
7
  import { SETTINGS_FILE, DEFAULT_CODE_TOOL_TYPE, CODE_TOOL_BANNERS, API_DEFAULT_URL } from './constants.mjs';
8
8
  import { ensureI18nInitialized, i18n } from './index5.mjs';
@@ -44,9 +44,9 @@ import 'node:os';
44
44
  import 'node:crypto';
45
45
  import 'buffer';
46
46
  import 'string_decoder';
47
- import '../shared/ccjk.bQ7Dh1g4.mjs';
48
47
  import 'node:fs/promises';
49
48
  import 'node:url';
49
+ import '../shared/ccjk.bQ7Dh1g4.mjs';
50
50
  import '../shared/ccjk.BBtCGd_g.mjs';
51
51
  import './index6.mjs';
52
52
  import '../shared/ccjk.RyizuzOI.mjs';
@@ -1,8 +1,8 @@
1
1
  import a from './index2.mjs';
2
- import { g as getMcpServices } from '../shared/ccjk.0aJQmVxS.mjs';
2
+ import { g as getMcpServices } from '../shared/ccjk.miT0g_vA.mjs';
3
3
  import { i18n } from './index5.mjs';
4
4
  import { r as readMcpConfig } from './claude-config.mjs';
5
- import { i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.LTONy3IS.mjs';
5
+ import { i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.BOfPON0N.mjs';
6
6
  import '../shared/ccjk.BAGoDD49.mjs';
7
7
  import './index3.mjs';
8
8
  import 'node:readline';
@@ -21,9 +21,9 @@ import 'node:crypto';
21
21
  import 'buffer';
22
22
  import 'string_decoder';
23
23
  import 'node:child_process';
24
- import '../shared/ccjk.bQ7Dh1g4.mjs';
25
24
  import 'node:fs';
26
25
  import 'node:url';
26
+ import '../shared/ccjk.bQ7Dh1g4.mjs';
27
27
  import './constants.mjs';
28
28
  import './json-config.mjs';
29
29
  import '../shared/ccjk.RyizuzOI.mjs';
@@ -1,28 +1,28 @@
1
1
  import a from './index2.mjs';
2
+ import { CLOUD_ENDPOINTS, isCodeToolType } from './constants.mjs';
2
3
  import { i18n } from './index5.mjs';
4
+ import { readZcfConfig } from './ccjk-config.mjs';
3
5
  import 'node:child_process';
4
6
  import 'node:process';
5
7
  import { M as MCP_SERVICE_TIERS, i as isCoreService, g as getServicesByTier, c as checkMcpPerformance, f as formatPerformanceWarning, a as calculateResourceUsage, b as getOptimizationSuggestions, d as getMcpTierConfig } from './mcp-performance.mjs';
6
8
  import { r as readMcpConfig, b as backupMcpConfig, w as writeMcpConfig } from './claude-config.mjs';
7
9
  import { i as inquirer } from './index3.mjs';
8
- import { M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.0aJQmVxS.mjs';
9
- import { d as displayInstalledMcpServices, b as isMcpServiceInstalled, i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.LTONy3IS.mjs';
10
+ import { M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.miT0g_vA.mjs';
11
+ import { d as displayInstalledMcpServices, b as isMcpServiceInstalled, i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.BOfPON0N.mjs';
10
12
  import { existsSync, unlinkSync, statSync, mkdirSync, readFileSync } from 'node:fs';
11
13
  import { homedir } from 'node:os';
12
14
  import { writeFileAtomic } from './fs-operations.mjs';
13
- import { CLOUD_ENDPOINTS } from './constants.mjs';
14
15
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
16
+ import { a as readCodexConfig, d as backupCodexComplete, w as writeCodexConfig, g as applyCodexPlatformCommand } from './codex.mjs';
17
+ import { i as isWindows, l as getSystemRoot } from './platform.mjs';
15
18
  import '../shared/ccjk.BAGoDD49.mjs';
16
19
  import 'node:url';
20
+ import '../shared/ccjk.BBtCGd_g.mjs';
21
+ import './index6.mjs';
17
22
  import './json-config.mjs';
18
23
  import '../shared/ccjk.RyizuzOI.mjs';
19
24
  import 'node:crypto';
20
25
  import 'node:fs/promises';
21
- import './platform.mjs';
22
- import './main.mjs';
23
- import 'module';
24
- import 'node:path';
25
- import 'node:stream';
26
26
  import 'node:readline';
27
27
  import 'stream';
28
28
  import 'node:tty';
@@ -32,15 +32,15 @@ import 'node:util';
32
32
  import 'tty';
33
33
  import 'fs';
34
34
  import 'child_process';
35
+ import 'node:path';
35
36
  import 'buffer';
36
37
  import 'string_decoder';
37
- import './codex.mjs';
38
38
  import './index7.mjs';
39
39
  import '../shared/ccjk.DeWpAShp.mjs';
40
40
  import '../shared/ccjk.CxpGa6MC.mjs';
41
- import '../shared/ccjk.BBtCGd_g.mjs';
42
- import './ccjk-config.mjs';
43
- import './index6.mjs';
41
+ import './main.mjs';
42
+ import 'module';
43
+ import 'node:stream';
44
44
  import './config2.mjs';
45
45
  import '../shared/ccjk.DScm_NnL.mjs';
46
46
  import '../shared/ccjk.BFQ7yr5S.mjs';
@@ -1082,6 +1082,97 @@ function getProfileDescription(profile, lang = "en") {
1082
1082
  return lang === "zh-CN" ? profile.descriptionZh : profile.description;
1083
1083
  }
1084
1084
 
1085
+ function resolveProfileTool(options = {}) {
1086
+ if (options.tool === "codex" || options.tool === "claude-code") {
1087
+ return options.tool;
1088
+ }
1089
+ const zcfConfig = readZcfConfig();
1090
+ if (zcfConfig?.codeToolType && isCodeToolType(zcfConfig.codeToolType)) {
1091
+ return zcfConfig.codeToolType === "codex" ? "codex" : "claude-code";
1092
+ }
1093
+ return "claude-code";
1094
+ }
1095
+ function getToolDisplayName(tool, isZh) {
1096
+ if (tool === "codex") {
1097
+ return "Codex";
1098
+ }
1099
+ return isZh ? "Claude Code" : "Claude Code";
1100
+ }
1101
+ function getConfiguredServiceIds(tool) {
1102
+ if (tool === "codex") {
1103
+ const config2 = readCodexConfig();
1104
+ return (config2?.mcpServices || []).map((service) => service.id);
1105
+ }
1106
+ const config = readMcpConfig();
1107
+ return config?.mcpServers ? Object.keys(config.mcpServers) : [];
1108
+ }
1109
+ function buildCodexProfileService(serviceId) {
1110
+ const serviceConfig = MCP_SERVICE_CONFIGS.find((service) => service.id.toLowerCase() === serviceId.toLowerCase());
1111
+ if (!serviceConfig) {
1112
+ return null;
1113
+ }
1114
+ let command = serviceConfig.config.command || serviceId;
1115
+ let args = (serviceConfig.config.args || []).map((arg) => String(arg));
1116
+ if (serviceId === "serena") {
1117
+ const idx = args.indexOf("--context");
1118
+ if (idx >= 0 && idx + 1 < args.length) {
1119
+ args[idx + 1] = "codex";
1120
+ } else {
1121
+ args.push("--context", "codex");
1122
+ }
1123
+ }
1124
+ const normalizedService = {
1125
+ id: serviceId.toLowerCase(),
1126
+ command,
1127
+ args
1128
+ };
1129
+ applyCodexPlatformCommand(normalizedService);
1130
+ const env = { ...serviceConfig.config.env || {} };
1131
+ if (isWindows()) {
1132
+ const systemRoot = getSystemRoot();
1133
+ if (systemRoot) {
1134
+ env.SYSTEMROOT = systemRoot;
1135
+ }
1136
+ }
1137
+ return {
1138
+ id: normalizedService.id,
1139
+ command: normalizedService.command,
1140
+ args: normalizedService.args || [],
1141
+ env: Object.keys(env).length > 0 ? env : void 0,
1142
+ startup_timeout_sec: 30
1143
+ };
1144
+ }
1145
+ function backupProfileConfig(tool) {
1146
+ return tool === "codex" ? backupCodexComplete() : backupMcpConfig();
1147
+ }
1148
+ function writeProfileForTool(tool, servicesToEnable) {
1149
+ if (tool === "codex") {
1150
+ const existingConfig2 = readCodexConfig();
1151
+ const mcpServices = servicesToEnable.map(buildCodexProfileService).filter((service) => service !== null);
1152
+ const newConfig = {
1153
+ model: existingConfig2?.model || null,
1154
+ modelProvider: existingConfig2?.modelProvider || null,
1155
+ providers: existingConfig2?.providers || [],
1156
+ mcpServices,
1157
+ otherConfig: existingConfig2?.otherConfig || [],
1158
+ modelProviderCommented: existingConfig2?.modelProviderCommented
1159
+ };
1160
+ writeCodexConfig(newConfig);
1161
+ return;
1162
+ }
1163
+ const newServers = {};
1164
+ for (const serviceId of servicesToEnable) {
1165
+ const serviceConfig = MCP_SERVICE_CONFIGS.find((s) => s.id.toLowerCase() === serviceId.toLowerCase());
1166
+ if (serviceConfig) {
1167
+ newServers[serviceId] = serviceConfig.config;
1168
+ }
1169
+ }
1170
+ const existingConfig = readMcpConfig() || {};
1171
+ writeMcpConfig({
1172
+ ...existingConfig,
1173
+ mcpServers: newServers
1174
+ });
1175
+ }
1085
1176
  async function listProfiles(options = {}) {
1086
1177
  const lang = options.lang || i18n.language || "en";
1087
1178
  const isZh = lang === "zh-CN";
@@ -1106,16 +1197,54 @@ async function listProfiles(options = {}) {
1106
1197
  console.log(a.dim(isZh ? "\u4F7F\u7528 `ccjk mcp profile use <id>` \u5207\u6362\u914D\u7F6E" : "Use `ccjk mcp profile use <id>` to switch profile"));
1107
1198
  console.log("");
1108
1199
  }
1200
+ async function showCurrentProfile(options = {}) {
1201
+ const lang = options.lang || i18n.language || "en";
1202
+ const isZh = lang === "zh-CN";
1203
+ const tool = resolveProfileTool(options);
1204
+ const toolName = getToolDisplayName(tool, isZh);
1205
+ const currentServices = getConfiguredServiceIds(tool);
1206
+ const normalizedServices = currentServices.map((service) => service.toLowerCase());
1207
+ console.log("");
1208
+ console.log(a.bold.cyan(isZh ? `\u{1F4CA} \u5F53\u524D ${toolName} MCP \u914D\u7F6E\u72B6\u6001` : `\u{1F4CA} Current ${toolName} MCP Configuration`));
1209
+ console.log(a.dim("\u2500".repeat(50)));
1210
+ console.log("");
1211
+ console.log(`${a.bold(isZh ? "\u5DF2\u914D\u7F6E\u670D\u52A1" : "Configured Services")}: ${currentServices.length}`);
1212
+ if (currentServices.length > 0) {
1213
+ console.log(a.dim(` ${currentServices.join(", ")}`));
1214
+ }
1215
+ const warning = checkMcpPerformance(currentServices.length);
1216
+ if (warning) {
1217
+ console.log("");
1218
+ console.log(formatPerformanceWarning(warning, lang));
1219
+ }
1220
+ const matchedProfile = MCP_PROFILES.find((profile) => {
1221
+ if (profile.services.length === 0)
1222
+ return false;
1223
+ if (profile.services.length !== currentServices.length)
1224
+ return false;
1225
+ return profile.services.every((s) => normalizedServices.includes(s.toLowerCase()));
1226
+ });
1227
+ if (matchedProfile) {
1228
+ console.log("");
1229
+ console.log(`${a.bold(isZh ? "\u5339\u914D\u9884\u8BBE" : "Matched Profile")}: ${a.green(matchedProfile.id)}`);
1230
+ } else {
1231
+ console.log("");
1232
+ console.log(a.dim(isZh ? "\u5F53\u524D\u914D\u7F6E\u4E0D\u5339\u914D\u4EFB\u4F55\u9884\u8BBE" : "Current config does not match any profile"));
1233
+ }
1234
+ console.log("");
1235
+ }
1109
1236
  async function useProfile(profileId, options = {}) {
1110
1237
  const lang = options.lang || i18n.language || "en";
1111
1238
  const isZh = lang === "zh-CN";
1239
+ const tool = resolveProfileTool(options);
1240
+ const toolName = getToolDisplayName(tool, isZh);
1112
1241
  const profile = getProfileById(profileId);
1113
1242
  if (!profile) {
1114
1243
  console.log(a.red(isZh ? `\u274C \u672A\u627E\u5230\u914D\u7F6E\u9884\u8BBE: ${profileId}` : `\u274C Profile not found: ${profileId}`));
1115
1244
  console.log(a.dim(isZh ? `\u53EF\u7528\u9884\u8BBE: ${getProfileIds().join(", ")}` : `Available profiles: ${getProfileIds().join(", ")}`));
1116
1245
  return;
1117
1246
  }
1118
- const backupPath = backupMcpConfig();
1247
+ const backupPath = backupProfileConfig(tool);
1119
1248
  if (backupPath) {
1120
1249
  console.log(a.gray(`\u2714 ${isZh ? "\u5DF2\u5907\u4EFD\u5F53\u524D\u914D\u7F6E" : "Backed up current config"}: ${backupPath}`));
1121
1250
  }
@@ -1125,21 +1254,9 @@ async function useProfile(profileId, options = {}) {
1125
1254
  } else {
1126
1255
  servicesToEnable = profile.services;
1127
1256
  }
1128
- const newServers = {};
1129
- for (const serviceId of servicesToEnable) {
1130
- const serviceConfig = MCP_SERVICE_CONFIGS.find((s) => s.id === serviceId);
1131
- if (serviceConfig) {
1132
- newServers[serviceId] = serviceConfig.config;
1133
- }
1134
- }
1135
- const existingConfig = readMcpConfig() || {};
1136
- const newConfig = {
1137
- ...existingConfig,
1138
- mcpServers: newServers
1139
- };
1140
- writeMcpConfig(newConfig);
1257
+ writeProfileForTool(tool, servicesToEnable);
1141
1258
  const profileName = getProfileName(profile, lang);
1142
- console.log(a.green(`\u2714 ${isZh ? "\u5DF2\u5207\u6362\u5230\u914D\u7F6E\u9884\u8BBE" : "Switched to profile"}: ${profileName}`));
1259
+ console.log(a.green(`\u2714 ${isZh ? "\u5DF2\u4E3A" : "Switched"} ${toolName}${isZh ? " \u5207\u6362\u5230\u914D\u7F6E\u9884\u8BBE" : " profile"}: ${profileName}`));
1143
1260
  console.log(a.dim(` ${isZh ? "\u5DF2\u542F\u7528\u670D\u52A1" : "Enabled services"}: ${servicesToEnable.length}`));
1144
1261
  const warning = checkMcpPerformance(servicesToEnable.length);
1145
1262
  if (warning) {
@@ -1147,25 +1264,46 @@ async function useProfile(profileId, options = {}) {
1147
1264
  console.log(formatPerformanceWarning(warning, lang));
1148
1265
  }
1149
1266
  console.log("");
1150
- console.log(a.yellow(isZh ? "\u26A0\uFE0F \u8BF7\u91CD\u542F Claude Code \u4EE5\u4F7F\u66F4\u6539\u751F\u6548" : "\u26A0\uFE0F Please restart Claude Code for changes to take effect"));
1267
+ console.log(a.yellow(isZh ? `\u26A0\uFE0F \u8BF7\u91CD\u542F ${toolName} \u4EE5\u4F7F\u66F4\u6539\u751F\u6548` : `\u26A0\uFE0F Please restart ${toolName} for changes to take effect`));
1151
1268
  }
1152
1269
 
1270
+ function resolveMcpTool(options = {}) {
1271
+ if (options.tool === "codex" || options.tool === "claude-code") {
1272
+ return options.tool;
1273
+ }
1274
+ const zcfConfig = readZcfConfig();
1275
+ if (zcfConfig?.codeToolType && isCodeToolType(zcfConfig.codeToolType)) {
1276
+ return zcfConfig.codeToolType === "codex" ? "codex" : "claude-code";
1277
+ }
1278
+ return "claude-code";
1279
+ }
1280
+ function getServiceTier(serviceId, tiers) {
1281
+ const directMatch = tiers[serviceId];
1282
+ if (directMatch) {
1283
+ return directMatch;
1284
+ }
1285
+ const caseInsensitiveMatch = Object.entries(tiers).find(
1286
+ ([id]) => id.toLowerCase() === serviceId.toLowerCase()
1287
+ );
1288
+ return caseInsensitiveMatch?.[1] || "ondemand";
1289
+ }
1153
1290
  async function mcpStatus(options = {}) {
1154
1291
  const { readMcpConfig } = await import('./claude-config.mjs').then(function (n) { return n.h; });
1292
+ const { readCodexConfig } = await import('./codex.mjs').then(function (n) { return n.i; });
1155
1293
  const { checkMcpPerformance, formatPerformanceWarning } = await import('./mcp-performance.mjs').then(function (n) { return n.e; });
1156
1294
  const { MCP_SERVICE_TIERS } = await import('./mcp-performance.mjs').then(function (n) { return n.m; });
1157
1295
  const lang = options.lang || i18n.language || "en";
1158
1296
  const isZh = lang === "zh-CN";
1297
+ const targetTool = resolveMcpTool(options);
1298
+ const services = targetTool === "codex" ? (readCodexConfig()?.mcpServices || []).map((service) => service.id) : Object.keys((await readMcpConfig())?.mcpServers || {});
1159
1299
  console.log("");
1160
- console.log(a.bold.cyan(isZh ? "\u26A1 MCP \u5FEB\u901F\u72B6\u6001" : "\u26A1 MCP Quick Status"));
1300
+ console.log(a.bold.cyan(isZh ? `\u26A1 ${targetTool === "codex" ? "Codex" : "Claude Code"} MCP \u5FEB\u901F\u72B6\u6001` : `\u26A1 ${targetTool === "codex" ? "Codex" : "Claude Code"} MCP Quick Status`));
1161
1301
  console.log(a.dim("\u2500".repeat(40)));
1162
- const config = await readMcpConfig();
1163
- const services = Object.keys(config?.mcpServers || {});
1164
1302
  let coreCount = 0;
1165
1303
  let ondemandCount = 0;
1166
1304
  let scenarioCount = 0;
1167
1305
  for (const svc of services) {
1168
- const tier = MCP_SERVICE_TIERS[svc] || "ondemand";
1306
+ const tier = getServiceTier(svc, MCP_SERVICE_TIERS);
1169
1307
  if (tier === "core")
1170
1308
  coreCount++;
1171
1309
  else if (tier === "ondemand")
@@ -1186,7 +1324,7 @@ async function mcpStatus(options = {}) {
1186
1324
  console.log(a.green(isZh ? "\u2713 \u6027\u80FD\u72B6\u6001\u826F\u597D" : "\u2713 Performance OK"));
1187
1325
  }
1188
1326
  console.log("");
1189
- console.log(a.dim(isZh ? "\u63D0\u793A: \u4F7F\u7528 ccjk mcp doctor \u67E5\u770B\u8BE6\u7EC6\u8BCA\u65AD" : "Tip: Use ccjk mcp doctor for detailed diagnostics"));
1327
+ console.log(a.dim(isZh ? `\u63D0\u793A: \u4F7F\u7528 ccjk mcp doctor${targetTool === "codex" ? " -T codex" : ""} \u67E5\u770B\u8BE6\u7EC6\u8BCA\u65AD` : `Tip: Use ccjk mcp doctor${targetTool === "codex" ? " -T codex" : ""} for detailed diagnostics`));
1190
1328
  }
1191
1329
  function mcpHelp(options = {}) {
1192
1330
  const lang = options.lang || i18n.language || "en";
@@ -1206,7 +1344,11 @@ function mcpHelp(options = {}) {
1206
1344
  },
1207
1345
  {
1208
1346
  cmd: "ccjk mcp profile [name]",
1209
- desc: isZh ? "\u5207\u6362\u914D\u7F6E\u9884\u8BBE (minimal/dev/full)" : "Switch profile (minimal/dev/full)"
1347
+ desc: isZh ? "\u5207\u6362\u914D\u7F6E\u9884\u8BBE (minimal/development/full)" : "Switch profile (minimal/development/full)"
1348
+ },
1349
+ {
1350
+ cmd: "ccjk mcp profile use minimal -T codex",
1351
+ desc: isZh ? "\u5207\u6362 Codex \u542F\u52A8\u65F6\u52A0\u8F7D\u7684 MCP \u7EC4\u5408" : "Switch the MCP set loaded on Codex startup"
1210
1352
  },
1211
1353
  {
1212
1354
  cmd: "ccjk mcp release",
@@ -1230,4 +1372,4 @@ function mcpHelp(options = {}) {
1230
1372
  console.log(a.dim(isZh ? "\u{1F4A1} \u63A8\u8350: \u4F7F\u7528 minimal \u9884\u8BBE\u53EF\u663E\u8457\u63D0\u5347\u6027\u80FD" : "\u{1F4A1} Tip: Use minimal profile for best performance"));
1231
1373
  }
1232
1374
 
1233
- export { listProfiles, mcpDoctor, mcpHelp, mcpInstall, mcpList, mcpRelease, mcpSearch, mcpStatus, mcpUninstall, useProfile };
1375
+ export { listProfiles, mcpDoctor, mcpHelp, mcpInstall, mcpList, mcpRelease, mcpSearch, mcpStatus, mcpUninstall, showCurrentProfile, useProfile };
@@ -21,7 +21,7 @@ import 'string_decoder';
21
21
  import 'node:fs';
22
22
  import 'node:url';
23
23
  import '../shared/ccjk.bQ7Dh1g4.mjs';
24
- import '../shared/ccjk.0aJQmVxS.mjs';
24
+ import '../shared/ccjk.miT0g_vA.mjs';
25
25
  import 'node:child_process';
26
26
  import './constants.mjs';
27
27
  import './banner.mjs';
@@ -81,7 +81,7 @@ import './uninstall.mjs';
81
81
  import '../shared/ccjk.CvChMYvB.mjs';
82
82
  import 'globby';
83
83
  import './update.mjs';
84
- import '../shared/ccjk.LTONy3IS.mjs';
84
+ import '../shared/ccjk.BOfPON0N.mjs';
85
85
 
86
86
  function renderMenuHeader(context, _isZh) {
87
87
  const title = context.breadcrumb.join(i18n.t("menu:menu.breadcrumb.separator"));
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs';
2
2
  import process__default from 'node:process';
3
3
  import a from './index2.mjs';
4
4
  import { i as inquirer } from './index3.mjs';
5
- import { M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.0aJQmVxS.mjs';
5
+ import { M as MCP_SERVICE_CONFIGS } from '../shared/ccjk.miT0g_vA.mjs';
6
6
  import { CODE_TOOL_BANNERS, CLAUDE_DIR, isCodeToolType, DEFAULT_CODE_TOOL_TYPE } from './constants.mjs';
7
7
  import { ensureI18nInitialized, i18n } from './index5.mjs';
8
8
  import { displayBannerWithInfo } from './banner.mjs';
@@ -1,3 +1,3 @@
1
- const version = "13.5.2";
1
+ const version = "13.5.3";
2
2
 
3
3
  export { version };
@@ -37,7 +37,7 @@ import '../shared/ccjk.DJuyfrlL.mjs';
37
37
  import 'node:url';
38
38
  import '../shared/ccjk.BBtCGd_g.mjs';
39
39
  import './index6.mjs';
40
- import '../shared/ccjk.0aJQmVxS.mjs';
40
+ import '../shared/ccjk.miT0g_vA.mjs';
41
41
  import '../shared/ccjk.C3o4BXvM.mjs';
42
42
  import './banner.mjs';
43
43
  import './config.mjs';
@@ -285,26 +285,7 @@ class SmartDefaultsDetector {
285
285
  * Get recommended MCP services based on environment + project context
286
286
  */
287
287
  getRecommendedMcpServices(platform, project) {
288
- const runtime = project?.runtime;
289
- if (runtime?.isCI) {
290
- return ["context7", "mcp-deepwiki"];
291
- }
292
- if (runtime?.isContainer) {
293
- return ["context7", "mcp-deepwiki"];
294
- }
295
- const core = ["context7", "mcp-deepwiki", "open-websearch"];
296
- const extras = [];
297
- const hasBrowser = runtime?.hasBrowser ?? (platform === "darwin" || platform === "win32");
298
- if (hasBrowser) {
299
- extras.push("Playwright");
300
- }
301
- extras.push("sqlite");
302
- if (project && ["typescript", "java", "csharp"].includes(project.language)) {
303
- if (!runtime?.isHeadless) {
304
- extras.push("serena");
305
- }
306
- }
307
- return [...core, ...extras];
288
+ return ["context7"];
308
289
  }
309
290
  /**
310
291
  * Get recommended hook template IDs based on project toolchain
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import a from './index2.mjs';
3
3
  import { i as inquirer } from './index3.mjs';
4
- import { M as MCP_SERVICE_CONFIGS, g as getMcpServices } from '../shared/ccjk.0aJQmVxS.mjs';
4
+ import { M as MCP_SERVICE_CONFIGS, g as getMcpServices } from '../shared/ccjk.miT0g_vA.mjs';
5
5
  import { SETTINGS_FILE, DEFAULT_CODE_TOOL_TYPE, resolveCodeToolType as resolveCodeToolType$1, isCodeToolType } from './constants.mjs';
6
6
  import { i18n } from './index5.mjs';
7
7
  import { displayBanner } from './banner.mjs';
@@ -12,7 +12,7 @@ import { c as copyConfigFiles } from './config2.mjs';
12
12
  import { n as needsMigration, m as migrateSettingsForTokenRetrieval, d as displayMigrationResult, p as promptMigration } from '../shared/ccjk.byom1b8z.mjs';
13
13
  import { u as updatePromptOnly } from '../shared/ccjk.Dgq22o6V.mjs';
14
14
  import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.BIxuVL3_.mjs';
15
- import { a as installMcpServices } from '../shared/ccjk.LTONy3IS.mjs';
15
+ import { a as installMcpServices } from '../shared/ccjk.BOfPON0N.mjs';
16
16
  import { resolveAiOutputLanguage } from './prompts.mjs';
17
17
  import { g as getRuntimeVersion } from '../shared/ccjk.gDEDGD_t.mjs';
18
18
  import { checkClaudeCodeVersionAndPrompt } from './version-checker.mjs';
package/dist/cli.mjs CHANGED
@@ -135,6 +135,7 @@ const COMMANDS = [
135
135
  description: "MCP Server management",
136
136
  tier: "extended",
137
137
  options: [
138
+ { flags: "--tool, -T <type>", description: "Target tool (claude-code, codex)" },
138
139
  { flags: "--verbose, -v", description: "Verbose output" },
139
140
  { flags: "--dry-run, -d", description: "Preview changes" },
140
141
  { flags: "--yes, -y", description: "Skip confirmation prompts" },
@@ -152,9 +153,13 @@ const COMMANDS = [
152
153
  const { mcpDoctor } = await import('./chunks/mcp.mjs');
153
154
  await mcpDoctor(options);
154
155
  } else if (actionStr === "profile") {
155
- const { listProfiles, useProfile } = await import('./chunks/mcp.mjs');
156
- if (!argsArr[0] || argsArr[0] === "list") {
156
+ const { listProfiles, showCurrentProfile, useProfile } = await import('./chunks/mcp.mjs');
157
+ if (!argsArr[0] || argsArr[0] === "list" || argsArr[0] === "ls") {
157
158
  await listProfiles(options);
159
+ } else if (argsArr[0] === "current" || argsArr[0] === "status") {
160
+ await showCurrentProfile(options);
161
+ } else if (argsArr[0] === "use" || argsArr[0] === "switch") {
162
+ await useProfile(argsArr[1] || "", options);
158
163
  } else {
159
164
  await useProfile(argsArr[0], options);
160
165
  }
@@ -1,6 +1,6 @@
1
1
  import a from '../chunks/index2.mjs';
2
2
  import { i as inquirer } from '../chunks/index3.mjs';
3
- import { a as getMcpService, d as dynamicMcpRegistry, M as MCP_SERVICE_CONFIGS } from './ccjk.0aJQmVxS.mjs';
3
+ import { a as getMcpService, d as dynamicMcpRegistry, M as MCP_SERVICE_CONFIGS } from './ccjk.miT0g_vA.mjs';
4
4
  import { SETTINGS_FILE, CLAUDE_DIR, ClAUDE_CONFIG_FILE, CODEX_CONFIG_FILE } from '../chunks/constants.mjs';
5
5
  import { exists, ensureDir } from '../chunks/fs-operations.mjs';
6
6
  import { readJsonConfig, writeJsonConfig } from '../chunks/json-config.mjs';
@@ -1,187 +1,30 @@
1
1
  import a from '../chunks/index2.mjs';
2
2
  import { i as inquirer } from '../chunks/index3.mjs';
3
3
  import 'node:child_process';
4
- import { homedir } from 'node:os';
5
4
  import process__default from 'node:process';
6
5
  import { ensureI18nInitialized, i18n } from '../chunks/index5.mjs';
7
- import { j as join } from './ccjk.bQ7Dh1g4.mjs';
8
6
 
9
- const PLAYWRIGHT_PROFILES_DIR = join(homedir(), ".ccjk", "playwright");
10
- function createPlaywrightMcpConfig(options = {}) {
11
- const {
12
- profile = "default",
13
- headless = false,
14
- browser = "chromium",
15
- userDataDir
16
- } = options;
17
- const resolvedUserDataDir = userDataDir || join(PLAYWRIGHT_PROFILES_DIR, profile);
18
- const args = ["-y", "@playwright/mcp@latest"];
19
- args.push("--browser", browser);
20
- args.push("--user-data-dir", resolvedUserDataDir);
21
- if (headless) {
22
- args.push("--headless");
23
- }
24
- return {
25
- type: "stdio",
26
- command: "npx",
27
- args,
28
- env: {}
29
- };
30
- }
31
7
  const MCP_SERVICE_CONFIGS = [
32
- // Documentation and Search Services - Universal (no GUI required)
8
+ // Documentation service - the only MCP we currently keep enabled in-product
33
9
  {
34
10
  id: "context7",
35
11
  requiresApiKey: false,
36
- config: {
37
- type: "stdio",
38
- command: "npx",
39
- args: ["-y", "@upstash/context7-mcp@latest"],
40
- env: {}
41
- }
42
- // Works on all platforms - no special requirements
43
- },
44
- {
45
- id: "open-websearch",
46
- requiresApiKey: false,
47
- config: {
48
- type: "stdio",
49
- command: "npx",
50
- args: ["-y", "open-websearch@latest"],
51
- env: {
52
- MODE: "stdio",
53
- DEFAULT_SEARCH_ENGINE: "duckduckgo",
54
- ALLOWED_SEARCH_ENGINES: "duckduckgo,bing,brave"
55
- }
56
- }
57
- // Works on all platforms - no special requirements
58
- },
59
- {
60
- id: "mcp-deepwiki",
61
- requiresApiKey: false,
62
- config: {
63
- type: "stdio",
64
- command: "npx",
65
- args: ["-y", "mcp-deepwiki@latest"],
66
- env: {}
67
- }
68
- // Works on all platforms - no special requirements
69
- },
70
- // Development Workflow Services
71
- {
72
- id: "spec-workflow",
73
- requiresApiKey: false,
74
- config: {
75
- type: "stdio",
76
- command: "npx",
77
- args: ["-y", "@pimzino/spec-workflow-mcp@latest"],
78
- env: {}
79
- }
80
- // Works on all platforms - no special requirements
81
- },
82
- {
83
- id: "serena",
84
- requiresApiKey: false,
85
- config: {
86
- type: "stdio",
87
- command: "uvx",
88
- args: ["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "ide-assistant", "--enable-web-dashboard", "false"],
89
- env: {}
90
- },
91
- platformRequirements: {
92
- requiredCommands: ["uvx"]
93
- // Requires uv/uvx to be installed
94
- }
95
- },
96
- // Browser and Automation Services - Require GUI environment
97
- {
98
- id: "Playwright",
99
- requiresApiKey: false,
100
- config: createPlaywrightMcpConfig(),
101
- // Uses default profile with chromium browser
102
- platformRequirements: {
103
- platforms: ["macos", "windows"],
104
- // GUI required - exclude headless Linux/WSL/Termux
105
- requiresGui: true
106
- }
107
- },
108
- // Cross-session Memory Services
109
- {
110
- id: "intent-engine",
111
- requiresApiKey: false,
112
12
  defaultSelected: true,
113
13
  config: {
114
14
  type: "stdio",
115
15
  command: "npx",
116
- args: ["-y", "@origintask/intent-engine@latest", "mcp"],
117
- env: {}
118
- }
119
- // Works on all platforms - no special requirements
120
- },
121
- // Anthropic Official MCP Services - Universal
122
- // Note: Removed low-value services: filesystem (buggy), puppeteer (duplicate of Playwright),
123
- // memory (Claude has built-in memory), fetch (Claude has WebFetch), sequential-thinking (limited value)
124
- {
125
- id: "sqlite",
126
- requiresApiKey: false,
127
- config: {
128
- type: "stdio",
129
- command: "npx",
130
- args: ["-y", "@anthropic-ai/mcp-server-sqlite@latest"],
16
+ args: ["-y", "@upstash/context7-mcp@latest"],
131
17
  env: {}
132
18
  }
133
- // Works on all platforms - no special requirements
134
19
  }
135
20
  ];
136
21
  async function getMcpServices() {
137
22
  ensureI18nInitialized();
138
23
  const mcpServiceList = [
139
- // Documentation and Search Services
140
24
  {
141
25
  id: "context7",
142
26
  name: i18n.t("mcp:services.context7.name"),
143
27
  description: i18n.t("mcp:services.context7.description")
144
- },
145
- {
146
- id: "open-websearch",
147
- name: i18n.t("mcp:services.open-websearch.name"),
148
- description: i18n.t("mcp:services.open-websearch.description")
149
- },
150
- {
151
- id: "mcp-deepwiki",
152
- name: i18n.t("mcp:services.mcp-deepwiki.name"),
153
- description: i18n.t("mcp:services.mcp-deepwiki.description")
154
- },
155
- // Development Workflow Services
156
- {
157
- id: "spec-workflow",
158
- name: i18n.t("mcp:services.spec-workflow.name"),
159
- description: i18n.t("mcp:services.spec-workflow.description")
160
- },
161
- {
162
- id: "serena",
163
- name: i18n.t("mcp:services.serena.name"),
164
- description: i18n.t("mcp:services.serena.description")
165
- },
166
- // Browser and Automation Services
167
- {
168
- id: "Playwright",
169
- name: i18n.t("mcp:services.playwright.name"),
170
- description: i18n.t("mcp:services.playwright.description")
171
- },
172
- // Cross-session Memory Services
173
- {
174
- id: "intent-engine",
175
- name: i18n.t("mcp:services.intent-engine.name"),
176
- description: i18n.t("mcp:services.intent-engine.description")
177
- },
178
- // Anthropic Official MCP Services
179
- // Note: Removed low-value services: filesystem (buggy), puppeteer (duplicate),
180
- // memory (Claude built-in), fetch (Claude WebFetch), sequential-thinking (limited value)
181
- {
182
- id: "sqlite",
183
- name: i18n.t("mcp:services.sqlite.name"),
184
- description: i18n.t("mcp:services.sqlite.description")
185
28
  }
186
29
  ];
187
30
  return MCP_SERVICE_CONFIGS.map((config) => {
@@ -205,7 +48,7 @@ async function getMcpService(id) {
205
48
  }
206
49
  const DEFAULT_MCP_TOOL_SEARCH_CONFIG = {
207
50
  mcpAutoEnableThreshold: 10,
208
- excludedServices: ["mcp-search", "context7", "sqlite"]
51
+ excludedServices: ["mcp-search", "context7"]
209
52
  };
210
53
  function getMcpToolSearchConfig() {
211
54
  const env = process__default.env;
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "ccjk",
3
3
  "type": "module",
4
- "version": "13.5.2",
5
- "packageManager": "pnpm@10.17.1",
4
+ "version": "13.5.3",
6
5
  "description": "Turn Claude Code into a production-ready AI dev environment with one-command setup, persistent memory, MCP automation, cloud sync, and zero-config browser workflows.",
7
6
  "author": {
8
7
  "name": "CCJK Team",
@@ -81,71 +80,6 @@
81
80
  "engines": {
82
81
  "node": ">=20"
83
82
  },
84
- "scripts": {
85
- "dev": "tsx ./src/cli.ts",
86
- "build": "unbuild",
87
- "start": "node bin/ccjk.mjs",
88
- "typecheck": "tsc --noEmit",
89
- "release:verify": "node scripts/release-verify.mjs",
90
- "release:verify:full": "node scripts/release-verify.mjs --with-tests",
91
- "prepublishOnly": "node scripts/validate-prepublish.mjs && pnpm contract:check && pnpm build",
92
- "lint": "eslint",
93
- "lint:fix": "eslint --fix",
94
- "test": "vitest",
95
- "test:ui": "vitest --ui",
96
- "test:coverage": "vitest run --coverage",
97
- "test:run": "vitest run",
98
- "test:watch": "vitest watch",
99
- "test:e2e": "NODE_ENV=test vitest --config vitest.e2e.config.ts",
100
- "test:e2e:run": "NODE_ENV=test vitest run --config vitest.e2e.config.ts",
101
- "test:e2e:ui": "NODE_ENV=test vitest --config vitest.e2e.config.ts --ui",
102
- "test:e2e:coverage": "NODE_ENV=test vitest run --config vitest.e2e.config.ts --coverage",
103
- "test:e2e:debug": "NODE_ENV=test CCJK_E2E_DEBUG=true vitest --config vitest.e2e.config.ts",
104
- "test:v2": "vitest --config vitest.config.v2.ts",
105
- "test:v2:ui": "vitest --config vitest.config.v2.ts --ui",
106
- "test:v2:coverage": "vitest run --config vitest.config.v2.ts --coverage",
107
- "test:v2:run": "vitest run --config vitest.config.v2.ts",
108
- "test:v2:watch": "vitest watch --config vitest.config.v2.ts",
109
- "test:integration": "NODE_ENV=test vitest --config vitest.integration.config.ts",
110
- "test:integration:run": "NODE_ENV=test vitest run --config vitest.integration.config.ts",
111
- "test:integration:ui": "NODE_ENV=test vitest --config vitest.integration.config.ts --ui",
112
- "test:integration:coverage": "NODE_ENV=test vitest run --config vitest.integration.config.ts --coverage",
113
- "prepare": "husky",
114
- "format": "prettier --write src/**/*.ts",
115
- "prepublish:fix": "node scripts/fix-package-catalog.mjs",
116
- "cleanup": "node scripts/cleanup.js",
117
- "cleanup:auto": "node scripts/cleanup.js --auto",
118
- "cleanup:dry": "node scripts/cleanup.js --dry-run",
119
- "clean": "rm -rf dist coverage .turbo *.tsbuildinfo",
120
- "benchmark:compression": "tsx scripts/benchmark-compression.ts",
121
- "v2:setup": "chmod +x scripts/v2-dev-setup.sh && ./scripts/v2-dev-setup.sh",
122
- "v2:setup:skip-tests": "chmod +x scripts/v2-dev-setup.sh && ./scripts/v2-dev-setup.sh --skip-tests",
123
- "v2:services:up": "docker-compose -f docker-compose.dev.yml up -d",
124
- "v2:services:down": "docker-compose -f docker-compose.dev.yml down",
125
- "v2:services:restart": "docker-compose -f docker-compose.dev.yml restart",
126
- "v2:services:logs": "docker-compose -f docker-compose.dev.yml logs -f",
127
- "v2:services:status": "docker-compose -f docker-compose.dev.yml ps",
128
- "v2:db:reset": "docker-compose -f docker-compose.dev.yml down postgres && docker volume rm ccjk-public_postgres_data && docker-compose -f docker-compose.dev.yml up -d postgres",
129
- "v2:db:migrate": "echo 'Database migration script - to be implemented'",
130
- "v2:db:seed": "echo 'Database seeding script - to be implemented'",
131
- "v2:cache:clear": "docker exec ccjk-redis-dev redis-cli FLUSHALL",
132
- "v2:search:reindex": "curl -X DELETE http://localhost:9200/ccjk_dev* && echo 'Elasticsearch indexes cleared'",
133
- "v2:health": "chmod +x scripts/health-check.sh && ./scripts/health-check.sh",
134
- "v2:dev": "concurrently \"pnpm v2:services:up\" \"pnpm dev\"",
135
- "v2:test:integration": "NODE_ENV=test pnpm test -- --config vitest.integration.config.ts",
136
- "v2:test:e2e": "NODE_ENV=test pnpm test -- --config vitest.e2e.config.ts",
137
- "v2:monitoring:up": "docker-compose -f docker-compose.dev.yml --profile monitoring up -d",
138
- "v2:tracing:up": "docker-compose -f docker-compose.dev.yml --profile tracing up -d",
139
- "v2:clean": "pnpm clean && docker-compose -f docker-compose.dev.yml down -v && docker system prune -f",
140
- "benchmark": "tsx src/v2/__tests__/benchmarks.ts",
141
- "benchmark:save": "tsx src/v2/__tests__/benchmarks.ts && echo 'Results saved to .ccjk/benchmark-results.json'",
142
- "benchmark:detailed": "tsx src/v2/__tests__/benchmarks.ts --detailed",
143
- "benchmark:server": "npx http-server docs/v2 -p 8080 -o dashboard.html",
144
- "benchmark:open": "open docs/v2/dashboard.html || xdg-open docs/v2/dashboard.html || start docs/v2/dashboard.html",
145
- "i18n:check": "tsx scripts/check-i18n.ts",
146
- "i18n:report": "tsx scripts/check-i18n.ts --report",
147
- "contract:check": "node scripts/check-remote-contract.mjs"
148
- },
149
83
  "dependencies": {
150
84
  "better-sqlite3": "^12.6.2",
151
85
  "fdir": "^6.5.0",
@@ -208,5 +142,68 @@
208
142
  "unbuild": "^3.6.1",
209
143
  "uuid": "^11.1.0",
210
144
  "vitest": "^3.2.4"
145
+ },
146
+ "scripts": {
147
+ "dev": "tsx ./src/cli.ts",
148
+ "build": "unbuild",
149
+ "start": "node bin/ccjk.mjs",
150
+ "typecheck": "tsc --noEmit",
151
+ "release:verify": "node scripts/release-verify.mjs",
152
+ "release:verify:full": "node scripts/release-verify.mjs --with-tests",
153
+ "lint": "eslint",
154
+ "lint:fix": "eslint --fix",
155
+ "test": "vitest",
156
+ "test:ui": "vitest --ui",
157
+ "test:coverage": "vitest run --coverage",
158
+ "test:run": "vitest run",
159
+ "test:watch": "vitest watch",
160
+ "test:e2e": "NODE_ENV=test vitest --config vitest.e2e.config.ts",
161
+ "test:e2e:run": "NODE_ENV=test vitest run --config vitest.e2e.config.ts",
162
+ "test:e2e:ui": "NODE_ENV=test vitest --config vitest.e2e.config.ts --ui",
163
+ "test:e2e:coverage": "NODE_ENV=test vitest run --config vitest.e2e.config.ts --coverage",
164
+ "test:e2e:debug": "NODE_ENV=test CCJK_E2E_DEBUG=true vitest --config vitest.e2e.config.ts",
165
+ "test:v2": "vitest --config vitest.config.v2.ts",
166
+ "test:v2:ui": "vitest --config vitest.config.v2.ts --ui",
167
+ "test:v2:coverage": "vitest run --config vitest.config.v2.ts --coverage",
168
+ "test:v2:run": "vitest run --config vitest.config.v2.ts",
169
+ "test:v2:watch": "vitest watch --config vitest.config.v2.ts",
170
+ "test:integration": "NODE_ENV=test vitest --config vitest.integration.config.ts",
171
+ "test:integration:run": "NODE_ENV=test vitest run --config vitest.integration.config.ts",
172
+ "test:integration:ui": "NODE_ENV=test vitest --config vitest.integration.config.ts --ui",
173
+ "test:integration:coverage": "NODE_ENV=test vitest run --config vitest.integration.config.ts --coverage",
174
+ "format": "prettier --write src/**/*.ts",
175
+ "prepublish:fix": "node scripts/fix-package-catalog.mjs",
176
+ "cleanup": "node scripts/cleanup.js",
177
+ "cleanup:auto": "node scripts/cleanup.js --auto",
178
+ "cleanup:dry": "node scripts/cleanup.js --dry-run",
179
+ "clean": "rm -rf dist coverage .turbo *.tsbuildinfo",
180
+ "benchmark:compression": "tsx scripts/benchmark-compression.ts",
181
+ "v2:setup": "chmod +x scripts/v2-dev-setup.sh && ./scripts/v2-dev-setup.sh",
182
+ "v2:setup:skip-tests": "chmod +x scripts/v2-dev-setup.sh && ./scripts/v2-dev-setup.sh --skip-tests",
183
+ "v2:services:up": "docker-compose -f docker-compose.dev.yml up -d",
184
+ "v2:services:down": "docker-compose -f docker-compose.dev.yml down",
185
+ "v2:services:restart": "docker-compose -f docker-compose.dev.yml restart",
186
+ "v2:services:logs": "docker-compose -f docker-compose.dev.yml logs -f",
187
+ "v2:services:status": "docker-compose -f docker-compose.dev.yml ps",
188
+ "v2:db:reset": "docker-compose -f docker-compose.dev.yml down postgres && docker volume rm ccjk-public_postgres_data && docker-compose -f docker-compose.dev.yml up -d postgres",
189
+ "v2:db:migrate": "echo 'Database migration script - to be implemented'",
190
+ "v2:db:seed": "echo 'Database seeding script - to be implemented'",
191
+ "v2:cache:clear": "docker exec ccjk-redis-dev redis-cli FLUSHALL",
192
+ "v2:search:reindex": "curl -X DELETE http://localhost:9200/ccjk_dev* && echo 'Elasticsearch indexes cleared'",
193
+ "v2:health": "chmod +x scripts/health-check.sh && ./scripts/health-check.sh",
194
+ "v2:dev": "concurrently \"pnpm v2:services:up\" \"pnpm dev\"",
195
+ "v2:test:integration": "NODE_ENV=test pnpm test -- --config vitest.integration.config.ts",
196
+ "v2:test:e2e": "NODE_ENV=test pnpm test -- --config vitest.e2e.config.ts",
197
+ "v2:monitoring:up": "docker-compose -f docker-compose.dev.yml --profile monitoring up -d",
198
+ "v2:tracing:up": "docker-compose -f docker-compose.dev.yml --profile tracing up -d",
199
+ "v2:clean": "pnpm clean && docker-compose -f docker-compose.dev.yml down -v && docker system prune -f",
200
+ "benchmark": "tsx src/v2/__tests__/benchmarks.ts",
201
+ "benchmark:save": "tsx src/v2/__tests__/benchmarks.ts && echo 'Results saved to .ccjk/benchmark-results.json'",
202
+ "benchmark:detailed": "tsx src/v2/__tests__/benchmarks.ts --detailed",
203
+ "benchmark:server": "npx http-server docs/v2 -p 8080 -o dashboard.html",
204
+ "benchmark:open": "open docs/v2/dashboard.html || xdg-open docs/v2/dashboard.html || start docs/v2/dashboard.html",
205
+ "i18n:check": "tsx scripts/check-i18n.ts",
206
+ "i18n:report": "tsx scripts/check-i18n.ts --report",
207
+ "contract:check": "node scripts/check-remote-contract.mjs"
211
208
  }
212
- }
209
+ }