ccjk 13.3.8 → 13.3.10

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/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  # 🚀 CCJK
4
4
 
5
- ### Claude Code just got superpowers
5
+ ### Turn Claude Code into a production-ready AI dev environment
6
6
 
7
- **One command. Minimal config. 10x productivity.**
7
+ **One command setup · Persistent memory · MCP automation · Cloud sync**
8
8
 
9
9
  <br/>
10
10
 
@@ -18,6 +18,7 @@ npx ccjk
18
18
  [![downloads](https://img.shields.io/npm/dm/ccjk?style=flat-square&color=cb3837)](https://www.npmjs.com/package/ccjk)
19
19
  [![license](https://img.shields.io/github/license/miounet11/ccjk?style=flat-square)](./LICENSE)
20
20
  [![stars](https://img.shields.io/github/stars/miounet11/ccjk?style=flat-square)](https://github.com/miounet11/ccjk/stargazers)
21
+ [![Agent Browser](https://img.shields.io/badge/agent--browser-ready-111827?style=flat-square)](https://github.com/vercel-labs/agent-browser)
21
22
 
22
23
  [English](./README.en.md) · [中文](./README.zh-CN.md) · [日本語](./README.ja.md)
23
24
 
@@ -25,6 +26,14 @@ npx ccjk
25
26
 
26
27
  ---
27
28
 
29
+ ## ✨ Why CCJK
30
+
31
+ - **30-second onboarding** for Claude Code, Codex, MCP services, and browser automation
32
+ - **Persistent project memory** so your AI stops forgetting architecture and conventions
33
+ - **Smarter model + context usage** to cut waste and keep long sessions usable
34
+ - **Cloud sync and remote control** so your setup follows you across devices
35
+ - **Production-ready defaults** with hardened config, validation, and safer automation
36
+
28
37
  ## 💡 What is CCJK?
29
38
 
30
39
  The **missing toolkit** for [Claude Code](https://github.com/anthropics/claude-code) that developers actually want:
@@ -54,6 +63,13 @@ npx ccjk init --silent
54
63
  # Done. Claude Code is now 10x smarter.
55
64
  ```
56
65
 
66
+ ```bash
67
+ # Popular one-liners
68
+ npx ccjk init --silent
69
+ npx ccjk boost
70
+ npx ccjk browser open https://example.com --headed
71
+ ```
72
+
57
73
  **What just happened?**
58
74
  - ✅ Auto-detected your project type (React/Vue/Node/Python/Go/Rust/etc)
59
75
  - ✅ Configured optimal MCP services for your stack
@@ -96,6 +112,13 @@ npx ccjk init --silent
96
112
  | 📱 "Can't control Claude from my phone" | 🌐 **Remote Control** | Web/App control with one-command setup |
97
113
  | 🔐 "Worried about production security" | 🛡️ **Production-Grade Security** | HTTPS enforcement, CORS hardening, secrets validation |
98
114
 
115
+ ## 🏆 Built For Real Work
116
+
117
+ - **Claude Code users** who want setup done once, correctly
118
+ - **Teams** who need repeatable onboarding and shared conventions
119
+ - **Power users** who want memory, MCP, browser automation, and multi-agent workflows in one CLI
120
+ - **API users** who care about reducing token waste without losing context quality
121
+
99
122
  ## 🔥 Features That Matter
100
123
 
101
124
  ### 🧠 Persistent Memory
@@ -1,6 +1,6 @@
1
1
  import a from './index2.mjs';
2
2
  import { i18n } from './index5.mjs';
3
- import { d as configureApi, g as getExistingApiConfig } from './config.mjs';
3
+ import { e as configureApi, g as getExistingApiConfig } from './config.mjs';
4
4
  import { g as getAllPresets } from '../shared/ccjk.DopKzo3z.mjs';
5
5
  import '../shared/ccjk.BAGoDD49.mjs';
6
6
  import 'node:fs';
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
- import { n as needsMigration, m as migrateSettingsForTokenRetrieval } from '../shared/ccjk.DxWqH-EF.mjs';
4
+ import { n as needsMigration, m as migrateSettingsForTokenRetrieval } from '../shared/ccjk.DwbhKZGA.mjs';
5
5
  import './index2.mjs';
6
6
  import '../shared/ccjk.BAGoDD49.mjs';
7
7
  import './constants.mjs';
@@ -52,10 +52,10 @@ import './smart-defaults.mjs';
52
52
  import '../shared/ccjk.DJuyfrlL.mjs';
53
53
  import './config2.mjs';
54
54
  import './init.mjs';
55
- import '../shared/ccjk.DfZKjHvG.mjs';
55
+ import '../shared/ccjk.CvIIxgUS.mjs';
56
56
  import './auto-updater.mjs';
57
57
  import './version-checker.mjs';
58
- import '../shared/ccjk.DxWqH-EF.mjs';
58
+ import '../shared/ccjk.DwbhKZGA.mjs';
59
59
  import './claude-code-config-manager.mjs';
60
60
  import './installer.mjs';
61
61
  import '../shared/ccjk._dESH4Rk.mjs';
@@ -78,7 +78,7 @@ import './uninstall.mjs';
78
78
  import '../shared/ccjk.CvChMYvB.mjs';
79
79
  import 'globby';
80
80
  import './update.mjs';
81
- import '../shared/ccjk.KpFl2RDA.mjs';
81
+ import '../shared/ccjk.BHBpQsHd.mjs';
82
82
 
83
83
  async function ccr(options = {}) {
84
84
  try {
@@ -1,7 +1,7 @@
1
1
  import { d as dayjs } from '../shared/ccjk.RyizuzOI.mjs';
2
2
  import { ZCF_CONFIG_FILE, ZCF_CONFIG_DIR, SETTINGS_FILE } from './constants.mjs';
3
3
  import { readDefaultTomlConfig, createDefaultTomlConfig, writeTomlConfig } from './ccjk-config.mjs';
4
- import { a as clearModelEnv } from './config.mjs';
4
+ import { a as clearModelEnv, d as applyAdaptiveModelEnv, n as normalizeAdaptiveModelSettings } from './config.mjs';
5
5
  import { ensureDir, exists, copyFile } from './fs-operations.mjs';
6
6
  import { readJsonConfig } from './json-config.mjs';
7
7
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
@@ -206,7 +206,7 @@ class ClaudeCodeConfigManager {
206
206
  ensureI18nInitialized();
207
207
  try {
208
208
  if (!profile) {
209
- const { switchToOfficialLogin } = await import('./config.mjs').then(function (n) { return n.k; });
209
+ const { switchToOfficialLogin } = await import('./config.mjs').then(function (n) { return n.l; });
210
210
  switchToOfficialLogin();
211
211
  return;
212
212
  }
@@ -243,22 +243,20 @@ class ClaudeCodeConfigManager {
243
243
  delete settings.env.ANTHROPIC_BASE_URL;
244
244
  }
245
245
  const hasAdaptiveModelConfig = Boolean(
246
- profile.defaultHaikuModel || profile.defaultSonnetModel || profile.defaultOpusModel
246
+ profile.primaryModel || profile.defaultHaikuModel || profile.defaultSonnetModel || profile.defaultOpusModel
247
247
  );
248
248
  if (hasAdaptiveModelConfig) {
249
249
  delete settings.model;
250
- if (profile.defaultHaikuModel)
251
- settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = profile.defaultHaikuModel;
252
- if (profile.defaultSonnetModel)
253
- settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = profile.defaultSonnetModel;
254
- if (profile.defaultOpusModel)
255
- settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = profile.defaultOpusModel;
256
- } else if (profile.primaryModel) {
257
- delete settings.model;
258
- settings.env.ANTHROPIC_MODEL = profile.primaryModel;
250
+ applyAdaptiveModelEnv(settings.env, {
251
+ primaryModel: profile.primaryModel,
252
+ defaultHaikuModel: profile.defaultHaikuModel,
253
+ defaultSonnetModel: profile.defaultSonnetModel,
254
+ defaultOpusModel: profile.defaultOpusModel
255
+ });
259
256
  } else {
260
257
  clearModelEnv(settings.env);
261
258
  }
259
+ normalizeAdaptiveModelSettings(settings);
262
260
  writeJsonConfig(SETTINGS_FILE, settings);
263
261
  const { setPrimaryApiKey, addCompletedOnboarding } = await import('./claude-config.mjs').then(function (n) { return n.h; });
264
262
  setPrimaryApiKey();
@@ -4,7 +4,7 @@ import { ensureI18nInitialized, i18n } from './index5.mjs';
4
4
  import { ClaudeCodeConfigManager } from './claude-code-config-manager.mjs';
5
5
  import { a as addNumbersToChoices } from '../shared/ccjk.BFQ7yr5S.mjs';
6
6
  import { p as promptBoolean } from '../shared/ccjk.BWFpnOr3.mjs';
7
- import { v as validateApiKey } from '../shared/ccjk.DfZKjHvG.mjs';
7
+ import { v as validateApiKey } from '../shared/ccjk.CvIIxgUS.mjs';
8
8
  import '../shared/ccjk.BAGoDD49.mjs';
9
9
  import 'node:readline';
10
10
  import 'stream';
@@ -10,7 +10,7 @@ import { x as K } from './main.mjs';
10
10
  import { CODEX_AUTH_FILE, SUPPORTED_LANGS, CODEX_DIR, CODEX_AGENTS_FILE, CODEX_PROMPTS_DIR, CODEX_CONFIG_FILE, AI_OUTPUT_LANGUAGES, ZCF_CONFIG_FILE } from './constants.mjs';
11
11
  import { ensureI18nInitialized, i18n, format } from './index5.mjs';
12
12
  import { updateZcfConfig, readZcfConfig, readDefaultTomlConfig, updateTomlConfig } from './ccjk-config.mjs';
13
- import { e as applyAiLanguageDirective } from './config.mjs';
13
+ import { f as applyAiLanguageDirective } from './config.mjs';
14
14
  import { exists, readFile, ensureDir, writeFileAtomic, writeFile, copyFile, copyDir } from './fs-operations.mjs';
15
15
  import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
16
16
  import { k as isWindows, m as getMcpCommand, l as getSystemRoot, w as wrapCommandWithSudo, n as normalizeTomlPath } from './platform.mjs';
@@ -12,11 +12,10 @@ import { j as join, d as dirname } from '../shared/ccjk.bQ7Dh1g4.mjs';
12
12
 
13
13
  const MODEL_ENV_KEYS = [
14
14
  "ANTHROPIC_MODEL",
15
+ "ANTHROPIC_SMALL_FAST_MODEL",
15
16
  "ANTHROPIC_DEFAULT_HAIKU_MODEL",
16
17
  "ANTHROPIC_DEFAULT_SONNET_MODEL",
17
- "ANTHROPIC_DEFAULT_OPUS_MODEL",
18
- // Deprecated but still cleaned to avoid stale values
19
- "ANTHROPIC_SMALL_FAST_MODEL"
18
+ "ANTHROPIC_DEFAULT_OPUS_MODEL"
20
19
  ];
21
20
  function clearModelEnv(env) {
22
21
  for (const key of MODEL_ENV_KEYS) {
@@ -24,6 +23,43 @@ function clearModelEnv(env) {
24
23
  }
25
24
  }
26
25
 
26
+ function applyAdaptiveModelEnv(env, models) {
27
+ const primaryModel = models.primaryModel?.trim();
28
+ const defaultHaikuModel = models.defaultHaikuModel?.trim();
29
+ const defaultSonnetModel = models.defaultSonnetModel?.trim();
30
+ const defaultOpusModel = models.defaultOpusModel?.trim();
31
+ if (primaryModel) {
32
+ env.ANTHROPIC_MODEL = primaryModel;
33
+ }
34
+ if (defaultHaikuModel) {
35
+ env.ANTHROPIC_SMALL_FAST_MODEL = defaultHaikuModel;
36
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = defaultHaikuModel;
37
+ }
38
+ if (defaultSonnetModel) {
39
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = defaultSonnetModel;
40
+ }
41
+ if (defaultOpusModel) {
42
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = defaultOpusModel;
43
+ }
44
+ cleanAdaptiveModelEnv(env);
45
+ }
46
+ function cleanAdaptiveModelEnv(env) {
47
+ for (const key of MODEL_ENV_KEYS) {
48
+ const value = env[key];
49
+ if (typeof value === "string" && value.trim() === "") {
50
+ delete env[key];
51
+ }
52
+ }
53
+ }
54
+ function normalizeAdaptiveModelSettings(settings) {
55
+ if (settings.env) {
56
+ cleanAdaptiveModelEnv(settings.env);
57
+ }
58
+ if (settings.model === "default") {
59
+ delete settings.model;
60
+ }
61
+ }
62
+
27
63
  function ensureClaudeDir() {
28
64
  ensureDir(CLAUDE_DIR);
29
65
  }
@@ -158,12 +194,13 @@ function updateCustomModel(primaryModel, haikuModel, sonnetModel, opusModel) {
158
194
  delete settings.model;
159
195
  settings.env = settings.env || {};
160
196
  clearModelEnv(settings.env);
161
- if (haikuModel?.trim())
162
- settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = haikuModel.trim();
163
- if (sonnetModel?.trim())
164
- settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = sonnetModel.trim();
165
- if (opusModel?.trim())
166
- settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = opusModel.trim();
197
+ applyAdaptiveModelEnv(settings.env, {
198
+ primaryModel,
199
+ defaultHaikuModel: haikuModel,
200
+ defaultSonnetModel: sonnetModel,
201
+ defaultOpusModel: opusModel
202
+ });
203
+ normalizeAdaptiveModelSettings(settings);
167
204
  writeJsonConfig(SETTINGS_FILE, settings);
168
205
  }
169
206
  function updateDefaultModel(model) {
@@ -183,6 +220,7 @@ function updateDefaultModel(model) {
183
220
  } else {
184
221
  settings.model = model;
185
222
  }
223
+ normalizeAdaptiveModelSettings(settings);
186
224
  writeJsonConfig(SETTINGS_FILE, settings);
187
225
  }
188
226
  function mergeSettingsFile(templatePath, targetPath) {
@@ -267,6 +305,7 @@ function getExistingCustomModelConfig() {
267
305
  }
268
306
  const {
269
307
  ANTHROPIC_MODEL,
308
+ ANTHROPIC_SMALL_FAST_MODEL,
270
309
  ANTHROPIC_DEFAULT_HAIKU_MODEL,
271
310
  ANTHROPIC_DEFAULT_SONNET_MODEL,
272
311
  ANTHROPIC_DEFAULT_OPUS_MODEL
@@ -276,7 +315,7 @@ function getExistingCustomModelConfig() {
276
315
  }
277
316
  return {
278
317
  primaryModel: ANTHROPIC_MODEL,
279
- haikuModel: ANTHROPIC_DEFAULT_HAIKU_MODEL,
318
+ haikuModel: ANTHROPIC_DEFAULT_HAIKU_MODEL || ANTHROPIC_SMALL_FAST_MODEL,
280
319
  sonnetModel: ANTHROPIC_DEFAULT_SONNET_MODEL,
281
320
  opusModel: ANTHROPIC_DEFAULT_OPUS_MODEL
282
321
  };
@@ -396,4 +435,4 @@ const config = {
396
435
  updateDefaultModel: updateDefaultModel
397
436
  };
398
437
 
399
- export { clearModelEnv as a, backupExistingConfig as b, copyConfigFiles as c, configureApi as d, applyAiLanguageDirective as e, getExistingModelConfig as f, getExistingApiConfig as g, getExistingCustomModelConfig as h, updateDefaultModel as i, ensureClaudeDir as j, config as k, promptApiConfigurationAction as p, switchToOfficialLogin as s, updateCustomModel as u };
438
+ export { clearModelEnv as a, backupExistingConfig as b, copyConfigFiles as c, applyAdaptiveModelEnv as d, configureApi as e, applyAiLanguageDirective as f, getExistingApiConfig as g, getExistingModelConfig as h, getExistingCustomModelConfig as i, updateDefaultModel as j, ensureClaudeDir as k, config as l, normalizeAdaptiveModelSettings as n, promptApiConfigurationAction as p, switchToOfficialLogin as s, updateCustomModel as u };
@@ -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.k; });
817
+ const { copyConfigFiles } = await import('./config.mjs').then(function (n) { return n.l; });
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)));
@@ -3,7 +3,7 @@ import process__default from 'node:process';
3
3
  import a from './index2.mjs';
4
4
  import { i as inquirer } from './index3.mjs';
5
5
  import { m as runCodexFullInit, k as selectMcpServices, g as getMcpServices, M as MCP_SERVICE_CONFIGS } from './codex.mjs';
6
- import { m as modifyApiConfigPartially, a as configureApiCompletely, s as selectAndInstallWorkflows, c as configureOutputStyle, f as formatApiKeyDisplay, W as WORKFLOW_CONFIG_BASE } from '../shared/ccjk.DfZKjHvG.mjs';
6
+ import { m as modifyApiConfigPartially, a as configureApiCompletely, s as selectAndInstallWorkflows, c as configureOutputStyle, f as formatApiKeyDisplay, W as WORKFLOW_CONFIG_BASE } from '../shared/ccjk.CvIIxgUS.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';
9
9
  import { displayBannerWithInfo, padToDisplayWidth } from './banner.mjs';
@@ -17,8 +17,8 @@ import { a as addCompletedOnboarding, s as setPrimaryApiKey, c as backupMcpConfi
17
17
  import { r as resolveCodeType } from '../shared/ccjk.Cjj8SVrn.mjs';
18
18
  import { exists } from './fs-operations.mjs';
19
19
  import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
20
- import { p as promptApiConfigurationAction, j as ensureClaudeDir, g as getExistingApiConfig, s as switchToOfficialLogin, b as backupExistingConfig, c as copyConfigFiles, e as applyAiLanguageDirective, d as configureApi } from './config.mjs';
21
- import { n as needsMigration, m as migrateSettingsForTokenRetrieval, d as displayMigrationResult, p as promptMigration } from '../shared/ccjk.DxWqH-EF.mjs';
20
+ import { p as promptApiConfigurationAction, k as ensureClaudeDir, g as getExistingApiConfig, s as switchToOfficialLogin, b as backupExistingConfig, c as copyConfigFiles, f as applyAiLanguageDirective, e as configureApi } from './config.mjs';
21
+ import { n as needsMigration, m as migrateSettingsForTokenRetrieval, d as displayMigrationResult, p as promptMigration } from '../shared/ccjk.DwbhKZGA.mjs';
22
22
  import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.BIxuVL3_.mjs';
23
23
  import { getInstallationStatus, installClaudeCode } from './installer.mjs';
24
24
  import { p as parseOrchestrationLevel, w as writeOrchestrationPolicy } from './smart-defaults.mjs';
@@ -1030,7 +1030,7 @@ async function init(options = {}) {
1030
1030
  const hasModelParams = options.apiModel || options.apiHaikuModel || options.apiSonnetModel || options.apiOpusModel;
1031
1031
  if (hasModelParams && action !== "docs-only" && codeToolType === "claude-code") {
1032
1032
  if (options.skipPrompt) {
1033
- const { updateCustomModel } = await import('./config.mjs').then(function (n) { return n.k; });
1033
+ const { updateCustomModel } = await import('./config.mjs').then(function (n) { return n.l; });
1034
1034
  updateCustomModel(
1035
1035
  options.apiModel || void 0,
1036
1036
  options.apiHaikuModel || void 0,
@@ -2,7 +2,7 @@ import a from './index2.mjs';
2
2
  import { g as getMcpServices } from './codex.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.KpFl2RDA.mjs';
5
+ import { i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.BHBpQsHd.mjs';
6
6
  import '../shared/ccjk.BAGoDD49.mjs';
7
7
  import 'node:process';
8
8
  import 'node:url';
@@ -6,7 +6,7 @@ import { M as MCP_SERVICE_TIERS, i as isCoreService, g as getServicesByTier, c a
6
6
  import { r as readMcpConfig, c as backupMcpConfig, w as writeMcpConfig } from './claude-config.mjs';
7
7
  import { i as inquirer } from './index3.mjs';
8
8
  import { M as MCP_SERVICE_CONFIGS } from './codex.mjs';
9
- import { d as displayInstalledMcpServices, b as isMcpServiceInstalled, i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.KpFl2RDA.mjs';
9
+ import { d as displayInstalledMcpServices, b as isMcpServiceInstalled, i as installMcpService, u as uninstallMcpService } from '../shared/ccjk.BHBpQsHd.mjs';
10
10
  import { existsSync, unlinkSync, statSync, mkdirSync, readFileSync } from 'node:fs';
11
11
  import { homedir } from 'node:os';
12
12
  import { writeFileAtomic } from './fs-operations.mjs';
@@ -52,10 +52,10 @@ import '../shared/ccjk.DJuyfrlL.mjs';
52
52
  import '../shared/ccjk.BIxuVL3_.mjs';
53
53
  import './config2.mjs';
54
54
  import './init.mjs';
55
- import '../shared/ccjk.DfZKjHvG.mjs';
55
+ import '../shared/ccjk.CvIIxgUS.mjs';
56
56
  import './auto-updater.mjs';
57
57
  import './version-checker.mjs';
58
- import '../shared/ccjk.DxWqH-EF.mjs';
58
+ import '../shared/ccjk.DwbhKZGA.mjs';
59
59
  import './claude-code-config-manager.mjs';
60
60
  import './installer.mjs';
61
61
  import '../shared/ccjk._dESH4Rk.mjs';
@@ -78,7 +78,7 @@ import './uninstall.mjs';
78
78
  import '../shared/ccjk.CvChMYvB.mjs';
79
79
  import 'globby';
80
80
  import './update.mjs';
81
- import '../shared/ccjk.KpFl2RDA.mjs';
81
+ import '../shared/ccjk.BHBpQsHd.mjs';
82
82
 
83
83
  function renderMenuHeader(context, _isZh) {
84
84
  const title = context.breadcrumb.join(i18n.t("menu:menu.breadcrumb.separator"));
@@ -13,8 +13,8 @@ import { h as handleExitPromptError, a as handleGeneralError } from '../shared/c
13
13
  import { homedir } from 'node:os';
14
14
  import { setupCcrConfiguration, readCcrConfig, configureCcrFeature } from './config2.mjs';
15
15
  import { a as isCcrInstalled, b as installCcr, i as init } from './init.mjs';
16
- import { e as applyAiLanguageDirective, f as getExistingModelConfig, h as getExistingCustomModelConfig, u as updateCustomModel, i as updateDefaultModel, g as getExistingApiConfig, p as promptApiConfigurationAction, d as configureApi, s as switchToOfficialLogin } from './config.mjs';
17
- import { c as configureOutputStyle, m as modifyApiConfigPartially, v as validateApiKey, f as formatApiKeyDisplay } from '../shared/ccjk.DfZKjHvG.mjs';
16
+ import { f as applyAiLanguageDirective, h as getExistingModelConfig, i as getExistingCustomModelConfig, u as updateCustomModel, j as updateDefaultModel, g as getExistingApiConfig, p as promptApiConfigurationAction, e as configureApi, s as switchToOfficialLogin } from './config.mjs';
17
+ import { c as configureOutputStyle, m as modifyApiConfigPartially, v as validateApiKey, f as formatApiKeyDisplay } from '../shared/ccjk.CvIIxgUS.mjs';
18
18
  import { k as isWindows } from './platform.mjs';
19
19
  import { a as addNumbersToChoices } from '../shared/ccjk.BFQ7yr5S.mjs';
20
20
  import { openSettingsJson, importRecommendedPermissions, importRecommendedEnv } from './simple-config.mjs';
@@ -79,7 +79,7 @@ async function runOnboardingWizard(options = {}) {
79
79
  console.log(a.bold(`${isZh ? "\u6B65\u9AA4 2/3" : "Step 2/3"}: ${isZh ? "API \u914D\u7F6E" : "API Configuration"}${step2Done ? a.green(" \u2714") : ""}`));
80
80
  if (!step2Done) {
81
81
  try {
82
- const { getExistingApiConfig } = await import('./config.mjs').then(function (n) { return n.k; });
82
+ const { getExistingApiConfig } = await import('./config.mjs').then(function (n) { return n.l; });
83
83
  const existing = getExistingApiConfig();
84
84
  if (existing?.key || existing?.url) {
85
85
  console.log(a.green(` \u2714 ${isZh ? "\u5DF2\u914D\u7F6E" : "Already configured"}`));
@@ -1,3 +1,3 @@
1
- const version = "13.3.8";
1
+ const version = "13.3.10";
2
2
 
3
3
  export { version };
@@ -47,13 +47,13 @@ import '../shared/ccjk.DScm_NnL.mjs';
47
47
  import '../shared/ccjk.BFQ7yr5S.mjs';
48
48
  import './prompts.mjs';
49
49
  import '../shared/ccjk.BWFpnOr3.mjs';
50
- import '../shared/ccjk.DfZKjHvG.mjs';
50
+ import '../shared/ccjk.CvIIxgUS.mjs';
51
51
  import './banner.mjs';
52
52
  import './config2.mjs';
53
53
  import './auto-updater.mjs';
54
54
  import './version-checker.mjs';
55
55
  import '../shared/ccjk.Cjj8SVrn.mjs';
56
- import '../shared/ccjk.DxWqH-EF.mjs';
56
+ import '../shared/ccjk.DwbhKZGA.mjs';
57
57
  import './claude-code-config-manager.mjs';
58
58
  import '../shared/ccjk.BIxuVL3_.mjs';
59
59
  import './installer.mjs';
@@ -122,7 +122,7 @@ function getSlashCommands() {
122
122
  descriptionZh: "\u521B\u5EFA\u914D\u7F6E\u5907\u4EFD",
123
123
  category: "system",
124
124
  handler: async () => {
125
- const { backupExistingConfig } = await import('./config.mjs').then(function (n) { return n.k; });
125
+ const { backupExistingConfig } = await import('./config.mjs').then(function (n) { return n.l; });
126
126
  const backupPath = backupExistingConfig();
127
127
  if (backupPath) {
128
128
  console.log(a.green(`\u2705 Backup created: ${backupPath}`));
@@ -8,10 +8,10 @@ import { displayBanner } from './banner.mjs';
8
8
  import { readZcfConfig, updateZcfConfig } from './ccjk-config.mjs';
9
9
  import { r as readMcpConfig } from './claude-config.mjs';
10
10
  import { c as copyConfigFiles } from './config.mjs';
11
- import { n as needsMigration, m as migrateSettingsForTokenRetrieval, d as displayMigrationResult, p as promptMigration } from '../shared/ccjk.DxWqH-EF.mjs';
12
- import { u as updatePromptOnly, s as selectAndInstallWorkflows } from '../shared/ccjk.DfZKjHvG.mjs';
11
+ import { n as needsMigration, m as migrateSettingsForTokenRetrieval, d as displayMigrationResult, p as promptMigration } from '../shared/ccjk.DwbhKZGA.mjs';
12
+ import { u as updatePromptOnly, s as selectAndInstallWorkflows } from '../shared/ccjk.CvIIxgUS.mjs';
13
13
  import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.BIxuVL3_.mjs';
14
- import { a as installMcpServices } from '../shared/ccjk.KpFl2RDA.mjs';
14
+ import { a as installMcpServices } from '../shared/ccjk.BHBpQsHd.mjs';
15
15
  import { resolveAiOutputLanguage } from './prompts.mjs';
16
16
  import { g as getRuntimeVersion } from '../shared/ccjk.gDEDGD_t.mjs';
17
17
  import { checkClaudeCodeVersionAndPrompt } from './version-checker.mjs';
@@ -13,7 +13,7 @@
13
13
  "services.spec-workflow.name": "Spec Workflow",
14
14
  "services.serena.name": "Serena Assistant",
15
15
  "services.serena.description": "Semantic code retrieval and editing akin to an IDE; extracts symbol-level entities and leverages relations to greatly improve token efficiency with coding agents",
16
- "services.agent-browser.description": "Anthropic official browser automation for web interaction and testing",
16
+ "services.agent-browser.description": "Vercel Labs browser automation for web interaction and testing",
17
17
  "services.agent-browser.name": "Agent Browser",
18
18
  "services.filesystem.name": "Filesystem Operations",
19
19
  "services.filesystem.description": "Read, write, and manage files and directories on the local filesystem",
@@ -13,7 +13,7 @@
13
13
  "services.spec-workflow.name": "Spec 工作流",
14
14
  "services.serena.name": "Serena 助手",
15
15
  "services.serena.description": "提供类似 IDE 的语义代码检索与编辑,支持符号级实体提取与关系结构利用;与现有编码代理配合可显著提升标记效率",
16
- "services.agent-browser.description": "Anthropic 官方浏览器自动化,用于网页交互和测试",
16
+ "services.agent-browser.description": "Vercel Labs 浏览器自动化,用于网页交互和测试",
17
17
  "services.agent-browser.name": "Agent Browser 浏览器自动化",
18
18
  "services.filesystem.name": "文件系统操作",
19
19
  "services.filesystem.description": "读取、写入和管理本地文件系统中的文件和目录",
package/dist/index.mjs CHANGED
@@ -13,7 +13,7 @@ import { promisify } from 'node:util';
13
13
  import a from './chunks/index2.mjs';
14
14
  import { g as getRuntimeVersion } from './shared/ccjk.gDEDGD_t.mjs';
15
15
  import { j as join$1 } from './shared/ccjk.bQ7Dh1g4.mjs';
16
- export { k as config } from './chunks/config.mjs';
16
+ export { l as config } from './chunks/config.mjs';
17
17
  export { a as loggerUtils } from './shared/ccjk.BJMRY2Ra.mjs';
18
18
  export { p as platform } from './chunks/platform.mjs';
19
19
  import { Transform } from 'node:stream';
@@ -4,6 +4,7 @@ import { h as getMcpService, i as dynamicMcpRegistry, a as readCodexConfig, j as
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';
7
+ import { n as normalizeAdaptiveModelSettings } from '../chunks/config.mjs';
7
8
  import { d as deepMerge, r as readMcpConfig, b as buildMcpServerConfig, w as writeMcpConfig } from '../chunks/claude-config.mjs';
8
9
  import { ensureI18nInitialized, i18n } from '../chunks/index5.mjs';
9
10
  import { k as isWindows, l as getSystemRoot } from '../chunks/platform.mjs';
@@ -22,6 +23,7 @@ function readClaudeConfig(configPath = SETTINGS_FILE) {
22
23
  function writeClaudeConfig(config, options = {}, configPath = SETTINGS_FILE) {
23
24
  try {
24
25
  ensureDir(CLAUDE_DIR);
26
+ normalizeAdaptiveModelSettings(config);
25
27
  writeJsonConfig(configPath, config, {
26
28
  atomic: options.atomic !== false,
27
29
  pretty: true,
@@ -2,7 +2,7 @@ import a from '../chunks/index2.mjs';
2
2
  import { i as inquirer } from '../chunks/index3.mjs';
3
3
  import { CLAUDE_DIR, SETTINGS_FILE } from '../chunks/constants.mjs';
4
4
  import { ensureI18nInitialized, i18n } from '../chunks/index5.mjs';
5
- import { g as getExistingApiConfig, d as configureApi, s as switchToOfficialLogin, b as backupExistingConfig, e as applyAiLanguageDirective } from '../chunks/config.mjs';
5
+ import { g as getExistingApiConfig, e as configureApi, s as switchToOfficialLogin, b as backupExistingConfig, f as applyAiLanguageDirective } from '../chunks/config.mjs';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { updateZcfConfig } from '../chunks/ccjk-config.mjs';
8
8
  import { exists, removeFile, ensureDir, copyFile } from '../chunks/fs-operations.mjs';
@@ -2,7 +2,7 @@ import a from '../chunks/index2.mjs';
2
2
  import { SETTINGS_FILE } from '../chunks/constants.mjs';
3
3
  import { ensureI18nInitialized, i18n } from '../chunks/index5.mjs';
4
4
  import { ClaudeCodeConfigManager } from '../chunks/claude-code-config-manager.mjs';
5
- import { b as backupExistingConfig } from '../chunks/config.mjs';
5
+ import { n as normalizeAdaptiveModelSettings, b as backupExistingConfig } from '../chunks/config.mjs';
6
6
  import { exists } from '../chunks/fs-operations.mjs';
7
7
  import { readJsonConfig, writeJsonConfig } from '../chunks/json-config.mjs';
8
8
 
@@ -25,6 +25,23 @@ function migrateSettingsForTokenRetrieval() {
25
25
  return result;
26
26
  }
27
27
  let modified = false;
28
+ const hadDefaultModelSentinel = settings.model === "default";
29
+ const hadEmptyModelEnv = Boolean(settings.env && [
30
+ settings.env.ANTHROPIC_MODEL,
31
+ settings.env.ANTHROPIC_SMALL_FAST_MODEL,
32
+ settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
33
+ settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL,
34
+ settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL
35
+ ].some((value) => typeof value === "string" && value.trim() === ""));
36
+ normalizeAdaptiveModelSettings(settings);
37
+ if (hadDefaultModelSentinel) {
38
+ result.changes.push('Removed stale settings.model = "default" sentinel so Claude Code falls back to native auto-selection');
39
+ modified = true;
40
+ }
41
+ if (hadEmptyModelEnv) {
42
+ result.changes.push("Removed empty model environment variables left by the template/config merge path");
43
+ modified = true;
44
+ }
28
45
  if (settings.env) {
29
46
  if ("CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC" in settings.env) {
30
47
  delete settings.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC;
@@ -40,12 +57,9 @@ function migrateSettingsForTokenRetrieval() {
40
57
  modified = true;
41
58
  }
42
59
  }
43
- const hasAdaptiveModelDefaults = Boolean(
44
- settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL || settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL || settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL
45
- );
46
- if (hasAdaptiveModelDefaults && settings.env.ANTHROPIC_MODEL) {
47
- delete settings.env.ANTHROPIC_MODEL;
48
- result.changes.push("Removed stale ANTHROPIC_MODEL override so Claude Code can use adaptive Haiku/Sonnet/Opus routing");
60
+ if (settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL && !settings.env.ANTHROPIC_SMALL_FAST_MODEL) {
61
+ settings.env.ANTHROPIC_SMALL_FAST_MODEL = settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;
62
+ result.changes.push("Restored ANTHROPIC_SMALL_FAST_MODEL from defaultHaikuModel so Claude Code can auto-route lightweight requests again");
49
63
  modified = true;
50
64
  }
51
65
  }
@@ -56,20 +70,11 @@ function migrateSettingsForTokenRetrieval() {
56
70
  }
57
71
  const profileConfig = ClaudeCodeConfigManager.readConfig();
58
72
  if (profileConfig) {
59
- let profileModified = false;
60
- for (const [profileId, profile] of Object.entries(profileConfig.profiles)) {
61
- const hasAdaptiveModelDefaults = Boolean(
62
- profile.defaultHaikuModel || profile.defaultSonnetModel || profile.defaultOpusModel
63
- );
64
- if (hasAdaptiveModelDefaults && profile.primaryModel) {
65
- delete profile.primaryModel;
66
- result.changes.push(`Removed stale primaryModel override from Claude Code profile "${profile.name || profileId}"`);
67
- profileModified = true;
68
- }
69
- }
70
- if (profileModified) {
71
- ClaudeCodeConfigManager.writeConfig(profileConfig);
72
- modified = true;
73
+ const hasAdaptiveProfiles = Object.entries(profileConfig.profiles).some(
74
+ ([_profileId, profile]) => Boolean(profile.primaryModel || profile.defaultHaikuModel || profile.defaultSonnetModel || profile.defaultOpusModel)
75
+ );
76
+ if (hasAdaptiveProfiles) {
77
+ result.changes.push("Preserved profile-level primaryModel values; migration now keeps primary routing and restores fast-model compatibility instead of deleting them");
73
78
  }
74
79
  }
75
80
  if (!modified) {
@@ -104,12 +109,12 @@ function needsMigration() {
104
109
  const hasAdaptiveModelDefaults = Boolean(
105
110
  settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL || settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL || settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL
106
111
  );
107
- const hasPinnedAdaptiveOverride = Boolean(settings.env.ANTHROPIC_MODEL && hasAdaptiveModelDefaults) || Boolean(settings.model && hasAdaptiveModelDefaults);
108
- const profileConfig = ClaudeCodeConfigManager.readConfig();
109
- const hasProfilePinnedAdaptiveOverride = Boolean(profileConfig && Object.values(profileConfig.profiles).some(
110
- (profile) => profile.primaryModel && (profile.defaultHaikuModel || profile.defaultSonnetModel || profile.defaultOpusModel)
111
- ));
112
- return Boolean(hasProblematicVar || hasExcessiveTimeout || hasPinnedAdaptiveOverride || hasProfilePinnedAdaptiveOverride);
112
+ const isMissingFastModelCompat = Boolean(
113
+ settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL && !settings.env.ANTHROPIC_SMALL_FAST_MODEL
114
+ );
115
+ const hasPinnedAdaptiveOverride = Boolean(settings.model && hasAdaptiveModelDefaults);
116
+ const hasProfilePinnedAdaptiveOverride = false;
117
+ return Boolean(hasProblematicVar || hasExcessiveTimeout || hasPinnedAdaptiveOverride || hasProfilePinnedAdaptiveOverride || isMissingFastModelCompat);
113
118
  } catch {
114
119
  return false;
115
120
  }
@@ -1,11 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
3
  "description": "CCJK settings template — auto-migrated on upgrade",
4
- "model": "default",
5
4
  "env": {
6
- "ANTHROPIC_DEFAULT_HAIKU_MODEL": "",
7
- "ANTHROPIC_DEFAULT_SONNET_MODEL": "",
8
- "ANTHROPIC_DEFAULT_OPUS_MODEL": "",
9
5
  "CCJK_CONTEXT_OPTIMIZATION": "true",
10
6
  "CCJK_TOOL_COMPRESSION": "true"
11
7
  },
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "ccjk",
3
3
  "type": "module",
4
- "version": "13.3.8",
4
+ "version": "13.3.10",
5
5
  "packageManager": "pnpm@10.17.1",
6
- "description": "CLI toolkit for Claude Code and Codex setup. Simplifies MCP service installation, API configuration, workflow management, and multi-provider support with guided interactive setup.",
6
+ "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
7
  "author": {
8
8
  "name": "CCJK Team",
9
9
  "email": "9248293@gmail.com"
@@ -1,11 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
3
  "description": "CCJK settings template — auto-migrated on upgrade",
4
- "model": "default",
5
4
  "env": {
6
- "ANTHROPIC_DEFAULT_HAIKU_MODEL": "",
7
- "ANTHROPIC_DEFAULT_SONNET_MODEL": "",
8
- "ANTHROPIC_DEFAULT_OPUS_MODEL": "",
9
5
  "CCJK_CONTEXT_OPTIMIZATION": "true",
10
6
  "CCJK_TOOL_COMPRESSION": "true"
11
7
  },