@minniexcode/codex-switch 0.0.5 → 0.0.7

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.
Files changed (71) hide show
  1. package/README.AI.md +5 -2
  2. package/README.md +44 -100
  3. package/dist/app/add-provider.js +28 -4
  4. package/dist/app/edit-provider.js +47 -19
  5. package/dist/app/export-providers.js +2 -2
  6. package/dist/app/get-current-profile.js +1 -1
  7. package/dist/app/get-status.js +10 -3
  8. package/dist/app/import-providers.js +15 -7
  9. package/dist/app/init-codex.js +68 -0
  10. package/dist/app/list-backups.js +1 -1
  11. package/dist/app/list-config-profiles.js +3 -2
  12. package/dist/app/list-providers.js +2 -1
  13. package/dist/app/remove-provider.js +2 -2
  14. package/dist/app/rollback-backup.js +1 -1
  15. package/dist/app/rollback-latest.js +1 -1
  16. package/dist/app/run-doctor.js +83 -6
  17. package/dist/app/run-mutation.js +2 -2
  18. package/dist/app/setup-codex.js +21 -12
  19. package/dist/app/show-config.js +11 -3
  20. package/dist/app/show-provider.js +1 -1
  21. package/dist/app/switch-provider.js +16 -9
  22. package/dist/cli/add-interactive.js +7 -104
  23. package/dist/cli/args.js +6 -135
  24. package/dist/cli/help.js +8 -313
  25. package/dist/cli/interactive.js +17 -225
  26. package/dist/cli/output.js +21 -6
  27. package/dist/cli/prompt.js +4 -106
  28. package/dist/cli.js +10 -404
  29. package/dist/commands/args.js +132 -0
  30. package/dist/commands/dispatch.js +16 -0
  31. package/dist/commands/handlers.js +460 -0
  32. package/dist/commands/help.js +120 -0
  33. package/dist/commands/registry.js +351 -0
  34. package/dist/commands/types.js +2 -0
  35. package/dist/domain/config.js +235 -21
  36. package/dist/domain/providers.js +16 -2
  37. package/dist/domain/setup.js +1 -0
  38. package/dist/infra/backup-repo.js +9 -206
  39. package/dist/infra/codex-cli.js +9 -126
  40. package/dist/infra/codex-paths.js +6 -67
  41. package/dist/infra/config-repo.js +59 -0
  42. package/dist/infra/fs-utils.js +8 -93
  43. package/dist/infra/lock-repo.js +4 -95
  44. package/dist/infra/providers-repo.js +8 -94
  45. package/dist/interaction/add-interactive.js +99 -0
  46. package/dist/interaction/interactive.js +289 -0
  47. package/dist/interaction/prompt.js +110 -0
  48. package/dist/runtime/codex-cli.js +130 -0
  49. package/dist/runtime/codex-probe.js +57 -0
  50. package/dist/runtime/types.js +2 -0
  51. package/dist/storage/auth-repo.js +160 -0
  52. package/dist/storage/backup-repo.js +210 -0
  53. package/dist/storage/codex-paths.js +71 -0
  54. package/dist/storage/config-repo.js +266 -0
  55. package/dist/storage/fs-utils.js +97 -0
  56. package/dist/storage/lock-repo.js +99 -0
  57. package/dist/storage/providers-repo.js +98 -0
  58. package/docs/Design/codex-switch-v0.0.5-design.md +32 -22
  59. package/docs/Design/codex-switch-v0.0.6-design.md +708 -0
  60. package/docs/Design/codex-switch-v0.0.7-design.md +862 -0
  61. package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +227 -89
  62. package/docs/PRD/codex-switch-prd-v0.1.0.md +200 -226
  63. package/docs/PRD/codex-switch-prd.md +1 -1
  64. package/docs/Reference/codex-config-reference.md +604 -0
  65. package/docs/Reference/codex-config-reference.zh-CN.md +633 -0
  66. package/docs/cli-usage.md +78 -29
  67. package/docs/codex-switch-technical-architecture.md +73 -4
  68. package/docs/test-report-0.0.5.md +163 -0
  69. package/docs/test-report-0.0.7.md +118 -0
  70. package/docs/testing.md +151 -0
  71. package/package.json +1 -1
@@ -121,29 +121,31 @@
121
121
  ```ts
122
122
  type ManagedProfileFields = {
123
123
  model: string;
124
- baseUrl: string;
124
+ modelProvider: string;
125
125
  };
126
126
  ```
127
127
 
128
128
  规则:
129
129
 
130
- - `model` 和 `base_url` 是当前唯一正式受管字段
131
- - 写命令创建 profile section 时,必须同时具备 `model` 和 `base_url`
130
+ - `model` 和 `model_provider` 是当前唯一正式受管 profile 字段
131
+ - 写命令创建 profile section 时,必须同时具备 `model` 和 `model_provider`
132
132
  - 未提供任一必需字段时,不允许创建新的受管 section
133
133
  - `apiKey` 继续只保存在 `providers.json`
134
134
  - `note`、`tags` 等 provider 管理字段不进入 `config.toml`
135
+ - `[model_providers.<name>].base_url` 继续由 Codex runtime config 承载,`codex-switch` 首版只读校验,不负责创建
135
136
 
136
137
  字段归属直接锁定如下:
137
138
 
138
- - `[profiles.<name>]`:`model`、`base_url`
139
- - `providers.json`:`profile`、`apiKey`、可选 `note`、`tags`
139
+ - `[profiles.<name>]`:`model`、`model_provider`
140
+ - `[model_providers.<name>]`:`base_url`
141
+ - `providers.json`:`profile`、`apiKey`、可选 `baseUrl`、`note`、`tags`
140
142
  - `auth.json`:当前激活 provider 对应的运行态认证内容
141
143
 
142
144
  设计原因:
143
145
 
144
- - 你的使用场景是“中转站”,`model` `base_url` 共同定义真正的上游路由
145
- - 如果 `base_url` 只放在 `providers.json`,而 `config.toml` profile section 不受控,切换后就可能出现 profile 名变了但请求仍落到旧 endpoint 的分裂状态
146
- - 因此 `0.0.5` 必须把 `base_url` `model` 一起视为 profile runtime projection 的正式字段
146
+ - 你的使用场景是“中转站”,真正的 runtime 路由由 `profiles.<name>.model_provider -> model_providers.<name>.base_url` 共同定义
147
+ - 如果只维护 provider 名称映射,而不校验 `model_provider` `model_providers` 的一致性,切换后就可能出现 profile 名变了但 runtime endpoint 仍落到错误上游的分裂状态
148
+ - 因此 `0.0.5` 需要把 `model_provider` 视为 profile runtime projection 的正式字段,并把 `base_url` 作为解析视图与一致性校验的一部分
147
149
 
148
150
  ### 5.2 `ManagedProfileView`
149
151
 
@@ -158,6 +160,7 @@ type ManagedProfileView = {
158
160
  isActive: boolean;
159
161
  linkedProviders: string[];
160
162
  model: string | null;
163
+ modelProvider: string | null;
161
164
  baseUrl: string | null;
162
165
  managedFields: string[];
163
166
  source: "managed" | "unmanaged" | "orphaned-reference";
@@ -171,8 +174,9 @@ type ManagedProfileView = {
171
174
  - `isActive`:是否为顶层 active profile
172
175
  - `linkedProviders`:引用该 profile 的 provider 名列表
173
176
  - `model`:可识别的受管 `model` 值;不存在或不受管时为 `null`
174
- - `baseUrl`:可识别的受管 `base_url` 值;不存在或不受管时为 `null`
175
- - `managedFields`:当前识别到并纳入正式受管的字段名数组;`0.0.5` 只可能为 `[]`、`["model"]`、`["base_url"]` `["model", "base_url"]`
177
+ - `modelProvider`:可识别的受管 `model_provider` 值;不存在或不受管时为 `null`
178
+ - `baseUrl`:通过 `model_provider -> model_providers.<name>.base_url` 解析出的 runtime endpoint;缺失时为 `null`
179
+ - `managedFields`:当前识别到并纳入正式受管的字段名数组;`0.0.5` 只可能为 `[]`、`["model"]`、`["model_provider"]` 或 `["model", "model_provider"]`
176
180
  - `source`:
177
181
  - `managed`:section 存在且被 provider 引用
178
182
  - `unmanaged`:section 存在但没有 provider 引用
@@ -287,7 +291,9 @@ patch 规则直接锁定:
287
291
 
288
292
  - 顶层 `profile = "..."`
289
293
  - `[profiles.<name>]`
294
+ - `[model_providers.<name>]`
290
295
  - `model = "..."`
296
+ - `model_provider = "..."`
291
297
  - `base_url = "..."`
292
298
 
293
299
  其余字段允许原样存在,但:
@@ -411,8 +417,9 @@ JSON 最小字段:
411
417
  "isActive": true,
412
418
  "linkedProviders": ["packycode"],
413
419
  "model": "gpt-5",
420
+ "modelProvider": "packycode",
414
421
  "baseUrl": "https://relay.example.com/v1",
415
- "managedFields": ["model", "base_url"],
422
+ "managedFields": ["model", "model_provider"],
416
423
  "source": "managed"
417
424
  }
418
425
  ]
@@ -453,6 +460,7 @@ codexs config list-profiles [--json] [--codex-dir <path>]
453
460
  - `isActive`
454
461
  - `linkedProviders`
455
462
  - `model`
463
+ - `modelProvider`
456
464
  - `baseUrl`
457
465
  - `source`
458
466
 
@@ -468,8 +476,9 @@ codexs config list-profiles [--json] [--codex-dir <path>]
468
476
  规则锁定如下:
469
477
 
470
478
  - 当目标 profile 已存在时,只建立 provider -> profile 映射
471
- - 当目标 profile 缺失时,只有同时传入 `--create-profile --model <name> --base-url <url>` 才允许创建 section
472
- - 只传 `--create-profile` 但缺少 `--model` 或 `--base-url`,返回 `MANAGED_PROFILE_FIELDS_MISSING`
479
+ - 当目标 profile 缺失时,只有同时传入 `--create-profile --model <name>` `config.toml` 中已存在同名 `[model_providers.<profile>]` section 时才允许创建 section
480
+ - 只传 `--create-profile` 但缺少 `--model`,返回 `MANAGED_PROFILE_FIELDS_MISSING`
481
+ - 若缺少同名 `model_providers` section 或其 `base_url`,返回 `PROFILE_NOT_FOUND` 或 `MANAGED_PROFILE_FIELDS_MISSING`
473
482
  - 不允许写出 provider 指向缺失 profile 的新状态
474
483
 
475
484
  ### 10.2 `edit <provider>`
@@ -477,10 +486,10 @@ codexs config list-profiles [--json] [--codex-dir <path>]
477
486
  规则锁定如下:
478
487
 
479
488
  - 改绑到已有 profile:更新 provider 映射并重新计算 active / shared 关系
480
- - 改绑到缺失 profile:只有 `--create-profile --model <name> --base-url <url>` 才允许
489
+ - 改绑到缺失 profile:只有 `--create-profile --model <name>` 且存在同名 `model_providers` runtime section 时才允许
481
490
  - 旧 section 不做隐式 rename
482
491
  - 旧 section 不做隐式 copy
483
- - 旧 section 不做隐式 `model` / `base_url` 迁移
492
+ - 旧 section 不做隐式 `model` / `model_provider` 迁移
484
493
 
485
494
  删除旧 section 的规则:
486
495
 
@@ -603,7 +612,7 @@ codexs config list-profiles [--json] [--codex-dir <path>]
603
612
  `MANAGED_PROFILE_FIELDS_MISSING`:
604
613
 
605
614
  - 需要创建新的受管 profile section,但缺少最小字段
606
- - `0.0.5` 至少用于缺少 `model` 或 `base_url`
615
+ - `0.0.5` 至少用于缺少 `model` 或 `model_provider`
607
616
 
608
617
  ### 12.3 明确不进入 `0.0.5` 的错误语义
609
618
 
@@ -723,7 +732,7 @@ codexs config list-profiles [--json] [--codex-dir <path>]
723
732
  - 新命令帮助文案
724
733
  - `config show` / `config list-profiles` 的文本渲染
725
734
  - `setup` 多候选目录选择交互
726
- - adopt / repair 辅助交互的最小提示
735
+ - adopt 辅助交互的最小提示
727
736
 
728
737
  ## 14. 关键流程时序
729
738
 
@@ -748,7 +757,7 @@ argv
748
757
  -> executeCommand("add")
749
758
  -> app/add-provider
750
759
  -> read providers.json + structured config
751
- -> validate create-profile + model/base_url preconditions
760
+ -> validate create-profile + model/model_provider preconditions
752
761
  -> domain/config.planProfileLifecycleOutcome
753
762
  -> infra/config-repo.planConfigMutation
754
763
  -> app/run-mutation
@@ -765,7 +774,7 @@ argv
765
774
  -> app/edit-provider
766
775
  -> load provider + structured config
767
776
  -> resolve new profile target
768
- -> create missing profile only when --create-profile --model --base-url is present
777
+ -> create missing profile only when --create-profile --model is present and matching model_provider runtime section already exists
769
778
  -> update provider mapping
770
779
  -> keep or delete old section based on shared/active rules
771
780
  -> single mutation transaction
@@ -822,7 +831,8 @@ argv
822
831
 
823
832
  - `doctor` 识别问题并给出问题码
824
833
  - `status` 给出浅层信号,不做静默修复
825
- - `setup` / `import --merge` 在交互模式下承接 adopt / repair
834
+ - `setup` 在交互模式下承接 adopt
835
+ - `import --merge` 保持显式失败,不为缺失 `model_providers` runtime section 做交互 repair
826
836
  - 非交互模式遇到不可自动收敛状态时失败,并返回明确原因
827
837
 
828
838
  ### 15.3 `doctor` 与 `status` 的责任差异
@@ -859,8 +869,8 @@ argv
859
869
  - `setup` 多候选目录 + TTY 选择
860
870
  - `setup` 无候选目录 + TTY 手动输入
861
871
  - `setup` 多候选目录 + 非交互失败 `CODEX_DIR_AMBIGUOUS`
862
- - `add --create-profile --model --base-url`
863
- - `edit --profile <missing> --create-profile --model --base-url`
872
+ - `add --create-profile --model` with existing same-named `[model_providers.*]`
873
+ - `edit --profile <missing> --create-profile --model` with existing same-named `[model_providers.*]`
864
874
  - `remove --switch-to`
865
875
 
866
876
  ### 16.3 Application 测试