@codexapi/codexclaude 2.0.25 → 2.0.27
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/CUSTOMIZATIONS.md +9 -9
- package/README.md +7 -7
- package/bin/codexclaude.js +22 -8
- package/codexclaude.md +27 -13
- package/package.json +5 -5
- package/scripts/install-safe-aliases.js +31 -13
package/CUSTOMIZATIONS.md
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
## Runtime
|
|
6
6
|
|
|
7
7
|
- Customer-facing app name: `MagnetAPI.org Codex CLI`
|
|
8
|
-
- Local launcher version: `2.0.
|
|
8
|
+
- Local launcher version: `2.0.27`
|
|
9
9
|
- Bundled official runtime dependency: `@openai/codex@0.145.0`
|
|
10
10
|
- Required install command: `npm install -g @codexapi/codexclaude@latest`
|
|
11
|
-
- Hosted fallback: `npm install -g https://codexapi.pro/downloads/codexapi-codexclaude-2.0.
|
|
11
|
+
- Hosted fallback: `npm install -g https://codexapi.pro/downloads/codexapi-codexclaude-2.0.27.tgz`
|
|
12
12
|
- Bundled runtime version is managed internally and must not be used for customer update prompts.
|
|
13
13
|
- Launcher update checks may call the CodexAPI.pro version endpoint and `@codexapi/codexclaude` npm metadata only.
|
|
14
14
|
- The launcher must never check `@openai/codex` npm metadata or OpenAI GitHub releases for update notices.
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
- Passes unknown commands directly to the bundled runtime after config is applied.
|
|
26
26
|
- Provides `codexclaude changelog` using the managed version endpoint.
|
|
27
27
|
- Does not expose separate `codexclaude status` or `codexclaude usage` commands; wallet information remains a compact pre-launch line.
|
|
28
|
-
- Version `2.0.
|
|
28
|
+
- Version `2.0.27` is forced by the backend minimum version and older clients must show an update-required message.
|
|
29
29
|
- Mandatory updates present `Upgrade Now` in an interactive terminal, invoke npm with an argument array and no shell interpolation, then relaunch the requested action automatically.
|
|
30
|
-
- The npm package exposes `codexclaude
|
|
31
|
-
- Global installation creates `claude` only when no existing command is present anywhere on `PATH`; native
|
|
30
|
+
- The npm package manifest exposes only `codexclaude`, preventing npm from colliding with a native `codex` or `claude` command before postinstall runs.
|
|
31
|
+
- Global installation creates optional `codex` and `claude` aliases only when no existing command is present in the npm prefix or anywhere on `PATH`; native clients must never be overwritten.
|
|
32
32
|
|
|
33
33
|
## Provider Config
|
|
34
34
|
|
|
@@ -46,13 +46,13 @@ The launcher writes a model provider named `codexapi`:
|
|
|
46
46
|
## Runtime Defaults
|
|
47
47
|
|
|
48
48
|
- Default model: `gpt-5.6` displayed as `GPT-5.6`
|
|
49
|
-
- Supported launcher choices: `gpt-5.6`, `gpt-5.6-sol-max`, `gpt-5.6-sol-ultra`, `gpt-5.6-sol`, `gpt-5.5`, `claude-opus-4-8`, `claude-sonnet-5`, `claude-fable-5`, and `gpt-5.6-terra`
|
|
49
|
+
- Supported launcher choices: `gpt-5.6`, `gpt-5.6-sol-max`, `gpt-5.6-sol-ultra`, `gpt-5.6-sol`, `gpt-5.5`, `claude-opus-5`, `claude-opus-4-8`, `claude-sonnet-5`, `claude-fable-5`, and `gpt-5.6-terra`
|
|
50
50
|
- Default reasoning effort displayed locally: `xhigh`; SOL Max and SOL Ultra retain their explicit premium labels.
|
|
51
51
|
- Reasoning hint sent in launcher env: model-specific
|
|
52
52
|
- Approval policy: `never`
|
|
53
53
|
- Sandbox mode: `danger-full-access`
|
|
54
54
|
- Display wording for permissions: `Full Access` in launcher-owned copy
|
|
55
|
-
- Local model catalog: `~/.codexclaude/model_catalog.json`; this keeps the native `/model` picker limited to the supported choices and prevents fallback metadata warnings for GPT-5.6 Terra, SOL, SOL Max, SOL Ultra, Opus 4.8, Sonnet 5, and Fable 5.
|
|
55
|
+
- Local model catalog: `~/.codexclaude/model_catalog.json`; this keeps the native `/model` picker limited to the supported choices and prevents fallback metadata warnings for GPT-5.6 Terra, SOL, SOL Max, SOL Ultra, Opus 5, Opus 4.8, Sonnet 5, and Fable 5.
|
|
56
56
|
- Service tier: omitted by default; `/fast` remains user-controlled and billed server-side when active.
|
|
57
57
|
- TUI status line: `model-with-reasoning`, `fast-mode`, `current-dir`
|
|
58
58
|
- Fable 5 stays visible to the user while the backend applies its server-managed route and billing policy.
|
|
@@ -65,7 +65,7 @@ Before launching the runtime, the launcher calls `/api/v1/wallet/status`, then `
|
|
|
65
65
|
Expected status line:
|
|
66
66
|
|
|
67
67
|
```text
|
|
68
|
-
MagnetAPI.org Codex CLI v2.0.
|
|
68
|
+
MagnetAPI.org Codex CLI v2.0.27 · gpt-5.6 xhigh · ~/project · Wallet $20.00
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
## Upgrade Checklist
|
|
@@ -84,7 +84,7 @@ When updating the bundled runtime:
|
|
|
84
84
|
10. Keep direct platform binary launch and do not fall back to the upstream npm wrapper.
|
|
85
85
|
11. Keep update checks limited to `/api/v1/codexclaude/version` and `@codexapi/codexclaude` npm metadata.
|
|
86
86
|
12. Keep the interactive `Upgrade Now` flow installing `@codexapi/codexclaude@latest` without a shell and relaunching automatically.
|
|
87
|
-
13. Keep `
|
|
87
|
+
13. Keep `codexclaude` as the only manifest-owned command and preserve the conditional, non-overwriting `codex` and `claude` postinstall aliases.
|
|
88
88
|
14. Keep the managed `MODELS` map and local model catalog, including Terra, SOL Max, and SOL Ultra.
|
|
89
89
|
15. Keep bearer username auth and the `X-CodexAPI-*` headers.
|
|
90
90
|
16. Update `README.md`, `CUSTOMIZATIONS.md`, and `codexclaude.md`.
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# codexclaude
|
|
2
2
|
|
|
3
|
-
`codexclaude` installs the MagnetAPI.org Codex CLI for customers who want one coding CLI that can use GPT-5.6, GPT-5.6 Terra, GPT-5.6 SOL, GPT-5.6 SOL Max, GPT-5.6 SOL Ultra, ChatGPT-5.5, Opus 4.8, Sonnet 5, or Fable 5 against the same Token Wallet.
|
|
3
|
+
`codexclaude` installs the MagnetAPI.org Codex CLI for customers who want one coding CLI that can use GPT-5.6, GPT-5.6 Terra, GPT-5.6 SOL, GPT-5.6 SOL Max, GPT-5.6 SOL Ultra, ChatGPT-5.5, Opus 5, Opus 4.8, Sonnet 5, or Fable 5 against the same Token Wallet.
|
|
4
4
|
|
|
5
|
-
Version `2.0.
|
|
5
|
+
Version `2.0.27` adds Opus 5 with complete local model metadata while retaining the collision-safe updater introduced in `2.0.26`. It bundles official Codex runtime dependency `@openai/codex@0.145.0`, launches the platform-native runtime binary directly, disables upstream OpenAI update prompts, and applies account, wallet, model, Full Access, GPT-5.6/xhigh defaults, and managed model metadata before each coding session starts.
|
|
6
6
|
|
|
7
7
|
## Install Or Update
|
|
8
8
|
|
|
@@ -16,7 +16,7 @@ This does not delete local session history. The update replaces the `codexclaude
|
|
|
16
16
|
|
|
17
17
|
The launcher checks CodexAPI.pro's managed version endpoint and the `@codexapi/codexclaude` npm package metadata only. It must never check `@openai/codex` npm metadata or OpenAI GitHub releases for customer update prompts.
|
|
18
18
|
|
|
19
|
-
Version `2.0.
|
|
19
|
+
Version `2.0.27` is enforced as the minimum supported version. A compatible older launcher presents `Upgrade Now`; selecting it installs `@codexapi/codexclaude@latest` and relaunches the requested action automatically. Non-interactive terminals print the same npm command instead of hanging for input.
|
|
20
20
|
|
|
21
21
|
## First Login
|
|
22
22
|
|
|
@@ -44,11 +44,11 @@ Switch model:
|
|
|
44
44
|
codexclaude model
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
Available model labels are `GPT-5.6`, `GPT-5.6 SOL Max`, `GPT-5.6 SOL Ultra`, `GPT-5.6 SOL`, `ChatGPT-5.5`, `Opus 4.8`, `Sonnet 5`, `Fable 5`, and `GPT-5.6 Terra`. All models use a Responses-compatible endpoint and the same customer Token Wallet.
|
|
47
|
+
Available model labels are `GPT-5.6`, `GPT-5.6 SOL Max`, `GPT-5.6 SOL Ultra`, `GPT-5.6 SOL`, `ChatGPT-5.5`, `Opus 5`, `Opus 4.8`, `Sonnet 5`, `Fable 5`, and `GPT-5.6 Terra`. All models use a Responses-compatible endpoint and the same customer Token Wallet.
|
|
48
48
|
|
|
49
49
|
## Launch Commands
|
|
50
50
|
|
|
51
|
-
The
|
|
51
|
+
The npm package owns only the collision-free `codexclaude` command. During a global install, its postinstall step creates optional `codex` and `claude` aliases only when those command names are unused. Native Codex CLI and Claude Code commands are always preserved. This avoids npm `EEXIST` failures and never requires `--force`.
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
codexclaude
|
|
@@ -67,13 +67,13 @@ codexclaude changelog
|
|
|
67
67
|
Before launching the coding runtime, the app prints a compact status line like:
|
|
68
68
|
|
|
69
69
|
```text
|
|
70
|
-
MagnetAPI.org Codex CLI v2.0.
|
|
70
|
+
MagnetAPI.org Codex CLI v2.0.27 · gpt-5.6 xhigh · ~/project · Wallet $20.00
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
## Preserved Customizations
|
|
74
74
|
|
|
75
75
|
- Dashboard Username or Email Address plus password login for CodexAPI.pro, ChatPlus.chat, MyAPI.world, and MagnetAPI.org.
|
|
76
|
-
- GPT-5.6, GPT-5.6 Terra, GPT-5.6 SOL Max, GPT-5.6 SOL Ultra, GPT-5.6 SOL, ChatGPT-5.5, Opus 4.8, Sonnet 5, or Fable 5 model selection, with GPT-5.6/xhigh as the default.
|
|
76
|
+
- GPT-5.6, GPT-5.6 Terra, GPT-5.6 SOL Max, GPT-5.6 SOL Ultra, GPT-5.6 SOL, ChatGPT-5.5, Opus 5, Opus 4.8, Sonnet 5, or Fable 5 model selection, with GPT-5.6/xhigh as the default.
|
|
77
77
|
- Service-specific Responses-compatible provider for the dashboard account that logged in.
|
|
78
78
|
- Full Access defaults: approval policy `never` and sandbox mode `danger-full-access`.
|
|
79
79
|
- Model-specific visible reasoning in the local UI while the API server keeps upstream runtime effort server-managed.
|
package/bin/codexclaude.js
CHANGED
|
@@ -8,11 +8,11 @@ import path from "node:path";
|
|
|
8
8
|
import readline from "node:readline/promises";
|
|
9
9
|
import { stdin as input, stdout as output } from "node:process";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
|
-
import {
|
|
11
|
+
import { installSafeCommandAliases } from "../scripts/install-safe-aliases.js";
|
|
12
12
|
|
|
13
13
|
const require = createRequire(import.meta.url);
|
|
14
14
|
|
|
15
|
-
const APP_VERSION = "2.0.
|
|
15
|
+
const APP_VERSION = "2.0.27";
|
|
16
16
|
const CODEX_VERSION = "0.145.0";
|
|
17
17
|
const APP_DISPLAY_NAME = "MagnetAPI.org Codex CLI";
|
|
18
18
|
const DEFAULT_MODEL_ID = "gpt-5.6";
|
|
@@ -106,26 +106,31 @@ const MODELS = {
|
|
|
106
106
|
label: "ChatGPT-5.5",
|
|
107
107
|
aliases: ["5", "gpt-5.5", "chatgpt-5.5"],
|
|
108
108
|
},
|
|
109
|
+
"claude-opus-5": {
|
|
110
|
+
id: "claude-opus-5",
|
|
111
|
+
label: "Opus 5",
|
|
112
|
+
aliases: ["6", "opus", "opus-5", "claude", "claude-opus-5"],
|
|
113
|
+
},
|
|
109
114
|
"claude-opus-4-8": {
|
|
110
115
|
id: "claude-opus-4-8",
|
|
111
116
|
label: "Opus 4.8",
|
|
112
|
-
aliases: ["
|
|
117
|
+
aliases: ["7", "opus-4.8", "opus-4.7", "claude-opus-4-8", "claude-opus-4-7"],
|
|
113
118
|
},
|
|
114
119
|
"claude-sonnet-5": {
|
|
115
120
|
id: "claude-sonnet-5",
|
|
116
121
|
label: "Sonnet 5",
|
|
117
|
-
aliases: ["
|
|
122
|
+
aliases: ["8", "sonnet", "sonnet-5", "sonnet-4.6", "sonnet-4-6", "claude-sonnet-5", "claude-sonnet-4-6", "claude-sonnet-4.6"],
|
|
118
123
|
},
|
|
119
124
|
"claude-fable-5": {
|
|
120
125
|
id: "claude-fable-5",
|
|
121
126
|
label: "Fable 5",
|
|
122
|
-
aliases: ["
|
|
127
|
+
aliases: ["9", "fable", "fable-5", "fabel", "fabel-5", "claude-fable-5", "claude-fabel-5"],
|
|
123
128
|
premium: true,
|
|
124
129
|
},
|
|
125
130
|
"gpt-5.6-terra": {
|
|
126
131
|
id: "gpt-5.6-terra",
|
|
127
132
|
label: "GPT-5.6 Terra",
|
|
128
|
-
aliases: ["
|
|
133
|
+
aliases: ["10", "terra", "gpt-5.6-terra", "gpt56-terra"],
|
|
129
134
|
reasoningEffort: "xhigh",
|
|
130
135
|
},
|
|
131
136
|
};
|
|
@@ -186,7 +191,7 @@ ${APP_DISPLAY_NAME} v${APP_VERSION}
|
|
|
186
191
|
|
|
187
192
|
Commands:
|
|
188
193
|
codexclaude login Login with dashboard username/email and password
|
|
189
|
-
codexclaude model Select GPT-5.6, Terra, SOL modes, Opus 4.8, Sonnet 5, or Fable 5
|
|
194
|
+
codexclaude model Select GPT-5.6, Terra, SOL modes, Opus 5, Opus 4.8, Sonnet 5, or Fable 5
|
|
190
195
|
codexclaude changelog Show the latest CodexAPI.pro launcher changes
|
|
191
196
|
codexclaude setup Rewrite ~/.codex/config.toml with Full Access defaults
|
|
192
197
|
codexclaude start Start ${APP_DISPLAY_NAME} with --search
|
|
@@ -799,6 +804,9 @@ function modelCatalogDescription(modelId) {
|
|
|
799
804
|
if (modelId === "gpt-5.6-terra") {
|
|
800
805
|
return "GPT-5.6 Terra coding route with local coding tools and wallet billing.";
|
|
801
806
|
}
|
|
807
|
+
if (modelId === "claude-opus-5") {
|
|
808
|
+
return "Opus 5 coding route with local coding tools and wallet billing.";
|
|
809
|
+
}
|
|
802
810
|
if (modelId === "claude-opus-4-8") {
|
|
803
811
|
return "Opus 4.8 coding route with local coding tools and wallet billing.";
|
|
804
812
|
}
|
|
@@ -1029,6 +1037,9 @@ function modelStatusName(model) {
|
|
|
1029
1037
|
if (model === "gpt-5.6-terra") {
|
|
1030
1038
|
return "gpt-5.6-terra";
|
|
1031
1039
|
}
|
|
1040
|
+
if (model === "claude-opus-5") {
|
|
1041
|
+
return "opus-5";
|
|
1042
|
+
}
|
|
1032
1043
|
if (model === "claude-opus-4-8") {
|
|
1033
1044
|
return "opus-4.8";
|
|
1034
1045
|
}
|
|
@@ -1050,6 +1061,9 @@ function normalizeConfig(config) {
|
|
|
1050
1061
|
return config;
|
|
1051
1062
|
}
|
|
1052
1063
|
const normalized = { ...config };
|
|
1064
|
+
if (["opus", "opus-5", "claude"].includes(normalized.model)) {
|
|
1065
|
+
normalized.model = "claude-opus-5";
|
|
1066
|
+
}
|
|
1053
1067
|
if (normalized.model === "claude-opus-4-7") {
|
|
1054
1068
|
normalized.model = "claude-opus-4-8";
|
|
1055
1069
|
}
|
|
@@ -1222,7 +1236,7 @@ function ensureSafeCommandAliases() {
|
|
|
1222
1236
|
if (!prefix) {
|
|
1223
1237
|
return;
|
|
1224
1238
|
}
|
|
1225
|
-
|
|
1239
|
+
installSafeCommandAliases({
|
|
1226
1240
|
isGlobalInstall: true,
|
|
1227
1241
|
prefix,
|
|
1228
1242
|
quiet: true,
|
package/codexclaude.md
CHANGED
|
@@ -5,12 +5,12 @@ This file is the durable handoff for the `@codexapi/codexclaude` package in `/ro
|
|
|
5
5
|
## Current Release
|
|
6
6
|
|
|
7
7
|
- Package name: `@codexapi/codexclaude`
|
|
8
|
-
- Launcher version: `2.0.
|
|
8
|
+
- Launcher version: `2.0.27`
|
|
9
9
|
- Customer-facing app name: `MagnetAPI.org Codex CLI`
|
|
10
10
|
- Bundled runtime dependency: `@openai/codex@0.145.0`
|
|
11
11
|
- Required install command: `npm install -g @codexapi/codexclaude@latest`
|
|
12
|
-
- Hosted fallback: `npm install -g https://codexapi.pro/downloads/codexapi-codexclaude-2.0.
|
|
13
|
-
- Backend minimum version: `2.0.
|
|
12
|
+
- Hosted fallback: `npm install -g https://codexapi.pro/downloads/codexapi-codexclaude-2.0.27.tgz`
|
|
13
|
+
- Backend minimum version: `2.0.27`
|
|
14
14
|
- Default visible model: `GPT-5.6`
|
|
15
15
|
- Default model slug: `gpt-5.6`
|
|
16
16
|
- Default visible reasoning effort: `xhigh`; premium SOL Max and SOL Ultra retain their explicit `max` and `ultra` labels.
|
|
@@ -25,13 +25,13 @@ This file is the durable handoff for the `@codexapi/codexclaude` package in `/ro
|
|
|
25
25
|
The launcher must present itself as:
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
|
-
MagnetAPI.org Codex CLI v2.0.
|
|
28
|
+
MagnetAPI.org Codex CLI v2.0.27
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
Normal pre-launch status should look like:
|
|
32
32
|
|
|
33
33
|
```text
|
|
34
|
-
MagnetAPI.org Codex CLI v2.0.
|
|
34
|
+
MagnetAPI.org Codex CLI v2.0.27 · gpt-5.6 xhigh · ~/project · Wallet $20.00
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Do not show OpenAI update notices, OpenAI npm install commands, OpenAI release links, or the upstream runtime version in launcher-owned output. The package still depends on the official runtime internally, but the customer update surface is ours.
|
|
@@ -43,6 +43,7 @@ The launcher command `codexclaude model` must list these customer-visible models
|
|
|
43
43
|
- `gpt-5.6-sol-ultra` displayed as `GPT-5.6 SOL Ultra`
|
|
44
44
|
- `gpt-5.6-sol` displayed as `GPT-5.6 SOL`
|
|
45
45
|
- `gpt-5.5` displayed as `ChatGPT-5.5`
|
|
46
|
+
- `claude-opus-5` displayed as `Opus 5`
|
|
46
47
|
- `claude-opus-4-8` displayed as `Opus 4.8`
|
|
47
48
|
- `claude-sonnet-5` displayed as `Sonnet 5`
|
|
48
49
|
- `claude-fable-5` displayed as `Fable 5`
|
|
@@ -57,9 +58,9 @@ GPT-5.6 must be the default when a new config is created or a legacy config cont
|
|
|
57
58
|
- `https://codexapi.pro/api/v1/codexclaude/version`
|
|
58
59
|
- `https://registry.npmjs.org/@codexapi%2Fcodexclaude/latest`
|
|
59
60
|
|
|
60
|
-
It must not check `@openai/codex` npm metadata, OpenAI GitHub releases, or any upstream OpenAI update endpoint. Version `2.0.
|
|
61
|
+
It must not check `@openai/codex` npm metadata, OpenAI GitHub releases, or any upstream OpenAI update endpoint. Version `2.0.27` is both the enforced minimum and current latest release. Compatible older launchers offer an interactive `Upgrade Now` action that invokes `npm install -g @codexapi/codexclaude@latest` without shell interpolation. Non-interactive terminals print the exact update command and exit instead of waiting for input. After a successful interactive update, the launcher starts the requested action again automatically.
|
|
61
62
|
|
|
62
|
-
The npm package owns `codexclaude
|
|
63
|
+
The npm package manifest owns only `codexclaude`. This is deliberate: npm creates manifest binaries before postinstall, so claiming `codex` there causes an `EEXIST` upgrade failure on machines with native Codex CLI. During a global installation, postinstall may create optional `codex` and `claude` aliases only when neither the target npm prefix nor any directory on `PATH` already contains the command. Existing native clients are preserved and no install path requires `--force`.
|
|
63
64
|
|
|
64
65
|
The launcher writes `check_for_update_on_startup = false` and removes `~/.codex/version.json` so the bundled runtime does not display stale upstream update prompts. The launcher also resolves the platform-native runtime binary directly from the optional package (`@openai/codex-linux-x64`, `@openai/codex-darwin-arm64`, and so on). Do not fall back to the upstream npm wrapper, because that wrapper can re-enable upstream managed update behavior.
|
|
65
66
|
|
|
@@ -87,7 +88,7 @@ base_url = "<service Responses URL>"
|
|
|
87
88
|
experimental_bearer_token = "<customer System Token/API username>"
|
|
88
89
|
wire_api = "responses"
|
|
89
90
|
supports_websockets = false
|
|
90
|
-
http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.
|
|
91
|
+
http_headers = { "X-CodexAPI-Client" = "codexclaude", "X-CodexAPI-Client-Version" = "2.0.27", "X-CodexAPI-Selected-Model" = "<selected model>" }
|
|
91
92
|
|
|
92
93
|
[tui]
|
|
93
94
|
status_line = ["model-with-reasoning", "fast-mode", "current-dir"]
|
|
@@ -136,7 +137,7 @@ When updating the bundled runtime dependency:
|
|
|
136
137
|
9. Preserve direct platform-native binary launch.
|
|
137
138
|
10. Preserve update checks through our version endpoint and `@codexapi/codexclaude` npm metadata only.
|
|
138
139
|
11. Preserve the interactive `Upgrade Now` flow, shell-free npm invocation, and automatic relaunch.
|
|
139
|
-
12. Preserve `
|
|
140
|
+
12. Preserve `codexclaude` as the only manifest-owned binary and the conditional native-client-safe `codex` and `claude` postinstall aliases.
|
|
140
141
|
13. Preserve deletion of `~/.codex/version.json` and `check_for_update_on_startup = false`.
|
|
141
142
|
14. Update customer setup scripts on CodexAPI.pro, ChatPlus.chat, MyAPI.world, MagnetAPI.org, and VIP pages to use the current release.
|
|
142
143
|
15. Update backend `CODEXCLAUDE_LATEST_VERSION`, `CODEXCLAUDE_MIN_VERSION`, and hosted tarball URL.
|
|
@@ -159,13 +160,13 @@ tmp_home="$(mktemp -d)"
|
|
|
159
160
|
mkdir -p "$tmp_home/.codexclaude"
|
|
160
161
|
cat > "$tmp_home/.codexclaude/config.json" <<'JSON'
|
|
161
162
|
{
|
|
162
|
-
"version": "2.0.
|
|
163
|
+
"version": "2.0.27",
|
|
163
164
|
"serviceId": "codexapi",
|
|
164
165
|
"serviceLabel": "CodexAPI.pro",
|
|
165
166
|
"apiOrigin": "https://codexapi.pro",
|
|
166
167
|
"username": "test-token",
|
|
167
168
|
"dashboardEmail": null,
|
|
168
|
-
"model": "claude-opus-
|
|
169
|
+
"model": "claude-opus-5",
|
|
169
170
|
"loggedInAt": "2026-07-10T00:00:00.000Z"
|
|
170
171
|
}
|
|
171
172
|
JSON
|
|
@@ -188,6 +189,7 @@ Verify the generated model catalog contains only:
|
|
|
188
189
|
- `gpt-5.6-sol-ultra`
|
|
189
190
|
- `gpt-5.6-sol`
|
|
190
191
|
- `gpt-5.5`
|
|
192
|
+
- `claude-opus-5`
|
|
191
193
|
- `claude-opus-4-8`
|
|
192
194
|
- `claude-sonnet-5`
|
|
193
195
|
- `claude-fable-5`
|
|
@@ -197,10 +199,22 @@ After packaging, copy the tarball to the public downloads directories, restart t
|
|
|
197
199
|
|
|
198
200
|
```bash
|
|
199
201
|
curl -fsS "https://codexapi.pro/api/v1/codexclaude/version?current=2.0.17"
|
|
200
|
-
curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.
|
|
202
|
+
curl -fsSI "https://codexapi.pro/downloads/codexapi-codexclaude-2.0.27.tgz"
|
|
201
203
|
```
|
|
202
204
|
|
|
203
|
-
The version endpoint must report `latestVersion = 2.0.
|
|
205
|
+
The version endpoint must report `latestVersion = 2.0.27`, `minimumVersion = 2.0.27`, and `updateRequired = true` for every older client.
|
|
206
|
+
|
|
207
|
+
## Version 2.0.27 Changes
|
|
208
|
+
|
|
209
|
+
- Added Opus 5 as a complete managed model with image, search, tool, and reasoning metadata.
|
|
210
|
+
- Made `2.0.27` mandatory so every client receives the matching Opus 5 model catalog.
|
|
211
|
+
- Preserved collision-safe upgrades and existing native Codex CLI or Claude Code commands.
|
|
212
|
+
|
|
213
|
+
## Version 2.0.26 Changes
|
|
214
|
+
|
|
215
|
+
- Fixed npm `EEXIST` upgrades on systems that already have native Codex CLI installed.
|
|
216
|
+
- Limited package-manifest ownership to `codexclaude`.
|
|
217
|
+
- Kept optional `codex` and `claude` convenience aliases without replacing native clients.
|
|
204
218
|
|
|
205
219
|
## Version 2.0.25 Changes
|
|
206
220
|
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codexapi/codexclaude",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "MagnetAPI.org Codex CLI for GPT-5.6, Opus 4.8, Sonnet 5, and Fable 5.",
|
|
3
|
+
"version": "2.0.27",
|
|
4
|
+
"description": "MagnetAPI.org Codex CLI for GPT-5.6, Opus 5, Opus 4.8, Sonnet 5, and Fable 5.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"codexclaude": "bin/codexclaude.js"
|
|
9
|
-
"codex": "bin/codexclaude.js"
|
|
8
|
+
"codexclaude": "bin/codexclaude.js"
|
|
10
9
|
},
|
|
11
10
|
"files": [
|
|
12
11
|
"bin",
|
|
@@ -16,7 +15,8 @@
|
|
|
16
15
|
"codexclaude.md"
|
|
17
16
|
],
|
|
18
17
|
"scripts": {
|
|
19
|
-
"postinstall": "node scripts/install-safe-aliases.js"
|
|
18
|
+
"postinstall": "node scripts/install-safe-aliases.js",
|
|
19
|
+
"test": "node --test test/*.test.js"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
@@ -14,7 +14,25 @@ import { fileURLToPath } from "node:url";
|
|
|
14
14
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
15
|
const launcherPath = path.join(packageRoot, "bin", "codexclaude.js");
|
|
16
16
|
|
|
17
|
+
export function installSafeCommandAliases(options = {}) {
|
|
18
|
+
return {
|
|
19
|
+
status: "complete",
|
|
20
|
+
aliases: {
|
|
21
|
+
codex: installSafeAlias("codex", options),
|
|
22
|
+
claude: installSafeAlias("claude", options),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function installSafeCodexAlias(options = {}) {
|
|
28
|
+
return installSafeAlias("codex", options);
|
|
29
|
+
}
|
|
30
|
+
|
|
17
31
|
export function installSafeClaudeAlias(options = {}) {
|
|
32
|
+
return installSafeAlias("claude", options);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function installSafeAlias(command, options = {}) {
|
|
18
36
|
const isGlobalInstall =
|
|
19
37
|
options.isGlobalInstall ??
|
|
20
38
|
String(process.env.npm_config_global || "").toLowerCase() === "true";
|
|
@@ -26,20 +44,20 @@ export function installSafeClaudeAlias(options = {}) {
|
|
|
26
44
|
const prefix = String(options.prefix || process.env.npm_config_prefix || "").trim();
|
|
27
45
|
if (!prefix) {
|
|
28
46
|
if (!quiet) {
|
|
29
|
-
console.warn(
|
|
47
|
+
console.warn(`codexclaude: skipped the optional ${command} alias because npm did not provide its global prefix.`);
|
|
30
48
|
}
|
|
31
49
|
return { status: "missing-prefix" };
|
|
32
50
|
}
|
|
33
51
|
|
|
34
52
|
const binDir = process.platform === "win32" ? prefix : path.join(prefix, "bin");
|
|
35
|
-
const aliasPaths =
|
|
36
|
-
const existingCommand = findCommandOnPath(
|
|
53
|
+
const aliasPaths = commandAliasPaths(binDir, command);
|
|
54
|
+
const existingCommand = findCommandOnPath(command, aliasPaths);
|
|
37
55
|
const existingAlias = aliasPaths.find((candidate) => existsSync(candidate));
|
|
38
56
|
|
|
39
57
|
if (existingCommand || existingAlias) {
|
|
40
58
|
const preserved = existingCommand || existingAlias;
|
|
41
59
|
if (!quiet) {
|
|
42
|
-
console.log(`codexclaude: preserved the existing
|
|
60
|
+
console.log(`codexclaude: preserved the existing ${command} command at ${preserved}.`);
|
|
43
61
|
}
|
|
44
62
|
return { status: "preserved", path: preserved };
|
|
45
63
|
}
|
|
@@ -53,27 +71,27 @@ export function installSafeClaudeAlias(options = {}) {
|
|
|
53
71
|
chmodSync(aliasPaths[0], 0o755);
|
|
54
72
|
}
|
|
55
73
|
if (!quiet) {
|
|
56
|
-
console.log(
|
|
74
|
+
console.log(`codexclaude: installed the optional ${command} launch alias.`);
|
|
57
75
|
}
|
|
58
76
|
return { status: "installed", paths: aliasPaths.filter((candidate) => existsSync(candidate)) };
|
|
59
77
|
} catch (error) {
|
|
60
78
|
if (!quiet) {
|
|
61
|
-
console.warn(`codexclaude: could not install the optional
|
|
79
|
+
console.warn(`codexclaude: could not install the optional ${command} alias (${error.message}).`);
|
|
62
80
|
}
|
|
63
81
|
return { status: "failed", error: error.message };
|
|
64
82
|
}
|
|
65
83
|
}
|
|
66
84
|
|
|
67
|
-
function
|
|
85
|
+
function commandAliasPaths(directory, command) {
|
|
68
86
|
if (process.platform === "win32") {
|
|
69
87
|
return [
|
|
70
|
-
path.join(directory,
|
|
71
|
-
path.join(directory,
|
|
72
|
-
path.join(directory,
|
|
73
|
-
path.join(directory,
|
|
88
|
+
path.join(directory, command),
|
|
89
|
+
path.join(directory, `${command}.cmd`),
|
|
90
|
+
path.join(directory, `${command}.ps1`),
|
|
91
|
+
path.join(directory, `${command}.exe`),
|
|
74
92
|
];
|
|
75
93
|
}
|
|
76
|
-
return [path.join(directory,
|
|
94
|
+
return [path.join(directory, command)];
|
|
77
95
|
}
|
|
78
96
|
|
|
79
97
|
function findCommandOnPath(command, ignoredPaths) {
|
|
@@ -147,5 +165,5 @@ function isTruthy(value) {
|
|
|
147
165
|
}
|
|
148
166
|
|
|
149
167
|
if (path.resolve(process.argv[1] || "") === fileURLToPath(import.meta.url)) {
|
|
150
|
-
|
|
168
|
+
installSafeCommandAliases();
|
|
151
169
|
}
|