leghorn 0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- leghorn-0.1/.gitignore +4 -0
- leghorn-0.1/LICENSE +21 -0
- leghorn-0.1/PKG-INFO +135 -0
- leghorn-0.1/README.md +112 -0
- leghorn-0.1/ccboard.py +850 -0
- leghorn-0.1/leghorn.1 +85 -0
- leghorn-0.1/leghorn.py +939 -0
- leghorn-0.1/packaging/apt/pubkey.asc +10 -0
- leghorn-0.1/packaging/build-deb.sh +57 -0
- leghorn-0.1/packaging/check-version-consistency.sh +93 -0
- leghorn-0.1/packaging/leghorn.rb +44 -0
- leghorn-0.1/pyproject.toml +52 -0
- leghorn-0.1/tests/test_ccboard_github.py +209 -0
- leghorn-0.1/tests/test_ccboard_windows.py +116 -0
leghorn-0.1/.gitignore
ADDED
leghorn-0.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 George M. Howard
|
|
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.
|
leghorn-0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: leghorn
|
|
3
|
+
Version: 0.1
|
|
4
|
+
Summary: Full-screen live view of every Claude Code session, its git state, and your GitHub CI
|
|
5
|
+
Project-URL: Homepage, https://github.com/gmhoward9289-ops/leghorn
|
|
6
|
+
Project-URL: Issues, https://github.com/gmhoward9289-ops/leghorn/issues
|
|
7
|
+
Author-email: "George M. Howard" <dev@swamplink.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: ci,claude,claude-code,dashboard,git,monitoring,tui
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console :: Curses
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
16
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: System :: Monitoring
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# leghorn
|
|
25
|
+
|
|
26
|
+
[](https://github.com/gmhoward9289-ops/leghorn/actions/workflows/ci.yml)
|
|
27
|
+
|
|
28
|
+
A full-screen live dashboard you leave open on a second monitor while many
|
|
29
|
+
Claude Code sessions work: every live session joined to its worktree and
|
|
30
|
+
**real git state**, your **GitHub CI and open PRs** with failures pinned until
|
|
31
|
+
they go green, and a commit feed across every repo, newest first.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
leghorn 20 sessions · 2 shared · 1 uncommitted · 3 ci red sort:attention filter:all 15:26:53
|
|
35
|
+
╭─ SESSIONS ───────────────────────────────────────────────╮ ╭─ COMMITS ──────────────────────────╮
|
|
36
|
+
│◉ leghorn-fea my-mcp-server Needs Input 72% │ │ 9m tools fix/build-cwd │
|
|
37
|
+
│● session-a3 api-refactor Idle 58% │ │ fix(api): resolve paths agai…│
|
|
38
|
+
│● session-d8 web-frontend ~2 ↑1 Processing 50% │ │ 25m web-frontend origin/ci/pub │
|
|
39
|
+
╰──────────────────────────────────────────────────────────╯ │ Automate publishing on relea…│
|
|
40
|
+
╭─ GITHUB ─────────────────────────────────────────────────╮ │ 29m api-refactor │
|
|
41
|
+
│ 17h ✗ my-mcp-server Required PR Sections (fix/fields) │ │ Add an in-program help panel │
|
|
42
|
+
│ 17h ✗ my-mcp-server #593 Add field selection ← sections │ │ 41m tools │
|
|
43
|
+
│ 17h ◍ tools Graph Update (queued 17h) │ │ Add a LOCAL MODELS panel │
|
|
44
|
+
│ 23m ✓ web-frontend ci (ci/npm-and-tap-publish) │ │ 1h api-refactor origin/feat/rel │
|
|
45
|
+
│ 24m ✓ web-frontend #18 Automate publishing APPROVED │ │ teach release_check to diff │
|
|
46
|
+
╰──────────────────────────────────────────────────────────╯ ╰────────────────────────────────────╯
|
|
47
|
+
q quit r refresh s sort f filter g git tab pane enter detail ? help
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Sessions that share a working tree are marked contested (◉) — two sessions in
|
|
51
|
+
one checkout silently destroy each other's uncommitted work, and seeing it
|
|
52
|
+
happen is the first step to not doing it. The GitHub pane ranks by what it
|
|
53
|
+
costs to ignore: running first, then red (a failure must not scroll away),
|
|
54
|
+
then stuck-in-queue, then everything else by freshness.
|
|
55
|
+
|
|
56
|
+
Two files, stdlib only, Python 3.9+. macOS and Linux (curses). Read-only by
|
|
57
|
+
construction: it runs `gh`, read-only git plumbing, and (if present)
|
|
58
|
+
`claudectl`, and never writes to a tree, a registry or a session. Every data
|
|
59
|
+
source is optional — missing pieces degrade to a labelled gap, never an error.
|
|
60
|
+
|
|
61
|
+
## Install
|
|
62
|
+
|
|
63
|
+
Homebrew (macOS and Linux):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
brew install gmhoward9289-ops/tap/leghorn
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
npm:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm install -g leghorn
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
pipx / pip:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pipx install leghorn
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Debian and Ubuntu, from the signed apt repo — this also gets you `apt upgrade`:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
curl -fsSL https://gmhoward9289-ops.github.io/leghorn/leghorn-archive-keyring.asc | sudo gpg --dearmor -o /usr/share/keyrings/leghorn-archive-keyring.gpg
|
|
85
|
+
echo "deb [signed-by=/usr/share/keyrings/leghorn-archive-keyring.gpg] https://gmhoward9289-ops.github.io/leghorn stable main" | sudo tee /etc/apt/sources.list.d/leghorn.list
|
|
86
|
+
sudo apt update
|
|
87
|
+
sudo apt install leghorn
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Or grab `leghorn_<version>_all.deb` from the
|
|
91
|
+
[latest release](https://github.com/gmhoward9289-ops/leghorn/releases/latest)
|
|
92
|
+
and `sudo apt install ./leghorn_<version>_all.deb`.
|
|
93
|
+
|
|
94
|
+
## What it needs
|
|
95
|
+
|
|
96
|
+
- **git** — for the per-tree state and the commit feed.
|
|
97
|
+
- **gh** (authenticated) — for the GITHUB pane. Unauthenticated, the pane says
|
|
98
|
+
"cannot see github" rather than pretending nothing is happening; an empty
|
|
99
|
+
feed and a feed that cannot see are different facts.
|
|
100
|
+
- **claudectl** (optional) — session status and context columns. Without it
|
|
101
|
+
you still get names, trees, branches and git state.
|
|
102
|
+
|
|
103
|
+
Clones are discovered under `~/GitHub` (override: `LEGHORN_ROOT`).
|
|
104
|
+
|
|
105
|
+
## Usage
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
leghorn # three panes, refreshing every 5s
|
|
109
|
+
leghorn -i 2 # ...every 2s
|
|
110
|
+
leghorn --no-github # hide the GitHub pane (no gh calls at all)
|
|
111
|
+
leghorn --no-commits # hide the commit feed
|
|
112
|
+
leghorn --github-interval 120 # slower gh sweeps
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Keys: `q` quit · `r` refresh (including a gh sweep) · `s`/`f` cycle
|
|
116
|
+
sort/filter · `tab` cycle panes · `j`/`k` move · `enter` detail ·
|
|
117
|
+
`?` help — which explains what each screen and symbol *means*, not just the
|
|
118
|
+
keys.
|
|
119
|
+
|
|
120
|
+
The data layer is also a command of its own:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
python3 -m ccboard # one table of sessions, for a hook or a pipe
|
|
124
|
+
python3 -m ccboard --github # the CI/PR feed as plain text
|
|
125
|
+
python3 -m ccboard --json # records, for piping somewhere else
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Name
|
|
129
|
+
|
|
130
|
+
The Leghorn is the chicken breed that spots everything first and is never
|
|
131
|
+
quiet about it.
|
|
132
|
+
|
|
133
|
+
## License
|
|
134
|
+
|
|
135
|
+
MIT
|
leghorn-0.1/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# leghorn
|
|
2
|
+
|
|
3
|
+
[](https://github.com/gmhoward9289-ops/leghorn/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
A full-screen live dashboard you leave open on a second monitor while many
|
|
6
|
+
Claude Code sessions work: every live session joined to its worktree and
|
|
7
|
+
**real git state**, your **GitHub CI and open PRs** with failures pinned until
|
|
8
|
+
they go green, and a commit feed across every repo, newest first.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
leghorn 20 sessions · 2 shared · 1 uncommitted · 3 ci red sort:attention filter:all 15:26:53
|
|
12
|
+
╭─ SESSIONS ───────────────────────────────────────────────╮ ╭─ COMMITS ──────────────────────────╮
|
|
13
|
+
│◉ leghorn-fea my-mcp-server Needs Input 72% │ │ 9m tools fix/build-cwd │
|
|
14
|
+
│● session-a3 api-refactor Idle 58% │ │ fix(api): resolve paths agai…│
|
|
15
|
+
│● session-d8 web-frontend ~2 ↑1 Processing 50% │ │ 25m web-frontend origin/ci/pub │
|
|
16
|
+
╰──────────────────────────────────────────────────────────╯ │ Automate publishing on relea…│
|
|
17
|
+
╭─ GITHUB ─────────────────────────────────────────────────╮ │ 29m api-refactor │
|
|
18
|
+
│ 17h ✗ my-mcp-server Required PR Sections (fix/fields) │ │ Add an in-program help panel │
|
|
19
|
+
│ 17h ✗ my-mcp-server #593 Add field selection ← sections │ │ 41m tools │
|
|
20
|
+
│ 17h ◍ tools Graph Update (queued 17h) │ │ Add a LOCAL MODELS panel │
|
|
21
|
+
│ 23m ✓ web-frontend ci (ci/npm-and-tap-publish) │ │ 1h api-refactor origin/feat/rel │
|
|
22
|
+
│ 24m ✓ web-frontend #18 Automate publishing APPROVED │ │ teach release_check to diff │
|
|
23
|
+
╰──────────────────────────────────────────────────────────╯ ╰────────────────────────────────────╯
|
|
24
|
+
q quit r refresh s sort f filter g git tab pane enter detail ? help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Sessions that share a working tree are marked contested (◉) — two sessions in
|
|
28
|
+
one checkout silently destroy each other's uncommitted work, and seeing it
|
|
29
|
+
happen is the first step to not doing it. The GitHub pane ranks by what it
|
|
30
|
+
costs to ignore: running first, then red (a failure must not scroll away),
|
|
31
|
+
then stuck-in-queue, then everything else by freshness.
|
|
32
|
+
|
|
33
|
+
Two files, stdlib only, Python 3.9+. macOS and Linux (curses). Read-only by
|
|
34
|
+
construction: it runs `gh`, read-only git plumbing, and (if present)
|
|
35
|
+
`claudectl`, and never writes to a tree, a registry or a session. Every data
|
|
36
|
+
source is optional — missing pieces degrade to a labelled gap, never an error.
|
|
37
|
+
|
|
38
|
+
## Install
|
|
39
|
+
|
|
40
|
+
Homebrew (macOS and Linux):
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
brew install gmhoward9289-ops/tap/leghorn
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
npm:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install -g leghorn
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
pipx / pip:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pipx install leghorn
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Debian and Ubuntu, from the signed apt repo — this also gets you `apt upgrade`:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
curl -fsSL https://gmhoward9289-ops.github.io/leghorn/leghorn-archive-keyring.asc | sudo gpg --dearmor -o /usr/share/keyrings/leghorn-archive-keyring.gpg
|
|
62
|
+
echo "deb [signed-by=/usr/share/keyrings/leghorn-archive-keyring.gpg] https://gmhoward9289-ops.github.io/leghorn stable main" | sudo tee /etc/apt/sources.list.d/leghorn.list
|
|
63
|
+
sudo apt update
|
|
64
|
+
sudo apt install leghorn
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Or grab `leghorn_<version>_all.deb` from the
|
|
68
|
+
[latest release](https://github.com/gmhoward9289-ops/leghorn/releases/latest)
|
|
69
|
+
and `sudo apt install ./leghorn_<version>_all.deb`.
|
|
70
|
+
|
|
71
|
+
## What it needs
|
|
72
|
+
|
|
73
|
+
- **git** — for the per-tree state and the commit feed.
|
|
74
|
+
- **gh** (authenticated) — for the GITHUB pane. Unauthenticated, the pane says
|
|
75
|
+
"cannot see github" rather than pretending nothing is happening; an empty
|
|
76
|
+
feed and a feed that cannot see are different facts.
|
|
77
|
+
- **claudectl** (optional) — session status and context columns. Without it
|
|
78
|
+
you still get names, trees, branches and git state.
|
|
79
|
+
|
|
80
|
+
Clones are discovered under `~/GitHub` (override: `LEGHORN_ROOT`).
|
|
81
|
+
|
|
82
|
+
## Usage
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
leghorn # three panes, refreshing every 5s
|
|
86
|
+
leghorn -i 2 # ...every 2s
|
|
87
|
+
leghorn --no-github # hide the GitHub pane (no gh calls at all)
|
|
88
|
+
leghorn --no-commits # hide the commit feed
|
|
89
|
+
leghorn --github-interval 120 # slower gh sweeps
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Keys: `q` quit · `r` refresh (including a gh sweep) · `s`/`f` cycle
|
|
93
|
+
sort/filter · `tab` cycle panes · `j`/`k` move · `enter` detail ·
|
|
94
|
+
`?` help — which explains what each screen and symbol *means*, not just the
|
|
95
|
+
keys.
|
|
96
|
+
|
|
97
|
+
The data layer is also a command of its own:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
python3 -m ccboard # one table of sessions, for a hook or a pipe
|
|
101
|
+
python3 -m ccboard --github # the CI/PR feed as plain text
|
|
102
|
+
python3 -m ccboard --json # records, for piping somewhere else
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Name
|
|
106
|
+
|
|
107
|
+
The Leghorn is the chicken breed that spots everything first and is never
|
|
108
|
+
quiet about it.
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT
|