coding-tool-x 3.8.4 → 3.8.5

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 (434) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-BG6P3DX-.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics--z_FmL5P.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-CrJtRKHy.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-BiuEryJj.js +1 -0
  10. package/dist/web/assets/CollapseItem-BAYEsL_Q.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-YJ-U7BXN.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-Ce_hAknW.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-Bvr1NN6K.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-BjIeHfF-.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-AV00tm_D.js +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  20. package/dist/web/assets/Divider-D28g1gwj.js +1 -0
  21. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
  22. package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
  23. package/dist/web/assets/FavoritesDrawer-Cz95o4CD.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-DLlbMz27.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-D7CCOFQC.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  29. package/dist/web/assets/MarkdownEditor-rEZ-c72L.js +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-DfoCyxU2.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-SKu8HNUR.js +1 -0
  34. package/dist/web/assets/PluginManager-BbeK-3rV.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-CWVJ7yjS.js +1 -0
  36. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  37. package/dist/web/assets/PluginsPanel-Cm2N3StG.js +1 -0
  38. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
  39. package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
  40. package/dist/web/assets/ProjectList-CsjnsNPv.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-EGd3djFa.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-D1vtoLAs.js +1 -0
  45. package/dist/web/assets/SessionCard-BgLg49U3.js +1 -0
  46. package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
  47. package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
  48. package/dist/web/assets/SessionList-TRiTklWk.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-d5liXjHq.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-rz2WejGY.js +1 -0
  51. package/dist/web/assets/SkillManager-BTjTUbHq.js +1 -0
  52. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-pN0hbkK3.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-gmBWEoiF.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-DcNzuVJk.js +1 -0
  59. package/dist/web/assets/Upload-v5rV0qTT.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-DxmicM4U.js +1 -0
  62. package/dist/web/assets/WorkspaceManager-CJHCjARN.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
  64. package/dist/web/assets/WorkspacePanel-D8_Zq-du.js +1 -0
  65. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
  66. package/dist/web/assets/client-UDwXBP9i.js +1 -0
  67. package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
  68. package/dist/web/assets/headers-cf-QapUq.js +1 -0
  69. package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
  70. package/dist/web/assets/index-C0EHRym0.css +1 -0
  71. package/dist/web/assets/index-DnEocV0M.js +2 -0
  72. package/dist/web/assets/light-Cp0t7v32.js +1 -0
  73. package/dist/web/assets/markdown-u082bbtj.js +1 -0
  74. package/dist/web/assets/platforms-CBkB45JP.js +1 -0
  75. package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
  76. package/dist/web/assets/project-config-B2baPzYL.js +1 -0
  77. package/dist/web/assets/sessions-Cmy31slD.js +1 -0
  78. package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
  79. package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
  80. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
  81. package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
  82. package/dist/web/assets/useResponsiveDrawer-B3uojyvV.js +1 -0
  83. package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
  84. package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
  85. package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
  86. package/dist/web/assets/xml-CgY3RMlX.js +1 -0
  87. package/dist/web/index.html +12 -8
  88. package/docs/native-log-memory-2026-09-16.md +43 -0
  89. package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
  90. package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
  91. package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
  92. package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
  93. package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
  94. package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
  95. package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
  96. package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
  97. package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
  98. package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
  99. package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
  100. package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
  101. package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
  102. package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
  103. package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
  104. package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
  105. package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
  106. package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
  107. package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
  108. package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
  109. package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
  110. package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
  111. package/package.json +8 -4
  112. package/src/commands/channels.js +88 -191
  113. package/src/commands/cli-type.js +19 -11
  114. package/src/commands/daemon.js +94 -32
  115. package/src/commands/doctor.js +16 -9
  116. package/src/commands/export-config.js +23 -5
  117. package/src/commands/list.js +130 -52
  118. package/src/commands/logs.js +44 -27
  119. package/src/commands/platform-command-registry.js +78 -0
  120. package/src/commands/plugin.js +11 -5
  121. package/src/commands/port-config.js +34 -52
  122. package/src/commands/proxy-control.js +207 -145
  123. package/src/commands/proxy.js +2 -2
  124. package/src/commands/resume.js +87 -91
  125. package/src/commands/search.js +137 -67
  126. package/src/commands/stats.js +30 -22
  127. package/src/commands/switch.js +1 -1
  128. package/src/commands/toggle-proxy.js +94 -111
  129. package/src/commands/ui.js +67 -6
  130. package/src/commands/workspace.js +90 -8
  131. package/src/config/default.js +6 -53
  132. package/src/config/loader.js +61 -24
  133. package/src/config/model-metadata.js +49 -59
  134. package/src/config/model-metadata.json +4095 -99
  135. package/src/config/paths.js +181 -8
  136. package/src/index.js +134 -71
  137. package/src/platforms/access.js +196 -0
  138. package/src/{server/services → platforms}/agents-service.js +354 -197
  139. package/src/platforms/channel-auth-registry.js +162 -0
  140. package/src/platforms/channel-auth-service.js +82 -0
  141. package/src/{server/services → platforms}/commands-service.js +195 -115
  142. package/src/platforms/driver-registry.js +59 -0
  143. package/src/platforms/drivers/claude/api-operations.js +62 -0
  144. package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
  145. package/src/platforms/drivers/claude/channels.js +39 -0
  146. package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
  147. package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
  148. package/src/platforms/drivers/claude/health.js +22 -0
  149. package/src/platforms/drivers/claude/mcp.js +9 -0
  150. package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
  151. package/src/platforms/drivers/claude/native-config.js +46 -0
  152. package/src/platforms/drivers/claude/native-logs.js +72 -0
  153. package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
  154. package/src/platforms/drivers/claude/project-config.js +21 -0
  155. package/src/platforms/drivers/claude/projects.js +62 -0
  156. package/src/platforms/drivers/claude/prompts.js +9 -0
  157. package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
  158. package/src/platforms/drivers/claude/proxy.js +16 -0
  159. package/src/platforms/drivers/claude/resource-sync.js +9 -0
  160. package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
  161. package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
  162. package/src/platforms/drivers/claude/sessions.js +76 -0
  163. package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
  164. package/src/platforms/drivers/claude/statistics.js +16 -0
  165. package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
  166. package/src/platforms/drivers/codex/api-operations.js +9 -0
  167. package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
  168. package/src/platforms/drivers/codex/channels.js +45 -0
  169. package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
  170. package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
  171. package/src/platforms/drivers/codex/mcp.js +9 -0
  172. package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
  173. package/src/platforms/drivers/codex/native-config.js +47 -0
  174. package/src/platforms/drivers/codex/native-logs.js +166 -0
  175. package/src/platforms/drivers/codex/project-config.js +21 -0
  176. package/src/platforms/drivers/codex/projects.js +26 -0
  177. package/src/platforms/drivers/codex/prompts.js +9 -0
  178. package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
  179. package/src/platforms/drivers/codex/proxy.js +16 -0
  180. package/src/platforms/drivers/codex/resource-sync.js +9 -0
  181. package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
  182. package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
  183. package/src/platforms/drivers/codex/sessions.js +36 -0
  184. package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
  185. package/src/platforms/drivers/codex/statistics.js +16 -0
  186. package/src/platforms/drivers/gemini/api-operations.js +9 -0
  187. package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
  188. package/src/platforms/drivers/gemini/channels.js +39 -0
  189. package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
  190. package/src/platforms/drivers/gemini/mcp.js +9 -0
  191. package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
  192. package/src/platforms/drivers/gemini/native-config.js +39 -0
  193. package/src/platforms/drivers/gemini/native-logs.js +180 -0
  194. package/src/platforms/drivers/gemini/project-config.js +21 -0
  195. package/src/platforms/drivers/gemini/projects.js +26 -0
  196. package/src/platforms/drivers/gemini/prompts.js +9 -0
  197. package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
  198. package/src/platforms/drivers/gemini/proxy.js +16 -0
  199. package/src/platforms/drivers/gemini/resource-sync.js +9 -0
  200. package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
  201. package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
  202. package/src/platforms/drivers/gemini/sessions.js +47 -0
  203. package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
  204. package/src/platforms/drivers/gemini/statistics.js +16 -0
  205. package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
  206. package/src/platforms/drivers/generic-filesystem.js +166 -0
  207. package/src/platforms/drivers/generic-jsonl.js +141 -0
  208. package/src/platforms/drivers/generic-mcp.js +44 -0
  209. package/src/platforms/drivers/generic-openai-compatible.js +45 -0
  210. package/src/platforms/drivers/generic-prompt.js +41 -0
  211. package/src/platforms/drivers/legacy.js +677 -0
  212. package/src/platforms/drivers/native-config-snapshot.js +125 -0
  213. package/src/platforms/drivers/native-log-utils.js +1292 -0
  214. package/src/platforms/drivers/notification-hooks.js +578 -0
  215. package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
  216. package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
  217. package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
  218. package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
  219. package/src/platforms/drivers/omp/channels.js +58 -0
  220. package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
  221. package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
  222. package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
  223. package/src/platforms/drivers/omp/mcp.js +9 -0
  224. package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
  225. package/src/platforms/drivers/omp/native-config.js +46 -0
  226. package/src/platforms/drivers/omp/native-logs.js +52 -0
  227. package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
  228. package/src/platforms/drivers/omp/project-config.js +29 -0
  229. package/src/platforms/drivers/omp/projects.js +20 -0
  230. package/src/platforms/drivers/omp/prompts.js +9 -0
  231. package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
  232. package/src/platforms/drivers/omp/proxy.js +16 -0
  233. package/src/platforms/drivers/omp/resource-sync.js +9 -0
  234. package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
  235. package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
  236. package/src/platforms/drivers/omp/sessions.js +36 -0
  237. package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
  238. package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
  239. package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
  240. package/src/platforms/drivers/omp/statistics.js +16 -0
  241. package/src/platforms/drivers/opencode/api-operations.js +9 -0
  242. package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
  243. package/src/platforms/drivers/opencode/channels.js +40 -0
  244. package/src/platforms/drivers/opencode/conversion.js +41 -0
  245. package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
  246. package/src/platforms/drivers/opencode/mcp.js +9 -0
  247. package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
  248. package/src/platforms/drivers/opencode/native-config.js +26 -0
  249. package/src/platforms/drivers/opencode/native-logs.js +133 -0
  250. package/src/platforms/drivers/opencode/project-config.js +98 -0
  251. package/src/platforms/drivers/opencode/projects.js +20 -0
  252. package/src/platforms/drivers/opencode/prompts.js +9 -0
  253. package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
  254. package/src/platforms/drivers/opencode/proxy.js +16 -0
  255. package/src/platforms/drivers/opencode/resource-sync.js +9 -0
  256. package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
  257. package/src/platforms/drivers/opencode/sessions.js +48 -0
  258. package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
  259. package/src/platforms/drivers/opencode/statistics.js +16 -0
  260. package/src/platforms/drivers/secure-file-driver.js +272 -0
  261. package/src/platforms/drivers/unsupported.js +7 -0
  262. package/src/platforms/manifest-schema.js +398 -0
  263. package/src/platforms/manifests/claude.json +489 -0
  264. package/src/platforms/manifests/codex.json +448 -0
  265. package/src/platforms/manifests/gemini.json +447 -0
  266. package/src/platforms/manifests/omp.json +496 -0
  267. package/src/platforms/manifests/opencode.json +422 -0
  268. package/src/{server/services → platforms}/native-oauth-adapters.js +87 -417
  269. package/src/{server/services → platforms}/notification-hooks.js +140 -1023
  270. package/src/platforms/oauth-credentials-service.js +506 -0
  271. package/src/platforms/path-resolver.js +179 -0
  272. package/src/platforms/platform-path-context.js +305 -0
  273. package/src/platforms/registry.js +248 -0
  274. package/src/platforms/remote-notification-providers.js +678 -0
  275. package/src/platforms/runtime.js +259 -0
  276. package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
  277. package/src/plugins/plugin-loader.js +2 -2
  278. package/src/plugins/plugin-manager.js +2 -2
  279. package/src/plugins/registry.js +27 -10
  280. package/src/reset-config.js +21 -5
  281. package/src/server/api/agents.js +46 -72
  282. package/src/server/api/commands.js +16 -6
  283. package/src/server/api/config-registry.js +206 -59
  284. package/src/server/api/config-sync.js +3 -2
  285. package/src/server/api/config-templates.js +20 -4
  286. package/src/server/api/config.js +111 -102
  287. package/src/server/api/convert.js +54 -178
  288. package/src/server/api/dashboard.js +168 -102
  289. package/src/server/api/hooks.js +1 -1
  290. package/src/server/api/mcp.js +224 -84
  291. package/src/server/api/platform-api-config.js +102 -0
  292. package/src/server/api/platform-route-factory.js +215 -0
  293. package/src/server/api/platform-routes.js +26 -0
  294. package/src/server/api/platforms.js +110 -0
  295. package/src/server/api/plugins.js +57 -57
  296. package/src/server/api/project-config.js +168 -0
  297. package/src/server/api/prompts.js +58 -45
  298. package/src/server/api/settings.js +55 -8
  299. package/src/server/api/skills.js +262 -133
  300. package/src/server/api/ui-config.js +2 -2
  301. package/src/server/api/validation-errors.js +18 -4
  302. package/src/server/api/workspaces.js +47 -12
  303. package/src/server/index.js +164 -213
  304. package/src/server/platform-context.js +81 -0
  305. package/src/server/services/channel-balance.js +11 -20
  306. package/src/server/services/channel-health.js +21 -6
  307. package/src/server/services/channel-scheduler.js +29 -39
  308. package/src/server/services/channel-sync-utils.js +23 -13
  309. package/src/server/services/config-export-service.js +350 -319
  310. package/src/server/services/config-registry-service.js +280 -54
  311. package/src/server/services/config-sync-manager.js +172 -944
  312. package/src/server/services/config-templates-service.js +419 -353
  313. package/src/server/services/control-manifest-store.js +206 -0
  314. package/src/server/services/dashboard-snapshot-worker.js +656 -100
  315. package/src/server/services/effective-control-service.js +557 -0
  316. package/src/server/services/local-resource-index.js +314 -0
  317. package/src/server/services/mcp-service.js +607 -977
  318. package/src/server/services/model-detector.js +15 -10
  319. package/src/server/services/native-log-channel-resolver.js +214 -0
  320. package/src/server/services/native-log-observer.js +291 -0
  321. package/src/server/services/network-access.js +1 -1
  322. package/src/server/services/platform-catalog.js +82 -0
  323. package/src/server/services/platform-resolution.js +32 -29
  324. package/src/server/services/plugins-service.js +376 -122
  325. package/src/server/services/project-config-service.js +550 -0
  326. package/src/server/services/project-path-validation.js +31 -0
  327. package/src/server/services/prompts-service.js +267 -233
  328. package/src/server/services/proxy-runtime.js +7 -4
  329. package/src/server/services/remote-credential-cache.js +43 -0
  330. package/src/server/services/repo-scanner-base.js +182 -75
  331. package/src/server/services/request-logger.js +7 -4
  332. package/src/server/services/session-history-index.js +780 -213
  333. package/src/server/services/session-history-worker.js +228 -33
  334. package/src/server/services/session-snapshot-worker.js +124 -34
  335. package/src/server/services/session-snapshots.js +4 -2
  336. package/src/server/services/skill-artifact-store.js +355 -0
  337. package/src/server/services/skill-format-adapters.js +65 -0
  338. package/src/server/services/skill-projection-service.js +323 -0
  339. package/src/server/services/skill-refresh-task-service.js +275 -0
  340. package/src/server/services/skill-service.js +2020 -677
  341. package/src/server/services/snapshot-cache.js +30 -8
  342. package/src/server/services/speed-test.js +8 -8
  343. package/src/server/services/sqlite-connection.js +19 -3
  344. package/src/server/services/statistics-service.js +240 -57
  345. package/src/server/services/ui-config.js +107 -76
  346. package/src/server/services/usage-log-utils.js +98 -0
  347. package/src/server/services/web-build.js +1 -1
  348. package/src/server/services/workspace-service.js +59 -29
  349. package/src/server/utils/pricing.js +10 -19
  350. package/src/server/websocket-server.js +153 -28
  351. package/src/{server/services/base → shared}/base-channel-service.js +156 -28
  352. package/src/shared/capability-driver.js +104 -0
  353. package/src/shared/channel-auth-policy.js +27 -0
  354. package/src/shared/channel-driver.js +161 -0
  355. package/src/shared/driver-factories/api.js +180 -0
  356. package/src/shared/driver-factories/mcp.js +244 -0
  357. package/src/shared/driver-factories/projects.js +121 -0
  358. package/src/shared/driver-factories/prompts.js +58 -0
  359. package/src/shared/driver-factories/resource-sync.js +375 -0
  360. package/src/shared/driver-result.js +78 -0
  361. package/src/shared/mcp-format.js +189 -0
  362. package/src/shared/platforms.js +104 -167
  363. package/src/shared/project-config.js +512 -0
  364. package/src/shared/proxy-driver.js +57 -0
  365. package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
  366. package/src/ui/menu.js +91 -67
  367. package/src/utils/port-helper.js +35 -19
  368. package/src/utils/session.js +1 -1
  369. package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
  370. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  371. package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
  372. package/dist/web/assets/Home-DCEyLzwX.js +0 -1
  373. package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
  374. package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
  375. package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
  376. package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
  377. package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
  378. package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
  379. package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
  380. package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
  381. package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
  382. package/dist/web/assets/icons-nGdSKQn2.js +0 -1
  383. package/dist/web/assets/index-D5hyHPj7.js +0 -2
  384. package/dist/web/assets/index-bJRG3RXH.css +0 -1
  385. package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
  386. package/dist/web/assets/markdown-BfC0goYb.css +0 -10
  387. package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
  388. package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
  389. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
  390. package/src/config/model-pricing.js +0 -35
  391. package/src/server/api/channels.js +0 -439
  392. package/src/server/api/claude-hooks.js +0 -56
  393. package/src/server/api/claude-statistics.js +0 -57
  394. package/src/server/api/codex-channels.js +0 -491
  395. package/src/server/api/codex-projects.js +0 -117
  396. package/src/server/api/codex-proxy.js +0 -293
  397. package/src/server/api/codex-sessions.js +0 -652
  398. package/src/server/api/codex-statistics.js +0 -57
  399. package/src/server/api/gemini-channels.js +0 -392
  400. package/src/server/api/gemini-projects.js +0 -103
  401. package/src/server/api/gemini-proxy.js +0 -231
  402. package/src/server/api/gemini-sessions.js +0 -550
  403. package/src/server/api/gemini-statistics.js +0 -57
  404. package/src/server/api/health-check.js +0 -31
  405. package/src/server/api/oauth-credentials.js +0 -198
  406. package/src/server/api/omp-channels.js +0 -575
  407. package/src/server/api/omp-projects.js +0 -88
  408. package/src/server/api/omp-proxy.js +0 -125
  409. package/src/server/api/omp-sessions.js +0 -386
  410. package/src/server/api/omp-statistics.js +0 -40
  411. package/src/server/api/opencode-channels.js +0 -471
  412. package/src/server/api/opencode-projects.js +0 -110
  413. package/src/server/api/opencode-proxy.js +0 -354
  414. package/src/server/api/opencode-sessions.js +0 -466
  415. package/src/server/api/opencode-statistics.js +0 -57
  416. package/src/server/api/projects.js +0 -120
  417. package/src/server/api/proxy.js +0 -330
  418. package/src/server/api/sessions.js +0 -810
  419. package/src/server/services/oauth-credentials-service.js +0 -945
  420. package/src/server/services/omp-session-log-observer.js +0 -138
  421. package/src/server/services/opencode-gateway-adapters.js +0 -43
  422. package/src/server/services/project-snapshots.js +0 -59
  423. package/src/server/services/proxy-log-helper.js +0 -298
  424. package/src/server/services/session-cache.js +0 -127
  425. package/src/server/services/session-converter.js +0 -582
  426. package/src/server/services/session-history-adapters/claude.js +0 -235
  427. /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
  428. /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
  429. /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
  430. /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
  431. /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
  432. /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
  433. /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
  434. /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
@@ -0,0 +1,213 @@
1
+ # OMP Skill Refresh Boundary Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Make the OMP Skill panel's local scan path explicit and ensure only the manual “刷新远端” action can enqueue a remote Skill refresh.
6
+
7
+ **Architecture:** Keep the existing scan/refresh API split. Rename the generic `SkillsPanel.vue` list-loading operation to `scanLocalSkills`, route every lifecycle/update callback through it, and leave `handleRefresh` as the only caller of `refreshSkills`. Preserve the existing server GET scan-only contract and lock it with an OMP-specific API test; rebuild the ignored Web bundle for deployment verification.
8
+
9
+ **Tech Stack:** Vue 3 `<script setup>`, Vitest, Vue Test Utils, Express, Supertest, Vite, Node.js.
10
+
11
+ ---
12
+
13
+ ### Task 1: Lock OMP panel scan-only lifecycle
14
+
15
+ **Files:**
16
+ - Modify: `src/web/src/components/__tests__/SkillsPanelSwitch.test.js`
17
+ - Modify: `src/web/src/components/SkillsPanel.vue:260-286,297,430,454,468-486`
18
+
19
+ - [ ] **Step 1: Extend the frontend test fixture to include OMP**
20
+
21
+ Add OMP to the mocked platform catalog and retain the existing `getSkills`, `refreshSkills`, and task mocks. Add a helper that mounts the real `SkillsPanel` with explicit OMP props:
22
+
23
+ ```js
24
+ async function createOmpWrapper(props = {}) {
25
+ const { default: SkillsPanel } = await import('../SkillsPanel.vue')
26
+ return mount(SkillsPanel, {
27
+ props: { platform: 'omp', ...props },
28
+ global: {
29
+ stubs: {
30
+ SkillCard: { template: '<div />' },
31
+ SkillRepoManager: { template: '<div />' },
32
+ SkillCreateModal: { template: '<div />' },
33
+ SkillDetailDrawer: { template: '<div />' },
34
+ OmpSkillSettingsModal: { template: '<div />' }
35
+ }
36
+ }
37
+ })
38
+ }
39
+ ```
40
+
41
+ - [ ] **Step 2: Add the OMP mount and drawer-open regression assertions**
42
+
43
+ Add tests that exercise both initial standalone rendering and a hidden-then-visible drawer. The assertions must distinguish a local GET scan from the remote refresh command:
44
+
45
+ ```js
46
+ test.each([
47
+ { inDrawer: false, drawerVisible: false },
48
+ { inDrawer: true, drawerVisible: true }
49
+ ])('OMP panel load scans local state without remote refresh (%o)', async props => {
50
+ const wrapper = await createOmpWrapper(props)
51
+ await flushPromises()
52
+
53
+ expect(api.getSkills).toHaveBeenCalledWith('omp', {})
54
+ expect(api.refreshSkills).not.toHaveBeenCalled()
55
+ wrapper.unmount()
56
+ })
57
+
58
+ test('opening a hidden OMP drawer scans once without enqueuing refresh', async () => {
59
+ const wrapper = await createOmpWrapper({ inDrawer: true, drawerVisible: false })
60
+ await flushPromises()
61
+ expect(api.getSkills).not.toHaveBeenCalled()
62
+
63
+ await wrapper.setProps({ drawerVisible: true })
64
+ await flushPromises()
65
+
66
+ expect(api.getSkills).toHaveBeenCalledWith('omp', {})
67
+ expect(api.refreshSkills).not.toHaveBeenCalled()
68
+ wrapper.unmount()
69
+ })
70
+ ```
71
+
72
+ Run before the production rename:
73
+
74
+ ```bash
75
+ npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
76
+ ```
77
+
78
+ Expected baseline: the existing source's scan-only behavior remains green; this is a regression characterization because the reported behavior is not reproducible in the checked-out source. Do not change the assertions to force a false failure.
79
+
80
+ - [ ] **Step 3: Rename the generic loader to make the boundary explicit**
81
+
82
+ In `src/web/src/components/SkillsPanel.vue`, rename `loadData` to `scanLocalSkills` and update every non-refresh reference:
83
+
84
+ ```js
85
+ async function scanLocalSkills({ notifyError = true } = {}) {
86
+ // Keep the existing request-id, platform/scope checks, GET getSkills call,
87
+ // response validation, state assignment, and error handling unchanged.
88
+ }
89
+ ```
90
+
91
+ Update these call sites to `scanLocalSkills`:
92
+
93
+ - `SkillRepoManager @updated`;
94
+ - `SkillCreateModal @created`;
95
+ - `SkillDetailDrawer @updated`;
96
+ - `handleImport` completion;
97
+ - `handleRefresh` completion after task polling;
98
+ - `handleOmpSettingsSaved` passed callback;
99
+ - standalone `onMounted` load;
100
+ - `drawerVisible` watcher;
101
+ - platform/scope/project-path watcher.
102
+
103
+ Keep `handleRefresh` unchanged in responsibility: it alone calls `refreshSkills(platform, scopeOptions.value)`, polls `getSkillRefreshTask`, and calls `scanLocalSkills()` after a terminal task. No lifecycle callback may call `refreshSkills` or pass a boolean force argument.
104
+
105
+ - [ ] **Step 4: Re-run the focused frontend tests**
106
+
107
+ Run:
108
+
109
+ ```bash
110
+ npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
111
+ ```
112
+
113
+ Expected: all tests pass; the OMP mount/open cases show `getSkills('omp', {})` and zero `refreshSkills` calls.
114
+
115
+ - [ ] **Step 5: Commit the frontend boundary change**
116
+
117
+ ```bash
118
+ git add src/web/src/components/SkillsPanel.vue src/web/src/components/__tests__/SkillsPanelSwitch.test.js
119
+ git commit -m "fix: keep OMP skill panel scans local"
120
+ ```
121
+
122
+ ---
123
+
124
+ ### Task 2: Lock the server scan-only contract for OMP
125
+
126
+ **Files:**
127
+ - Modify: `tests/unit/api/skills-api.test.js:718-750`
128
+ - Verify only: `src/server/api/skills.js:145-209`
129
+
130
+ - [ ] **Step 1: Add an OMP-specific GET regression test**
131
+
132
+ Within `describe('new Skill control surface')`, add a test using the existing injected service fixture:
133
+
134
+ ```js
135
+ test('OMP GET ignores refresh query and never starts remote work', async () => {
136
+ const ompService = services.omp
137
+ ompService.scanSkills = vi.fn(async () => ({
138
+ skills: [{ name: 'omp-local', enabled: false, cached: true, managed: true }],
139
+ refresh: { state: 'never_fetched', taskId: null, fetchedAt: null, error: null }
140
+ }))
141
+ ompService.refreshRemoteSkills = vi.fn()
142
+
143
+ const app = buildInjectedApp({
144
+ controlService: { setSkillEnabled: vi.fn() },
145
+ refreshTasks: { enqueue: vi.fn(), get: vi.fn() }
146
+ })
147
+ const res = await request(app).get('/?platform=omp&refresh=1')
148
+
149
+ expect(res.status).toBe(200)
150
+ expect(ompService.scanSkills).toHaveBeenCalledWith({ scope: 'user' })
151
+ expect(ompService.refreshRemoteSkills).not.toHaveBeenCalled()
152
+ })
153
+ ```
154
+
155
+ - [ ] **Step 2: Run the server regression test before any server edit**
156
+
157
+ Run:
158
+
159
+ ```bash
160
+ npm exec -- vitest run tests/unit/api/skills-api.test.js -t "OMP GET ignores refresh query and never starts remote work"
161
+ ```
162
+
163
+ Expected baseline: PASS, confirming the server boundary is already correct in the checked-out source. No server production change is required unless this test exposes a regression.
164
+
165
+ - [ ] **Step 3: Commit the server contract test**
166
+
167
+ ```bash
168
+ git add tests/unit/api/skills-api.test.js
169
+ git commit -m "test: cover OMP scan-only skill listing"
170
+ ```
171
+
172
+ ---
173
+
174
+ ### Task 3: Rebuild and verify the deployed behavior
175
+
176
+ **Files:**
177
+ - Modify generated ignored output: `dist/web/` (via the existing build command; do not stage it)
178
+
179
+ - [ ] **Step 1: Run focused frontend and server tests together**
180
+
181
+ ```bash
182
+ npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
183
+ npm exec -- vitest run tests/unit/api/skills-api.test.js tests/unit/services/skill-service.test.js -t "OMP GET ignores refresh query and never starts remote work|scanSkills never performs a network refresh|scanSkills does not refresh remote OMP repositories"
184
+ ```
185
+
186
+ Expected: all selected tests pass, with no `POST /skills/refresh` on panel mount/open paths.
187
+
188
+ - [ ] **Step 2: Rebuild the production Web bundle**
189
+
190
+ ```bash
191
+ npm run build:web
192
+ ```
193
+
194
+ Expected: Vite completes successfully and the generated bundle contains the scan-only `GET /skills` request path; `refreshSkills` remains reachable only from the explicit refresh handler.
195
+
196
+ - [ ] **Step 3: Run the original browser smoke scenario**
197
+
198
+ Use the actual Web UI to:
199
+
200
+ 1. open `/cli/omp`;
201
+ 2. open the Skills drawer;
202
+ 3. record API requests during each action.
203
+
204
+ Expected: panel load/open produces `GET /api/skills?platform=omp&scope=user` and no `POST /api/skills/refresh`. The existing independent `GET /api/channel-balances?source=omp` balance probe is not part of this Skill-refresh assertion.
205
+
206
+ - [ ] **Step 4: Commit only tracked source/test changes and report deployment requirement**
207
+
208
+ ```bash
209
+ git status --short
210
+ git log -2 --oneline
211
+ ```
212
+
213
+ Expected: only the pre-existing untracked `.omx/` and `.worktrees/` entries remain outside the two task commits. Deployment must rebuild `dist/` and restart any existing backend process; a stale process or stale packaged bundle can retain the old behavior even when source tests pass.
@@ -0,0 +1,125 @@
1
+ # 实时日志面板空白修复 Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** 修复渠道管理页未渲染 `ProxyLogs` 导致实时日志区域空白的问题。
6
+
7
+ **Architecture:** 保持现有日志数据流和组件边界不变,仅在 `RightPanel.vue` 显式导入其模板使用的 `ProxyLogs.vue`。使用仓库已有的静态前端组件测试模式增加回归断言,并通过前端构建和真实页面冒烟验证渲染结果。
8
+
9
+ **Tech Stack:** Vue 3 `<script setup>`、Vite、Vitest、Node.js。
10
+
11
+ ---
12
+
13
+ ### Task 1: Add regression coverage for component registration
14
+
15
+ **Files:**
16
+ - Modify: `tests/unit/web/log-components.test.js`
17
+
18
+ - [ ] **Step 1: Write the failing test**
19
+
20
+ 在现有 `describe('web log components source routing', ...)` 中追加:
21
+
22
+ ```js
23
+ test('RightPanel registers the ProxyLogs component used by its template', () => {
24
+ const source = readProjectFile('src/web/src/components/RightPanel.vue')
25
+
26
+ expect(source).toContain("import ProxyLogs from './ProxyLogs.vue'")
27
+ expect(source).toContain('<ProxyLogs :source="currentChannel" />')
28
+ })
29
+ ```
30
+
31
+ - [ ] **Step 2: Run the focused test and verify it fails**
32
+
33
+ Run from repository root:
34
+
35
+ ```bash
36
+ npx vitest run tests/unit/web/log-components.test.js
37
+ ```
38
+
39
+ Expected: the new test fails because `RightPanel.vue` currently has no `ProxyLogs` import.
40
+
41
+ - [ ] **Step 3: Confirm failure is the intended regression**
42
+
43
+ The failure must identify the missing import assertion, not a test parse/setup error. Do not change production code before this failure is observed.
44
+
45
+ ### Task 2: Register and render the existing log component
46
+
47
+ **Files:**
48
+ - Modify: `src/web/src/components/RightPanel.vue:147-152`
49
+
50
+ - [ ] **Step 1: Add the minimal import**
51
+
52
+ Add the import alongside the other channel panel imports:
53
+
54
+ ```js
55
+ import ProxyLogs from './ProxyLogs.vue'
56
+ ```
57
+
58
+ Do not change the existing template binding:
59
+
60
+ ```vue
61
+ <ProxyLogs :source="currentChannel" />
62
+ ```
63
+
64
+ Do not modify `ProxyLogs.vue`, WebSocket handling, Pinia state, statistics APIs, or layout CSS.
65
+
66
+ - [ ] **Step 2: Run the focused regression test**
67
+
68
+ ```bash
69
+ npx vitest run tests/unit/web/log-components.test.js
70
+ ```
71
+
72
+ Expected: all tests in this file pass.
73
+
74
+ - [ ] **Step 3: Build the frontend**
75
+
76
+ ```bash
77
+ npm run build:web
78
+ ```
79
+
80
+ Expected: Vite completes successfully without unresolved component warnings or build errors.
81
+
82
+ ### Task 3: Verify the real channel-management surface
83
+
84
+ **Files:**
85
+ - No source changes.
86
+
87
+ - [ ] **Step 1: Open the running local application**
88
+
89
+ Use the existing local service at `http://localhost:19999` and navigate to:
90
+
91
+ ```text
92
+ http://localhost:19999/cli/omp
93
+ ```
94
+
95
+ - [ ] **Step 2: Verify the rendered log panel**
96
+
97
+ Confirm the right panel contains:
98
+
99
+ - `实时日志`
100
+ - the table header (`渠道`, `请求`, `回复`, platform-specific columns, `时间`)
101
+ - either existing log rows or `暂无日志`
102
+ - the connection status footer
103
+
104
+ The `.logs-section` must contain rendered `.proxy-logs` content rather than an unresolved `<proxylogs>` custom element.
105
+
106
+ - [ ] **Step 3: Verify the changed contract after build**
107
+
108
+ Refresh the page and repeat the check on at least one other channel route, such as `/cli/codex` or `/cli/claude`. Existing dashboard log behavior must remain intact.
109
+
110
+ ### Task 4: Final review and cleanup
111
+
112
+ **Files:**
113
+ - Review only: `src/web/src/components/RightPanel.vue`, `tests/unit/web/log-components.test.js`
114
+
115
+ - [ ] **Step 1: Inspect the final diff**
116
+
117
+ Confirm only the intended import and regression test are present, and existing user modifications remain untouched.
118
+
119
+ - [ ] **Step 2: Run the focused test once more**
120
+
121
+ ```bash
122
+ npx vitest run tests/unit/web/log-components.test.js
123
+ ```
124
+
125
+ Expected: PASS.
@@ -0,0 +1,86 @@
1
+ # 配置化平台边界实施计划
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax.
4
+
5
+ **Goal:** 删除平台专属 API 和项目配置适配器目录,把平台业务收敛到 Driver,把跨平台核心工具收敛到 `src/shared`。
6
+
7
+ **Architecture:** 保留一个通用 platform API route factory,使用 manifest 的 aliases、capabilities 和 route definitions 生成旧 URL;Driver 提供平台操作和校验。`src/server` 只保留 HTTP 注册、请求响应转换、通用服务与基础设施;`src/platforms/drivers/<platform>` 不创建 shared 子目录。
8
+
9
+ **Tech Stack:** Node.js 22、CommonJS、Express、Vitest、现有 Registry/Runtime/manifest loader。
10
+
11
+ ---
12
+
13
+ ### Task 1: 搬迁共享项目配置核心
14
+
15
+ **Files:**
16
+ - Create: `src/shared/project-config.js`
17
+ - Modify: `src/server/services/project-config-service.js`
18
+ - Modify: `src/server/services/mcp-service.js`
19
+ - Modify: `src/server/services/config-templates-service.js`
20
+ - Modify: `src/server/services/config-sync-manager.js`
21
+ - Modify: `src/server/services/skill-service.js`
22
+ - Modify: `src/server/services/skill-projection-service.js`
23
+ - Modify: `src/server/api/mcp.js`
24
+ - Create/modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/project-config.js`
25
+ - Delete: `src/server/services/project-config-adapters/`
26
+ - Test: affected project-config and MCP tests
27
+
28
+ - [ ] 将 `project-config-adapters/shared.js` 的通用路径安全、JSON/TOML 原子读写、MCP patch、secret 脱敏函数搬到 `src/shared/project-config.js`,只修正相对 import。
29
+ - [ ] 将五个平台 adapter 搬到对应 Driver 的 `project-config.js`,导出相同 `createAdapter`,平台格式仅由 Driver 自身实现。
30
+ - [ ] 修改 `ProjectConfigService`,从 Runtime/manifest 获取 `projectConfig` Driver,不再维护 `FACTORIES` 和旧目录路径。
31
+ - [ ] 将通用服务和 API 的 shared import 统一改为 `src/shared/project-config`。
32
+ - [ ] 删除旧 `project-config-adapters` 目录。
33
+ - [ ] 运行 `npx vitest run tests/unit/services/project-config-service.test.js tests/unit/services/mcp-service.test.js tests/unit/api/project-config.test.js --no-file-parallelism --maxWorkers=1`。
34
+
35
+ ### Task 2: 建立配置化平台 API 路由描述
36
+
37
+ **Files:**
38
+ - Create: `src/server/api/platform-api-config.js`
39
+ - Modify: `src/platforms/manifest-schema.js`
40
+ - Modify: `src/platforms/manifests/*.json`
41
+ - Modify: `src/platforms/drivers/legacy.js`
42
+ - Modify: `src/server/api/platform-route-factory.js`
43
+ - Test: platform registry and route factory tests
44
+
45
+ - [ ] 为 manifest 增加可选 `api` 描述,包含平台旧 URL alias 和 capability route operation;schema 严格校验 path、method、capability、operation。
46
+ - [ ] 把各平台共同的 projects、sessions、channels、proxy、statistics 路由整理成一份配置,不复制五份 Express route 文件。
47
+ - [ ] 在 route factory 中统一解析 platform、project、session、channel 参数,调用 Runtime Driver,并统一映射 `ok/unsupported/invalid/failed`。
48
+ - [ ] 将仅平台不同的参数名、安装检测、默认值和校验作为 Driver operation 或 manifest data,不在路由 factory 中写平台分支。
49
+ - [ ] 为旧 `/api/channels`、`/api/codex/...`、`/api/gemini/...`、`/api/opencode/...`、`/api/omp/...` 注册 aliases。
50
+ - [ ] 添加未知平台、unsupported capability、Driver error 和旧 URL 等价响应测试。
51
+
52
+ ### Task 3: 将平台 API 业务下沉到 Driver
53
+
54
+ **Files:**
55
+ - Create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/api-operations.js`
56
+ - Modify: corresponding channel/proxy/session/statistics/config Driver files
57
+ - Modify: `src/server/index.js`
58
+ - Delete: platform-specific files under `src/server/api/`
59
+ - Modify: API tests to exercise generic router and old aliases
60
+
61
+ - [ ] 从平台 API 文件提取 provider 校验、CLI 安装检测、默认模型、speed-test、native config、session operation 和 platform DTO 到对应 `api-operations.js` 或现有 capability Driver。
62
+ - [ ] 保持旧请求参数和响应格式,由 operation adapter 生成兼容 DTO;通用路由只负责调用和输出。
63
+ - [ ] 让每个平台 Driver 暴露相同 operation names,不支持的 operation 返回结构化 `unsupported`。
64
+ - [ ] 用一个通用 router 替换 server index 中的平台 API require/mount 列表。
65
+ - [ ] 删除 `codex-channels.js`、`gemini-channels.js`、`opencode-channels.js`、`omp-channels.js`、各平台 proxy/projects/sessions/statistics API 文件及不再需要的单独路由目录。
66
+ - [ ] 保留真正通用的 `platform-route-factory.js`、validation、response 和 websocket 基础设施。
67
+
68
+ ### Task 4: 清理引用和迁移测试
69
+
70
+ **Files:**
71
+ - Modify: all production imports of deleted API/config adapter paths
72
+ - Modify: tests under `tests/unit/api`, `tests/unit/services`, `tests/unit/platforms`
73
+ - Delete: tests that only assert deleted platform route modules
74
+
75
+ - [ ] 全局搜索并消除 `src/server/api/<platform>-*.js` 和 `src/server/services/project-config-adapters` 的生产及测试引用。
76
+ - [ ] 将 require.cache mock seam 改为 generic router 或 Driver operation seam。
77
+ - [ ] 删除仅覆盖重复路由实现的测试,保留每个平台的行为 contract test。
78
+ - [ ] 检查 `src/platforms/drivers` 不存在 `shared` 子目录。
79
+
80
+ ### Task 5: 完整验证与提交
81
+
82
+ - [ ] 运行所有 API、Driver、项目配置和 CLI 相关测试。
83
+ - [ ] 运行完整 `npx vitest run tests/unit --no-file-parallelism --maxWorkers=1 --testTimeout=30000`。
84
+ - [ ] 运行所有平台 capability Driver 加载冒烟和 `git diff --check`。
85
+ - [ ] 检查工作树无测试生成数据库差异。
86
+ - [ ] 提交:`refactor: make platform APIs configuration-driven`。