CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 15s
CI & Build / TypeScript typecheck (push) Successful in 54s
CI & Build / integration (push) Successful in 1m4s
CI & Build / Python tests (push) Successful in 2m4s
CI & Build / Build & push image (push) Successful in 47s
LICENSE carries the GNU Affero General Public License v3.0 text, the same file the other Fabled projects ship. pyproject.toml, the frontend's package.json and lockfile, and the plugin manifest declare it as the SPDX expression AGPL-3.0-only, and the README says what it asks of anyone who runs a modified version over a network. Reading `license` as an SPDX expression needs setuptools 77, so the build floor rises to it. The project description now matches the README's tagline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
2.1 KiB
TOML
68 lines
2.1 KiB
TOML
[build-system]
|
|
# 77 is the first setuptools that reads `license` as an SPDX expression.
|
|
requires = ["setuptools>=77.0", "setuptools-scm>=8.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "grimoire"
|
|
version = "0.1.0"
|
|
description = "A self-hosted system of record for the work you do with Claude Code"
|
|
license = "AGPL-3.0-only"
|
|
requires-python = ">=3.14"
|
|
dependencies = [
|
|
"quart>=0.19",
|
|
"sqlalchemy[asyncio]>=2.0",
|
|
"asyncpg>=0.29",
|
|
"alembic>=1.13",
|
|
"httpx>=0.27",
|
|
# Seals the backup destination's S3 secret at rest (services/secrets.py).
|
|
# Already in the image through pyjwt; named here because Grimoire now
|
|
# imports it directly.
|
|
"cryptography",
|
|
"hypercorn>=0.17",
|
|
"bcrypt>=4.0",
|
|
"aiosmtplib>=3.0",
|
|
"caldav>=1.3",
|
|
"icalendar>=5.0",
|
|
"APScheduler>=3.10,<4.0",
|
|
# Floor 2.2: server.py uses the 2.x `mcp.server.mcpserver.MCPServer` API
|
|
# (transport settings on `streamable_http_app`, `call_tool(..., context)`,
|
|
# `ToolError`), ported and read against 2.2.0 (#2196). No ceiling: CI
|
|
# installs with `uv sync --locked`, so a new major arrives only through a
|
|
# deliberate `uv lock`, which is where its breakage should be diagnosed.
|
|
"mcp[cli]>=2.2",
|
|
"fastembed>=0.4",
|
|
"pgvector>=0.3",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=8.0",
|
|
"pytest-asyncio>=0.23",
|
|
"ruff>=0.6",
|
|
]
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["src"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|
|
markers = [
|
|
"integration: requires a real Postgres database (runs only in the CI integration lane)",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 120
|
|
target-version = "py312"
|
|
|
|
[tool.ruff.lint]
|
|
# E = pycodestyle errors, F = pyflakes (catches unused imports, undefined names)
|
|
# Start conservative — add more rules as the codebase gains coverage.
|
|
select = ["E", "F"]
|
|
ignore = [
|
|
"E501", # line too long — long lines are acceptable in this codebase
|
|
"E402", # module-level import not at top — common in Quart app factories
|
|
"F401", # imported but unused — some re-exports are intentional
|
|
]
|