skiplevel 1.1.0__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.
- skiplevel-1.1.0/.gitignore +14 -0
- skiplevel-1.1.0/LICENSE +21 -0
- skiplevel-1.1.0/PKG-INFO +227 -0
- skiplevel-1.1.0/README.md +205 -0
- skiplevel-1.1.0/pyproject.toml +37 -0
- skiplevel-1.1.0/skiplevel/__init__.py +3 -0
- skiplevel-1.1.0/skiplevel/adapter_codex.py +344 -0
- skiplevel-1.1.0/skiplevel/adapter_opencode.py +316 -0
- skiplevel-1.1.0/skiplevel/adapters.py +231 -0
- skiplevel-1.1.0/skiplevel/assets/base.css +270 -0
- skiplevel-1.1.0/skiplevel/assets/report.js +485 -0
- skiplevel-1.1.0/skiplevel/assets/themes.css +207 -0
- skiplevel-1.1.0/skiplevel/charts.py +213 -0
- skiplevel-1.1.0/skiplevel/cli.py +126 -0
- skiplevel-1.1.0/skiplevel/constants.py +168 -0
- skiplevel-1.1.0/skiplevel/copylines.py +157 -0
- skiplevel-1.1.0/skiplevel/formatting.py +36 -0
- skiplevel-1.1.0/skiplevel/metrics.py +603 -0
- skiplevel-1.1.0/skiplevel/parser.py +99 -0
- skiplevel-1.1.0/skiplevel/report.py +144 -0
- skiplevel-1.1.0/skiplevel/roast.py +106 -0
- skiplevel-1.1.0/skiplevel/scorer.py +196 -0
- skiplevel-1.1.0/skiplevel/templates/_awards.html.j2 +16 -0
- skiplevel-1.1.0/skiplevel/templates/_deck.html.j2 +167 -0
- skiplevel-1.1.0/skiplevel/templates/_footer.html.j2 +19 -0
- skiplevel-1.1.0/skiplevel/templates/_hero.html.j2 +25 -0
- skiplevel-1.1.0/skiplevel/templates/_receipt.html.j2 +24 -0
- skiplevel-1.1.0/skiplevel/templates/_reviews.html.j2 +58 -0
- skiplevel-1.1.0/skiplevel/templates/_tables.html.j2 +83 -0
- skiplevel-1.1.0/skiplevel/templates/report.html.j2 +46 -0
skiplevel-1.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Repowise
|
|
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.
|
skiplevel-1.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: skiplevel
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: Have a skip-level with your coding agents: The 360 Review, a two-sided performance review generated locally from your own transcripts.
|
|
5
|
+
Project-URL: Homepage, https://github.com/repowise-dev/skiplevel
|
|
6
|
+
Project-URL: Issues, https://github.com/repowise-dev/skiplevel/issues
|
|
7
|
+
Author: Repowise
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: analytics,claude,claude-code,cli,codex,coding-agent,opencode,skiplevel
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Requires-Dist: jinja2>=3.0
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
<div align="center">
|
|
24
|
+
|
|
25
|
+
# skiplevel
|
|
26
|
+
|
|
27
|
+
**Have a skip-level with your coding agents.**
|
|
28
|
+
|
|
29
|
+
[](https://pypi.org/project/skiplevel/)
|
|
30
|
+
[](https://pypi.org/project/skiplevel/)
|
|
31
|
+
[](LICENSE)
|
|
32
|
+
[](#privacy)
|
|
33
|
+
[](#supported-agents)
|
|
34
|
+
|
|
35
|
+
<img src="https://raw.githubusercontent.com/repowise-dev/skiplevel/main/docs/hero.gif" alt="The 360 Review — a sample skiplevel report scrolling through the agent's scorecard" width="860">
|
|
36
|
+
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
You meet with the agent. The agent meets with you. Management hears both
|
|
40
|
+
sides. skiplevel turns the transcripts already sitting on your machine
|
|
41
|
+
into **The 360 Review**: a two-sided performance review between you and
|
|
42
|
+
your coding agents — Claude Code, Codex CLI, and opencode. HR regrets
|
|
43
|
+
scheduling the meeting.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
$ uvx skiplevel
|
|
47
|
+
|
|
48
|
+
skiplevel: scheduling a meeting with Claude Code + opencode's managers...
|
|
49
|
+
rifling through ~/.claude/projects ...
|
|
50
|
+
rifling through ~/.local/share/opencode ...
|
|
51
|
+
found 652 sessions (432 MB). Reading everything. Judging silently.
|
|
52
|
+
parsed 541 sessions across 31 days...
|
|
53
|
+
counted 52 'you're absolutely right's... oh no
|
|
54
|
+
tallied 34,849 tool calls and $4,062.61 in tokens...
|
|
55
|
+
found one file read 30 times in a single session. no further questions.
|
|
56
|
+
verdict: AGENT A- / YOU B. the committee has spoken.
|
|
57
|
+
|
|
58
|
+
Skip-level complete in 8.1s. The truth is in skiplevel-report.html
|
|
59
|
+
generated locally. nothing left your machine.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
One self-contained HTML file. Four themes: midnight (dark, default),
|
|
63
|
+
paper (printed HR document), terminal (green phosphor), and tabloid
|
|
64
|
+
(newsprint gossip). Switchable from a pill in the report, persistent,
|
|
65
|
+
and exports respect the active theme. Looks good in screenshots, which
|
|
66
|
+
is the point.
|
|
67
|
+
|
|
68
|
+
## Quickstart
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uvx skiplevel # zero install, zero config
|
|
72
|
+
# or
|
|
73
|
+
pip install skiplevel
|
|
74
|
+
skiplevel
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Flags:
|
|
78
|
+
|
|
79
|
+
| flag | what it does |
|
|
80
|
+
|-------------|---------------------------------------------------------|
|
|
81
|
+
| `--harness H` | `auto` (default: review every agent with transcripts), `claude-code`, `codex`, or `opencode` |
|
|
82
|
+
| `--dir PATH` | transcripts root (default: each harness's own home) |
|
|
83
|
+
| `--out PATH` | output file (default `./skiplevel-report.html`) |
|
|
84
|
+
| `--json` | also dump the raw stats JSON next to the HTML |
|
|
85
|
+
| `--no-open` | do not open a browser |
|
|
86
|
+
| `--roast` | opt-in LLM roast via your own `claude` CLI (see below) |
|
|
87
|
+
| `--theme T` | initial theme: `midnight`, `paper`, `terminal`, `tabloid` |
|
|
88
|
+
|
|
89
|
+
## Supported agents
|
|
90
|
+
|
|
91
|
+
| harness | where the diary lives |
|
|
92
|
+
|-------------|-------------------------------------------------------------|
|
|
93
|
+
| Claude Code | `~/.claude/projects/**/*.jsonl` |
|
|
94
|
+
| Codex CLI | `$CODEX_HOME/sessions/` and `archived_sessions/` rollout JSONL (default `~/.codex`) |
|
|
95
|
+
| opencode | `~/.local/share/opencode/opencode.db` (SQLite), or the older `storage/` JSON tree |
|
|
96
|
+
|
|
97
|
+
By default every harness with transcripts gets summoned into the same
|
|
98
|
+
meeting and one combined review. `--harness codex` (or `claude-code`,
|
|
99
|
+
`opencode`) reviews a single agent; `--dir` points at a non-standard
|
|
100
|
+
location, and the layout is sniffed automatically.
|
|
101
|
+
|
|
102
|
+
Notes per harness:
|
|
103
|
+
|
|
104
|
+
- **Codex CLI**: archived copies of active sessions are deduplicated,
|
|
105
|
+
forked-session token replays are not double-counted, and sessions
|
|
106
|
+
predating token telemetry (Sept 2025) parse fine with zero cost.
|
|
107
|
+
- **opencode**: child (subagent) sessions count toward tokens and tools
|
|
108
|
+
but not toward your prompt stats; opencode's own per-message cost is
|
|
109
|
+
used when present, otherwise the price table kicks in.
|
|
110
|
+
|
|
111
|
+
## What gets covered in the meeting
|
|
112
|
+
|
|
113
|
+
**You** get graded on clarity, patience, civility, and trust calibration:
|
|
114
|
+
prompt lengths, a punch card of when you actually work, your late-night
|
|
115
|
+
ratio, interrupt rate, vocabulary (including your "fix" count and your
|
|
116
|
+
all-caps incidents), and the median seconds you give the agent before
|
|
117
|
+
demanding more.
|
|
118
|
+
|
|
119
|
+
**The agent** gets graded on efficiency, reliability, safety, and composure:
|
|
120
|
+
"you're absolutely right" counts, apology rates, files it read 4+ times in
|
|
121
|
+
one session (object permanence), retry storms (the same failing call, again,
|
|
122
|
+
with hope), sensitive file touches with timestamps, blast radius, and its
|
|
123
|
+
longest unsupervised tool-call chain.
|
|
124
|
+
|
|
125
|
+
**The relationship** gets the rest: apology asymmetry, a timeline of your
|
|
126
|
+
single longest session, an itemized Expense Report of Regret, compatibility
|
|
127
|
+
score, and yearbook superlatives.
|
|
128
|
+
|
|
129
|
+
Under the comedy there is a genuinely useful layer: sortable tables of
|
|
130
|
+
redundant reads, retry storms, sensitive file touches, per-session cost
|
|
131
|
+
trend, and top edited files. Real numbers, real receipts.
|
|
132
|
+
|
|
133
|
+
## How the grading works
|
|
134
|
+
|
|
135
|
+
Two report cards — one for the agent, one for you — plus an archetype, a
|
|
136
|
+
compatibility score, and yearbook superlatives. None of it is vibes. Each
|
|
137
|
+
grade is a weighted average of four traits, each trait a number from 0 to 1
|
|
138
|
+
traced back to something you actually did:
|
|
139
|
+
|
|
140
|
+
| who | graded on (weights) |
|
|
141
|
+
|-------|--------------------------------------------------------------|
|
|
142
|
+
| agent | efficiency (35%), reliability (30%), composure (20%), safety (15%) |
|
|
143
|
+
| you | clarity (30%), patience (30%), civility (20%), trust (20%) |
|
|
144
|
+
|
|
145
|
+
Two opinions are baked into the math worth flagging up front: there's such a
|
|
146
|
+
thing as **too clear** (a 400-word prompt scores worse than an 80-word one),
|
|
147
|
+
and **too trusting** (accepting every edit unread isn't trust, it's absence —
|
|
148
|
+
the sweet spot is high, not maxed). Letter bands top out at A+ (≥0.93) and
|
|
149
|
+
bottom out at D; there is no F.
|
|
150
|
+
|
|
151
|
+
The full rubric — every formula, the six archetypes, the award thresholds, and
|
|
152
|
+
why cost is an honest estimate — is written up in
|
|
153
|
+
**[docs/scoring.md](docs/scoring.md)**. It is precise and it is not on your side.
|
|
154
|
+
|
|
155
|
+
## Privacy
|
|
156
|
+
|
|
157
|
+
Everything runs locally. The report is one HTML file with zero external
|
|
158
|
+
requests: no CDN, no fonts, no analytics, no telemetry, no accounts.
|
|
159
|
+
|
|
160
|
+
Don't take our word for it: **grep the source for `requests` or `urllib`.
|
|
161
|
+
You will find nothing.** Then grep the generated HTML for `http`; you will
|
|
162
|
+
find two footer links (this repo and the Repowise team) and nothing else.
|
|
163
|
+
|
|
164
|
+
Roast mode is opt-in and sends **only aggregated numbers** (counts, ratios,
|
|
165
|
+
the top-ten word list) to your own Claude account through your own `claude`
|
|
166
|
+
CLI. No prompts, no code, no file paths leave your machine, ever.
|
|
167
|
+
|
|
168
|
+
## Roast mode
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
skiplevel --roast
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
If the `claude` CLI is installed, the aggregated stats are sent to it with a
|
|
175
|
+
60 second timeout, and three lines of the report (the manager's comment, the
|
|
176
|
+
agent's review of you, and the share-card verdict) are written fresh for your
|
|
177
|
+
specific numbers. On any failure it falls back silently to the built-in
|
|
178
|
+
copy. Default mode never calls any LLM and is fully deterministic.
|
|
179
|
+
|
|
180
|
+
## Sharing
|
|
181
|
+
|
|
182
|
+
Built to be screenshotted. Every card grows copy and save buttons on
|
|
183
|
+
hover: copy puts a PNG straight on your clipboard, save downloads it.
|
|
184
|
+
The 1200x630 share card at the bottom has its own copy and save buttons,
|
|
185
|
+
plus a GIF export that plays the whole review as a three-panel story —
|
|
186
|
+
the two grades, then the agent's scorecard (its four traits and receipts),
|
|
187
|
+
then yours (your traits, archetype, and verdict) — looped in the current
|
|
188
|
+
theme (encoded in the page, no dependencies, nothing uploaded). Card export
|
|
189
|
+
uses an inline SVG foreignObject render, which works in Chromium and Firefox;
|
|
190
|
+
if your browser disagrees, the share card buttons are the reliable path.
|
|
191
|
+
|
|
192
|
+
## How it works
|
|
193
|
+
|
|
194
|
+
- Streams every transcript line, never loads files into memory, skips
|
|
195
|
+
anything malformed (and counts it). A multi-GB transcript directory takes
|
|
196
|
+
seconds. opencode's SQLite database is opened strictly read-only.
|
|
197
|
+
- Harness-specific logic (scan paths, event normalization) lives behind a
|
|
198
|
+
small adapter interface: `adapters.py` (Claude Code + registry),
|
|
199
|
+
`adapter_codex.py`, `adapter_opencode.py`. Everything downstream is
|
|
200
|
+
harness-agnostic; tool names are normalized to one vocabulary so
|
|
201
|
+
"redundant reads" mean the same thing everywhere.
|
|
202
|
+
- Deduplicates token usage by API message id (Claude Code writes one line per
|
|
203
|
+
content block, repeating the same usage object, which would otherwise
|
|
204
|
+
overcount cost by roughly 2.6x). Codex cumulative token counters are
|
|
205
|
+
converted to per-turn deltas, and the cached share of input is split out
|
|
206
|
+
before pricing.
|
|
207
|
+
- Costs come from a hardcoded price table per model in `constants.py`, with
|
|
208
|
+
cache reads and writes priced separately (opencode's own recorded cost
|
|
209
|
+
wins when it has one). Flat-rate subscription usage is priced at API
|
|
210
|
+
rates, which is why the report calls it an estimate. Waste estimates
|
|
211
|
+
(re-reads, doomed retries) are labeled as estimates.
|
|
212
|
+
- The grading rubric — traits, weights, bands, archetypes, awards, and the
|
|
213
|
+
waste/cost estimates — is documented in [docs/scoring.md](docs/scoring.md).
|
|
214
|
+
- Schema notes from inspecting real transcripts live in
|
|
215
|
+
[docs/schema-notes.md](docs/schema-notes.md) (Claude Code),
|
|
216
|
+
[docs/schema-notes-codex.md](docs/schema-notes-codex.md), and
|
|
217
|
+
[docs/schema-notes-opencode.md](docs/schema-notes-opencode.md).
|
|
218
|
+
|
|
219
|
+
## Roadmap
|
|
220
|
+
|
|
221
|
+
- Per-agent comparison reviews (which of your reports earned the promotion)
|
|
222
|
+
- Trend vs your last skip-level ("you interrupted 12% less this month. growth.")
|
|
223
|
+
- More harnesses (Gemini CLI, Copilot CLI)
|
|
224
|
+
|
|
225
|
+
## License
|
|
226
|
+
|
|
227
|
+
MIT. Built by the [Repowise](https://github.com/repowise-dev/repowise) team.
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# skiplevel
|
|
4
|
+
|
|
5
|
+
**Have a skip-level with your coding agents.**
|
|
6
|
+
|
|
7
|
+
[](https://pypi.org/project/skiplevel/)
|
|
8
|
+
[](https://pypi.org/project/skiplevel/)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#privacy)
|
|
11
|
+
[](#supported-agents)
|
|
12
|
+
|
|
13
|
+
<img src="https://raw.githubusercontent.com/repowise-dev/skiplevel/main/docs/hero.gif" alt="The 360 Review — a sample skiplevel report scrolling through the agent's scorecard" width="860">
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
You meet with the agent. The agent meets with you. Management hears both
|
|
18
|
+
sides. skiplevel turns the transcripts already sitting on your machine
|
|
19
|
+
into **The 360 Review**: a two-sided performance review between you and
|
|
20
|
+
your coding agents — Claude Code, Codex CLI, and opencode. HR regrets
|
|
21
|
+
scheduling the meeting.
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
$ uvx skiplevel
|
|
25
|
+
|
|
26
|
+
skiplevel: scheduling a meeting with Claude Code + opencode's managers...
|
|
27
|
+
rifling through ~/.claude/projects ...
|
|
28
|
+
rifling through ~/.local/share/opencode ...
|
|
29
|
+
found 652 sessions (432 MB). Reading everything. Judging silently.
|
|
30
|
+
parsed 541 sessions across 31 days...
|
|
31
|
+
counted 52 'you're absolutely right's... oh no
|
|
32
|
+
tallied 34,849 tool calls and $4,062.61 in tokens...
|
|
33
|
+
found one file read 30 times in a single session. no further questions.
|
|
34
|
+
verdict: AGENT A- / YOU B. the committee has spoken.
|
|
35
|
+
|
|
36
|
+
Skip-level complete in 8.1s. The truth is in skiplevel-report.html
|
|
37
|
+
generated locally. nothing left your machine.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
One self-contained HTML file. Four themes: midnight (dark, default),
|
|
41
|
+
paper (printed HR document), terminal (green phosphor), and tabloid
|
|
42
|
+
(newsprint gossip). Switchable from a pill in the report, persistent,
|
|
43
|
+
and exports respect the active theme. Looks good in screenshots, which
|
|
44
|
+
is the point.
|
|
45
|
+
|
|
46
|
+
## Quickstart
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uvx skiplevel # zero install, zero config
|
|
50
|
+
# or
|
|
51
|
+
pip install skiplevel
|
|
52
|
+
skiplevel
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Flags:
|
|
56
|
+
|
|
57
|
+
| flag | what it does |
|
|
58
|
+
|-------------|---------------------------------------------------------|
|
|
59
|
+
| `--harness H` | `auto` (default: review every agent with transcripts), `claude-code`, `codex`, or `opencode` |
|
|
60
|
+
| `--dir PATH` | transcripts root (default: each harness's own home) |
|
|
61
|
+
| `--out PATH` | output file (default `./skiplevel-report.html`) |
|
|
62
|
+
| `--json` | also dump the raw stats JSON next to the HTML |
|
|
63
|
+
| `--no-open` | do not open a browser |
|
|
64
|
+
| `--roast` | opt-in LLM roast via your own `claude` CLI (see below) |
|
|
65
|
+
| `--theme T` | initial theme: `midnight`, `paper`, `terminal`, `tabloid` |
|
|
66
|
+
|
|
67
|
+
## Supported agents
|
|
68
|
+
|
|
69
|
+
| harness | where the diary lives |
|
|
70
|
+
|-------------|-------------------------------------------------------------|
|
|
71
|
+
| Claude Code | `~/.claude/projects/**/*.jsonl` |
|
|
72
|
+
| Codex CLI | `$CODEX_HOME/sessions/` and `archived_sessions/` rollout JSONL (default `~/.codex`) |
|
|
73
|
+
| opencode | `~/.local/share/opencode/opencode.db` (SQLite), or the older `storage/` JSON tree |
|
|
74
|
+
|
|
75
|
+
By default every harness with transcripts gets summoned into the same
|
|
76
|
+
meeting and one combined review. `--harness codex` (or `claude-code`,
|
|
77
|
+
`opencode`) reviews a single agent; `--dir` points at a non-standard
|
|
78
|
+
location, and the layout is sniffed automatically.
|
|
79
|
+
|
|
80
|
+
Notes per harness:
|
|
81
|
+
|
|
82
|
+
- **Codex CLI**: archived copies of active sessions are deduplicated,
|
|
83
|
+
forked-session token replays are not double-counted, and sessions
|
|
84
|
+
predating token telemetry (Sept 2025) parse fine with zero cost.
|
|
85
|
+
- **opencode**: child (subagent) sessions count toward tokens and tools
|
|
86
|
+
but not toward your prompt stats; opencode's own per-message cost is
|
|
87
|
+
used when present, otherwise the price table kicks in.
|
|
88
|
+
|
|
89
|
+
## What gets covered in the meeting
|
|
90
|
+
|
|
91
|
+
**You** get graded on clarity, patience, civility, and trust calibration:
|
|
92
|
+
prompt lengths, a punch card of when you actually work, your late-night
|
|
93
|
+
ratio, interrupt rate, vocabulary (including your "fix" count and your
|
|
94
|
+
all-caps incidents), and the median seconds you give the agent before
|
|
95
|
+
demanding more.
|
|
96
|
+
|
|
97
|
+
**The agent** gets graded on efficiency, reliability, safety, and composure:
|
|
98
|
+
"you're absolutely right" counts, apology rates, files it read 4+ times in
|
|
99
|
+
one session (object permanence), retry storms (the same failing call, again,
|
|
100
|
+
with hope), sensitive file touches with timestamps, blast radius, and its
|
|
101
|
+
longest unsupervised tool-call chain.
|
|
102
|
+
|
|
103
|
+
**The relationship** gets the rest: apology asymmetry, a timeline of your
|
|
104
|
+
single longest session, an itemized Expense Report of Regret, compatibility
|
|
105
|
+
score, and yearbook superlatives.
|
|
106
|
+
|
|
107
|
+
Under the comedy there is a genuinely useful layer: sortable tables of
|
|
108
|
+
redundant reads, retry storms, sensitive file touches, per-session cost
|
|
109
|
+
trend, and top edited files. Real numbers, real receipts.
|
|
110
|
+
|
|
111
|
+
## How the grading works
|
|
112
|
+
|
|
113
|
+
Two report cards — one for the agent, one for you — plus an archetype, a
|
|
114
|
+
compatibility score, and yearbook superlatives. None of it is vibes. Each
|
|
115
|
+
grade is a weighted average of four traits, each trait a number from 0 to 1
|
|
116
|
+
traced back to something you actually did:
|
|
117
|
+
|
|
118
|
+
| who | graded on (weights) |
|
|
119
|
+
|-------|--------------------------------------------------------------|
|
|
120
|
+
| agent | efficiency (35%), reliability (30%), composure (20%), safety (15%) |
|
|
121
|
+
| you | clarity (30%), patience (30%), civility (20%), trust (20%) |
|
|
122
|
+
|
|
123
|
+
Two opinions are baked into the math worth flagging up front: there's such a
|
|
124
|
+
thing as **too clear** (a 400-word prompt scores worse than an 80-word one),
|
|
125
|
+
and **too trusting** (accepting every edit unread isn't trust, it's absence —
|
|
126
|
+
the sweet spot is high, not maxed). Letter bands top out at A+ (≥0.93) and
|
|
127
|
+
bottom out at D; there is no F.
|
|
128
|
+
|
|
129
|
+
The full rubric — every formula, the six archetypes, the award thresholds, and
|
|
130
|
+
why cost is an honest estimate — is written up in
|
|
131
|
+
**[docs/scoring.md](docs/scoring.md)**. It is precise and it is not on your side.
|
|
132
|
+
|
|
133
|
+
## Privacy
|
|
134
|
+
|
|
135
|
+
Everything runs locally. The report is one HTML file with zero external
|
|
136
|
+
requests: no CDN, no fonts, no analytics, no telemetry, no accounts.
|
|
137
|
+
|
|
138
|
+
Don't take our word for it: **grep the source for `requests` or `urllib`.
|
|
139
|
+
You will find nothing.** Then grep the generated HTML for `http`; you will
|
|
140
|
+
find two footer links (this repo and the Repowise team) and nothing else.
|
|
141
|
+
|
|
142
|
+
Roast mode is opt-in and sends **only aggregated numbers** (counts, ratios,
|
|
143
|
+
the top-ten word list) to your own Claude account through your own `claude`
|
|
144
|
+
CLI. No prompts, no code, no file paths leave your machine, ever.
|
|
145
|
+
|
|
146
|
+
## Roast mode
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
skiplevel --roast
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
If the `claude` CLI is installed, the aggregated stats are sent to it with a
|
|
153
|
+
60 second timeout, and three lines of the report (the manager's comment, the
|
|
154
|
+
agent's review of you, and the share-card verdict) are written fresh for your
|
|
155
|
+
specific numbers. On any failure it falls back silently to the built-in
|
|
156
|
+
copy. Default mode never calls any LLM and is fully deterministic.
|
|
157
|
+
|
|
158
|
+
## Sharing
|
|
159
|
+
|
|
160
|
+
Built to be screenshotted. Every card grows copy and save buttons on
|
|
161
|
+
hover: copy puts a PNG straight on your clipboard, save downloads it.
|
|
162
|
+
The 1200x630 share card at the bottom has its own copy and save buttons,
|
|
163
|
+
plus a GIF export that plays the whole review as a three-panel story —
|
|
164
|
+
the two grades, then the agent's scorecard (its four traits and receipts),
|
|
165
|
+
then yours (your traits, archetype, and verdict) — looped in the current
|
|
166
|
+
theme (encoded in the page, no dependencies, nothing uploaded). Card export
|
|
167
|
+
uses an inline SVG foreignObject render, which works in Chromium and Firefox;
|
|
168
|
+
if your browser disagrees, the share card buttons are the reliable path.
|
|
169
|
+
|
|
170
|
+
## How it works
|
|
171
|
+
|
|
172
|
+
- Streams every transcript line, never loads files into memory, skips
|
|
173
|
+
anything malformed (and counts it). A multi-GB transcript directory takes
|
|
174
|
+
seconds. opencode's SQLite database is opened strictly read-only.
|
|
175
|
+
- Harness-specific logic (scan paths, event normalization) lives behind a
|
|
176
|
+
small adapter interface: `adapters.py` (Claude Code + registry),
|
|
177
|
+
`adapter_codex.py`, `adapter_opencode.py`. Everything downstream is
|
|
178
|
+
harness-agnostic; tool names are normalized to one vocabulary so
|
|
179
|
+
"redundant reads" mean the same thing everywhere.
|
|
180
|
+
- Deduplicates token usage by API message id (Claude Code writes one line per
|
|
181
|
+
content block, repeating the same usage object, which would otherwise
|
|
182
|
+
overcount cost by roughly 2.6x). Codex cumulative token counters are
|
|
183
|
+
converted to per-turn deltas, and the cached share of input is split out
|
|
184
|
+
before pricing.
|
|
185
|
+
- Costs come from a hardcoded price table per model in `constants.py`, with
|
|
186
|
+
cache reads and writes priced separately (opencode's own recorded cost
|
|
187
|
+
wins when it has one). Flat-rate subscription usage is priced at API
|
|
188
|
+
rates, which is why the report calls it an estimate. Waste estimates
|
|
189
|
+
(re-reads, doomed retries) are labeled as estimates.
|
|
190
|
+
- The grading rubric — traits, weights, bands, archetypes, awards, and the
|
|
191
|
+
waste/cost estimates — is documented in [docs/scoring.md](docs/scoring.md).
|
|
192
|
+
- Schema notes from inspecting real transcripts live in
|
|
193
|
+
[docs/schema-notes.md](docs/schema-notes.md) (Claude Code),
|
|
194
|
+
[docs/schema-notes-codex.md](docs/schema-notes-codex.md), and
|
|
195
|
+
[docs/schema-notes-opencode.md](docs/schema-notes-opencode.md).
|
|
196
|
+
|
|
197
|
+
## Roadmap
|
|
198
|
+
|
|
199
|
+
- Per-agent comparison reviews (which of your reports earned the promotion)
|
|
200
|
+
- Trend vs your last skip-level ("you interrupted 12% less this month. growth.")
|
|
201
|
+
- More harnesses (Gemini CLI, Copilot CLI)
|
|
202
|
+
|
|
203
|
+
## License
|
|
204
|
+
|
|
205
|
+
MIT. Built by the [Repowise](https://github.com/repowise-dev/repowise) team.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "skiplevel"
|
|
7
|
+
version = "1.1.0"
|
|
8
|
+
description = "Have a skip-level with your coding agents: The 360 Review, a two-sided performance review generated locally from your own transcripts."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [{ name = "Repowise" }]
|
|
13
|
+
keywords = ["skiplevel", "claude", "claude-code", "codex", "opencode", "coding-agent", "analytics", "cli"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.10",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Environment :: Console",
|
|
21
|
+
"Topic :: Software Development",
|
|
22
|
+
"Operating System :: OS Independent",
|
|
23
|
+
]
|
|
24
|
+
dependencies = ["jinja2>=3.0"]
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Homepage = "https://github.com/repowise-dev/skiplevel"
|
|
28
|
+
Issues = "https://github.com/repowise-dev/skiplevel/issues"
|
|
29
|
+
|
|
30
|
+
[project.scripts]
|
|
31
|
+
skiplevel = "skiplevel.cli:main"
|
|
32
|
+
|
|
33
|
+
[tool.hatch.build.targets.wheel]
|
|
34
|
+
packages = ["skiplevel"]
|
|
35
|
+
|
|
36
|
+
[tool.hatch.build.targets.sdist]
|
|
37
|
+
include = ["skiplevel", "README.md", "LICENSE"]
|