coding-tool-x 3.3.7 → 3.3.9
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/CHANGELOG.md +20 -0
- package/README.md +253 -326
- package/dist/web/assets/{Analytics-IW6eAy9u.js → Analytics-D6LzK9hk.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-BPtkTMSc.js → ConfigTemplates-BUDYuxRi.js} +1 -1
- package/dist/web/assets/Home-BQxQ1LhR.css +1 -0
- package/dist/web/assets/Home-D7KX7iF8.js +1 -0
- package/dist/web/assets/{PluginManager-BGx9MSDV.js → PluginManager-DTgQ--vB.js} +1 -1
- package/dist/web/assets/{ProjectList-BCn-mrCx.js → ProjectList-DMCiGmCT.js} +1 -1
- package/dist/web/assets/{SessionList-CzLfebJQ.js → SessionList-CRBsdVRe.js} +1 -1
- package/dist/web/assets/{SkillManager-CXz2vBQx.js → SkillManager-DMwx2Q4k.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-CHtgMfKc.js → WorkspaceManager-DapB4ljL.js} +1 -1
- package/dist/web/assets/{icons-B29onFfZ.js → icons-B5Pl4lrD.js} +1 -1
- package/dist/web/assets/index-CL-qpoJ_.js +2 -0
- package/dist/web/assets/index-D_5dRFOL.css +1 -0
- package/dist/web/assets/{markdown-C9MYpaSi.js → markdown-DyTJGI4N.js} +1 -1
- package/dist/web/assets/{naive-ui-CxpuzdjU.js → naive-ui-Bdxp09n2.js} +1 -1
- package/dist/web/assets/{vendors-DMjSfzlv.js → vendors-CKPV1OAU.js} +2 -2
- package/dist/web/assets/{vue-vendor-DET08QYg.js → vue-vendor-3bf-fPGP.js} +1 -1
- package/dist/web/index.html +7 -7
- package/docs/home.png +0 -0
- package/package.json +14 -5
- package/src/commands/daemon.js +3 -2
- package/src/commands/security.js +1 -2
- package/src/commands/toggle-proxy.js +100 -5
- package/src/config/paths.js +718 -90
- package/src/server/api/agents.js +1 -1
- package/src/server/api/channels.js +9 -0
- package/src/server/api/claude-hooks.js +13 -8
- package/src/server/api/codex-channels.js +9 -0
- package/src/server/api/codex-proxy.js +27 -15
- package/src/server/api/gemini-proxy.js +22 -11
- package/src/server/api/hooks.js +45 -0
- package/src/server/api/oauth-credentials.js +163 -0
- package/src/server/api/opencode-proxy.js +22 -10
- package/src/server/api/plugins.js +2 -1
- package/src/server/api/proxy.js +39 -44
- package/src/server/api/skills.js +91 -13
- package/src/server/api/ui-config.js +5 -0
- package/src/server/codex-proxy-server.js +90 -70
- package/src/server/gemini-proxy-server.js +107 -88
- package/src/server/index.js +2 -0
- package/src/server/opencode-proxy-server.js +381 -225
- package/src/server/proxy-server.js +86 -60
- package/src/server/services/alias.js +3 -3
- package/src/server/services/channels.js +21 -24
- package/src/server/services/codex-channels.js +158 -255
- package/src/server/services/codex-config.js +2 -5
- package/src/server/services/codex-env-manager.js +423 -0
- package/src/server/services/codex-settings-manager.js +21 -357
- package/src/server/services/codex-statistics-service.js +3 -27
- package/src/server/services/config-export-service.js +43 -9
- package/src/server/services/config-registry-service.js +3 -2
- package/src/server/services/config-sync-manager.js +1 -1
- package/src/server/services/favorites.js +4 -3
- package/src/server/services/gemini-channels.js +14 -12
- package/src/server/services/gemini-statistics-service.js +3 -25
- package/src/server/services/mcp-service.js +35 -19
- package/src/server/services/model-detector.js +4 -3
- package/src/server/services/native-keychain.js +243 -0
- package/src/server/services/native-oauth-adapters.js +891 -0
- package/src/server/services/network-access.js +39 -1
- package/src/server/services/notification-hooks.js +951 -0
- package/src/server/services/oauth-credentials-service.js +786 -0
- package/src/server/services/oauth-utils.js +49 -0
- package/src/server/services/opencode-channels.js +19 -15
- package/src/server/services/opencode-sessions.js +2 -2
- package/src/server/services/opencode-settings-manager.js +169 -16
- package/src/server/services/opencode-statistics-service.js +3 -27
- package/src/server/services/plugins-service.js +115 -15
- package/src/server/services/prompts-service.js +2 -3
- package/src/server/services/proxy-log-helper.js +242 -0
- package/src/server/services/proxy-runtime.js +6 -4
- package/src/server/services/repo-scanner-base.js +12 -4
- package/src/server/services/request-logger.js +7 -7
- package/src/server/services/security-config.js +4 -4
- package/src/server/services/session-cache.js +2 -2
- package/src/server/services/sessions.js +2 -2
- package/src/server/services/settings-manager.js +13 -0
- package/src/server/services/skill-service.js +867 -368
- package/src/server/services/statistics-service.js +5 -5
- package/src/server/services/ui-config.js +4 -3
- package/src/server/services/workspace-service.js +1 -1
- package/src/server/websocket-server.js +5 -4
- package/dist/web/assets/Home-BsSioaaB.css +0 -1
- package/dist/web/assets/Home-obifg_9E.js +0 -1
- package/dist/web/assets/index-C7LPdVsN.js +0 -2
- package/dist/web/assets/index-eEmjZKWP.css +0 -1
- package/docs/bannel.png +0 -0
- package/docs/model-redirection.md +0 -251
package/dist/web/index.html
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
<link rel="icon" href="/favicon.ico">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
7
|
<title>CC-TOOL - ClaudeCode增强工作助手</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="modulepreload" crossorigin href="/assets/markdown-
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/vendors-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/naive-ui-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/icons-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CL-qpoJ_.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/assets/markdown-DyTJGI4N.js">
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-3bf-fPGP.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/vendors-CKPV1OAU.js">
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/naive-ui-Bdxp09n2.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/icons-B5Pl4lrD.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="/assets/markdown-BfC0goYb.css">
|
|
15
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
15
|
+
<link rel="stylesheet" crossorigin href="/assets/index-D_5dRFOL.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
18
18
|
<div id="app"></div>
|
package/docs/home.png
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coding-tool-x",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.9",
|
|
4
4
|
"description": "Vibe Coding 增强工作助手 - 智能会话管理、动态渠道切换、全局搜索、实时监控",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,10 +8,12 @@
|
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"start": "node bin/ctx.js",
|
|
11
|
-
"test": "npm run test:basic && npm run test:api && npm run test:codex-agents",
|
|
11
|
+
"test": "npm run test:basic && npm run test:api && npm run test:codex-agents && npm run test:skills && npm run test:plugins-market",
|
|
12
12
|
"test:basic": "node scripts/test-basic.js",
|
|
13
13
|
"test:api": "node scripts/test-api-consistency.js",
|
|
14
14
|
"test:codex-agents": "node scripts/test-codex-agents.js",
|
|
15
|
+
"test:skills": "node scripts/test-skill-providers.js",
|
|
16
|
+
"test:plugins-market": "node scripts/test-plugin-market-cache.js",
|
|
15
17
|
"test:windows": "node scripts/test-windows-regression.js",
|
|
16
18
|
"benchmark:codex": "node scripts/benchmark-codex-loading.js",
|
|
17
19
|
"build:web": "cd src/web && npm run build",
|
|
@@ -53,20 +55,27 @@
|
|
|
53
55
|
"dependencies": {
|
|
54
56
|
"@iarna/toml": "^2.2.5",
|
|
55
57
|
"adm-zip": "^0.5.16",
|
|
56
|
-
"ajv": "^8.
|
|
58
|
+
"ajv": "^8.17.1",
|
|
57
59
|
"cc-tool-web": "file:src/web",
|
|
58
60
|
"chalk": "^4.1.2",
|
|
59
|
-
"express": "^4.
|
|
61
|
+
"express": "^4.21.2",
|
|
60
62
|
"http-proxy": "^1.18.1",
|
|
61
63
|
"https-proxy-agent": "^7.0.6",
|
|
62
64
|
"inquirer": "^8.2.7",
|
|
63
65
|
"open": "^8.4.2",
|
|
64
66
|
"ora": "^5.4.1",
|
|
65
|
-
"pm2": "^
|
|
67
|
+
"pm2": "^6.0.14",
|
|
66
68
|
"semver": "^7.6.0",
|
|
67
69
|
"toml": "^3.0.0",
|
|
68
70
|
"ws": "^8.18.3"
|
|
69
71
|
},
|
|
72
|
+
"overrides": {
|
|
73
|
+
"basic-ftp": "^5.2.0",
|
|
74
|
+
"lodash": "^4.17.23",
|
|
75
|
+
"lodash-es": "^4.17.23",
|
|
76
|
+
"qs": "^6.15.0",
|
|
77
|
+
"systeminformation": "^5.31.4"
|
|
78
|
+
},
|
|
70
79
|
"devDependencies": {
|
|
71
80
|
"nodemon": "^3.0.2"
|
|
72
81
|
},
|
package/src/commands/daemon.js
CHANGED
|
@@ -153,6 +153,7 @@ async function handleStart() {
|
|
|
153
153
|
if (enableHost) {
|
|
154
154
|
pmArgs.push('--host');
|
|
155
155
|
}
|
|
156
|
+
require('fs').mkdirSync(PATHS.logs, { recursive: true });
|
|
156
157
|
|
|
157
158
|
// 启动 PM2 进程
|
|
158
159
|
pm2.start({
|
|
@@ -166,8 +167,8 @@ async function handleStart() {
|
|
|
166
167
|
NODE_ENV: 'production',
|
|
167
168
|
CC_TOOL_PORT: port
|
|
168
169
|
},
|
|
169
|
-
output: path.join(
|
|
170
|
-
error: path.join(
|
|
170
|
+
output: path.join(PATHS.logs, 'cc-tool-out.log'),
|
|
171
|
+
error: path.join(PATHS.logs, 'cc-tool-error.log'),
|
|
171
172
|
merge_logs: true,
|
|
172
173
|
log_date_format: 'YYYY-MM-DD HH:mm:ss'
|
|
173
174
|
}, async (err) => {
|
package/src/commands/security.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
2
|
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
3
|
const { PATHS, ensureStorageDirMigrated } = require('../config/paths');
|
|
5
4
|
|
|
6
|
-
const SECURITY_FILE =
|
|
5
|
+
const SECURITY_FILE = PATHS.security;
|
|
7
6
|
|
|
8
7
|
function showSecurityHelp() {
|
|
9
8
|
console.log(chalk.yellow('\n🔐 安全设置命令:'));
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// 动态切换开关命令
|
|
2
|
+
const fs = require('fs');
|
|
2
3
|
const chalk = require('chalk');
|
|
3
4
|
const inquirer = require('inquirer');
|
|
4
5
|
const { loadConfig } = require('../config/loader');
|
|
6
|
+
const { PATHS } = require('../config/paths');
|
|
7
|
+
const { clearNativeOAuth } = require('../server/services/native-oauth-adapters');
|
|
5
8
|
const SETTINGS_MANAGERS = {
|
|
6
9
|
claude: () => require('../server/services/settings-manager'),
|
|
7
10
|
codex: () => require('../server/services/codex-settings-manager'),
|
|
@@ -49,10 +52,97 @@ function getSettingsManager(cliType) {
|
|
|
49
52
|
return {
|
|
50
53
|
setProxyConfig: manager.setProxyConfig,
|
|
51
54
|
restoreSettings: manager.restoreSettings,
|
|
52
|
-
hasBackup: manager.hasBackup
|
|
55
|
+
hasBackup: manager.hasBackup,
|
|
56
|
+
deleteBackup: manager.deleteBackup
|
|
53
57
|
};
|
|
54
58
|
}
|
|
55
59
|
|
|
60
|
+
function removeActiveChannelMarker(cliType) {
|
|
61
|
+
const markerPath = PATHS.activeChannel?.[cliType];
|
|
62
|
+
if (!markerPath) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
if (fs.existsSync(markerPath)) {
|
|
68
|
+
fs.unlinkSync(markerPath);
|
|
69
|
+
}
|
|
70
|
+
} catch {
|
|
71
|
+
// ignore cleanup failures
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function loadActiveChannelId(cliType) {
|
|
76
|
+
const markerPath = PATHS.activeChannel?.[cliType];
|
|
77
|
+
if (!markerPath) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
if (!fs.existsSync(markerPath)) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const payload = JSON.parse(fs.readFileSync(markerPath, 'utf8'));
|
|
86
|
+
return payload?.activeChannelId || null;
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function pickLatestEnabledChannel(channels = []) {
|
|
93
|
+
const enabledChannels = Array.isArray(channels)
|
|
94
|
+
? channels.filter(channel => channel?.enabled !== false)
|
|
95
|
+
: [];
|
|
96
|
+
|
|
97
|
+
if (enabledChannels.length > 0) {
|
|
98
|
+
return enabledChannels[0];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return Array.isArray(channels) ? channels[0] || null : null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function pickRestoredChannel(cliType, channels = []) {
|
|
105
|
+
const activeChannelId = loadActiveChannelId(cliType);
|
|
106
|
+
if (activeChannelId) {
|
|
107
|
+
const matchedChannel = Array.isArray(channels)
|
|
108
|
+
? channels.find(channel => channel?.id === activeChannelId)
|
|
109
|
+
: null;
|
|
110
|
+
if (matchedChannel) {
|
|
111
|
+
return matchedChannel;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return pickLatestEnabledChannel(channels);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function restoreSingleChannelMode(cliType) {
|
|
119
|
+
if (cliType === 'claude') {
|
|
120
|
+
const { getAllChannels, applyChannelToSettings } = require('../server/services/channels');
|
|
121
|
+
const target = pickRestoredChannel(cliType, getAllChannels());
|
|
122
|
+
return target ? applyChannelToSettings(target.id) : null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (cliType === 'codex') {
|
|
126
|
+
const { getChannels, applyChannelToSettings } = require('../server/services/codex-channels');
|
|
127
|
+
const target = pickRestoredChannel(cliType, getChannels().channels || []);
|
|
128
|
+
return target ? applyChannelToSettings(target.id, { pruneProviders: true }) : null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (cliType === 'gemini') {
|
|
132
|
+
const { getChannels, applyChannelToSettings } = require('../server/services/gemini-channels');
|
|
133
|
+
const target = pickRestoredChannel(cliType, getChannels().channels || []);
|
|
134
|
+
return target ? applyChannelToSettings(target.id) : null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (cliType === 'opencode') {
|
|
138
|
+
const { getChannels, applyChannelToSettings } = require('../server/services/opencode-channels');
|
|
139
|
+
const target = pickRestoredChannel(cliType, getChannels().channels || []);
|
|
140
|
+
return target ? applyChannelToSettings(target.id) : null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
56
146
|
/**
|
|
57
147
|
* 切换动态切换功能
|
|
58
148
|
*/
|
|
@@ -133,6 +223,7 @@ async function handleStartProxy(cliType, services) {
|
|
|
133
223
|
|
|
134
224
|
// 修改配置文件
|
|
135
225
|
const settingsManager = getSettingsManager(cliType);
|
|
226
|
+
clearNativeOAuth(cliType);
|
|
136
227
|
settingsManager.setProxyConfig(proxyResult.port);
|
|
137
228
|
console.log(chalk.green('✅ 配置文件已更新'));
|
|
138
229
|
|
|
@@ -188,7 +279,7 @@ async function handleStopProxy(cliType, services) {
|
|
|
188
279
|
|
|
189
280
|
console.log(chalk.yellow('关闭后:'));
|
|
190
281
|
console.log(chalk.gray('• 代理服务将被停止'));
|
|
191
|
-
console.log(chalk.gray('•
|
|
282
|
+
console.log(chalk.gray('• 配置将恢复为当前激活渠道的单渠道模式'));
|
|
192
283
|
console.log(chalk.gray(`• 之后管理渠道将需要重启 ${toolName}\n`));
|
|
193
284
|
|
|
194
285
|
const { confirm } = await inquirer.prompt([
|
|
@@ -214,9 +305,13 @@ async function handleStopProxy(cliType, services) {
|
|
|
214
305
|
|
|
215
306
|
// 恢复配置文件
|
|
216
307
|
const settingsManager = getSettingsManager(cliType);
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
308
|
+
settingsManager.deleteBackup?.();
|
|
309
|
+
const restoredChannel = restoreSingleChannelMode(cliType);
|
|
310
|
+
removeActiveChannelMarker(cliType);
|
|
311
|
+
if (restoredChannel?.name) {
|
|
312
|
+
console.log(chalk.green(`✅ 已恢复到渠道: ${restoredChannel.name}`));
|
|
313
|
+
} else {
|
|
314
|
+
console.log(chalk.green('✅ 已清理代理接管状态'));
|
|
220
315
|
}
|
|
221
316
|
|
|
222
317
|
console.log(chalk.cyan('\n💡 动态切换已关闭'));
|