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.
|
|
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.
|
|
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.
|
|
333
|
-
model_reasoning_effort: "
|
|
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
|
-
|
|
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
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
const
|
|
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
|
|
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
|
-
|
|
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
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
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 (
|
|
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
|
|
868
|
-
import { fileURLToPath as
|
|
869
|
-
function
|
|
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
|
-
|
|
976
|
+
path7.resolve(__dirname4, "../../templates", relativePath),
|
|
873
977
|
// Bundled CLI runtime (dist -> dist/templates)
|
|
874
|
-
|
|
978
|
+
path7.resolve(__dirname4, "templates", relativePath),
|
|
875
979
|
// Fallback (some bundlers/layouts)
|
|
876
|
-
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
990
|
-
|
|
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
|
|
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:
|
|
1438
|
+
configPath: path8.join(getCcmanDir(), "codex.json"),
|
|
1335
1439
|
builtinPresets: CODEX_PRESETS,
|
|
1336
1440
|
writer: writeCodexConfig
|
|
1337
1441
|
},
|
|
1338
1442
|
claude: {
|
|
1339
|
-
configPath:
|
|
1443
|
+
configPath: path8.join(getCcmanDir(), "claude.json"),
|
|
1340
1444
|
builtinPresets: CC_PRESETS,
|
|
1341
1445
|
writer: writeClaudeConfig
|
|
1342
1446
|
},
|
|
1343
1447
|
mcp: {
|
|
1344
|
-
configPath:
|
|
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:
|
|
1478
|
+
configPath: path8.join(getCcmanDir(), "gemini.json"),
|
|
1375
1479
|
builtinPresets: GEMINI_PRESETS,
|
|
1376
1480
|
writer: writeGeminiConfig
|
|
1377
1481
|
},
|
|
1378
1482
|
opencode: {
|
|
1379
|
-
configPath:
|
|
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
|
|
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 =
|
|
1761
|
-
const basename =
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
2143
|
+
import * as path11 from "path";
|
|
2040
2144
|
function validateExport() {
|
|
2041
2145
|
const ccmanDir2 = getCcmanDir();
|
|
2042
|
-
const codexPath =
|
|
2043
|
-
const claudePath =
|
|
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 =
|
|
2077
|
-
const claudePath =
|
|
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 =
|
|
2106
|
-
const codexDst =
|
|
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 =
|
|
2112
|
-
const claudeDst =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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((
|
|
2823
|
-
console.log(chalk7.gray(` ${
|
|
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((
|
|
2885
|
-
console.log(chalk8.gray(` ${
|
|
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
|
|
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("~") ?
|
|
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
|
|
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("~") ?
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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.
|
|
49
|
+
"model": "openai/gpt-5.3-codex"
|
|
38
50
|
}
|