cdx-manager 0.18.6 → 0.18.7

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
@@ -4,7 +4,7 @@
4
4
 
5
5
  <br clear="left"/>
6
6
 
7
- [![License](https://img.shields.io/badge/license-MIT-4C8BF5)](LICENSE) ![Version](https://img.shields.io/badge/version-v0.18.6-4C8BF5) ![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python&logoColor=white)
7
+ [![License](https://img.shields.io/badge/license-MIT-4C8BF5)](LICENSE) ![Version](https://img.shields.io/badge/version-v0.18.7-4C8BF5) ![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python&logoColor=white)
8
8
 
9
9
  **Stop guessing which AI account still has quota.** `cdx` tracks the rate-limit window of every Codex and Claude account you own, tells you which one is usable right now, and launches it with isolated auth — in one command.
10
10
 
@@ -466,6 +466,8 @@ Interactive launches and resumes set the terminal window title to `session — f
466
466
 
467
467
  The title is only written when stdout is a terminal. Nothing is emitted for `--json` launches, redirected or piped output, `cdx run` and other headless runs, login flows, or Ollama sessions. Session names and directories are stripped of escape and control characters before the title is emitted, and cdx does not restore the previous title when the session ends.
468
468
 
469
+ Claude Code writes its own animated title while an action runs, and it redraws far more often than cdx re-asserts the shared title. So interactive Claude launches and resumes started by cdx set the Claude-specific `CLAUDE_CODE_DISABLE_TERMINAL_TITLE=1` in the provider environment, which stops Claude from setting and clearing the title and leaves `session — folder` stable while Claude is busy. Claude's in-TUI activity indicator is unaffected, the value is forced so an ambient setting in your shell cannot hand the title back, and headless `cdx run`, Claude authentication flows, and every non-Claude provider keep their previous environment.
470
+
469
471
  ### Launch History
470
472
 
471
473
  Every interactive `cdx <name>` launch is recorded under `CDX_HOME`, including success/failure, duration, cwd, launch settings, and transcript path.
@@ -1047,6 +1049,10 @@ Without `--yes`, an interactive confirmation is required. `cdx` sends an idempot
1047
1049
 
1048
1050
  Contribution guidelines are available in [`CONTRIBUTING.md`](CONTRIBUTING.md).
1049
1051
 
1052
+ Working on the tray companion? [`docs/tray-local-testing.md`](docs/tray-local-testing.md)
1053
+ covers the local loops, from rendering the menu to stdout to running a real icon
1054
+ in the menu bar.
1055
+
1050
1056
  ---
1051
1057
 
1052
1058
  ## License
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.18.6
1
+ 0.18.7
@@ -0,0 +1,5 @@
1
+ # CDX Manager 0.18.7
2
+
3
+ ## Fixes
4
+
5
+ - Interactive Claude sessions keep the cdx `session — folder` terminal title while Claude is running an action, instead of losing it to Claude's own animated title. Headless runs, Claude authentication flows, and other providers are unchanged.
@@ -257,6 +257,17 @@
257
257
  "x86_64-pc-windows-msvc": "31a1743b0b6ec420a85c1679e93fcbd32c982a36e080a59d563276204682f152",
258
258
  "x86_64-unknown-linux-musl": "49fba26d3deeab1e46af542528a5c71262e6c4d82898fcf989d7222a09a11d59"
259
259
  }
260
+ },
261
+ "v0.18.6": {
262
+ "github_tarball_sha256": "31111eda2c31399b3fea14d80d10c0a2d10f15aab93a77a60939c86c564971ca",
263
+ "github_zip_sha256": "a3d78348416b3494645fa9f0467144c7e76b40d8862be959d125eb3d13805b15",
264
+ "tray_assets": {
265
+ "aarch64-apple-darwin": "aeb9267f72c3ee7426672d2e1fe98c0e39e0df795bbad6832299d4176c21022e",
266
+ "aarch64-unknown-linux-musl": "846969612d9a0e82f5f6cacc05aedc33153c1c325b8af95f63c8a2a5c2217261",
267
+ "x86_64-apple-darwin": "da5b4d3994fff9e616401e5a4cd01d68d216ddbeb6d41d96d67bbc789ef85118",
268
+ "x86_64-pc-windows-msvc": "296f760a7e10b7ef05936157b9de2b9d3b5e13f7ea2f57b7616705352ea97bd2",
269
+ "x86_64-unknown-linux-musl": "b360ea3ec14ab3aad0ccffcf477dee4bdadf6c1d4f150ef1cd13c7d293ae6829"
270
+ }
260
271
  }
261
272
  }
262
273
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdx-manager",
3
- "version": "0.18.6",
3
+ "version": "0.18.7",
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.18.6"
7
+ version = "0.18.7"
8
8
  description = "Terminal session manager for Codex and Claude accounts."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -58,6 +58,7 @@ def _notification_setting_notice(settings, sessions, action):
58
58
  notices.append(f"Agent alerts updated for {names} — this provider does not support notification hooks.")
59
59
  return "\n".join(notices)
60
60
  if "notify_preview" in settings:
61
+ names = _format_bulk_launch_summary(sessions)
61
62
  if action == "set" and settings["notify_preview"]:
62
63
  return f"Response previews enabled for {names} — completion text may be visible on the lock screen."
63
64
  return f"Response previews disabled for {names}."
@@ -108,6 +108,9 @@ def headless_permission_disables_network(provider, permission):
108
108
 
109
109
 
110
110
  REDACTED_PROMPT_ARG = "[prompt redacted]"
111
+ # Documented Claude Code switch that stops it from setting and clearing the
112
+ # terminal title, leaving cdx's shared title keeper as the only writer.
113
+ CLAUDE_DISABLE_TERMINAL_TITLE_ENV = "CLAUDE_CODE_DISABLE_TERMINAL_TITLE"
111
114
  CLAUDE_CLI_MODEL_ALIASES = {
112
115
  "claude-sonnet": "sonnet",
113
116
  "claude-opus": "opus",
@@ -148,11 +151,23 @@ def _anthropic_credentials_path(auth_home):
148
151
  return os.path.join(auth_home, "credentials", f"{_anthropic_profile_name()}.json")
149
152
 
150
153
 
151
- def _claude_env(base_env, auth_home):
154
+ def _claude_env(base_env, auth_home, own_terminal_title=False):
155
+ """Build the Claude provider environment for one cdx spawn.
156
+
157
+ `own_terminal_title` is set by the interactive launch/resume paths, where
158
+ cdx's title keeper owns the `session — folder` title. Claude Code redraws an
159
+ animated busy title far more often than the keeper re-emits, so we tell it
160
+ to leave the title alone; its in-TUI activity indicator is unaffected. The
161
+ value is forced rather than defaulted so an ambient `0` in the operator's
162
+ shell cannot hand the title back to Claude. Headless and auth spawns do not
163
+ own a title and keep their previous environment.
164
+ """
152
165
  env = {**base_env, **_home_env_overrides(auth_home)}
153
166
  env.pop("CLAUDE_CONFIG_DIR", None)
154
167
  env.pop("CODEX_HOME", None)
155
168
  env.setdefault("ANTHROPIC_PROFILE", _anthropic_profile_name())
169
+ if own_terminal_title:
170
+ env[CLAUDE_DISABLE_TERMINAL_TITLE_ENV] = "1"
156
171
  return env
157
172
 
158
173
 
@@ -547,7 +562,7 @@ def _build_launch_spec(session, cwd=None, env_override=None, initial_prompt=None
547
562
  if initial_prompt:
548
563
  args.append(initial_prompt)
549
564
  auth_home = _get_auth_home(session)
550
- claude_env = _claude_env(env, auth_home)
565
+ claude_env = _claude_env(env, auth_home, own_terminal_title=True)
551
566
  oauth_token = _read_claude_launch_oauth_token(auth_home)
552
567
  if oauth_token:
553
568
  claude_env["CLAUDE_CODE_OAUTH_TOKEN"] = oauth_token
@@ -693,7 +708,7 @@ def _build_resume_spec(session, cwd=None, env_override=None, capture_transcript=
693
708
  if resume_prompt:
694
709
  args.append(resume_prompt)
695
710
  auth_home = _get_auth_home(session)
696
- claude_env = _claude_env(env, auth_home)
711
+ claude_env = _claude_env(env, auth_home, own_terminal_title=True)
697
712
  oauth_token = _read_claude_launch_oauth_token(auth_home)
698
713
  if oauth_token:
699
714
  claude_env["CLAUDE_CODE_OAUTH_TOKEN"] = oauth_token