@minniexcode/codex-switch 0.0.4 → 0.0.6

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 (64) hide show
  1. package/README.md +35 -97
  2. package/dist/app/add-provider.js +40 -3
  3. package/dist/app/edit-provider.js +76 -3
  4. package/dist/app/export-providers.js +2 -2
  5. package/dist/app/get-current-profile.js +1 -1
  6. package/dist/app/get-status.js +10 -3
  7. package/dist/app/import-providers.js +47 -3
  8. package/dist/app/list-backups.js +1 -1
  9. package/dist/app/list-config-profiles.js +30 -0
  10. package/dist/app/list-providers.js +1 -1
  11. package/dist/app/remove-provider.js +35 -3
  12. package/dist/app/rollback-backup.js +1 -1
  13. package/dist/app/rollback-latest.js +1 -1
  14. package/dist/app/run-doctor.js +44 -26
  15. package/dist/app/run-mutation.js +2 -2
  16. package/dist/app/setup-codex.js +37 -20
  17. package/dist/app/show-config.js +34 -0
  18. package/dist/app/show-provider.js +1 -1
  19. package/dist/app/switch-provider.js +8 -5
  20. package/dist/cli/add-interactive.js +7 -106
  21. package/dist/cli/args.js +5 -126
  22. package/dist/cli/help.js +5 -276
  23. package/dist/cli/interactive.js +16 -171
  24. package/dist/cli/output.js +23 -1
  25. package/dist/cli/prompt.js +3 -108
  26. package/dist/cli.js +10 -315
  27. package/dist/commands/args.js +132 -0
  28. package/dist/commands/dispatch.js +16 -0
  29. package/dist/commands/handlers.js +391 -0
  30. package/dist/commands/help.js +119 -0
  31. package/dist/commands/registry.js +291 -0
  32. package/dist/commands/types.js +2 -0
  33. package/dist/domain/config.js +548 -39
  34. package/dist/infra/backup-repo.js +8 -208
  35. package/dist/infra/codex-cli.js +8 -113
  36. package/dist/infra/codex-discovery.js +3 -41
  37. package/dist/infra/codex-paths.js +5 -69
  38. package/dist/infra/config-repo.js +161 -9
  39. package/dist/infra/fs-utils.js +7 -95
  40. package/dist/infra/lock-repo.js +3 -97
  41. package/dist/infra/providers-repo.js +7 -96
  42. package/dist/interaction/add-interactive.js +108 -0
  43. package/dist/interaction/interactive.js +216 -0
  44. package/dist/interaction/prompt.js +110 -0
  45. package/dist/runtime/codex-cli.js +130 -0
  46. package/dist/runtime/codex-probe.js +50 -0
  47. package/dist/runtime/types.js +2 -0
  48. package/dist/storage/backup-repo.js +210 -0
  49. package/dist/storage/codex-paths.js +71 -0
  50. package/dist/storage/config-repo.js +208 -0
  51. package/dist/storage/fs-utils.js +97 -0
  52. package/dist/storage/lock-repo.js +99 -0
  53. package/dist/storage/providers-repo.js +98 -0
  54. package/docs/Design/codex-switch-v0.0.5-design.md +932 -0
  55. package/docs/Design/codex-switch-v0.0.6-design.md +708 -0
  56. package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +340 -0
  57. package/docs/PRD/codex-switch-prd-v0.1.0.md +215 -291
  58. package/docs/PRD/codex-switch-prd.md +1 -1
  59. package/docs/cli-usage.md +2 -1
  60. package/docs/codex-switch-technical-architecture.md +73 -4
  61. package/docs/test-report-0.0.5.md +163 -0
  62. package/docs/testing.md +131 -0
  63. package/package.json +1 -1
  64. /package/docs/{codex-switch-v0.0.4-design.md → Design/codex-switch-v0.0.4-design.md} +0 -0
@@ -1,77 +1,131 @@
1
- # codex-switch `0.1.0` 目标 PRD
1
+ # codex-switch `0.0.6` PRD
2
2
 
3
3
  ## 文档信息
4
4
 
5
- - 状态:Target PRD
5
+ - 状态:Active PRD
6
6
  - 产品名:`codex-switch`
7
7
  - CLI 命令名:`codexs`
8
- - 当前基线版本:`0.0.3`
9
- - 目标版本:`0.1.0`
10
- - 文档定位:从 `0.0.3` 走向 `0.1.0` 的目标规格与阶段性演进路线
8
+ - 当前基线版本:`0.0.5`
9
+ - 目标版本:`0.0.6`
10
+ - 文档定位:定义 `0.0.5 -> 0.0.6` 的直接需求范围
11
11
  - 历史基线 PRD:[`codex-switch-prd.md`](./codex-switch-prd.md)
12
+ - 后续演进 PRD:[`codex-switch-prd-v0.0.5-to-v0.1.0.md`](./codex-switch-prd-v0.0.5-to-v0.1.0.md)
12
13
  - 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
13
14
  - 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
14
15
  - 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
15
16
 
17
+ 说明:
18
+
19
+ - 当前文件路径仍沿用历史命名 `codex-switch-prd-v0.1.0.md`
20
+ - 本文档内容语义以当前 active PRD 为准,本次版本更新不处理文件重命名
21
+
16
22
  ## 一句话定义
17
23
 
18
- `codex-switch` `0.1.0` 目标,是从一个已经验证可行的本地 provider/profile 管理 CLI,演进为一套对人类和 AI 都稳定、可初始化、可诊断、可恢复、可持续扩展的发布级命令体系。
24
+ `0.0.6` 的目标不是继续扩张命令面,而是先修复 `0.0.5` 的功能稳定性问题,冻结当前 CLI 公共契约,并把实现从“单入口持续膨胀的命令调度器”收敛为适合继续扩展的模块化分层架构。
25
+
26
+ ## 当前基线:`0.0.5`
27
+
28
+ 当前已具备的命令面:
29
+
30
+ - `config-show`
31
+ - `config-list-profiles`
32
+ - `list`
33
+ - `show`
34
+ - `current`
35
+ - `status`
36
+ - `setup`
37
+ - `edit`
38
+ - `add`
39
+ - `switch`
40
+ - `remove`
41
+ - `import`
42
+ - `export`
43
+ - `backups`
44
+ - `doctor`
45
+ - `rollback`
19
46
 
20
- ## 版本语义
47
+ 当前基线已具备的工程特征:
21
48
 
22
- - `0.0.x`:测试 / 验证阶段版本,用于收敛模型、命令面和失败语义
23
- - `0.1.0`:第一条稳定发布规格线,不要求当前立刻完成,但要求目标边界清晰
24
- - 当前仓库状态:`0.0.3` 已完成 MVP 核心命令面与交互式增强
49
+ - `providers.json` 继续作为管理态单一事实源
50
+ - `config.toml` 具备结构化读取与受管 section 写入能力
51
+ - 写命令统一走锁、备份、失败回滚
52
+ - `--json` 继续使用统一 envelope
53
+ - CLI 帮助页已经具备稳定命令分组和文案基础
25
54
 
26
- 这意味着本文件不是“下一版马上发布什么”的短期计划,而是 `0.0.3` 之后持续演进到 `0.1.0` 的目标 PRD。
55
+ 当前主要问题:
27
56
 
28
- ## 当前基线:`0.0.3`
57
+ - `0.0.5` 需要继续收敛边界行为和失败语义,提升已有功能的稳定性
58
+ - `src/cli.ts` 已经承担过多命令分发、交互编排和参数补全逻辑
59
+ - 当前四层结构仍然成立,但 CLI 入口和应用编排层需要进一步细化职责
60
+ - 未来第三方 auth / 本地代理 / 外部依赖接入已具备现实需求,但当前扩展边界还不够明确
29
61
 
30
- 当前已落地能力:
62
+ ## `0.0.6` 目标
31
63
 
32
- - `list` / `current` / `status`
33
- - `switch <provider>`
34
- - `import <file>` / `export <file>`
35
- - `add <provider>` / `remove <provider>`
36
- - `doctor`
37
- - `rollback`
64
+ `0.0.6` 需要完成三件事:
38
65
 
39
- 当前基线已经具备的工程特征:
66
+ - 修复 `0.0.5` 命令行为中的稳定性问题,巩固已有能力
67
+ - 重整 CLI 与应用层分层,解决 `cli.ts` 持续膨胀问题
68
+ - 为未来第三方 auth / 本地 proxy / 外部 SDK 集成建立清晰边界,但本版不交付这些集成功能
40
69
 
41
- - 本地文件模型围绕 `~/.codex/`
42
- - `providers.json` 作为 management SSOT
43
- - `config.toml` 与 `auth.json` 作为 runtime state
44
- - 写命令统一走备份、锁和失败回滚
45
- - `--json` 输出固定 envelope
46
- - 高频写命令支持 TTY 渐进式交互
70
+ ## 范围
47
71
 
48
- 当前基线仍然存在的边界:
72
+ ### In Scope
49
73
 
50
- - 缺少首次初始化 / bootstrap 命令
51
- - 只支持 latest rollback,不支持按备份条目恢复
52
- - provider 查看和编辑仍然偏基础
53
- - 错误码体系仍带有 MVP 阶段的复用痕迹
54
- - 尚未进入第三方 auth / extension 集成阶段
74
+ - 现有命令面的稳定性修复与一致性收敛
75
+ - 顶层 help 文案、命令分组、示例和危险提示的一致性
76
+ - `--json` 契约、TTY 交互规则、非交互失败语义的一致性
77
+ - `setup` / `add` / `edit` / `remove` / `import` / `export` / `switch` / `rollback` 的事务与恢复稳定性
78
+ - `status` / `doctor` / `config-show` / `config-list-profiles` 的读取稳定性
79
+ - CLI 入口再分层
80
+ - 应用编排与运行时集成边界收敛
81
+ - 为未来第三方 integration 预留明确架构边界
55
82
 
56
- ## `0.1.0` 目标
83
+ ### Out of Scope
57
84
 
58
- `0.1.0` 需要同时满足以下目标:
85
+ - 新增大型命令族
86
+ - 真实 Copilot auth 登录接入
87
+ - 本地代理服务启动、停止、守护和生命周期管理
88
+ - 第三方 SDK 安装器或依赖下载体验
89
+ - GUI / TUI / daemon 化
90
+ - 把 `config.toml` 升级为通用配置编辑器
59
91
 
60
- - 保持当前 CLI 和 JSON 契约稳定
61
- - 让首次用户可以通过 `setup` 完成从环境检测到 registry 初始化的主流程
62
- - 让 provider registry 的查看、编辑、导入合并能力更完整
63
- - 让备份与回滚从“最新一次”演进到“显式备份条目”
64
- - 为未来 auth / extension 集成保留明确边界,而不把远期需求提前塞进稳定主线
92
+ ## 稳定公共契约
65
93
 
66
- ## 长期演进守则
94
+ ### CLI 命令面
67
95
 
68
- 如果继续扩展命令面,后续新增命令统一遵守下面三条:
96
+ `0.0.6` 默认锁定当前 help 所表达的命令面与分组,不以“新增命令数量”作为版本目标。
69
97
 
70
- - 不破坏当前 JSON envelope
71
- - 不复用语义不匹配的错误码
72
- - 所有写命令默认纳入备份与回滚模型
98
+ Usage 级别的公共入口保持:
73
99
 
74
- ## 稳定公共契约
100
+ ```text
101
+ codexs <command> [options]
102
+ codexs help <command>
103
+ ```
104
+
105
+ 当前命令分组继续保留:
106
+
107
+ - Read Commands
108
+ - Change Commands
109
+ - Diagnostics And Recovery
110
+
111
+ 当前命令名继续保留:
112
+
113
+ - `config-show`
114
+ - `config-list-profiles`
115
+ - `list`
116
+ - `show`
117
+ - `current`
118
+ - `status`
119
+ - `setup`
120
+ - `edit`
121
+ - `add`
122
+ - `switch`
123
+ - `remove`
124
+ - `import`
125
+ - `export`
126
+ - `backups`
127
+ - `doctor`
128
+ - `rollback`
75
129
 
76
130
  ### JSON Envelope
77
131
 
@@ -87,307 +141,177 @@
87
141
  }
88
142
  ```
89
143
 
90
- 约束:
91
-
92
- - 顶层 shape 保持不变
93
- - 后续字段扩展只做加法
94
- - 详细结果进入 `data`
95
- - 非致命提示进入 `warnings`
96
- - 结构化失败信息继续进入 `error`
97
-
98
- ### 数据模型
99
-
100
- `providers.json` 继续是 managed registry 的单一事实源:
101
-
102
- ```json
103
- {
104
- "providers": {
105
- "packycode": {
106
- "profile": "packycode",
107
- "apiKey": "sk-xxx",
108
- "baseUrl": "https://example.com/v1",
109
- "note": "primary free model route",
110
- "tags": ["free", "daily"]
111
- }
112
- }
113
- }
114
- ```
115
-
116
- `0.1.0` 之前默认不放宽这个模型:
117
-
118
- - `profile` 仍然必填
119
- - `apiKey` 仍然按完整 managed provider 处理
120
- - 不引入“半初始化 provider”作为正式稳定状态
121
-
122
- ### 错误码演进原则
123
-
124
- 保留现有领域错误码,并把错误码体系从 MVP 复用模式收紧到语义匹配模式。
125
-
126
- 现有保留:
127
-
128
- - `CONFIG_NOT_FOUND`
129
- - `PROVIDERS_NOT_FOUND`
130
- - `PROVIDERS_PARSE_ERROR`
131
- - `PROVIDER_NOT_FOUND`
132
- - `PROFILE_NOT_FOUND`
133
- - `BACKUP_FAILED`
134
- - `CODEX_LOGIN_FAILED`
135
- - `ROLLBACK_FAILED`
136
- - `LOCK_CONFLICT`
137
- - `LIVE_STATE_DRIFT`
138
-
139
- 后续新增命令应逐步引入更精确的错误码,而不是继续把无关问题塞进 `INVALID_IMPORT_FILE`。
140
-
141
- 建议新增 / 预留:
142
-
143
- - `INVALID_ARGUMENT`
144
- - `UNKNOWN_COMMAND`
145
- - `PROMPT_CANCELLED`
146
- - `CODEX_NOT_INSTALLED`
147
- - `CODEX_VERSION_UNSUPPORTED`
148
- - `CODEX_DIR_NOT_FOUND`
149
- - `CODEX_DIR_AMBIGUOUS`
150
- - `PROVIDERS_ALREADY_EXISTS`
151
- - `IMPORT_MERGE_CONFLICT`
152
- - `BACKUP_NOT_FOUND`
153
-
154
- 约束:
155
-
156
- - `CODEX_LOGIN_FAILED` 只表示登录失败
157
- - codex 缺失与版本过低必须使用环境类错误码
158
- - rollback 找不到目标备份时必须使用恢复类错误码
159
-
160
- ## `0.0.4` 功能里程碑
161
-
162
- 下面这些内容暂时作为 `0.0.4` 的功能里程碑。它们属于从 `0.0.3` 往 `0.1.0` 推进过程中的下一阶段,不代表已经锁定整个 `0.1.0` 的最终范围。
163
-
164
- ### 1. `codexs setup`
165
-
166
- #### 目标
167
-
168
- 提供首次初始化主流程,让用户从“本机已有 Codex 环境,但还没有 codex-switch 管理态文件”平滑进入受管状态。
169
-
170
- #### 目标命令
171
-
172
- ```bash
173
- codexs setup
174
- ```
175
-
176
- #### 行为顺序
177
-
178
- `setup` 的主流程固定为:
179
-
180
- 1. 检查本机是否已安装 `codex`
181
- 2. 检查 `codex` 是否满足最低支持版本门槛
182
- 3. 发现候选 Codex 目录
183
- 4. 当存在多个候选目录时,在 TTY 下交给用户选择,也允许自定义输入
184
- 5. 读取目标目录下的 `config.toml`
185
- 6. 从现有配置中发现 profile 列表
186
- 7. 为每个准备纳入管理的 profile 构造 provider 草稿
187
- 8. 对无法从现有状态可靠恢复的 `apiKey` 等关键字段,在交互模式下补问
188
- 9. 检查目标目录是否已存在 `providers.json`
189
- 10. 若已存在,在交互模式下让用户选择 `overwrite`、`merge` 或 `cancel`
190
- 11. 写入或合并后的 `providers.json` 继续纳入备份与回滚模型
191
- 12. 初始化成功后自动执行 `doctor`
192
- 13. 输出当前 Codex 状态和后续建议命令
193
-
194
- #### 目录发现原则
195
-
196
- - 默认优先使用明确指定的 `--codex-dir`
197
- - 未显式指定时,可以发现多个候选目录
198
- - TTY 下多个候选目录必须选择,不自动猜测
199
- - 非交互下多个候选目录且未显式指定时,返回歧义错误
200
- - 任意时刻都允许用户手动输入自定义目录
201
-
202
- #### 凭据初始化原则
203
-
204
- 因为 `config.toml` 不能可靠恢复所有 provider 的 `apiKey`,所以:
205
-
206
- - `setup` 不自动伪造或猜测 API key
207
- - 交互模式下可以补问缺失的 `apiKey`
208
- - 非交互模式下,如果缺失关键字段,应中止写入并返回明确错误
209
- - `0.0.4` 里程碑中不引入“缺 key 的正式 provider 记录”
210
-
211
- #### Codex 版本门槛
212
-
213
- - `setup` 和 `doctor` 都应支持最低 Codex 版本检查
214
- - 最低版本门槛在 PRD 中定义为“必须存在的可配置门槛”
215
- - 具体版本号不在本文件中写死,由实现常量和发布说明控制
216
-
217
- ### 2. CLI 契约收紧
218
-
219
- 在 `0.0.4` 里程碑中,需要把当前命令层从“已经可用”继续收紧到“更稳定可依赖”:
220
-
221
- - 将参数错误与业务错误分离
222
- - 将环境问题与登录问题分离
223
- - 保持命令帮助、TTY 行为和 `--json` 行为一致
224
- - 让新增命令默认沿用当前 envelope、锁、备份和回滚模型
225
-
226
- ### 3. 命令增强候选
227
-
228
- 下面这些命令方向暂时也归入 `0.0.4` 里程碑候选池,用于指导下一阶段设计和实现优先级;它们仍然不是当前已完成范围。
229
-
230
- ### `codexs show <provider>`
231
-
232
- 目标:
233
-
234
- - 展示单个 provider 的完整详情
235
- - 既服务人类,也服务 AI 读取结构化 provider 数据
236
-
237
- 定位:
238
-
239
- - 只读命令
240
- - 不进入备份与回滚流程
241
-
242
- ### `codexs edit <provider>`
243
-
244
- 目标:
245
-
246
- - 修改单个 provider 的字段内容
144
+ 要求:
247
145
 
248
- 默认交互模型:
146
+ - 顶层 shape 不变
147
+ - 新字段只追加到 `data` / `warnings`
148
+ - 错误信息继续进入 `error`
149
+ - 架构重构不得破坏已有自动化消费方式
249
150
 
250
- - 显式参数优先
251
- - 允许使用 `--profile`、`--api-key`、`--base-url`、`--note`、`--tag`
252
- - TTY 下只补全缺失项或确认危险写入
253
- - 不以外部编辑器作为默认形态
151
+ ### 交互规则
254
152
 
255
- 约束:
153
+ 交互能力继续只是 TTY 中的人类增强层,不改变自动化契约:
256
154
 
257
- - 作为写命令,默认纳入备份、锁和失败回滚
155
+ - `--json` 一律禁用交互
156
+ - 非 TTY 一律不进入交互
157
+ - 危险写命令继续要求显式确认或显式参数
158
+ - 用户取消 prompt 时不得产生文件写入
258
159
 
259
- ### `codexs backups list`
160
+ ## 数据与状态边界
260
161
 
261
- 目标:
162
+ ### `providers.json`
262
163
 
263
- - 列出历史备份条目
264
- - 让用户和 AI 能显式选择恢复目标
164
+ `providers.json` 继续是 provider registry 的单一事实源:
265
165
 
266
- 建议输出字段:
166
+ - `profile` 必填
167
+ - `apiKey` 仍按完整 managed provider 处理
168
+ - 不引入“半初始化 provider”作为稳定状态
267
169
 
268
- - `backupId`
269
- - `createdAt`
270
- - `reason`
271
- - `files`
272
- - `backupPath`
170
+ ### `config.toml`
273
171
 
274
- 备份 ID 规则:
172
+ `0.0.6` 为止,`config.toml` 的定位继续保持:
275
173
 
276
- - 默认以备份目录 basename 作为稳定 `backupId`
277
- - 例如 `20260511-221457-switch`
174
+ - 顶层 active `profile`
175
+ - provider 关联的 `[profiles.<name>]`
176
+ - 第一批受管字段:`model`、`model_provider`
177
+ - 非受管内容允许存在,但不进入通用编辑器范围
278
178
 
279
- ### `codexs rollback <backup-id>`
179
+ ### `auth.json`
280
180
 
281
- 目标:
181
+ `auth.json` 继续是认证态运行时文件:
282
182
 
283
- - 从“只支持 latest rollback”演进到“支持显式备份条目恢复”
183
+ - 可以被 `switch`、`rollback`、备份系统纳入事务边界
184
+ - 不是 provider registry 的事实源
185
+ - 不在 `0.0.6` 中扩展为第三方 auth 统一数据库
284
186
 
285
- 约束:
187
+ ## 架构目标边界
286
188
 
287
- - `rollback` 继续保留 latest 入口
288
- - `rollback <backup-id>` 作为增强能力引入
289
- - 指定备份不存在时必须返回专门错误码,而不是复用 generic rollback failure
189
+ ### 现状问题
290
190
 
291
- ### `codexs import --merge`
191
+ 当前 `cli / app / domain / infra` 四层结构仍然是可用基线,但 `cli.ts` 已同时承担:
292
192
 
293
- 目标:
193
+ - 命令分发
194
+ - 参数归一化
195
+ - 交互分支判断
196
+ - 渐进式补问
197
+ - 输出路径拼装
294
198
 
295
- - 在不整体替换当前 registry 的前提下导入 provider 清单
199
+ 这会让后续每增加一个命令或 integration,都继续把复杂度堆回 CLI 入口。
296
200
 
297
- 默认冲突策略:
201
+ ### `0.0.6` 架构调整目标
298
202
 
299
- - 当导入文件和当前 registry 出现同名 provider 冲突时,以导入文件内容为准
300
- - 未冲突条目继续保留
301
- - 最终结果仍作为一次受管写操作进入备份与回滚流程
203
+ `0.0.6` 不要求彻底推翻现有分层,但要求把职责边界进一步显式化,至少收敛为下面几类模块能力:
302
204
 
303
- ## `0.1.0` 远期目标与能力域
205
+ - `Command Surface`
206
+ - 负责命令定义、help 文案、命令 key、参数规格、子命令分发
207
+ - `Interaction Layer`
208
+ - 负责 TTY prompt、危险确认、渐进式补问、交互取消语义
209
+ - `Application Use Cases`
210
+ - 负责单命令业务编排、跨仓储事务边界、结果契约组装
211
+ - `Domain Policies`
212
+ - 负责 provider/profile/config consistency 规则、错误码、纯规则判断
213
+ - `Storage Repositories`
214
+ - 负责 `providers.json`、`config.toml`、backups 的文件访问和持久化
215
+ - `Runtime Integrations`
216
+ - 负责 `codex` CLI 调用,以及未来第三方 auth adapter、本地 proxy runtime、外部 SDK 封装
304
217
 
305
- 下面这些方向明确有价值,但当前不进入 `0.0.4` 里程碑,只作为继续走向 `0.1.0` 的远期能力域。
218
+ ### 架构约束
306
219
 
307
- ### 第三方 auth / extension 集成
220
+ `0.0.6` 需要明确以下约束:
308
221
 
309
- 示例方向:
222
+ - 不把第三方 SDK 调用直接塞进 CLI 入口
223
+ - 不把 prompt 逻辑继续散落到每个命令分支内部
224
+ - 不让 `app` 层直接依赖终端输出细节
225
+ - 不让运行时集成逻辑反向污染领域规则
226
+ - 不因未来接入 Copilot 或其他 provider,就改变本地事务与回滚的安全语义
310
227
 
311
- - 接入 Copilot auth
312
- - 在本地启动代理服务,使特定上游可在 Codex 中使用
313
- - 安装和管理第三方依赖
228
+ ## `0.0.6` 稳定性要求
314
229
 
315
- 当前定位:
230
+ ### 命令行为一致性
316
231
 
317
- - 作为单独能力域保留
318
- - 不在当前主 PRD 中锁定具体命令名和具体交互细节
319
- - 不进入 `0.1.0` 稳定主线的验收标准
232
+ 现有命令在 `0.0.6` 需要重点收敛:
320
233
 
321
- ### 交互式依赖安装
234
+ - help 文案与真实命令行为一致
235
+ - 默认文本输出与 `--json` 输出语义一致
236
+ - TTY 与非交互模式下的失败路径可预测
237
+ - 危险命令的确认规则一致
238
+ - 同一类错误优先映射到同一类错误码
322
239
 
323
- 未来如果引入:
240
+ ### 写命令安全语义
324
241
 
325
- - 应采用交互式多选模式
326
- - 类似 skills 安装体验
327
- - 支持一次选择多个可选依赖
242
+ 所有会修改 `providers.json`、`config.toml`、`auth.json` 的命令继续默认遵守:
328
243
 
329
- 但当前阶段仅记录方向,不进入正式规格。
244
+ - 单次锁
245
+ - 单次备份
246
+ - 单次失败整体回滚
330
247
 
331
- ## 主题里程碑
248
+ 不能接受的结果:
332
249
 
333
- `0.0.3` 走向 `0.1.0`,建议按能力主题推进,而不是现在就预写死每个小版本号。
250
+ - `providers.json` 已更新但 `config.toml` 未同步
251
+ - `config.toml` 已更新但 `providers.json` 未同步
252
+ - `auth.json` 或 active profile 因失败留在半切换状态
334
253
 
335
- ### 里程碑 A:`0.0.4` / Bootstrap / Setup
254
+ ### 读取稳定性
336
255
 
337
- 目标:
256
+ 读取命令在 `0.0.6` 至少需要满足:
338
257
 
339
- - 完成 `setup` 规格与实现
340
- - 把首次初始化从“手工准备文件”提升到“命令引导完成”
341
- - 补齐 codex 安装和版本检查语义
258
+ - 不因历史 workspace 或边缘状态轻易崩溃
259
+ - `status` 与 `doctor` 的诊断信号保持一致语义
260
+ - `config-show` `config-list-profiles` 输出结构稳定
261
+ - 对缺失文件、解析失败和不一致状态给出可预测错误或警告
342
262
 
343
- 详细设计文档:
263
+ ## Future-Ready Integration 边界
344
264
 
345
- - [`../codex-switch-v0.0.4-design.md`](../codex-switch-v0.0.4-design.md)
265
+ ### 为什么 `0.0.6` 要预留这条线
346
266
 
347
- ### 里程碑 B:Provider Registry Ergonomics
267
+ 未来存在明确扩展需求:
348
268
 
349
- 目标:
269
+ - 通过第三方 auth 获取认证态
270
+ - 借助本地代理使特定上游可在 Codex 中使用
271
+ - 接入外部 SDK,例如 GitHub Copilot 相关能力
350
272
 
351
- - 增强 provider 的查看与编辑能力
352
- - 保持 `providers.json` 作为管理态事实源
353
- - 不默认把 runtime 文件反向回写到 registry
273
+ 如果继续沿用当前“命令直接长在 `cli.ts` 上”的方式,后续集成会快速把架构拖回高耦合状态。
354
274
 
355
- ### 里程碑 C:Backup / Recovery Evolution
275
+ ### `0.0.6` 的预留目标
356
276
 
357
- 目标:
277
+ 本版只要求建立边界,不要求交付真实功能:
358
278
 
359
- - 引入 `backups list`
360
- - 引入按 `backupId` 回滚
361
- - `import --merge` 提供完整恢复语义
279
+ - 允许未来把第三方 auth 封装为独立 integration 模块
280
+ - 允许未来把本地 proxy runtime 封装为独立运行时组件
281
+ - 允许未来把外部依赖探测、可用性检查、错误语义收敛到 runtime integration
282
+ - 不在本版锁定具体命令名、交互细节或 SDK 选型细节
362
283
 
363
- ### 里程碑 D:Extensions / Auth Integration
284
+ ### Copilot 作为代表性场景
364
285
 
365
- 目标:
286
+ GitHub Copilot 相关 auth / SDK / 本地代理能力,在 `0.0.6` 里的定位是:
366
287
 
367
- - 评估第三方 auth 与本地代理集成
368
- - 评估交互式依赖安装与 extension 管理
369
- - 在不破坏主 CLI 契约的前提下扩展能力边界
288
+ - 作为未来架构设计的代表性输入
289
+ - 用于验证 `Runtime Integrations` 分层是否足够清晰
290
+ - 不作为 `0.0.6` 必须实现的命令需求
370
291
 
371
292
  ## 对实现的要求
372
293
 
373
- 从现在到 `0.1.0` 的所有新增能力,默认遵守:
294
+ `0.0.5` 到 `0.0.6` 的改造,默认遵守:
374
295
 
375
- - 命令帮助必须明确人类模式和 `--json` 模式行为
376
- - 非交互环境不允许依赖 prompt 才能完成核心自动化流程
377
- - 所有写命令默认走锁、备份、回滚
378
- - 所有新增错误码都必须语义清晰
379
- - 所有新增 JSON 返回都只能扩展 `data` 和 `warnings`
296
+ - 不破坏现有命令名
297
+ - 不破坏统一 JSON envelope
298
+ - 不破坏备份、回滚、锁模型
299
+ - 不引入只能靠交互完成的核心流程
300
+ - 不把未来第三方集成耦合进当前 provider/config 领域规则
301
+ - 允许内部文件和模块重组,但外部 CLI 契约保持稳定
380
302
 
381
- ## `0.1.0` 目标完成标准
303
+ ## 验收标准
382
304
 
383
- 达到下面这些条件时,可以认为 `0.1.0` 主线目标基本收敛:
305
+ 达到以下条件时,`0.0.6` 可以认为完成:
384
306
 
385
- - 用户可以通过 `setup` 完成首次初始化
386
- - provider registry 的查看、编辑、导入合并能力完整
387
- - 历史备份可被显式枚举和恢复
388
- - CLI 错误码不再存在明显语义复用问题
389
- - CLI 契约对 AI 和脚本调用保持稳定
307
+ - 当前 help 文案与命令行为、参数、危险提示基本一致
308
+ - 现有命令在 TTY / 非交互 / `--json` 模式下行为稳定
309
+ - 读取命令对历史状态和异常状态的处理更稳,不产生明显回归
310
+ - 写命令继续满足锁、备份、失败回滚语义
311
+ - `cli.ts` 不再承担持续膨胀的主调度与交互编排复杂度
312
+ - 应用编排、交互层、运行时集成边界比 `0.0.5` 更清晰
313
+ - 为未来第三方 auth / 本地 proxy / SDK 接入预留了清楚但非侵入式的扩展边界
390
314
 
391
315
  ## 结论
392
316
 
393
- `0.1.0` 不是简单地把现有 MVP 重命名为稳定版,而是要在保持当前本地事务式切换模型不变的前提下,补齐初始化能力、增强 registry 操作、收紧错误契约,并为未来更大范围的 auth / extension 集成留出清晰边界。
317
+ `0.0.6` 是一个修复型版本,但它不是“只修 bug 不动结构”的保守补丁版。它的真正目标,是在不破坏当前 CLI 公共契约的前提下,把 `0.0.5` 已经长出来的命令面和事务能力稳住,并把代码结构调整到足以支撑下一阶段 integration-ready 演进的状态。
@@ -191,7 +191,7 @@ MVP 固定使用以下结构:
191
191
  - 用于执行 `codex login --with-api-key`
192
192
  - `baseUrl`
193
193
  - 选填
194
- - v1 允许存储,但不要求回写到 `config.toml`
194
+ - v1 允许存储在 `providers.json`,但不要求回写到 `config.toml`
195
195
  - `note`
196
196
  - 选填
197
197
  - 面向人类和 AI 的说明字段
package/docs/cli-usage.md CHANGED
@@ -226,6 +226,7 @@ codexs setup --merge --codex-dir ./.tmp-codex
226
226
  行为说明:
227
227
 
228
228
  - 读取 `config.toml` 中已有 profile
229
+ - 仅 adopt 已具备 `model`、`model_provider` 且能解析到匹配 `model_providers.*.base_url` 的 profile
229
230
  - 收集每个 profile 对应的 provider 记录
230
231
  - 在受管备份流程下写入 `providers.json`
231
232
  - 成功后会自动运行一次 `doctor`
@@ -262,7 +263,7 @@ codexs add
262
263
  - `provider`:provider 名称,也是后续 `switch/show/edit/remove` 的标识
263
264
  - `--profile`:写入到 `config.toml` 的 profile 名称
264
265
  - `--api-key`:provider API key
265
- - `--base-url`:可选的 API base URL
266
+ - `--base-url`:可选的 provider 元数据,不会写回 `[profiles.*]`
266
267
  - `--note`:备注
267
268
  - `--tag`:标签,可重复传多次
268
269