cdx-manager 0.7.5 → 0.7.6

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.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CDX Manager
2
2
 
3
- [![License](https://img.shields.io/badge/license-MIT-4C8BF5)](LICENSE) ![Version](https://img.shields.io/badge/version-v0.7.5-4C8BF5) ![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python&logoColor=white)
3
+ [![License](https://img.shields.io/badge/license-MIT-4C8BF5)](LICENSE) ![Version](https://img.shields.io/badge/version-v0.7.6-4C8BF5) ![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python&logoColor=white)
4
4
 
5
5
  **Run multiple Codex, Claude, Antigravity, and Ollama sessions from one terminal. Switch between accounts instantly.**
6
6
 
@@ -136,7 +136,7 @@ For a specific version:
136
136
 
137
137
  ```bash
138
138
  curl -fsSL https://raw.githubusercontent.com/AlexAgo83/cdx-manager/main/install.sh -o install.sh
139
- CDX_VERSION=v0.7.5 sh install.sh
139
+ CDX_VERSION=v0.7.6 sh install.sh
140
140
  ```
141
141
 
142
142
  From source:
@@ -0,0 +1,37 @@
1
+ # Changelog (`0.7.5 -> 0.7.6`)
2
+
3
+ Release date: 2026-06-05
4
+
5
+ ## Claude Launches
6
+
7
+ - Normalized Claude model names before invoking Claude Code so persisted API-style IDs such as `claude-sonnet-4-5-20250929` launch as the Claude Code CLI form `claude-sonnet-4-5`.
8
+ - Added compatibility for marketing-style Claude model values such as `sonnet-4.5` while preserving unknown custom model values unchanged.
9
+ - Applied the same Claude model normalization to both interactive launches and headless `cdx run` launches.
10
+
11
+ ## Release Integrity
12
+
13
+ - Added official standalone release archive checksums for `v0.7.5` so verified installer upgrades can resolve the previous release.
14
+ - Added regression coverage for the `v0.7.5` release checksum metadata.
15
+
16
+ ## CI Hardening
17
+
18
+ - Restricted GitHub Actions workflow token permissions for the CI workflow.
19
+
20
+ ## Coverage and Tests
21
+
22
+ - Added regression coverage for Claude CLI model normalization in runtime launch specs and interactive CLI launch behavior.
23
+ - Increased the Python test suite to 285 tests.
24
+
25
+ ## Release Metadata
26
+
27
+ - Updated package metadata, CLI version output, README badge, pinned installer example, and release changelog to `v0.7.6`.
28
+
29
+ ## Validation and Regression Evidence
30
+
31
+ - `npm run lint`
32
+ - `npm test`
33
+ - `node bin/cdx.js --version`
34
+ - `npm audit --omit=dev --json`
35
+ - `sh -n install.sh`
36
+ - PowerShell parser check for `install.ps1`
37
+ - `python3 -m logics_manager lint --require-status`
@@ -48,6 +48,10 @@
48
48
  "v0.7.4": {
49
49
  "github_tarball_sha256": "02b399899e611300ddf367bfb8c22ad57b499e94265e50256c8afe3f4bd73851",
50
50
  "github_zip_sha256": "87043d49cdd50dcd7d51349984ea4abfb1a2ff50f2eab69c75a421bedd2f2fe8"
51
+ },
52
+ "v0.7.5": {
53
+ "github_tarball_sha256": "18f5f6230bb5704913a90cfe2bfc5f55599c6ca0813bfd9f4bc97fc9f19e074a",
54
+ "github_zip_sha256": "cafd400c65c255aa9569853ec9d1cc80cf691ff849660496779334ee7abf71b4"
51
55
  }
52
56
  }
53
57
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdx-manager",
3
- "version": "0.7.5",
3
+ "version": "0.7.6",
4
4
  "description": "Terminal session manager for Codex and Claude accounts.",
5
5
  "license": "MIT",
6
6
  "author": "Alexandre Agostini",
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cdx-manager"
7
- version = "0.7.5"
7
+ version = "0.7.6"
8
8
  description = "Terminal session manager for Codex and Claude accounts."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
package/src/cli.py CHANGED
@@ -60,7 +60,7 @@ from .status_view import (
60
60
  )
61
61
  from .update_check import check_for_update
62
62
 
63
- VERSION = "0.7.5"
63
+ VERSION = "0.7.6"
64
64
 
65
65
 
66
66
  # ---------------------------------------------------------------------------
@@ -40,6 +40,14 @@ HEADLESS_CODEX_PERMISSION_ARGS = {
40
40
  "full": ["--dangerously-bypass-approvals-and-sandbox"],
41
41
  }
42
42
  REDACTED_PROMPT_ARG = "[prompt redacted]"
43
+ CLAUDE_CLI_MODEL_ALIASES = {
44
+ "claude-sonnet": "sonnet",
45
+ "claude-opus": "opus",
46
+ "claude-haiku": "haiku",
47
+ "sonnet-latest": "sonnet",
48
+ "opus-latest": "opus",
49
+ "haiku-latest": "haiku",
50
+ }
43
51
 
44
52
 
45
53
  def _home_env_overrides(auth_home):
@@ -207,6 +215,26 @@ def _normalize_reasoning_effort(reasoning_effort=None, power=None, usage="Unsupp
207
215
  }
208
216
 
209
217
 
218
+ def _claude_cli_model(model):
219
+ if not model:
220
+ return model
221
+ raw = str(model).strip()
222
+ normalized = raw.lower().replace("_", "-")
223
+ if normalized in CLAUDE_CLI_MODEL_ALIASES:
224
+ return CLAUDE_CLI_MODEL_ALIASES[normalized]
225
+
226
+ marketing = re.fullmatch(r"(?:claude-)?(sonnet|opus|haiku)-(\d+)(?:[.-](\d+))?", normalized)
227
+ if marketing:
228
+ family, major, minor = marketing.groups()
229
+ return f"claude-{family}-{major}-{minor}" if minor else family
230
+
231
+ dated = re.fullmatch(r"(claude-(?:sonnet|opus|haiku)-4(?:-\d+)*)-\d{8}", normalized)
232
+ if dated:
233
+ return dated.group(1)
234
+
235
+ return raw
236
+
237
+
210
238
  def _launch_config_args(session):
211
239
  launch = session.get("launch") or {}
212
240
  args = []
@@ -317,7 +345,7 @@ def _build_launch_spec(session, cwd=None, env_override=None, initial_prompt=None
317
345
  launch = session.get("launch") or {}
318
346
  args = ["--name", session["name"]]
319
347
  if launch.get("model"):
320
- args += ["--model", launch["model"]]
348
+ args += ["--model", _claude_cli_model(launch["model"])]
321
349
  args += _launch_config_args(session)
322
350
  if initial_prompt:
323
351
  args.append(initial_prompt)
@@ -402,7 +430,7 @@ def _build_headless_launch_spec(session, cwd=None, env_override=None, initial_pr
402
430
  if session["provider"] == PROVIDER_CLAUDE:
403
431
  args = ["--print", "--output-format", "json", "--name", session["name"]]
404
432
  if model:
405
- args += ["--model", model]
433
+ args += ["--model", _claude_cli_model(model)]
406
434
  args += _launch_config_args(session)
407
435
  if initial_prompt:
408
436
  args.append(initial_prompt)