Stands up family-consistent CI on bvandeusen/StashHandler, mirroring the NhenArchiver Python sibling (minus the integration lane — StashHandler is SQLite-only with no service containers).
What's in here
.forgejo/workflows/ci.yml — three lanes on push to dev/main and on v* tags:
lint — ruff check . (no dep install, fast-fail).
unit — pytest tests/ (uv→pip install of requirements.txt + pytest + blake3).
publish — needs: [lint, unit]. Builds + pushes git.fabledsword.com/bvandeusen/stashhandler with the family rule-46 tag scheme: dev→:dev+:c-<sha>, main→:latest+:c-<sha>, v*→:<version>+:latest. Auth via REGISTRY_TOKEN (rule 7).
tests/ — starter unit suite: hashing (sha256/blake3), SQLite dedup, media-extension filter, transfer modes (copy/hardlink/move).
Stands up family-consistent CI on `bvandeusen/StashHandler`, mirroring the NhenArchiver Python sibling (minus the integration lane — StashHandler is SQLite-only with no service containers).
## What's in here
- **`.forgejo/workflows/ci.yml`** — three lanes on push to `dev`/`main` and on `v*` tags:
- `lint` — `ruff check .` (no dep install, fast-fail).
- `unit` — `pytest tests/` (uv→pip install of `requirements.txt` + pytest + blake3).
- `publish` — `needs: [lint, unit]`. Builds + pushes `git.fabledsword.com/bvandeusen/stashhandler` with the family **rule-46 tag scheme**: `dev`→`:dev`+`:c-<sha>`, `main`→`:latest`+`:c-<sha>`, `v*`→`:<version>`+`:latest`. Auth via `REGISTRY_TOKEN` (rule 7).
- **`tests/`** — starter unit suite: hashing (sha256/blake3), SQLite dedup, media-extension filter, transfer modes (copy/hardlink/move).
- **`pyproject.toml`** — ruff target + pytest `pythonpath`/`testpaths`.
- **`ci-requirements.md`** (rule 39), **`.dockerignore`**.
## Verification
CI run #1526 on the `dev` head — all three lanes green, image pushed (`:dev` + `:c-3121749`).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Family-consistent CI for StashHandler (mirrors the NhenArchiver Python
sibling, minus the integration lane — StashHandler is SQLite-only with no
service containers).
- .forgejo/workflows/ci.yml: lint (ruff) -> unit (pytest) -> publish.
publish builds + pushes git.fabledsword.com/bvandeusen/stashhandler with
the family rule-46 tag scheme (dev->:dev+:c-<sha>, main->:latest+:c-<sha>,
v* tag->:<version>+:latest). Gated on lint+unit. Needs REGISTRY_TOKEN.
- tests/: starter unit suite — hashing, SQLite dedup, media filter, transfer
modes.
- pyproject.toml: ruff target + pytest pythonpath/testpaths.
- ci-requirements.md (family rule 39), .dockerignore.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nyYC9dTQ78SqhpNFtpMvT
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Stands up family-consistent CI on
bvandeusen/StashHandler, mirroring the NhenArchiver Python sibling (minus the integration lane — StashHandler is SQLite-only with no service containers).What's in here
.forgejo/workflows/ci.yml— three lanes on push todev/mainand onv*tags:lint—ruff check .(no dep install, fast-fail).unit—pytest tests/(uv→pip install ofrequirements.txt+ pytest + blake3).publish—needs: [lint, unit]. Builds + pushesgit.fabledsword.com/bvandeusen/stashhandlerwith the family rule-46 tag scheme:dev→:dev+:c-<sha>,main→:latest+:c-<sha>,v*→:<version>+:latest. Auth viaREGISTRY_TOKEN(rule 7).tests/— starter unit suite: hashing (sha256/blake3), SQLite dedup, media-extension filter, transfer modes (copy/hardlink/move).pyproject.toml— ruff target + pytestpythonpath/testpaths.ci-requirements.md(rule 39),.dockerignore.Verification
CI run #1526 on the
devhead — all three lanes green, image pushed (:dev+:c-3121749).🤖 Generated with Claude Code