@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
@@ -0,0 +1,340 @@
1
+ # codex-switch `0.0.5 -> 0.1.0` 演进 PRD
2
+
3
+ ## 文档信息
4
+
5
+ - 状态:Target PRD
6
+ - 产品名:`codex-switch`
7
+ - CLI 命令名:`codexs`
8
+ - 当前阶段基线:`0.0.5`
9
+ - 目标版本:`0.1.0`
10
+ - 文档定位:定义 `0.0.5` 之后持续演进到 `0.1.0` 的目标规格与路线
11
+ - 当前活跃 PRD:[`codex-switch-prd-v0.1.0.md`](./codex-switch-prd-v0.1.0.md)
12
+ - 历史基线 PRD:[`codex-switch-prd.md`](./codex-switch-prd.md)
13
+ - 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
14
+ - 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
15
+ - 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
16
+
17
+ 说明:
18
+
19
+ - 当前 active PRD 文件名沿用历史命名,但正文语义已更新为 `0.0.6`
20
+ - 本文档以“版本演进路线”而不是“文件名字面值”作为解释基准
21
+
22
+ ## 一句话定义
23
+
24
+ `codex-switch` 的 `0.1.0` 目标,是从一个已经具备 provider 管理、config consistency 和本地事务能力的 CLI,演进为一套对人类、AI 和后续集成层都稳定的发布级命令体系,并能够承载第三方 auth、本地代理和外部依赖接入这类扩展能力。
25
+
26
+ ## 版本语义
27
+
28
+ - `0.0.x`:测试 / 验证阶段版本,用于收敛命令面、错误契约、事务安全与模块边界
29
+ - `0.0.6`:稳定性修复 + 模块化重构里程碑,为后续 integration-ready 能力打基础
30
+ - `0.1.0`:第一条稳定发布规格线,要求公共契约、恢复能力和扩展边界清晰
31
+
32
+ ## `0.1.0` 总体目标
33
+
34
+ `0.1.0` 需要同时满足以下目标:
35
+
36
+ - 保持 CLI 与 JSON 契约稳定
37
+ - 保持 `setup`、provider registry、备份恢复主线能力不回退
38
+ - 让 provider registry 与 linked config sections 的一致性成为默认能力
39
+ - 让备份、回滚和诊断继续覆盖所有关键写操作
40
+ - 让模块边界足以承载未来第三方 auth / proxy / SDK 集成
41
+ - 在不破坏主 CLI 契约的前提下扩展运行时能力边界
42
+
43
+ ## 长期演进守则
44
+
45
+ 后续新增能力统一遵守:
46
+
47
+ - 不破坏当前 JSON envelope
48
+ - 不复用语义不匹配的错误码
49
+ - 所有写命令默认纳入备份与回滚模型
50
+ - 所有交互都只是 TTY 增强层,不改变自动化显式契约
51
+
52
+ ## 稳定公共契约
53
+
54
+ ### JSON Envelope
55
+
56
+ `--json` 继续保持统一 envelope:
57
+
58
+ ```json
59
+ {
60
+ "ok": true,
61
+ "command": "list",
62
+ "data": {},
63
+ "warnings": [],
64
+ "error": null
65
+ }
66
+ ```
67
+
68
+ 约束:
69
+
70
+ - 顶层 shape 保持不变
71
+ - 后续字段扩展只做加法
72
+ - 详细结果进入 `data`
73
+ - 非致命提示进入 `warnings`
74
+ - 结构化失败信息继续进入 `error`
75
+
76
+ ### 数据模型
77
+
78
+ #### `providers.json`
79
+
80
+ `providers.json` 继续是 managed registry 的单一事实源:
81
+
82
+ ```json
83
+ {
84
+ "providers": {
85
+ "packycode": {
86
+ "profile": "packycode",
87
+ "apiKey": "sk-xxx",
88
+ "baseUrl": "https://example.com/v1",
89
+ "note": "primary free model route",
90
+ "tags": ["free", "daily"]
91
+ }
92
+ }
93
+ }
94
+ ```
95
+
96
+ 到 `0.1.0` 为止默认不放宽:
97
+
98
+ - `profile` 仍然必填
99
+ - `apiKey` 仍按完整 managed provider 处理
100
+ - 不引入“半初始化 provider”作为正式稳定状态
101
+
102
+ #### `config.toml`
103
+
104
+ 到 `0.1.0` 为止,`config.toml` 的定位继续是“部分受管的 runtime projection”:
105
+
106
+ - 顶层 active `profile = "..."` 继续受管
107
+ - 与 provider 关联的 `[profiles.<name>]` section 进入受管范围
108
+ - 非 provider 相关的顶层键、section 和注释仍允许存在,但不进入通用编辑器范围
109
+
110
+ #### `ManagedProfileFields`
111
+
112
+ `0.1.0` 之前第一批稳定受管 profile 持久化字段继续锁定为最小集合:
113
+
114
+ ```json
115
+ {
116
+ "model": "gpt-5",
117
+ "modelProvider": "packycode"
118
+ }
119
+ ```
120
+
121
+ 约束:
122
+
123
+ - 第一批正式受管字段锁 `model` 与 `model_provider`
124
+ - `baseUrl` 作为读取视图字段,可由 `model_provider -> model_providers.<name>.base_url` 解析
125
+ - 后续扩展 profile 字段时,只能做加法
126
+
127
+ ## `0.1.0` 模块化目标
128
+
129
+ ### 核心结构方向
130
+
131
+ 到 `0.1.0` 为止,`codex-switch` 不应只停留在“`cli / app / domain / infra` 四层可用”这个层次,而应进一步收敛出稳定的能力边界:
132
+
133
+ - `Command Surface`
134
+ - `Interaction Layer`
135
+ - `Application Use Cases`
136
+ - `Domain Policies`
137
+ - `Storage Repositories`
138
+ - `Runtime Integrations`
139
+
140
+ 这些边界的意义不是强制锁死具体类名,而是保证未来新增能力不会继续把复杂度堆回单一 CLI 入口。
141
+
142
+ ### Runtime Integrations 的长期定位
143
+
144
+ `Runtime Integrations` 是 `0.1.0` 目标线中必须预留清楚的能力域,负责:
145
+
146
+ - `codex` CLI 调用与可用性检查
147
+ - 第三方 auth adapter
148
+ - 本地 proxy runtime
149
+ - 外部 SDK / 二进制依赖可用性探测
150
+ - integration 级错误语义收敛
151
+
152
+ ## 已落地能力的 `0.1.0` 稳定化要求
153
+
154
+ ### `setup`
155
+
156
+ `setup` 在 `0.1.0` 主线中的要求是:
157
+
158
+ - 继续保持从环境检测到 registry 初始化的主流程
159
+ - 继续允许 `overwrite`、`merge` 和交互式补问缺失关键字段
160
+ - 与 config 管理能力和未来 runtime integration 边界保持兼容
161
+ - 对历史遗留不一致状态给出 adopt / repair 建议,而不是静默忽略
162
+
163
+ ### provider registry 命令
164
+
165
+ `show`、`edit`、`import --merge`、`backups list`、`rollback <backup-id>` 的 `0.1.0` 要求是:
166
+
167
+ - 保持命令名和基础 JSON 契约稳定
168
+ - 把错误语义继续收紧
169
+ - 让与 `config.toml` 关联的行为更完整
170
+ - 不因引入第三方集成而改变现有 provider/config 的领域边界
171
+
172
+ ### `import --merge`
173
+
174
+ `import --merge` 在 `0.1.0` 主线中的要求是:
175
+
176
+ - 保持“导入侧覆盖本地同名 provider”的默认 merge 语义
177
+ - 不能只更新 `providers.json` 而放任 linked profile sections 漂移
178
+ - 当导入结果引用了缺失 profile 时,必须进入与 `add` / `edit` 一致的受管规则
179
+ - 非交互模式下,如果导入内容不能满足受管 profile 创建条件,应明确失败
180
+ - 交互模式下可以进入 adopt 辅助流,但不会为缺失 `model_providers` runtime section 做隐式 repair
181
+
182
+ ## `0.1.0` 主线能力域
183
+
184
+ 下面这些方向不要求在 `0.0.6` 全部交付,但它们不再只是模糊远期方向,而是 `0.1.0` 主线需要承接的能力域。
185
+
186
+ ### Config Management & Consistency
187
+
188
+ 目标:
189
+
190
+ - 巩固结构化 TOML 读写
191
+ - 稳定 `config-show`、`config-list-profiles`
192
+ - 让 provider 管理命令可靠同步 linked profile sections
193
+ - 明确共享 profile、孤儿 section 和 active profile 安全规则
194
+
195
+ ### Backup / Recovery Evolution
196
+
197
+ 目标:
198
+
199
+ - 保持 `backups` 与指定回滚能力稳定
200
+ - 确保跨 `providers.json`、`config.toml`、`auth.json` 的多文件写入仍可完整恢复
201
+ - 为更复杂的 runtime 变更继续复用同一事务模型
202
+
203
+ ### Error Contract Hardening
204
+
205
+ 目标:
206
+
207
+ - 收紧错误码语义
208
+ - 区分环境错误、参数错误、配置解析错误、集成错误和恢复错误
209
+ - 保持 TTY / 非交互模式下的错误结果可预测
210
+
211
+ ### Third-Party Auth Adapters
212
+
213
+ 目标:
214
+
215
+ - 支持把第三方认证来源封装为独立 integration 能力
216
+ - 不把第三方 auth 状态直接混入 provider registry 事实源
217
+ - 对 token 获取、刷新、失效和依赖缺失提供稳定诊断语义
218
+
219
+ ### Local Proxy Runtime
220
+
221
+ 目标:
222
+
223
+ - 为需要本地代理的上游保留运行时承载能力
224
+ - 允许启动、检查、停止或探测代理状态的能力进入集成层
225
+ - 不破坏现有 provider/profile 切换和回滚模型
226
+
227
+ ### External Dependency Lifecycle
228
+
229
+ 目标:
230
+
231
+ - 识别和诊断外部 SDK、CLI、二进制依赖是否可用
232
+ - 把依赖缺失、版本不兼容、环境不可执行等问题映射到清晰错误语义
233
+ - 为未来的依赖安装或引导能力留出接口,但不强制 `0.0.x` 提前产品化
234
+
235
+ ## GitHub Copilot 代表性场景
236
+
237
+ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目标:
238
+
239
+ - 可作为第三方 auth adapter 的首个高价值案例
240
+ - 可作为本地 proxy runtime 需求的首个真实驱动
241
+ - 可用来验证 `Runtime Integrations` 分层是否足够清楚
242
+
243
+ 当前不提前锁定:
244
+
245
+ - 具体命令名
246
+ - 具体交互流程
247
+ - `@github/copilot-sdk` 的封装形态
248
+ - 本地代理协议和生命周期细节
249
+
250
+ ## 主题里程碑
251
+
252
+ 从 `0.0.5` 走向 `0.1.0`,建议按能力主题推进:
253
+
254
+ ### 里程碑 A:`0.0.5` / Config Management & Consistency
255
+
256
+ 目标:
257
+
258
+ - 巩固结构化 TOML 读写
259
+ - 稳定 `config-show`、`config-list-profiles`
260
+ - 让 provider 管理命令可靠同步 linked profile sections
261
+ - 明确共享 profile、孤儿 section 和 active profile 安全规则
262
+
263
+ ### 里程碑 B:`0.0.6` / Stability & Modularization
264
+
265
+ 目标:
266
+
267
+ - 修复 `0.0.5` 已落地命令的稳定性问题
268
+ - 统一 help、交互、错误语义和恢复模型
269
+ - 解决 `cli.ts` 过重问题,明确 command / interaction / application / integration 边界
270
+ - 为第三方 auth / proxy / SDK 集成建立 integration-ready 架构基础
271
+
272
+ ### 里程碑 C:Backup / Recovery Evolution
273
+
274
+ 目标:
275
+
276
+ - 保持历史备份、显式回滚和多文件恢复稳定
277
+ - 让更复杂的 runtime 变更继续复用同一事务模型
278
+
279
+ ### 里程碑 D:Error Contract Hardening
280
+
281
+ 目标:
282
+
283
+ - 收紧错误码语义
284
+ - 区分环境错误、参数错误、配置解析错误和恢复错误
285
+ - 对第三方 integration 的失败提供清晰可预测的错误契约
286
+
287
+ ### 里程碑 E:Integrations & Runtime Expansion
288
+
289
+ 目标:
290
+
291
+ - 逐步引入第三方 auth adapter
292
+ - 逐步引入本地 proxy runtime
293
+ - 逐步引入外部依赖可用性管理
294
+ - 在不破坏主 CLI 契约的前提下扩展能力边界
295
+
296
+ ## 对实现的要求
297
+
298
+ 从 `0.0.5` 到 `0.1.0` 的所有新增能力,默认遵守:
299
+
300
+ - 命令帮助必须明确人类模式和 `--json` 模式行为
301
+ - 非交互环境不允许依赖 prompt 才能完成核心自动化流程
302
+ - 所有写命令默认走锁、备份、回滚
303
+ - 所有新增错误码都必须语义清晰
304
+ - 所有新增 JSON 返回都只能扩展 `data` 和 `warnings`
305
+ - 结构化 TOML 写回不能破坏非受管部分
306
+ - 第三方 integration 不得直接破坏 provider registry 作为 SSOT 的边界
307
+ - 多候选目录发现和依赖可用性检查必须在交互与非交互模式下给出一致且可预测的行为
308
+
309
+ ## `0.1.0` 目标完成标准
310
+
311
+ 达到下面这些条件时,可以认为 `0.1.0` 主线目标基本收敛:
312
+
313
+ - 用户可以通过 `setup` 完成首次初始化
314
+ - `setup` 在多候选 Codex 目录场景下可交互选择或手动输入,在非交互场景下返回明确歧义错误
315
+ - provider registry 的查看、编辑、导入合并能力完整
316
+ - 用户和 AI 可以通过稳定命令结构化查看受管 `config.toml`
317
+ - `add` / `edit` / `remove` 执行后,`providers.json` 与 linked profile sections 不再出现预期内的一致性漂移
318
+ - 共享 profile 场景不会误删仍被引用的 section
319
+ - active profile 不会因为 provider 删除或 profile 迁移而变成悬空状态
320
+ - 历史 `0.0.4` / `0.0.5` / `0.0.6` 状态可以被识别,并通过 adopt / repair 路径逐步收敛
321
+ - 历史备份可被显式枚举和恢复
322
+ - CLI 错误码不再存在明显语义复用问题
323
+ - 第三方 auth / proxy / 外部依赖能力可以通过独立 integration 边界接入,而不破坏主 CLI 契约
324
+
325
+ ## 建议测试场景
326
+
327
+ 至少需要覆盖:
328
+
329
+ - `config-show` 与 `config-list-profiles` 的稳定输出
330
+ - 共享 profile 场景下的 `add` / `edit` / `remove` 行为
331
+ - `setup` 在多目录候选下的交互和非交互分支
332
+ - `import --merge` 在缺失 profile / adopt / repair 下的一致性行为
333
+ - 结构化 TOML 修改后,非受管内容、顺序和注释保持稳定
334
+ - 双写失败时 `providers.json`、`config.toml` 与 `auth.json` 能整体回滚
335
+ - 历史 workspace、共享 profile、孤儿 profile section、缺失 linked section 都能被 `doctor` / `status` 正确识别
336
+ - 外部 CLI / SDK / auth integration 缺失或不可用时,错误语义清晰且不污染核心 provider/config 状态
337
+
338
+ ## 结论
339
+
340
+ `0.1.0` 不是简单把 `0.0.x` 重命名为稳定版,而是在保持当前本地事务式切换模型不变的前提下,进一步收敛 config 管理、错误契约、恢复能力和模块化扩展边界,并把第三方 auth、本地代理和外部依赖接入正式纳入主线能力域。