cdx-manager 0.7.4 → 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.4-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.4 sh install.sh
139
+ CDX_VERSION=v0.7.6 sh install.sh
140
140
  ```
141
141
 
142
142
  From source:
@@ -291,7 +291,7 @@ cdx power all default
291
291
  cdx model provider:ollama default
292
292
  ```
293
293
 
294
- `--power` maps to Codex `model_reasoning_effort` and Claude `--effort`. `--permission` maps to provider-native permission flags. `--fast on` uses low effort when no explicit power is set. `--priority` is a 0..100 selector preference used as a tie-breaker after readiness and availability. `--rtk on` injects a launch instruction that encourages assistants to use RTK (`rtk <command>`) for noisy terminal commands when RTK is available, while keeping raw commands for exact output.
294
+ `--model` maps to Codex `--model`, Claude `--model`, and Ollama `ollama run <model>`. `--power` maps to Codex `model_reasoning_effort` and Claude `--effort`. `--permission` maps to provider-native permission flags. `--fast on` clears the stored power setting and uses low effort; setting `--power` again disables fast mode. `--priority` is a 0..100 selector preference used as a tie-breaker after readiness and availability. `--rtk on` injects a launch instruction that encourages assistants to use RTK (`rtk <command>`) for noisy terminal commands when RTK is available, while keeping raw commands for exact output.
295
295
 
296
296
  ### Launch History
297
297
 
@@ -0,0 +1,35 @@
1
+ # Changelog (`0.7.4 -> 0.7.5`)
2
+
3
+ Release date: 2026-06-02
4
+
5
+ ## Launch Settings
6
+
7
+ - Applied persisted `--model` settings to interactive Codex and Claude launches, matching the existing headless behavior.
8
+ - Switched Codex model launches to the explicit `--model` flag for both interactive and headless runs.
9
+ - Documented provider-specific model mapping for Codex, Claude, and Ollama.
10
+
11
+ ## Fast Mode
12
+
13
+ - Fixed `--fast on` so it clears the default stored power setting and actually launches Codex and Claude with low effort.
14
+ - Made explicit `--power` settings disable fast mode again, keeping launch settings readable and predictable.
15
+ - Restored `power=medium` when `--fast off` is set and no explicit power is present.
16
+
17
+ ## Coverage and Tests
18
+
19
+ - Added regression coverage for persisted model settings on interactive Codex and Claude launches.
20
+ - Added regression coverage for `fast on` launching Codex with `model_reasoning_effort="low"` and Claude with `--effort low`.
21
+ - Increased the Python test suite to 280 tests.
22
+
23
+ ## Release Metadata
24
+
25
+ - Updated package metadata, CLI version output, README badge, pinned installer example, and release changelog to `v0.7.5`.
26
+
27
+ ## Validation and Regression Evidence
28
+
29
+ - `npm run lint`
30
+ - `npm test`
31
+ - `python3 -m pytest -q`
32
+ - `npm audit --omit=dev --json`
33
+ - `sh -n install.sh`
34
+ - PowerShell parser check for `install.ps1`
35
+ - `python3 -m logics_manager lint --require-status`
@@ -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`
@@ -44,6 +44,14 @@
44
44
  "v0.7.3": {
45
45
  "github_tarball_sha256": "f68ac90a51c723eef9ae2b66106baa954f2fff8129fb5353e8eeb26b258b06c9",
46
46
  "github_zip_sha256": "dde2512701808450b39c5c4431317d95d017f9944435db83ac4497b645feb719"
47
+ },
48
+ "v0.7.4": {
49
+ "github_tarball_sha256": "02b399899e611300ddf367bfb8c22ad57b499e94265e50256c8afe3f4bd73851",
50
+ "github_zip_sha256": "87043d49cdd50dcd7d51349984ea4abfb1a2ff50f2eab69c75a421bedd2f2fe8"
51
+ },
52
+ "v0.7.5": {
53
+ "github_tarball_sha256": "18f5f6230bb5704913a90cfe2bfc5f55599c6ca0813bfd9f4bc97fc9f19e074a",
54
+ "github_zip_sha256": "cafd400c65c255aa9569853ec9d1cc80cf691ff849660496779334ee7abf71b4"
47
55
  }
48
56
  }
49
57
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdx-manager",
3
- "version": "0.7.4",
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.4"
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.4"
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 = []
@@ -314,7 +342,11 @@ def _build_launch_spec(session, cwd=None, env_override=None, initial_prompt=None
314
342
  env_override = env_override or {}
315
343
  env = {**os.environ, **env_override}
316
344
  if session["provider"] == PROVIDER_CLAUDE:
317
- args = ["--name", session["name"]] + _launch_config_args(session)
345
+ launch = session.get("launch") or {}
346
+ args = ["--name", session["name"]]
347
+ if launch.get("model"):
348
+ args += ["--model", _claude_cli_model(launch["model"])]
349
+ args += _launch_config_args(session)
318
350
  if initial_prompt:
319
351
  args.append(initial_prompt)
320
352
  auth_home = _get_auth_home(session)
@@ -360,7 +392,11 @@ def _build_launch_spec(session, cwd=None, env_override=None, initial_prompt=None
360
392
  },
361
393
  "label": "ollama",
362
394
  }, capture_transcript=capture_transcript, env=env)
363
- args = ["--no-alt-screen", "--cd", cwd] + _launch_config_args(session)
395
+ launch = session.get("launch") or {}
396
+ args = ["--no-alt-screen", "--cd", cwd]
397
+ if launch.get("model"):
398
+ args += ["--model", launch["model"]]
399
+ args += _launch_config_args(session)
364
400
  if initial_prompt:
365
401
  args.append(initial_prompt)
366
402
  return _wrap_launch_with_transcript(session, {
@@ -394,7 +430,7 @@ def _build_headless_launch_spec(session, cwd=None, env_override=None, initial_pr
394
430
  if session["provider"] == PROVIDER_CLAUDE:
395
431
  args = ["--print", "--output-format", "json", "--name", session["name"]]
396
432
  if model:
397
- args += ["--model", model]
433
+ args += ["--model", _claude_cli_model(model)]
398
434
  args += _launch_config_args(session)
399
435
  if initial_prompt:
400
436
  args.append(initial_prompt)
@@ -414,7 +450,7 @@ def _build_headless_launch_spec(session, cwd=None, env_override=None, initial_pr
414
450
  if session["provider"] == PROVIDER_CODEX:
415
451
  args = ["exec", "--json", "-C", cwd]
416
452
  if model:
417
- args += ["-m", model]
453
+ args += ["--model", model]
418
454
  if power:
419
455
  args += ["-c", f'model_reasoning_effort="{power}"']
420
456
  if permission:
@@ -816,6 +816,16 @@ def create_session_service(options=None):
816
816
  raise CdxError("At least one launch setting is required.")
817
817
  current = _normalize_launch_settings(session.get("launch") or {})
818
818
  launch = {**current, **updates}
819
+ explicit_power = "power" in updates or "reasoning_effort" in updates
820
+ if explicit_power and "fast" not in updates:
821
+ launch["fast"] = False
822
+ if "fast" in updates and not explicit_power:
823
+ if updates["fast"] is True:
824
+ launch.pop("power", None)
825
+ launch.pop("reasoning_effort", None)
826
+ launch.pop("reasoningEffort", None)
827
+ elif not any(key in launch for key in ("power", "reasoning_effort", "reasoningEffort")):
828
+ launch["power"] = DEFAULT_LAUNCH_SETTINGS["power"]
819
829
  now = _local_now_iso()
820
830
  return store["update_session"](name, lambda s: {
821
831
  **s,