surgite 1.0.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.
surgite-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nick Coleman
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.
surgite-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: surgite
3
+ Version: 1.0.0
4
+ Summary: Git commit history summarizer with AI.
5
+ Keywords: standup,git,summary,changelog,ai,llm,fastapi
6
+ Author: Nick Coleman
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: Console
11
+ Classifier: Environment :: Web Environment
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Software Development :: Version Control :: Git
18
+ Classifier: Topic :: Text Processing :: General
19
+ Requires-Dist: python-dotenv>=1.2.2
20
+ Requires-Dist: sqlalchemy>=2.0.49
21
+ Requires-Dist: alembic>=1.18.4
22
+ Requires-Dist: psycopg2-binary>=2.9.12
23
+ Requires-Dist: fastapi>=0.136.1
24
+ Requires-Dist: uvicorn>=0.47.0
25
+ Requires-Dist: httpx>=0.27.0
26
+ Requires-Dist: argon2-cffi>=23.1.0
27
+ Requires-Dist: cryptography>=46.0.0
28
+ Requires-Dist: keyring>=25.7.0
29
+ Requires-Python: >=3.14
30
+ Project-URL: Homepage, https://github.com/nicoleman0/surgite
31
+ Project-URL: Source, https://github.com/nicoleman0/surgite
32
+ Project-URL: Documentation, https://github.com/nicoleman0/surgite#readme
33
+ Project-URL: Changelog, https://github.com/nicoleman0/surgite/blob/main/CHANGELOG.md
34
+ Project-URL: Issues, https://github.com/nicoleman0/surgite/issues
35
+ Description-Content-Type: text/markdown
36
+
37
+ # surgite
38
+
39
+ Standup summaries from your git history — in the browser, in the terminal, or as a shareable link.
40
+
41
+ [![CI](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml/badge.svg)](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml)
42
+ [![PyPI](https://img.shields.io/pypi/v/surgite)](https://pypi.org/project/surgite/)
43
+ [![Python versions](https://img.shields.io/pypi/pyversions/surgite)](https://pypi.org/project/surgite/)
44
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
45
+
46
+ The web app gives your team a shared dashboard: per-user repos, per-user prompt
47
+ settings, AI-written summaries, and shareable links to specific summary views.
48
+ The CLI does the same for a local repo, no server needed. First-party auth,
49
+ no third-party tracking.
50
+
51
+ Lean principles: ~15 Python source files, one binary, no SPA framework, no
52
+ slowapi, no Celery, no Redis. Reads like a script.
53
+
54
+ ## Quickstart
55
+
56
+ Two paths. Pick one.
57
+
58
+ **The web app** — three commands, full team dashboard:
59
+
60
+ ```bash
61
+ git clone https://github.com/nicoleman0/surgite.git
62
+ cd surgite
63
+ cp .env.example .env # set BOOTSTRAP_OWNER_EMAIL=you@example.com
64
+ docker compose up -d
65
+ ```
66
+
67
+ On first start the app mints an admin invite and logs the token; redeem it
68
+ with `uv run surgite --redeem-invite <token> --email you@example.com` and
69
+ you're in. Full guide: [`docs/self-host.md`](docs/self-host.md).
70
+
71
+ **One-off summary from a local repo** — no database, no server:
72
+
73
+ ```bash
74
+ pip install surgite # or: uv tool install surgite
75
+ surgite /path/to/your/repo --since 7.days.ago
76
+ ```
77
+
78
+ The PyPI wheel ships the `surgite` package — the CLI and the API code. The
79
+ web frontend and the alembic migrations are not in the wheel; the full
80
+ self-hosted stack installs from the repo or the Docker image (see
81
+ [`docs/self-host.md`](docs/self-host.md)).
82
+
83
+ Add `--summarize` to get AI-written prose (set `ANTHROPIC_API_KEY` first).
84
+
85
+ ## Screenshots
86
+
87
+ ![surgite dashboard](docs/demo.gif)
88
+
89
+ The dashboard, with terminal-aesthetic chrome, a sample repo's commit log,
90
+ and a streamed AI summary panel. See [`docs/self-host.md`](docs/self-host.md)
91
+ for the deployment walkthrough.
92
+
93
+ ## What you get
94
+
95
+ - **Web dashboard** — per-user repos, prompt settings, summary history, share
96
+ links, admin user management (`/admin/users`). Email + password login with
97
+ `__Host-` session cookies.
98
+ - **CLI** — `surgite /path/to/repo` for a local one-off, `surgite --registered
99
+ <name>` to pull from a running API, `surgite --login` to authenticate,
100
+ `surgite --summarize` for AI-written prose.
101
+ - **Per-user provider keys** — each user brings their own Anthropic / Groq /
102
+ DeepSeek key. Fernet-encrypted at rest, never returned by the API.
103
+ - **Shareable summary links** — `POST /summaries` mints a `/s/{slug}` URL that
104
+ re-runs a saved query in a read-only view. Owner-scoped in multi-user mode.
105
+
106
+ ## Why?
107
+
108
+ - **Multi-user** — email + password login, per-user repos and summaries,
109
+ per-user provider keys. (The 0.5.0 headline.)
110
+ - **Self-hostable** — your data, your auth, your machine. No SaaS account, no
111
+ vendor lock-in. Runs on a homelab box, a small VM, a Raspberry Pi, or a
112
+ Kubernetes cluster — same code path.
113
+ - **No telemetry** — first-party auth, no analytics, no phone-home.
114
+ - **Lean** — FastAPI + Postgres + SvelteKit, the whole thing reads
115
+ top-to-bottom.
116
+
117
+ ## Documentation
118
+
119
+ - [`docs/self-host.md`](docs/self-host.md) — end-to-end self-hosting guide
120
+ (sizing, quickstart, TLS, backup, runbook).
121
+ - [`docs/security.md`](docs/security.md) — the threat model and the security
122
+ controls.
123
+ - [`docs/api-stability.md`](docs/api-stability.md) — the API stability policy:
124
+ what we promise not to break, and how deprecation works.
125
+ - [`docs/security-support.md`](docs/security-support.md) — supported versions,
126
+ the vulnerability-response SLA, and the advisory process.
127
+ - [`docs/openapi.json`](docs/openapi.json) — the snapshot-tested OpenAPI
128
+ document; the machine-readable API contract.
129
+ - [`docs/migrations/0.4.0-to-0.5.0.md`](docs/migrations/0.4.0-to-0.5.0.md) —
130
+ upgrading a 0.4.0 install.
131
+ - [`.env.example`](.env.example) — every configuration variable, with
132
+ defaults.
133
+ - [`CHANGELOG.md`](CHANGELOG.md) — release history.
134
+
135
+ ## Development
136
+
137
+ ```bash
138
+ uv sync --group dev # install deps (incl. dev tools)
139
+ docker compose up -d db # Postgres for local dev
140
+ uv run alembic upgrade head # run migrations
141
+ uv run uvicorn surgite.api:app --reload
142
+ cd frontend && npm install && npm run dev
143
+ uv run pytest # tests
144
+ uv run ruff check . && uv run ruff format --check . # lint + format
145
+ ```
146
+
147
+ See [`AGENTS.md`](AGENTS.md) for the canonical dev quickstart and the
148
+ architecture overview.
149
+
150
+ ## Contributing
151
+
152
+ Contributions are welcome. The project is deliberately minimalist — see the
153
+ principles in [`AGENTS.md`](AGENTS.md). Start with
154
+ [`CONTRIBUTING.md`](CONTRIBUTING.md) for dev setup and the PR workflow; please
155
+ also read [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). For anything
156
+ security-sensitive, see [`SECURITY.md`](SECURITY.md).
157
+
158
+ The canonical repository is on GitHub:
159
+ <https://github.com/nicoleman0/surgite>.
160
+
161
+ ## License
162
+
163
+ [MIT](LICENSE) © 2026 Nick Coleman
@@ -0,0 +1,127 @@
1
+ # surgite
2
+
3
+ Standup summaries from your git history — in the browser, in the terminal, or as a shareable link.
4
+
5
+ [![CI](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml/badge.svg)](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml)
6
+ [![PyPI](https://img.shields.io/pypi/v/surgite)](https://pypi.org/project/surgite/)
7
+ [![Python versions](https://img.shields.io/pypi/pyversions/surgite)](https://pypi.org/project/surgite/)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
9
+
10
+ The web app gives your team a shared dashboard: per-user repos, per-user prompt
11
+ settings, AI-written summaries, and shareable links to specific summary views.
12
+ The CLI does the same for a local repo, no server needed. First-party auth,
13
+ no third-party tracking.
14
+
15
+ Lean principles: ~15 Python source files, one binary, no SPA framework, no
16
+ slowapi, no Celery, no Redis. Reads like a script.
17
+
18
+ ## Quickstart
19
+
20
+ Two paths. Pick one.
21
+
22
+ **The web app** — three commands, full team dashboard:
23
+
24
+ ```bash
25
+ git clone https://github.com/nicoleman0/surgite.git
26
+ cd surgite
27
+ cp .env.example .env # set BOOTSTRAP_OWNER_EMAIL=you@example.com
28
+ docker compose up -d
29
+ ```
30
+
31
+ On first start the app mints an admin invite and logs the token; redeem it
32
+ with `uv run surgite --redeem-invite <token> --email you@example.com` and
33
+ you're in. Full guide: [`docs/self-host.md`](docs/self-host.md).
34
+
35
+ **One-off summary from a local repo** — no database, no server:
36
+
37
+ ```bash
38
+ pip install surgite # or: uv tool install surgite
39
+ surgite /path/to/your/repo --since 7.days.ago
40
+ ```
41
+
42
+ The PyPI wheel ships the `surgite` package — the CLI and the API code. The
43
+ web frontend and the alembic migrations are not in the wheel; the full
44
+ self-hosted stack installs from the repo or the Docker image (see
45
+ [`docs/self-host.md`](docs/self-host.md)).
46
+
47
+ Add `--summarize` to get AI-written prose (set `ANTHROPIC_API_KEY` first).
48
+
49
+ ## Screenshots
50
+
51
+ ![surgite dashboard](docs/demo.gif)
52
+
53
+ The dashboard, with terminal-aesthetic chrome, a sample repo's commit log,
54
+ and a streamed AI summary panel. See [`docs/self-host.md`](docs/self-host.md)
55
+ for the deployment walkthrough.
56
+
57
+ ## What you get
58
+
59
+ - **Web dashboard** — per-user repos, prompt settings, summary history, share
60
+ links, admin user management (`/admin/users`). Email + password login with
61
+ `__Host-` session cookies.
62
+ - **CLI** — `surgite /path/to/repo` for a local one-off, `surgite --registered
63
+ <name>` to pull from a running API, `surgite --login` to authenticate,
64
+ `surgite --summarize` for AI-written prose.
65
+ - **Per-user provider keys** — each user brings their own Anthropic / Groq /
66
+ DeepSeek key. Fernet-encrypted at rest, never returned by the API.
67
+ - **Shareable summary links** — `POST /summaries` mints a `/s/{slug}` URL that
68
+ re-runs a saved query in a read-only view. Owner-scoped in multi-user mode.
69
+
70
+ ## Why?
71
+
72
+ - **Multi-user** — email + password login, per-user repos and summaries,
73
+ per-user provider keys. (The 0.5.0 headline.)
74
+ - **Self-hostable** — your data, your auth, your machine. No SaaS account, no
75
+ vendor lock-in. Runs on a homelab box, a small VM, a Raspberry Pi, or a
76
+ Kubernetes cluster — same code path.
77
+ - **No telemetry** — first-party auth, no analytics, no phone-home.
78
+ - **Lean** — FastAPI + Postgres + SvelteKit, the whole thing reads
79
+ top-to-bottom.
80
+
81
+ ## Documentation
82
+
83
+ - [`docs/self-host.md`](docs/self-host.md) — end-to-end self-hosting guide
84
+ (sizing, quickstart, TLS, backup, runbook).
85
+ - [`docs/security.md`](docs/security.md) — the threat model and the security
86
+ controls.
87
+ - [`docs/api-stability.md`](docs/api-stability.md) — the API stability policy:
88
+ what we promise not to break, and how deprecation works.
89
+ - [`docs/security-support.md`](docs/security-support.md) — supported versions,
90
+ the vulnerability-response SLA, and the advisory process.
91
+ - [`docs/openapi.json`](docs/openapi.json) — the snapshot-tested OpenAPI
92
+ document; the machine-readable API contract.
93
+ - [`docs/migrations/0.4.0-to-0.5.0.md`](docs/migrations/0.4.0-to-0.5.0.md) —
94
+ upgrading a 0.4.0 install.
95
+ - [`.env.example`](.env.example) — every configuration variable, with
96
+ defaults.
97
+ - [`CHANGELOG.md`](CHANGELOG.md) — release history.
98
+
99
+ ## Development
100
+
101
+ ```bash
102
+ uv sync --group dev # install deps (incl. dev tools)
103
+ docker compose up -d db # Postgres for local dev
104
+ uv run alembic upgrade head # run migrations
105
+ uv run uvicorn surgite.api:app --reload
106
+ cd frontend && npm install && npm run dev
107
+ uv run pytest # tests
108
+ uv run ruff check . && uv run ruff format --check . # lint + format
109
+ ```
110
+
111
+ See [`AGENTS.md`](AGENTS.md) for the canonical dev quickstart and the
112
+ architecture overview.
113
+
114
+ ## Contributing
115
+
116
+ Contributions are welcome. The project is deliberately minimalist — see the
117
+ principles in [`AGENTS.md`](AGENTS.md). Start with
118
+ [`CONTRIBUTING.md`](CONTRIBUTING.md) for dev setup and the PR workflow; please
119
+ also read [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). For anything
120
+ security-sensitive, see [`SECURITY.md`](SECURITY.md).
121
+
122
+ The canonical repository is on GitHub:
123
+ <https://github.com/nicoleman0/surgite>.
124
+
125
+ ## License
126
+
127
+ [MIT](LICENSE) © 2026 Nick Coleman
@@ -0,0 +1,98 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.9"]
3
+ build-backend = "uv_build"
4
+
5
+ [project]
6
+ name = "surgite"
7
+ version = "1.0.0"
8
+ description = "Git commit history summarizer with AI."
9
+ readme = "README.md"
10
+ requires-python = ">=3.14"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ keywords = [
14
+ "standup",
15
+ "git",
16
+ "summary",
17
+ "changelog",
18
+ "ai",
19
+ "llm",
20
+ "fastapi",
21
+ ]
22
+ classifiers = [
23
+ "Development Status :: 5 - Production/Stable",
24
+ "Environment :: Console",
25
+ "Environment :: Web Environment",
26
+ "Intended Audience :: Developers",
27
+ "Operating System :: OS Independent",
28
+ "Programming Language :: Python :: 3",
29
+ "Programming Language :: Python :: 3 :: Only",
30
+ "Programming Language :: Python :: 3.14",
31
+ "Topic :: Software Development :: Version Control :: Git",
32
+ "Topic :: Text Processing :: General",
33
+ ]
34
+ dependencies = [
35
+ "python-dotenv>=1.2.2",
36
+ "sqlalchemy>=2.0.49",
37
+ "alembic>=1.18.4",
38
+ "psycopg2-binary>=2.9.12",
39
+ "fastapi>=0.136.1",
40
+ "uvicorn>=0.47.0",
41
+ "httpx>=0.27.0",
42
+ "argon2-cffi>=23.1.0",
43
+ "cryptography>=46.0.0",
44
+ "keyring>=25.7.0",
45
+ ]
46
+
47
+ [[project.authors]]
48
+ name = "Nick Coleman"
49
+
50
+ [project.urls]
51
+ Homepage = "https://github.com/nicoleman0/surgite"
52
+ Source = "https://github.com/nicoleman0/surgite"
53
+ Documentation = "https://github.com/nicoleman0/surgite#readme"
54
+ Changelog = "https://github.com/nicoleman0/surgite/blob/main/CHANGELOG.md"
55
+ Issues = "https://github.com/nicoleman0/surgite/issues"
56
+
57
+ [project.scripts]
58
+ surgite = "surgite.cli:main"
59
+
60
+ [tool.uv.build-backend]
61
+ module-name = "surgite"
62
+ module-root = ""
63
+
64
+ [tool.pytest.ini_options]
65
+ testpaths = ["tests"]
66
+ pythonpath = ["."]
67
+ asyncio_mode = "auto"
68
+
69
+ [tool.ruff]
70
+ target-version = "py314"
71
+ line-length = 100
72
+
73
+ [tool.ruff.lint]
74
+ select = [
75
+ "E4",
76
+ "E7",
77
+ "E9",
78
+ "F",
79
+ "I",
80
+ "UP",
81
+ "B",
82
+ ]
83
+
84
+ [tool.ruff.lint.per-file-ignores]
85
+ "tests/conftest.py" = ["E402"]
86
+ "surgite/api.py" = ["B008"]
87
+ "surgite/auth.py" = ["B008"]
88
+ "surgite/scope.py" = ["B008"]
89
+
90
+ [dependency-groups]
91
+ dev = [
92
+ "mypy>=1.15.0",
93
+ "pip-audit>=2.9.0",
94
+ "pytest>=8.3.0",
95
+ "pytest-asyncio>=0.24.0",
96
+ "ruff>=0.9.0",
97
+ "httpx2>=2.4.0",
98
+ ]
@@ -0,0 +1,91 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.9"]
3
+ build-backend = "uv_build"
4
+
5
+ [project]
6
+ name = "surgite"
7
+ version = "1.0.0"
8
+ description = "Git commit history summarizer with AI."
9
+ readme = "README.md"
10
+ requires-python = ">=3.14"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ authors = [{ name = "Nick Coleman" }]
14
+ keywords = ["standup", "git", "summary", "changelog", "ai", "llm", "fastapi"]
15
+ classifiers = [
16
+ "Development Status :: 5 - Production/Stable",
17
+ "Environment :: Console",
18
+ "Environment :: Web Environment",
19
+ "Intended Audience :: Developers",
20
+ "Operating System :: OS Independent",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3 :: Only",
23
+ "Programming Language :: Python :: 3.14",
24
+ "Topic :: Software Development :: Version Control :: Git",
25
+ "Topic :: Text Processing :: General",
26
+ ]
27
+ dependencies = [
28
+ "python-dotenv>=1.2.2",
29
+ "sqlalchemy>=2.0.49",
30
+ "alembic>=1.18.4",
31
+ "psycopg2-binary>=2.9.12",
32
+ "fastapi>=0.136.1",
33
+ "uvicorn>=0.47.0",
34
+ "httpx>=0.27.0",
35
+ "argon2-cffi>=23.1.0",
36
+ "cryptography>=46.0.0", # Fernet for at-rest provider key encryption (slice 2)
37
+ "keyring>=25.7.0",
38
+ ]
39
+
40
+ [project.urls]
41
+ Homepage = "https://github.com/nicoleman0/surgite"
42
+ Source = "https://github.com/nicoleman0/surgite"
43
+ Documentation = "https://github.com/nicoleman0/surgite#readme"
44
+ Changelog = "https://github.com/nicoleman0/surgite/blob/main/CHANGELOG.md"
45
+ Issues = "https://github.com/nicoleman0/surgite/issues"
46
+
47
+ [project.scripts]
48
+ surgite = "surgite.cli:main"
49
+
50
+ [tool.uv.build-backend]
51
+ module-name = "surgite"
52
+ module-root = ""
53
+
54
+ [dependency-groups]
55
+ dev = [
56
+ "mypy>=1.15.0",
57
+ "pip-audit>=2.9.0",
58
+ "pytest>=8.3.0",
59
+ "pytest-asyncio>=0.24.0",
60
+ "ruff>=0.9.0",
61
+ # httpx2 is the successor to httpx, used by starlette's TestClient.
62
+ # Runtime code (surgite/) keeps using httpx; only the test client
63
+ # migrates to httpx2 to clear the StarletteDeprecationWarning that
64
+ # landed in starlette 1.3.x.
65
+ "httpx2>=2.4.0",
66
+ ]
67
+
68
+ [tool.pytest.ini_options]
69
+ testpaths = ["tests"]
70
+ pythonpath = ["."]
71
+ # Async summarizer unit tests are plain `async def`; auto mode runs them
72
+ # without a per-test marker. The TestClient drives the async API endpoints
73
+ # synchronously, so those tests stay sync.
74
+ asyncio_mode = "auto"
75
+
76
+ [tool.ruff]
77
+ target-version = "py314"
78
+ line-length = 100
79
+
80
+ [tool.ruff.lint]
81
+ # Defaults (E4/E7/E9, F) plus import sorting (I), pyupgrade (UP), and bugbear (B).
82
+ select = ["E4", "E7", "E9", "F", "I", "UP", "B"]
83
+
84
+ [tool.ruff.lint.per-file-ignores]
85
+ # conftest deliberately sets env vars before importing surgite modules, so its
86
+ # imports can't sit at the top of the file.
87
+ "tests/conftest.py" = ["E402"]
88
+ # Depends() in argument defaults is the standard FastAPI pattern.
89
+ "surgite/api.py" = ["B008"]
90
+ "surgite/auth.py" = ["B008"]
91
+ "surgite/scope.py" = ["B008"]
File without changes