@minniexcode/codex-switch 0.0.5 → 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 +10 -4
- package/dist/app/edit-provider.js +9 -9
- package/dist/app/export-providers.js +2 -2
- package/dist/app/get-current-profile.js +1 -1
- package/dist/app/get-status.js +2 -2
- package/dist/app/import-providers.js +15 -7
- package/dist/app/list-backups.js +1 -1
- package/dist/app/list-config-profiles.js +3 -2
- package/dist/app/list-providers.js +1 -1
- package/dist/app/remove-provider.js +2 -2
- package/dist/app/rollback-backup.js +1 -1
- package/dist/app/rollback-latest.js +1 -1
- package/dist/app/run-doctor.js +23 -6
- package/dist/app/run-mutation.js +2 -2
- package/dist/app/setup-codex.js +6 -6
- package/dist/app/show-config.js +2 -2
- package/dist/app/show-provider.js +1 -1
- package/dist/app/switch-provider.js +3 -3
- package/dist/cli/add-interactive.js +7 -106
- package/dist/cli/args.js +5 -137
- package/dist/cli/help.js +5 -313
- package/dist/cli/interactive.js +16 -227
- package/dist/cli/output.js +2 -2
- package/dist/cli/prompt.js +3 -108
- package/dist/cli.js +10 -404
- 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 +100 -23
- package/dist/infra/backup-repo.js +8 -208
- package/dist/infra/codex-cli.js +8 -128
- package/dist/infra/codex-paths.js +5 -69
- package/dist/infra/config-repo.js +59 -0
- 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 +32 -22
- 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 +125 -93
- package/docs/PRD/codex-switch-prd-v0.1.0.md +200 -226
- 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
|
@@ -1,80 +1,131 @@
|
|
|
1
|
-
# codex-switch `0.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.0.
|
|
10
|
-
- 文档定位:定义 `0.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
12
|
- 后续演进 PRD:[`codex-switch-prd-v0.0.5-to-v0.1.0.md`](./codex-switch-prd-v0.0.5-to-v0.1.0.md)
|
|
13
13
|
- 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
|
|
14
14
|
- 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
|
|
15
15
|
- 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
|
|
16
16
|
|
|
17
|
+
说明:
|
|
18
|
+
|
|
19
|
+
- 当前文件路径仍沿用历史命名 `codex-switch-prd-v0.1.0.md`
|
|
20
|
+
- 本文档内容语义以当前 active PRD 为准,本次版本更新不处理文件重命名
|
|
21
|
+
|
|
17
22
|
## 一句话定义
|
|
18
23
|
|
|
19
|
-
`0.0.
|
|
24
|
+
`0.0.6` 的目标不是继续扩张命令面,而是先修复 `0.0.5` 的功能稳定性问题,冻结当前 CLI 公共契约,并把实现从“单入口持续膨胀的命令调度器”收敛为适合继续扩展的模块化分层架构。
|
|
20
25
|
|
|
21
|
-
## 当前基线:`0.0.
|
|
26
|
+
## 当前基线:`0.0.5`
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
当前已具备的命令面:
|
|
24
29
|
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
30
|
+
- `config-show`
|
|
31
|
+
- `config-list-profiles`
|
|
32
|
+
- `list`
|
|
33
|
+
- `show`
|
|
34
|
+
- `current`
|
|
35
|
+
- `status`
|
|
29
36
|
- `setup`
|
|
37
|
+
- `edit`
|
|
38
|
+
- `add`
|
|
39
|
+
- `switch`
|
|
40
|
+
- `remove`
|
|
41
|
+
- `import`
|
|
42
|
+
- `export`
|
|
43
|
+
- `backups`
|
|
30
44
|
- `doctor`
|
|
31
|
-
- `
|
|
32
|
-
- `rollback` / `rollback <backup-id>`
|
|
45
|
+
- `rollback`
|
|
33
46
|
|
|
34
47
|
当前基线已具备的工程特征:
|
|
35
48
|
|
|
36
|
-
-
|
|
37
|
-
- `
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
49
|
+
- `providers.json` 继续作为管理态单一事实源
|
|
50
|
+
- `config.toml` 具备结构化读取与受管 section 写入能力
|
|
51
|
+
- 写命令统一走锁、备份、失败回滚
|
|
52
|
+
- `--json` 继续使用统一 envelope
|
|
53
|
+
- CLI 帮助页已经具备稳定命令分组和文案基础
|
|
41
54
|
|
|
42
|
-
|
|
55
|
+
当前主要问题:
|
|
43
56
|
|
|
44
|
-
- `
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
57
|
+
- `0.0.5` 需要继续收敛边界行为和失败语义,提升已有功能的稳定性
|
|
58
|
+
- `src/cli.ts` 已经承担过多命令分发、交互编排和参数补全逻辑
|
|
59
|
+
- 当前四层结构仍然成立,但 CLI 入口和应用编排层需要进一步细化职责
|
|
60
|
+
- 未来第三方 auth / 本地代理 / 外部依赖接入已具备现实需求,但当前扩展边界还不够明确
|
|
48
61
|
|
|
49
|
-
## `0.0.
|
|
62
|
+
## `0.0.6` 目标
|
|
50
63
|
|
|
51
|
-
`0.0.
|
|
64
|
+
`0.0.6` 需要完成三件事:
|
|
52
65
|
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- 补齐历史状态、一致性信号和安全删除规则
|
|
66
|
+
- 修复 `0.0.5` 命令行为中的稳定性问题,巩固已有能力
|
|
67
|
+
- 重整 CLI 与应用层分层,解决 `cli.ts` 持续膨胀问题
|
|
68
|
+
- 为未来第三方 auth / 本地 proxy / 外部 SDK 集成建立清晰边界,但本版不交付这些集成功能
|
|
57
69
|
|
|
58
70
|
## 范围
|
|
59
71
|
|
|
60
72
|
### In Scope
|
|
61
73
|
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
- `
|
|
66
|
-
- `config list-profiles`
|
|
67
|
-
-
|
|
68
|
-
-
|
|
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 预留明确架构边界
|
|
69
82
|
|
|
70
83
|
### Out of Scope
|
|
71
84
|
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- 第三方
|
|
85
|
+
- 新增大型命令族
|
|
86
|
+
- 真实 Copilot auth 登录接入
|
|
87
|
+
- 本地代理服务启动、停止、守护和生命周期管理
|
|
88
|
+
- 第三方 SDK 安装器或依赖下载体验
|
|
89
|
+
- GUI / TUI / daemon 化
|
|
90
|
+
- 把 `config.toml` 升级为通用配置编辑器
|
|
91
|
+
|
|
92
|
+
## 稳定公共契约
|
|
93
|
+
|
|
94
|
+
### CLI 命令面
|
|
76
95
|
|
|
77
|
-
|
|
96
|
+
`0.0.6` 默认锁定当前 help 所表达的命令面与分组,不以“新增命令数量”作为版本目标。
|
|
97
|
+
|
|
98
|
+
Usage 级别的公共入口保持:
|
|
99
|
+
|
|
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`
|
|
78
129
|
|
|
79
130
|
### JSON Envelope
|
|
80
131
|
|
|
@@ -95,6 +146,18 @@
|
|
|
95
146
|
- 顶层 shape 不变
|
|
96
147
|
- 新字段只追加到 `data` / `warnings`
|
|
97
148
|
- 错误信息继续进入 `error`
|
|
149
|
+
- 架构重构不得破坏已有自动化消费方式
|
|
150
|
+
|
|
151
|
+
### 交互规则
|
|
152
|
+
|
|
153
|
+
交互能力继续只是 TTY 中的人类增强层,不改变自动化契约:
|
|
154
|
+
|
|
155
|
+
- `--json` 一律禁用交互
|
|
156
|
+
- 非 TTY 一律不进入交互
|
|
157
|
+
- 危险写命令继续要求显式确认或显式参数
|
|
158
|
+
- 用户取消 prompt 时不得产生文件写入
|
|
159
|
+
|
|
160
|
+
## 数据与状态边界
|
|
98
161
|
|
|
99
162
|
### `providers.json`
|
|
100
163
|
|
|
@@ -106,238 +169,149 @@
|
|
|
106
169
|
|
|
107
170
|
### `config.toml`
|
|
108
171
|
|
|
109
|
-
到 `0.0.
|
|
172
|
+
到 `0.0.6` 为止,`config.toml` 的定位继续保持:
|
|
110
173
|
|
|
111
174
|
- 顶层 active `profile`
|
|
112
175
|
- 与 provider 关联的 `[profiles.<name>]`
|
|
113
|
-
-
|
|
114
|
-
|
|
115
|
-
约束:
|
|
116
|
-
|
|
117
|
-
- `providers.json` 仍是 provider 身份、凭据和管理元数据的 SSOT
|
|
118
|
-
- `config.toml` 只承载运行态投影,不升级为对等事实源
|
|
119
|
-
- 非受管 TOML 内容允许存在,但不进入通用编辑范围
|
|
120
|
-
|
|
121
|
-
### Managed Profile View
|
|
122
|
-
|
|
123
|
-
读取命令应围绕稳定视图返回,而不是直接暴露内部持久化细节。最小视图建议包含:
|
|
124
|
-
|
|
125
|
-
```json
|
|
126
|
-
{
|
|
127
|
-
"name": "packycode",
|
|
128
|
-
"model": "gpt-5",
|
|
129
|
-
"linkedProviders": ["packycode"],
|
|
130
|
-
"isActive": true,
|
|
131
|
-
"managed": true
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Config Management 规则
|
|
136
|
-
|
|
137
|
-
### 受管与非受管
|
|
138
|
-
|
|
139
|
-
- managed profile:被至少一个 provider 引用,允许被写命令同步维护
|
|
140
|
-
- unmanaged profile:存在于 `config.toml`,但当前没有任何 provider 引用,默认只读展示
|
|
141
|
-
- orphaned managed reference:`providers.json` 引用了 profile,但 `config.toml` 缺失对应 section,属于不一致状态
|
|
142
|
-
|
|
143
|
-
### 共享 profile
|
|
176
|
+
- 第一批受管字段:`model`、`model_provider`
|
|
177
|
+
- 非受管内容允许存在,但不进入通用编辑器范围
|
|
144
178
|
|
|
145
|
-
|
|
179
|
+
### `auth.json`
|
|
146
180
|
|
|
147
|
-
|
|
148
|
-
- 只有当没有任何 provider 引用时,才允许删除对应 section
|
|
149
|
-
- `remove` / `edit` 不能因单个 provider 操作误删共享 profile
|
|
181
|
+
`auth.json` 继续是认证态运行时文件:
|
|
150
182
|
|
|
151
|
-
|
|
183
|
+
- 可以被 `switch`、`rollback`、备份系统纳入事务边界
|
|
184
|
+
- 不是 provider registry 的事实源
|
|
185
|
+
- 不在 `0.0.6` 中扩展为第三方 auth 统一数据库
|
|
152
186
|
|
|
153
|
-
|
|
154
|
-
- 对受管 section 的读取、创建、删除、字段更新必须可验证
|
|
155
|
-
- 修改受管部分时,不应破坏非受管内容、顺序、空行和注释
|
|
187
|
+
## 架构目标边界
|
|
156
188
|
|
|
157
|
-
|
|
189
|
+
### 现状问题
|
|
158
190
|
|
|
159
|
-
|
|
191
|
+
当前 `cli / app / domain / infra` 四层结构仍然是可用基线,但 `cli.ts` 已同时承担:
|
|
160
192
|
|
|
161
|
-
|
|
193
|
+
- 命令分发
|
|
194
|
+
- 参数归一化
|
|
195
|
+
- 交互分支判断
|
|
196
|
+
- 渐进式补问
|
|
197
|
+
- 输出路径拼装
|
|
162
198
|
|
|
163
|
-
|
|
164
|
-
- 同时服务人类和 AI / 自动化读取
|
|
199
|
+
这会让后续每增加一个命令或 integration,都继续把复杂度堆回 CLI 入口。
|
|
165
200
|
|
|
166
|
-
|
|
201
|
+
### `0.0.6` 架构调整目标
|
|
167
202
|
|
|
168
|
-
|
|
169
|
-
codexs config show [profile] [--json] [--codex-dir <path>]
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
最小返回要求:
|
|
173
|
-
|
|
174
|
-
- `activeProfile`
|
|
175
|
-
- `profiles`
|
|
176
|
-
- `includedProfiles`
|
|
177
|
-
|
|
178
|
-
`profiles[]` 中每项至少包含:
|
|
179
|
-
|
|
180
|
-
- `name`
|
|
181
|
-
- `managed`
|
|
182
|
-
- `isActive`
|
|
183
|
-
- `linkedProviders`
|
|
184
|
-
- `managedFields`
|
|
185
|
-
- `source`
|
|
186
|
-
|
|
187
|
-
### `codexs config list-profiles`
|
|
188
|
-
|
|
189
|
-
用途:
|
|
190
|
-
|
|
191
|
-
- 列出当前 `config.toml` 中的 profile 视图
|
|
192
|
-
- 明确显示 profile 与 provider 的关联关系
|
|
193
|
-
|
|
194
|
-
输入:
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
codexs config list-profiles [--json] [--codex-dir <path>]
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
`data.profiles[]` 至少包含:
|
|
201
|
-
|
|
202
|
-
- `name`
|
|
203
|
-
- `managed`
|
|
204
|
-
- `isActive`
|
|
205
|
-
- `linkedProviders`
|
|
206
|
-
- `model`
|
|
207
|
-
|
|
208
|
-
## 现有写命令升级
|
|
209
|
-
|
|
210
|
-
### `codexs add <provider>`
|
|
211
|
-
|
|
212
|
-
新增或锁定:
|
|
213
|
-
|
|
214
|
-
- `--model <name>`
|
|
215
|
-
- `--create-profile`
|
|
216
|
-
|
|
217
|
-
规则:
|
|
218
|
-
|
|
219
|
-
- 当目标 profile 已存在时,允许直接建立映射
|
|
220
|
-
- 当目标 profile 不存在时,只有显式传入 `--create-profile --model <name>` 才允许创建 section
|
|
221
|
-
- 缺少最小受管字段时,返回 `MANAGED_PROFILE_FIELDS_MISSING`
|
|
203
|
+
`0.0.6` 不要求彻底推翻现有分层,但要求把职责边界进一步显式化,至少收敛为下面几类模块能力:
|
|
222
204
|
|
|
223
|
-
|
|
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 封装
|
|
224
217
|
|
|
225
|
-
|
|
218
|
+
### 架构约束
|
|
226
219
|
|
|
227
|
-
|
|
228
|
-
- `--model <name>`
|
|
229
|
-
- `--create-profile`
|
|
220
|
+
`0.0.6` 需要明确以下约束:
|
|
230
221
|
|
|
231
|
-
|
|
222
|
+
- 不把第三方 SDK 调用直接塞进 CLI 入口
|
|
223
|
+
- 不把 prompt 逻辑继续散落到每个命令分支内部
|
|
224
|
+
- 不让 `app` 层直接依赖终端输出细节
|
|
225
|
+
- 不让运行时集成逻辑反向污染领域规则
|
|
226
|
+
- 不因未来接入 Copilot 或其他 provider,就改变本地事务与回滚的安全语义
|
|
232
227
|
|
|
233
|
-
|
|
234
|
-
- `edit --profile <missing> --create-profile` 但未传 `--model` 时失败
|
|
235
|
-
- 旧 profile 若仍被其他 provider 引用,则保留
|
|
236
|
-
- 旧 profile 若已无引用且不是 active profile,则可以删除
|
|
237
|
-
- 不隐式 rename 或 copy 旧 section 到新 profile
|
|
228
|
+
## `0.0.6` 稳定性要求
|
|
238
229
|
|
|
239
|
-
###
|
|
230
|
+
### 命令行为一致性
|
|
240
231
|
|
|
241
|
-
|
|
232
|
+
现有命令在 `0.0.6` 需要重点收敛:
|
|
242
233
|
|
|
243
|
-
-
|
|
234
|
+
- help 文案与真实命令行为一致
|
|
235
|
+
- 默认文本输出与 `--json` 输出语义一致
|
|
236
|
+
- TTY 与非交互模式下的失败路径可预测
|
|
237
|
+
- 危险命令的确认规则一致
|
|
238
|
+
- 同一类错误优先映射到同一类错误码
|
|
244
239
|
|
|
245
|
-
|
|
240
|
+
### 写命令安全语义
|
|
246
241
|
|
|
247
|
-
|
|
248
|
-
- 若 profile 已无任何引用,则允许删除 section
|
|
249
|
-
- 若该 profile 仍是当前 active 且最后一个引用,必须先 `switch` 或显式传 `--switch-to`
|
|
250
|
-
- 不允许把 active profile 留成悬空状态
|
|
242
|
+
所有会修改 `providers.json`、`config.toml`、`auth.json` 的命令继续默认遵守:
|
|
251
243
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
-
|
|
255
|
-
- 不负责修复 profile section 内容
|
|
256
|
-
- 执行前提仍是目标 profile section 必须存在且可识别
|
|
257
|
-
|
|
258
|
-
## `setup` 升级
|
|
244
|
+
- 单次锁
|
|
245
|
+
- 单次备份
|
|
246
|
+
- 单次失败整体回滚
|
|
259
247
|
|
|
260
|
-
|
|
248
|
+
不能接受的结果:
|
|
261
249
|
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
- 未发现任何候选目录时,TTY 可手动输入;非交互返回 `CODEX_DIR_NOT_FOUND`
|
|
266
|
-
- 对从现有 `config.toml` 发现的 profile,允许 adopt 为受管 profile
|
|
267
|
-
- 不制造新的 registry-config 不一致
|
|
250
|
+
- `providers.json` 已更新但 `config.toml` 未同步
|
|
251
|
+
- `config.toml` 已更新但 `providers.json` 未同步
|
|
252
|
+
- `auth.json` 或 active profile 因失败留在半切换状态
|
|
268
253
|
|
|
269
|
-
|
|
254
|
+
### 读取稳定性
|
|
270
255
|
|
|
271
|
-
|
|
256
|
+
读取命令在 `0.0.6` 至少需要满足:
|
|
272
257
|
|
|
273
|
-
-
|
|
274
|
-
- `
|
|
275
|
-
- `
|
|
276
|
-
-
|
|
277
|
-
- `import --merge`
|
|
258
|
+
- 不因历史 workspace 或边缘状态轻易崩溃
|
|
259
|
+
- `status` 与 `doctor` 的诊断信号保持一致语义
|
|
260
|
+
- `config-show` 与 `config-list-profiles` 输出结构稳定
|
|
261
|
+
- 对缺失文件、解析失败和不一致状态给出可预测错误或警告
|
|
278
262
|
|
|
279
|
-
|
|
263
|
+
## Future-Ready Integration 边界
|
|
280
264
|
|
|
281
|
-
|
|
282
|
-
- `profile`
|
|
283
|
-
- `createdProfileSections`
|
|
284
|
-
- `deletedProfileSections`
|
|
285
|
-
- `keptSharedProfiles`
|
|
286
|
-
- `switchedActiveProfile`
|
|
287
|
-
- `adoptedProfiles`
|
|
288
|
-
- `repairedProfiles`
|
|
265
|
+
### 为什么 `0.0.6` 要预留这条线
|
|
289
266
|
|
|
290
|
-
|
|
267
|
+
未来存在明确扩展需求:
|
|
291
268
|
|
|
292
|
-
|
|
269
|
+
- 通过第三方 auth 获取认证态
|
|
270
|
+
- 借助本地代理使特定上游可在 Codex 中使用
|
|
271
|
+
- 接入外部 SDK,例如 GitHub Copilot 相关能力
|
|
293
272
|
|
|
294
|
-
|
|
295
|
-
- 单次备份
|
|
296
|
-
- 单次失败整体回滚
|
|
273
|
+
如果继续沿用当前“命令直接长在 `cli.ts` 上”的方式,后续集成会快速把架构拖回高耦合状态。
|
|
297
274
|
|
|
298
|
-
|
|
275
|
+
### `0.0.6` 的预留目标
|
|
299
276
|
|
|
300
|
-
|
|
301
|
-
- `config.toml` 已更新但 `providers.json` 未同步
|
|
302
|
-
- active profile 指向已不存在的 section
|
|
277
|
+
本版只要求建立边界,不要求交付真实功能:
|
|
303
278
|
|
|
304
|
-
|
|
279
|
+
- 允许未来把第三方 auth 封装为独立 integration 模块
|
|
280
|
+
- 允许未来把本地 proxy runtime 封装为独立运行时组件
|
|
281
|
+
- 允许未来把外部依赖探测、可用性检查、错误语义收敛到 runtime integration 层
|
|
282
|
+
- 不在本版锁定具体命令名、交互细节或 SDK 选型细节
|
|
305
283
|
|
|
306
|
-
|
|
284
|
+
### Copilot 作为代表性场景
|
|
307
285
|
|
|
308
|
-
|
|
309
|
-
- `providers.json` 引用了 profile,但对应 section 不存在
|
|
310
|
-
- `config.toml` 存在历史 profile,但没有任何 provider 引用
|
|
311
|
-
- 当前 active profile 指向 unmanaged profile
|
|
286
|
+
GitHub Copilot 相关 auth / SDK / 本地代理能力,在 `0.0.6` 里的定位是:
|
|
312
287
|
|
|
313
|
-
|
|
288
|
+
- 作为未来架构设计的代表性输入
|
|
289
|
+
- 用于验证 `Runtime Integrations` 分层是否足够清晰
|
|
290
|
+
- 不作为 `0.0.6` 必须实现的命令需求
|
|
314
291
|
|
|
315
|
-
|
|
316
|
-
- `setup`、`import --merge`、`doctor`、`status` 必须能识别这些状态
|
|
317
|
-
- 可安全 adopt 的 unmanaged profile,允许纳入受管
|
|
318
|
-
- 对悬空引用或缺失 section,默认不静默修复,必须告知用户下一步建议
|
|
292
|
+
## 对实现的要求
|
|
319
293
|
|
|
320
|
-
`
|
|
294
|
+
从 `0.0.5` 到 `0.0.6` 的改造,默认遵守:
|
|
321
295
|
|
|
322
|
-
-
|
|
323
|
-
-
|
|
324
|
-
-
|
|
325
|
-
-
|
|
326
|
-
-
|
|
296
|
+
- 不破坏现有命令名
|
|
297
|
+
- 不破坏统一 JSON envelope
|
|
298
|
+
- 不破坏备份、回滚、锁模型
|
|
299
|
+
- 不引入只能靠交互完成的核心流程
|
|
300
|
+
- 不把未来第三方集成耦合进当前 provider/config 领域规则
|
|
301
|
+
- 允许内部文件和模块重组,但外部 CLI 契约保持稳定
|
|
327
302
|
|
|
328
303
|
## 验收标准
|
|
329
304
|
|
|
330
|
-
达到以下条件时,`0.0.
|
|
305
|
+
达到以下条件时,`0.0.6` 可以认为完成:
|
|
331
306
|
|
|
332
|
-
-
|
|
333
|
-
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
-
|
|
337
|
-
-
|
|
338
|
-
-
|
|
339
|
-
- 双写失败时 `providers.json` 与 `config.toml` 能整体回滚
|
|
307
|
+
- 当前 help 文案与命令行为、参数、危险提示基本一致
|
|
308
|
+
- 现有命令在 TTY / 非交互 / `--json` 模式下行为稳定
|
|
309
|
+
- 读取命令对历史状态和异常状态的处理更稳,不产生明显回归
|
|
310
|
+
- 写命令继续满足锁、备份、失败回滚语义
|
|
311
|
+
- `cli.ts` 不再承担持续膨胀的主调度与交互编排复杂度
|
|
312
|
+
- 应用编排、交互层、运行时集成边界比 `0.0.5` 更清晰
|
|
313
|
+
- 为未来第三方 auth / 本地 proxy / SDK 接入预留了清楚但非侵入式的扩展边界
|
|
340
314
|
|
|
341
315
|
## 结论
|
|
342
316
|
|
|
343
|
-
`0.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
|
|
|
@@ -130,6 +130,13 @@ Infrastructure 层
|
|
|
130
130
|
|
|
131
131
|
这意味着未来即使引入 GUI / MCP / HTTP 适配层,核心同步目标仍然是 runtime files,而不是把 runtime files 本身当成长期管理数据库。
|
|
132
132
|
|
|
133
|
+
`0.0.6` 的实现边界还需要区分“逻辑主层”和“兼容层”:
|
|
134
|
+
|
|
135
|
+
- 逻辑主层已经迁移到 `src/commands/`、`src/interaction/`、`src/storage/`、`src/runtime/`
|
|
136
|
+
- `src/cli/` 和 `src/infra/` 当前主要承担兼容 re-export 与入口收敛职责
|
|
137
|
+
- 这意味着 `0.0.6` 的完成标准是“边界和契约已经统一”,而不是“所有旧路径文件都物理删除”
|
|
138
|
+
- 后续版本可以在兼容窗口结束后继续删除旧 facade,但这不属于 `0.0.6` 的必须交付范围
|
|
139
|
+
|
|
133
140
|
### 3.3 模块依赖图
|
|
134
141
|
|
|
135
142
|
当前代码依赖关系可以抽象为:
|
|
@@ -194,10 +201,14 @@ argv
|
|
|
194
201
|
```text
|
|
195
202
|
src/
|
|
196
203
|
cli.ts
|
|
204
|
+
commands/
|
|
205
|
+
interaction/
|
|
197
206
|
app/
|
|
198
207
|
cli/
|
|
199
208
|
domain/
|
|
209
|
+
runtime/
|
|
200
210
|
infra/
|
|
211
|
+
storage/
|
|
201
212
|
|
|
202
213
|
tests/
|
|
203
214
|
app.spec.js
|
|
@@ -220,7 +231,65 @@ scripts/
|
|
|
220
231
|
|
|
221
232
|
它不直接做文件读写,不直接写业务逻辑,也不直接实现备份或校验规则。
|
|
222
233
|
|
|
223
|
-
### 4.2 `src/
|
|
234
|
+
### 4.2 `src/commands/`
|
|
235
|
+
|
|
236
|
+
这一层是 `0.0.6` 新增的命令表面层,负责把“公开 CLI 形态”收敛为单一 registry。
|
|
237
|
+
|
|
238
|
+
它承担的职责是:
|
|
239
|
+
|
|
240
|
+
- 定义每个命令的公开 token 形态,例如 `config show`、`config list-profiles`、`backups list`
|
|
241
|
+
- 统一保存 `summary`、`usage`、`details`、`examples`
|
|
242
|
+
- 绑定 command handler,供 dispatch 直接执行
|
|
243
|
+
- 让 help、解析和 dispatch 共享同一份事实源
|
|
244
|
+
|
|
245
|
+
它不负责:
|
|
246
|
+
|
|
247
|
+
- 具体文件读写
|
|
248
|
+
- prompt 交互细节
|
|
249
|
+
- human output 渲染
|
|
250
|
+
|
|
251
|
+
### 4.3 `src/interaction/`
|
|
252
|
+
|
|
253
|
+
这一层是 `0.0.6` 中显式抽出的交互层,负责所有 CLI 级 prompt 组合逻辑。
|
|
254
|
+
|
|
255
|
+
它承担的职责是:
|
|
256
|
+
|
|
257
|
+
- 判断哪些路径允许交互
|
|
258
|
+
- 组合 provider 选择、确认、rollback 预览等交互动作
|
|
259
|
+
- 组织 add/edit/setup 中的渐进式输入收集
|
|
260
|
+
|
|
261
|
+
它不负责:
|
|
262
|
+
|
|
263
|
+
- 业务状态变更
|
|
264
|
+
- 文件系统写入
|
|
265
|
+
- 运行时探测
|
|
266
|
+
|
|
267
|
+
`setup` 是这一层边界最强的命令之一。在 `0.0.6` 中,它的 adopt profile 选择和 provider 详情输入仍然是交互式 contract,因此非交互路径会显式失败,而不是隐式进入空输入分支。
|
|
268
|
+
|
|
269
|
+
### 4.4 `src/storage/`
|
|
270
|
+
|
|
271
|
+
这一层是 `0.0.6` 的文件和状态访问层,负责把以前分散在 `infra/` 的能力收口成稳定存储边界。
|
|
272
|
+
|
|
273
|
+
它承担的职责是:
|
|
274
|
+
|
|
275
|
+
- `config.toml` / `providers.json` / backup manifest / lock file 的读写
|
|
276
|
+
- Codex home 目录路径展开
|
|
277
|
+
- 原子写入、备份、回滚、锁定
|
|
278
|
+
|
|
279
|
+
`src/infra/` 在当前版本主要保留兼容 re-export,以便逐步迁移,不再作为新的业务入口继续扩张。
|
|
280
|
+
|
|
281
|
+
### 4.5 `src/runtime/`
|
|
282
|
+
|
|
283
|
+
这一层是 `0.0.6` 新增的运行时边界,负责本地 Codex CLI 的外部依赖探测和登录调用。
|
|
284
|
+
|
|
285
|
+
它承担的职责是:
|
|
286
|
+
|
|
287
|
+
- Codex 可用性检查
|
|
288
|
+
- Codex 版本检查
|
|
289
|
+
- Codex login 调用
|
|
290
|
+
- 未来可扩展为第三方 runtime adapter 的能力边界
|
|
291
|
+
|
|
292
|
+
### 4.6 `src/cli/`
|
|
224
293
|
|
|
225
294
|
#### `src/cli/args.ts`
|
|
226
295
|
|
|
@@ -272,7 +341,7 @@ scripts/
|
|
|
272
341
|
|
|
273
342
|
这两个纯渲染入口的作用是让 CLI 层本身也能被测试,而不依赖真实子进程。
|
|
274
343
|
|
|
275
|
-
### 4.
|
|
344
|
+
### 4.7 `src/app/`
|
|
276
345
|
|
|
277
346
|
这一层是应用服务 / 用例编排层。每个文件基本对应一个命令或一个用例:
|
|
278
347
|
|
|
@@ -301,7 +370,7 @@ scripts/
|
|
|
301
370
|
- `stdout` / `stderr` 怎么写
|
|
302
371
|
- argv 怎么解析
|
|
303
372
|
|
|
304
|
-
### 4.
|
|
373
|
+
### 4.8 `src/domain/`
|
|
305
374
|
|
|
306
375
|
#### `errors.ts`
|
|
307
376
|
|
|
@@ -463,7 +532,7 @@ scripts/
|
|
|
463
532
|
- 用于 `codex login --with-api-key`
|
|
464
533
|
- `baseUrl`
|
|
465
534
|
- 选填
|
|
466
|
-
-
|
|
535
|
+
- 当前版本只存储在 `providers.json`;`config show` 中展示的 runtime `baseUrl` 由 `model_provider -> model_providers.*.base_url` 解析
|
|
467
536
|
- `note`
|
|
468
537
|
- 选填
|
|
469
538
|
- 面向人类和 AI 的说明字段
|