CI & Build / Python lint (push) Successful in 2s
CI & Build / Plugin hooks (push) Successful in 13s
CI & Build / TypeScript typecheck (push) Successful in 54s
CI & Build / integration (push) Successful in 1m1s
CI & Build / Python tests (push) Successful in 2m2s
CI & Build / Build & push image (push) Successful in 28s
The forge repo is now bvandeusen/FabledGrimoire. The plugin marketplace default, the install commands in the docs and plugin README, the CI requirements title and the example repo URLs in comments and tests follow it. docs/development.md now names the image the build actually publishes, fabledgrimoire. Two test names still said "scribes_own"; they now say "grimoires_own". What still says scribe does so on purpose: - the backup reader's accepted archive names and prefix; - the label every stored secret is sealed under; - the notes on keeping an old install's database names; - the old migrations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.1 KiB
2.1 KiB
CI Requirements — FabledGrimoire
Spec lives in
docs/process.mdin the CI-Runner repo.
Runtime image
git.fabledsword.com/bvandeusen/ci-python:3.14
Used by all six jobs in .forgejo/workflows/ci.yml: typecheck (Vue/TS),
plugin (hook checks), lint (ruff), test (pytest), integration (pytest +
real Postgres), build (docker buildx).
Image deps used
- python 3.14
- node 24 (
npm ci+vue-tscin the typecheck job; the productionDockerfilebuilds the frontend onnode:22-alpine) - ruff (lint job runs
ruff check src/ scripts/with zero install overhead) - uv (test + integration jobs run
uv sync --locked) - docker CLI + buildx (build job pushes the production image to the Fabled-Git registry)
Per-job tool installs
Anything CI installs at job time that isn't in the image. Promotion candidates if more than one project needs them.
shellcheck— apt-installed in the plugin job, which lints the Claude Code hook scripts and runs their fail-open smoke test. Grimoire is its only consumer, so perdocs/process.mdit stays per-job. It is small (~20 MB) and a promotion candidate once another project lints shell.
The hooks ship to users' machines, so they use only POSIX tools (awk, sed,
tr, od, cut, head, tail, grep, sort, date, printf) plus git and curl.
The smoke test runs on a bare image to keep it that way: a tool such as jq
is missing on macOS, slim Debian/Ubuntu and Alpine, and a hook that needed it
would give those machines nothing.
Notes
- Production runtime image (
Dockerfile) also tracks Python 3.14 — the CI image and runtime image stay aligned by design so test results are representative. - Build wall time: dominated by
pytest(full async test suite). Cold ci-python pulls add ~30s; not a blocker. - Registry-backed BuildKit layer cache (
type=registry,ref=…:cache,mode=max) gives ~80% speedup on warm builds — see the build job comment. pyproject.tomlpinsrequires-python = ">=3.14"to match the CI + runtime target; lockfile (uv.lock) is committed and resolves against Python 3.14.