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 +21 -0
- surgite-1.0.0/PKG-INFO +163 -0
- surgite-1.0.0/README.md +127 -0
- surgite-1.0.0/pyproject.toml +98 -0
- surgite-1.0.0/pyproject.toml.orig +91 -0
- surgite-1.0.0/surgite/__init__.py +0 -0
- surgite-1.0.0/surgite/api.py +2013 -0
- surgite-1.0.0/surgite/audit.py +70 -0
- surgite-1.0.0/surgite/auth.py +636 -0
- surgite-1.0.0/surgite/cli.py +141 -0
- surgite-1.0.0/surgite/cli_auth.py +262 -0
- surgite-1.0.0/surgite/config.py +102 -0
- surgite-1.0.0/surgite/db.py +379 -0
- surgite-1.0.0/surgite/formatter.py +9 -0
- surgite-1.0.0/surgite/git.py +152 -0
- surgite-1.0.0/surgite/logging_config.py +77 -0
- surgite-1.0.0/surgite/mail.py +114 -0
- surgite-1.0.0/surgite/models.py +14 -0
- surgite-1.0.0/surgite/rate_limit.py +131 -0
- surgite-1.0.0/surgite/schemas.py +121 -0
- surgite-1.0.0/surgite/scope.py +61 -0
- surgite-1.0.0/surgite/secrets.py +105 -0
- surgite-1.0.0/surgite/summarizer.py +458 -0
- surgite-1.0.0/surgite/templates/email/password-reset.txt +13 -0
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
|
+
[](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml)
|
|
42
|
+
[](https://pypi.org/project/surgite/)
|
|
43
|
+
[](https://pypi.org/project/surgite/)
|
|
44
|
+
[](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
|
+

|
|
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
|
surgite-1.0.0/README.md
ADDED
|
@@ -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
|
+
[](https://github.com/nicoleman0/surgite/actions/workflows/ci.yml)
|
|
6
|
+
[](https://pypi.org/project/surgite/)
|
|
7
|
+
[](https://pypi.org/project/surgite/)
|
|
8
|
+
[](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
|
+

|
|
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
|