coding-tool-x 3.7.11 → 3.7.13

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 (44) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +1 -1
  3. package/dist/web/assets/{Analytics-Ck_00Brj.js → Analytics-8dRv1aYW.js} +1 -1
  4. package/dist/web/assets/{ConfigTemplates-Cpw2vUa8.js → ConfigTemplates-BQRXSICO.js} +1 -1
  5. package/dist/web/assets/Home-BtzWhKIa.js +1 -0
  6. package/dist/web/assets/Home-DYVy4cGZ.css +1 -0
  7. package/dist/web/assets/{PluginManager-2RlvEJCT.js → PluginManager-BTa-Ygf6.js} +1 -1
  8. package/dist/web/assets/{ProjectList-_ecCngpl.js → ProjectList-F_cB8ldA.js} +1 -1
  9. package/dist/web/assets/{SessionList-DlWcw3hO.js → SessionList-LOrbPQvu.js} +1 -1
  10. package/dist/web/assets/SkillManager-BsX8Qpj0.css +1 -0
  11. package/dist/web/assets/SkillManager-BzI_t-yV.js +1 -0
  12. package/dist/web/assets/{WorkspaceManager-3mqghi09.js → WorkspaceManager-Db9RGiz7.js} +1 -1
  13. package/dist/web/assets/index-DIWJmyL6.js +2 -0
  14. package/dist/web/assets/{index-BceXgSSe.css → index-bJRG3RXH.css} +1 -1
  15. package/dist/web/index.html +2 -2
  16. package/docs/superpowers/plans/2026-08-01-omp-skill-scan-settings.md +759 -0
  17. package/docs/superpowers/specs/2026-08-01-omp-skill-scan-settings-design.md +224 -0
  18. package/package.json +1 -1
  19. package/src/commands/proxy-control.js +12 -12
  20. package/src/commands/toggle-proxy.js +9 -9
  21. package/src/config/paths.js +53 -29
  22. package/src/index.js +1 -1
  23. package/src/server/api/plugins.js +119 -47
  24. package/src/server/api/skills.js +63 -10
  25. package/src/server/omp-proxy-server.js +17 -4
  26. package/src/server/services/channel-health.js +5 -0
  27. package/src/server/services/channel-sync-utils.js +1 -1
  28. package/src/server/services/model-definition-schema.js +2 -1
  29. package/src/server/services/omp-channels.js +213 -26
  30. package/src/server/services/omp-config.js +71 -6
  31. package/src/server/services/omp-native-plugin-adapter.js +456 -0
  32. package/src/server/services/omp-settings-manager.js +3 -1
  33. package/src/server/services/omp-skill-discovery.js +358 -0
  34. package/src/server/services/omp-skill-settings-service.js +97 -0
  35. package/src/server/services/pi-omp-migration.js +273 -0
  36. package/src/server/services/platform-resolution.js +44 -0
  37. package/src/server/services/plugins-service.js +85 -561
  38. package/src/server/services/project-path-validation.js +65 -0
  39. package/src/server/services/skill-service.js +169 -77
  40. package/dist/web/assets/Home-Bft3Kztl.js +0 -1
  41. package/dist/web/assets/Home-CHZJkkjH.css +0 -1
  42. package/dist/web/assets/SkillManager-CnY7IXkX.js +0 -1
  43. package/dist/web/assets/SkillManager-D7pd-d_P.css +0 -1
  44. package/dist/web/assets/index-k5oP7c-A.js +0 -2
@@ -0,0 +1,224 @@
1
+ # OMP 技能扫描设置设计
2
+
3
+ ## 目标
4
+
5
+ 在技能管理界面为 OMP 平台提供独立的扫描来源设置入口。用户可以控制 OMP 技能发现是否扫描 Codex 用户目录、Claude 用户及插件目录、OMP 用户及插件目录、当前项目 `.omp/skills`,并在保存后立即刷新当前技能列表。
6
+
7
+ 本功能不展示、读取或写入 `skills.enabled`。现有 `skills.enabled` 以及所有未列入本功能白名单的配置必须原样保留。
8
+
9
+ ## 范围
10
+
11
+ ### 包含
12
+
13
+ - OMP 平台下,SkillsPanel 独立页和抽屉页工具栏均显示“设置”按钮。
14
+ - 非 OMP 平台不显示该入口。
15
+ - 新增窄幅“技能扫描设置”弹窗。
16
+ - 新增专用 `GET /api/skills/omp-settings` 与 `PUT /api/skills/omp-settings`。
17
+ - 持久化 OMP `config.yml` 中 `skills` 节点的四个白名单字段。
18
+ - 保存成功后强制刷新当前技能列表。
19
+ - API 与前端交互回归测试。
20
+
21
+ ### 不包含
22
+
23
+ - `skills.enabled` 总开关。
24
+ - Claude 项目、Agents、customDirectories、includeSkills、ignoredSkills 等其他 OMP Skills 配置。
25
+ - 通用 SettingsDrawer 集成。
26
+ - 修改 OMP 技能发现本身的扫描算法。
27
+
28
+ ## 配置模型
29
+
30
+ API 仅暴露以下四个布尔字段:
31
+
32
+ ```js
33
+ {
34
+ enableCodexUser: true,
35
+ enableClaudeUser: true,
36
+ enablePiUser: true,
37
+ enablePiProject: true
38
+ }
39
+ ```
40
+
41
+ 含义:
42
+
43
+ - `enableCodexUser`:扫描 Codex 用户 Skills。
44
+ - `enableClaudeUser`:扫描 Claude 用户 Skills 与 Claude 插件 Skills。
45
+ - `enablePiUser`:扫描 OMP 用户 Skills 与 OMP 插件 Skills。
46
+ - `enablePiProject`:扫描当前项目 `.omp/skills`。
47
+
48
+ 任一字段在持久化配置中缺失时,GET 返回 `true`。默认值只补齐 API 响应,不要求 GET 写盘。
49
+
50
+ ## 前端设计
51
+
52
+ ### 入口
53
+
54
+ SkillsPanel 根据 `currentPlatform === 'omp'` 决定是否渲染“设置”按钮。按钮加入现有 `asset-action-row`:
55
+
56
+ - 独立页头部工具栏可用。
57
+ - 抽屉页工具栏可用。
58
+ - 其他平台完全不渲染按钮,而不是仅禁用。
59
+
60
+ 入口逻辑沿用 SkillsPanel 已有的平台解析结果,避免建立第二套平台判断。
61
+
62
+ ### 设置弹窗
63
+
64
+ 新增独立 `OmpSkillSettingsModal` 组件,职责仅包括读取、编辑和保存四个扫描来源。SkillsPanel 只负责控制可见性,并在组件发出保存成功事件后刷新列表。
65
+
66
+ 弹窗设计:
67
+
68
+ - 标题:`技能扫描设置`。
69
+ - 宽度约 420px,并受视口最大宽度约束。
70
+ - 分组标题:`扫描来源`。
71
+ - 四行开关,每行包含主标签和简短说明。
72
+ - 底部操作:`取消`、`保存`。
73
+
74
+ 打开弹窗时立即请求实际持久化值。读取期间显示加载状态,避免用户编辑尚未初始化的表单。
75
+
76
+ ### 交互状态
77
+
78
+ - 读取成功:以 GET 返回值初始化四个开关。
79
+ - 读取失败:显示错误提示,不修改 SkillsPanel 已有技能列表;弹窗保留错误状态,允许关闭后重试。
80
+ - 保存期间:四个开关、取消、关闭与保存操作全部禁用,防止并发写入或丢失提交状态。
81
+ - 保存成功:显示成功提示,关闭弹窗,并等待 `loadData(true)` 完成以强制刷新当前列表。
82
+ - 保存失败:显示错误提示,弹窗保持打开,保留用户当前表单值,不刷新列表。
83
+
84
+ ## 服务端设计
85
+
86
+ ### 专用服务边界
87
+
88
+ 新增聚焦于 OMP 技能设置的服务模块,提供:
89
+
90
+ - 读取并补齐四个默认值。
91
+ - 校验 PUT 请求。
92
+ - 将部分更新合并进现有 `skills` 节点。
93
+ - 调用现有 OMP YAML 配置读写能力持久化结果。
94
+
95
+ Skills API 路由仅负责 HTTP 状态和响应封装,不直接实现白名单合并规则。
96
+
97
+ ### GET `/api/skills/omp-settings`
98
+
99
+ 成功响应:
100
+
101
+ ```json
102
+ {
103
+ "success": true,
104
+ "settings": {
105
+ "enableCodexUser": true,
106
+ "enableClaudeUser": true,
107
+ "enablePiUser": true,
108
+ "enablePiProject": true
109
+ }
110
+ }
111
+ ```
112
+
113
+ 读取现有 `config.yml` 的 `skills` 节点,仅选择白名单字段。缺失字段返回默认值 `true`。顶层配置不存在或 `skills` 节点不存在时,同样返回四项默认值。
114
+
115
+ 底层读取错误交由统一 API 错误处理返回失败响应,不用空配置掩盖真实持久化错误。
116
+
117
+ ### PUT `/api/skills/omp-settings`
118
+
119
+ 请求体允许只包含一个或多个白名单字段,例如:
120
+
121
+ ```json
122
+ {
123
+ "enablePiProject": false
124
+ }
125
+ ```
126
+
127
+ 验证规则:
128
+
129
+ - 请求体必须是普通对象,不能是数组或 `null`。
130
+ - 每个键必须属于四字段白名单。
131
+ - 每个值必须是布尔值。
132
+ - 空对象允许作为无变化的有效部分更新,并返回当前有效设置。
133
+ - 任一字段非法时整体返回 400,且不得写盘。
134
+
135
+ 写入步骤:
136
+
137
+ 1. 读取完整 OMP 配置对象。
138
+ 2. 将现有 `skills` 视为对象;若缺失则使用空对象。
139
+ 3. 仅把请求中的白名单字段浅合并到现有 `skills`。
140
+ 4. 将合并后的 `skills` 放回完整配置对象。
141
+ 5. 通过现有 YAML 写入能力写回 `config.yml`。
142
+ 6. 返回补齐默认值后的四字段设置。
143
+
144
+ 该流程必须保留:
145
+
146
+ - `skills.enabled`。
147
+ - `skills` 节点中的其他字段。
148
+ - 整个配置文件的其他顶层节点。
149
+
150
+ ## 数据流
151
+
152
+ ```mermaid
153
+ sequenceDiagram
154
+ participant U as 用户
155
+ participant P as SkillsPanel
156
+ participant M as OmpSkillSettingsModal
157
+ participant A as Skills API
158
+ participant S as OMP Skill Settings Service
159
+ participant Y as config.yml
160
+
161
+ U->>P: 点击设置
162
+ P->>M: 打开弹窗
163
+ M->>A: GET /skills/omp-settings
164
+ A->>S: 读取设置
165
+ S->>Y: 读取完整配置
166
+ Y-->>S: YAML 配置
167
+ S-->>M: 四字段有效值
168
+ U->>M: 修改并保存
169
+ M->>A: PUT /skills/omp-settings
170
+ A->>S: 校验并部分更新
171
+ S->>Y: 写回完整合并配置
172
+ A-->>M: 保存成功
173
+ M-->>P: saved
174
+ P->>P: loadData(true)
175
+ ```
176
+
177
+ ## 错误处理
178
+
179
+ - API 校验错误使用 400,并返回项目统一的失败响应格式。
180
+ - YAML 读取或写入错误使用现有统一错误处理,不返回伪成功。
181
+ - 非法 PUT 在校验完成前不得调用写入函数。
182
+ - 前端读取或写入失败均不触发技能列表刷新。
183
+ - 前端错误提示包含操作上下文,如“加载技能扫描设置失败”或“保存技能扫描设置失败”。
184
+ - 设置请求与技能列表请求彼此独立,设置失败不得清空或替换当前 `skills` 状态。
185
+
186
+ ## 测试策略
187
+
188
+ 严格按红、绿、重构顺序实现。
189
+
190
+ ### 服务端/API 回归
191
+
192
+ 先编写并运行失败测试,再实现:
193
+
194
+ 1. 空配置和缺失字段时,GET 返回四项 `true`。
195
+ 2. PUT 部分更新只改变请求字段。
196
+ 3. PUT 保留 `skills.enabled`、其他 skills 字段和顶层无关字段。
197
+ 4. PUT 包含未知字段时返回 400,配置文件内容不变。
198
+ 5. PUT 包含非布尔值时返回 400,配置文件内容不变。
199
+ 6. 空对象 PUT 不破坏配置,并返回当前有效设置。
200
+
201
+ ### 前端回归
202
+
203
+ 当前 Web 包没有 Vue Test Utils 或 DOM 测试环境。为避免仅通过源代码文本断言,将平台入口判断和保存编排提取为可在现有 Vitest Node 环境直接测试的轻量辅助模块。测试覆盖:
204
+
205
+ 1. OMP 平台允许显示设置入口。
206
+ 2. 非 OMP 平台不允许显示设置入口。
207
+ 3. 保存成功只触发一次 `loadData(true)`。
208
+ 4. 读取失败不触发刷新,并保留当前技能列表。
209
+ 5. 写入失败不触发刷新,并保留当前技能列表。
210
+
211
+ 组件模板继续通过 Web 生产构建验证 Vue 模板、导入和类型形态是否有效。
212
+
213
+ ## 验收标准
214
+
215
+ - OMP 独立技能页和技能抽屉均可打开扫描设置。
216
+ - 非 OMP 平台看不到设置入口。
217
+ - 弹窗只展示四个来源开关,不展示总开关。
218
+ - 缺失配置默认显示为启用。
219
+ - 保存过程中无法重复提交或关闭弹窗。
220
+ - 成功保存后出现成功提示,弹窗关闭,当前技能列表强制刷新。
221
+ - 读取或写入失败时已有技能列表保持不变,并显示明确错误。
222
+ - PUT 不会覆盖任何非白名单配置。
223
+ - 非法字段或非法值被拒绝,且配置文件不发生变化。
224
+ - 定向 Vitest 测试通过,Web 生产构建通过。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coding-tool-x",
3
- "version": "3.7.11",
3
+ "version": "3.7.13",
4
4
  "description": "Vibe Coding 增强工作助手 - 智能会话管理、动态渠道切换、全局搜索、实时监控",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -28,18 +28,18 @@ const CHANNEL_CONFIG = {
28
28
  name: 'OMP',
29
29
  icon: '[*]',
30
30
  aompPath: '/api/omp/proxy',
31
- serviceLabel: 'OMP 受管模型配置',
32
- proxyLabel: '受管模型配置',
33
- startAction: '启用',
34
- stopAction: '停用',
35
- restartAction: '重新同步',
36
- startedMessage: 'OMP 受管模型配置已启用',
37
- stoppedMessage: 'OMP 受管模型配置已停用',
38
- runningText: '已启用',
39
- stoppedText: '未启用',
40
- portLabel: '状态端口',
41
- addressLabel: '状态地址',
42
- startTip: '启用受管模型配置'
31
+ serviceLabel: 'OMP 动态切换',
32
+ proxyLabel: '动态切换',
33
+ startAction: '启动',
34
+ stopAction: '停止',
35
+ restartAction: '重启',
36
+ startedMessage: 'OMP 动态切换已启用',
37
+ stoppedMessage: 'OMP 已切换为单渠道直连模式',
38
+ runningText: '运行中',
39
+ stoppedText: '单渠道直连',
40
+ portLabel: '网关端口',
41
+ addressLabel: '网关地址',
42
+ startTip: '启动动态切换'
43
43
  }
44
44
  };
45
45
 
@@ -219,7 +219,7 @@ async function handleStartProxy(cliType, services) {
219
219
  console.log(chalk.yellow('[WARN] 重要提示:'));
220
220
  if (services.managedProviderConfig) {
221
221
  console.log(chalk.yellow('• 启用后会写入指向本地网关的 OMP models.yml provider 配置'));
222
- console.log(chalk.yellow('• 关闭会移除受管 provider,不会清理 OMP 原生 auth.json\n'));
222
+ console.log(chalk.yellow('• 关闭后会保留当前渠道的直连 provider,不会清理 OMP 原生 auth.json\n'));
223
223
  } else {
224
224
  console.log(chalk.yellow('• 开启期间请勿关闭 CLI 终端窗口'));
225
225
  console.log(chalk.yellow('• 如果异常关闭导致代理失效,请运行: ctx reset'));
@@ -274,7 +274,7 @@ async function handleStartProxy(cliType, services) {
274
274
  }
275
275
  }
276
276
 
277
- console.log(chalk.cyan(services.managedProviderConfig ? '\n[TIP] OMP 受管 provider 已启用!' : '\n[TIP] 动态切换已启用!'));
277
+ console.log(chalk.cyan(services.managedProviderConfig ? '\n[TIP] OMP 动态切换已启用!' : '\n[TIP] 动态切换已启用!'));
278
278
  if (services.managedProviderConfig) {
279
279
  console.log(chalk.gray(' 现在可以通过"渠道管理"功能调整已启用的 OMP provider,并重新同步 models.yml\n'));
280
280
  } else {
@@ -322,7 +322,7 @@ async function handleStopProxy(cliType, services) {
322
322
 
323
323
  console.log(chalk.cyan('当前状态:'));
324
324
  if (services.managedProviderConfig) {
325
- console.log(chalk.gray(`• 受管配置: ${chalk.green('已启用')}`));
325
+ console.log(chalk.gray(`• 动态切换: ${chalk.green('已启用')}`));
326
326
  console.log(chalk.gray(`• 配置模式: ${proxyStatus.mode || 'models-yml-provider-config'}`));
327
327
  console.log(chalk.gray(`• 会话日志观察: ${proxyStatus.sessionLogObserver?.running ? chalk.green('运行中') : chalk.yellow('未运行')}\n`));
328
328
  } else {
@@ -333,8 +333,8 @@ async function handleStopProxy(cliType, services) {
333
333
 
334
334
  console.log(chalk.yellow('关闭后:'));
335
335
  if (services.managedProviderConfig) {
336
- console.log(chalk.gray('• OMP 受管 models.yml provider 配置将被移除'));
337
- console.log(chalk.gray(`• 之后调整 ${toolName} provider 需要重新启用受管配置\n`));
336
+ console.log(chalk.gray('• OMP 将保留当前渠道的单一、直连 models.yml provider'));
337
+ console.log(chalk.gray(`• 之后调整 ${toolName} provider 或模型会立即同步到 OMP\n`));
338
338
  } else {
339
339
  console.log(chalk.gray('• 代理服务将被停止'));
340
340
  console.log(chalk.gray('• 配置将恢复为当前激活渠道的单渠道模式'));
@@ -357,13 +357,13 @@ async function handleStopProxy(cliType, services) {
357
357
 
358
358
  try {
359
359
  console.log(chalk.cyan(services.managedProviderConfig
360
- ? '\n[STOP] 正在移除 OMP models.yml 受管 provider...\n'
360
+ ? '\n[STOP] 正在切换 OMP 到单渠道直连模式...\n'
361
361
  : '\n[STOP] 正在停止代理服务...\n'));
362
362
 
363
363
  // 停止代理服务器
364
364
  await services.stopProxyServer();
365
365
  console.log(chalk.green(services.managedProviderConfig
366
- ? '[OK] OMP models.yml 受管 provider 已移除'
366
+ ? '[OK] OMP 已切换到单渠道直连模式'
367
367
  : '[OK] 代理服务已停止'));
368
368
 
369
369
  // 恢复配置文件
@@ -382,9 +382,9 @@ async function handleStopProxy(cliType, services) {
382
382
  console.log(chalk.green('[OK] 已清理代理接管状态'));
383
383
  }
384
384
 
385
- console.log(chalk.cyan(services.managedProviderConfig ? '\n[TIP] OMP 受管 provider 已关闭' : '\n[TIP] 动态切换已关闭'));
385
+ console.log(chalk.cyan(services.managedProviderConfig ? '\n[TIP] OMP 动态切换已关闭' : '\n[TIP] 动态切换已关闭'));
386
386
  if (services.managedProviderConfig) {
387
- console.log(chalk.gray(' 如需恢复受管 provider 配置,请再次运行 ctx omp start\n'));
387
+ console.log(chalk.gray(' 当前渠道保持直连;后续渠道和模型修改会立即同步到 OMP\n'));
388
388
  } else {
389
389
  console.log(chalk.gray(` 现在调整渠道需要重启 ${toolName} 才能生效\n`));
390
390
  }
@@ -3,6 +3,7 @@
3
3
  const fs = require('fs');
4
4
  const path = require('path');
5
5
  const os = require('os');
6
+ const { execFileSync } = require('child_process');
6
7
  const { resolvePreferredHomeDir, isWindowsLikePlatform } = require('../utils/home-dir');
7
8
 
8
9
  const HOME_DIR = resolvePreferredHomeDir(process.platform, process.env, os.homedir());
@@ -446,6 +447,7 @@ const PATHS = {
446
447
  opencode: path.join(RUNTIME_DIR, 'opencode-proxy.json'),
447
448
  omp: path.join(RUNTIME_DIR, 'omp-proxy.json')
448
449
  },
450
+ ompGatewaySecret: path.join(RUNTIME_DIR, 'omp-gateway-secret'),
449
451
 
450
452
  // 请求记录
451
453
  requestSnapshots: {
@@ -804,26 +806,48 @@ function normalizeOmpProfileName(profile = '') {
804
806
  return value && value !== 'default' ? value : '';
805
807
  }
806
808
 
807
- function getOmpProfileName() {
808
- return normalizeOmpProfileName(process.env.OMP_PROFILE);
809
- }
810
-
811
- function getOmpConfigRoot() {
812
- return expandHomePath(resolveExistingEnvPath(process.env.OMP_CONFIG_DIR) || path.join(HOME_DIR, '.omp'));
813
- }
809
+ function getOmpAgentDir(env = process.env, options = {}) {
810
+ if (options.resolveRuntime !== false) {
811
+ const command = String(env.OMP_COMMAND || 'omp').trim() || 'omp';
812
+ const commandRunner = options.commandRunner || execFileSync;
813
+ try {
814
+ const output = commandRunner(command, ['config', 'path'], {
815
+ encoding: 'utf8',
816
+ env: { ...process.env, ...env },
817
+ stdio: ['ignore', 'pipe', 'pipe'],
818
+ timeout: options.timeout || 3000,
819
+ windowsHide: true
820
+ });
821
+ const configuredByCli = String(output || '').trim().split(/\r?\n/).find(Boolean);
822
+ if (configuredByCli) {
823
+ return path.resolve(expandHomePath(configuredByCli));
824
+ }
825
+ } catch {
826
+ // Fall through to environment/profile compatibility paths.
827
+ }
828
+ }
814
829
 
815
- function getOmpAgentDir() {
816
- const configuredDir = resolveExistingEnvPath(process.env.OMP_CODING_AGENT_DIR);
830
+ // OMP 17.x kept the historical PI_CODING_AGENT_DIR variable as the
831
+ // canonical relocation knob. OMP_CODING_AGENT_DIR was used by older
832
+ // cc-tool releases, so retain it as a lower-priority compatibility alias.
833
+ const configuredDir = resolveExistingEnvPath(
834
+ env.PI_CODING_AGENT_DIR || env.OMP_CODING_AGENT_DIR
835
+ );
817
836
  if (configuredDir) {
818
837
  return path.resolve(expandHomePath(configuredDir));
819
838
  }
820
- const profile = getOmpProfileName();
839
+ const profile = normalizeOmpProfileName(env.OMP_PROFILE);
840
+ const configRoot = expandHomePath(
841
+ resolveExistingEnvPath(env.OMP_CONFIG_DIR) || path.join(HOME_DIR, '.omp')
842
+ );
821
843
  const agentDir = profile
822
- ? path.join(getOmpConfigRoot(), 'profiles', profile, 'agent')
823
- : path.join(getOmpConfigRoot(), 'agent');
844
+ ? path.join(configRoot, 'profiles', profile, 'agent')
845
+ : path.join(configRoot, 'agent');
824
846
  return path.resolve(agentDir);
825
847
  }
826
848
 
849
+ const OMP_AGENT_DIR = getOmpAgentDir();
850
+
827
851
  // 工具特定的原生配置路径(不改变)
828
852
  const NATIVE_PATHS = {
829
853
  // Claude Code 原生配置
@@ -877,23 +901,23 @@ const NATIVE_PATHS = {
877
901
 
878
902
  // OMP 原生配置。
879
903
  omp: {
880
- dir: getOmpAgentDir(),
881
- config: path.join(getOmpAgentDir(), 'config.yml'),
882
- settings: path.join(getOmpAgentDir(), 'config.yml'),
883
- settingsJsonLegacy: path.join(getOmpAgentDir(), 'settings.json'),
884
- auth: path.join(getOmpAgentDir(), 'auth.json'),
885
- models: path.join(getOmpAgentDir(), 'models.yml'),
886
- modelsYml: path.join(getOmpAgentDir(), 'models.yml'),
887
- modelsJsonLegacy: path.join(getOmpAgentDir(), 'models.json'),
888
- mcp: path.join(getOmpAgentDir(), 'mcp.json'),
889
- sessions: path.join(getOmpAgentDir(), 'sessions'),
890
- skills: path.join(getOmpAgentDir(), 'skills'),
891
- prompts: path.join(getOmpAgentDir(), 'prompts'),
892
- commands: path.join(getOmpAgentDir(), 'commands'),
893
- notes: path.join(getOmpAgentDir(), 'notes'),
894
- extensions: path.join(getOmpAgentDir(), 'extensions'),
895
- themes: path.join(getOmpAgentDir(), 'themes'),
896
- packages: path.join(getOmpAgentDir(), 'packages')
904
+ dir: OMP_AGENT_DIR,
905
+ config: path.join(OMP_AGENT_DIR, 'config.yml'),
906
+ settings: path.join(OMP_AGENT_DIR, 'config.yml'),
907
+ settingsJsonLegacy: path.join(OMP_AGENT_DIR, 'settings.json'),
908
+ auth: path.join(OMP_AGENT_DIR, 'auth.json'),
909
+ models: path.join(OMP_AGENT_DIR, 'models.yml'),
910
+ modelsYml: path.join(OMP_AGENT_DIR, 'models.yml'),
911
+ modelsJsonLegacy: path.join(OMP_AGENT_DIR, 'models.json'),
912
+ mcp: path.join(OMP_AGENT_DIR, 'mcp.json'),
913
+ sessions: path.join(OMP_AGENT_DIR, 'sessions'),
914
+ skills: path.join(OMP_AGENT_DIR, 'skills'),
915
+ prompts: path.join(OMP_AGENT_DIR, 'prompts'),
916
+ commands: path.join(OMP_AGENT_DIR, 'commands'),
917
+ notes: path.join(OMP_AGENT_DIR, 'notes'),
918
+ extensions: path.join(OMP_AGENT_DIR, 'extensions'),
919
+ themes: path.join(OMP_AGENT_DIR, 'themes'),
920
+ packages: path.join(OMP_AGENT_DIR, 'packages')
897
921
  }
898
922
  };
899
923
 
package/src/index.js CHANGED
@@ -70,7 +70,7 @@ function showHelp() {
70
70
  console.log(' ctx codex start 启动 Codex 代理');
71
71
  console.log(' ctx gemini start 启动 Gemini 代理');
72
72
  console.log(' ctx opencode start 启动 OpenCode 代理');
73
- console.log(' ctx omp start 启用 OMP 受管模型配置');
73
+ console.log(' ctx omp start 启动 OMP 动态切换');
74
74
  console.log(chalk.gray(' (codex/gemini/opencode/omp 命令与 claude 类似)\n'));
75
75
 
76
76
  console.log(chalk.yellow('[LOG] 日志管理:'));