mise install— every tool this repository uses, pinned inmise.toml.mise exec -- lefthook install— the git hooks (lefthookis pinned, not onPATH).mise run lintmise run test-unit
| Hook | Runs |
|---|---|
pre-commit |
mise run lint, gitleaks on staged changes |
commit-msg |
Conventional Commit check (a grep; this repository has no node) |
pre-push |
nothing: CI runs the suites on every push |
| Task | Runs |
|---|---|
lint |
shellcheck + shfmt (-i 2 -ci) over every tracked shell file |
test-unit |
The offline suites, listed by name in mise.toml |
test-integration |
The suites that generate a real project as a fixture |
test |
Every suite in tests/, including the per-adapter smoke tests |
test-runner |
test-unit and test-integration with CI, GITHUB_ACTIONS and MISE_YES set, as on a runner |
ci-unit |
lint + test-unit: the unit job in .github/workflows/ci.yml |
checklist |
lint + test |
test-runner matters: with CI set, pnpm uses --frozen-lockfile, so a suite can pass locally and fail on a runner.
| Suite | Lane | Where CI runs it |
|---|---|---|
Listed in test-unit |
unit | .github/workflows/ci.yml, unit job |
Listed in test-integration |
integration | .github/workflows/ci.yml, integration job |
tests/new-<adapter>.bats |
smoke, per adapter tier | .github/workflows/adapters.yml |
tests/provenance.bats |
provenance | .github/workflows/provenance.yml |
tests/contract.bats fails when a suite is in no lane, or when a test-unit suite runs an adapter generator.
- Assert with
assert_ok(tests/helpers/setup.bash), not[ "$status" -eq 0 ]: it prints the captured output on failure. - Each test builds its own fixtures; no suite uses
setup_file. Suites run in parallel with--jobs. - When the environment cannot hold a precondition,
skipwith the reason instead of failing.
Follow docs/runbook/add-an-adapter.md. The wizard needs no change: it reads scaffold list.
A service is a directory under services/ (ADR-0019).
- Add
service.envwithSERVICE_NAME,SERVICE_KINDand a digest-pinnedSERVICE_IMAGE. - Add
compose.fragment.yamland the per-lanecompose.prod.fragment.yaml,compose.dev.fragment.yaml,compose.test.fragment.yaml, none with animage:line. - Add
env.fragment. - Add
drivers/<family>.shfor every family of anapiorappadapter — todaylaravel,nest,flask. - Run
./scaffold lint: it derives the families from the adapters and names any missing driver.
A new adapter family is the same check from the other side: every service needs its driver before it merges.
| Change | Reaches an existing project |
|---|---|
common/ or an adapter |
When someone runs scaffold update in it (ADR-0023) |
| A reusable workflow in you/.github | On its next run, once v1 moves (ADR-0005) |
- Conventional Commits, checked at
commit-msg. - The toolbox is versioned by git tag only.
scaffold --versionisgit describe, and.scaffold.tomlrecords it. - Tagging is manual:
git tag v0.2.0 && git push origin v0.2.0.
mise run lint
mise run test-runnermise run test adds the per-adapter smoke tests; tier B's five tests take about five minutes each.