cdx-manager 0.9.15 → 0.9.16

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.9.15-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.9.16-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
 
@@ -0,0 +1,19 @@
1
+ # CDX Manager 0.9.16
2
+
3
+ ## Highlights
4
+
5
+ - Clear error message when a provider CLI binary is broken instead of a raw Python traceback.
6
+
7
+ ## Changes
8
+
9
+ ### Friendlier auth probe failures
10
+
11
+ Launching a session whose provider CLI exists but cannot be executed (corrupted install, wrong architecture, or a script missing its shebang — e.g. `Exec format error` on `~/.local/bin/claude`) previously crashed with an unhandled `OSError` traceback. The auth probe now catches all `OSError` failures and reports an actionable message telling the user to reinstall the provider CLI, exiting with code 126.
12
+
13
+ ## Validation
14
+
15
+ - `npm run release:validate`
16
+ - `npm run lint`
17
+ - `npm test`
18
+ - `git diff --check`
19
+ - `npm --cache /private/tmp/cdx-npm-cache pack --dry-run`
@@ -124,6 +124,10 @@
124
124
  "v0.9.14": {
125
125
  "github_tarball_sha256": "5469be5448eee56b5f0834d0c42d9ed3ca088158f08052bd8addc552635fe33d",
126
126
  "github_zip_sha256": "7eb5650cb348e3ef2a082cd7fb39d7f4c170d4a095fe88719a7ebbfb7601db48"
127
+ },
128
+ "v0.9.15": {
129
+ "github_tarball_sha256": "08e6c5a3459fdd65d1f6085ca03a3614f07b4bf44c57a995a3ef47446aa70482",
130
+ "github_zip_sha256": "c8ac01f4a65e85b417f5eba5139868ab17b8f0952bf99f17f0a79f73ef0f36d6"
127
131
  }
128
132
  }
129
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdx-manager",
3
- "version": "0.9.15",
3
+ "version": "0.9.16",
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.9.15"
7
+ version = "0.9.16"
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
@@ -66,7 +66,7 @@ from .status_view import (
66
66
  )
67
67
  from .update_check import check_for_update, check_logics_manager_for_update
68
68
 
69
- VERSION = "0.9.15"
69
+ VERSION = "0.9.16"
70
70
 
71
71
  # Public surface: this module is a facade. Names below are imported above
72
72
  # purely to be re-exported (consumed by tests and external callers); listing
@@ -1,3 +1,4 @@
1
+ import errno
1
2
  import json
2
3
  import os
3
4
  import re
@@ -881,6 +882,14 @@ def _format_probe_failure(session, spec, error):
881
882
  f"Install {command} and retry cdx add {session['name']}.",
882
883
  127,
883
884
  )
885
+ if isinstance(error, OSError) and error.errno == errno.ENOEXEC:
886
+ target = getattr(error, "filename", None) or command
887
+ return CdxError(
888
+ f"Failed to check login status for {session['name']}: {target} is not a valid executable "
889
+ f"(corrupted install, wrong architecture, or a script missing its shebang). "
890
+ f"Reinstall {command} and retry.",
891
+ 126,
892
+ )
884
893
  message = getattr(error, "message", None) or str(error)
885
894
  return CdxError(f"Failed to check login status for {session['name']}: {message}")
886
895
 
@@ -915,7 +924,7 @@ def _probe_provider_auth(session, spawn_sync=None, env_override=None, trust_loca
915
924
  stdout = result.get("stdout") if isinstance(result, dict) else getattr(result, "stdout", "")
916
925
  stderr = result.get("stderr") if isinstance(result, dict) else getattr(result, "stderr", "")
917
926
  output = (stdout or "") + (stderr or "")
918
- except FileNotFoundError as error:
927
+ except OSError as error:
919
928
  raise _format_probe_failure(session, spec, error) from error
920
929
  return spec["parser"](output)
921
930