@minniexcode/codex-switch 0.0.3 → 0.0.4
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.AI.md +8 -3
- package/README.md +160 -91
- package/dist/app/edit-provider.js +64 -0
- package/dist/app/import-providers.js +10 -1
- package/dist/app/list-backups.js +17 -0
- package/dist/app/rollback-backup.js +30 -0
- package/dist/app/setup-codex.js +138 -0
- package/dist/app/show-provider.js +22 -0
- package/dist/cli/add-interactive.js +25 -31
- package/dist/cli/args.js +8 -5
- package/dist/cli/help.js +70 -12
- package/dist/cli/interactive.js +67 -8
- package/dist/cli/output.js +34 -1
- package/dist/cli/prompt.js +19 -2
- package/dist/cli.js +160 -12
- package/dist/domain/backups.js +103 -0
- package/dist/domain/errors.js +3 -3
- package/dist/domain/providers.js +10 -0
- package/dist/domain/setup.js +30 -0
- package/dist/infra/backup-repo.js +65 -6
- package/dist/infra/codex-cli.js +62 -0
- package/dist/infra/codex-discovery.js +48 -0
- package/dist/infra/codex-paths.js +14 -1
- package/dist/infra/providers-repo.js +29 -0
- package/docs/PRD/codex-switch-prd-v0.1.0.md +393 -0
- package/docs/{codex-switch-prd.md → PRD/codex-switch-prd.md} +9 -5
- package/docs/cli-usage.md +580 -0
- package/docs/codex-switch-command-design.md +1 -1
- package/docs/codex-switch-product-overview.md +1 -1
- package/docs/codex-switch-product-research.md +2 -2
- package/docs/codex-switch-technical-architecture.md +1 -1
- package/docs/codex-switch-v0.0.4-design.md +874 -0
- package/package.json +1 -1
|
@@ -33,15 +33,28 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CODEX_DIR_ENV_NAME = void 0;
|
|
36
37
|
exports.resolveCodexDir = resolveCodexDir;
|
|
37
38
|
exports.createCodexPaths = createCodexPaths;
|
|
38
39
|
const os = __importStar(require("node:os"));
|
|
39
40
|
const path = __importStar(require("node:path"));
|
|
41
|
+
exports.CODEX_DIR_ENV_NAME = "CODEXS_CODEX_DIR";
|
|
42
|
+
const DEVELOPMENT_DEFAULT_CODEX_DIR = path.resolve(process.cwd(), "test-fixtures", "sample-codex");
|
|
40
43
|
/**
|
|
41
44
|
* Resolves the working Codex directory, defaulting to `~/.codex`.
|
|
42
45
|
*/
|
|
43
46
|
function resolveCodexDir(codexDir) {
|
|
44
|
-
|
|
47
|
+
if (codexDir) {
|
|
48
|
+
return path.resolve(codexDir);
|
|
49
|
+
}
|
|
50
|
+
const envCodexDir = process.env[exports.CODEX_DIR_ENV_NAME];
|
|
51
|
+
if (envCodexDir) {
|
|
52
|
+
return path.resolve(envCodexDir);
|
|
53
|
+
}
|
|
54
|
+
if (process.env.NODE_ENV === "development") {
|
|
55
|
+
return DEVELOPMENT_DEFAULT_CODEX_DIR;
|
|
56
|
+
}
|
|
57
|
+
return path.join(os.homedir(), ".codex");
|
|
45
58
|
}
|
|
46
59
|
/**
|
|
47
60
|
* Expands a Codex home directory into the file paths used by the CLI.
|
|
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.readProvidersFile = readProvidersFile;
|
|
37
37
|
exports.readProvidersFileIfExists = readProvidersFileIfExists;
|
|
38
38
|
exports.writeProvidersFile = writeProvidersFile;
|
|
39
|
+
exports.readProviderRecord = readProviderRecord;
|
|
40
|
+
exports.mergeProviders = mergeProviders;
|
|
39
41
|
const fs = __importStar(require("node:fs"));
|
|
40
42
|
const errors_1 = require("../domain/errors");
|
|
41
43
|
const providers_1 = require("../domain/providers");
|
|
@@ -67,3 +69,30 @@ function readProvidersFileIfExists(providersPath) {
|
|
|
67
69
|
function writeProvidersFile(providersPath, providers) {
|
|
68
70
|
(0, fs_utils_1.writeTextFileAtomic)(providersPath, `${JSON.stringify((0, providers_1.sortProviders)(providers), null, 2)}\n`);
|
|
69
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns a single provider record or throws a typed not-found error.
|
|
74
|
+
*/
|
|
75
|
+
function readProviderRecord(providersPath, providerName) {
|
|
76
|
+
const providers = readProvidersFile(providersPath);
|
|
77
|
+
const record = providers.providers[providerName];
|
|
78
|
+
if (!record) {
|
|
79
|
+
throw (0, errors_1.cliError)("PROVIDER_NOT_FOUND", `Provider "${providerName}" was not found.`, {
|
|
80
|
+
provider: providerName,
|
|
81
|
+
file: providersPath,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return record;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Merges imported providers into the current registry, preferring the imported side on conflicts.
|
|
88
|
+
*/
|
|
89
|
+
function mergeProviders(current, imported) {
|
|
90
|
+
const providers = {};
|
|
91
|
+
for (const [name, record] of Object.entries(current.providers)) {
|
|
92
|
+
providers[name] = (0, providers_1.cleanProviderRecord)(record);
|
|
93
|
+
}
|
|
94
|
+
for (const [name, record] of Object.entries(imported.providers)) {
|
|
95
|
+
providers[name] = (0, providers_1.cleanProviderRecord)(record);
|
|
96
|
+
}
|
|
97
|
+
return (0, providers_1.sortProviders)({ providers });
|
|
98
|
+
}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# codex-switch `0.1.0` 目标 PRD
|
|
2
|
+
|
|
3
|
+
## 文档信息
|
|
4
|
+
|
|
5
|
+
- 状态:Target PRD
|
|
6
|
+
- 产品名:`codex-switch`
|
|
7
|
+
- CLI 命令名:`codexs`
|
|
8
|
+
- 当前基线版本:`0.0.3`
|
|
9
|
+
- 目标版本:`0.1.0`
|
|
10
|
+
- 文档定位:从 `0.0.3` 走向 `0.1.0` 的目标规格与阶段性演进路线
|
|
11
|
+
- 历史基线 PRD:[`codex-switch-prd.md`](./codex-switch-prd.md)
|
|
12
|
+
- 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
|
|
13
|
+
- 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
|
|
14
|
+
- 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
|
|
15
|
+
|
|
16
|
+
## 一句话定义
|
|
17
|
+
|
|
18
|
+
`codex-switch` 的 `0.1.0` 目标,是从一个已经验证可行的本地 provider/profile 管理 CLI,演进为一套对人类和 AI 都稳定、可初始化、可诊断、可恢复、可持续扩展的发布级命令体系。
|
|
19
|
+
|
|
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`
|
|
29
|
+
|
|
30
|
+
当前已落地能力:
|
|
31
|
+
|
|
32
|
+
- `list` / `current` / `status`
|
|
33
|
+
- `switch <provider>`
|
|
34
|
+
- `import <file>` / `export <file>`
|
|
35
|
+
- `add <provider>` / `remove <provider>`
|
|
36
|
+
- `doctor`
|
|
37
|
+
- `rollback`
|
|
38
|
+
|
|
39
|
+
当前基线已经具备的工程特征:
|
|
40
|
+
|
|
41
|
+
- 本地文件模型围绕 `~/.codex/`
|
|
42
|
+
- `providers.json` 作为 management SSOT
|
|
43
|
+
- `config.toml` 与 `auth.json` 作为 runtime state
|
|
44
|
+
- 写命令统一走备份、锁和失败回滚
|
|
45
|
+
- `--json` 输出固定 envelope
|
|
46
|
+
- 高频写命令支持 TTY 渐进式交互
|
|
47
|
+
|
|
48
|
+
当前基线仍然存在的边界:
|
|
49
|
+
|
|
50
|
+
- 缺少首次初始化 / bootstrap 命令
|
|
51
|
+
- 只支持 latest rollback,不支持按备份条目恢复
|
|
52
|
+
- provider 查看和编辑仍然偏基础
|
|
53
|
+
- 错误码体系仍带有 MVP 阶段的复用痕迹
|
|
54
|
+
- 尚未进入第三方 auth / extension 集成阶段
|
|
55
|
+
|
|
56
|
+
## `0.1.0` 目标
|
|
57
|
+
|
|
58
|
+
`0.1.0` 需要同时满足以下目标:
|
|
59
|
+
|
|
60
|
+
- 保持当前 CLI 和 JSON 契约稳定
|
|
61
|
+
- 让首次用户可以通过 `setup` 完成从环境检测到 registry 初始化的主流程
|
|
62
|
+
- 让 provider registry 的查看、编辑、导入合并能力更完整
|
|
63
|
+
- 让备份与回滚从“最新一次”演进到“显式备份条目”
|
|
64
|
+
- 为未来 auth / extension 集成保留明确边界,而不把远期需求提前塞进稳定主线
|
|
65
|
+
|
|
66
|
+
## 长期演进守则
|
|
67
|
+
|
|
68
|
+
如果继续扩展命令面,后续新增命令统一遵守下面三条:
|
|
69
|
+
|
|
70
|
+
- 不破坏当前 JSON envelope
|
|
71
|
+
- 不复用语义不匹配的错误码
|
|
72
|
+
- 所有写命令默认纳入备份与回滚模型
|
|
73
|
+
|
|
74
|
+
## 稳定公共契约
|
|
75
|
+
|
|
76
|
+
### JSON Envelope
|
|
77
|
+
|
|
78
|
+
`--json` 继续保持统一 envelope:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"ok": true,
|
|
83
|
+
"command": "list",
|
|
84
|
+
"data": {},
|
|
85
|
+
"warnings": [],
|
|
86
|
+
"error": null
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
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 的字段内容
|
|
247
|
+
|
|
248
|
+
默认交互模型:
|
|
249
|
+
|
|
250
|
+
- 显式参数优先
|
|
251
|
+
- 允许使用 `--profile`、`--api-key`、`--base-url`、`--note`、`--tag`
|
|
252
|
+
- TTY 下只补全缺失项或确认危险写入
|
|
253
|
+
- 不以外部编辑器作为默认形态
|
|
254
|
+
|
|
255
|
+
约束:
|
|
256
|
+
|
|
257
|
+
- 作为写命令,默认纳入备份、锁和失败回滚
|
|
258
|
+
|
|
259
|
+
### `codexs backups list`
|
|
260
|
+
|
|
261
|
+
目标:
|
|
262
|
+
|
|
263
|
+
- 列出历史备份条目
|
|
264
|
+
- 让用户和 AI 能显式选择恢复目标
|
|
265
|
+
|
|
266
|
+
建议输出字段:
|
|
267
|
+
|
|
268
|
+
- `backupId`
|
|
269
|
+
- `createdAt`
|
|
270
|
+
- `reason`
|
|
271
|
+
- `files`
|
|
272
|
+
- `backupPath`
|
|
273
|
+
|
|
274
|
+
备份 ID 规则:
|
|
275
|
+
|
|
276
|
+
- 默认以备份目录 basename 作为稳定 `backupId`
|
|
277
|
+
- 例如 `20260511-221457-switch`
|
|
278
|
+
|
|
279
|
+
### `codexs rollback <backup-id>`
|
|
280
|
+
|
|
281
|
+
目标:
|
|
282
|
+
|
|
283
|
+
- 从“只支持 latest rollback”演进到“支持显式备份条目恢复”
|
|
284
|
+
|
|
285
|
+
约束:
|
|
286
|
+
|
|
287
|
+
- `rollback` 继续保留 latest 入口
|
|
288
|
+
- `rollback <backup-id>` 作为增强能力引入
|
|
289
|
+
- 指定备份不存在时必须返回专门错误码,而不是复用 generic rollback failure
|
|
290
|
+
|
|
291
|
+
### `codexs import --merge`
|
|
292
|
+
|
|
293
|
+
目标:
|
|
294
|
+
|
|
295
|
+
- 在不整体替换当前 registry 的前提下导入 provider 清单
|
|
296
|
+
|
|
297
|
+
默认冲突策略:
|
|
298
|
+
|
|
299
|
+
- 当导入文件和当前 registry 出现同名 provider 冲突时,以导入文件内容为准
|
|
300
|
+
- 未冲突条目继续保留
|
|
301
|
+
- 最终结果仍作为一次受管写操作进入备份与回滚流程
|
|
302
|
+
|
|
303
|
+
## `0.1.0` 远期目标与能力域
|
|
304
|
+
|
|
305
|
+
下面这些方向明确有价值,但当前不进入 `0.0.4` 里程碑,只作为继续走向 `0.1.0` 的远期能力域。
|
|
306
|
+
|
|
307
|
+
### 第三方 auth / extension 集成
|
|
308
|
+
|
|
309
|
+
示例方向:
|
|
310
|
+
|
|
311
|
+
- 接入 Copilot auth
|
|
312
|
+
- 在本地启动代理服务,使特定上游可在 Codex 中使用
|
|
313
|
+
- 安装和管理第三方依赖
|
|
314
|
+
|
|
315
|
+
当前定位:
|
|
316
|
+
|
|
317
|
+
- 作为单独能力域保留
|
|
318
|
+
- 不在当前主 PRD 中锁定具体命令名和具体交互细节
|
|
319
|
+
- 不进入 `0.1.0` 稳定主线的验收标准
|
|
320
|
+
|
|
321
|
+
### 交互式依赖安装
|
|
322
|
+
|
|
323
|
+
未来如果引入:
|
|
324
|
+
|
|
325
|
+
- 应采用交互式多选模式
|
|
326
|
+
- 类似 skills 安装体验
|
|
327
|
+
- 支持一次选择多个可选依赖
|
|
328
|
+
|
|
329
|
+
但当前阶段仅记录方向,不进入正式规格。
|
|
330
|
+
|
|
331
|
+
## 主题里程碑
|
|
332
|
+
|
|
333
|
+
从 `0.0.3` 走向 `0.1.0`,建议按能力主题推进,而不是现在就预写死每个小版本号。
|
|
334
|
+
|
|
335
|
+
### 里程碑 A:`0.0.4` / Bootstrap / Setup
|
|
336
|
+
|
|
337
|
+
目标:
|
|
338
|
+
|
|
339
|
+
- 完成 `setup` 规格与实现
|
|
340
|
+
- 把首次初始化从“手工准备文件”提升到“命令引导完成”
|
|
341
|
+
- 补齐 codex 安装和版本检查语义
|
|
342
|
+
|
|
343
|
+
详细设计文档:
|
|
344
|
+
|
|
345
|
+
- [`../codex-switch-v0.0.4-design.md`](../codex-switch-v0.0.4-design.md)
|
|
346
|
+
|
|
347
|
+
### 里程碑 B:Provider Registry Ergonomics
|
|
348
|
+
|
|
349
|
+
目标:
|
|
350
|
+
|
|
351
|
+
- 增强 provider 的查看与编辑能力
|
|
352
|
+
- 保持 `providers.json` 作为管理态事实源
|
|
353
|
+
- 不默认把 runtime 文件反向回写到 registry
|
|
354
|
+
|
|
355
|
+
### 里程碑 C:Backup / Recovery Evolution
|
|
356
|
+
|
|
357
|
+
目标:
|
|
358
|
+
|
|
359
|
+
- 引入 `backups list`
|
|
360
|
+
- 引入按 `backupId` 回滚
|
|
361
|
+
- 为 `import --merge` 提供完整恢复语义
|
|
362
|
+
|
|
363
|
+
### 里程碑 D:Extensions / Auth Integration
|
|
364
|
+
|
|
365
|
+
目标:
|
|
366
|
+
|
|
367
|
+
- 评估第三方 auth 与本地代理集成
|
|
368
|
+
- 评估交互式依赖安装与 extension 管理
|
|
369
|
+
- 在不破坏主 CLI 契约的前提下扩展能力边界
|
|
370
|
+
|
|
371
|
+
## 对实现的要求
|
|
372
|
+
|
|
373
|
+
从现在到 `0.1.0` 的所有新增能力,默认遵守:
|
|
374
|
+
|
|
375
|
+
- 命令帮助必须明确人类模式和 `--json` 模式行为
|
|
376
|
+
- 非交互环境不允许依赖 prompt 才能完成核心自动化流程
|
|
377
|
+
- 所有写命令默认走锁、备份、回滚
|
|
378
|
+
- 所有新增错误码都必须语义清晰
|
|
379
|
+
- 所有新增 JSON 返回都只能扩展 `data` 和 `warnings`
|
|
380
|
+
|
|
381
|
+
## `0.1.0` 目标完成标准
|
|
382
|
+
|
|
383
|
+
达到下面这些条件时,可以认为 `0.1.0` 主线目标基本收敛:
|
|
384
|
+
|
|
385
|
+
- 用户可以通过 `setup` 完成首次初始化
|
|
386
|
+
- provider registry 的查看、编辑、导入合并能力完整
|
|
387
|
+
- 历史备份可被显式枚举和恢复
|
|
388
|
+
- CLI 错误码不再存在明显语义复用问题
|
|
389
|
+
- 主 CLI 契约对 AI 和脚本调用保持稳定
|
|
390
|
+
|
|
391
|
+
## 结论
|
|
392
|
+
|
|
393
|
+
`0.1.0` 不是简单地把现有 MVP 重命名为稳定版,而是要在保持当前本地事务式切换模型不变的前提下,补齐初始化能力、增强 registry 操作、收紧错误契约,并为未来更大范围的 auth / extension 集成留出清晰边界。
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
# codex-switch PRD
|
|
2
2
|
|
|
3
|
+
> 状态说明:
|
|
4
|
+
> 这份文档保留为 `0.0.x` / MVP 阶段的历史 PRD 基线。
|
|
5
|
+
> 从 `0.0.3` 继续走向 `0.1.0` 的目标规格,请参考 [`codex-switch-prd-v0.1.0.md`](./codex-switch-prd-v0.1.0.md)。
|
|
6
|
+
|
|
3
7
|
## 文档信息
|
|
4
8
|
|
|
5
|
-
- 状态:
|
|
9
|
+
- 状态:Historical Baseline
|
|
6
10
|
- 产品名:`codex-switch`
|
|
7
11
|
- CLI 命令名:`codexs`
|
|
8
12
|
- 版本范围:MVP / CLI First
|
|
9
|
-
-
|
|
10
|
-
- 对应研究稿:[
|
|
11
|
-
- 对应技术架构:[
|
|
12
|
-
- 对应命令设计:[
|
|
13
|
+
- 文档定位:`0.0.x` / MVP 阶段历史 PRD
|
|
14
|
+
- 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
|
|
15
|
+
- 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
|
|
16
|
+
- 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
|
|
13
17
|
|
|
14
18
|
## 一句话定义
|
|
15
19
|
|