tony-cli 0.3.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.
Files changed (29) hide show
  1. tony_cli-0.3.0/LICENSE +24 -0
  2. tony_cli-0.3.0/PKG-INFO +181 -0
  3. tony_cli-0.3.0/README.md +127 -0
  4. tony_cli-0.3.0/pyproject.toml +51 -0
  5. tony_cli-0.3.0/setup.cfg +4 -0
  6. tony_cli-0.3.0/src/tony_cli/__init__.py +0 -0
  7. tony_cli-0.3.0/src/tony_cli/agent.py +767 -0
  8. tony_cli-0.3.0/src/tony_cli/assets/fonts/Favorit-Bold.woff2 +0 -0
  9. tony_cli-0.3.0/src/tony_cli/assets/fonts/Favorit-Book.woff2 +0 -0
  10. tony_cli-0.3.0/src/tony_cli/assets/fonts/Favorit-Regular.woff2 +0 -0
  11. tony_cli-0.3.0/src/tony_cli/assets/fonts/FavoritMono-Medium.woff2 +0 -0
  12. tony_cli-0.3.0/src/tony_cli/assets/fonts/FavoritMono-Regular.woff2 +0 -0
  13. tony_cli-0.3.0/src/tony_cli/assets/viewer.css +281 -0
  14. tony_cli-0.3.0/src/tony_cli/assets/viewer.js +98 -0
  15. tony_cli-0.3.0/src/tony_cli/fonts.py +38 -0
  16. tony_cli-0.3.0/src/tony_cli/hosted.py +324 -0
  17. tony_cli-0.3.0/src/tony_cli/install.py +138 -0
  18. tony_cli-0.3.0/src/tony_cli/layout.py +233 -0
  19. tony_cli-0.3.0/src/tony_cli/page.py +54 -0
  20. tony_cli-0.3.0/src/tony_cli/payload.py +187 -0
  21. tony_cli-0.3.0/src/tony_cli/source/__init__.py +0 -0
  22. tony_cli-0.3.0/src/tony_cli/source/local.py +256 -0
  23. tony_cli-0.3.0/src/tony_cli/uninstall.py +200 -0
  24. tony_cli-0.3.0/src/tony_cli.egg-info/PKG-INFO +181 -0
  25. tony_cli-0.3.0/src/tony_cli.egg-info/SOURCES.txt +27 -0
  26. tony_cli-0.3.0/src/tony_cli.egg-info/dependency_links.txt +1 -0
  27. tony_cli-0.3.0/src/tony_cli.egg-info/entry_points.txt +2 -0
  28. tony_cli-0.3.0/src/tony_cli.egg-info/requires.txt +7 -0
  29. tony_cli-0.3.0/src/tony_cli.egg-info/top_level.txt +1 -0
tony_cli-0.3.0/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fawwaz Abayomi
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 ABC Favorit and ABC Favorit Mono font files under src/tony_cli/assets/fonts
16
+ are commercial typefaces by Dinamo and are NOT covered by this license.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
@@ -0,0 +1,181 @@
1
+ Metadata-Version: 2.4
2
+ Name: tony-cli
3
+ Version: 0.3.0
4
+ Summary: Explains a git diff to whoever now owns it — annotated changes, blast radius, and steppable runtime walkthroughs.
5
+ Author: Fawwaz Abayomi
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Fawwaz Abayomi
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ The ABC Favorit and ABC Favorit Mono font files under src/tony_cli/assets/fonts
21
+ are commercial typefaces by Dinamo and are NOT covered by this license.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+
31
+ Project-URL: Homepage, https://github.com/fawwaz46/tony
32
+ Project-URL: Issues, https://github.com/fawwaz46/tony/issues
33
+ Keywords: git,diff,code-review,ai,claude
34
+ Classifier: Development Status :: 4 - Beta
35
+ Classifier: Environment :: Console
36
+ Classifier: Intended Audience :: Developers
37
+ Classifier: Operating System :: OS Independent
38
+ Classifier: Programming Language :: Python :: 3
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Topic :: Software Development :: Version Control :: Git
44
+ Requires-Python: >=3.10
45
+ Description-Content-Type: text/markdown
46
+ License-File: LICENSE
47
+ Requires-Dist: anthropic>=0.40
48
+ Requires-Dist: python-dotenv>=1.0
49
+ Requires-Dist: httpx>=0.27
50
+ Requires-Dist: cryptography>=42
51
+ Provides-Extra: dev
52
+ Requires-Dist: pytest>=8; extra == "dev"
53
+ Dynamic: license-file
54
+
55
+ # tony
56
+
57
+ **Your AI wrote the code. tony explains what now exists.**
58
+
59
+ tony is a CLI that turns a git diff into a review page for the person who now
60
+ owns the code — often someone who didn't type a line of it. Not a linter, not a
61
+ code-review gate: it builds your mental model of the change, fast.
62
+
63
+ Every review page has three tabs:
64
+
65
+ 1. **File changes** — the diff per file, with plain-language annotations sitting
66
+ inline above the lines they explain. Modified code gets Prev / New / Changes
67
+ panes; line numbers are computed from the diff, never trusted to the model.
68
+ 2. **Blast radius** — files the change reaches that are *not* in the diff, each
69
+ consumer classified breaks / behavior-change / compatible, shown at the
70
+ affected lines.
71
+ 3. **How it works** — steppable runtime walkthroughs. One concrete scenario
72
+ ("you run `export --resume` after a crash") traced step by step, showing the
73
+ real source lines read from your disk, a small state table, and one plain
74
+ sentence per step.
75
+
76
+ ## Install
77
+
78
+ ```sh
79
+ curl -fsSL https://tony-cli.com/install.sh | sh
80
+ ```
81
+
82
+ or, if you already use uv or pipx:
83
+
84
+ ```sh
85
+ uv tool install tony-cli # or: pipx install tony-cli
86
+ ```
87
+
88
+ Either way you get a `tony` command on your PATH.
89
+
90
+ ## Use
91
+
92
+ ```sh
93
+ cd your-repo
94
+ tony main...my-branch # review a branch against main
95
+ tony # review the default branch...HEAD
96
+ ```
97
+
98
+ The page is written to `.tony/` inside the repo (gitignored automatically) and
99
+ opens in your browser. It's one self-contained HTML file — fonts, styles, and
100
+ data inlined — so it works offline and forever.
101
+
102
+ tony needs an Anthropic API key (`ANTHROPIC_API_KEY`, or `~/.tony/.env`). The
103
+ first run tells you exactly where to get one and where to put it. tony reviews
104
+ **committed** work: it shows code straight from disk, so the working tree must
105
+ match the revision under review.
106
+
107
+ Useful flags: `--replay` rebuilds the page from the last run without calling
108
+ the API, `--json` prints the raw review, `-v` logs every file the model
109
+ actually read, `--stale` overrides the clean-tree check.
110
+
111
+ ## Share a review
112
+
113
+ ```sh
114
+ tony login # once — GitHub device flow
115
+ tony main...my-branch # publishing is the default
116
+ tony: https://tony-cli.com/r/8f3ka92m
117
+ ```
118
+
119
+ **Who can read a published review:** anyone signed in who has the link. Review
120
+ ids are random, so the link is what grants access — treat it like a password.
121
+ `tony unpublish <id>` removes a review at any time.
122
+
123
+ **What the site can read:** everything in the review. The payload is uploaded
124
+ over TLS and encrypted at rest under a key the server holds, so a leak of the
125
+ stored blobs yields nothing — but we can open a review, and so can any lawful
126
+ demand made to us. Do not publish from a repository you could not share with
127
+ us. An earlier design encrypted on your machine and kept the key in the link's
128
+ fragment; that was dropped deliberately when reading moved behind an account
129
+ and a history of past reviews became part of the product, since both need the
130
+ server to be able to open a review.
131
+
132
+ Local review needs no account and never leaves the machine: `tony --local`.
133
+
134
+ ## Update
135
+
136
+ ```sh
137
+ tony update
138
+ ```
139
+
140
+ Uses whichever of uv, pipx, or pip installed tony, and resolves from PyPI
141
+ explicitly so a machine pointed at an internal mirror cannot decide what
142
+ `tony-cli` is. `tony --version` says what you have; `tony --help` lists every
143
+ command.
144
+
145
+ ## Uninstall
146
+
147
+ ```sh
148
+ tony uninstall
149
+ ```
150
+
151
+ Removing the package by itself would leave the parts worth removing: your
152
+ `ANTHROPIC_API_KEY` and site login in `~/.tony`, and a `.tony/` directory of
153
+ past reviews inside every repository you ran tony in — those hold source code.
154
+ `tony uninstall` revokes the site token, lists everything it found and waits
155
+ for you to type `yes`, deletes it, then removes the package with whichever of
156
+ uv, pipx, or pip installed it.
157
+
158
+ It searches your home directory for stray review directories; `--no-scan`
159
+ limits it to the current repository, and `--yes` skips the prompt. Reviews you
160
+ published to the site are separate — take those down with `tony unpublish <id>`
161
+ before uninstalling, or they stay up.
162
+
163
+ ## Development
164
+
165
+ ```sh
166
+ pip install -e ".[dev]" # the CLI, with pytest
167
+ python -m pytest # the deterministic layer's tests
168
+ cd web && npm install
169
+ npm run build:viewer # rebuild the renderer bundle the CLI embeds
170
+ npm run dev # the site; /dev renders src/fixtures/review.json
171
+ ```
172
+
173
+ There is exactly one renderer — `web/src/renderer/render.ts` — used by both
174
+ the local page and the hosted site. The Python side decides all layout facts
175
+ (line numbers, spans, added/changed tags) in `src/tony_cli/layout.py` and ships
176
+ them in the payload; the renderer never re-derives them. `DESIGN.md` is the
177
+ visual contract.
178
+
179
+ The site deploys to Vercel and needs `DATABASE_URL` (Neon Postgres),
180
+ `BLOB_READ_WRITE_TOKEN` (Vercel Blob), and `GITHUB_CLIENT_ID` (an OAuth app
181
+ with device flow enabled).
@@ -0,0 +1,127 @@
1
+ # tony
2
+
3
+ **Your AI wrote the code. tony explains what now exists.**
4
+
5
+ tony is a CLI that turns a git diff into a review page for the person who now
6
+ owns the code — often someone who didn't type a line of it. Not a linter, not a
7
+ code-review gate: it builds your mental model of the change, fast.
8
+
9
+ Every review page has three tabs:
10
+
11
+ 1. **File changes** — the diff per file, with plain-language annotations sitting
12
+ inline above the lines they explain. Modified code gets Prev / New / Changes
13
+ panes; line numbers are computed from the diff, never trusted to the model.
14
+ 2. **Blast radius** — files the change reaches that are *not* in the diff, each
15
+ consumer classified breaks / behavior-change / compatible, shown at the
16
+ affected lines.
17
+ 3. **How it works** — steppable runtime walkthroughs. One concrete scenario
18
+ ("you run `export --resume` after a crash") traced step by step, showing the
19
+ real source lines read from your disk, a small state table, and one plain
20
+ sentence per step.
21
+
22
+ ## Install
23
+
24
+ ```sh
25
+ curl -fsSL https://tony-cli.com/install.sh | sh
26
+ ```
27
+
28
+ or, if you already use uv or pipx:
29
+
30
+ ```sh
31
+ uv tool install tony-cli # or: pipx install tony-cli
32
+ ```
33
+
34
+ Either way you get a `tony` command on your PATH.
35
+
36
+ ## Use
37
+
38
+ ```sh
39
+ cd your-repo
40
+ tony main...my-branch # review a branch against main
41
+ tony # review the default branch...HEAD
42
+ ```
43
+
44
+ The page is written to `.tony/` inside the repo (gitignored automatically) and
45
+ opens in your browser. It's one self-contained HTML file — fonts, styles, and
46
+ data inlined — so it works offline and forever.
47
+
48
+ tony needs an Anthropic API key (`ANTHROPIC_API_KEY`, or `~/.tony/.env`). The
49
+ first run tells you exactly where to get one and where to put it. tony reviews
50
+ **committed** work: it shows code straight from disk, so the working tree must
51
+ match the revision under review.
52
+
53
+ Useful flags: `--replay` rebuilds the page from the last run without calling
54
+ the API, `--json` prints the raw review, `-v` logs every file the model
55
+ actually read, `--stale` overrides the clean-tree check.
56
+
57
+ ## Share a review
58
+
59
+ ```sh
60
+ tony login # once — GitHub device flow
61
+ tony main...my-branch # publishing is the default
62
+ tony: https://tony-cli.com/r/8f3ka92m
63
+ ```
64
+
65
+ **Who can read a published review:** anyone signed in who has the link. Review
66
+ ids are random, so the link is what grants access — treat it like a password.
67
+ `tony unpublish <id>` removes a review at any time.
68
+
69
+ **What the site can read:** everything in the review. The payload is uploaded
70
+ over TLS and encrypted at rest under a key the server holds, so a leak of the
71
+ stored blobs yields nothing — but we can open a review, and so can any lawful
72
+ demand made to us. Do not publish from a repository you could not share with
73
+ us. An earlier design encrypted on your machine and kept the key in the link's
74
+ fragment; that was dropped deliberately when reading moved behind an account
75
+ and a history of past reviews became part of the product, since both need the
76
+ server to be able to open a review.
77
+
78
+ Local review needs no account and never leaves the machine: `tony --local`.
79
+
80
+ ## Update
81
+
82
+ ```sh
83
+ tony update
84
+ ```
85
+
86
+ Uses whichever of uv, pipx, or pip installed tony, and resolves from PyPI
87
+ explicitly so a machine pointed at an internal mirror cannot decide what
88
+ `tony-cli` is. `tony --version` says what you have; `tony --help` lists every
89
+ command.
90
+
91
+ ## Uninstall
92
+
93
+ ```sh
94
+ tony uninstall
95
+ ```
96
+
97
+ Removing the package by itself would leave the parts worth removing: your
98
+ `ANTHROPIC_API_KEY` and site login in `~/.tony`, and a `.tony/` directory of
99
+ past reviews inside every repository you ran tony in — those hold source code.
100
+ `tony uninstall` revokes the site token, lists everything it found and waits
101
+ for you to type `yes`, deletes it, then removes the package with whichever of
102
+ uv, pipx, or pip installed it.
103
+
104
+ It searches your home directory for stray review directories; `--no-scan`
105
+ limits it to the current repository, and `--yes` skips the prompt. Reviews you
106
+ published to the site are separate — take those down with `tony unpublish <id>`
107
+ before uninstalling, or they stay up.
108
+
109
+ ## Development
110
+
111
+ ```sh
112
+ pip install -e ".[dev]" # the CLI, with pytest
113
+ python -m pytest # the deterministic layer's tests
114
+ cd web && npm install
115
+ npm run build:viewer # rebuild the renderer bundle the CLI embeds
116
+ npm run dev # the site; /dev renders src/fixtures/review.json
117
+ ```
118
+
119
+ There is exactly one renderer — `web/src/renderer/render.ts` — used by both
120
+ the local page and the hosted site. The Python side decides all layout facts
121
+ (line numbers, spans, added/changed tags) in `src/tony_cli/layout.py` and ships
122
+ them in the payload; the renderer never re-derives them. `DESIGN.md` is the
123
+ visual contract.
124
+
125
+ The site deploys to Vercel and needs `DATABASE_URL` (Neon Postgres),
126
+ `BLOB_READ_WRITE_TOKEN` (Vercel Blob), and `GITHUB_CLIENT_ID` (an OAuth app
127
+ with device flow enabled).
@@ -0,0 +1,51 @@
1
+ [project]
2
+ name = "tony-cli"
3
+ version = "0.3.0"
4
+ description = "Explains a git diff to whoever now owns it — annotated changes, blast radius, and steppable runtime walkthroughs."
5
+ readme = "README.md"
6
+ license = { file = "LICENSE" }
7
+ requires-python = ">=3.10"
8
+ authors = [{ name = "Fawwaz Abayomi" }]
9
+ keywords = ["git", "diff", "code-review", "ai", "claude"]
10
+ classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "Environment :: Console",
13
+ "Intended Audience :: Developers",
14
+ "Operating System :: OS Independent",
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
+ "Topic :: Software Development :: Version Control :: Git",
21
+ ]
22
+ dependencies = [
23
+ "anthropic>=0.40",
24
+ "python-dotenv>=1.0",
25
+ "httpx>=0.27",
26
+ "cryptography>=42",
27
+ ]
28
+
29
+ [project.optional-dependencies]
30
+ dev = ["pytest>=8"]
31
+
32
+ [project.urls]
33
+ Homepage = "https://github.com/fawwaz46/tony"
34
+ Issues = "https://github.com/fawwaz46/tony/issues"
35
+
36
+ [project.scripts]
37
+ tony = "tony_cli.agent:main"
38
+
39
+ [build-system]
40
+ requires = ["setuptools>=68"]
41
+ build-backend = "setuptools.build_meta"
42
+
43
+ [tool.setuptools.packages.find]
44
+ where = ["src"]
45
+ include = ["tony_cli*"]
46
+
47
+ [tool.setuptools.package-data]
48
+ tony_cli = ["assets/fonts/*.woff2", "assets/viewer.js", "assets/viewer.css"]
49
+
50
+ [tool.pytest.ini_options]
51
+ testpaths = ["src/tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
File without changes