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 +3 -3
- package/changelogs/CHANGELOGS_0_7_5.md +35 -0
- package/changelogs/CHANGELOGS_0_7_6.md +37 -0
- package/checksums/release-archives.json +8 -0
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/cli.py +1 -1
- package/src/provider_runtime.py +40 -4
- package/src/session_service.py +10 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CDX Manager
|
|
2
2
|
|
|
3
|
-
[](LICENSE) ](LICENSE)  
|
|
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.
|
|
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
|
|
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
package/pyproject.toml
CHANGED
package/src/cli.py
CHANGED
package/src/provider_runtime.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 += ["
|
|
453
|
+
args += ["--model", model]
|
|
418
454
|
if power:
|
|
419
455
|
args += ["-c", f'model_reasoning_effort="{power}"']
|
|
420
456
|
if permission:
|
package/src/session_service.py
CHANGED
|
@@ -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,
|