hatcheck 0.7.0__tar.gz → 0.7.2__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 (63) hide show
  1. {hatcheck-0.7.0 → hatcheck-0.7.2}/Cargo.lock +1 -1
  2. {hatcheck-0.7.0 → hatcheck-0.7.2}/Cargo.toml +1 -1
  3. {hatcheck-0.7.0 → hatcheck-0.7.2}/PKG-INFO +116 -162
  4. {hatcheck-0.7.0 → hatcheck-0.7.2}/README.md +115 -161
  5. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/Cargo.toml +9 -1
  6. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/README.md +14 -5
  7. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/agy.rs +131 -11
  8. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/args.rs +38 -0
  9. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/best.rs +100 -13
  10. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/cl.rs +2 -1
  11. hatcheck-0.7.2/crates/hatcheck/src/bin/claude-d.rs +7 -0
  12. hatcheck-0.7.2/crates/hatcheck/src/bin/claude-m.rs +7 -0
  13. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bind.rs +251 -35
  14. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/cli.rs +83 -20
  15. hatcheck-0.7.2/crates/hatcheck/src/completions.rs +780 -0
  16. hatcheck-0.7.2/crates/hatcheck/src/config.rs +843 -0
  17. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/conv.rs +16 -0
  18. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/copilot.rs +2 -0
  19. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/desktop.rs +269 -40
  20. hatcheck-0.7.2/crates/hatcheck/src/desktop_windows.rs +592 -0
  21. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/doctor.rs +120 -5
  22. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/dsh.rs +2 -0
  23. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/facts.rs +178 -12
  24. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/find.rs +33 -2
  25. hatcheck-0.7.2/crates/hatcheck/src/history.rs +349 -0
  26. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/kimi.rs +7 -9
  27. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/launch.rs +30 -34
  28. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/lib.rs +8 -1
  29. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/mcode.rs +2 -0
  30. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/move_cmd.rs +104 -36
  31. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/open_cmd.rs +16 -7
  32. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/opencode.rs +71 -10
  33. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/paths.rs +70 -19
  34. hatcheck-0.7.2/crates/hatcheck/src/profiles.rs +1091 -0
  35. hatcheck-0.7.2/crates/hatcheck/src/provider.rs +1124 -0
  36. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/qwen.rs +2 -0
  37. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/relocate.rs +33 -15
  38. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/resume.rs +2 -2
  39. hatcheck-0.7.2/crates/hatcheck/src/search.rs +962 -0
  40. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/sessions.rs +676 -79
  41. hatcheck-0.7.2/crates/hatcheck/src/show.rs +244 -0
  42. hatcheck-0.7.2/crates/hatcheck/src/statusline.rs +481 -0
  43. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/usage.rs +120 -12
  44. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/where_cmd.rs +65 -12
  45. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/zcode.rs +2 -0
  46. {hatcheck-0.7.0 → hatcheck-0.7.2}/pyproject.toml +3 -3
  47. hatcheck-0.7.0/crates/hatcheck/src/provider.rs +0 -634
  48. hatcheck-0.7.0/crates/hatcheck/src/show.rs +0 -136
  49. {hatcheck-0.7.0 → hatcheck-0.7.2}/LICENSE +0 -0
  50. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/LICENSE +0 -0
  51. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/agent.rs +0 -0
  52. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/ck.rs +0 -0
  53. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/claude-k.rs +0 -0
  54. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/claude-z.rs +0 -0
  55. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/cx.rs +0 -0
  56. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/hat.rs +0 -0
  57. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/main.rs +0 -0
  58. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/ospath.rs +0 -0
  59. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/out.rs +0 -0
  60. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/py.rs +0 -0
  61. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/serve.rs +0 -0
  62. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/times.rs +0 -0
  63. {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/widths.rs +0 -0
@@ -356,7 +356,7 @@ dependencies = [
356
356
 
357
357
  [[package]]
358
358
  name = "hatcheck"
359
- version = "0.7.0"
359
+ version = "0.7.2"
360
360
  dependencies = [
361
361
  "base64 0.22.1",
362
362
  "chrono",
@@ -6,7 +6,7 @@ exclude = ["desktop/src-tauri"]
6
6
  resolver = "2"
7
7
 
8
8
  [workspace.package]
9
- version = "0.7.0"
9
+ version = "0.7.2"
10
10
  edition = "2021"
11
11
  license = "MIT"
12
12
  rust-version = "1.90"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hatcheck
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -29,14 +29,30 @@ Project-URL: Issues, https://github.com/hatcheck/hatcheck/issues
29
29
 
30
30
  # Hatcheck
31
31
 
32
- Several Claude accounts on one computer, each kept apart: isolated Claude Desktop instances on
33
- macOS, and Claude Code CLI profiles, with recent sessions, plan usage and resume commands across all
34
- of them. OpenAI's Codex CLI and Moonshot's Kimi Code CLI get the same treatment, Google's
35
- Antigravity CLI (`agy`) and Z.ai's ZCode are read beside them, and DeepSeek Harness (`dsh`),
36
- MiniMax Code (`mcode`), Qwen Code (`qwen`), GitHub Copilot CLI (`copilot`) and OpenCode
37
- (`opencode`) join as read-only agents. Sessions can be carried between all ten: as a file the
38
- agent is started on for those without an importer, and through their own importers for copilot
39
- and opencode.
32
+ Several Claude accounts on one computer, each kept apart: work and personal, a team seat and your
33
+ own plan. On macOS and Windows each gets its own Claude Desktop, with its own login and an icon in
34
+ its own colour; anywhere, each gets its own Claude Code profile, with recent sessions, plan usage
35
+ and resume commands across all of them in one list. OpenAI's Codex CLI and Moonshot's Kimi Code CLI
36
+ get the same treatment, Google's Antigravity CLI (`agy`) and Z.ai's ZCode are read beside them, and
37
+ DeepSeek Harness (`dsh`), MiniMax Code (`mcode`), Qwen Code (`qwen`), GitHub Copilot CLI (`copilot`)
38
+ and OpenCode (`opencode`) join as read-only agents. Sessions can be carried between all ten: as a
39
+ file the agent is started on for those without an importer, and through their own importers for
40
+ copilot and opencode.
41
+
42
+ Hatcheck never asks for, stores, copies or moves a login, is never between an agent and its model,
43
+ runs nothing in the background, and never switches accounts on its own: see
44
+ [Rules it keeps](#rules-it-keeps).
45
+
46
+ **Start here:**
47
+
48
+ - [Two Claude accounts on one Mac](https://hatcheck.dev/two-claude-accounts-on-one-mac): a Claude
49
+ Desktop per account, in three commands.
50
+ - [Claude Code with two accounts](https://hatcheck.dev/claude-code-two-accounts): a profile per
51
+ account, and one list of what's in all of them; the same for
52
+ [Codex](https://hatcheck.dev/codex-two-accounts) and [Kimi Code CLI](https://hatcheck.dev/kimi-code-two-accounts),
53
+ and [what's left of each plan](https://hatcheck.dev/claude-usage-limits).
54
+ - [Install the CLI](#install): one line on macOS, Linux or Windows. The menu-bar app is
55
+ [on its way](#the-desktop-app).
40
56
 
41
57
  *Unofficial: not made by, affiliated with or endorsed by Anthropic, OpenAI, Google, Moonshot AI,
42
58
  Z.ai, DeepSeek, MiniMax, Alibaba Cloud, GitHub or the OpenCode project. Claude, Claude Code and
@@ -45,16 +61,16 @@ and Gemini are trademarks of Google LLC; Kimi is Moonshot AI's, ZCode and GLM ar
45
61
  Harness is DeepSeek's, MiniMax Code is MiniMax's, Qwen Code is Alibaba Cloud's, GitHub Copilot is
46
62
  GitHub's and OpenCode is the OpenCode project's.*
47
63
 
48
- On macOS, `hatcheck desktop` runs **one Claude Desktop per account, side by side**: each with its
49
- own data folder and login, and a launcher in a colour you pick, which brings the running one
50
- forward rather than opening it twice.
64
+ On macOS and Windows, `hatcheck desktop` runs **one Claude Desktop per account, side by side**:
65
+ each with its own data folder and login, and a launcher in a colour you pick, which brings the
66
+ running one forward rather than opening it twice.
51
67
 
52
68
  Running Claude Desktop with its own `--user-data-dir` is
53
69
  [Philipp Stracker's approach](https://gist.github.com/stracker-phil/9f84927a556632c7f9cc06663b534f14)
54
70
  ([write-up](https://philippstracker.com/multiple-claude-instances/)); hatcheck adds the colours and
55
71
  the launchers.
56
72
 
57
- It also has **command-line tools for all seven agents**, for keeping one profile per account:
73
+ It also has **command-line tools for all ten agents**, for keeping one profile per account:
58
74
  `cl`, `cx` and `ck` run Claude Code, Codex and Kimi Code CLI with a profile, and `hatcheck` lists
59
75
  the recent sessions in all of them, with the command that resumes each one or opens DSH's session
60
76
  history, and what's left of each plan. The rest
@@ -72,32 +88,35 @@ knowing which one each session ran on. See [Rules it keeps](#rules-it-keeps).
72
88
 
73
89
  | | macOS | Linux | Windows |
74
90
  |---------------------------------|:-----:|:-----:|:-------:|
75
- | Claude Desktop instances | yes | [untried](#roadmap): Claude Desktop for Linux is in beta | [planned](#roadmap) |
91
+ | Claude Desktop instances | yes | [untried](#roadmap): Claude Desktop for Linux is in beta | yes |
76
92
  | Claude Code, Codex, Antigravity CLI, Kimi Code CLI, ZCode, DeepSeek Harness, MiniMax Code, Qwen Code, GitHub Copilot CLI and OpenCode tools | yes | yes | yes |
77
93
 
78
94
  ---
79
95
 
80
- ## Claude Desktop instances (macOS)
96
+ ## Claude Desktop instances (macOS and Windows)
81
97
 
82
98
  `hatcheck desktop` makes them: each instance gets its own data folder, `~/.claude-instances/<name>`,
83
- and a launcher in `/Applications` with Claude's icon in a colour you pick. The launcher brings a
84
- running instance's window forward instead of starting a second one on the same folder.
99
+ and a launcher with Claude's icon in a colour you pick: an app in `/Applications` on macOS, a
100
+ shortcut in the Start menu on Windows. The launcher brings a running instance's window forward
101
+ instead of starting a second one on the same folder.
85
102
 
86
103
  ```bash
87
- hatcheck desktop new a A --hue 190 # Claude A.app, blue
88
- hatcheck desktop new b B --hue -10 # Claude B.app, red-orange
89
- hatcheck desktop open a # or open it from Launchpad or the Dock
104
+ hatcheck desktop new a A --hue 190 # Claude A.app, or Claude A in the Start menu: blue
105
+ hatcheck desktop new b B --hue -10 # Claude B, red-orange
106
+ hatcheck desktop open a # or open it from Launchpad, the Dock or the Start menu
90
107
  hatcheck desktop # the instances, and which are running
91
108
  hatcheck desktop remove a # its launcher; --data deletes its data folder too
92
109
  ```
93
110
 
94
- Sign each one in to its account the first time it opens. The first time a launcher brings a window
95
- forward, macOS asks whether it may control System Events; allow it, once per launcher. `--hue`
111
+ Sign each one in to its account the first time it opens. On macOS, the first time a launcher brings
112
+ a window forward, macOS asks whether it may control System Events; allow it, once per launcher. On
113
+ Windows, Claude Desktop (the Microsoft Store version) keeps one process per data folder itself, so
114
+ the launcher is a plain shortcut. `--hue`
96
115
  turns the icon's colours by that many degrees (about 110 is green, 190 blue, 240 purple) and
97
- `--saturation` scales them. hatcheck recolours the icon itself, with macOS's `iconutil`, and a
98
- launcher it can't recolour keeps Claude's own icon. The name `default` makes a launcher for
99
- Claude's built-in data folder, which is only safe while nothing else runs on that folder, the stock
100
- Claude icon included. [docs/desktop-instances.md](docs/desktop-instances.md) has the rest: what
116
+ `--saturation` scales them. hatcheck recolours the icon itself, with macOS's `iconutil` or, on
117
+ Windows, from the artwork in Claude's own package, and a launcher it can't recolour keeps Claude's
118
+ own icon. The name `default` makes a launcher for Claude's built-in data folder, which on macOS is
119
+ only safe while nothing else runs on that folder, the stock Claude icon included. [docs/desktop-instances.md](docs/desktop-instances.md) has the rest: what
101
120
  the launcher does, and how to copy a login you already have into an instance.
102
121
 
103
122
  ---
@@ -107,38 +126,34 @@ the launcher does, and how to copy a login you already have into an instance.
107
126
  Claude Code (the `claude` CLI) keeps its settings, history and session transcripts in `~/.claude`
108
127
  (plus `~/.claude.json`), and its login in the macOS Keychain, or on Linux and Windows in
109
128
  `~/.claude/.credentials.json`. Point `CLAUDE_CONFIG_DIR` at another folder and you get a separate
110
- profile with its own login, so you can keep one per account:
111
- `~/.claude-a`, `~/.claude-b`, and so on. These are separate from the Desktop instances
112
- above, though sessions from Desktop's Code tab can be filed in them too (the session list
113
- hides those unless you pass `--all`). Codex works the same way with `CODEX_HOME`: see
114
- [`cx`](docs/agents.md#cx-run-codex-with-a-home-per-account). Antigravity CLI keeps everything under
115
- `~/.gemini/antigravity-cli`, which only `HOME` moves, so hatcheck reads that one folder: see
116
- [Antigravity CLI](docs/agents.md#antigravity-cli-agy). Kimi Code CLI works like Codex, with
117
- `KIMI_CODE_HOME` and one home per account (`~/.kimi-code-a`), which [`ck`](docs/agents.md#ck-run-kimi-code-cli-with-a-home-per-account)
118
- runs it with, and ZCode keeps its sessions in a database under `~/.zcode`, which only `HOME`
119
- moves: see [Kimi Code CLI](docs/agents.md#kimi-code-cli-kimi) and [ZCode](docs/agents.md#zcode-zcode).
120
- DeepSeek Harness keeps sessions under `~/.dsh`, moved whole by `DSH_HOME`, so hatcheck reads
121
- `~/.dsh`, `~/.dsh-NAME` and the variable's folder. DSH's own profiles are plugin stacks, not these
122
- account homes, and there is no hatcheck DSH launcher: its command is the official `dsh web`, whose
123
- session history you choose the session in. See [DeepSeek Harness](docs/agents.md#deepseek-harness-dsh).
124
- MiniMax Code's current data home is `~/.minimax`, selected by `MINIMAX_DATA_DIR`, or by
125
- `MAVIS_DATA_DIR` when that's unset; `~/.minimax-code` is the installer, not a profile. Hatcheck
126
- reads its v2 SQLite catalog and canonical JSONL, and sessions resume directly with
127
- `mcode --session mvs_<id>`. See [MiniMax Code](docs/agents.md#minimax-code-mcode). Qwen Code
128
- keeps everything under `~/.qwen`, moved whole by `QWEN_HOME`, so hatcheck reads `~/.qwen`,
129
- `~/.qwen-NAME` and the variable's folder: each project's transcripts, which resume directly with
130
- `qwen --resume <id>`. See [Qwen Code](docs/agents.md#qwen-code-qwen). GitHub Copilot CLI keeps
131
- everything under `~/.copilot`, moved whole by `COPILOT_HOME`, so hatcheck reads `~/.copilot`,
132
- `~/.copilot-NAME` and the variable's folder: each session's events, which resume directly with
133
- `copilot --resume <id>`. See [GitHub Copilot CLI](docs/agents.md#github-copilot-cli-copilot).
134
- OpenCode 2 keeps every project's sessions in one database, `~/.local/share/opencode/opencode.db`,
135
- which hatcheck reads; they resume directly with `opencode --session ses_<id>`. See
136
- [OpenCode](docs/agents.md#opencode-opencode).
129
+ profile with its own login, so you can keep one per account: `~/.claude-a`, `~/.claude-b`, and so
130
+ on. These are separate from the Desktop instances above, though sessions from Desktop's Code tab
131
+ can be filed in them too (the session list hides those unless you pass `--all`). The other agents
132
+ keep theirs as the table says; [docs/agents.md](docs/agents.md) has each one's folders, what
133
+ hatcheck reads of them, and the version that was checked against.
134
+
135
+ | Agent | Its folder | A home per account | A session carried to it | Plan usage |
136
+ |---|---|---|---|---|
137
+ | Claude Code | `~/.claude` | `CLAUDE_CONFIG_DIR`, with [`cl`](docs/agents.md#cl-run-claude-code-with-a-profile) | written into the profile | Claude Code's own `/usage` |
138
+ | Codex | `~/.codex` | `CODEX_HOME`, with [`cx`](docs/agents.md#cx-run-codex-with-a-home-per-account) | written into the home | ChatGPT's usage endpoint |
139
+ | [Antigravity CLI](docs/agents.md#antigravity-cli-agy) | `~/.gemini/antigravity-cli` | none: only `HOME` moves it | a file `agy` is started on | agy's own `/usage` |
140
+ | [Kimi Code CLI](docs/agents.md#kimi-code-cli-kimi) | `~/.kimi-code` | `KIMI_CODE_HOME`, with [`ck`](docs/agents.md#ck-run-kimi-code-cli-with-a-home-per-account) | written into the home | Kimi's usage endpoint |
141
+ | [ZCode](docs/agents.md#zcode-zcode) | `~/.zcode`, a database | none: only `HOME` moves it | a file `zcode` is started on | none to read |
142
+ | [DeepSeek Harness](docs/agents.md#deepseek-harness-dsh) | `~/.dsh` | `DSH_HOME` | a prompt to paste into `dsh web` | none to read |
143
+ | [MiniMax Code](docs/agents.md#minimax-code-mcode) | `~/.minimax` | `MINIMAX_DATA_DIR`, or `MAVIS_DATA_DIR` | a file `mcode` is started on | not wired yet |
144
+ | [Qwen Code](docs/agents.md#qwen-code-qwen) | `~/.qwen` | `QWEN_HOME` | a file `qwen` is started on | none to read |
145
+ | [GitHub Copilot CLI](docs/agents.md#github-copilot-cli-copilot) | `~/.copilot` | `COPILOT_HOME` | `copilot sessions import` | none to read |
146
+ | [OpenCode](docs/agents.md#opencode-opencode) | `~/.local/share/opencode`, one database | not yet | `opencode session import` | its providers' own |
147
+
148
+ Every agent's sessions are listed and shown, and can be carried to any of the others, each in the
149
+ way the table's fourth column says. Claude Code's, Codex's and Kimi Code CLI's also move between
150
+ two homes of the same agent; ZCode's database and DeepSeek Harness's, MiniMax Code's, Qwen
151
+ Code's, Copilot's and OpenCode's stores are only ever read.
137
152
 
138
153
  ### Install
139
154
 
140
155
  One binary per platform, with no Python needed. Each of these installs `hatcheck`, `hat`, `cl`,
141
- `cx`, `ck`, `claude-z` and `claude-k`:
156
+ `cx`, `ck`, `claude-z`, `claude-k`, `claude-m` and `claude-d`:
142
157
 
143
158
  ```bash
144
159
  curl -LsSf https://github.com/hatcheck/hatcheck/releases/latest/download/hatcheck-installer.sh | sh
@@ -155,7 +170,10 @@ powershell -ExecutionPolicy Bypass -c "irm https://github.com/hatcheck/hatcheck/
155
170
  ```
156
171
 
157
172
  The installer scripts put the commands in `~/.local/bin` and add that folder to your `PATH`; set
158
- `HATCHECK_NO_MODIFY_PATH=1` first to keep your shell's startup files as they are. Each release, made
173
+ `HATCHECK_NO_MODIFY_PATH=1` first to keep your shell's startup files as they are. Completions
174
+ for zsh, bash, fish and PowerShell come from
175
+ [`hatcheck completions`](docs/commands.md#hatcheck-completions-for-zsh-bash-fish-and-powershell):
176
+ `eval "$(hatcheck completions zsh)"` after `compinit`, and the others as that section says. Each release, made
159
177
  from a tag such as `v0.2.0`, has them and the binaries for each platform, and PyPI gets the same
160
178
  binaries as wheels. The release builds start after 0.1.0, which is the Python version.
161
179
 
@@ -171,42 +189,29 @@ Each is documented as it is, with its options and what it prints, in
171
189
 
172
190
  | Command | What it does |
173
191
  |---|---|
174
- | [`cl a --resume <id>`](docs/agents.md#cl-run-claude-code-with-a-profile) | Claude Code with `~/.claude-a`; `cl -z` and `cl -k` run it on Z.ai or Kimi there |
192
+ | [`cl a --resume <id>`](docs/agents.md#cl-run-claude-code-with-a-profile) | Claude Code with `~/.claude-a`; `cl -z`, `-k`, `-m` and `-D` run it on Z.ai, Kimi, MiniMax or DeepSeek there |
175
193
  | [`cx a resume <id>`](docs/agents.md#cx-run-codex-with-a-home-per-account) | Codex with `~/.codex-a` |
176
194
  | [`ck a --session <id>`](docs/agents.md#ck-run-kimi-code-cli-with-a-home-per-account) | Kimi Code CLI with `~/.kimi-code-a` |
177
- | [`hatcheck`](docs/commands.md#hatcheck-what-to-resume) | the sessions active in the last day, in every profile, home and folder, each with its resume or open command and what's left of its plan |
178
- | [`hatcheck usage`](docs/commands.md#hatcheck-usage-plan-usage-for-every-profile) | what's left of every plan limit, sorted by Fable; DSH, Qwen Code, Copilot and OpenCode homes say why there's no reading, and mcode's quota isn't wired |
195
+ | [`hatcheck`](docs/commands.md#hatcheck-what-to-resume) | the sessions active in the last day in this folder, or every folder with `-A`, each with its resume or open command, what it cost and what's left of its plan; `-d` adds each one's turns and spend by model, `-c` puts the costliest first, and [`config.toml`](docs/commands.md#configtoml-the-lists-defaults-and-what-to-leave-out) sets the defaults and the agents and folders every command leaves out |
196
+ | [`hatcheck usage`](docs/commands.md#hatcheck-usage-plan-usage-for-every-profile) | what's left of every plan limit, sorted by Fable, and, from hatcheck's own readings over time, how fast each is being used up and whether it runs out before it resets; DSH, Qwen Code, Copilot and OpenCode homes say why there's no reading, and mcode's quota isn't wired |
179
197
  | [`hatcheck best`](docs/commands.md#hatcheck-best-which-account-to-use-now) | the best account now, with its limits, and the `move` command that carries the newest session started here to it; `--wait` sleeps until one has room |
180
198
  | [`hatcheck where SESSION`](docs/commands.md#hatcheck-where-find-a-session) | where a session's files are |
181
199
  | [`hatcheck open SESSION`](docs/commands.md#hatcheck-open-resume-a-session-in-a-new-terminal) | resume it in a new terminal, or open DSH's session history in its folder |
182
200
  | [`hatcheck resume`](docs/commands.md#hatcheck-resume-carry-on-the-newest-session-here) | carry on the newest session started from this folder, or open DSH's session history, after asking; `hat r` for short |
183
- | `hatcheck show SESSION` | its conversation, read-only |
201
+ | [`hatcheck show SESSION`](docs/commands.md#hatcheck-show-a-sessions-conversation) | its conversation, read-only; `--markdown` writes it out as a document to keep or share |
202
+ | [`hatcheck search WORDS`](docs/commands.md#hatcheck-search-the-sessions-that-mention-something) | the sessions whose title or conversation has every word, in every profile and home, newest first, with the turns the words are in |
184
203
  | [`hatcheck move SESSION PROFILE`](docs/commands.md#hatcheck-move-carry-on-a-session-with-another-profile) | carry it to another profile, or convert it for another agent; `--brief` hands over a brief in place of the whole conversation |
185
204
  | [`hatcheck fork SESSION PROFILE`](docs/commands.md#hatcheck-fork-a-session-as-a-new-one-in-another-profile) | bring it in there as a new session, keeping the original |
186
205
  | [`hatcheck relocate OLD NEW`](docs/commands.md#hatcheck-relocate-a-project-folder-that-moved) | a moved project folder's sessions, brought along; DSH's, mcode's, qwen's, copilot's and opencode's stay as they are |
187
206
  | [`hatcheck bind PROFILE`](docs/commands.md#hatcheck-bind-tie-a-folder-to-a-profile) | tie a folder to a profile, so `cl`, `cx` and `ck` pick it there and the list flags strays |
188
- | [`hatcheck doctor`](docs/install.md#hatcheck-doctor-every-copy-of-hatcheck-and-the-agents) | every copy of hatcheck and the agents on your `PATH`, which runs, how to remove the rest |
189
- | [`hatcheck desktop`](#claude-desktop-instances-macos) | Claude Desktop instances on macOS |
207
+ | [`hatcheck profiles [A B]`](docs/commands.md#hatcheck-profiles-what-each-profile-is-set-up-with) | what each profile and home is set up with: skills, agents, commands, plugins, hooks, MCP servers, permissions and settings; with two named, what differs between them |
208
+ | [`hatcheck statusline --install PROFILE`](docs/commands.md#hatcheck-statusline-which-account-a-session-is-on-in-claude-codes-status-line) | a status line for Claude Code with the profile the session runs in and what's left of its plan: `work · Opus 5.5 · 5h 62% ↻2h41m · wk 30% ↻3d2h · ctx 23% · $1.23` |
209
+ | [`hatcheck completions SHELL`](docs/commands.md#hatcheck-completions-for-zsh-bash-fish-and-powershell) | the completions for zsh, bash, fish or PowerShell: subcommands, options, profiles and recent sessions |
210
+ | [`hatcheck doctor`](docs/install.md#hatcheck-doctor-every-copy-of-hatcheck-and-the-agents) | every copy of hatcheck and the agents on your `PATH`, which runs, how to remove the rest, and how long each profile keeps its transcripts |
211
+ | [`hatcheck desktop`](#claude-desktop-instances-macos-and-windows) | Claude Desktop instances on macOS and Windows |
190
212
  | [`--json`](docs/commands.md#--json-for-scripts-status-bars-and-apps) | the sessions, plans and results as data, for scripts, status bars and the desktop app |
191
213
 
192
- `hat` is the short name, and a subcommand can be cut to its first letters: `hat m` is `hat move`, `hat r` is `hat resume`.
193
- [Antigravity CLI](docs/agents.md#antigravity-cli-agy) sessions are listed, shown and converted
194
- from its one folder, with what its `/usage` reports; [Kimi Code CLI](docs/agents.md#kimi-code-cli-kimi)
195
- sessions are listed, shown, converted and moved between its homes, and [ZCode](docs/agents.md#zcode-zcode)'s
196
- are listed, shown and converted from its database. [DeepSeek Harness](docs/agents.md#deepseek-harness-dsh)
197
- sessions are listed and shown from raw or compressed v4 logs and converted out, never written;
198
- `dsh web` opens its session history. [MiniMax Code](docs/agents.md#minimax-code-mcode) sessions
199
- are listed and shown from its v2 catalog and canonical JSONL and converted out, never written;
200
- `mcode --session mvs_<id>` resumes them directly. [Qwen Code](docs/agents.md#qwen-code-qwen)
201
- sessions are listed and shown from its transcripts and converted both ways, its store never
202
- written: a session converted for qwen is a file qwen is started on, and `qwen --resume <id>`
203
- resumes its own. [GitHub Copilot CLI](docs/agents.md#github-copilot-cli-copilot) and
204
- [OpenCode](docs/agents.md#opencode-opencode) sessions are listed and shown from their stores and
205
- converted both ways, through their own importers: a session converted for either is a file its
206
- `sessions import` or `session import` takes, and `copilot --resume <id>` and
207
- `opencode --session ses_<id>` resume their own. [`claude-z` and
208
- `claude-k`](docs/agents.md#claude-z-claude-k-claude-code-on-zai-or-kimi)
209
- run Claude Code on Z.ai's or Kimi's models in any profile.
214
+ `hat` is the short name, and a subcommand can be cut to its first letters: `hat m` is `hat move`, `hat r` is `hat resume`; the list's flags have single letters that bundle, so `hat -dc` is `hat --details --by-cost`. [`claude-z`, `claude-k`, `claude-m` and `claude-d`](docs/agents.md#claude-z-claude-k-claude-m-claude-d-claude-code-on-zai-kimi-minimax-or-deepseek) run Claude Code on Z.ai's, Kimi's, MiniMax's or DeepSeek's models in any profile.
210
215
 
211
216
 
212
217
  ## Rules it keeps
@@ -214,14 +219,17 @@ run Claude Code on Z.ai's or Kimi's models in any profile.
214
219
  Each rule names the code that keeps it, so it can be checked rather than taken on trust.
215
220
 
216
221
  - **Not in the path.** Nothing of Hatcheck sits between an agent and its model. `cl`, `cx` and
217
- `ck` set `CLAUDE_CONFIG_DIR`, `CODEX_HOME` or `KIMI_CODE_HOME` (and, for `cl -z` and `cl -k`, the
218
- provider variables you set up) and run the agent in their place; nothing stays running
222
+ `ck` set `CLAUDE_CONFIG_DIR`, `CODEX_HOME` or `KIMI_CODE_HOME` (and, for `cl -z`, `-k`, `-m` and
223
+ `-D`, the provider variables you set up) and run the agent in their place; nothing stays running
219
224
  ([`launch.rs`](crates/hatcheck/src/launch.rs), `run`).
220
225
  - **No agent's config is rewritten**, except when you ask: `hatcheck bind --hook` adds one
221
226
  session-start hook to each profile's `settings.json`, each Codex home's `hooks.json` and
222
227
  Antigravity CLI's `~/.gemini/config/hooks.json`, or points the one it added at the `hatcheck` it
223
228
  finds now, and `unbind --hook` removes only what it added ([`bind.rs`](crates/hatcheck/src/bind.rs),
224
- `add_hooks` and `remove_hooks`).
229
+ `add_hooks` and `remove_hooks`); `hatcheck statusline --install` sets the `statusLine` of the
230
+ profiles you name, leaves one somebody else set alone, and `--uninstall` takes out only the one
231
+ it added ([`statusline.rs`](crates/hatcheck/src/statusline.rs), `install` and `uninstall`).
232
+ `hatcheck profiles` and `search` only read.
225
233
  - **No credentials.** It never asks for, stores, refreshes or moves a login. For Claude it never
226
234
  reads one: Claude Code's own `/usage` is run in the profile and the snapshot it saves is read
227
235
  ([`usage.rs`](crates/hatcheck/src/usage.rs), `run_claude_usage` and `claude_live`). For Codex, the
@@ -240,8 +248,9 @@ Each rule names the code that keeps it, so it can be checked rather than taken o
240
248
  model list agy fetches first to say it's signed in. `CODEX_USAGE_URL` in `usage.rs` and
241
249
  `DEFAULT_USAGE_URL` and `GLOBAL_USAGE_URL` in `kimi.rs` are the only addresses the binary itself
242
250
  calls; DSH, mcode, qwen, copilot and opencode add none. `--cached` and `--no-usage` make none. The
243
- Z.ai and Kimi endpoints in [`provider.rs`](crates/hatcheck/src/provider.rs) are handed to Claude
244
- Code, which calls them only when you run `cl -z` or `cl -k`.
251
+ Z.ai, Kimi, MiniMax and DeepSeek endpoints in [`provider.rs`](crates/hatcheck/src/provider.rs) are
252
+ handed to Claude Code, which calls them only when you run `claude-z`, `claude-k`, `claude-m` or
253
+ `claude-d`, or `cl` with `-z`, `-k`, `-m` or `-D`.
245
254
  - **What the agents send is theirs to govern.** Hatcheck adds no data path of its own. What each
246
255
  agent sends to its maker, and whether that is kept or used to train models, depends on the
247
256
  maker's terms for your product and plan, which differ between them and change; check them for
@@ -301,95 +310,39 @@ off until you turn it on. See [desktop/README.md](desktop/README.md) to build an
301
310
 
302
311
  ## Files in this repo
303
312
 
304
- - **`crates/hatcheck/`**: hatcheck in Rust, the commands and the launchers. Its `src/` has a file per
305
- subcommand (`sessions.rs`, `usage.rs`, `move_cmd.rs`, `open_cmd.rs`, `desktop.rs` and the rest),
306
- `launch.rs` for `cl`, `cx`, `ck`, `claude-z` and `claude-k`, `agy.rs`, `kimi.rs`, `zcode.rs`,
307
- `dsh.rs`, `mcode.rs`, `qwen.rs`, `copilot.rs` and `opencode.rs` for what it reads and writes of
308
- Antigravity CLI, Kimi Code CLI, ZCode, DeepSeek Harness, MiniMax Code, Qwen Code, GitHub Copilot
309
- CLI and OpenCode, `doctor.rs` for `hatcheck doctor`, and
310
- `src/bin/` for those binaries and `hat`.
311
- Its own README is the crate's page on crates.io. It was ported from a Python version with the
312
- same output; see [docs/rust-port.md](docs/rust-port.md).
313
- - **`CHANGELOG.md`**: what changed in each release of the CLI; a release's notes on GitHub are its
314
- section there, and [docs/maintenance.md](docs/maintenance.md#releasing-the-cli) has the steps of
315
- a release.
316
- - **`install.sh`** / **`install.ps1`**: build the commands from a clone and put them on your `PATH`
317
- (`~/.local/bin` by default).
318
- - **`pyproject.toml`**: the PyPI package, the binaries as wheels built with maturin.
319
- **`dist-workspace.toml`**: the release builds, installers and Homebrew formula, made by cargo-dist.
320
- **`packaging/`**: the app's Homebrew cask, and the winget manifests for the app and the CLI.
321
- - **`desktop/`**: the desktop app: Tauri, with the CLI inside it ([its README](desktop/README.md)).
322
- - **`site/`**: the site, four pages sharing one stylesheet, with the images beside them, served at [hatcheck.dev](https://hatcheck.dev)
323
- from Cloudflare as static assets; `site/deploy.sh` ships it. The logo lives there too:
324
- `logo.svg` and `logo-dark.svg` (the mark), `logo-wordmark.svg` and `logo-wordmark-dark.svg`, `favicon.svg`.
325
- - **`docs/proposals/`**: the plans these came from: [the CLI features](docs/proposals/cli-features.md),
326
- [the desktop app](docs/proposals/desktop-app.md), [Antigravity CLI](docs/proposals/antigravity.md)
327
- and [Kimi Code CLI and ZCode](docs/proposals/kimi-zcode.md).
313
+ - **`crates/hatcheck/`**: the CLI in Rust: a file per subcommand in `src/` and one per agent
314
+ (`agy.rs`, `kimi.rs`, `zcode.rs` and the rest), with the launchers in `launch.rs` and `src/bin/`.
315
+ It was ported from a Python version with the same output ([docs/rust-port.md](docs/rust-port.md)).
316
+ - **`desktop/`**: the desktop app, Tauri with the CLI inside it ([its README](desktop/README.md)).
328
317
  - **`docs/`**: [commands.md](docs/commands.md), [agents.md](docs/agents.md) and
329
318
  [install.md](docs/install.md), each command, agent and way of installing as it is;
330
- [desktop-instances.md](docs/desktop-instances.md) for the Desktop instances;
331
- [rust-port.md](docs/rust-port.md) on the port from Python; [formats.md](docs/formats.md), each
332
- agent's session format side by side and how a conversion works; [maintenance.md](docs/maintenance.md)
333
- on checking each agent's newest version every week or two.
334
- - **`AGENTS.md`** and **`docs/lessons.md`**: notes for coding agents (`CLAUDE.md` imports them): how
335
- to build and check, the rules the code keeps, and what earlier work got wrong, with the rule that
336
- would have caught it.
337
- - **`tests/`**: the command tests, which run the binary against throwaway home folders:
338
- `python3 -m unittest discover -s tests`, which builds it with cargo first, and the crate's own
339
- tests with `cargo test -p hatcheck`. They never read your real profiles, Keychain or the network.
340
- GitHub Actions runs both on macOS, Linux and Windows (`.github/workflows/tests.yml`).
341
- - **`scripts/`**: `upstream.py`, the read-only first step of [maintenance.md](docs/maintenance.md),
342
- which `.github/workflows/upstream.yml` runs every Monday, keeping an issue open for what it
343
- finds; and `provider_probe.py`, which runs each `claude-k` and `claude-z` model once.
319
+ [formats.md](docs/formats.md), each agent's session format side by side;
320
+ [maintenance.md](docs/maintenance.md), the check of each agent's newest version every week or
321
+ two, and the release steps; [desktop-instances.md](docs/desktop-instances.md); and
322
+ [proposals/](docs/proposals/), the plans these came from.
323
+ - **`tests/`**: the command tests, which run the binary against throwaway home folders and never
324
+ read your real profiles, the Keychain or the network: `python3 -m unittest discover -s tests`,
325
+ beside the crate's own `cargo test -p hatcheck`. GitHub Actions runs both on macOS, Linux and
326
+ Windows.
327
+ - **`AGENTS.md`** and **`docs/lessons.md`**: notes for coding agents (`CLAUDE.md` imports them),
328
+ and what earlier work got wrong, with the rule that would have caught it.
329
+ - **`CHANGELOG.md`**, each release's notes; **`install.sh`** and **`install.ps1`**, to build from a
330
+ clone; **`pyproject.toml`** and **`dist-workspace.toml`**, the PyPI wheels and the release
331
+ builds; **`packaging/`**, the app's cask and the winget manifests; **`scripts/`**, `upstream.py`
332
+ (the Monday check) and `provider_probe.py`; and **`site/`**, [hatcheck.dev](https://hatcheck.dev)
333
+ and the logo.
344
334
 
345
335
  ## Roadmap
346
336
 
347
- - **Claude Desktop instances on Windows.** Claude Desktop is an Electron app there too, so a
348
- separate `--user-data-dir` per account should work. A Windows version would create a shortcut per
349
- instance with its own icon, and a launcher that brings a running instance forward instead of
350
- opening a duplicate. It needs testing on a Windows machine first.
351
337
  - **Claude Desktop instances on Linux.** Claude Desktop for Linux is in beta, for Ubuntu and
352
338
  Debian. Whether its own `--user-data-dir` keeps an instance apart there, as on macOS, hasn't been
353
339
  tried; until it has, only the CLI tools apply on Linux.
354
- - **Antigravity CLI profiles.** agy keeps one login per home folder, so a second account needs a
355
- home folder of its own (`HOME=~/.agy-a agy`), which every command the agent runs would see
356
- too. Whether hatcheck should make such folders, and a launcher for them, is still open; until
357
- then it reads `~/.gemini/antigravity-cli` only. The Antigravity app has the same one login,
358
- in the system keyring, shared with agy, so an instance of it with its own data folder would
359
- still be the same account; nothing for hatcheck to make until Google separates logins.
360
- - **ZCode.** Profiles need a variable from Z.ai that moves the session database (only `HOME` does
361
- today), usage needs a usage command zcode doesn't have, and a session is never written into its
362
- database, which the desktop app shares: a converted session is a file zcode is started on. If
363
- Z.ai documents the import its desktop app uses or adds a `zcode import` command, hatcheck should
364
- use that ([the proposal](docs/proposals/kimi-zcode.md) has the reasoning).
365
- - **DeepSeek Harness.** A direct per-session open needs an official web deep link or resume
366
- command, a handover in one step needs a first prompt `dsh web` doesn't take, and plan usage needs
367
- a documented quota API. Until then hatcheck opens `dsh web` and its session history, prints the
368
- prompt to paste for a converted session, and never writes DSH's store. Sessions before v4 aren't read; later ones need their own reader.
369
- - **MiniMax Code.** A converted session is a file mcode's terminal UI is started on, as agy's,
370
- since mcode has no importer; plan quota needs a no-refresh design and maintainer approval before
371
- the regional endpoint is used. Until then hatcheck reads the v2 store and shows no quota data. An idle selected TUI has no durable marker, so only an active writer lease blocks
372
- opening and conversion.
373
- - **Qwen Code.** A session converted for qwen is a file qwen is started on, as agy's and ZCode's
374
- are, since qwen has no importer (`qwen sessions` lists sessions and imports none); one written
375
- into its store would need one. Moving a session between qwen homes would copy its transcript,
376
- file history and side state, which hasn't been done. Plan usage needs a command or endpoint qwen
377
- doesn't have (its `usage/` files count the tokens a session spent, not what a plan has left).
378
- `QWEN_RUNTIME_DIR`, which moves the session data alone and leaves the login behind, isn't
379
- followed: only `QWEN_HOME`, which moves the home whole.
380
- - **GitHub Copilot CLI.** Its `/usage` runs only inside a session, so plan usage would need an
381
- endpoint and maintainer approval before any request is made; until then its homes show no data.
382
- Whether its system credential store keeps one login per `COPILOT_HOME` hasn't been checked:
383
- hatcheck never reads a login, and the probe is in [maintenance.md](docs/maintenance.md).
384
- Sessions aren't copied between its homes.
385
- - **OpenCode.** One data folder: a second store needs `XDG_DATA_HOME` or `OPENCODE_DB` and
386
- `--standalone`, since its background service keeps the store it started with, and which of those
387
- a named profile should mean is a decision not taken; until then hatcheck reads the folder plain
388
- opencode uses. Nothing marks a session open. Plan usage is its providers' own.
389
340
  - **Releases:** the CLI is on GitHub, the Homebrew tap, PyPI and crates.io from 0.2.0
390
341
  ([CHANGELOG.md](CHANGELOG.md)). Next are winget, then the app's installers, once its release
391
342
  workflow has its signing and updater secrets (`desktop.yml` lists them).
392
343
  - **Signing:** a Developer ID for the macOS app, and a certificate for the Windows one.
344
+ - **Each agent's gaps**, from Antigravity CLI profiles to a second OpenCode store, with what
345
+ would close each: [docs/agents.md](docs/agents.md#what-isnt-done-yet).
393
346
 
394
347
  ## Credits
395
348
 
@@ -407,7 +360,8 @@ off until you turn it on. See [desktop/README.md](desktop/README.md) to build an
407
360
  - **Z.ai and Kimi:** the provider settings in `crates/hatcheck/src/provider.rs` (endpoints, model slots, context
408
361
  windows and the config files) come from [claude-z](https://github.com/sam-fakhreddine/claude-z) by
409
362
  Kerim ([lettt325](https://github.com/lettt325)), MIT-licensed, and Yi Wang's
410
- [fork](https://github.com/yiwang/claude-z) of it, which added Kimi.
363
+ [fork](https://github.com/yiwang/claude-z) of it, which added Kimi. MiniMax's and DeepSeek's are
364
+ their own Claude Code guides'.
411
365
 
412
366
  ## License
413
367