@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.
- package/dist/app/add-provider.js +32 -1
- package/dist/app/edit-provider.js +74 -1
- package/dist/app/get-status.js +9 -2
- package/dist/app/import-providers.js +37 -1
- package/dist/app/list-config-profiles.js +29 -0
- package/dist/app/remove-provider.js +34 -2
- package/dist/app/run-doctor.js +22 -21
- package/dist/app/setup-codex.js +33 -16
- package/dist/app/show-config.js +34 -0
- package/dist/app/switch-provider.js +5 -2
- package/dist/cli/args.js +13 -2
- package/dist/cli/help.js +42 -5
- package/dist/cli/interactive.js +56 -0
- package/dist/cli/output.js +22 -0
- package/dist/cli.js +101 -12
- package/dist/domain/config.js +471 -39
- package/dist/infra/codex-cli.js +18 -3
- package/dist/infra/codex-discovery.js +3 -41
- package/dist/infra/codex-paths.js +1 -1
- package/dist/infra/config-repo.js +102 -9
- package/docs/Design/codex-switch-v0.0.5-design.md +922 -0
- package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +308 -0
- package/docs/PRD/codex-switch-prd-v0.1.0.md +210 -260
- package/package.json +1 -1
- /package/docs/{codex-switch-v0.0.4-design.md → Design/codex-switch-v0.0.4-design.md} +0 -0
|
@@ -1,77 +1,80 @@
|
|
|
1
|
-
# codex-switch `0.
|
|
1
|
+
# codex-switch `0.0.5` PRD
|
|
2
2
|
|
|
3
3
|
## 文档信息
|
|
4
4
|
|
|
5
|
-
- 状态:
|
|
5
|
+
- 状态:Active PRD
|
|
6
6
|
- 产品名:`codex-switch`
|
|
7
7
|
- CLI 命令名:`codexs`
|
|
8
|
-
- 当前基线版本:`0.0.
|
|
9
|
-
- 目标版本:`0.
|
|
10
|
-
-
|
|
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
|
-
`
|
|
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
|
-
- `
|
|
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
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
- 尚未进入第三方 auth / extension 集成阶段
|
|
44
|
+
- `config.toml` 仍以轻量字符串匹配方式处理
|
|
45
|
+
- provider 管理命令不能稳定同步 linked profile sections
|
|
46
|
+
- 缺少结构化展示 config 的稳定命令面
|
|
47
|
+
- 历史 profile、共享 profile、缺失 section 的一致性规则还不完整
|
|
55
48
|
|
|
56
|
-
## `0.
|
|
49
|
+
## `0.0.5` 目标
|
|
57
50
|
|
|
58
|
-
`0.
|
|
51
|
+
`0.0.5` 需要完成四件事:
|
|
59
52
|
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
- 让 provider
|
|
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
|
-
-
|
|
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
|
-
|
|
99
|
+
### `providers.json`
|
|
125
100
|
|
|
126
|
-
|
|
101
|
+
`providers.json` 继续是 provider registry 的单一事实源:
|
|
127
102
|
|
|
128
|
-
- `
|
|
129
|
-
- `
|
|
130
|
-
-
|
|
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
|
-
|
|
107
|
+
### `config.toml`
|
|
140
108
|
|
|
141
|
-
|
|
109
|
+
到 `0.0.5` 为止,`config.toml` 的受管范围限定为:
|
|
142
110
|
|
|
143
|
-
- `
|
|
144
|
-
- `
|
|
145
|
-
- `
|
|
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
|
-
- `
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
## `0.0.4` 功能里程碑
|
|
117
|
+
- `providers.json` 仍是 provider 身份、凭据和管理元数据的 SSOT
|
|
118
|
+
- `config.toml` 只承载运行态投影,不升级为对等事实源
|
|
119
|
+
- 非受管 TOML 内容允许存在,但不进入通用编辑范围
|
|
161
120
|
|
|
162
|
-
|
|
121
|
+
### Managed Profile View
|
|
163
122
|
|
|
164
|
-
|
|
123
|
+
读取命令应围绕稳定视图返回,而不是直接暴露内部持久化细节。最小视图建议包含:
|
|
165
124
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
139
|
+
- managed profile:被至少一个 provider 引用,允许被写命令同步维护
|
|
140
|
+
- unmanaged profile:存在于 `config.toml`,但当前没有任何 provider 引用,默认只读展示
|
|
141
|
+
- orphaned managed reference:`providers.json` 引用了 profile,但 `config.toml` 缺失对应 section,属于不一致状态
|
|
205
142
|
|
|
206
|
-
|
|
207
|
-
- 交互模式下可以补问缺失的 `apiKey`
|
|
208
|
-
- 非交互模式下,如果缺失关键字段,应中止写入并返回明确错误
|
|
209
|
-
- `0.0.4` 里程碑中不引入“缺 key 的正式 provider 记录”
|
|
143
|
+
### 共享 profile
|
|
210
144
|
|
|
211
|
-
|
|
145
|
+
多个 provider 指向同一个 profile 在 `0.0.5` 继续合法:
|
|
212
146
|
|
|
213
|
-
-
|
|
214
|
-
-
|
|
215
|
-
-
|
|
147
|
+
- profile section 不归单个 provider 独占
|
|
148
|
+
- 只有当没有任何 provider 引用时,才允许删除对应 section
|
|
149
|
+
- `remove` / `edit` 不能因单个 provider 操作误删共享 profile
|
|
216
150
|
|
|
217
|
-
###
|
|
151
|
+
### TOML 处理原则
|
|
218
152
|
|
|
219
|
-
|
|
153
|
+
- 不再以字符串匹配作为唯一修改策略
|
|
154
|
+
- 对受管 section 的读取、创建、删除、字段更新必须可验证
|
|
155
|
+
- 修改受管部分时,不应破坏非受管内容、顺序、空行和注释
|
|
220
156
|
|
|
221
|
-
|
|
222
|
-
- 将环境问题与登录问题分离
|
|
223
|
-
- 保持命令帮助、TTY 行为和 `--json` 行为一致
|
|
224
|
-
- 让新增命令默认沿用当前 envelope、锁、备份和回滚模型
|
|
157
|
+
## 新增命令
|
|
225
158
|
|
|
226
|
-
###
|
|
159
|
+
### `codexs config show`
|
|
227
160
|
|
|
228
|
-
|
|
161
|
+
用途:
|
|
229
162
|
|
|
230
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- `
|
|
269
|
-
-
|
|
270
|
-
- `reason`
|
|
271
|
-
- `files`
|
|
272
|
-
- `backupPath`
|
|
191
|
+
- 列出当前 `config.toml` 中的 profile 视图
|
|
192
|
+
- 明确显示 profile 与 provider 的关联关系
|
|
273
193
|
|
|
274
|
-
|
|
194
|
+
输入:
|
|
275
195
|
|
|
276
|
-
|
|
277
|
-
-
|
|
196
|
+
```bash
|
|
197
|
+
codexs config list-profiles [--json] [--codex-dir <path>]
|
|
198
|
+
```
|
|
278
199
|
|
|
279
|
-
|
|
200
|
+
`data.profiles[]` 至少包含:
|
|
280
201
|
|
|
281
|
-
|
|
202
|
+
- `name`
|
|
203
|
+
- `managed`
|
|
204
|
+
- `isActive`
|
|
205
|
+
- `linkedProviders`
|
|
206
|
+
- `model`
|
|
282
207
|
|
|
283
|
-
|
|
208
|
+
## 现有写命令升级
|
|
284
209
|
|
|
285
|
-
|
|
210
|
+
### `codexs add <provider>`
|
|
286
211
|
|
|
287
|
-
|
|
288
|
-
- `rollback <backup-id>` 作为增强能力引入
|
|
289
|
-
- 指定备份不存在时必须返回专门错误码,而不是复用 generic rollback failure
|
|
212
|
+
新增或锁定:
|
|
290
213
|
|
|
291
|
-
|
|
214
|
+
- `--model <name>`
|
|
215
|
+
- `--create-profile`
|
|
292
216
|
|
|
293
|
-
|
|
217
|
+
规则:
|
|
294
218
|
|
|
295
|
-
-
|
|
219
|
+
- 当目标 profile 已存在时,允许直接建立映射
|
|
220
|
+
- 当目标 profile 不存在时,只有显式传入 `--create-profile --model <name>` 才允许创建 section
|
|
221
|
+
- 缺少最小受管字段时,返回 `MANAGED_PROFILE_FIELDS_MISSING`
|
|
296
222
|
|
|
297
|
-
|
|
223
|
+
### `codexs edit <provider>`
|
|
298
224
|
|
|
299
|
-
|
|
300
|
-
- 未冲突条目继续保留
|
|
301
|
-
- 最终结果仍作为一次受管写操作进入备份与回滚流程
|
|
225
|
+
新增或锁定:
|
|
302
226
|
|
|
303
|
-
|
|
227
|
+
- `--profile <name>`
|
|
228
|
+
- `--model <name>`
|
|
229
|
+
- `--create-profile`
|
|
304
230
|
|
|
305
|
-
|
|
231
|
+
规则:
|
|
306
232
|
|
|
307
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
269
|
+
## Write Result Contract
|
|
336
270
|
|
|
337
|
-
|
|
271
|
+
下列写命令成功时,建议在 JSON `data` 中稳定返回结果字段:
|
|
338
272
|
|
|
339
|
-
-
|
|
340
|
-
-
|
|
341
|
-
-
|
|
273
|
+
- `add`
|
|
274
|
+
- `edit`
|
|
275
|
+
- `remove`
|
|
276
|
+
- `setup`
|
|
277
|
+
- `import --merge`
|
|
342
278
|
|
|
343
|
-
|
|
279
|
+
建议字段:
|
|
344
280
|
|
|
345
|
-
-
|
|
281
|
+
- `provider`
|
|
282
|
+
- `profile`
|
|
283
|
+
- `createdProfileSections`
|
|
284
|
+
- `deletedProfileSections`
|
|
285
|
+
- `keptSharedProfiles`
|
|
286
|
+
- `switchedActiveProfile`
|
|
287
|
+
- `adoptedProfiles`
|
|
288
|
+
- `repairedProfiles`
|
|
346
289
|
|
|
347
|
-
|
|
290
|
+
## 事务与回滚
|
|
348
291
|
|
|
349
|
-
|
|
292
|
+
所有可能同时修改 `providers.json` 和 `config.toml` 的命令,默认遵守:
|
|
350
293
|
|
|
351
|
-
-
|
|
352
|
-
-
|
|
353
|
-
-
|
|
294
|
+
- 单次锁
|
|
295
|
+
- 单次备份
|
|
296
|
+
- 单次失败整体回滚
|
|
354
297
|
|
|
355
|
-
|
|
298
|
+
不能接受的结果:
|
|
356
299
|
|
|
357
|
-
|
|
300
|
+
- `providers.json` 已更新但 `config.toml` 未同步
|
|
301
|
+
- `config.toml` 已更新但 `providers.json` 未同步
|
|
302
|
+
- active profile 指向已不存在的 section
|
|
358
303
|
|
|
359
|
-
|
|
360
|
-
- 引入按 `backupId` 回滚
|
|
361
|
-
- 为 `import --merge` 提供完整恢复语义
|
|
304
|
+
## 迁移与诊断
|
|
362
305
|
|
|
363
|
-
|
|
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
|
-
|
|
368
|
-
- 评估交互式依赖安装与 extension 管理
|
|
369
|
-
- 在不破坏主 CLI 契约的前提下扩展能力边界
|
|
313
|
+
迁移原则:
|
|
370
314
|
|
|
371
|
-
|
|
315
|
+
- 不要求用户先手工清空历史状态
|
|
316
|
+
- `setup`、`import --merge`、`doctor`、`status` 必须能识别这些状态
|
|
317
|
+
- 可安全 adopt 的 unmanaged profile,允许纳入受管
|
|
318
|
+
- 对悬空引用或缺失 section,默认不静默修复,必须告知用户下一步建议
|
|
372
319
|
|
|
373
|
-
|
|
320
|
+
`doctor` / `status` 至少需要覆盖:
|
|
374
321
|
|
|
375
|
-
-
|
|
376
|
-
-
|
|
377
|
-
-
|
|
378
|
-
-
|
|
379
|
-
-
|
|
322
|
+
- orphaned profile reference
|
|
323
|
+
- unmanaged active profile
|
|
324
|
+
- shared profile reference count
|
|
325
|
+
- orphaned profile section
|
|
326
|
+
- destructive remove blocked
|
|
380
327
|
|
|
381
|
-
##
|
|
328
|
+
## 验收标准
|
|
382
329
|
|
|
383
|
-
|
|
330
|
+
达到以下条件时,`0.0.5` 可以认为完成:
|
|
384
331
|
|
|
385
|
-
-
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
389
|
-
-
|
|
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.
|
|
343
|
+
`0.0.5` 是 `codex-switch` 从 provider registry 工具走向 config-aware CLI 的第一步。它的重点不是扩张命令面,而是建立稳定的 config 管理、一致性事务和可诊断能力,为后续 `0.0.5 -> 0.1.0` 演进打基础。
|
package/package.json
CHANGED
|
File without changes
|