ccjk 13.6.5 → 14.0.0

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 (57) hide show
  1. package/dist/chunks/api-cli.mjs +4 -2
  2. package/dist/chunks/api-config-selector.mjs +7 -7
  3. package/dist/chunks/auto-fix.mjs +3 -1
  4. package/dist/chunks/auto-updater.mjs +100 -2
  5. package/dist/chunks/banner.mjs +0 -16
  6. package/dist/chunks/ccjk-all.mjs +5 -2
  7. package/dist/chunks/ccjk-mcp.mjs +6 -3
  8. package/dist/chunks/ccjk-setup.mjs +4 -1
  9. package/dist/chunks/ccr.mjs +5 -5
  10. package/dist/chunks/check-updates.mjs +12 -2
  11. package/dist/chunks/claude-code-incremental-manager.mjs +45 -21
  12. package/dist/chunks/claude-wrapper.mjs +1 -1
  13. package/dist/chunks/cli-hook.mjs +4 -5
  14. package/dist/chunks/codex-config-switch.mjs +3 -3
  15. package/dist/chunks/codex-provider-manager.mjs +1 -1
  16. package/dist/chunks/codex.mjs +4 -360
  17. package/dist/chunks/config-switch.mjs +22 -11
  18. package/dist/chunks/config.mjs +1104 -5
  19. package/dist/chunks/config2.mjs +6 -4
  20. package/dist/chunks/config3.mjs +4 -2
  21. package/dist/chunks/constants.mjs +1 -1
  22. package/dist/chunks/doctor.mjs +2 -2
  23. package/dist/chunks/evolution.mjs +47 -27
  24. package/dist/chunks/features.mjs +76 -12
  25. package/dist/chunks/index10.mjs +78 -24
  26. package/dist/chunks/init.mjs +18 -35
  27. package/dist/chunks/installer.mjs +3 -3
  28. package/dist/chunks/mcp-cli.mjs +16 -16
  29. package/dist/chunks/mcp.mjs +9 -9
  30. package/dist/chunks/memory-check.mjs +1 -1
  31. package/dist/chunks/package.mjs +1 -1
  32. package/dist/chunks/platform.mjs +1 -1
  33. package/dist/chunks/quick-setup.mjs +11 -10
  34. package/dist/chunks/research.mjs +225 -27
  35. package/dist/chunks/slash-commands.mjs +1 -1
  36. package/dist/chunks/smart-defaults.mjs +2 -2
  37. package/dist/chunks/uninstall.mjs +1 -1
  38. package/dist/chunks/update.mjs +16 -16
  39. package/dist/chunks/version-checker.mjs +11 -1
  40. package/dist/cli.mjs +5 -1
  41. package/dist/i18n/locales/en/cli.json +0 -4
  42. package/dist/i18n/locales/en/menu.json +10 -3
  43. package/dist/i18n/locales/en/notification.json +2 -2
  44. package/dist/i18n/locales/zh-CN/cli.json +0 -4
  45. package/dist/i18n/locales/zh-CN/menu.json +10 -3
  46. package/dist/i18n/locales/zh-CN/notification.json +2 -2
  47. package/dist/index.mjs +3 -2
  48. package/dist/shared/{ccjk.C4m4ypdk.mjs → ccjk.B6VCKdyy.mjs} +4 -3
  49. package/dist/shared/ccjk.BI-hdI7P.mjs +30 -0
  50. package/dist/shared/{ccjk.DvAP4XfP.mjs → ccjk.CVjfbEIj.mjs} +2 -2
  51. package/dist/shared/ccjk.DKXs7Fbm.mjs +361 -0
  52. package/dist/shared/{ccjk.BP5hsTZQ.mjs → ccjk.Dh6Be-ef.mjs} +2 -2
  53. package/package.json +3 -1
  54. package/templates/common/workflow/essential/en/feat.md +68 -291
  55. package/templates/common/workflow/sixStep/en/workflow.md +56 -330
  56. package/dist/chunks/claude-code-config-manager.mjs +0 -809
  57. package/dist/chunks/claude-config.mjs +0 -253
@@ -8,8 +8,7 @@ import { d as dayjs } from '../shared/ccjk.RyizuzOI.mjs';
8
8
  import { i as inquirer } from './index6.mjs';
9
9
  import { SETTINGS_FILE } from './constants.mjs';
10
10
  import { ensureI18nInitialized, i18n } from './index2.mjs';
11
- import { s as setPrimaryApiKey, a as addCompletedOnboarding } from './claude-config.mjs';
12
- import { b as backupExistingConfig } from './config.mjs';
11
+ import { l as setPrimaryApiKey, n as addCompletedOnboarding, b as backupExistingConfig } from './config.mjs';
13
12
  import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
14
13
  import { p as promptBoolean } from '../shared/ccjk.DZ2LLOa-.mjs';
15
14
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
@@ -34,6 +33,9 @@ import 'node:stream';
34
33
  import './fs-operations.mjs';
35
34
  import 'node:fs/promises';
36
35
  import '../shared/ccjk.DScm_NnL.mjs';
36
+ import './ccjk-config.mjs';
37
+ import '../shared/ccjk.BBtCGd_g.mjs';
38
+ import './index3.mjs';
37
39
  import '../shared/ccjk.DeWpAShp.mjs';
38
40
 
39
41
  const PROVIDER_PRESETS_URL = "https://pub-0dc3e1677e894f07bbea11b17a29e032.r2.dev/providers.json";
@@ -415,7 +417,7 @@ async function setupCcrConfiguration() {
415
417
  console.log(a.yellow(`${i18n.t("ccr:keepingExistingConfig")}`));
416
418
  await configureCcrProxy(existingConfig);
417
419
  try {
418
- const { manageApiKeyApproval } = await import('./claude-config.mjs').then(function (n) { return n.j; });
420
+ const { manageApiKeyApproval } = await import('./config.mjs').then(function (n) { return n.E; });
419
421
  const apiKey = existingConfig.APIKEY || "sk-ccjk-x-ccr";
420
422
  manageApiKeyApproval(apiKey);
421
423
  console.log(a.green(`\u2714 ${i18n.t("ccr:apiKeyApprovalSuccess")}`));
@@ -449,7 +451,7 @@ async function setupCcrConfiguration() {
449
451
  console.error(a.red(i18n.t("errors:failedToSetOnboarding")), error);
450
452
  }
451
453
  try {
452
- const { manageApiKeyApproval } = await import('./claude-config.mjs').then(function (n) { return n.j; });
454
+ const { manageApiKeyApproval } = await import('./config.mjs').then(function (n) { return n.E; });
453
455
  const apiKey = config.APIKEY || "sk-ccjk-x-ccr";
454
456
  manageApiKeyApproval(apiKey);
455
457
  console.log(a.green(`\u2714 ${i18n.t("ccr:apiKeyApprovalSuccess")}`));
@@ -21,10 +21,9 @@ import 'node:os';
21
21
  import 'node:crypto';
22
22
  import 'buffer';
23
23
  import 'string_decoder';
24
- import '../shared/ccjk.bQ7Dh1g4.mjs';
25
24
  import 'node:url';
25
+ import '../shared/ccjk.bQ7Dh1g4.mjs';
26
26
  import '../shared/ccjk.RyizuzOI.mjs';
27
- import './claude-config.mjs';
28
27
  import './json-config.mjs';
29
28
  import './fs-operations.mjs';
30
29
  import 'node:fs/promises';
@@ -34,6 +33,9 @@ import 'module';
34
33
  import 'node:child_process';
35
34
  import 'node:stream';
36
35
  import '../shared/ccjk.DScm_NnL.mjs';
36
+ import './ccjk-config.mjs';
37
+ import '../shared/ccjk.BBtCGd_g.mjs';
38
+ import './index3.mjs';
37
39
 
38
40
  async function getConfig(key, options = {}) {
39
41
  const isZh = i18n.language === "zh-CN";
@@ -80,7 +80,7 @@ const LEGACY_ZCF_CONFIG_FILES = [
80
80
  const ZCF_CONFIG_DIR = CCJK_CONFIG_DIR;
81
81
  const ZCF_CONFIG_FILE = CCJK_CONFIG_FILE;
82
82
  const CODE_TOOL_TYPES = ["claude-code", "myclaude", "codex", "aider", "continue", "cline", "cursor"];
83
- const DEFAULT_CODE_TOOL_TYPE = "claude-code";
83
+ const DEFAULT_CODE_TOOL_TYPE = "myclaude";
84
84
  const CLAUDE_FAMILY_CODE_TOOL_TYPES = ["claude-code", "myclaude"];
85
85
  const CODE_TOOL_BANNERS = {
86
86
  "claude-code": "for Claude Code",
@@ -6,7 +6,7 @@ import { getApiProviderPresets } from './api-providers.mjs';
6
6
  import { SETTINGS_FILE, CLAUDE_DIR } from './constants.mjs';
7
7
  import { i18n } from './index2.mjs';
8
8
  import { g as getPermissionManager } from '../shared/ccjk.SPoXMvZD.mjs';
9
- import { e as commandExists } from './platform.mjs';
9
+ import { h as commandExists } from './platform.mjs';
10
10
  import { P as ProviderHealthMonitor } from '../shared/ccjk.J8YiPsOw.mjs';
11
11
  import { platform, userInfo, homedir } from 'node:os';
12
12
  import ora from './index8.mjs';
@@ -814,7 +814,7 @@ async function checkPermissionRules() {
814
814
  }
815
815
  async function fixSettingsFile() {
816
816
  const isZh = i18n.language === "zh-CN";
817
- const { copyConfigFiles } = await import('./config.mjs').then(function (n) { return n.j; });
817
+ const { copyConfigFiles } = await import('./config.mjs').then(function (n) { return n.B; });
818
818
  console.log("");
819
819
  console.log(a.bold.cyan("\u{1F527} Fixing settings.json"));
820
820
  console.log(a.dim("\u2500".repeat(50)));
@@ -27,88 +27,108 @@ class A2AClient {
27
27
  this.baseUrl = resolved;
28
28
  }
29
29
  /**
30
- * Register agent (hello)
30
+ * Register agent — POST /a2a/hello
31
+ * Server expects: { agent: { name, version }, capabilities }
31
32
  */
32
- async hello(agent) {
33
+ async hello(name, version, capabilities = []) {
33
34
  const response = await this.request("/a2a/hello", {
34
35
  method: "POST",
35
- body: { type: "hello", agent }
36
+ body: { agent: { name, version }, capabilities }
36
37
  });
37
38
  this.token = response.token;
38
39
  this.agentId = response.agentId;
39
40
  return response;
40
41
  }
41
42
  /**
42
- * Publish a gene
43
+ * Publish a gene — POST /a2a/publish
44
+ * Server expects flat fields: problemSignature, solutionStrategy, solutionCode, solutionSteps, tags, version
43
45
  */
44
- async publish(gene, proof) {
46
+ async publish(gene) {
45
47
  this.ensureAuthenticated();
46
48
  return this.request("/a2a/publish", {
47
49
  method: "POST",
48
- body: { type: "publish", gene, proof },
50
+ body: {
51
+ problemSignature: gene.problemSignature,
52
+ solutionStrategy: gene.solutionStrategy,
53
+ solutionCode: gene.solutionCode || "",
54
+ solutionSteps: gene.solutionSteps,
55
+ tags: gene.tags || [],
56
+ version: gene.version || "1.0.0"
57
+ },
49
58
  auth: true
50
59
  });
51
60
  }
52
61
  /**
53
- * Fetch genes
62
+ * Fetch genes — GET /a2a/fetch?minGDI=&limit=&signature=
63
+ * Server returns: { success, genes: [...] }
54
64
  */
55
- async fetch(query, limit) {
65
+ async fetch(options = {}) {
56
66
  this.ensureAuthenticated();
57
- const response = await this.request("/a2a/fetch", {
58
- method: "POST",
59
- body: { type: "fetch", query, limit },
67
+ const params = new URLSearchParams();
68
+ if (options.minGDI !== void 0) params.set("minGDI", String(options.minGDI));
69
+ if (options.limit !== void 0) params.set("limit", String(options.limit));
70
+ if (options.signature) params.set("signature", options.signature);
71
+ if (options.geneId) params.set("geneId", options.geneId);
72
+ const qs = params.toString();
73
+ const response = await this.request(`/a2a/fetch${qs ? "?" + qs : ""}`, {
74
+ method: "GET",
60
75
  auth: true
61
76
  });
62
77
  return response.genes;
63
78
  }
64
79
  /**
65
- * Report usage result
80
+ * Report usage result — POST /a2a/report
81
+ * Server expects: { geneId, outcome, context? }
66
82
  */
67
- async report(geneId, result) {
83
+ async report(geneId, outcome, context) {
68
84
  this.ensureAuthenticated();
69
85
  return this.request("/a2a/report", {
70
86
  method: "POST",
71
- body: { type: "report", geneId, result },
87
+ body: { geneId, outcome, ...context ? { context } : {} },
72
88
  auth: true
73
89
  });
74
90
  }
75
91
  /**
76
- * Request decision
92
+ * Record decision — POST /a2a/decision
93
+ * Server expects: { geneId, action: 'approve' | 'reject' }
77
94
  */
78
- async decision(problem, options, context) {
95
+ async decision(geneId, action) {
79
96
  this.ensureAuthenticated();
80
97
  return this.request("/a2a/decision", {
81
98
  method: "POST",
82
- body: { type: "decision", problem, options, context },
99
+ body: { geneId, action },
83
100
  auth: true
84
101
  });
85
102
  }
86
103
  /**
87
- * Revoke a gene
104
+ * Revoke a gene — POST /a2a/revoke
105
+ * Server expects: { geneId, reason? }
88
106
  */
89
107
  async revoke(geneId, reason) {
90
108
  this.ensureAuthenticated();
91
109
  await this.request("/a2a/revoke", {
92
110
  method: "POST",
93
- body: { type: "revoke", geneId, reason },
111
+ body: { geneId, ...reason ? { reason } : {} },
94
112
  auth: true
95
113
  });
96
114
  }
97
115
  /**
98
- * Get agent ID
116
+ * Get stats — GET /a2a/stats
99
117
  */
118
+ async stats() {
119
+ this.ensureAuthenticated();
120
+ const resp = await this.request("/a2a/stats", {
121
+ method: "GET",
122
+ auth: true
123
+ });
124
+ return resp.stats;
125
+ }
100
126
  getAgentId() {
101
127
  return this.agentId;
102
128
  }
103
- /**
104
- * Check if authenticated
105
- */
106
129
  isAuthenticated() {
107
130
  return this.token !== null;
108
131
  }
109
- /**
110
- * Internal request wrapper
111
- */
112
132
  async request(path, options) {
113
133
  const url = `${this.baseUrl}${path}`;
114
134
  const headers = {
@@ -124,7 +144,7 @@ class A2AClient {
124
144
  });
125
145
  if (!response.ok) {
126
146
  const error = await response.json().catch(() => ({ error: response.statusText }));
127
- throw new Error(error.error || `Request failed: ${response.statusText}`);
147
+ throw new Error(error.error || error.message || `Request failed: ${response.statusText}`);
128
148
  }
129
149
  return response.json();
130
150
  }
@@ -3,11 +3,14 @@ import { homedir } from 'node:os';
3
3
  import process__default from 'node:process';
4
4
  import a from './index5.mjs';
5
5
  import { i as inquirer } from './index6.mjs';
6
+ import { g as getMcpServices } from '../shared/ccjk.DKXs7Fbm.mjs';
6
7
  import { SUPPORTED_LANGS, LANG_LABELS } from './constants.mjs';
7
8
  import { ensureI18nInitialized, i18n, changeLanguage } from './index2.mjs';
8
9
  import { updateZcfConfig, readZcfConfig } from './ccjk-config.mjs';
9
- import { g as getExistingModelConfig, a as getExistingCustomModelConfig, u as updateCustomModel, c as updateDefaultModel, d as getExistingApiConfig, p as promptApiConfigurationAction, e as configureApi } from './config.mjs';
10
- import { m as modifyApiConfigPartially, v as validateApiKey, f as formatApiKeyDisplay } from '../shared/ccjk.BP5hsTZQ.mjs';
10
+ import { g as getExistingModelConfig, a as getExistingCustomModelConfig, u as updateCustomModel, c as updateDefaultModel, r as readMcpConfig, f as fixWindowsMcpConfig, w as writeMcpConfig, d as backupMcpConfig, e as buildMcpServerConfig, m as mergeMcpServers, h as getExistingApiConfig, p as promptApiConfigurationAction, i as configureApi } from './config.mjs';
11
+ import { c as configureOutputStyle, m as modifyApiConfigPartially, v as validateApiKey, f as formatApiKeyDisplay } from '../shared/ccjk.Dh6Be-ef.mjs';
12
+ import { s as selectMcpServices } from '../shared/ccjk.BI-hdI7P.mjs';
13
+ import { i as isWindows } from './platform.mjs';
11
14
  import { a as addNumbersToChoices } from '../shared/ccjk.BFQ7yr5S.mjs';
12
15
  import { p as promptBoolean } from '../shared/ccjk.DZ2LLOa-.mjs';
13
16
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
@@ -25,6 +28,7 @@ import 'node:path';
25
28
  import 'node:crypto';
26
29
  import 'buffer';
27
30
  import 'string_decoder';
31
+ import 'node:child_process';
28
32
  import 'node:url';
29
33
  import '../shared/ccjk.BBtCGd_g.mjs';
30
34
  import './index3.mjs';
@@ -32,13 +36,10 @@ import './fs-operations.mjs';
32
36
  import 'node:fs/promises';
33
37
  import './json-config.mjs';
34
38
  import '../shared/ccjk.RyizuzOI.mjs';
35
- import './claude-config.mjs';
36
- import './platform.mjs';
39
+ import '../shared/ccjk.DScm_NnL.mjs';
37
40
  import './main.mjs';
38
41
  import 'module';
39
- import 'node:child_process';
40
42
  import 'node:stream';
41
- import '../shared/ccjk.DScm_NnL.mjs';
42
43
  import '../shared/ccjk.DeWpAShp.mjs';
43
44
 
44
45
  const DEFAULT_MODEL_CHOICES = [
@@ -105,7 +106,7 @@ async function handleCustomApiMode() {
105
106
  ensureI18nInitialized();
106
107
  const zcfConfig = readZcfConfig();
107
108
  const codeToolType = zcfConfig?.codeToolType || "claude-code";
108
- if (codeToolType === "claude-code") {
109
+ if (codeToolType === "claude-code" || codeToolType === "myclaude") {
109
110
  const { configureIncrementalManagement } = await import('./claude-code-incremental-manager.mjs');
110
111
  await configureIncrementalManagement();
111
112
  return;
@@ -191,6 +192,57 @@ async function handleCustomApiMode() {
191
192
  console.log(a.gray(` Key: ${formatApiKeyDisplay(configuredApi.key)}`));
192
193
  }
193
194
  }
195
+ async function configureMcpFeature() {
196
+ ensureI18nInitialized();
197
+ if (isWindows()) {
198
+ const fixWindows = await promptBoolean({
199
+ message: i18n.t("configuration:fixWindowsMcp") || "Fix Windows MCP configuration?",
200
+ defaultValue: true
201
+ });
202
+ if (fixWindows) {
203
+ const existingConfig = readMcpConfig() || { mcpServers: {} };
204
+ const fixedConfig = fixWindowsMcpConfig(existingConfig);
205
+ writeMcpConfig(fixedConfig);
206
+ console.log(a.green(`\u2714 ${i18n.t("configuration:windowsMcpConfigFixed")}`));
207
+ }
208
+ }
209
+ const selectedServices = await selectMcpServices();
210
+ if (!selectedServices) {
211
+ return;
212
+ }
213
+ if (selectedServices.length > 0) {
214
+ const mcpBackupPath = backupMcpConfig();
215
+ if (mcpBackupPath) {
216
+ console.log(a.gray(`\u2714 ${i18n.t("mcp:mcpBackupSuccess")}: ${mcpBackupPath}`));
217
+ }
218
+ const newServers = {};
219
+ for (const serviceId of selectedServices) {
220
+ const service = (await getMcpServices()).find((s) => s.id === serviceId);
221
+ if (!service)
222
+ continue;
223
+ let config = service.config;
224
+ if (service.requiresApiKey) {
225
+ const { apiKey } = await inquirer.prompt({
226
+ type: "input",
227
+ name: "apiKey",
228
+ message: service.apiKeyPrompt,
229
+ validate: async (value) => !!value || i18n.t("api:keyRequired")
230
+ });
231
+ if (apiKey) {
232
+ config = buildMcpServerConfig(service.config, apiKey, service.apiKeyPlaceholder, service.apiKeyEnvVar);
233
+ } else {
234
+ continue;
235
+ }
236
+ }
237
+ newServers[service.id] = config;
238
+ }
239
+ const existingConfig = readMcpConfig();
240
+ let mergedConfig = mergeMcpServers(existingConfig, newServers);
241
+ mergedConfig = fixWindowsMcpConfig(mergedConfig);
242
+ writeMcpConfig(mergedConfig);
243
+ console.log(a.green(`\u2714 ${i18n.t("mcp:mcpConfigSuccess")}`));
244
+ }
245
+ }
194
246
  async function configureDefaultModelFeature() {
195
247
  ensureI18nInitialized();
196
248
  const existingModel = getExistingModelConfig();
@@ -293,7 +345,7 @@ async function changeScriptLanguageFeature(currentLang) {
293
345
  }
294
346
  async function configureCodexDefaultModelFeature() {
295
347
  ensureI18nInitialized();
296
- const { readCodexConfig } = await import('./codex.mjs').then(function (n) { return n.v; });
348
+ const { readCodexConfig } = await import('./codex.mjs').then(function (n) { return n.q; });
297
349
  const existingConfig = readCodexConfig();
298
350
  const currentModel = existingConfig?.model;
299
351
  if (currentModel) {
@@ -393,14 +445,14 @@ ${a.green(`\u2139 ${i18n.t("configuration:existingLanguageConfig") || "Existing
393
445
  } else if (option === "systemPrompt") {
394
446
  const zcfConfig = readZcfConfig();
395
447
  const currentLang = zcfConfig?.aiOutputLang || "English";
396
- const { runCodexSystemPromptSelection } = await import('./codex.mjs').then(function (n) { return n.v; });
448
+ const { runCodexSystemPromptSelection } = await import('./codex.mjs').then(function (n) { return n.q; });
397
449
  await runCodexSystemPromptSelection();
398
450
  await ensureLanguageDirectiveInAgents(currentLang);
399
451
  console.log(a.green(`\u2714 ${i18n.t("configuration:systemPromptConfigured")}`));
400
452
  }
401
453
  }
402
454
  async function updateCodexModelProvider(modelProvider) {
403
- const { readCodexConfig, writeCodexConfig, backupCodexConfig, getBackupMessage } = await import('./codex.mjs').then(function (n) { return n.v; });
455
+ const { readCodexConfig, writeCodexConfig, backupCodexConfig, getBackupMessage } = await import('./codex.mjs').then(function (n) { return n.q; });
404
456
  const backupPath = backupCodexConfig();
405
457
  if (backupPath) {
406
458
  console.log(a.gray(getBackupMessage(backupPath)));
@@ -430,7 +482,7 @@ const codexLanguageLabels = {
430
482
  };
431
483
  async function setCodexLanguageDirective(aiOutputLang, mode) {
432
484
  const { readFile, writeFileAtomic, exists } = await import('./fs-operations.mjs');
433
- const { backupCodexAgents, getBackupMessage } = await import('./codex.mjs').then(function (n) { return n.v; });
485
+ const { backupCodexAgents, getBackupMessage } = await import('./codex.mjs').then(function (n) { return n.q; });
434
486
  const CODEX_AGENTS_FILE = join(homedir(), ".codex", "AGENTS.md");
435
487
  if (!exists(CODEX_AGENTS_FILE)) {
436
488
  console.log(a.yellow(i18n.t("codex:agentsFileNotFound")));
@@ -460,6 +512,8 @@ async function updateCodexLanguageDirective(aiOutputLang) {
460
512
  return setCodexLanguageDirective(aiOutputLang, "update");
461
513
  }
462
514
  async function configureMemoryFeature() {
515
+ ensureI18nInitialized();
516
+ const isZh = i18n.language === "zh-CN";
463
517
  const inquirer2 = (await import('./index6.mjs').then(function (n) { return n.c; })).default;
464
518
  const ansis2 = (await import('./index5.mjs')).default;
465
519
  const { execSync } = await import('node:child_process');
@@ -502,6 +556,8 @@ ${ansis2.bold(i18n.t("memory:currentStatus"))}`);
502
556
  { name: i18n.t("memory:editMemory"), value: "edit" },
503
557
  { name: i18n.t("memory:syncNow"), value: "sync" },
504
558
  { name: i18n.t("memory:configureRules"), value: "rules" },
559
+ { name: isZh ? "\u{1F310} \u914D\u7F6E AI \u8F93\u51FA\u8BED\u8A00" : "\u{1F310} Configure AI output language", value: "language" },
560
+ { name: isZh ? "\u{1F3A8} \u914D\u7F6E\u8F93\u51FA\u98CE\u683C" : "\u{1F3A8} Configure output style", value: "outputStyle" },
505
561
  { name: i18n.t("memory:back"), value: "back" }
506
562
  ]
507
563
  }
@@ -573,7 +629,15 @@ ${ansis2.bold(i18n.t("memory:memoryContent"))}`);
573
629
  console.log(i18n.t("memory:rulesDescription"));
574
630
  break;
575
631
  }
632
+ case "language": {
633
+ await changeScriptLanguageFeature(i18n.language);
634
+ break;
635
+ }
636
+ case "outputStyle": {
637
+ await configureOutputStyle();
638
+ break;
639
+ }
576
640
  }
577
641
  }
578
642
 
579
- export { CODEX_MODEL_CHOICES, DEFAULT_MODEL_CHOICES, changeScriptLanguageFeature, configureCodexAiMemoryFeature, configureCodexDefaultModelFeature, configureDefaultModelFeature, configureMemoryFeature, formatCodexModelLabel, handleCustomApiMode, promptCustomModels };
643
+ export { CODEX_MODEL_CHOICES, DEFAULT_MODEL_CHOICES, changeScriptLanguageFeature, configureCodexAiMemoryFeature, configureCodexDefaultModelFeature, configureDefaultModelFeature, configureMcpFeature, configureMemoryFeature, formatCodexModelLabel, handleCustomApiMode, promptCustomModels };
@@ -4,7 +4,7 @@ import { CLOUD_ENDPOINTS, CCJK_CONFIG_DIR, SUPPORTED_LANGS, LANG_LABELS, CODE_TO
4
4
  import { ensureI18nInitialized, i18n, resolveSupportedLanguage, changeLanguage } from './index2.mjs';
5
5
  import { displayBannerWithInfo } from './banner.mjs';
6
6
  import { readZcfConfig, updateZcfConfig } from './ccjk-config.mjs';
7
- import { c as runCodexUpdate, m as runCodexUninstall, n as configureCodexAiMemoryFeature, o as configureCodexDefaultModelFeature, p as configureCodexMcp, q as configureCodexApi, t as configureCodexPresetFeature, u as runCodexWorkflowImportWithLanguageSelection, k as runCodexFullInit } from './codex.mjs';
7
+ import { c as runCodexUpdate, i as runCodexUninstall, j as configureCodexAiMemoryFeature, k as configureCodexDefaultModelFeature, m as configureCodexMcp, n as configureCodexApi, o as configureCodexPresetFeature, p as runCodexWorkflowImportWithLanguageSelection, h as runCodexFullInit } from './codex.mjs';
8
8
  import { S as STARTUP_CODE_TOOL_CHOICES, a as resolveStartupCodeType } from '../shared/ccjk.yYQMbHH3.mjs';
9
9
  import { a as handleExitPromptError, h as handleGeneralError } from '../shared/ccjk.DGllfVCZ.mjs';
10
10
  import { changeScriptLanguageFeature } from './features.mjs';
@@ -26,7 +26,7 @@ import { configSwitchCommand } from './config-switch.mjs';
26
26
  import process__default from 'node:process';
27
27
  import { readFile, writeFileAtomic, ensureDir, exists, readJsonFile } from './fs-operations.mjs';
28
28
  import { workspaceDiagnostics, doctor } from './doctor.mjs';
29
- import { a as mcpList, c as mcpUninstall, m as mcpInstall, d as mcpTrending, b as mcpSearch } from '../shared/ccjk.DvAP4XfP.mjs';
29
+ import { a as mcpList, c as mcpUninstall, m as mcpInstall, d as mcpTrending, b as mcpSearch } from '../shared/ccjk.CVjfbEIj.mjs';
30
30
  import { notificationCommand } from './notification.mjs';
31
31
  import { g as getRuntimeVersion } from '../shared/ccjk.gDEDGD_t.mjs';
32
32
  import { uninstall } from './uninstall.mjs';
@@ -3162,7 +3162,7 @@ async function runOnboardingWizard(options = {}) {
3162
3162
  console.log("");
3163
3163
  }
3164
3164
 
3165
- const NON_CODEX_TOOLS = ["claude-code", "aider", "continue", "cline", "cursor"];
3165
+ const NON_CODEX_TOOLS = ["claude-code", "myclaude", "aider", "continue", "cline", "cursor"];
3166
3166
  const quickActionsItems = [
3167
3167
  {
3168
3168
  id: "init",
@@ -3238,6 +3238,17 @@ const quickActionsItems = [
3238
3238
  icon: "\u{1F4F1}",
3239
3239
  shortcut: "5",
3240
3240
  supportedTools: NON_CODEX_TOOLS
3241
+ },
3242
+ {
3243
+ id: "switch-code-tool",
3244
+ label: "menuOptions.switchCodeTool",
3245
+ description: "menuDescriptions.switchCodeTool",
3246
+ category: "quick",
3247
+ level: "basic",
3248
+ action: "command",
3249
+ icon: "\u{1F504}",
3250
+ shortcut: "s",
3251
+ supportedTools: NON_CODEX_TOOLS
3241
3252
  }
3242
3253
  ];
3243
3254
  const configItems = [
@@ -3468,17 +3479,6 @@ const systemItems = [
3468
3479
  shortcut: "z",
3469
3480
  supportedTools: NON_CODEX_TOOLS
3470
3481
  },
3471
- {
3472
- id: "switch-code-tool",
3473
- label: "menuOptions.switchCodeTool",
3474
- description: "menuDescriptions.switchCodeTool",
3475
- category: "system",
3476
- level: "expert",
3477
- action: "command",
3478
- icon: "\u{1F504}",
3479
- shortcut: "t",
3480
- supportedTools: NON_CODEX_TOOLS
3481
- },
3482
3482
  {
3483
3483
  id: "uninstall",
3484
3484
  label: "menuOptions.uninstall",
@@ -3774,6 +3774,15 @@ function getToolModeMeta(codeTool) {
3774
3774
  config: t("menu:toolMode.claude.config", "Primary config: ~/.claude/settings.json"),
3775
3775
  menuTitle: t("menu:toolMode.claude.menuTitle", "Claude Control Center")
3776
3776
  };
3777
+ case "myclaude":
3778
+ return {
3779
+ icon: "\u25C9",
3780
+ title: t("menu:toolMode.myclaude.title", "myclaude Workspace"),
3781
+ summary: t("menu:toolMode.myclaude.summary", "Provider-first control center with explicit runtime status at startup."),
3782
+ focus: t("menu:toolMode.myclaude.focus", "Provider profiles, routing state, model slots, and Claude-family compatible configuration."),
3783
+ config: t("menu:toolMode.myclaude.config", "Primary config: ~/.claude.json (runtime) + ~/.ccjk/config.toml (reusable profiles)"),
3784
+ menuTitle: t("menu:toolMode.myclaude.menuTitle", "myclaude Control Center")
3785
+ };
3777
3786
  case "codex":
3778
3787
  return {
3779
3788
  icon: "\u25C6",
@@ -3907,15 +3916,28 @@ function renderMenu(title, items, options = {}) {
3907
3916
  lines.push(renderFooter(opts));
3908
3917
  return lines.join("\n");
3909
3918
  }
3910
- function renderToolModeHero(codeTool, width = 76) {
3919
+ function renderToolModeHero(codeTool, width = 76, runtimeSummary) {
3911
3920
  const meta = getToolModeMeta(codeTool);
3921
+ const content = [
3922
+ colors.itemText(meta.summary),
3923
+ `${colors.shortcut("Focus")} ${colors.itemText(meta.focus)}`,
3924
+ `${colors.shortcut("Config")} ${colors.itemText(meta.config)}`
3925
+ ];
3926
+ if (runtimeSummary?.runtimeLabel) {
3927
+ content.push(`${colors.shortcut("Runtime")} ${colors.itemText(runtimeSummary.runtimeLabel)}`);
3928
+ }
3929
+ if (runtimeSummary?.profileLabel) {
3930
+ content.push(`${colors.shortcut("Profile")} ${colors.itemText(runtimeSummary.profileLabel)}`);
3931
+ }
3932
+ if (runtimeSummary?.routeLabel) {
3933
+ content.push(`${colors.shortcut("Route")} ${colors.itemText(runtimeSummary.routeLabel)}`);
3934
+ }
3935
+ if (runtimeSummary?.modelLabel) {
3936
+ content.push(`${colors.shortcut("Models")} ${colors.itemText(runtimeSummary.modelLabel)}`);
3937
+ }
3912
3938
  return renderBox(
3913
3939
  `${meta.icon} ${meta.title}`,
3914
- [
3915
- colors.itemText(meta.summary),
3916
- `${colors.shortcut("Focus")} ${colors.itemText(meta.focus)}`,
3917
- `${colors.shortcut("Config")} ${colors.itemText(meta.config)}`
3918
- ],
3940
+ content,
3919
3941
  width
3920
3942
  );
3921
3943
  }
@@ -4126,7 +4148,7 @@ function attachHandlers(items, codeTool) {
4126
4148
  await configureCodexMcp();
4127
4149
  return;
4128
4150
  }
4129
- await (await import('./mcp.mjs')).mcpStatus({});
4151
+ await (await import('./features.mjs')).configureMcpFeature();
4130
4152
  }
4131
4153
  };
4132
4154
  case "model-config":
@@ -4332,6 +4354,29 @@ function getProgressiveFooterCommands(codeTool) {
4332
4354
  }
4333
4355
  ];
4334
4356
  }
4357
+ function buildMyclaudeRuntimeSummary(syncResult) {
4358
+ if (!syncResult?.activeProfile) {
4359
+ return {
4360
+ runtimeLabel: "myclaude / no active provider synced"
4361
+ };
4362
+ }
4363
+ const profile = syncResult.activeProfile;
4364
+ const routeFamily = profile.baseUrl ? "OpenAI-compatible gateway" : "Official runtime route";
4365
+ const primaryModel = typeof profile.primaryModel === "string" ? profile.primaryModel : profile.model;
4366
+ const fastModel = typeof profile.defaultHaikuModel === "string" ? profile.defaultHaikuModel : profile.fastModel;
4367
+ const sonnetModel = typeof profile.defaultSonnetModel === "string" ? profile.defaultSonnetModel : void 0;
4368
+ const modelParts = [
4369
+ primaryModel ? `primary ${primaryModel}` : void 0,
4370
+ fastModel ? `fast ${fastModel}` : void 0,
4371
+ sonnetModel ? `exec ${sonnetModel}` : void 0
4372
+ ].filter(Boolean);
4373
+ return {
4374
+ runtimeLabel: "myclaude",
4375
+ profileLabel: `${profile.name} (${syncResult.activeProfileId || profile.id})`,
4376
+ routeLabel: profile.baseUrl ? `${routeFamily} \xB7 ${profile.baseUrl}` : routeFamily,
4377
+ modelLabel: modelParts.join(" \xB7 ") || void 0
4378
+ };
4379
+ }
4335
4380
  function getMenuShellConfig(codeTool) {
4336
4381
  if (codeTool === "codex" || codeTool === "myclaude") {
4337
4382
  return {
@@ -4348,7 +4393,7 @@ function getMenuShellConfig(codeTool) {
4348
4393
  showHero: false
4349
4394
  };
4350
4395
  }
4351
- async function showProgressiveMenu(codeTool) {
4396
+ async function showProgressiveMenu(codeTool, runtimeSyncResult) {
4352
4397
  if (codeTool !== "codex" && codeTool !== "myclaude") {
4353
4398
  const rawItems2 = getItemsForLevel(menuState.level, "claude-code");
4354
4399
  const items2 = attachHandlers(rawItems2, "claude-code");
@@ -4438,7 +4483,7 @@ async function showProgressiveMenu(codeTool) {
4438
4483
  const menuShell = getMenuShellConfig(codeTool);
4439
4484
  const allowedCommands = ["0", "q", ...menuShell.allowMore ? ["m"] : [], ...menuShell.footerCommands.map((command) => command.key)];
4440
4485
  if (menuShell.showHero) {
4441
- console.log(renderToolModeHero(codeTool));
4486
+ console.log(renderToolModeHero(codeTool, 76, codeTool === "myclaude" ? buildMyclaudeRuntimeSummary(runtimeSyncResult) : void 0));
4442
4487
  console.log("");
4443
4488
  }
4444
4489
  const menuOutput = renderMenu(
@@ -5214,6 +5259,7 @@ async function showMainMenu(options = {}) {
5214
5259
  if (await isFirstTimeUser()) {
5215
5260
  await runOnboardingWizard({ preferredCodeTool: options.codeType });
5216
5261
  }
5262
+ let myclaudeRuntimeSyncResult = null;
5217
5263
  try {
5218
5264
  const previousType = getCurrentCodeTool();
5219
5265
  const resolvedType = await resolveStartupCodeType({
@@ -5226,6 +5272,10 @@ async function showMainMenu(options = {}) {
5226
5272
  console.log(a.green(`\u2714 Switched to ${resolvedType}`));
5227
5273
  }
5228
5274
  }
5275
+ if (resolvedType === "myclaude") {
5276
+ const { syncMyclaudeProviderProfilesFromCurrentClaudeConfig } = await import('./config.mjs').then(function (n) { return n.E; });
5277
+ myclaudeRuntimeSyncResult = syncMyclaudeProviderProfilesFromCurrentClaudeConfig();
5278
+ }
5229
5279
  } catch (err) {
5230
5280
  const errorMessage = err instanceof Error ? err.message : String(err);
5231
5281
  console.error(a.yellow(errorMessage));
@@ -5234,7 +5284,11 @@ async function showMainMenu(options = {}) {
5234
5284
  while (!exitMenu) {
5235
5285
  const codeTool = getCurrentCodeTool();
5236
5286
  displayBannerWithInfo(CODE_TOOL_BANNERS[codeTool] || "CCJK");
5237
- const result = await showProgressiveMenu(codeTool);
5287
+ if (codeTool === "myclaude") {
5288
+ const { syncMyclaudeProviderProfilesFromCurrentClaudeConfig } = await import('./config.mjs').then(function (n) { return n.E; });
5289
+ myclaudeRuntimeSyncResult = syncMyclaudeProviderProfilesFromCurrentClaudeConfig();
5290
+ }
5291
+ const result = await showProgressiveMenu(codeTool, myclaudeRuntimeSyncResult);
5238
5292
  if (result === "exit") {
5239
5293
  exitMenu = true;
5240
5294
  } else if (result === "switch") {