Files
bvandeusenandClaude Opus 5.5 81fe851509
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
licence: Fabled Grimoire is AGPL-3.0-only
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>
2026-10-22 15:45:11 -04:00

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
]