fleetwatcher 0.4.0__py3-none-any.whl

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.
@@ -0,0 +1,200 @@
1
+ Metadata-Version: 2.4
2
+ Name: fleetwatcher
3
+ Version: 0.4.0
4
+ Summary: One screen for every terminal coding session you have running, across Claude Code, Codex, Grok, and Gemini
5
+ Author-email: Luke Steuber <luke@lukesteuber.com>
6
+ Project-URL: Homepage, https://github.com/lukeslp/fleetwatch
7
+ Project-URL: Repository, https://github.com/lukeslp/fleetwatch
8
+ Project-URL: Issues, https://github.com/lukeslp/fleetwatch/issues
9
+ Keywords: cli,tui,dashboard,claude-code,codex,coding-agents,monitoring
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Topic :: Software Development
17
+ Classifier: Topic :: Utilities
18
+ Requires-Python: >=3.10
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: textual>=0.60
22
+ Provides-Extra: summaries
23
+ Requires-Dist: anthropic>=0.40; extra == "summaries"
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=8; extra == "dev"
26
+ Dynamic: license-file
27
+
28
+ # fleetwatch
29
+
30
+ One screen for every terminal coding session you have running.
31
+
32
+ fleetwatch watches the coding CLIs you already run (Claude Code, Codex, Grok,
33
+ Gemini) and shows a single live dashboard of what each session is doing and which
34
+ ones are waiting on you. It reads each tool's own session files on disk,
35
+ read-only. There is nothing to install into those tools, no daemon, no hooks. If
36
+ a CLI writes a transcript, fleetwatch can watch it.
37
+
38
+ ```
39
+ fleetwatch 17:18:43 active 1 waiting 1 idle 2 done 7 (total 11)
40
+
41
+ HOST VENDOR PROJECT STATE IDLE ! WHAT
42
+ local claude orrery active 3s editing PhaseSpaceCoordinator.swift
43
+ local claude bipolar waiting 40s ! waiting for you to approve: rm -rf build
44
+ dreamer codex storyblocks idle 4m finished a turn
45
+ dreamer gemini hivescape done 2h responding
46
+ ```
47
+
48
+ Status: early, but in daily use across a local Mac and a VPS. Current release
49
+ `0.3.x`.
50
+
51
+ ## What it tracks
52
+
53
+ For each session: the vendor, the project, what it is working on right now, how
54
+ long since it last moved, and a flag the moment it needs you.
55
+
56
+ | State | Meaning |
57
+ |-------|---------|
58
+ | `active` | the transcript just changed; it is working |
59
+ | `waiting` | blocked on you (a pending permission, an unanswered question) |
60
+ | `idle` | finished its turn a moment ago |
61
+ | `done` | finished a while ago |
62
+ | `error` | something failed, or the transcript cannot be read |
63
+
64
+ The `waiting` signal is the point of the whole tool, and it is built on the real
65
+ shape of each vendor's files: a Claude `tool_use` with no matching result, a
66
+ Codex command awaiting approval, a Grok `permission_requested` event with no
67
+ resolution. A session that is genuinely mid-tool stays `active`; only a stalled
68
+ one becomes `waiting`.
69
+
70
+ Each state has its own bright primary (blue for `active`, yellow for `waiting`,
71
+ red for `error`) plus a glyph (`● ◆ ✗ ○ ·`), so the board reads by shape even
72
+ with the color off. `idle` and `done` recede into grey. Vendors carry their own
73
+ accent (orange, cyan, magenta, violet), kept clear of the state colors so a
74
+ vendor tag never reads as a status. Nothing leans on a red-versus-green
75
+ distinction, the one pair color-blind readers cannot separate. The dashboard is
76
+ always in color; `--once` adds color when it prints to a terminal and stays
77
+ plain text when you pipe it to a file or a log.
78
+
79
+ ## Install
80
+
81
+ Not on PyPI yet. Install from source:
82
+
83
+ ```sh
84
+ git clone https://github.com/lukeslp/fleetwatch
85
+ cd fleetwatch
86
+ python3 -m venv .venv
87
+ .venv/bin/pip install -e . # dashboard only: free, no network
88
+ .venv/bin/pip install -e ".[summaries]" # add plain-language summaries (Claude Haiku)
89
+ ```
90
+
91
+ Python 3.10 or newer. The install puts `fleetwatch` and `fw` on the PATH inside
92
+ the venv; activate the venv, or symlink `.venv/bin/fleetwatch` onto your PATH.
93
+
94
+ ## Usage
95
+
96
+ ```sh
97
+ fleetwatch # live dashboard
98
+ fleetwatch --once # one text snapshot, then exit
99
+ fleetwatch --export-json # machine-readable snapshot (scripting, remote hosts)
100
+ fleetwatch --no-model # heuristics only, no network
101
+ fleetwatch --vendors claude,codex # watch a subset
102
+ fleetwatch --hosts dreamer=user@host # also watch another machine over ssh
103
+ fleetwatch --export-json --summarize-all # full report: summarize every session
104
+ ```
105
+
106
+ In the dashboard: `q` quit, `r` refresh now, `s` summarize the selected session,
107
+ `S` summarize the whole fleet, arrows or `j`/`k` to move. Selecting a session
108
+ also summarizes it on its own, and the detail panel shows the summary, the plan,
109
+ and the last exchange for whichever session is selected.
110
+
111
+ ## Supported CLIs
112
+
113
+ | CLI | Reads |
114
+ |-----|-------|
115
+ | Claude Code | `~/.claude/projects/<cwd>/<uuid>.jsonl` |
116
+ | Codex | `~/.codex/sessions/**/rollout-*.jsonl` |
117
+ | Grok | `~/.grok/sessions/<cwd>/` (history + per-session events) |
118
+ | Gemini | `~/.gemini/tmp/<project>/chats/*.jsonl` |
119
+
120
+ Gemini CLI has no human-approval gate, so its sessions report active, idle, and
121
+ done but never `waiting`. There is no on-disk "blocked on you" signal to read.
122
+
123
+ Each adapter is small and isolated, so adding a vendor is a contained job. See
124
+ [CONTRIBUTING.md](CONTRIBUTING.md).
125
+
126
+ ## Summaries (optional)
127
+
128
+ Every row carries a quick heuristic line for free. On top of that, fleetwatch can
129
+ write a one-sentence plain-language status with Claude Haiku.
130
+
131
+ Summaries turn on automatically when the `summaries` extra is installed and
132
+ `ANTHROPIC_API_KEY` is set. They run for sessions that need attention and for
133
+ whichever session you select, in the background, cached per session, so a fleet
134
+ you are not looking at costs nothing. Press `S` (or run `--summarize-all`) to
135
+ sweep every session at once.
136
+
137
+ Without the extra or the key, fleetwatch never makes a network call and shows the
138
+ heuristic line instead. `--no-model` forces heuristics-only even when summaries
139
+ are available.
140
+
141
+ ## Watching other machines
142
+
143
+ `fleetwatch --hosts dreamer=user@host` adds a remote host. Each refresh runs one
144
+ `ssh <host> fleetwatch --export-json`, so the remote normalizes its own sessions
145
+ and hands back the result: one command per host, the conversation content stays
146
+ on the channel you already trust, and a host that goes unreachable goes stale
147
+ rather than vanishing from the board. The remote just needs `fleetwatch` on its
148
+ `PATH`. Once more than one host is in view, a `HOST` column appears so you can
149
+ tell which machine each session is on.
150
+
151
+ ## Privacy
152
+
153
+ fleetwatch reads your CLIs' session files read-only and never writes to them. The
154
+ dashboard displays short excerpts (the last user and agent messages, the plan)
155
+ locally.
156
+
157
+ A summary is the only thing that ever leaves your machine, and only when you have
158
+ opted into summaries (the `summaries` extra plus `ANTHROPIC_API_KEY`): a short
159
+ slice of one session's recent activity is sent to Claude Haiku to write a single
160
+ sentence. With `--no-model`, or without the extra or key, nothing is sent
161
+ anywhere. Remote hosts are read over your own ssh connection; their session
162
+ content travels only over that channel.
163
+
164
+ ## How it works
165
+
166
+ Four small layers, each independently testable:
167
+
168
+ 1. **Adapters** translate one vendor's files into a single normalized
169
+ `SessionState`. One adapter per vendor, each tested against captured fixture
170
+ transcripts.
171
+ 2. **The aggregator** polls adapters by file modification time and reads only a
172
+ bounded tail of each transcript, so a 25 MB session file is never read whole.
173
+ It sorts the fleet needs-first and merges remote hosts.
174
+ 3. **The summarizer** adds the Haiku sentence, cached and off the UI thread.
175
+ 4. **The dashboard** (Textual) renders it and refreshes on an interval.
176
+
177
+ ## Configuration
178
+
179
+ All optional, via environment variables:
180
+
181
+ | Variable | Default | Effect |
182
+ |----------|---------|--------|
183
+ | `FLEETWATCH_ACTIVE_WINDOW` | `12` | seconds of quiet before a session stops counting as active |
184
+ | `FLEETWATCH_DONE_AFTER` | `1800` | seconds of quiet before idle becomes done |
185
+ | `FLEETWATCH_MAX_AGE` | `259200` | drop sessions older than this (3 days) |
186
+ | `FLEETWATCH_REFRESH` | `2` | dashboard refresh interval, seconds |
187
+ | `FLEETWATCH_MODEL` | `claude-haiku-4-5-20251001` | summary model |
188
+ | `FLEETWATCH_VENDORS` | `claude,codex,grok,gemini` | which CLIs to watch |
189
+ | `FLEETWATCH_HOSTS` | unset | remote hosts over ssh (`name` or `name=ssh_target`, comma-separated) |
190
+ | `FLEETWATCH_NO_MODEL` | unset | set to `1` to disable summaries |
191
+
192
+ ## Contributing
193
+
194
+ Bug reports, vendor adapters, and fixes are welcome. See
195
+ [CONTRIBUTING.md](CONTRIBUTING.md) for the setup, the adapter contract, and how
196
+ to add a new CLI.
197
+
198
+ ## License
199
+
200
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,24 @@
1
+ fleetwatch/__init__.py,sha256=XTbiGlueNuqyfLKIevvKo-wW2UI1ftmpwnAxuOnpPiY,105
2
+ fleetwatch/cli.py,sha256=Cg-BJYhFcUZohQ6URd4N8pteDLJiCPPh0m8Z35Dc9D0,2732
3
+ fleetwatch/config.py,sha256=X6Y1jRuYtJ3CkUz-u5ds9h-l1icVH-kIKU-r-Ep2cXU,1517
4
+ fleetwatch/core.py,sha256=165gjrQSt7vOUUgw8VtBFad-xNIjFPu-wZDb0sRhyGs,9279
5
+ fleetwatch/models.py,sha256=KPDxnttowq0I3IVosO96zaYh6Mj5xPhW1tWNA28ZfUA,4053
6
+ fleetwatch/palette.py,sha256=9yaXKjHjVjw__SXm1YEy08xtJU7kxV15a_CL3n3VUvU,3796
7
+ fleetwatch/remote.py,sha256=6J188xcOjIUbW2kcRwOgEd9zH2m2ZRvZKvnrAvbfBhw,3628
8
+ fleetwatch/render.py,sha256=z5bz-tQ7NJOuvEsf6bMhWrw-Z2bgoOH-6vxZLdZmjv0,5731
9
+ fleetwatch/summarize.py,sha256=I3dhLDtBsl14GHrmWlkLQl6LxF0g_9M0wmqvGCIuMZw,5317
10
+ fleetwatch/tailer.py,sha256=ZzZEs7ZWT7vw_xG67cVlzxXvQZJa8YzgjAFfvLxgcRM,2114
11
+ fleetwatch/tui.py,sha256=fqRqtLa5aBmaXQk6PDxuEb5i6VdVPvw1G92yzUVCYDA,17422
12
+ fleetwatch/util.py,sha256=SmKbQBuUG06_oYOMZDEkmb5-vhotNIsAqRP8UCtNRTM,855
13
+ fleetwatch/adapters/__init__.py,sha256=k0s1bEh8O3damZHZZ7s-smLVgKJ-NZ2936A8yHKOZG4,1180
14
+ fleetwatch/adapters/base.py,sha256=VBgo46eadkASBDojh2MpD_RgFNlde4YvoQ-YpLsnhxg,3983
15
+ fleetwatch/adapters/claude.py,sha256=Ki6CMbEnLPhs9xiX3ntyBqn_h1dMVxZ4bnR92-Xqi7o,15795
16
+ fleetwatch/adapters/codex.py,sha256=eJC_C2yfia0miGJK_krJ_dmTo7xzq6iFY2tQXt6J2lc,16465
17
+ fleetwatch/adapters/gemini.py,sha256=TfLyO0pMQs9pMPLpeq8GPILgIDNobXbHCOg2_HLFUXQ,13985
18
+ fleetwatch/adapters/grok.py,sha256=qeLvB1Qww-ofxIs-B5dyHxOszOCHHP8fD5go2mZAK8U,19298
19
+ fleetwatcher-0.4.0.dist-info/licenses/LICENSE,sha256=BJZRNeNtYqY2H0k097JbFGRKP53AcCsZ1PIblC7hN2A,1069
20
+ fleetwatcher-0.4.0.dist-info/METADATA,sha256=3QU4TPnN7eNln4UvCaV45q0HyQMg_cC2UtrpeQNZGLk,8745
21
+ fleetwatcher-0.4.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
22
+ fleetwatcher-0.4.0.dist-info/entry_points.txt,sha256=hHZxMLwNcq6VSDy2KzR8Q2ay8o32RD67obZvSIovOp0,76
23
+ fleetwatcher-0.4.0.dist-info/top_level.txt,sha256=H5LEmmOGIFVhwobJRVLff9Q-Gw1oXQh8BlrxSa7j7VQ,11
24
+ fleetwatcher-0.4.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ fleetwatch = fleetwatch.cli:main
3
+ fw = fleetwatch.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Luke Steuber
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ fleetwatch