ccman 3.3.9 → 3.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "../core/package.json"() {
16
16
  package_default = {
17
17
  name: "@ccman/core",
18
- version: "3.3.9",
18
+ version: "3.3.11",
19
19
  type: "module",
20
20
  description: "Core business logic for ccman - Manage Codex, Claude Code, Gemini CLI, and MCP configurations",
21
21
  main: "./dist/index.js",
@@ -300,7 +300,7 @@ function writeCodexConfig(provider) {
300
300
  }
301
301
  const providerKey = resolveCodexProviderKey(provider);
302
302
  nextConfig.model_provider = providerKey;
303
- nextConfig.model = provider.model || nextConfig.model || "gpt-5.2-codex";
303
+ nextConfig.model = provider.model || nextConfig.model || "gpt-5.3-codex";
304
304
  nextConfig.model_providers = {
305
305
  [providerKey]: {
306
306
  name: providerKey,
@@ -329,12 +329,51 @@ var init_codex = __esm({
329
329
  __filename = fileURLToPath(import.meta.url);
330
330
  __dirname = path3.dirname(__filename);
331
331
  CODEX_DEFAULT_CONFIG = {
332
- model: "gpt-5.2-codex",
333
- model_reasoning_effort: "high",
334
- model_verbosity: "high",
335
- network_access: "enabled",
332
+ model: "gpt-5.3-codex",
333
+ model_reasoning_effort: "xhigh",
336
334
  disable_response_storage: true,
337
- windows_wsl_setup_acknowledged: true
335
+ sandbox_mode: "danger-full-access",
336
+ windows_wsl_setup_acknowledged: true,
337
+ approval_policy: "never",
338
+ profile: "auto-max",
339
+ file_opener: "vscode",
340
+ web_search: "cached",
341
+ suppress_unstable_features_warning: true,
342
+ history: {
343
+ persistence: "save-all"
344
+ },
345
+ tui: {
346
+ notifications: true
347
+ },
348
+ shell_environment_policy: {
349
+ inherit: "all",
350
+ ignore_default_excludes: false
351
+ },
352
+ sandbox_workspace_write: {
353
+ network_access: true
354
+ },
355
+ features: {
356
+ plan_tool: true,
357
+ apply_patch_freeform: true,
358
+ view_image_tool: true,
359
+ unified_exec: false,
360
+ streamable_shell: false,
361
+ rmcp_client: true,
362
+ elevated_windows_sandbox: true
363
+ },
364
+ profiles: {
365
+ "auto-max": {
366
+ approval_policy: "never",
367
+ sandbox_mode: "workspace-write"
368
+ },
369
+ review: {
370
+ approval_policy: "on-request",
371
+ sandbox_mode: "workspace-write"
372
+ }
373
+ },
374
+ notice: {
375
+ hide_gpt5_1_migration_prompt: true
376
+ }
338
377
  };
339
378
  }
340
379
  });
@@ -748,10 +787,47 @@ var init_opencode = __esm({
748
787
 
749
788
  // ../core/dist/writers/gemini.js
750
789
  import * as fs5 from "fs";
751
- function loadEnvFile(envPath) {
752
- if (!fileExists(envPath))
753
- return {};
754
- const content = fs5.readFileSync(envPath, "utf-8");
790
+ import * as path6 from "path";
791
+ import { fileURLToPath as fileURLToPath3 } from "url";
792
+ function resolveTemplatePath3(relativePath) {
793
+ const candidates = [
794
+ // @ccman/core runtime (dist/writers -> templates)
795
+ path6.resolve(__dirname3, "../../templates", relativePath),
796
+ // Bundled CLI runtime (dist -> dist/templates)
797
+ path6.resolve(__dirname3, "templates", relativePath),
798
+ // Fallback (some bundlers/layouts)
799
+ path6.resolve(__dirname3, "../templates", relativePath)
800
+ ];
801
+ for (const candidate of candidates) {
802
+ if (fs5.existsSync(candidate))
803
+ return candidate;
804
+ }
805
+ return null;
806
+ }
807
+ function loadGeminiSettingsTemplate() {
808
+ try {
809
+ const templatePath = resolveTemplatePath3("gemini/settings.json");
810
+ if (templatePath) {
811
+ const content = fs5.readFileSync(templatePath, "utf-8");
812
+ return JSON.parse(content);
813
+ }
814
+ } catch {
815
+ }
816
+ return GEMINI_SETTINGS_TEMPLATE;
817
+ }
818
+ function loadGeminiEnvTemplate(provider) {
819
+ let templateContent = GEMINI_ENV_TEMPLATE;
820
+ try {
821
+ const templatePath = resolveTemplatePath3("gemini/.env");
822
+ if (templatePath) {
823
+ templateContent = fs5.readFileSync(templatePath, "utf-8");
824
+ }
825
+ } catch {
826
+ }
827
+ const content = templateContent.replaceAll("{{baseUrl}}", provider.baseUrl || "").replaceAll("{{apiKey}}", provider.apiKey || "");
828
+ return parseEnvContent(content);
829
+ }
830
+ function parseEnvContent(content) {
755
831
  const result = {};
756
832
  for (const line of content.split("\n")) {
757
833
  const trimmed = line.trim();
@@ -768,6 +844,12 @@ function loadEnvFile(envPath) {
768
844
  }
769
845
  return result;
770
846
  }
847
+ function loadEnvFile(envPath) {
848
+ if (!fileExists(envPath))
849
+ return {};
850
+ const content = fs5.readFileSync(envPath, "utf-8");
851
+ return parseEnvContent(content);
852
+ }
771
853
  function saveEnvFile(envPath, env) {
772
854
  const lines = [];
773
855
  const keys = Object.keys(env).sort();
@@ -782,18 +864,20 @@ function writeGeminiConfig(provider) {
782
864
  const envPath = getGeminiEnvPath();
783
865
  const dir = getGeminiDir();
784
866
  ensureDir(dir);
785
- let settings = {};
867
+ let userSettings = {};
786
868
  if (fileExists(settingsPath)) {
787
869
  try {
788
870
  const content = fs5.readFileSync(settingsPath, "utf-8");
789
871
  const parsed = JSON.parse(content);
790
872
  if (parsed && typeof parsed === "object") {
791
- settings = parsed;
873
+ userSettings = parsed;
792
874
  }
793
875
  } catch (error) {
794
876
  throw new Error(`\u65E0\u6CD5\u8BFB\u53D6 Gemini settings.json: ${error.message}`);
795
877
  }
796
878
  }
879
+ const settingsTemplate = loadGeminiSettingsTemplate();
880
+ const settings = deepMerge(settingsTemplate, userSettings);
797
881
  if (!settings.ide || typeof settings.ide !== "object") {
798
882
  settings.ide = {};
799
883
  }
@@ -818,15 +902,16 @@ function writeGeminiConfig(provider) {
818
902
  } catch (error) {
819
903
  throw new Error(`\u5199\u5165 Gemini settings.json \u5931\u8D25: ${error.message}`);
820
904
  }
821
- const env = loadEnvFile(envPath);
822
- if (provider.baseUrl && provider.baseUrl.trim().length > 0) {
823
- env.GOOGLE_GEMINI_BASE_URL = provider.baseUrl;
824
- } else {
905
+ const existingEnv = loadEnvFile(envPath);
906
+ const templateEnv = loadGeminiEnvTemplate(provider);
907
+ const env = {
908
+ ...existingEnv,
909
+ ...templateEnv
910
+ };
911
+ if (!templateEnv.GOOGLE_GEMINI_BASE_URL) {
825
912
  delete env.GOOGLE_GEMINI_BASE_URL;
826
913
  }
827
- if (provider.apiKey && provider.apiKey.trim().length > 0) {
828
- env.GEMINI_API_KEY = provider.apiKey;
829
- } else {
914
+ if (!templateEnv.GEMINI_API_KEY) {
830
915
  delete env.GEMINI_API_KEY;
831
916
  }
832
917
  let modelMeta = null;
@@ -854,26 +939,45 @@ function writeGeminiConfig(provider) {
854
939
  }
855
940
  saveEnvFile(envPath, env);
856
941
  }
942
+ var __filename3, __dirname3, GEMINI_SETTINGS_TEMPLATE, GEMINI_ENV_TEMPLATE;
857
943
  var init_gemini2 = __esm({
858
944
  "../core/dist/writers/gemini.js"() {
859
945
  "use strict";
860
946
  init_paths();
861
947
  init_file();
948
+ init_template();
949
+ __filename3 = fileURLToPath3(import.meta.url);
950
+ __dirname3 = path6.dirname(__filename3);
951
+ GEMINI_SETTINGS_TEMPLATE = {
952
+ ide: {
953
+ enabled: true
954
+ },
955
+ security: {
956
+ auth: {
957
+ selectedType: "gemini-api-key"
958
+ }
959
+ }
960
+ };
961
+ GEMINI_ENV_TEMPLATE = [
962
+ "# Managed by ccman",
963
+ "GOOGLE_GEMINI_BASE_URL={{baseUrl}}",
964
+ "GEMINI_API_KEY={{apiKey}}"
965
+ ].join("\n");
862
966
  }
863
967
  });
864
968
 
865
969
  // ../core/dist/writers/opencode.js
866
970
  import * as fs6 from "fs";
867
- import * as path6 from "path";
868
- import { fileURLToPath as fileURLToPath3 } from "url";
869
- function resolveTemplatePath3(relativePath) {
971
+ import * as path7 from "path";
972
+ import { fileURLToPath as fileURLToPath4 } from "url";
973
+ function resolveTemplatePath4(relativePath) {
870
974
  const candidates = [
871
975
  // @ccman/core runtime (dist/writers -> templates)
872
- path6.resolve(__dirname3, "../../templates", relativePath),
976
+ path7.resolve(__dirname4, "../../templates", relativePath),
873
977
  // Bundled CLI runtime (dist -> dist/templates)
874
- path6.resolve(__dirname3, "templates", relativePath),
978
+ path7.resolve(__dirname4, "templates", relativePath),
875
979
  // Fallback (some bundlers/layouts)
876
- path6.resolve(__dirname3, "../templates", relativePath)
980
+ path7.resolve(__dirname4, "../templates", relativePath)
877
981
  ];
878
982
  for (const candidate of candidates) {
879
983
  if (fs6.existsSync(candidate))
@@ -883,7 +987,7 @@ function resolveTemplatePath3(relativePath) {
883
987
  }
884
988
  function loadOpenCodeTemplateConfig() {
885
989
  try {
886
- const templatePath = resolveTemplatePath3("opencode/opencode.json");
990
+ const templatePath = resolveTemplatePath4("opencode/opencode.json");
887
991
  if (templatePath) {
888
992
  const content = fs6.readFileSync(templatePath, "utf-8");
889
993
  const parsed = JSON.parse(content);
@@ -975,7 +1079,7 @@ function writeOpenCodeConfig(provider) {
975
1079
  };
976
1080
  writeJSON(configPath, nextConfig);
977
1081
  }
978
- var OPENCODE_SCHEMA, OPENCODE_PROVIDER_KEY, OPENCODE_MODEL, OPENCODE_MODEL_KEY, __filename3, __dirname3, DEFAULT_MODELS, OPENCODE_CONFIG_TEMPLATE;
1082
+ var OPENCODE_SCHEMA, OPENCODE_PROVIDER_KEY, OPENCODE_MODEL, OPENCODE_MODEL_KEY, __filename4, __dirname4, DEFAULT_MODELS, OPENCODE_CONFIG_TEMPLATE;
979
1083
  var init_opencode2 = __esm({
980
1084
  "../core/dist/writers/opencode.js"() {
981
1085
  "use strict";
@@ -986,8 +1090,8 @@ var init_opencode2 = __esm({
986
1090
  OPENCODE_PROVIDER_KEY = "openai";
987
1091
  OPENCODE_MODEL = "openai/gpt-5.2-codex";
988
1092
  OPENCODE_MODEL_KEY = "gpt-5.2-codex";
989
- __filename3 = fileURLToPath3(import.meta.url);
990
- __dirname3 = path6.dirname(__filename3);
1093
+ __filename4 = fileURLToPath4(import.meta.url);
1094
+ __dirname4 = path7.dirname(__filename4);
991
1095
  DEFAULT_MODELS = {
992
1096
  [OPENCODE_MODEL_KEY]: {
993
1097
  name: "GPT-5.2 Codex",
@@ -1057,7 +1161,7 @@ var init_tool_manager_types = __esm({
1057
1161
  });
1058
1162
 
1059
1163
  // ../core/dist/tool-manager.js
1060
- import * as path7 from "path";
1164
+ import * as path8 from "path";
1061
1165
  function createToolManager(tool) {
1062
1166
  const toolConfig = TOOL_CONFIGS[tool];
1063
1167
  const configPath = toolConfig.configPath;
@@ -1331,17 +1435,17 @@ var init_tool_manager = __esm({
1331
1435
  init_tool_manager_types();
1332
1436
  TOOL_CONFIGS = {
1333
1437
  codex: {
1334
- configPath: path7.join(getCcmanDir(), "codex.json"),
1438
+ configPath: path8.join(getCcmanDir(), "codex.json"),
1335
1439
  builtinPresets: CODEX_PRESETS,
1336
1440
  writer: writeCodexConfig
1337
1441
  },
1338
1442
  claude: {
1339
- configPath: path7.join(getCcmanDir(), "claude.json"),
1443
+ configPath: path8.join(getCcmanDir(), "claude.json"),
1340
1444
  builtinPresets: CC_PRESETS,
1341
1445
  writer: writeClaudeConfig
1342
1446
  },
1343
1447
  mcp: {
1344
- configPath: path7.join(getCcmanDir(), "mcp.json"),
1448
+ configPath: path8.join(getCcmanDir(), "mcp.json"),
1345
1449
  builtinPresets: MCP_PRESETS,
1346
1450
  writer: writeMCPConfig,
1347
1451
  autoSync: true,
@@ -1371,12 +1475,12 @@ var init_tool_manager = __esm({
1371
1475
  }
1372
1476
  },
1373
1477
  gemini: {
1374
- configPath: path7.join(getCcmanDir(), "gemini.json"),
1478
+ configPath: path8.join(getCcmanDir(), "gemini.json"),
1375
1479
  builtinPresets: GEMINI_PRESETS,
1376
1480
  writer: writeGeminiConfig
1377
1481
  },
1378
1482
  opencode: {
1379
- configPath: path7.join(getCcmanDir(), "opencode.json"),
1483
+ configPath: path8.join(getCcmanDir(), "opencode.json"),
1380
1484
  builtinPresets: OPENCODE_PRESETS,
1381
1485
  writer: writeOpenCodeConfig
1382
1486
  }
@@ -1745,7 +1849,7 @@ var init_merge_advanced = __esm({
1745
1849
 
1746
1850
  // ../core/dist/sync/merge.js
1747
1851
  import fs8 from "fs";
1748
- import path8 from "path";
1852
+ import path9 from "path";
1749
1853
  function backupConfig(configPath, keepCount = 3) {
1750
1854
  if (!fs8.existsSync(configPath)) {
1751
1855
  throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${configPath}`);
@@ -1757,8 +1861,8 @@ function backupConfig(configPath, keepCount = 3) {
1757
1861
  return backupPath;
1758
1862
  }
1759
1863
  function cleanupOldBackups(configPath, keepCount) {
1760
- const dir = path8.dirname(configPath);
1761
- const basename = path8.basename(configPath);
1864
+ const dir = path9.dirname(configPath);
1865
+ const basename = path9.basename(configPath);
1762
1866
  const backupPrefix = `${basename}.backup.`;
1763
1867
  try {
1764
1868
  const files = fs8.readdirSync(dir);
@@ -1770,7 +1874,7 @@ function cleanupOldBackups(configPath, keepCount) {
1770
1874
  }
1771
1875
  return {
1772
1876
  name: f,
1773
- path: path8.join(dir, f),
1877
+ path: path9.join(dir, f),
1774
1878
  timestamp
1775
1879
  };
1776
1880
  }).filter((backup) => backup !== null).sort((a, b) => b.timestamp - a.timestamp);
@@ -1794,13 +1898,13 @@ var init_merge = __esm({
1794
1898
 
1795
1899
  // ../core/dist/sync/sync-v2.js
1796
1900
  import fs9 from "fs";
1797
- import path9 from "path";
1901
+ import path10 from "path";
1798
1902
  async function uploadToCloud(config, password) {
1799
1903
  const ccmanDir2 = getCcmanDir();
1800
1904
  const toolKeys = Object.keys(TOOL_SYNC_CONFIG);
1801
1905
  for (const tool of toolKeys) {
1802
1906
  const { remotePath, configFilename } = TOOL_SYNC_CONFIG[tool];
1803
- const configPath = path9.join(ccmanDir2, configFilename);
1907
+ const configPath = path10.join(ccmanDir2, configFilename);
1804
1908
  const localConfig = readJSON(configPath);
1805
1909
  const encryptedProviders = encryptProviders(localConfig.providers, password);
1806
1910
  const encryptedConfig = {
@@ -1846,7 +1950,7 @@ async function downloadFromCloud(config, password) {
1846
1950
  try {
1847
1951
  for (const tool of toolKeys) {
1848
1952
  const { configFilename } = TOOL_SYNC_CONFIG[tool];
1849
- const configPath = path9.join(ccmanDir2, configFilename);
1953
+ const configPath = path10.join(ccmanDir2, configFilename);
1850
1954
  if (fs9.existsSync(configPath)) {
1851
1955
  backupPaths.push(backupConfig(configPath));
1852
1956
  }
@@ -1859,7 +1963,7 @@ async function downloadFromCloud(config, password) {
1859
1963
  if (!remoteConfig || !decryptedProviders)
1860
1964
  continue;
1861
1965
  const { configFilename } = TOOL_SYNC_CONFIG[tool];
1862
- const configPath = path9.join(ccmanDir2, configFilename);
1966
+ const configPath = path10.join(ccmanDir2, configFilename);
1863
1967
  const newConfig = {
1864
1968
  ...remoteConfig,
1865
1969
  // 使用云端配置的所有字段
@@ -1901,7 +2005,7 @@ async function mergeSync(config, password) {
1901
2005
  for (let i = 0; i < toolKeys.length; i++) {
1902
2006
  const tool = toolKeys[i];
1903
2007
  const { remotePath, configFilename } = TOOL_SYNC_CONFIG[tool];
1904
- const configPath = path9.join(ccmanDir2, configFilename);
2008
+ const configPath = path10.join(ccmanDir2, configFilename);
1905
2009
  const localConfig = readJSON(configPath);
1906
2010
  let remoteProviders = [];
1907
2011
  if (existsChecks[i]) {
@@ -1933,7 +2037,7 @@ async function mergeSync(config, password) {
1933
2037
  try {
1934
2038
  for (const tool of toolKeys) {
1935
2039
  const { configFilename } = TOOL_SYNC_CONFIG[tool];
1936
- const configPath = path9.join(ccmanDir2, configFilename);
2040
+ const configPath = path10.join(ccmanDir2, configFilename);
1937
2041
  if (fs9.existsSync(configPath)) {
1938
2042
  backupPaths.push(backupConfig(configPath));
1939
2043
  }
@@ -1945,7 +2049,7 @@ async function mergeSync(config, password) {
1945
2049
  for (let i = 0; i < mergeDataList.length; i++) {
1946
2050
  const { tool, localConfig, mergeResult } = mergeDataList[i];
1947
2051
  const { remotePath, configFilename } = TOOL_SYNC_CONFIG[tool];
1948
- const configPath = path9.join(ccmanDir2, configFilename);
2052
+ const configPath = path10.join(ccmanDir2, configFilename);
1949
2053
  let remoteConfig = null;
1950
2054
  if (existsChecks[i]) {
1951
2055
  const jsonContent2 = await downloadFromWebDAV(config, remotePath);
@@ -2036,11 +2140,11 @@ var init_sync_v2 = __esm({
2036
2140
 
2037
2141
  // ../core/dist/export.js
2038
2142
  import * as fs10 from "fs";
2039
- import * as path10 from "path";
2143
+ import * as path11 from "path";
2040
2144
  function validateExport() {
2041
2145
  const ccmanDir2 = getCcmanDir();
2042
- const codexPath = path10.join(ccmanDir2, CODEX_CONFIG_FILE);
2043
- const claudePath = path10.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2146
+ const codexPath = path11.join(ccmanDir2, CODEX_CONFIG_FILE);
2147
+ const claudePath = path11.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2044
2148
  const missingFiles = [];
2045
2149
  if (!fileExists(codexPath)) {
2046
2150
  missingFiles.push(CODEX_CONFIG_FILE);
@@ -2073,8 +2177,8 @@ function validateImportDir(sourceDir) {
2073
2177
  foundFiles: []
2074
2178
  };
2075
2179
  }
2076
- const codexPath = path10.join(sourceDir, CODEX_CONFIG_FILE);
2077
- const claudePath = path10.join(sourceDir, CLAUDE_CONFIG_FILE);
2180
+ const codexPath = path11.join(sourceDir, CODEX_CONFIG_FILE);
2181
+ const claudePath = path11.join(sourceDir, CLAUDE_CONFIG_FILE);
2078
2182
  const foundFiles = [];
2079
2183
  if (fileExists(codexPath)) {
2080
2184
  foundFiles.push(CODEX_CONFIG_FILE);
@@ -2102,14 +2206,14 @@ function exportConfig(targetDir) {
2102
2206
  ensureDir(targetDir);
2103
2207
  const ccmanDir2 = getCcmanDir();
2104
2208
  const exportedFiles = [];
2105
- const codexSrc = path10.join(ccmanDir2, CODEX_CONFIG_FILE);
2106
- const codexDst = path10.join(targetDir, CODEX_CONFIG_FILE);
2209
+ const codexSrc = path11.join(ccmanDir2, CODEX_CONFIG_FILE);
2210
+ const codexDst = path11.join(targetDir, CODEX_CONFIG_FILE);
2107
2211
  if (fileExists(codexSrc)) {
2108
2212
  fs10.copyFileSync(codexSrc, codexDst);
2109
2213
  exportedFiles.push(CODEX_CONFIG_FILE);
2110
2214
  }
2111
- const claudeSrc = path10.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2112
- const claudeDst = path10.join(targetDir, CLAUDE_CONFIG_FILE);
2215
+ const claudeSrc = path11.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2216
+ const claudeDst = path11.join(targetDir, CLAUDE_CONFIG_FILE);
2113
2217
  if (fileExists(claudeSrc)) {
2114
2218
  fs10.copyFileSync(claudeSrc, claudeDst);
2115
2219
  exportedFiles.push(CLAUDE_CONFIG_FILE);
@@ -2131,22 +2235,22 @@ function importConfig(sourceDir) {
2131
2235
  ensureDir(ccmanDir2);
2132
2236
  try {
2133
2237
  if (validation.foundFiles.includes(CODEX_CONFIG_FILE)) {
2134
- const codexDst = path10.join(ccmanDir2, CODEX_CONFIG_FILE);
2238
+ const codexDst = path11.join(ccmanDir2, CODEX_CONFIG_FILE);
2135
2239
  if (fileExists(codexDst)) {
2136
2240
  const backupPath = backupConfig(codexDst);
2137
2241
  backupPaths.push(backupPath);
2138
2242
  }
2139
- const codexSrc = path10.join(sourceDir, CODEX_CONFIG_FILE);
2243
+ const codexSrc = path11.join(sourceDir, CODEX_CONFIG_FILE);
2140
2244
  fs10.copyFileSync(codexSrc, codexDst);
2141
2245
  importedFiles.push(CODEX_CONFIG_FILE);
2142
2246
  }
2143
2247
  if (validation.foundFiles.includes(CLAUDE_CONFIG_FILE)) {
2144
- const claudeDst = path10.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2248
+ const claudeDst = path11.join(ccmanDir2, CLAUDE_CONFIG_FILE);
2145
2249
  if (fileExists(claudeDst)) {
2146
2250
  const backupPath = backupConfig(claudeDst);
2147
2251
  backupPaths.push(backupPath);
2148
2252
  }
2149
- const claudeSrc = path10.join(sourceDir, CLAUDE_CONFIG_FILE);
2253
+ const claudeSrc = path11.join(sourceDir, CLAUDE_CONFIG_FILE);
2150
2254
  fs10.copyFileSync(claudeSrc, claudeDst);
2151
2255
  importedFiles.push(CLAUDE_CONFIG_FILE);
2152
2256
  }
@@ -2819,8 +2923,8 @@ function downloadCommand(program2) {
2819
2923
  console.log();
2820
2924
  if (backupPaths.length > 0) {
2821
2925
  console.log(chalk7.gray("\u672C\u5730\u5907\u4EFD:"));
2822
- backupPaths.forEach((path13) => {
2823
- console.log(chalk7.gray(` ${path13}`));
2926
+ backupPaths.forEach((path14) => {
2927
+ console.log(chalk7.gray(` ${path14}`));
2824
2928
  });
2825
2929
  console.log();
2826
2930
  }
@@ -2881,8 +2985,8 @@ function mergeCommand(program2) {
2881
2985
  console.log();
2882
2986
  if (result.backupPaths.length > 0) {
2883
2987
  console.log(chalk8.gray("\u5907\u4EFD:"));
2884
- result.backupPaths.forEach((path13) => {
2885
- console.log(chalk8.gray(` ${path13}`));
2988
+ result.backupPaths.forEach((path14) => {
2989
+ console.log(chalk8.gray(` ${path14}`));
2886
2990
  });
2887
2991
  console.log();
2888
2992
  }
@@ -6075,7 +6179,7 @@ init_sync();
6075
6179
  // src/commands/export.ts
6076
6180
  init_dist2();
6077
6181
  import chalk45 from "chalk";
6078
- import path11 from "path";
6182
+ import path12 from "path";
6079
6183
  function exportCommand(program2) {
6080
6184
  program2.command("export <\u76EE\u6807\u76EE\u5F55>").description("\u5BFC\u51FA\u914D\u7F6E\u5230\u672C\u5730\u76EE\u5F55\uFF08\u5305\u542B API Key\uFF09").action(async (targetDir) => {
6081
6185
  try {
@@ -6086,7 +6190,7 @@ function exportCommand(program2) {
6086
6190
  `));
6087
6191
  process.exit(1);
6088
6192
  }
6089
- const resolvedPath = targetDir.startsWith("~") ? path11.join(process.env.HOME || "", targetDir.slice(1)) : path11.resolve(targetDir);
6193
+ const resolvedPath = targetDir.startsWith("~") ? path12.join(process.env.HOME || "", targetDir.slice(1)) : path12.resolve(targetDir);
6090
6194
  console.log("\u5BFC\u51FA\u6587\u4EF6:");
6091
6195
  console.log(` ${chalk45.cyan("codex.json")} - Codex \u914D\u7F6E`);
6092
6196
  console.log(` ${chalk45.cyan("claude.json")} - Claude \u914D\u7F6E`);
@@ -6118,11 +6222,11 @@ function exportCommand(program2) {
6118
6222
  init_dist2();
6119
6223
  import chalk46 from "chalk";
6120
6224
  import inquirer32 from "inquirer";
6121
- import path12 from "path";
6225
+ import path13 from "path";
6122
6226
  function importCommand(program2) {
6123
6227
  program2.command("import <\u6E90\u76EE\u5F55>").description("\u4ECE\u672C\u5730\u76EE\u5F55\u5BFC\u5165\u914D\u7F6E\uFF08\u4F1A\u8986\u76D6\u5F53\u524D\u914D\u7F6E\uFF09").action(async (sourceDir) => {
6124
6228
  try {
6125
- const resolvedPath = sourceDir.startsWith("~") ? path12.join(process.env.HOME || "", sourceDir.slice(1)) : path12.resolve(sourceDir);
6229
+ const resolvedPath = sourceDir.startsWith("~") ? path13.join(process.env.HOME || "", sourceDir.slice(1)) : path13.resolve(sourceDir);
6126
6230
  console.log(chalk46.bold("\n\u{1F4E5} \u5BFC\u5165\u914D\u7F6E\n"));
6127
6231
  const validation = validateImportDir(resolvedPath);
6128
6232
  if (!validation.valid) {
@@ -1,13 +1,50 @@
1
- model_provider = "gmn"
2
- model = "gpt-5.2-codex"
1
+ model = "gpt-5.3-codex"
3
2
  model_reasoning_effort = "xhigh"
4
- network_access = "enabled"
5
3
  disable_response_storage = true
4
+ sandbox_mode = "danger-full-access"
6
5
  windows_wsl_setup_acknowledged = true
7
- model_verbosity = "high"
6
+ approval_policy = "never"
7
+ profile = "auto-max"
8
+ file_opener = "vscode"
9
+ model_provider = "gmn"
10
+ web_search = "cached"
11
+ suppress_unstable_features_warning = true
12
+
13
+ [history]
14
+ persistence = "save-all"
15
+
16
+ [tui]
17
+ notifications = true
18
+
19
+ [shell_environment_policy]
20
+ inherit = "all"
21
+ ignore_default_excludes = false
22
+
23
+ [sandbox_workspace_write]
24
+ network_access = true
25
+
26
+ [features]
27
+ plan_tool = true
28
+ apply_patch_freeform = true
29
+ view_image_tool = true
30
+ unified_exec = false
31
+ streamable_shell = false
32
+ rmcp_client = true
33
+ elevated_windows_sandbox = true
34
+
35
+ [profiles.auto-max]
36
+ approval_policy = "never"
37
+ sandbox_mode = "workspace-write"
38
+
39
+ [profiles.review]
40
+ approval_policy = "on-request"
41
+ sandbox_mode = "workspace-write"
42
+
43
+ [notice]
44
+ hide_gpt5_1_migration_prompt = true
8
45
 
9
46
  [model_providers.gmn]
10
47
  name = "gmn"
11
48
  base_url = "https://gmn.chuangzuoli.com"
12
49
  wire_api = "responses"
13
- requires_openai_auth = true
50
+ requires_openai_auth = true
@@ -0,0 +1,10 @@
1
+ {
2
+ "ide": {
3
+ "enabled": true
4
+ },
5
+ "security": {
6
+ "auth": {
7
+ "selectedType": "gemini-api-key"
8
+ }
9
+ }
10
+ }
@@ -17,6 +17,18 @@
17
17
  "high": {},
18
18
  "xhigh": {}
19
19
  }
20
+ },
21
+ "gpt-5.3-codex": {
22
+ "name": "GPT-5.3 Codex",
23
+ "options": {
24
+ "store": false
25
+ },
26
+ "variants": {
27
+ "low": {},
28
+ "medium": {},
29
+ "high": {},
30
+ "xhigh": {}
31
+ }
20
32
  }
21
33
  }
22
34
  }
@@ -34,5 +46,5 @@
34
46
  }
35
47
  },
36
48
  "$schema": "https://opencode.ai/config.json",
37
- "model": "openai/gpt-5.2-codex"
49
+ "model": "openai/gpt-5.3-codex"
38
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccman",
3
- "version": "3.3.9",
3
+ "version": "3.3.11",
4
4
  "type": "module",
5
5
  "description": "Manage Codex, Claude Code, Gemini CLI, OpenCode, and MCP API service provider configurations",
6
6
  "main": "./dist/index.js",