@adversity/coding-tool-x 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/CHANGELOG.md +333 -0
  2. package/LICENSE +21 -0
  3. package/README.md +404 -0
  4. package/bin/ctx.js +8 -0
  5. package/dist/web/assets/index-D1AYlFLZ.js +3220 -0
  6. package/dist/web/assets/index-aL3cKxSK.css +41 -0
  7. package/dist/web/favicon.ico +0 -0
  8. package/dist/web/index.html +14 -0
  9. package/dist/web/logo.png +0 -0
  10. package/docs/CHANGELOG.md +582 -0
  11. package/docs/DIRECTORY_MIGRATION.md +112 -0
  12. package/docs/PROJECT_STRUCTURE.md +396 -0
  13. package/docs/bannel.png +0 -0
  14. package/docs/home.png +0 -0
  15. package/docs/logo.png +0 -0
  16. package/docs/multi-channel-load-balancing.md +249 -0
  17. package/package.json +73 -0
  18. package/src/commands/channels.js +504 -0
  19. package/src/commands/cli-type.js +99 -0
  20. package/src/commands/daemon.js +286 -0
  21. package/src/commands/doctor.js +332 -0
  22. package/src/commands/list.js +222 -0
  23. package/src/commands/logs.js +259 -0
  24. package/src/commands/port-config.js +115 -0
  25. package/src/commands/proxy-control.js +258 -0
  26. package/src/commands/proxy.js +152 -0
  27. package/src/commands/resume.js +137 -0
  28. package/src/commands/search.js +190 -0
  29. package/src/commands/stats.js +224 -0
  30. package/src/commands/switch.js +48 -0
  31. package/src/commands/toggle-proxy.js +222 -0
  32. package/src/commands/ui.js +92 -0
  33. package/src/commands/workspace.js +454 -0
  34. package/src/config/default.js +40 -0
  35. package/src/config/loader.js +75 -0
  36. package/src/config/paths.js +121 -0
  37. package/src/index.js +373 -0
  38. package/src/reset-config.js +92 -0
  39. package/src/server/api/agents.js +248 -0
  40. package/src/server/api/aliases.js +36 -0
  41. package/src/server/api/channels.js +258 -0
  42. package/src/server/api/claude-hooks.js +480 -0
  43. package/src/server/api/codex-channels.js +312 -0
  44. package/src/server/api/codex-projects.js +91 -0
  45. package/src/server/api/codex-proxy.js +182 -0
  46. package/src/server/api/codex-sessions.js +491 -0
  47. package/src/server/api/codex-statistics.js +57 -0
  48. package/src/server/api/commands.js +245 -0
  49. package/src/server/api/config-templates.js +182 -0
  50. package/src/server/api/config.js +147 -0
  51. package/src/server/api/convert.js +127 -0
  52. package/src/server/api/dashboard.js +125 -0
  53. package/src/server/api/env.js +144 -0
  54. package/src/server/api/favorites.js +77 -0
  55. package/src/server/api/gemini-channels.js +261 -0
  56. package/src/server/api/gemini-projects.js +91 -0
  57. package/src/server/api/gemini-proxy.js +160 -0
  58. package/src/server/api/gemini-sessions.js +397 -0
  59. package/src/server/api/gemini-statistics.js +57 -0
  60. package/src/server/api/health-check.js +118 -0
  61. package/src/server/api/mcp.js +336 -0
  62. package/src/server/api/pm2-autostart.js +269 -0
  63. package/src/server/api/projects.js +124 -0
  64. package/src/server/api/prompts.js +279 -0
  65. package/src/server/api/proxy.js +235 -0
  66. package/src/server/api/rules.js +271 -0
  67. package/src/server/api/sessions.js +595 -0
  68. package/src/server/api/settings.js +61 -0
  69. package/src/server/api/skills.js +305 -0
  70. package/src/server/api/statistics.js +91 -0
  71. package/src/server/api/terminal.js +202 -0
  72. package/src/server/api/ui-config.js +64 -0
  73. package/src/server/api/workspaces.js +407 -0
  74. package/src/server/codex-proxy-server.js +538 -0
  75. package/src/server/dev-server.js +26 -0
  76. package/src/server/gemini-proxy-server.js +518 -0
  77. package/src/server/index.js +305 -0
  78. package/src/server/proxy-server.js +469 -0
  79. package/src/server/services/agents-service.js +354 -0
  80. package/src/server/services/alias.js +71 -0
  81. package/src/server/services/channel-health.js +234 -0
  82. package/src/server/services/channel-scheduler.js +234 -0
  83. package/src/server/services/channels.js +347 -0
  84. package/src/server/services/codex-channels.js +625 -0
  85. package/src/server/services/codex-config.js +90 -0
  86. package/src/server/services/codex-parser.js +322 -0
  87. package/src/server/services/codex-sessions.js +665 -0
  88. package/src/server/services/codex-settings-manager.js +397 -0
  89. package/src/server/services/codex-speed-test-template.json +24 -0
  90. package/src/server/services/codex-statistics-service.js +255 -0
  91. package/src/server/services/commands-service.js +360 -0
  92. package/src/server/services/config-templates-service.js +732 -0
  93. package/src/server/services/env-checker.js +307 -0
  94. package/src/server/services/env-manager.js +300 -0
  95. package/src/server/services/favorites.js +163 -0
  96. package/src/server/services/gemini-channels.js +333 -0
  97. package/src/server/services/gemini-config.js +73 -0
  98. package/src/server/services/gemini-sessions.js +689 -0
  99. package/src/server/services/gemini-settings-manager.js +263 -0
  100. package/src/server/services/gemini-statistics-service.js +253 -0
  101. package/src/server/services/health-check.js +399 -0
  102. package/src/server/services/mcp-service.js +1188 -0
  103. package/src/server/services/prompts-service.js +492 -0
  104. package/src/server/services/proxy-runtime.js +79 -0
  105. package/src/server/services/pty-manager.js +435 -0
  106. package/src/server/services/rules-service.js +401 -0
  107. package/src/server/services/session-cache.js +127 -0
  108. package/src/server/services/session-converter.js +577 -0
  109. package/src/server/services/sessions.js +757 -0
  110. package/src/server/services/settings-manager.js +163 -0
  111. package/src/server/services/skill-service.js +965 -0
  112. package/src/server/services/speed-test.js +545 -0
  113. package/src/server/services/statistics-service.js +386 -0
  114. package/src/server/services/terminal-commands.js +155 -0
  115. package/src/server/services/terminal-config.js +140 -0
  116. package/src/server/services/terminal-detector.js +306 -0
  117. package/src/server/services/ui-config.js +130 -0
  118. package/src/server/services/workspace-service.js +662 -0
  119. package/src/server/utils/pricing.js +41 -0
  120. package/src/server/websocket-server.js +557 -0
  121. package/src/ui/menu.js +129 -0
  122. package/src/ui/prompts.js +100 -0
  123. package/src/utils/format.js +43 -0
  124. package/src/utils/port-helper.js +94 -0
  125. package/src/utils/session.js +239 -0
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Rules API 路由
3
+ *
4
+ * 管理 Claude Code 规则文件
5
+ */
6
+
7
+ const express = require('express');
8
+ const { RulesService } = require('../services/rules-service');
9
+
10
+ const router = express.Router();
11
+ const rulesService = new RulesService();
12
+
13
+ /**
14
+ * 获取规则列表
15
+ * GET /api/rules
16
+ * Query: projectPath - 项目路径(可选,用于获取项目级规则)
17
+ */
18
+ router.get('/', (req, res) => {
19
+ try {
20
+ const { projectPath } = req.query;
21
+ const result = rulesService.listRules(projectPath || null);
22
+
23
+ res.json({
24
+ success: true,
25
+ ...result
26
+ });
27
+ } catch (err) {
28
+ console.error('[Rules API] List rules error:', err);
29
+ res.status(500).json({
30
+ success: false,
31
+ message: err.message
32
+ });
33
+ }
34
+ });
35
+
36
+ /**
37
+ * 获取规则统计
38
+ * GET /api/rules/stats
39
+ */
40
+ router.get('/stats', (req, res) => {
41
+ try {
42
+ const { projectPath } = req.query;
43
+ const stats = rulesService.getStats(projectPath || null);
44
+
45
+ res.json({
46
+ success: true,
47
+ ...stats
48
+ });
49
+ } catch (err) {
50
+ console.error('[Rules API] Get stats error:', err);
51
+ res.status(500).json({
52
+ success: false,
53
+ message: err.message
54
+ });
55
+ }
56
+ });
57
+
58
+ /**
59
+ * 获取目录结构
60
+ * GET /api/rules/tree
61
+ */
62
+ router.get('/tree', (req, res) => {
63
+ try {
64
+ const { projectPath } = req.query;
65
+ const tree = rulesService.getDirectoryTree(projectPath || null);
66
+
67
+ res.json({
68
+ success: true,
69
+ tree
70
+ });
71
+ } catch (err) {
72
+ console.error('[Rules API] Get tree error:', err);
73
+ res.status(500).json({
74
+ success: false,
75
+ message: err.message
76
+ });
77
+ }
78
+ });
79
+
80
+ /**
81
+ * 获取单个规则详情
82
+ * GET /api/rules/:scope/*
83
+ * 支持子目录路径,如 /api/rules/user/frontend/react
84
+ */
85
+ router.get('/:scope/*', (req, res) => {
86
+ try {
87
+ const { scope } = req.params;
88
+ const relativePath = req.params[0]; // 通配符匹配的路径
89
+ const { projectPath } = req.query;
90
+
91
+ if (!['user', 'project'].includes(scope)) {
92
+ return res.status(400).json({
93
+ success: false,
94
+ message: '无效的 scope,必须是 user 或 project'
95
+ });
96
+ }
97
+
98
+ if (scope === 'project' && !projectPath) {
99
+ return res.status(400).json({
100
+ success: false,
101
+ message: '获取项目级规则需要提供 projectPath'
102
+ });
103
+ }
104
+
105
+ const rule = rulesService.getRule(relativePath, scope, projectPath || null);
106
+
107
+ if (!rule) {
108
+ return res.status(404).json({
109
+ success: false,
110
+ message: `规则 "${relativePath}" 不存在`
111
+ });
112
+ }
113
+
114
+ res.json({
115
+ success: true,
116
+ rule
117
+ });
118
+ } catch (err) {
119
+ console.error('[Rules API] Get rule error:', err);
120
+ res.status(500).json({
121
+ success: false,
122
+ message: err.message
123
+ });
124
+ }
125
+ });
126
+
127
+ /**
128
+ * 创建规则
129
+ * POST /api/rules
130
+ * Body: { fileName, scope, projectPath?, directory?, paths?, body }
131
+ */
132
+ router.post('/', (req, res) => {
133
+ try {
134
+ const { fileName, scope, projectPath, directory, paths, body } = req.body;
135
+
136
+ if (!fileName) {
137
+ return res.status(400).json({
138
+ success: false,
139
+ message: '规则文件名不能为空'
140
+ });
141
+ }
142
+
143
+ if (!['user', 'project'].includes(scope)) {
144
+ return res.status(400).json({
145
+ success: false,
146
+ message: '无效的 scope,必须是 user 或 project'
147
+ });
148
+ }
149
+
150
+ if (scope === 'project' && !projectPath) {
151
+ return res.status(400).json({
152
+ success: false,
153
+ message: '创建项目级规则需要提供 projectPath'
154
+ });
155
+ }
156
+
157
+ const rule = rulesService.createRule({
158
+ fileName,
159
+ scope,
160
+ projectPath: projectPath || null,
161
+ directory: directory || null,
162
+ paths: paths || '',
163
+ body: body || ''
164
+ });
165
+
166
+ res.json({
167
+ success: true,
168
+ rule,
169
+ message: '规则创建成功'
170
+ });
171
+ } catch (err) {
172
+ console.error('[Rules API] Create rule error:', err);
173
+ res.status(500).json({
174
+ success: false,
175
+ message: err.message
176
+ });
177
+ }
178
+ });
179
+
180
+ /**
181
+ * 更新规则
182
+ * PUT /api/rules/:scope/*
183
+ */
184
+ router.put('/:scope/*', (req, res) => {
185
+ try {
186
+ const { scope } = req.params;
187
+ const relativePath = req.params[0];
188
+ const { projectPath, paths, body } = req.body;
189
+
190
+ if (!['user', 'project'].includes(scope)) {
191
+ return res.status(400).json({
192
+ success: false,
193
+ message: '无效的 scope,必须是 user 或 project'
194
+ });
195
+ }
196
+
197
+ if (scope === 'project' && !projectPath) {
198
+ return res.status(400).json({
199
+ success: false,
200
+ message: '更新项目级规则需要提供 projectPath'
201
+ });
202
+ }
203
+
204
+ // 确保路径以 .md 结尾
205
+ const fullPath = relativePath.endsWith('.md') ? relativePath : `${relativePath}.md`;
206
+
207
+ const rule = rulesService.updateRule({
208
+ relativePath: fullPath,
209
+ scope,
210
+ projectPath: projectPath || null,
211
+ paths: paths || '',
212
+ body: body || ''
213
+ });
214
+
215
+ res.json({
216
+ success: true,
217
+ rule,
218
+ message: '规则更新成功'
219
+ });
220
+ } catch (err) {
221
+ console.error('[Rules API] Update rule error:', err);
222
+ res.status(500).json({
223
+ success: false,
224
+ message: err.message
225
+ });
226
+ }
227
+ });
228
+
229
+ /**
230
+ * 删除规则
231
+ * DELETE /api/rules/:scope/*
232
+ */
233
+ router.delete('/:scope/*', (req, res) => {
234
+ try {
235
+ const { scope } = req.params;
236
+ const relativePath = req.params[0];
237
+ const { projectPath } = req.query;
238
+
239
+ if (!['user', 'project'].includes(scope)) {
240
+ return res.status(400).json({
241
+ success: false,
242
+ message: '无效的 scope,必须是 user 或 project'
243
+ });
244
+ }
245
+
246
+ if (scope === 'project' && !projectPath) {
247
+ return res.status(400).json({
248
+ success: false,
249
+ message: '删除项目级规则需要提供 projectPath'
250
+ });
251
+ }
252
+
253
+ // 确保路径以 .md 结尾
254
+ const fullPath = relativePath.endsWith('.md') ? relativePath : `${relativePath}.md`;
255
+
256
+ const result = rulesService.deleteRule(fullPath, scope, projectPath || null);
257
+
258
+ res.json({
259
+ success: result.success,
260
+ message: result.message
261
+ });
262
+ } catch (err) {
263
+ console.error('[Rules API] Delete rule error:', err);
264
+ res.status(500).json({
265
+ success: false,
266
+ message: err.message
267
+ });
268
+ }
269
+ });
270
+
271
+ module.exports = router;