cdx-manager 0.4.2 → 0.4.3

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.4.2-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.4.3-4C8BF5) ![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python&logoColor=white)
4
4
 
5
5
  **Run multiple Codex and Claude sessions from one terminal. Switch between accounts instantly.**
6
6
 
@@ -122,7 +122,7 @@ For a specific version:
122
122
 
123
123
  ```bash
124
124
  curl -fsSL https://raw.githubusercontent.com/AlexAgo83/cdx-manager/main/install.sh -o install.sh
125
- CDX_VERSION=v0.4.2 sh install.sh
125
+ CDX_VERSION=v0.4.3 sh install.sh
126
126
  ```
127
127
 
128
128
  From source:
@@ -1,14 +1,14 @@
1
- # CHANGELOGS_0_1_1
1
+ # Changelog (`0.1.0 -> 0.1.1`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.1.1
5
+ ## Major Highlights
6
+ - CDX Manager 0.1.1 is the first packaged release of the multi-provider terminal session manager for Codex and Claude accounts.
7
+ - It turns the initial Logics-scoped idea into a usable CLI: isolated per-session auth homes, interactive provider launch, status extraction from local artifacts, Claude usage refresh through Anthropic rate-limit headers, log capture, cleanup commands, and release-ready package metadata.
6
8
 
7
- CDX Manager 0.1.1 is the first packaged release of the multi-provider terminal session manager for Codex and Claude accounts.
9
+ ## Generated Commit Summary
8
10
 
9
- It turns the initial Logics-scoped idea into a usable CLI: isolated per-session auth homes, interactive provider launch, status extraction from local artifacts, Claude usage refresh through Anthropic rate-limit headers, log capture, cleanup commands, and release-ready package metadata.
10
-
11
- ### At a glance
11
+ ## At a glance
12
12
 
13
13
  - Added the `cdx` CLI entrypoint with conventional `--help`, `--version`, session listing, creation, launch, copy, removal, login, logout, clean, and status commands
14
14
  - Added persistent session storage under `CDX_HOME`, with URL-encoded session names and per-session rehydration state
@@ -22,7 +22,7 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
22
22
  - Migrated the implementation to Python while keeping npm-based install and validation scripts
23
23
  - Added root packaging metadata, MIT license, README, contribution guidance, and release notes
24
24
 
25
- ### Session management
25
+ ## Session management
26
26
 
27
27
  - `cdx add <name>` creates Codex sessions by default.
28
28
  - `cdx add claude <name>` creates Claude sessions with a dedicated `claude-home`.
@@ -31,7 +31,7 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
31
31
  - `cdx rmv <name> [--force]` removes the session registry entry and its auth directory.
32
32
  - Session state is stored in a versioned JSON registry and per-session state files under `CDX_HOME`.
33
33
 
34
- ### Authentication and launch flow
34
+ ## Authentication and launch flow
35
35
 
36
36
  - Codex sessions use `codex login status`, `codex login`, and `codex logout`.
37
37
  - Claude sessions use `claude auth status`, `claude auth login`, and `claude auth logout`.
@@ -39,7 +39,7 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
39
39
  - Signals from the wrapper process are forwarded to the child provider process.
40
40
  - Codex launches show a reminder to run `/status` inside Codex when usage data needs refreshing.
41
41
 
42
- ### Usage and status reporting
42
+ ## Usage and status reporting
43
43
 
44
44
  - `cdx status` renders an aligned table for all sessions.
45
45
  - `cdx status <name>` renders a detailed view for one session.
@@ -48,7 +48,7 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
48
48
  - Available percentage is computed from the stricter remaining quota window.
49
49
  - Cached statuses are enriched from newer or more detailed local artifacts when available.
50
50
 
51
- ### Codex status extraction
51
+ ## Codex status extraction
52
52
 
53
53
  - Parses Codex `/status` blocks from logs and JSONL history.
54
54
  - Handles ANSI / terminal control sequences and narrow terminal layouts.
@@ -56,7 +56,7 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
56
56
  - Uses account identity in Codex status blocks to avoid accepting pasted status output from another account.
57
57
  - Prefers direct launch logs over noisier conversational rollout JSONL artifacts.
58
58
 
59
- ### Claude status extraction
59
+ ## Claude status extraction
60
60
 
61
61
  - Parses `Current session` and `Current week` blocks from Claude transcripts.
62
62
  - Extracts 5-hour reset values from `Current session`, including AM/PM formats such as `Resets at 5:00 AM`.
@@ -64,26 +64,26 @@ It turns the initial Logics-scoped idea into a usable CLI: isolated per-session
64
64
  - Keeps Claude 5-hour and weekly reset values separate in status output.
65
65
  - Refreshes Claude usage automatically from Anthropic rate-limit headers when credentials are available.
66
66
 
67
- ### Local time behavior
67
+ ## Local time behavior
68
68
 
69
69
  - Claude API reset timestamps are formatted in the machine's local timezone.
70
70
  - Log-derived time-only reset values are inferred in the local timezone.
71
71
  - Status `updated_at` values from API, JSONL, and file metadata are normalized to local ISO timestamps.
72
72
 
73
- ### Logging and cleanup
73
+ ## Logging and cleanup
74
74
 
75
75
  - Provider launches are captured to local transcript logs via `script`.
76
76
  - Launch logs include unique timestamped filenames to avoid overwriting active or recent transcripts.
77
77
  - Logs are rotated around the 10 MB threshold.
78
78
  - `cdx clean [name]` clears launch transcript logs for one session or all sessions.
79
79
 
80
- ### Packaging
80
+ ## Packaging
81
81
 
82
82
  - Published package version is `0.1.1`.
83
83
  - The npm tarball is restricted to the CLI entrypoint, source package, README, license, and release changelogs.
84
84
  - Local project-only files such as `.claude`, Logics workflow docs, and tests are excluded from the package tarball.
85
85
 
86
- ### Validation
86
+ ## Validation and Regression Evidence
87
87
 
88
88
  ```bash
89
89
  npm run lint
@@ -92,7 +92,7 @@ python3 bin/cdx --version
92
92
  npm --cache /tmp/cdx-npm-cache pack --dry-run
93
93
  ```
94
94
 
95
- ### Notes
95
+ ## Notes
96
96
 
97
97
  - This is the first release changelog, so it summarizes the full history from the initial Logics bootstrap through the 0.1.1 release preparation.
98
98
  - The package remains marked `private` in `package.json`; publication requires intentionally changing that release policy.
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_2_0
1
+ # Changelog (`0.1.1 -> 0.2.0`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.2.0
5
+ ## Major Highlights
6
+ - CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, safe repair workflows, reset notifications, stronger session-store behavior, and clearer status output for choosing the best account.
6
7
 
7
- CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, safe repair workflows, reset notifications, stronger session-store behavior, and clearer status output for choosing the best account.
8
+ ## Generated Commit Summary
8
9
 
9
- ### At a glance
10
+ ## At a glance
10
11
 
11
12
  - Added `cdx doctor` to inspect local CLI dependencies, `CDX_HOME` writability, missing session state, orphan profiles, and pending quarantines.
12
13
  - Added `cdx repair` with dry-run-by-default behavior and `--force` for safe repairs.
@@ -18,7 +19,7 @@ CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, saf
18
19
  - Decorated CLI output with terminal-native color support while respecting `NO_COLOR`, `CLICOLOR`, and TTY behavior.
19
20
  - Split the CLI implementation into smaller modules for status rendering, provider runtime, commands, and storage.
20
21
 
21
- ### Doctor and repair
22
+ ## Doctor and repair
22
23
 
23
24
  - `cdx doctor [--json]` reports installation and data-layout health.
24
25
  - `cdx repair [--dry-run] [--force] [--json]` plans repairs by default.
@@ -26,14 +27,14 @@ CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, saf
26
27
  - Pending quarantine profile directories can be cleaned up.
27
28
  - Orphan profiles are moved to quarantine with `--force` instead of being deleted directly.
28
29
 
29
- ### Notifications
30
+ ## Notifications
30
31
 
31
32
  - `cdx notify <name> --at-reset` waits for the selected session reset time.
32
33
  - `cdx notify --next-ready` waits for the recommended session to become usable or due for refresh.
33
34
  - `--poll seconds`, `--once`, and `--json` are supported.
34
35
  - macOS desktop notifications are sent through `osascript` when available, with terminal output as the consistent fallback.
35
36
 
36
- ### Status improvements
37
+ ## Status improvements
37
38
 
38
39
  - `cdx status` now includes a direct priority line before the usage tip.
39
40
  - The priority line prefers immediately usable accounts, accounts with earlier relevant resets, and accounts without credit fallback when appropriate.
@@ -41,7 +42,7 @@ CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, saf
41
42
  - The main `cdx` session list now formats updated timestamps as relative ages.
42
43
  - JSON status output keeps a stable shape even when live Claude refresh fails; refresh warnings are written to stderr.
43
44
 
44
- ### Reliability and safety
45
+ ## Reliability and safety
45
46
 
46
47
  - Session names now reject reserved command names including `doctor`, `repair`, and `notify`.
47
48
  - Session removal uses a quarantine flow and surfaces cleanup failures instead of silently ignoring them.
@@ -51,7 +52,7 @@ CDX Manager 0.2.0 focuses on operational reliability. It adds health checks, saf
51
52
  - Codex launch falls back without transcript capture when the `script` wrapper is unavailable or fails before producing a transcript.
52
53
  - Signal interruptions no longer trigger transcript fallback relaunches.
53
54
 
54
- ### Validation
55
+ ## Validation and Regression Evidence
55
56
 
56
57
  ```bash
57
58
  npm run lint
@@ -62,7 +63,7 @@ npm test
62
63
  ./bin/cdx --version
63
64
  ```
64
65
 
65
- ### Notes
66
+ ## Notes
66
67
 
67
68
  - The package remains marked `private` in `package.json`; npm publication still requires an explicit policy change.
68
69
  - No Git remote is configured in the current local repository, so this release is prepared locally and tagged locally only.
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_2_1
1
+ # Changelog (`0.2.0 -> 0.2.1`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.2.1
5
+ ## Major Highlights
6
+ - CDX Manager 0.2.1 prepares the package for npm publication.
6
7
 
7
- CDX Manager 0.2.1 prepares the package for npm publication.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Packaging
10
+ ## Packaging
10
11
 
11
12
  - Removed the private package flag so npm publication is possible.
12
13
  - Added npm package metadata: license, author, repository, bugs, homepage, keywords, and Node engine declaration.
@@ -14,7 +15,7 @@ CDX Manager 0.2.1 prepares the package for npm publication.
14
15
  - Normalized the `bin.cdx` path with `npm pkg fix`.
15
16
  - Documented the future npm install command in the README.
16
17
 
17
- ### Validation
18
+ ## Validation and Regression Evidence
18
19
 
19
20
  ```bash
20
21
  npm run lint
@@ -23,7 +24,7 @@ npm --cache /tmp/cdx-npm-cache publish --dry-run
23
24
  npm view cdx-manager name version --registry https://registry.npmjs.org/
24
25
  ```
25
26
 
26
- ### Notes
27
+ ## Notes
27
28
 
28
29
  - `npm view cdx-manager` currently returns `E404`, so the package name appears available on the npm registry.
29
30
  - This release is prepared for npm publication but has not been published yet.
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_3_0
1
+ # Changelog (`0.2.1 -> 0.3.0`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.3.0
5
+ ## Major Highlights
6
+ - CDX Manager 0.3.0 adds Python-native and standalone installation paths in addition to npm.
6
7
 
7
- CDX Manager 0.3.0 adds Python-native and standalone installation paths in addition to npm.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Packaging
10
+ ## Packaging
10
11
 
11
12
  - Added `pyproject.toml` so the CLI can be installed with `pipx`, `pip`, or `uv tool`.
12
13
  - Added the Python console entrypoint `cdx = "src.cli:cli_entry"`.
@@ -15,7 +16,7 @@ CDX Manager 0.3.0 adds Python-native and standalone installation paths in additi
15
16
  - Documented npm, pipx, uv, curl installer, and source installation paths.
16
17
  - Added GitHub Actions automation for PyPI publication when a GitHub Release is published.
17
18
 
18
- ### Validation
19
+ ## Validation and Regression Evidence
19
20
 
20
21
  ```bash
21
22
  npm run lint
@@ -26,7 +27,7 @@ python3 -m venv /tmp/cdx-pyinstall
26
27
  npm --cache /tmp/cdx-npm-cache publish --dry-run
27
28
  ```
28
29
 
29
- ### Notes
30
+ ## Notes
30
31
 
31
32
  - PyPI publication is now technically possible, but still requires PyPI credentials and an explicit publish step.
32
33
  - The standalone installer defaults to the latest GitHub Release and supports `CDX_VERSION=vX.Y.Z` for pinned installs.
@@ -1,18 +1,19 @@
1
- # CHANGELOGS_0_3_1
1
+ # Changelog (`0.3.0 -> 0.3.1`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.3.1
5
+ ## Major Highlights
6
+ - CDX Manager 0.3.1 is a release-channel synchronization update.
6
7
 
7
- CDX Manager 0.3.1 is a release-channel synchronization update.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Packaging
10
+ ## Packaging
10
11
 
11
12
  - Uses npm Trusted Publishing through GitHub Actions OIDC instead of long-lived npm tokens.
12
13
  - Keeps npm, PyPI, GitHub Releases, pipx, uv, and the standalone installer aligned on the same release version.
13
14
  - Retains the Python-native packaging and standalone install support introduced in 0.3.0.
14
15
 
15
- ### Validation
16
+ ## Validation and Regression Evidence
16
17
 
17
18
  ```bash
18
19
  npm run lint
@@ -22,6 +23,6 @@ python -m build
22
23
  python -m twine check dist/*
23
24
  ```
24
25
 
25
- ### Notes
26
+ ## Notes
26
27
 
27
28
  - This release exists because the npm Trusted Publishing workflow was added after the `v0.3.0` tag. A fresh release is required for GitHub Actions to run the updated workflow definition for npm publishing.
@@ -1,18 +1,19 @@
1
- # CHANGELOGS_0_3_2
1
+ # Changelog (`0.3.1 -> 0.3.2`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.3.2
5
+ ## Major Highlights
6
+ - CDX Manager 0.3.2 updates the npm release workflow to use the npm CLI version required for Trusted Publishing.
6
7
 
7
- CDX Manager 0.3.2 updates the npm release workflow to use the npm CLI version required for Trusted Publishing.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Packaging
10
+ ## Packaging
10
11
 
11
12
  - Runs the npm publish workflow on Node 24.
12
13
  - Installs npm 11 before publishing so GitHub Actions OIDC trusted publishing is supported.
13
14
  - Keeps npm, PyPI, GitHub Releases, pipx, uv, and the standalone installer aligned on the same release version.
14
15
 
15
- ### Validation
16
+ ## Validation and Regression Evidence
16
17
 
17
18
  ```bash
18
19
  npm run lint
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_3_3
1
+ # Changelog (`0.3.2 -> 0.3.3`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.3.3
5
+ ## Major Highlights
6
+ - CDX Manager 0.3.3 adds Windows compatibility across the full codebase.
6
7
 
7
- CDX Manager 0.3.3 adds Windows compatibility across the full codebase.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Windows support
10
+ ## Windows support
10
11
 
11
12
  - **Session store locking**: replaced `fcntl.flock` (Unix-only) with `msvcrt.locking` on Windows, with `seek(0)` to ensure consistent byte-range locking.
12
13
  - **Signal handling**: guarded `signal.SIGHUP` references behind `hasattr` checks — `SIGHUP` does not exist on Windows.
@@ -15,11 +16,11 @@ CDX Manager 0.3.3 adds Windows compatibility across the full codebase.
15
16
  - **ANSI colors**: `cli_entry` enables VT processing via `ctypes.windll.kernel32.SetConsoleMode` on Windows so color output works in terminals that support it.
16
17
  - **Console encoding**: `cli_entry` reconfigures `stdout`/`stderr` to UTF-8 on Windows to prevent `UnicodeEncodeError` on non-ASCII session names.
17
18
 
18
- ### Maintenance
19
+ ## Maintenance
19
20
 
20
21
  - Expanded `.gitignore` with standard Python build artifacts (`__pycache__/`, `*.egg-info/`, `dist/`, `build/`), virtual environments, coverage output, and OS-specific files (`.DS_Store`, `Thumbs.db`, `desktop.ini`).
21
22
 
22
- ### Validation
23
+ ## Validation and Regression Evidence
23
24
 
24
25
  ```bash
25
26
  npm run lint
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_3_4
1
+ # Changelog (`0.3.3 -> 0.3.4`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.3.4
5
+ ## Major Highlights
6
+ - CDX Manager 0.3.4 makes the CLI consumable by other applications through a structured JSON contract and rounds out the Windows release surface.
6
7
 
7
- CDX Manager 0.3.4 makes the CLI consumable by other applications through a structured JSON contract and rounds out the Windows release surface.
8
+ ## Generated Commit Summary
8
9
 
9
- ### JSON CLI API
10
+ ## JSON CLI API
10
11
 
11
12
  - Added `cdx --json` to list known sessions as a machine-readable payload.
12
13
  - Added `--json` support for session-management commands: `add`, `cp`, `ren`, `rmv`, `clean`, `login`, and `logout`.
@@ -14,14 +15,14 @@ CDX Manager 0.3.4 makes the CLI consumable by other applications through a struc
14
15
  - Added a shared stderr error envelope for JSON mode with machine-readable `code`, `message`, and `exit_code`.
15
16
  - Documented the JSON contract in the README so editor plugins and desktop apps can integrate without scraping human-readable terminal output.
16
17
 
17
- ### Windows release hardening
18
+ ## Windows release hardening
18
19
 
19
20
  - Added a native `install.ps1` installer for Windows.
20
21
  - Documented supported Windows install paths and the optional transcript-capture fallback.
21
22
  - Added targeted `win32` unit coverage for CLI startup, provider environment isolation, notifications, and session-store locking.
22
23
  - Added a Windows CI smoke flow that installs the package and exercises core CLI commands with shimmed providers.
23
24
 
24
- ### Validation
25
+ ## Validation and Regression Evidence
25
26
 
26
27
  ```bash
27
28
  npm run lint
@@ -1,12 +1,13 @@
1
- # CHANGELOGS_0_4_0
1
+ # Changelog (`0.3.4 -> 0.4.0`)
2
2
 
3
3
  Release date: 2026-04-16
4
4
 
5
- ## CDX Manager 0.4.0
5
+ ## Major Highlights
6
+ - CDX Manager 0.4.0 adds portable session backup and restore, surfaces cached release-update notices inside the CLI, and tightens Codex status isolation across multiple accounts.
6
7
 
7
- CDX Manager 0.4.0 adds portable session backup and restore, surfaces cached release-update notices inside the CLI, and tightens Codex status isolation across multiple accounts.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Portable session bundles
10
+ ## Portable session bundles
10
11
 
11
12
  - Added `cdx export <file>` and `cdx import <file>` for moving sessions between machines.
12
13
  - Added optional encrypted auth export with `--include-auth` and interactive or environment-driven passphrase handling.
@@ -14,20 +15,20 @@ CDX Manager 0.4.0 adds portable session backup and restore, surfaces cached rele
14
15
  - Preserved per-session state alongside session records so imported environments keep their local metadata.
15
16
  - Added bundle schema validation and integrity checks during import.
16
17
 
17
- ### Update awareness and installer hardening
18
+ ## Update awareness and installer hardening
18
19
 
19
20
  - Added cached GitHub release checks so the CLI can warn when a newer `cdx-manager` release is available without hitting the network on every command.
20
21
  - Surfaced update notices in interactive output and structured JSON warnings.
21
22
  - Hardened the standalone install scripts to consume official release-archive checksums when available.
22
23
  - Documented the checksum-backed installer flow and backup/restore usage in the README.
23
24
 
24
- ### Status isolation fix
25
+ ## Status isolation fix
25
26
 
26
27
  - Fixed Codex status parsing so boxed blank lines in TUI transcripts no longer drop the `Account:` context line.
27
28
  - Restored account-aware status selection when multiple sessions contain similar `/status` blocks.
28
29
  - Added regression coverage for mixed-account transcript selection and bundle export/import flows.
29
30
 
30
- ### Validation
31
+ ## Validation and Regression Evidence
31
32
 
32
33
  ```bash
33
34
  npm run lint
@@ -1,25 +1,26 @@
1
- # CHANGELOGS_0_4_1
1
+ # Changelog (`0.4.0 -> 0.4.1`)
2
2
 
3
3
  Release date: 2026-04-19
4
4
 
5
- ## CDX Manager 0.4.1
5
+ ## Major Highlights
6
+ - CDX Manager 0.4.1 fixes the Windows npm entry point so `cdx` no longer depends on `python3.exe` being present on PATH. It now ships a Node launcher that resolves a usable Python 3 interpreter cross-platform before invoking the existing Python CLI entry point.
6
7
 
7
- CDX Manager 0.4.1 fixes the Windows npm entry point so `cdx` no longer depends on `python3.exe` being present on PATH. It now ships a Node launcher that resolves a usable Python 3 interpreter cross-platform before invoking the existing Python CLI entry point.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Windows npm launcher
10
+ ## Windows npm launcher
10
11
 
11
12
  - Replaced the npm-facing `bin.cdx` target with a Node launcher at `bin/cdx.js`.
12
13
  - Added Python discovery that tries `py -3`, then `python`, then `python3` on Windows.
13
14
  - Kept the existing Python script under `bin/cdx` as the primary CLI entry point.
14
15
  - Added a clear error message when no compatible Python 3 interpreter is available.
15
16
 
16
- ### Documentation and packaging
17
+ ## Documentation and packaging
17
18
 
18
19
  - Updated the README with Windows Python prerequisites and the new launcher behavior.
19
20
  - Added a shared portable Node wrapper for the npm test and lint scripts.
20
21
  - Bumped the package versions for the npm and PyPI release workflows.
21
22
 
22
- ### Validation
23
+ ## Validation and Regression Evidence
23
24
 
24
25
  ```bash
25
26
  npm run lint
@@ -1,28 +1,29 @@
1
- # CHANGELOGS_0_4_2
1
+ # Changelog (`0.4.1 -> 0.4.2`)
2
2
 
3
3
  Release date: 2026-04-19
4
4
 
5
- ## CDX Manager 0.4.2
5
+ ## Major Highlights
6
+ - CDX Manager 0.4.2 fixes Codex session bootstrap on Windows so `cdx add` can reuse an existing logged-in Codex CLI without requiring a second manual login flow. It also hardens executable resolution for the Codex probe so Windows shell shims and direct process spawning behave consistently.
6
7
 
7
- CDX Manager 0.4.2 fixes Codex session bootstrap on Windows so `cdx add` can reuse an existing logged-in Codex CLI without requiring a second manual login flow. It also hardens executable resolution for the Codex probe so Windows shell shims and direct process spawning behave consistently.
8
+ ## Generated Commit Summary
8
9
 
9
- ### Codex auth bootstrap
10
+ ## Codex auth bootstrap
10
11
 
11
12
  - Seeded new Codex session auth homes from the global `~/.codex/auth.json` when available.
12
13
  - Short-circuited the Codex auth probe when a session already has an auth file in its isolated home.
13
14
  - Kept the per-session auth directory model intact after bootstrap so session isolation still applies.
14
15
 
15
- ### Windows command resolution
16
+ ## Windows command resolution
16
17
 
17
18
  - Resolved `codex` through the active `PATH` before invoking the login-status probe.
18
19
  - Applied the same command-resolution path to interactive provider launches when the default process spawner is used.
19
20
  - Added regression coverage for Codex auth bootstrap and resolved-command spawning on Windows.
20
21
 
21
- ### Documentation
22
+ ## Documentation
22
23
 
23
24
  - Documented the Codex auth bootstrap behavior in the README.
24
25
 
25
- ### Validation
26
+ ## Validation and Regression Evidence
26
27
 
27
28
  ```bash
28
29
  npm run lint
@@ -0,0 +1,36 @@
1
+ # Changelog (`0.4.2 -> 0.4.3`)
2
+
3
+ Release date: 2026-04-19
4
+
5
+ ## Major Highlights
6
+
7
+ - Generated from 1 code commit between `v0.4.2` and `HEAD` on 2026-04-19.
8
+ - Touched areas: Windows Codex status discovery, status formatting, and regression coverage.
9
+ - `cdx status` now reads Codex's structured Windows `rate_limits` payloads instead of falling back to `n/a`.
10
+ - Reset dates now render in the same short format as the rest of the UI, so the table stays readable.
11
+ - When a session profile has no usable Codex status artifact, `cdx` can fall back to the global Codex home on Windows.
12
+
13
+ ## Generated Commit Summary
14
+
15
+ ## Codex Status on Windows
16
+
17
+ - Added support for structured `rate_limits` data emitted by Codex's JSONL session history.
18
+ - Kept support for the older transcript-style status blocks, so existing artifacts still resolve.
19
+ - Narrowed the global-home fallback to real `cdx` runs on the default home, which avoids cross-contaminating temporary test homes.
20
+
21
+ ## Status Formatting
22
+
23
+ - Normalized structured reset timestamps to the short `Apr 25 18:52` style used elsewhere in `cdx status`.
24
+ - Preserved the existing relative labels such as `in 3h 57m` in the rendered table.
25
+
26
+ ## Validation and Regression Coverage
27
+
28
+ - Added a regression test for structured Codex rollout rate limits.
29
+ - Kept the existing session-service and CLI validation suite green.
30
+
31
+ ## Validation and Regression Evidence
32
+
33
+ - `python -m unittest discover -s test -p "test_session_service_py.py"`
34
+ - `python -m unittest discover -s test -p "test_cli_py.py"`
35
+ - `python -m unittest discover -s test -p "test_runtime_py.py"`
36
+ - `node bin/cdx.js status`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdx-manager",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
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.4.2"
7
+ version = "0.4.3"
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
@@ -44,7 +44,7 @@ from .status_view import (
44
44
  )
45
45
  from .update_check import check_for_update
46
46
 
47
- VERSION = "0.4.2"
47
+ VERSION = "0.4.3"
48
48
 
49
49
 
50
50
  # ---------------------------------------------------------------------------
@@ -540,6 +540,18 @@ def create_session_service(options=None):
540
540
  session["provider"],
541
541
  expected_account_email=expected_account_email,
542
542
  )
543
+ if (
544
+ session["provider"] == "codex"
545
+ and not artifact
546
+ and os.path.abspath(base_dir) == os.path.abspath(get_cdx_home(env))
547
+ ):
548
+ global_root = _get_global_codex_home(env)
549
+ if global_root and os.path.abspath(global_root) != os.path.abspath(source_root):
550
+ artifact = find_latest_status_artifact(
551
+ global_root,
552
+ session["provider"],
553
+ expected_account_email=expected_account_email,
554
+ )
543
555
  if not artifact:
544
556
  if _is_low_confidence_status_source(current_status):
545
557
  return None
@@ -47,6 +47,89 @@ def _safe_stat(file_path):
47
47
  return None
48
48
 
49
49
 
50
+ def _format_local_reset_timestamp(value):
51
+ if value is None or value == "":
52
+ return None
53
+ try:
54
+ timestamp = float(value)
55
+ except (TypeError, ValueError):
56
+ return None
57
+ if timestamp > 1_000_000_000_000:
58
+ timestamp /= 1000.0
59
+ try:
60
+ dt = datetime.fromtimestamp(timestamp, tz=timezone.utc).astimezone()
61
+ except (OverflowError, OSError, ValueError):
62
+ return None
63
+ return f"{MONTH_ABBR[dt.month - 1]} {dt.day} {dt.strftime('%H:%M')}"
64
+
65
+
66
+ def _normalize_timestamp_value(value):
67
+ return _format_local_reset_timestamp(value)
68
+
69
+
70
+ def _coerce_percentage(value):
71
+ if value is None or value == "":
72
+ return None
73
+ try:
74
+ return max(0, min(100, int(float(value))))
75
+ except (TypeError, ValueError):
76
+ return None
77
+
78
+
79
+ def _extract_structured_rate_limits(record):
80
+ if not isinstance(record, dict):
81
+ return None
82
+
83
+ rate_limits = record.get("rate_limits")
84
+ if not isinstance(rate_limits, dict):
85
+ return None
86
+
87
+ primary = rate_limits.get("primary") or {}
88
+ secondary = rate_limits.get("secondary") or {}
89
+ credits = rate_limits.get("credits") or {}
90
+
91
+ primary_used = _coerce_percentage(primary.get("used_percent"))
92
+ secondary_used = _coerce_percentage(secondary.get("used_percent"))
93
+ remaining_5h_pct = None if primary_used is None else max(0, 100 - primary_used)
94
+ remaining_week_pct = None if secondary_used is None else max(0, 100 - secondary_used)
95
+
96
+ result = {
97
+ "usage_pct": primary_used if primary_used is not None else secondary_used,
98
+ "remaining_5h_pct": remaining_5h_pct,
99
+ "remaining_week_pct": remaining_week_pct,
100
+ "credits": None,
101
+ "reset_5h_at": _normalize_timestamp_value(primary.get("resets_at")),
102
+ "reset_week_at": _normalize_timestamp_value(secondary.get("resets_at")),
103
+ "reset_at": None,
104
+ "raw_status_text": json.dumps(rate_limits, sort_keys=True),
105
+ }
106
+
107
+ balance = credits.get("balance")
108
+ if balance not in (None, ""):
109
+ result["credits"] = str(balance).strip()
110
+
111
+ result["reset_at"] = result["reset_week_at"] or result["reset_5h_at"]
112
+ if result["usage_pct"] is None and result["remaining_5h_pct"] is None and result["remaining_week_pct"] is None:
113
+ return None
114
+ return result
115
+
116
+
117
+ def _collect_structured_rate_limit_statuses(value, output=None):
118
+ if output is None:
119
+ output = []
120
+ if isinstance(value, dict):
121
+ structured = _extract_structured_rate_limits(value)
122
+ if structured:
123
+ output.append(structured)
124
+ else:
125
+ for item in value.values():
126
+ _collect_structured_rate_limit_statuses(item, output)
127
+ elif isinstance(value, list):
128
+ for item in value:
129
+ _collect_structured_rate_limit_statuses(item, output)
130
+ return output
131
+
132
+
50
133
  def _collect_text_values(value, output=None):
51
134
  if output is None:
52
135
  output = []
@@ -162,6 +245,13 @@ def _extract_jsonl_texts(file_path, provider=None):
162
245
  continue
163
246
  try:
164
247
  record = json.loads(line)
248
+ for structured in _collect_structured_rate_limit_statuses(record):
249
+ items.append({
250
+ "source_ref": f"{file_path}:{line_index + 1}",
251
+ "timestamp": record.get("timestamp"),
252
+ "text": structured["raw_status_text"],
253
+ "structured": structured,
254
+ })
165
255
  payload_texts = _collect_text_values(record.get("payload") or {})
166
256
  for candidate in payload_texts:
167
257
  if isinstance(candidate, str) and candidate.strip():
@@ -523,9 +613,6 @@ def find_latest_status_artifact(root_dir, provider=None, expected_account_email=
523
613
  )
524
614
  records = []
525
615
  for fp in candidates:
526
- normalized_fp = fp.replace(os.sep, "/")
527
- if "/sessions/" in normalized_fp and os.path.basename(fp).startswith("rollout"):
528
- continue
529
616
  if fp.endswith(".jsonl"):
530
617
  records.extend(_extract_jsonl_texts(fp, provider))
531
618
  elif fp.endswith(".log"):
@@ -538,6 +625,17 @@ def find_latest_status_artifact(root_dir, provider=None, expected_account_email=
538
625
  ):
539
626
  continue
540
627
  parsed = extract_named_statuses_from_text(candidate["text"])
628
+ if not parsed and candidate.get("structured"):
629
+ parsed = {
630
+ "usage_pct": candidate["structured"].get("usage_pct"),
631
+ "remaining_5h_pct": candidate["structured"].get("remaining_5h_pct"),
632
+ "remaining_week_pct": candidate["structured"].get("remaining_week_pct"),
633
+ "credits": candidate["structured"].get("credits"),
634
+ "reset_5h_at": candidate["structured"].get("reset_5h_at"),
635
+ "reset_week_at": candidate["structured"].get("reset_week_at"),
636
+ "reset_at": candidate["structured"].get("reset_at"),
637
+ "raw_status_text": candidate["structured"].get("raw_status_text"),
638
+ }
541
639
  if not parsed:
542
640
  continue
543
641
  ts = candidate.get("timestamp")