@minniexcode/codex-switch 0.0.4 → 0.0.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.
@@ -1,77 +1,80 @@
1
- # codex-switch `0.1.0` 目标 PRD
1
+ # codex-switch `0.0.5` 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.4`
9
+ - 目标版本:`0.0.5`
10
+ - 文档定位:定义 `0.0.4 -> 0.0.5` 的直接需求范围
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
 
16
17
  ## 一句话定义
17
18
 
18
- `codex-switch` `0.1.0` 目标,是从一个已经验证可行的本地 provider/profile 管理 CLI,演进为一套对人类和 AI 都稳定、可初始化、可诊断、可恢复、可持续扩展的发布级命令体系。
19
+ `0.0.5` 的目标不是继续堆命令,而是把 `config.toml` 从“只能浅层切换 active profile”升级为“可以结构化读取、受控维护 provider-linked profiles,并与 `providers.json` 保持一致”。
19
20
 
20
- ## 版本语义
21
-
22
- - `0.0.x`:测试 / 验证阶段版本,用于收敛模型、命令面和失败语义
23
- - `0.1.0`:第一条稳定发布规格线,不要求当前立刻完成,但要求目标边界清晰
24
- - 当前仓库状态:`0.0.3` 已完成 MVP 核心命令面与交互式增强
25
-
26
- 这意味着本文件不是“下一版马上发布什么”的短期计划,而是 `0.0.3` 之后持续演进到 `0.1.0` 的目标 PRD。
27
-
28
- ## 当前基线:`0.0.3`
21
+ ## 当前基线:`0.0.4`
29
22
 
30
23
  当前已落地能力:
31
24
 
32
25
  - `list` / `current` / `status`
33
26
  - `switch <provider>`
34
- - `import <file>` / `export <file>`
35
- - `add <provider>` / `remove <provider>`
27
+ - `import <file>` / `import <file> --merge` / `export <file>`
28
+ - `add <provider>` / `edit <provider>` / `show <provider>` / `remove <provider>`
29
+ - `setup`
36
30
  - `doctor`
37
- - `rollback`
31
+ - `backups list`
32
+ - `rollback` / `rollback <backup-id>`
38
33
 
39
- 当前基线已经具备的工程特征:
34
+ 当前基线已具备的工程特征:
40
35
 
41
36
  - 本地文件模型围绕 `~/.codex/`
42
37
  - `providers.json` 作为 management SSOT
43
38
  - `config.toml` 与 `auth.json` 作为 runtime state
44
39
  - 写命令统一走备份、锁和失败回滚
45
40
  - `--json` 输出固定 envelope
46
- - 高频写命令支持 TTY 渐进式交互
47
41
 
48
- 当前基线仍然存在的边界:
42
+ 当前主要缺口:
49
43
 
50
- - 缺少首次初始化 / bootstrap 命令
51
- - 只支持 latest rollback,不支持按备份条目恢复
52
- - provider 查看和编辑仍然偏基础
53
- - 错误码体系仍带有 MVP 阶段的复用痕迹
54
- - 尚未进入第三方 auth / extension 集成阶段
44
+ - `config.toml` 仍以轻量字符串匹配方式处理
45
+ - provider 管理命令不能稳定同步 linked profile sections
46
+ - 缺少结构化展示 config 的稳定命令面
47
+ - 历史 profile、共享 profile、缺失 section 的一致性规则还不完整
55
48
 
56
- ## `0.1.0` 目标
49
+ ## `0.0.5` 目标
57
50
 
58
- `0.1.0` 需要同时满足以下目标:
51
+ `0.0.5` 需要完成四件事:
59
52
 
60
- - 保持当前 CLI 和 JSON 契约稳定
61
- - 让首次用户可以通过 `setup` 完成从环境检测到 registry 初始化的主流程
62
- - 让 provider registry 的查看、编辑、导入合并能力更完整
63
- - 让备份与回滚从“最新一次”演进到“显式备份条目”
64
- - 为未来 auth / extension 集成保留明确边界,而不把远期需求提前塞进稳定主线
53
+ - 引入结构化 TOML 读取与非破坏性修改能力
54
+ - 增加稳定的 config 查看命令,供人类、AI 和脚本消费
55
+ - 让 provider 写命令同步维护 linked profile sections
56
+ - 补齐历史状态、一致性信号和安全删除规则
65
57
 
66
- ## 长期演进守则
58
+ ## 范围
67
59
 
68
- 如果继续扩展命令面,后续新增命令统一遵守下面三条:
60
+ ### In Scope
69
61
 
70
- - 不破坏当前 JSON envelope
71
- - 不复用语义不匹配的错误码
72
- - 所有写命令默认纳入备份与回滚模型
62
+ - 顶层 active `profile`
63
+ - `[profiles.<name>]` 受管 section
64
+ - 第一批正式受管字段:`model`
65
+ - `config show`
66
+ - `config list-profiles`
67
+ - `add` / `edit` / `remove` / `setup` / `import --merge` 的 provider-config 一致性
68
+ - `doctor` / `status` 的一致性信号
73
69
 
74
- ## 稳定公共契约
70
+ ### Out of Scope
71
+
72
+ - 整个 `config.toml` 的通用编辑器
73
+ - 任意顶层键的自由增删改
74
+ - 更大 profile schema 的首版正式规格
75
+ - 第三方 auth / extension 集成
76
+
77
+ ## 数据与契约
75
78
 
76
79
  ### JSON Envelope
77
80
 
@@ -87,307 +90,254 @@
87
90
  }
88
91
  ```
89
92
 
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”作为正式稳定状态
93
+ 要求:
121
94
 
122
- ### 错误码演进原则
95
+ - 顶层 shape 不变
96
+ - 新字段只追加到 `data` / `warnings`
97
+ - 错误信息继续进入 `error`
123
98
 
124
- 保留现有领域错误码,并把错误码体系从 MVP 复用模式收紧到语义匹配模式。
99
+ ### `providers.json`
125
100
 
126
- 现有保留:
101
+ `providers.json` 继续是 provider registry 的单一事实源:
127
102
 
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`
103
+ - `profile` 必填
104
+ - `apiKey` 仍按完整 managed provider 处理
105
+ - 不引入“半初始化 provider”作为稳定状态
138
106
 
139
- 后续新增命令应逐步引入更精确的错误码,而不是继续把无关问题塞进 `INVALID_IMPORT_FILE`。
107
+ ### `config.toml`
140
108
 
141
- 建议新增 / 预留:
109
+ `0.0.5` 为止,`config.toml` 的受管范围限定为:
142
110
 
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`
111
+ - 顶层 active `profile`
112
+ - 与 provider 关联的 `[profiles.<name>]`
113
+ - section 内最小正式字段:`model`
153
114
 
154
115
  约束:
155
116
 
156
- - `CODEX_LOGIN_FAILED` 只表示登录失败
157
- - codex 缺失与版本过低必须使用环境类错误码
158
- - rollback 找不到目标备份时必须使用恢复类错误码
159
-
160
- ## `0.0.4` 功能里程碑
117
+ - `providers.json` 仍是 provider 身份、凭据和管理元数据的 SSOT
118
+ - `config.toml` 只承载运行态投影,不升级为对等事实源
119
+ - 非受管 TOML 内容允许存在,但不进入通用编辑范围
161
120
 
162
- 下面这些内容暂时作为 `0.0.4` 的功能里程碑。它们属于从 `0.0.3` 往 `0.1.0` 推进过程中的下一阶段,不代表已经锁定整个 `0.1.0` 的最终范围。
121
+ ### Managed Profile View
163
122
 
164
- ### 1. `codexs setup`
123
+ 读取命令应围绕稳定视图返回,而不是直接暴露内部持久化细节。最小视图建议包含:
165
124
 
166
- #### 目标
167
-
168
- 提供首次初始化主流程,让用户从“本机已有 Codex 环境,但还没有 codex-switch 管理态文件”平滑进入受管状态。
169
-
170
- #### 目标命令
171
-
172
- ```bash
173
- codexs setup
125
+ ```json
126
+ {
127
+ "name": "packycode",
128
+ "model": "gpt-5",
129
+ "linkedProviders": ["packycode"],
130
+ "isActive": true,
131
+ "managed": true
132
+ }
174
133
  ```
175
134
 
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
- - 任意时刻都允许用户手动输入自定义目录
135
+ ## Config Management 规则
201
136
 
202
- #### 凭据初始化原则
137
+ ### 受管与非受管
203
138
 
204
- 因为 `config.toml` 不能可靠恢复所有 provider 的 `apiKey`,所以:
139
+ - managed profile:被至少一个 provider 引用,允许被写命令同步维护
140
+ - unmanaged profile:存在于 `config.toml`,但当前没有任何 provider 引用,默认只读展示
141
+ - orphaned managed reference:`providers.json` 引用了 profile,但 `config.toml` 缺失对应 section,属于不一致状态
205
142
 
206
- - `setup` 不自动伪造或猜测 API key
207
- - 交互模式下可以补问缺失的 `apiKey`
208
- - 非交互模式下,如果缺失关键字段,应中止写入并返回明确错误
209
- - `0.0.4` 里程碑中不引入“缺 key 的正式 provider 记录”
143
+ ### 共享 profile
210
144
 
211
- #### Codex 版本门槛
145
+ 多个 provider 指向同一个 profile 在 `0.0.5` 继续合法:
212
146
 
213
- - `setup` `doctor` 都应支持最低 Codex 版本检查
214
- - 最低版本门槛在 PRD 中定义为“必须存在的可配置门槛”
215
- - 具体版本号不在本文件中写死,由实现常量和发布说明控制
147
+ - profile section 不归单个 provider 独占
148
+ - 只有当没有任何 provider 引用时,才允许删除对应 section
149
+ - `remove` / `edit` 不能因单个 provider 操作误删共享 profile
216
150
 
217
- ### 2. CLI 契约收紧
151
+ ### TOML 处理原则
218
152
 
219
- `0.0.4` 里程碑中,需要把当前命令层从“已经可用”继续收紧到“更稳定可依赖”:
153
+ - 不再以字符串匹配作为唯一修改策略
154
+ - 对受管 section 的读取、创建、删除、字段更新必须可验证
155
+ - 修改受管部分时,不应破坏非受管内容、顺序、空行和注释
220
156
 
221
- - 将参数错误与业务错误分离
222
- - 将环境问题与登录问题分离
223
- - 保持命令帮助、TTY 行为和 `--json` 行为一致
224
- - 让新增命令默认沿用当前 envelope、锁、备份和回滚模型
157
+ ## 新增命令
225
158
 
226
- ### 3. 命令增强候选
159
+ ### `codexs config show`
227
160
 
228
- 下面这些命令方向暂时也归入 `0.0.4` 里程碑候选池,用于指导下一阶段设计和实现优先级;它们仍然不是当前已完成范围。
161
+ 用途:
229
162
 
230
- ### `codexs show <provider>`
163
+ - 展示结构化 config 视图
164
+ - 同时服务人类和 AI / 自动化读取
231
165
 
232
- 目标:
233
-
234
- - 展示单个 provider 的完整详情
235
- - 既服务人类,也服务 AI 读取结构化 provider 数据
236
-
237
- 定位:
238
-
239
- - 只读命令
240
- - 不进入备份与回滚流程
241
-
242
- ### `codexs edit <provider>`
166
+ 输入:
243
167
 
244
- 目标:
245
-
246
- - 修改单个 provider 的字段内容
247
-
248
- 默认交互模型:
249
-
250
- - 显式参数优先
251
- - 允许使用 `--profile`、`--api-key`、`--base-url`、`--note`、`--tag`
252
- - TTY 下只补全缺失项或确认危险写入
253
- - 不以外部编辑器作为默认形态
168
+ ```bash
169
+ codexs config show [profile] [--json] [--codex-dir <path>]
170
+ ```
254
171
 
255
- 约束:
172
+ 最小返回要求:
256
173
 
257
- - 作为写命令,默认纳入备份、锁和失败回滚
174
+ - `activeProfile`
175
+ - `profiles`
176
+ - `includedProfiles`
258
177
 
259
- ### `codexs backups list`
178
+ `profiles[]` 中每项至少包含:
260
179
 
261
- 目标:
180
+ - `name`
181
+ - `managed`
182
+ - `isActive`
183
+ - `linkedProviders`
184
+ - `managedFields`
185
+ - `source`
262
186
 
263
- - 列出历史备份条目
264
- - 让用户和 AI 能显式选择恢复目标
187
+ ### `codexs config list-profiles`
265
188
 
266
- 建议输出字段:
189
+ 用途:
267
190
 
268
- - `backupId`
269
- - `createdAt`
270
- - `reason`
271
- - `files`
272
- - `backupPath`
191
+ - 列出当前 `config.toml` 中的 profile 视图
192
+ - 明确显示 profile 与 provider 的关联关系
273
193
 
274
- 备份 ID 规则:
194
+ 输入:
275
195
 
276
- - 默认以备份目录 basename 作为稳定 `backupId`
277
- - 例如 `20260511-221457-switch`
196
+ ```bash
197
+ codexs config list-profiles [--json] [--codex-dir <path>]
198
+ ```
278
199
 
279
- ### `codexs rollback <backup-id>`
200
+ `data.profiles[]` 至少包含:
280
201
 
281
- 目标:
202
+ - `name`
203
+ - `managed`
204
+ - `isActive`
205
+ - `linkedProviders`
206
+ - `model`
282
207
 
283
- - 从“只支持 latest rollback”演进到“支持显式备份条目恢复”
208
+ ## 现有写命令升级
284
209
 
285
- 约束:
210
+ ### `codexs add <provider>`
286
211
 
287
- - `rollback` 继续保留 latest 入口
288
- - `rollback <backup-id>` 作为增强能力引入
289
- - 指定备份不存在时必须返回专门错误码,而不是复用 generic rollback failure
212
+ 新增或锁定:
290
213
 
291
- ### `codexs import --merge`
214
+ - `--model <name>`
215
+ - `--create-profile`
292
216
 
293
- 目标:
217
+ 规则:
294
218
 
295
- - 在不整体替换当前 registry 的前提下导入 provider 清单
219
+ - 当目标 profile 已存在时,允许直接建立映射
220
+ - 当目标 profile 不存在时,只有显式传入 `--create-profile --model <name>` 才允许创建 section
221
+ - 缺少最小受管字段时,返回 `MANAGED_PROFILE_FIELDS_MISSING`
296
222
 
297
- 默认冲突策略:
223
+ ### `codexs edit <provider>`
298
224
 
299
- - 当导入文件和当前 registry 出现同名 provider 冲突时,以导入文件内容为准
300
- - 未冲突条目继续保留
301
- - 最终结果仍作为一次受管写操作进入备份与回滚流程
225
+ 新增或锁定:
302
226
 
303
- ## `0.1.0` 远期目标与能力域
227
+ - `--profile <name>`
228
+ - `--model <name>`
229
+ - `--create-profile`
304
230
 
305
- 下面这些方向明确有价值,但当前不进入 `0.0.4` 里程碑,只作为继续走向 `0.1.0` 的远期能力域。
231
+ 规则:
306
232
 
307
- ### 第三方 auth / extension 集成
233
+ - `edit --profile <missing>` 且未传 `--create-profile` 时失败
234
+ - `edit --profile <missing> --create-profile` 但未传 `--model` 时失败
235
+ - 旧 profile 若仍被其他 provider 引用,则保留
236
+ - 旧 profile 若已无引用且不是 active profile,则可以删除
237
+ - 不隐式 rename 或 copy 旧 section 到新 profile
308
238
 
309
- 示例方向:
239
+ ### `codexs remove <provider>`
310
240
 
311
- - 接入 Copilot auth
312
- - 在本地启动代理服务,使特定上游可在 Codex 中使用
313
- - 安装和管理第三方依赖
241
+ 新增或锁定:
314
242
 
315
- 当前定位:
243
+ - `--switch-to <profile>`
316
244
 
317
- - 作为单独能力域保留
318
- - 不在当前主 PRD 中锁定具体命令名和具体交互细节
319
- - 不进入 `0.1.0` 稳定主线的验收标准
245
+ 规则:
320
246
 
321
- ### 交互式依赖安装
247
+ - 删除 provider 记录后,若 profile 仍被其他 provider 引用,则保留 section
248
+ - 若 profile 已无任何引用,则允许删除 section
249
+ - 若该 profile 仍是当前 active 且最后一个引用,必须先 `switch` 或显式传 `--switch-to`
250
+ - 不允许把 active profile 留成悬空状态
322
251
 
323
- 未来如果引入:
252
+ ### `codexs switch <provider>`
324
253
 
325
- - 应采用交互式多选模式
326
- - 类似 skills 安装体验
327
- - 支持一次选择多个可选依赖
254
+ - 继续只负责切换顶层 active profile
255
+ - 不负责修复 profile section 内容
256
+ - 执行前提仍是目标 profile section 必须存在且可识别
328
257
 
329
- 但当前阶段仅记录方向,不进入正式规格。
258
+ ## `setup` 升级
330
259
 
331
- ## 主题里程碑
260
+ `setup` 在 `0.0.5` 需要与新一致性模型兼容:
332
261
 
333
- `0.0.3` 走向 `0.1.0`,建议按能力主题推进,而不是现在就预写死每个小版本号。
262
+ - 支持扫描多个候选 Codex 目录
263
+ - 多候选下,TTY 允许选择或手动输入目录
264
+ - 非交互模式下,多候选且未显式传 `--codex-dir` 时返回 `CODEX_DIR_AMBIGUOUS`
265
+ - 未发现任何候选目录时,TTY 可手动输入;非交互返回 `CODEX_DIR_NOT_FOUND`
266
+ - 对从现有 `config.toml` 发现的 profile,允许 adopt 为受管 profile
267
+ - 不制造新的 registry-config 不一致
334
268
 
335
- ### 里程碑 A:`0.0.4` / Bootstrap / Setup
269
+ ## Write Result Contract
336
270
 
337
- 目标:
271
+ 下列写命令成功时,建议在 JSON `data` 中稳定返回结果字段:
338
272
 
339
- - 完成 `setup` 规格与实现
340
- - 把首次初始化从“手工准备文件”提升到“命令引导完成”
341
- - 补齐 codex 安装和版本检查语义
273
+ - `add`
274
+ - `edit`
275
+ - `remove`
276
+ - `setup`
277
+ - `import --merge`
342
278
 
343
- 详细设计文档:
279
+ 建议字段:
344
280
 
345
- - [`../codex-switch-v0.0.4-design.md`](../codex-switch-v0.0.4-design.md)
281
+ - `provider`
282
+ - `profile`
283
+ - `createdProfileSections`
284
+ - `deletedProfileSections`
285
+ - `keptSharedProfiles`
286
+ - `switchedActiveProfile`
287
+ - `adoptedProfiles`
288
+ - `repairedProfiles`
346
289
 
347
- ### 里程碑 B:Provider Registry Ergonomics
290
+ ## 事务与回滚
348
291
 
349
- 目标:
292
+ 所有可能同时修改 `providers.json` 和 `config.toml` 的命令,默认遵守:
350
293
 
351
- - 增强 provider 的查看与编辑能力
352
- - 保持 `providers.json` 作为管理态事实源
353
- - 不默认把 runtime 文件反向回写到 registry
294
+ - 单次锁
295
+ - 单次备份
296
+ - 单次失败整体回滚
354
297
 
355
- ### 里程碑 C:Backup / Recovery Evolution
298
+ 不能接受的结果:
356
299
 
357
- 目标:
300
+ - `providers.json` 已更新但 `config.toml` 未同步
301
+ - `config.toml` 已更新但 `providers.json` 未同步
302
+ - active profile 指向已不存在的 section
358
303
 
359
- - 引入 `backups list`
360
- - 引入按 `backupId` 回滚
361
- - 为 `import --merge` 提供完整恢复语义
304
+ ## 迁移与诊断
362
305
 
363
- ### 里程碑 D:Extensions / Auth Integration
306
+ 需要识别的历史状态:
364
307
 
365
- 目标:
308
+ - `providers.json` 可用,但 `config.toml` 中只有手工维护 profile
309
+ - `providers.json` 引用了 profile,但对应 section 不存在
310
+ - `config.toml` 存在历史 profile,但没有任何 provider 引用
311
+ - 当前 active profile 指向 unmanaged profile
366
312
 
367
- - 评估第三方 auth 与本地代理集成
368
- - 评估交互式依赖安装与 extension 管理
369
- - 在不破坏主 CLI 契约的前提下扩展能力边界
313
+ 迁移原则:
370
314
 
371
- ## 对实现的要求
315
+ - 不要求用户先手工清空历史状态
316
+ - `setup`、`import --merge`、`doctor`、`status` 必须能识别这些状态
317
+ - 可安全 adopt 的 unmanaged profile,允许纳入受管
318
+ - 对悬空引用或缺失 section,默认不静默修复,必须告知用户下一步建议
372
319
 
373
- 从现在到 `0.1.0` 的所有新增能力,默认遵守:
320
+ `doctor` / `status` 至少需要覆盖:
374
321
 
375
- - 命令帮助必须明确人类模式和 `--json` 模式行为
376
- - 非交互环境不允许依赖 prompt 才能完成核心自动化流程
377
- - 所有写命令默认走锁、备份、回滚
378
- - 所有新增错误码都必须语义清晰
379
- - 所有新增 JSON 返回都只能扩展 `data` 和 `warnings`
322
+ - orphaned profile reference
323
+ - unmanaged active profile
324
+ - shared profile reference count
325
+ - orphaned profile section
326
+ - destructive remove blocked
380
327
 
381
- ## `0.1.0` 目标完成标准
328
+ ## 验收标准
382
329
 
383
- 达到下面这些条件时,可以认为 `0.1.0` 主线目标基本收敛:
330
+ 达到以下条件时,`0.0.5` 可以认为完成:
384
331
 
385
- - 用户可以通过 `setup` 完成首次初始化
386
- - provider registry 的查看、编辑、导入合并能力完整
387
- - 历史备份可被显式枚举和恢复
388
- - CLI 错误码不再存在明显语义复用问题
389
- - CLI 契约对 AI 和脚本调用保持稳定
332
+ - `config show` 在文本和 `--json` 模式下返回稳定结构
333
+ - `config list-profiles` 能稳定展示 `managed`、`isActive`、`linkedProviders` 和 `model`
334
+ - `add` / `edit` / `remove` 会同步维护 linked profile sections
335
+ - 共享 profile 场景不会误删仍被引用的 section
336
+ - active profile 不会因删除 provider 或迁移 profile 而悬空
337
+ - 历史 `0.0.4` 状态可被识别,并通过 adopt / repair 路径收敛
338
+ - 结构化 TOML 修改后,非受管内容、顺序和注释保持稳定
339
+ - 双写失败时 `providers.json` 与 `config.toml` 能整体回滚
390
340
 
391
341
  ## 结论
392
342
 
393
- `0.1.0` 不是简单地把现有 MVP 重命名为稳定版,而是要在保持当前本地事务式切换模型不变的前提下,补齐初始化能力、增强 registry 操作、收紧错误契约,并为未来更大范围的 auth / extension 集成留出清晰边界。
343
+ `0.0.5` `codex-switch` provider registry 工具走向 config-aware CLI 的第一步。它的重点不是扩张命令面,而是建立稳定的 config 管理、一致性事务和可诊断能力,为后续 `0.0.5 -> 0.1.0` 演进打基础。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minniexcode/codex-switch",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Local-first CLI for managing and switching Codex provider/profile configuration.",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",