multi-claude-cli 0.11.0__tar.gz → 0.11.1__tar.gz

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.
Files changed (65) hide show
  1. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/PKG-INFO +4 -4
  2. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/README.md +3 -3
  3. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/__init__.py +1 -1
  4. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/cli.py +6 -1
  5. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude_cli.egg-info/PKG-INFO +4 -4
  6. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_sessions.py +7 -6
  7. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/LICENSE +0 -0
  8. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/pyproject.toml +0 -0
  9. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/setup.cfg +0 -0
  10. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/__main__.py +0 -0
  11. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/accounts.py +0 -0
  12. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/actions.py +0 -0
  13. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/bundle.py +0 -0
  14. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/completion.py +0 -0
  15. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/config.py +0 -0
  16. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/doctor.py +0 -0
  17. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/env.py +0 -0
  18. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/fsutil.py +0 -0
  19. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/history.py +0 -0
  20. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/hook.py +0 -0
  21. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/identity.py +0 -0
  22. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/launcher.py +0 -0
  23. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/lock.py +0 -0
  24. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/migrate.py +0 -0
  25. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/plan.py +0 -0
  26. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/platform.py +0 -0
  27. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/refresh.py +0 -0
  28. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/restore.py +0 -0
  29. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/routes.py +0 -0
  30. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/sessions.py +0 -0
  31. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/shared.py +0 -0
  32. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/shellpath.py +0 -0
  33. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/statusline.py +0 -0
  34. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude/usage.py +0 -0
  35. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude_cli.egg-info/SOURCES.txt +0 -0
  36. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude_cli.egg-info/dependency_links.txt +0 -0
  37. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude_cli.egg-info/entry_points.txt +0 -0
  38. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/src/multi_claude_cli.egg-info/top_level.txt +0 -0
  39. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_accounts.py +0 -0
  40. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_bundle.py +0 -0
  41. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_completion.py +0 -0
  42. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_config.py +0 -0
  43. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_doctor.py +0 -0
  44. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_everyday.py +0 -0
  45. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_fsutil.py +0 -0
  46. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_handoff.py +0 -0
  47. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_help.py +0 -0
  48. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_history.py +0 -0
  49. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_identity.py +0 -0
  50. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_install.py +0 -0
  51. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_mcp.py +0 -0
  52. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_migrate.py +0 -0
  53. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_onboarding.py +0 -0
  54. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_packaging.py +0 -0
  55. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_plan.py +0 -0
  56. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_platform.py +0 -0
  57. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_refresh.py +0 -0
  58. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_rename.py +0 -0
  59. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_routes.py +0 -0
  60. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_set.py +0 -0
  61. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_shared_exclude.py +0 -0
  62. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_statusline.py +0 -0
  63. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_usability.py +0 -0
  64. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_usage.py +0 -0
  65. {multi_claude_cli-0.11.0 → multi_claude_cli-0.11.1}/tests/test_vscode.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-claude-cli
3
- Version: 0.11.0
3
+ Version: 0.11.1
4
4
  Summary: Run several Claude Code accounts side by side: separate CLAUDE_CONFIG_DIR directories, launchers, proxies, environment variables and arguments.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/jakoes-wu/multi-claude
@@ -342,11 +342,11 @@ multi-claude sessions
342
342
  multi-claude sessions work # one account
343
343
  multi-claude sessions --grep importer # title, directory or session id contains the text
344
344
  multi-claude sessions --grep importer --cmd
345
- # TITLE ACCOUNT CREATED UPDATED SESSION ID CMD
346
- # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 3c588340-1219-48df-a231-509866789487 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
345
+ # TITLE ACCOUNT CREATED UPDATED CMD
346
+ # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
347
347
  ```
348
348
 
349
- - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
349
+ - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The `SESSION ID` column is left out, since each command ends with the session id. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
350
350
  - It shows the 30 most recent sessions; `--limit N` changes that and `--limit 0` shows all. `--json` prints every match with the full fields (`directory`, `created`, `updated`, `title_source`, `file`, `resume`). `conversations` is another name for the same command.
351
351
  - The title is the session's name in Claude Code; a session without one shows the beginning of its first prompt, and `-` if it has no prompt at all. Times are local. `UPDATED` is the time of the last message, or the file's modification time when the session has no timestamps.
352
352
  - A `~/.claude` that has not been turned into an account is listed as `default`.
@@ -315,11 +315,11 @@ multi-claude sessions
315
315
  multi-claude sessions work # one account
316
316
  multi-claude sessions --grep importer # title, directory or session id contains the text
317
317
  multi-claude sessions --grep importer --cmd
318
- # TITLE ACCOUNT CREATED UPDATED SESSION ID CMD
319
- # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 3c588340-1219-48df-a231-509866789487 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
318
+ # TITLE ACCOUNT CREATED UPDATED CMD
319
+ # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
320
320
  ```
321
321
 
322
- - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
322
+ - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The `SESSION ID` column is left out, since each command ends with the session id. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
323
323
  - It shows the 30 most recent sessions; `--limit N` changes that and `--limit 0` shows all. `--json` prints every match with the full fields (`directory`, `created`, `updated`, `title_source`, `file`, `resume`). `conversations` is another name for the same command.
324
324
  - The title is the session's name in Claude Code; a session without one shows the beginning of its first prompt, and `-` if it has no prompt at all. Times are local. `UPDATED` is the time of the last message, or the file's modification time when the session has no timestamps.
325
325
  - A `~/.claude` that has not been turned into an account is listed as `default`.
@@ -1,3 +1,3 @@
1
1
  """multi-claude:管理多个 Claude Code 账号的配置目录、启动命令、代理与启动参数。"""
2
2
 
3
- __version__ = "0.11.0"
3
+ __version__ = "0.11.1"
@@ -291,7 +291,8 @@ def build_parser() -> argparse.ArgumentParser:
291
291
  help="show at most N sessions, 0 for all (default: 30, or all with --json)")
292
292
  p_sessions.add_argument("--cmd", action="store_true",
293
293
  help="also print the command that resumes each session (a CMD column when the "
294
- "terminal is wide enough, otherwise a line below each session)")
294
+ "terminal is wide enough, otherwise a line below each session); the SESSION ID "
295
+ "column is then left out, since the command contains the id")
295
296
  p_sessions.add_argument("--json", action="store_true", help="print machine-readable JSON")
296
297
  return parser
297
298
 
@@ -1844,6 +1845,10 @@ def cmd_sessions(name: Optional[str], grep: Optional[str], limit: Optional[int],
1844
1845
  for line in _aligned([header] + rows):
1845
1846
  print(line)
1846
1847
  else:
1848
+ # 续聊命令里总有 --resume <会话ID>(目录未知时也有),带 --cmd 时两种排版都去掉 SESSION ID 列,
1849
+ # 免得同一串 ID 在一条会话里出现两次;不带 --cmd 时它是唯一能看到 ID 的地方,必须保留。
1850
+ header = header[:-1]
1851
+ rows = [row[:-1] for row in rows]
1847
1852
  # 续聊命令很长:整张表(表头与数据行,不含末尾的截断提示)放得下终端宽度才并成 CMD 列,
1848
1853
  # 否则命令在窄终端里会从中间折行,比单独一行更难读、也更难复制。按整张表决定,不逐行切换。
1849
1854
  wide = _aligned([header + ["CMD"]] + [row + [command] for row, command in zip(rows, commands)])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-claude-cli
3
- Version: 0.11.0
3
+ Version: 0.11.1
4
4
  Summary: Run several Claude Code accounts side by side: separate CLAUDE_CONFIG_DIR directories, launchers, proxies, environment variables and arguments.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/jakoes-wu/multi-claude
@@ -342,11 +342,11 @@ multi-claude sessions
342
342
  multi-claude sessions work # one account
343
343
  multi-claude sessions --grep importer # title, directory or session id contains the text
344
344
  multi-claude sessions --grep importer --cmd
345
- # TITLE ACCOUNT CREATED UPDATED SESSION ID CMD
346
- # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 3c588340-1219-48df-a231-509866789487 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
345
+ # TITLE ACCOUNT CREATED UPDATED CMD
346
+ # Fix the importer work 2026-10-11 16:05 2026-10-11 17:42 cd ~/project && claude-work --resume 3c588340-1219-48df-a231-509866789487
347
347
  ```
348
348
 
349
- - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
349
+ - `--cmd` puts the resume command in a `CMD` column when the whole table fits the width of the terminal; otherwise each command goes on its own line below its session. The `SESSION ID` column is left out, since each command ends with the session id. The home directory is written as `~`. When the output is piped, the width counts as 80 columns unless `COLUMNS` is set.
350
350
  - It shows the 30 most recent sessions; `--limit N` changes that and `--limit 0` shows all. `--json` prints every match with the full fields (`directory`, `created`, `updated`, `title_source`, `file`, `resume`). `conversations` is another name for the same command.
351
351
  - The title is the session's name in Claude Code; a session without one shows the beginning of its first prompt, and `-` if it has no prompt at all. Times are local. `UPDATED` is the time of the last message, or the file's modification time when the session has no timestamps.
352
352
  - A `~/.claude` that has not been turned into an account is listed as `default`.
@@ -99,17 +99,18 @@ class ListingTest(SessionsTestCase):
99
99
  env = {"TZ": "Asia/Shanghai", "COLUMNS": "300"}
100
100
  wide = self.ok("sessions", "--cmd", env=env).out.splitlines()
101
101
  self.assertEqual(wide, [
102
- "TITLE ACCOUNT CREATED UPDATED SESSION ID CMD",
103
- "One a 2026-10-01 10:00 2026-10-01 10:00 {0} cd /w/proj && claude-a --resume {0}".format(SID1),
104
- "Two b 2026-10-01 09:00 2026-10-01 09:00 {0} cd /w/other && claude-b --resume {0}".format(SID2)])
102
+ "TITLE ACCOUNT CREATED UPDATED CMD",
103
+ "One a 2026-10-01 10:00 2026-10-01 10:00 cd /w/proj && claude-a --resume " + SID1,
104
+ "Two b 2026-10-01 09:00 2026-10-01 09:00 cd /w/other && claude-b --resume " + SID2])
105
+ # 会话 ID 已在命令末尾,带 --cmd 时不再单列一次
105
106
  # 放不下时整张表改成命令单独一行;恰好放得下仍算放得下。标题与目录都是 ASCII,len 就是显示宽度
106
107
  widest = max(len(line) for line in wide)
107
108
  self.assertEqual(self.ok("sessions", "--cmd", env=dict(env, COLUMNS=str(widest))).out.splitlines(), wide)
108
109
  narrow = [
109
- "TITLE ACCOUNT CREATED UPDATED SESSION ID",
110
- "One a 2026-10-01 10:00 2026-10-01 10:00 " + SID1,
110
+ "TITLE ACCOUNT CREATED UPDATED",
111
+ "One a 2026-10-01 10:00 2026-10-01 10:00",
111
112
  " cd /w/proj && claude-a --resume " + SID1,
112
- "Two b 2026-10-01 09:00 2026-10-01 09:00 " + SID2,
113
+ "Two b 2026-10-01 09:00 2026-10-01 09:00",
113
114
  " cd /w/other && claude-b --resume " + SID2]
114
115
  self.assertEqual(self.ok("sessions", "--cmd", env=dict(env, COLUMNS=str(widest - 1))).out.splitlines(), narrow)
115
116
  self.assertEqual(self.ok("sessions", "--cmd", env=dict(env, COLUMNS="40")).out.splitlines(), narrow)