@minniexcode/codex-switch 0.0.11 → 0.0.12

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.
@@ -2,240 +2,85 @@
2
2
 
3
3
  ## 文档定位
4
4
 
5
- 这份文档用于介绍 `codex-switch` 是什么、解决什么问题、适合谁用,以及它和现有方案相比的产品价值。
5
+ 这份文档介绍当前活跃产品事实源下的 `codex-switch` 产品定位。
6
6
 
7
- 它不是实现规格文档,也不是研究笔记。
7
+ 当前 release contract 以这些文档为准:
8
8
 
9
- 相关文档:
10
-
11
- - 研究输入稿:[`codex-switch-product-research.md`](./codex-switch-product-research.md)
12
- - 正式 PRD:[`PRD/codex-switch-prd.md`](./PRD/codex-switch-prd.md)
13
- - 技术架构设计:[`codex-switch-technical-architecture.md`](./codex-switch-technical-architecture.md)
14
- - 命令设计说明:[`codex-switch-command-design.md`](./codex-switch-command-design.md)
9
+ - [`cli-usage.md`](./cli-usage.md)
10
+ - [`PRD/codex-switch-prd-v0.0.12.md`](./PRD/codex-switch-prd-v0.0.12.md)
11
+ - [`Design/codex-switch-v0.0.12-design.md`](./Design/codex-switch-v0.0.12-design.md)
15
12
 
16
13
  ## 产品概述
17
14
 
18
- `codex-switch` 是一个本地优先、默认安全、对 AI 友好的 CLI 工具,用于管理和切换本机 Codex 的 provider/profile 配置。
15
+ `codex-switch` 是一个本地 provider 管理 CLI,用于管理和切换目标 Codex runtime 的 provider/profile 配置,同时把工具自己的管理态保存在独立 tool home 下。
19
16
 
20
- 它的产品展示名是:
17
+ 它不是旧 `setup` 小工具,也不是围绕单目录 `~/.codex` 组织全部状态的脚本集合。
21
18
 
22
- ```text
23
- codex-switch
24
- ```
19
+ ## 产品工作方式
20
+
21
+ `codex-switch` 使用 dual-path model。
25
22
 
26
- 它的命令名是:
23
+ tool home:
27
24
 
28
25
  ```text
29
- codexs
26
+ ~/.config/codex-switch/
27
+ codex-switch.json
28
+ providers.json
29
+ backups/
30
+ runtime/
31
+ runtimes/
30
32
  ```
31
33
 
32
- `codex-switch` 的核心目标不是做一个“大而全”的账号系统,也不是先做成桌面应用,而是提供一套轻量、稳定、可安装的命令行产品,让用户和 AI 都能可靠地管理本地 Codex 配置。
33
-
34
- ## 为什么要做这个产品
35
-
36
- 围绕 Codex 配置切换,当前常见方案通常有两个问题:
37
-
38
- - 太轻
39
- - 单个脚本可以完成基本切换,但不够产品化,不适合长期维护,也不适合让 AI 稳定调用
40
- - 太重
41
- - 一些方案偏桌面 GUI、偏多账号体系、偏代理层控制,不适合只想快速切换本地配置的场景
42
-
43
- `codex-switch` 填补的是这两者之间的空缺:
44
-
45
- - 比脚本更标准
46
- - 比重型工具更轻
47
- - 比手工改配置更安全
48
- - 比临时命令更适合 AI 自动化调用
49
-
50
- ## 它解决什么问题
51
-
52
- `codex-switch` 主要解决以下问题:
53
-
54
- - 本机维护多个 provider / profile 时,切换过程繁琐
55
- - 手动修改 `~/.codex/config.toml` 风险高,容易改错
56
- - 切换后还需要同步处理登录状态或 API key
57
- - 缺少统一命令去查看当前状态、导入导出配置、做基础诊断
58
- - AI 代理难以稳定复用临时脚本或手工流程
59
-
60
- 简单说,它把原本零散、不稳定、容易出错的本地切换流程,收敛成一套可预期的产品接口。
61
-
62
- ## 目标用户
63
-
64
- ### 1. 个人开发者
65
-
66
- 这类用户会在同一台机器上使用多个 Codex provider 或多个 profile,希望快速切换,而不想反复手动编辑文件。
67
-
68
- ### 2. 高频切换用户
69
-
70
- 这类用户需要在不同 API key、不同环境配置、不同 provider 之间频繁切换,希望切换动作标准化。
71
-
72
- ### 3. AI 代理使用者
73
-
74
- 这类用户希望让 AI 直接执行:
75
-
76
- - 查看当前配置
77
- - 列出可用 provider
78
- - 切换 provider
79
- - 导入或导出配置
80
- - 诊断当前环境
81
-
82
- ### 4. 重视配置安全的用户
83
-
84
- 这类用户不接受“切换失败后手动修配置”的流程,希望所有写操作都先备份,失败后能回滚。
85
-
86
- ## 产品形态
87
-
88
- `codex-switch` 当前明确采用 CLI-first 形态。
89
-
90
- 这意味着:
91
-
92
- - 第一阶段只提供命令行接口
93
- - 所有核心功能都能通过命令完成
94
- - 重点优化稳定命令、明确输出和自动化兼容性
95
- - 不依赖 GUI,不依赖后台常驻服务
96
-
97
- 这也是它和一些桌面切换器最大的区别:`codex-switch` 更强调自动化与可调用性,而不是可视化操作界面。
98
-
99
- ## 核心价值
100
-
101
- ### 1. 切换更简单
102
-
103
- 用户不需要手动打开配置文件查找和修改 `profile`,只需要执行一条命令。
104
-
105
- ### 2. 修改更安全
106
-
107
- 所有关键写操作都围绕“先备份、后修改、失败回滚”的原则设计,降低误操作风险。
108
-
109
- ### 3. 对 AI 更友好
110
-
111
- 命令名、参数和输出结构保持稳定,AI 可以把它当成标准工具调用,而不是临时脚本。
112
-
113
- ### 4. 产品边界更清晰
114
-
115
- 它不试图一开始就处理账号全生命周期、可视化界面、复杂路由和远程同步,而是聚焦“本地 provider/profile 管理和切换”这一件事。
116
-
117
- ## 核心能力
118
-
119
- MVP 的能力范围主要包括:
120
-
121
- - provider/profile 管理
122
- - 查看、添加、删除本地 provider 记录
123
- - 当前状态查看
124
- - 查看当前生效 profile
125
- - 查看本地配置整体状态
126
- - provider 切换
127
- - 切换到指定 provider
128
- - 默认联动执行 `codex login --with-api-key`
129
- - 配置安全
130
- - 修改前自动备份
131
- - 失败时自动回滚
132
- - 配置迁移
133
- - 导入和导出 `providers.json`
134
- - 环境诊断
135
- - 检查配置文件、provider 映射和 CLI 可用性
136
-
137
- ## 产品工作方式
138
-
139
- `codex-switch` 的工作对象主要围绕 `~/.codex/` 目录:
34
+ target Codex runtime:
140
35
 
141
36
  ```text
142
37
  ~/.codex/
143
38
  config.toml
144
39
  auth.json
145
- providers.json
146
- backups/
147
40
  ```
148
41
 
149
- 其中:
150
-
151
- - `config.toml` 是主配置文件
152
- - `providers.json` 是 `codex-switch` 自身维护的 provider 清单
153
- - `auth.json` 是当前 active direct provider 的认证投影文件;切换 direct provider 时会刷新 `OPENAI_API_KEY`
154
- - `backups/` 用于保存历史备份
155
-
156
- 产品不会要求用户先理解全部内部实现,只暴露统一的命令接口。
157
-
158
- ## 典型使用流程
159
-
160
- ### 场景 1:查看当前状态
161
-
162
- 用户可以先查看当前生效 profile,以及本地配置是否完整。
163
-
164
- ### 场景 2:列出所有 provider
165
-
166
- 用户可以查看当前有哪些可切换 provider,以及它们分别映射到哪个 profile。
167
-
168
- ### 场景 3:切换到目标 provider
42
+ 说明:
169
43
 
170
- 用户执行切换命令后,工具会完成校验、备份、修改运行态配置,并在 direct provider 场景下同步 `auth.json`。
44
+ - `providers.json` 不位于 `~/.codex`
45
+ - `backups/` 不位于 `~/.codex`
46
+ - tool home 承担管理态 SSOT
47
+ - target runtime 承担受管运行态投影
171
48
 
172
- ### 场景 4:出现异常时恢复
49
+ ## 核心使用流程
173
50
 
174
- 如果切换失败,工具会自动回滚;如果用户需要手动恢复,也可以通过回滚命令恢复最近一次状态。
51
+ Direct 主路径:
175
52
 
176
- ### 场景 5:迁移到新机器
177
-
178
- 用户可以导出 `providers.json`,在另一台机器上导入,再进行本地校验和切换。
179
-
180
- ## 与其他方案的区别
181
-
182
- 相较于临时脚本,`codex-switch` 的区别在于:
183
-
184
- - 有稳定命令集
185
- - 有统一输出格式
186
- - 有更清晰的产品边界
187
- - 更适合长期维护
188
-
189
- 相较于 GUI 或重型账号工具,`codex-switch` 的区别在于:
190
-
191
- - 更轻量
192
- - 更适合自动化
193
- - 更适合 AI 调用
194
- - 聚焦本地 provider/profile,而不是扩展成完整账号平台
195
-
196
- ## 当前明确不做的内容
197
-
198
- 当前版本不做以下内容:
199
-
200
- - GUI / Desktop App
201
- - 常驻后台服务
202
- - 代理转发层
203
- - 复杂多账号体系
204
- - 自动智能路由
205
- - 远程同步
206
-
207
- 这些方向不是永远不做,而是不属于当前产品的首要问题。
208
-
209
- ## 为什么是 TypeScript / Node.js
210
-
211
- `codex-switch` 当前优先选择 TypeScript / Node.js,不是因为这个产品需要高性能计算,而是因为这条路线更符合它的产品形态:
212
-
213
- - npm 全局安装体验成熟
214
- - CLI 生态完善
215
- - 开发和迭代速度更快
216
- - 更方便后续扩展交互、JSON 输出和 AI 集成
217
-
218
- 因此,当前阶段真正重要的不是“是否足够底层”,而是:
219
-
220
- - 命令是否稳定
221
- - 文件修改是否安全
222
- - 输出是否易于解析
223
- - 用户是否容易安装和使用
53
+ ```bash
54
+ codexs init
55
+ codexs add <provider> --profile <name> --api-key <key>
56
+ codexs switch <provider>
57
+ codexs status
58
+ codexs doctor
59
+ ```
224
60
 
225
- ## 成功标准
61
+ Copilot 主路径:
226
62
 
227
- 如果 `codex-switch` 能做到以下几点,就说明这个产品方向成立:
63
+ ```bash
64
+ codexs init
65
+ codexs login copilot
66
+ codexs add <provider> --copilot --profile <name>
67
+ codexs switch <provider>
68
+ codexs status
69
+ codexs doctor
70
+ ```
228
71
 
229
- - 用户可以轻松安装并使用统一 CLI
230
- - 用户可以可靠地查看、切换和管理本地 provider
231
- - 切换失败时不会破坏本地配置
232
- - AI 可以稳定调用关键命令
233
- - 用户不需要再依赖手工改配置或维护零散脚本
72
+ Advanced adopt helper:
234
73
 
235
- ## 当前结论
74
+ ```bash
75
+ codexs init
76
+ codexs migrate
77
+ ```
236
78
 
237
- `codex-switch` 的产品定位可以概括为:
79
+ ## 当前产品判断
238
80
 
239
- > 一个轻量、可安装、默认安全、对 AI 友好的本地 Codex provider/profile 切换工具。
81
+ `0.0.12` 的重点不是再加新命令,而是让用户在 README、help 和输出第一屏就能理解:
240
82
 
241
- 它不是从 GUI 起步,也不是从复杂账号系统起步,而是从最有价值、最容易落地、最适合自动化调用的 CLI 能力起步。
83
+ - fresh install 应先走什么
84
+ - Copilot 路径和 direct 路径有什么区别
85
+ - `migrate` 何时才该使用
86
+ - `status` / `doctor` 如何帮助定位下一步
@@ -1,5 +1,8 @@
1
1
  # codex-switch 技术架构设计
2
2
 
3
+ > 状态说明:这份文档是历史跨版本参考,不是当前 release contract。
4
+ > 当前事实源请改看 [`docs/cli-usage.md`](./cli-usage.md)、[`docs/PRD/codex-switch-prd-v0.0.12.md`](./PRD/codex-switch-prd-v0.0.12.md)、[`docs/Design/codex-switch-v0.0.12-design.md`](./Design/codex-switch-v0.0.12-design.md)。
5
+
3
6
  ## 文档信息
4
7
 
5
8
  - 文档类型:技术架构设计文档
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minniexcode/codex-switch",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "Local-first CLI for managing and switching Codex provider/profile configuration.",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rollbackLatest = rollbackLatest;
4
- const errors_1 = require("../domain/errors");
5
- const backup_repo_1 = require("../storage/backup-repo");
6
- /**
7
- * Restores the most recent mutation backup recorded by codex-switch.
8
- */
9
- function rollbackLatest(latestBackupPath) {
10
- const manifest = (0, backup_repo_1.loadLatestManifest)(latestBackupPath);
11
- try {
12
- (0, backup_repo_1.restoreManifest)(manifest);
13
- return {
14
- data: {
15
- restoredFiles: manifest.files.map((file) => file.relativePath),
16
- backupPath: manifest.backupDir,
17
- },
18
- };
19
- }
20
- catch (error) {
21
- throw (0, errors_1.cliError)("ROLLBACK_FAILED", "Rollback failed.", {
22
- cause: (0, errors_1.normalizeError)(error).message,
23
- backupPath: manifest.backupDir,
24
- });
25
- }
26
- }