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.
- {hatcheck-0.7.0 → hatcheck-0.7.2}/Cargo.lock +1 -1
- {hatcheck-0.7.0 → hatcheck-0.7.2}/Cargo.toml +1 -1
- {hatcheck-0.7.0 → hatcheck-0.7.2}/PKG-INFO +116 -162
- {hatcheck-0.7.0 → hatcheck-0.7.2}/README.md +115 -161
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/Cargo.toml +9 -1
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/README.md +14 -5
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/agy.rs +131 -11
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/args.rs +38 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/best.rs +100 -13
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/cl.rs +2 -1
- hatcheck-0.7.2/crates/hatcheck/src/bin/claude-d.rs +7 -0
- hatcheck-0.7.2/crates/hatcheck/src/bin/claude-m.rs +7 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bind.rs +251 -35
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/cli.rs +83 -20
- hatcheck-0.7.2/crates/hatcheck/src/completions.rs +780 -0
- hatcheck-0.7.2/crates/hatcheck/src/config.rs +843 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/conv.rs +16 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/copilot.rs +2 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/desktop.rs +269 -40
- hatcheck-0.7.2/crates/hatcheck/src/desktop_windows.rs +592 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/doctor.rs +120 -5
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/dsh.rs +2 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/facts.rs +178 -12
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/find.rs +33 -2
- hatcheck-0.7.2/crates/hatcheck/src/history.rs +349 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/kimi.rs +7 -9
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/launch.rs +30 -34
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/lib.rs +8 -1
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/mcode.rs +2 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/move_cmd.rs +104 -36
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/open_cmd.rs +16 -7
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/opencode.rs +71 -10
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/paths.rs +70 -19
- hatcheck-0.7.2/crates/hatcheck/src/profiles.rs +1091 -0
- hatcheck-0.7.2/crates/hatcheck/src/provider.rs +1124 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/qwen.rs +2 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/relocate.rs +33 -15
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/resume.rs +2 -2
- hatcheck-0.7.2/crates/hatcheck/src/search.rs +962 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/sessions.rs +676 -79
- hatcheck-0.7.2/crates/hatcheck/src/show.rs +244 -0
- hatcheck-0.7.2/crates/hatcheck/src/statusline.rs +481 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/usage.rs +120 -12
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/where_cmd.rs +65 -12
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/zcode.rs +2 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/pyproject.toml +3 -3
- hatcheck-0.7.0/crates/hatcheck/src/provider.rs +0 -634
- hatcheck-0.7.0/crates/hatcheck/src/show.rs +0 -136
- {hatcheck-0.7.0 → hatcheck-0.7.2}/LICENSE +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/LICENSE +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/agent.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/ck.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/claude-k.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/claude-z.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/cx.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/bin/hat.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/main.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/ospath.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/out.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/py.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/serve.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/times.rs +0 -0
- {hatcheck-0.7.0 → hatcheck-0.7.2}/crates/hatcheck/src/widths.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hatcheck
|
|
3
|
-
Version: 0.7.
|
|
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:
|
|
33
|
-
macOS
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
(`
|
|
38
|
-
|
|
39
|
-
and
|
|
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**:
|
|
49
|
-
own data folder and login, and a launcher in a colour you pick, which brings the
|
|
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
|
|
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 |
|
|
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
|
|
84
|
-
|
|
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
|
|
89
|
-
hatcheck desktop open a # or open it from Launchpad or the
|
|
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.
|
|
95
|
-
forward, macOS asks whether it may control System Events; allow it, once per launcher.
|
|
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
|
|
98
|
-
|
|
99
|
-
Claude's built-in data folder, which
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
MiniMax Code
|
|
125
|
-
`
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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-
|
|
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.
|
|
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 `
|
|
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
|
|
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
|
|
189
|
-
| [`hatcheck
|
|
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
|
|
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
|
|
244
|
-
Code, which calls them only when you run `
|
|
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/`**:
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
-
[
|
|
331
|
-
[
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
- **`
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
|