@minniexcode/codex-switch 0.0.12 → 0.1.0

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.
@@ -0,0 +1,152 @@
1
+ # codex-switch `0.1.0` Design
2
+
3
+ ## 文档信息
4
+
5
+ - 文档类型:实现约束设计文档
6
+ - 适用版本:`0.1.0`
7
+ - 当前定位:release-hardening only
8
+ - 关联 PRD:[`../PRD/codex-switch-prd-v0.1.0.md`](../PRD/codex-switch-prd-v0.1.0.md)
9
+ - 关联 beta 设计:[`./codex-switch-v0.0.12-design.md`](./codex-switch-v0.0.12-design.md)
10
+
11
+ ## 1. 设计原则
12
+
13
+ `0.1.0` 的实现只做 release-hardening,不新增命令面,不改 JSON envelope,不引入兼容层,也不把历史草案继续扩成平台设想。
14
+
15
+ 这个版本的实现目标是收口,不是扩张:
16
+
17
+ - 把用户看见的主路径讲清楚。
18
+ - 把 `list`、`status`、`doctor` 的可读语义讲清楚。
19
+ - 把 `migrate` 和 `setup` 的产品定位讲清楚。
20
+ - 把文档、help、输出、测试和包内容收口成同一套事实。
21
+
22
+ ## 2. 当前阻塞项
23
+
24
+ 实现收口前必须先正视以下阻塞项:
25
+
26
+ 1. `tests/` 仍被忽略,导致回归测试无法稳定版本化。
27
+ 2. README 仍引用不存在的 `docs/Tests/testing.md`,说明文档入口还未收口。
28
+ 3. 版本叙事仍以 `0.0.12` 为中心,`0.1.0` 还没有被写成稳定发布线。
29
+ 4. 主工作流、`migrate` 定位、`setup` 定位和真实实现状态还没有完全对齐。
30
+
31
+ 只要这些阻塞项还存在,就不应把当前实现视为 `0.1.0` ready。
32
+
33
+ ## 3. 收口矩阵
34
+
35
+ 以下子系统必须完成对应收口。
36
+
37
+ | 子系统 | 必须稳定的内容 | 约束 |
38
+ | --- | --- | --- |
39
+ | 文档 | PRD、design、README、CLI usage、product overview、changelog、testing guide | 所有面向用户的文档必须与 `0.1.0` 事实一致 |
40
+ | 帮助 | 顶层 help、命令 help、示例顺序 | direct/Copilot 主路径优先,`migrate` 降级,`setup` 仅保留 deprecated 语义 |
41
+ | 输出 | `init`、`list`、`status`、`doctor`、`login` 的 human-readable 文案 | 只收口语义,不改 JSON envelope |
42
+ | 读路径 | tool home / runtime separation、dual-path model、ambiguous active profile 处理 | 不新增兼容层,不伪造 current 状态 |
43
+ | 测试 | release gate、回归测试、fixture 检查 | 回归测试必须落仓库,不能继续停留在忽略状态 |
44
+
45
+ ## 4. 必须稳定的用户可见语义
46
+
47
+ ### 4.1 `list`
48
+
49
+ `list` 必须能让用户直接看出:
50
+
51
+ - provider 属于 `direct` 还是 `copilot`
52
+ - 哪个 provider 是 current
53
+ - 当前 active profile 是否可唯一解析
54
+
55
+ 如果当前 active profile 对应多个 provider,就必须显式表现为 ambiguous,而不是把任何一个 provider 假装成 current。
56
+
57
+ `list --json` 仍然使用既有 envelope,只允许追加字段,不允许改顶层契约。
58
+
59
+ ### 4.2 `status`
60
+
61
+ `status` 必须把以下内容讲清楚:
62
+
63
+ - tool home 是什么
64
+ - target runtime 是什么
65
+ - 当前 active provider 是什么
66
+ - 当前路径是 direct 还是 Copilot
67
+ - 下一步应该做什么
68
+
69
+ `status` 是摘要,不是字段堆叠。输出顺序必须围绕“当前状态 -> 影响 -> 下一步”组织。
70
+
71
+ ### 4.3 `doctor`
72
+
73
+ `doctor` 必须先给整体健康结论,再列 issue,再给修复建议。
74
+
75
+ 每条 issue 至少要表达:
76
+
77
+ - 问题是什么
78
+ - 为什么重要
79
+ - 下一步怎么修
80
+
81
+ `doctor` 的目标不是罗列内部数据结构,而是把用户推到下一步修复动作。
82
+
83
+ ### 4.4 provider picker
84
+
85
+ list 和 provider picker 必须一致处理 ambiguous active profile。
86
+
87
+ 选择器提示至少要包含:
88
+
89
+ - `profile`
90
+ - `providerType`
91
+ - `current` 标记,仅在唯一解析时出现
92
+
93
+ ### 4.5 命令定位
94
+
95
+ `0.1.0` 还必须稳定以下产品定位:
96
+
97
+ - 稳定命令面以 `init`、`login`、`list`、`show`、`current`、`status`、`doctor`、`config`、`add`、`edit`、`switch`、`remove`、`import`、`export`、`bridge`、`backups`、`rollback` 为准。
98
+ - `migrate` 只能被表述为高级 adopt helper。
99
+ - `setup` 只能被表述为 deprecated entry。
100
+ - `--json` 顶层 envelope 继续固定为 `ok / command / data / warnings / error`。
101
+
102
+ ## 5. 文档同步要求
103
+
104
+ 以下面向用户的文档必须与 `0.1.0` 事实一致:
105
+
106
+ - `README.md`
107
+ - `README.CN.md`
108
+ - `README.AI.md`
109
+ - `docs/cli-usage.md`
110
+ - `docs/codex-switch-product-overview.md`
111
+ - `docs/PRD/codex-switch-prd-v0.1.0.md`
112
+ - `docs/Design/codex-switch-v0.1.0-design.md`
113
+ - `CHANGELOG.md`
114
+ - `docs/Tests/testing.md`
115
+
116
+ 历史大文档不需要在本版全文重写,但必须明确它们只是历史参考,不是当前 release contract。
117
+
118
+ ## 6. 最小测试计划
119
+
120
+ `0.1.0` 的最小测试计划必须包含以下内容:
121
+
122
+ 1. `npm run build`
123
+ 2. `npm test`
124
+ 3. `npx tsc --noEmit`
125
+ 4. `npm pack --dry-run`
126
+ 5. built CLI `--help`
127
+ 6. built CLI `--version`
128
+ 7. fresh direct provider flow
129
+ 8. fresh Copilot provider flow
130
+ 9. `list/status/doctor` 输出语义检查
131
+ 10. `migrate` 高级 adopt helper 检查
132
+ 11. `setup` deprecated entry 检查
133
+
134
+ 测试结论必须落在仓库中的正式测试内容里,不能继续依赖忽略目录或口头约定。
135
+
136
+ ## 7. 明确不做
137
+
138
+ 本版不做以下事情:
139
+
140
+ - 新 upstream
141
+ - GUI / TUI
142
+ - daemon
143
+ - plugin system
144
+ - auto migration
145
+ - 兼容层
146
+ - dual-read / dual-write
147
+ - 重新设计公开 JSON envelope
148
+ - 重新扩张命令面
149
+
150
+ ## 8. 结论
151
+
152
+ `0.1.0` 设计的核心不是“再造一个版本叙事”,而是把已存在的实现收口成稳定合同。实现只要偏离这条线,就不应被视为 `0.1.0` 的合理内容。
@@ -1,205 +1,217 @@
1
- # codex-switch `0.1.0` Release Gate PRD
2
-
3
- ## 文档信息
4
-
5
- - 状态:Release Gate Draft
6
- - 产品名:`codex-switch`
7
- - CLI 命令名:`codexs`
8
- - 当前预发布基线:`0.0.12` beta
9
- - 目标版本:`0.1.0`
10
- - 文档定位:定义 `codex-switch` 何时可以从 `0.0.x` 进入第一个正式稳定发布版本
11
- - 关联 beta PRD:[`./codex-switch-prd-v0.0.12.md`](./codex-switch-prd-v0.0.12.md)
12
- - 关联长期演进稿:[`./codex-switch-prd-v0.0.5-to-v0.1.0.md`](./codex-switch-prd-v0.0.5-to-v0.1.0.md)
13
-
14
- ## 一句话定义
15
-
16
- `0.1.0` 不是“功能再多一点”的版本,而是 `codex-switch` 第一条可正式对外承诺的稳定产品线:命令入口稳定、输出契约稳定、主工作流清晰、恢复与诊断可信、文档与包内容一致。
17
-
18
- ## 发布语义
19
-
20
- 一旦进入 `0.1.0`,这个版本就不再只是“作者自己知道怎么用”的工具,而需要满足:
21
-
22
- - 新用户看 README 与 help 就能走通主路径
23
- - 自动化调用方可以信赖 `--json` 的稳定契约
24
- - direct provider 和 Copilot provider 都有明确、可解释、可恢复的工作流
25
- - 文档、包内容、help、测试和实际行为是同一套事实
26
-
27
- `0.1.0` 不是自动升级目标。只有当 release gate 满足时,才允许发布。
28
-
29
- ## `0.1.0` 必须稳定的内容
30
-
31
- ### 1. CLI 命令面
32
-
33
- 以下命令面在 `0.1.0` 时视为稳定:
34
-
35
- - `init`
36
- - `login`
37
- - `list`
38
- - `show`
39
- - `current`
40
- - `status`
41
- - `doctor`
42
- - `config show`
43
- - `config list-profiles`
44
- - `add`
45
- - `edit`
46
- - `switch`
47
- - `remove`
48
- - `import`
49
- - `export`
50
- - `bridge start`
51
- - `bridge status`
52
- - `bridge stop`
53
- - `backups list`
54
- - `rollback`
55
-
56
- 说明:
57
-
58
- - `setup` 可以继续保留为 deprecated entry
59
- - `migrate` 可以继续保留,但其“高级 adopt 工具”定位必须明确
60
-
61
- ### 2. JSON Envelope
62
-
63
- `--json` 顶层 envelope 在 `0.1.0` 前必须冻结为:
64
-
65
- ```json
66
- {
67
- "ok": true,
68
- "command": "list",
69
- "data": {},
70
- "warnings": [],
71
- "error": null
72
- }
73
- ```
74
-
75
- 要求:
76
-
77
- - 顶层字段不改名
78
- - 顶层 shape 不重排
79
- - 新信息只允许追加到 `data`、`warnings` 或 `error.details`
80
-
81
- ### 3. 双路径模型
82
-
83
- `0.1.0` 前必须把以下边界视为正式产品 contract:
84
-
85
- - tool home:
86
- - `codex-switch.json`
87
- - `providers.json`
88
- - `backups/`
89
- - `runtime/`
90
- - `runtimes/`
91
- - target Codex runtime:
92
- - `config.toml`
93
- - `auth.json`
94
-
95
- 其中:
96
-
97
- - `providers.json` 是管理态 SSOT
98
- - `config.toml` 是受管 runtime routing 文件
99
- - `auth.json` 是受管 auth projection 文件
100
-
101
- ### 4. 主工作流
102
-
103
- #### Direct Provider
104
-
105
- 正式推荐路径必须清晰稳定:
106
-
107
- ```bash
108
- codexs init
109
- codexs add <provider> --profile <name> --api-key <key>
110
- codexs switch <provider>
111
- codexs status
112
- codexs doctor
113
- ```
114
-
115
- #### Copilot Provider
116
-
117
- 正式推荐路径必须清晰稳定:
118
-
119
- ```bash
120
- codexs init
121
- codexs login copilot
122
- codexs add <provider> --copilot --profile <name>
123
- codexs switch <provider>
124
- codexs status
125
- codexs doctor
126
- ```
127
-
128
- #### `migrate`
129
-
130
- `migrate` 在 `0.1.0` 可以保留,但必须满足:
131
-
132
- - 产品定位明确为高级 adopt helper
133
- - 不与 fresh install 主路径混淆
134
- - 文档不把它写成所有用户都应先执行的默认第一步
135
-
136
- ## Release Gate
137
-
138
- 只有以下条件全部满足,才允许发布 `0.1.0`:
139
-
140
- ### A. 工作流可信
141
-
142
- - direct provider 主路径可在 fresh tool home 下稳定走通
143
- - Copilot 主路径可在 fresh tool home 下稳定走通
144
- - `switch` 成功语义仍然等于 config + auth 投影都正确
145
- - `rollback` 对受管写操作仍然可信
146
-
147
- ### B. 输出可信
148
-
149
- - `--json` 读命令输出稳定
150
- - 非交互模式不会意外 prompt
151
- - 错误码和 issue code 对常见失败场景足够稳定
152
- - `status` 与 `doctor` 输出能解释下一步修复动作
153
-
154
- ### C. 文档可信
155
-
156
- - README、README.CN、README.AI、CLI usage、product overview、PRD、changelog 与实际行为一致
157
- - 不再残留旧 `~/.codex/providers.json` / `backups/` 叙述
158
- - 主路径在所有面向用户的文档中一致
159
-
160
- ### D. 包内容可信
161
-
162
- - `npm pack --dry-run` 结果合理
163
- - tarball 中包含正确的 README、LICENSE、docs、dist
164
- - `codexs --help`、`codexs --version`、安装指引与 npm 包元数据一致
165
-
166
- ### E. 结构可信
167
-
168
- - 不再保留明显误导性的历史目录语义
169
- - 关键稳定模块有足够 JSDoc 和边界说明
170
- - 新问题不再需要反复回到超大入口文件做修补
171
-
172
- ## 明确不要求 `0.1.0` 完成的内容
173
-
174
- 以下内容不是 `0.1.0` 的发布前置条件:
175
-
176
- - 新 upstream
177
- - GUI / TUI
178
- - daemon / background supervisor
179
- - plugin system
180
- - 多账号平台
181
- - 自动迁移旧状态
182
- - `migrate` 的完整非交互产品化
183
- - 通用 `config.toml` 编辑器
184
-
185
- ## 若 Release Gate 未通过
186
-
187
- 如果以下任一问题仍明显存在,则不应强行发布 `0.1.0`:
188
-
189
- - 文档和行为仍有明显漂移
190
- - `migrate` 与主路径仍然混淆
191
- - Copilot 路径仍需要过多背景知识才能理解
192
- - 回滚与诊断场景仍存在不稳定或不可解释行为
193
- - 包内容、安装体验或帮助页仍像开发中工具
194
-
195
- 此时应继续发布:
196
-
197
- - `0.0.13`
198
- - `0.0.14`
199
- - 其他后续 beta / rc 版本
200
-
201
- 而不是为了版本号好看提前进入 `0.1.0`。
202
-
203
- ## 结论
204
-
205
- `0.1.0` 的意义,不在于“项目终于到 1.0 之前先过一个数字门槛”,而在于 `codex-switch` 首次具备了可以向外明确承诺的稳定产品边界。只有当工作流、输出、恢复、文档和包发布面都同时稳定时,这个版本号才成立。
1
+ # codex-switch `0.1.0` Release Gate PRD
2
+
3
+ ## 文档信息
4
+
5
+ - 状态:Release Gate
6
+ - 产品名:`codex-switch`
7
+ - CLI 命令名:`codexs`
8
+ - 当前稳定基线:`0.0.12`
9
+ - 目标版本:`0.1.0`
10
+ - 文档定位:定义 `codex-switch` 第一次稳定发布前必须满足的门槛
11
+ - 关联 beta PRD:[`./codex-switch-prd-v0.0.12.md`](./codex-switch-prd-v0.0.12.md)
12
+ - 关联实现约束设计:[`../Design/codex-switch-v0.1.0-design.md`](../Design/codex-switch-v0.1.0-design.md)
13
+ - 关联长期演进稿:[`./codex-switch-prd-v0.0.5-to-v0.1.0.md`](./codex-switch-prd-v0.0.5-to-v0.1.0.md)
14
+
15
+ ## 1. 定位
16
+
17
+ `0.1.0` 是 `codex-switch` 的第一条稳定发布线,不是继续扩 feature surface 的版本,也不是把 `0.0.12` 再包装一次。
18
+
19
+ 这个版本的判断标准只有一个:当前仓库已经足够稳定,能把命令面、输出契约、主工作流、诊断语义和文档事实对外固定下来,并且不需要再依赖开发期解释来“补全理解”。
20
+
21
+ ## 2. 当前阻塞项
22
+
23
+ 以下问题仍然阻止 `0.1.0` 成为真正可发布的稳定版本:
24
+
25
+ 1. `tests/` 被忽略,导致测试无法被版本化和审阅。
26
+ 2. README 里仍有失效的 `docs/Tests/testing.md` 链接,用户会直接遇到死链。
27
+ 3. 版本叙事仍停留在 `0.0.12`,对外材料没有把 `0.1.0` 讲成稳定发布线。
28
+ 4. 发布故事和实现状态还没有完全对齐,尤其是主工作流、`migrate` 定位和 `setup` 定位。
29
+
30
+ 这些阻塞项必须先被收口,`0.1.0` 才能成立。
31
+
32
+ ## 3. `0.1.0` 的稳定合同
33
+
34
+ `0.1.0` 必须把以下内容视为稳定合同,不再当作可随意重写的草案。
35
+
36
+ ### 3.1 命令面
37
+
38
+ 稳定命令面包括:
39
+
40
+ - `init`
41
+ - `login`
42
+ - `list`
43
+ - `show`
44
+ - `current`
45
+ - `status`
46
+ - `doctor`
47
+ - `config show`
48
+ - `config list-profiles`
49
+ - `add`
50
+ - `edit`
51
+ - `switch`
52
+ - `remove`
53
+ - `import`
54
+ - `export`
55
+ - `bridge start`
56
+ - `bridge status`
57
+ - `bridge stop`
58
+ - `backups list`
59
+ - `rollback`
60
+
61
+ 其中:
62
+
63
+ - `migrate` 只能是高级 adopt helper。
64
+ - `setup` 只能是 deprecated entry。
65
+
66
+ ### 3.2 `--json` envelope
67
+
68
+ `--json` 的顶层 envelope 必须保持不变:
69
+
70
+ ```json
71
+ {
72
+ "ok": true,
73
+ "command": "list",
74
+ "data": {},
75
+ "warnings": [],
76
+ "error": null
77
+ }
78
+ ```
79
+
80
+ 约束如下:
81
+
82
+ - 顶层字段名不变。
83
+ - 顶层字段顺序和 shape 不变。
84
+ - 新信息只能继续追加到 `data`、`warnings` 或 `error.details`。
85
+
86
+ ### 3.3 dual-path model
87
+
88
+ `0.1.0` 必须把以下分层固定为正式合同:
89
+
90
+ - tool home:
91
+ - `codex-switch.json`
92
+ - `providers.json`
93
+ - `backups/`
94
+ - `runtime/`
95
+ - `runtimes/`
96
+ - target Codex runtime:
97
+ - `config.toml`
98
+ - `auth.json`
99
+
100
+ 含义必须稳定:
101
+
102
+ - `providers.json` 是管理态 SSOT。
103
+ - `config.toml` 是受管 runtime routing 文件。
104
+ - `auth.json` 是受管 auth projection 文件。
105
+
106
+ ### 3.4 主工作流
107
+
108
+ Direct provider 主路径:
109
+
110
+ ```bash
111
+ codexs init
112
+ codexs add <provider> --profile <name> --api-key <key>
113
+ codexs switch <provider>
114
+ codexs status
115
+ codexs doctor
116
+ ```
117
+
118
+ Copilot provider 主路径:
119
+
120
+ ```bash
121
+ codexs init
122
+ codexs login copilot
123
+ codexs add <provider> --copilot --profile <name>
124
+ codexs switch <provider>
125
+ codexs status
126
+ codexs doctor
127
+ ```
128
+
129
+ `migrate` 的定位必须明确为:
130
+
131
+ - 面向已有 runtime state 的高级 adopt helper。
132
+ - 不应与 fresh install 主路径混淆。
133
+ - 不应被写成所有新用户都应先执行的默认步骤。
134
+
135
+ ## 4. Release Gate
136
+
137
+ 只有以下条件全部满足,才允许发布 `0.1.0`。
138
+
139
+ ### 4.1 工作流
140
+
141
+ - fresh tool home 下 direct provider 主路径可稳定走通。
142
+ - fresh tool home 下 Copilot 主路径可稳定走通。
143
+ - `switch` 的成功语义仍然等于 config auth projection 都正确。
144
+ - `rollback` 对受管写操作仍然可信。
145
+
146
+ ### 4.2 输出与语义
147
+
148
+ - `--json` 读命令输出稳定。
149
+ - 非交互模式不会意外触发 prompt。
150
+ - 错误码和 issue code 对常见失败场景足够稳定。
151
+ - `status` `doctor` 能清楚说明下一步修复动作。
152
+ - `list`、`status`、`doctor` 的人类可读输出和交互提示一致。
153
+
154
+ ### 4.3 文档
155
+
156
+ - README、README.CN、README.AI、CLI usage、product overview、PRD、design 和 changelog 与实际行为一致。
157
+ - `docs/Tests/testing.md` 不能继续停留在忽略状态,测试回归必须落仓库并可版本化。
158
+ - 主路径在所有面向用户的文档中必须一致。
159
+ - `0.1.0` 的定位必须压过旧的 `0.0.12` 叙事。
160
+
161
+ ### 4.4 包内容
162
+
163
+ - `npm pack --dry-run` 结果合理。
164
+ - tarball 中包含正确的 README、LICENSE、docs、dist。
165
+ - `codexs --help`、`codexs --version`、安装指引与 npm 包元数据一致。
166
+
167
+ ### 4.5 结构
168
+
169
+ - 不再保留明显误导性的历史目录语义。
170
+ - 稳定模块的边界说明足够清楚。
171
+ - 新问题不再需要反复回到超大入口文件修补。
172
+
173
+ ## 5. 可执行验证清单
174
+
175
+ `0.1.0` 的发布前验证必须至少覆盖以下项目:
176
+
177
+ ```bash
178
+ npm run build
179
+ npm test
180
+ npx tsc --noEmit
181
+ npm pack --dry-run
182
+ node dist/cli.js --help
183
+ node dist/cli.js --version
184
+ ```
185
+
186
+ 同时必须做以下行为验证:
187
+
188
+ - fresh direct provider flow。
189
+ - fresh Copilot provider flow。
190
+ - `list/status/doctor` 语义检查。
191
+ - `--json` 输出检查。
192
+ - `migrate` 作为高级 adopt helper 的检查。
193
+ - `setup` 作为 deprecated entry 的检查。
194
+
195
+ ## 6. 明确不在范围内
196
+
197
+ `0.1.0` 不要求完成以下内容:
198
+
199
+ - upstream。
200
+ - GUI / TUI。
201
+ - daemon。
202
+ - plugin system。
203
+ - auto migration。
204
+ - 兼容层。
205
+ - dual-read / dual-write。
206
+ - `migrate` 的完整非交互产品化。
207
+ - 旧状态的自动升级保留逻辑。
208
+
209
+ ## 7. 若 Gate 未通过
210
+
211
+ 如果任何阻塞项仍然存在,就不要强行发布 `0.1.0`。
212
+
213
+ 此时应继续发布 beta 或 rc 版本,而不是为了版本号好看提前进入稳定线。
214
+
215
+ ## 8. 结论
216
+
217
+ `0.1.0` 的本质不是“功能更多”,而是“承诺更稳”。当命令面、输出契约、主工作流、诊断语义、包内容和文档事实完全一致时,这个版本号才成立。