@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.
- package/README.md +35 -97
- package/dist/app/add-provider.js +40 -3
- package/dist/app/edit-provider.js +76 -3
- package/dist/app/export-providers.js +2 -2
- package/dist/app/get-current-profile.js +1 -1
- package/dist/app/get-status.js +10 -3
- package/dist/app/import-providers.js +47 -3
- package/dist/app/list-backups.js +1 -1
- package/dist/app/list-config-profiles.js +30 -0
- package/dist/app/list-providers.js +1 -1
- package/dist/app/remove-provider.js +35 -3
- package/dist/app/rollback-backup.js +1 -1
- package/dist/app/rollback-latest.js +1 -1
- package/dist/app/run-doctor.js +44 -26
- package/dist/app/run-mutation.js +2 -2
- package/dist/app/setup-codex.js +37 -20
- package/dist/app/show-config.js +34 -0
- package/dist/app/show-provider.js +1 -1
- package/dist/app/switch-provider.js +8 -5
- package/dist/cli/add-interactive.js +7 -106
- package/dist/cli/args.js +5 -126
- package/dist/cli/help.js +5 -276
- package/dist/cli/interactive.js +16 -171
- package/dist/cli/output.js +23 -1
- package/dist/cli/prompt.js +3 -108
- package/dist/cli.js +10 -315
- package/dist/commands/args.js +132 -0
- package/dist/commands/dispatch.js +16 -0
- package/dist/commands/handlers.js +391 -0
- package/dist/commands/help.js +119 -0
- package/dist/commands/registry.js +291 -0
- package/dist/commands/types.js +2 -0
- package/dist/domain/config.js +548 -39
- package/dist/infra/backup-repo.js +8 -208
- package/dist/infra/codex-cli.js +8 -113
- package/dist/infra/codex-discovery.js +3 -41
- package/dist/infra/codex-paths.js +5 -69
- package/dist/infra/config-repo.js +161 -9
- package/dist/infra/fs-utils.js +7 -95
- package/dist/infra/lock-repo.js +3 -97
- package/dist/infra/providers-repo.js +7 -96
- package/dist/interaction/add-interactive.js +108 -0
- package/dist/interaction/interactive.js +216 -0
- package/dist/interaction/prompt.js +110 -0
- package/dist/runtime/codex-cli.js +130 -0
- package/dist/runtime/codex-probe.js +50 -0
- package/dist/runtime/types.js +2 -0
- package/dist/storage/backup-repo.js +210 -0
- package/dist/storage/codex-paths.js +71 -0
- package/dist/storage/config-repo.js +208 -0
- package/dist/storage/fs-utils.js +97 -0
- package/dist/storage/lock-repo.js +99 -0
- package/dist/storage/providers-repo.js +98 -0
- package/docs/Design/codex-switch-v0.0.5-design.md +932 -0
- package/docs/Design/codex-switch-v0.0.6-design.md +708 -0
- package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +340 -0
- package/docs/PRD/codex-switch-prd-v0.1.0.md +215 -291
- package/docs/PRD/codex-switch-prd.md +1 -1
- package/docs/cli-usage.md +2 -1
- package/docs/codex-switch-technical-architecture.md +73 -4
- package/docs/test-report-0.0.5.md +163 -0
- package/docs/testing.md +131 -0
- 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,131 @@
|
|
|
1
|
-
# codex-switch `0.
|
|
1
|
+
# codex-switch `0.0.6` 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.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
|
-
`
|
|
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
|
-
- `
|
|
23
|
-
- `
|
|
24
|
-
-
|
|
49
|
+
- `providers.json` 继续作为管理态单一事实源
|
|
50
|
+
- `config.toml` 具备结构化读取与受管 section 写入能力
|
|
51
|
+
- 写命令统一走锁、备份、失败回滚
|
|
52
|
+
- `--json` 继续使用统一 envelope
|
|
53
|
+
- CLI 帮助页已经具备稳定命令分组和文案基础
|
|
25
54
|
|
|
26
|
-
|
|
55
|
+
当前主要问题:
|
|
27
56
|
|
|
28
|
-
|
|
57
|
+
- `0.0.5` 需要继续收敛边界行为和失败语义,提升已有功能的稳定性
|
|
58
|
+
- `src/cli.ts` 已经承担过多命令分发、交互编排和参数补全逻辑
|
|
59
|
+
- 当前四层结构仍然成立,但 CLI 入口和应用编排层需要进一步细化职责
|
|
60
|
+
- 未来第三方 auth / 本地代理 / 外部依赖接入已具备现实需求,但当前扩展边界还不够明确
|
|
29
61
|
|
|
30
|
-
|
|
62
|
+
## `0.0.6` 目标
|
|
31
63
|
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
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
|
-
|
|
83
|
+
### Out of Scope
|
|
57
84
|
|
|
58
|
-
|
|
85
|
+
- 新增大型命令族
|
|
86
|
+
- 真实 Copilot auth 登录接入
|
|
87
|
+
- 本地代理服务启动、停止、守护和生命周期管理
|
|
88
|
+
- 第三方 SDK 安装器或依赖下载体验
|
|
89
|
+
- GUI / TUI / daemon 化
|
|
90
|
+
- 把 `config.toml` 升级为通用配置编辑器
|
|
59
91
|
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
269
|
-
- `createdAt`
|
|
270
|
-
- `reason`
|
|
271
|
-
- `files`
|
|
272
|
-
- `backupPath`
|
|
170
|
+
### `config.toml`
|
|
273
171
|
|
|
274
|
-
|
|
172
|
+
到 `0.0.6` 为止,`config.toml` 的定位继续保持:
|
|
275
173
|
|
|
276
|
-
-
|
|
277
|
-
-
|
|
174
|
+
- 顶层 active `profile`
|
|
175
|
+
- 与 provider 关联的 `[profiles.<name>]`
|
|
176
|
+
- 第一批受管字段:`model`、`model_provider`
|
|
177
|
+
- 非受管内容允许存在,但不进入通用编辑器范围
|
|
278
178
|
|
|
279
|
-
### `
|
|
179
|
+
### `auth.json`
|
|
280
180
|
|
|
281
|
-
|
|
181
|
+
`auth.json` 继续是认证态运行时文件:
|
|
282
182
|
|
|
283
|
-
-
|
|
183
|
+
- 可以被 `switch`、`rollback`、备份系统纳入事务边界
|
|
184
|
+
- 不是 provider registry 的事实源
|
|
185
|
+
- 不在 `0.0.6` 中扩展为第三方 auth 统一数据库
|
|
284
186
|
|
|
285
|
-
|
|
187
|
+
## 架构目标边界
|
|
286
188
|
|
|
287
|
-
|
|
288
|
-
- `rollback <backup-id>` 作为增强能力引入
|
|
289
|
-
- 指定备份不存在时必须返回专门错误码,而不是复用 generic rollback failure
|
|
189
|
+
### 现状问题
|
|
290
190
|
|
|
291
|
-
|
|
191
|
+
当前 `cli / app / domain / infra` 四层结构仍然是可用基线,但 `cli.ts` 已同时承担:
|
|
292
192
|
|
|
293
|
-
|
|
193
|
+
- 命令分发
|
|
194
|
+
- 参数归一化
|
|
195
|
+
- 交互分支判断
|
|
196
|
+
- 渐进式补问
|
|
197
|
+
- 输出路径拼装
|
|
294
198
|
|
|
295
|
-
|
|
199
|
+
这会让后续每增加一个命令或 integration,都继续把复杂度堆回 CLI 入口。
|
|
296
200
|
|
|
297
|
-
|
|
201
|
+
### `0.0.6` 架构调整目标
|
|
298
202
|
|
|
299
|
-
|
|
300
|
-
- 未冲突条目继续保留
|
|
301
|
-
- 最终结果仍作为一次受管写操作进入备份与回滚流程
|
|
203
|
+
`0.0.6` 不要求彻底推翻现有分层,但要求把职责边界进一步显式化,至少收敛为下面几类模块能力:
|
|
302
204
|
|
|
303
|
-
|
|
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
|
-
|
|
218
|
+
### 架构约束
|
|
306
219
|
|
|
307
|
-
|
|
220
|
+
`0.0.6` 需要明确以下约束:
|
|
308
221
|
|
|
309
|
-
|
|
222
|
+
- 不把第三方 SDK 调用直接塞进 CLI 入口
|
|
223
|
+
- 不把 prompt 逻辑继续散落到每个命令分支内部
|
|
224
|
+
- 不让 `app` 层直接依赖终端输出细节
|
|
225
|
+
- 不让运行时集成逻辑反向污染领域规则
|
|
226
|
+
- 不因未来接入 Copilot 或其他 provider,就改变本地事务与回滚的安全语义
|
|
310
227
|
|
|
311
|
-
|
|
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
|
-
|
|
250
|
+
- `providers.json` 已更新但 `config.toml` 未同步
|
|
251
|
+
- `config.toml` 已更新但 `providers.json` 未同步
|
|
252
|
+
- `auth.json` 或 active profile 因失败留在半切换状态
|
|
334
253
|
|
|
335
|
-
###
|
|
254
|
+
### 读取稳定性
|
|
336
255
|
|
|
337
|
-
|
|
256
|
+
读取命令在 `0.0.6` 至少需要满足:
|
|
338
257
|
|
|
339
|
-
-
|
|
340
|
-
-
|
|
341
|
-
-
|
|
258
|
+
- 不因历史 workspace 或边缘状态轻易崩溃
|
|
259
|
+
- `status` 与 `doctor` 的诊断信号保持一致语义
|
|
260
|
+
- `config-show` 与 `config-list-profiles` 输出结构稳定
|
|
261
|
+
- 对缺失文件、解析失败和不一致状态给出可预测错误或警告
|
|
342
262
|
|
|
343
|
-
|
|
263
|
+
## Future-Ready Integration 边界
|
|
344
264
|
|
|
345
|
-
|
|
265
|
+
### 为什么 `0.0.6` 要预留这条线
|
|
346
266
|
|
|
347
|
-
|
|
267
|
+
未来存在明确扩展需求:
|
|
348
268
|
|
|
349
|
-
|
|
269
|
+
- 通过第三方 auth 获取认证态
|
|
270
|
+
- 借助本地代理使特定上游可在 Codex 中使用
|
|
271
|
+
- 接入外部 SDK,例如 GitHub Copilot 相关能力
|
|
350
272
|
|
|
351
|
-
|
|
352
|
-
- 保持 `providers.json` 作为管理态事实源
|
|
353
|
-
- 不默认把 runtime 文件反向回写到 registry
|
|
273
|
+
如果继续沿用当前“命令直接长在 `cli.ts` 上”的方式,后续集成会快速把架构拖回高耦合状态。
|
|
354
274
|
|
|
355
|
-
###
|
|
275
|
+
### `0.0.6` 的预留目标
|
|
356
276
|
|
|
357
|
-
|
|
277
|
+
本版只要求建立边界,不要求交付真实功能:
|
|
358
278
|
|
|
359
|
-
-
|
|
360
|
-
-
|
|
361
|
-
-
|
|
279
|
+
- 允许未来把第三方 auth 封装为独立 integration 模块
|
|
280
|
+
- 允许未来把本地 proxy runtime 封装为独立运行时组件
|
|
281
|
+
- 允许未来把外部依赖探测、可用性检查、错误语义收敛到 runtime integration 层
|
|
282
|
+
- 不在本版锁定具体命令名、交互细节或 SDK 选型细节
|
|
362
283
|
|
|
363
|
-
###
|
|
284
|
+
### Copilot 作为代表性场景
|
|
364
285
|
|
|
365
|
-
|
|
286
|
+
GitHub Copilot 相关 auth / SDK / 本地代理能力,在 `0.0.6` 里的定位是:
|
|
366
287
|
|
|
367
|
-
-
|
|
368
|
-
-
|
|
369
|
-
-
|
|
288
|
+
- 作为未来架构设计的代表性输入
|
|
289
|
+
- 用于验证 `Runtime Integrations` 分层是否足够清晰
|
|
290
|
+
- 不作为 `0.0.6` 必须实现的命令需求
|
|
370
291
|
|
|
371
292
|
## 对实现的要求
|
|
372
293
|
|
|
373
|
-
|
|
294
|
+
从 `0.0.5` 到 `0.0.6` 的改造,默认遵守:
|
|
374
295
|
|
|
375
|
-
-
|
|
376
|
-
-
|
|
377
|
-
-
|
|
378
|
-
-
|
|
379
|
-
-
|
|
296
|
+
- 不破坏现有命令名
|
|
297
|
+
- 不破坏统一 JSON envelope
|
|
298
|
+
- 不破坏备份、回滚、锁模型
|
|
299
|
+
- 不引入只能靠交互完成的核心流程
|
|
300
|
+
- 不把未来第三方集成耦合进当前 provider/config 领域规则
|
|
301
|
+
- 允许内部文件和模块重组,但外部 CLI 契约保持稳定
|
|
380
302
|
|
|
381
|
-
##
|
|
303
|
+
## 验收标准
|
|
382
304
|
|
|
383
|
-
|
|
305
|
+
达到以下条件时,`0.0.6` 可以认为完成:
|
|
384
306
|
|
|
385
|
-
-
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
389
|
-
-
|
|
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.
|
|
317
|
+
`0.0.6` 是一个修复型版本,但它不是“只修 bug 不动结构”的保守补丁版。它的真正目标,是在不破坏当前 CLI 公共契约的前提下,把 `0.0.5` 已经长出来的命令面和事务能力稳住,并把代码结构调整到足以支撑下一阶段 integration-ready 演进的状态。
|
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`:可选的
|
|
266
|
+
- `--base-url`:可选的 provider 元数据,不会写回 `[profiles.*]`
|
|
266
267
|
- `--note`:备注
|
|
267
268
|
- `--tag`:标签,可重复传多次
|
|
268
269
|
|