ci: add end-to-end test tier, CI workflow, and coverage gating #1
Reference in New Issue
Block a user
Delete Branch "task-0019-ci-integration-tier"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Adds the third (end-to-end) test tier and the CI workflow that runs all three tiers, plus coverage reporting with regression thresholds. Implements task
0019(.claude/tasks/0019-ci-integration-tier.md); the coverage work rides along on the same branch as a separate concern.Three commits, each self-contained:
ci:end-to-end tier + Gitea Actions workflow — the task 0019 deliverable.test:coverage tooling + regression thresholds — v8 coverage, gated in CI.test:closetea/error-classifier gaps, raise thresholds — lifts coverage and the ratchet.End-to-end tier (task 0019)
.gitea/workflows/ci.yml— runs on push-to-mainand on PRs. Executes the unit + integration tiers (npm run test:coverage) and the end-to-end tier (npm run test:e2e) against a disposablegitea/gitea:1.23.5service container. The job runs inside anode:20-bookwormcontainer so the service is reachable by name (gitea:3000) on both Gitea Actions and GitHub Actions — the file stays near-verbatim GitHub-compatible.test/e2e/— provisions its own repo, token, and seed issues on the live instance entirely over HTTP (health-wait → first-user web sign-up → scoped token → repo/issue seeding, nodocker exec), then drives the real CLI seam and asserts output + exit codes for the tracer command set (issue list,--state,--limit,REPO_NOT_FOUND, invalid--state, home view).COVERED_ISSUE_PATHScontract (the paths the issue-list extractors read) is asserted against both the recorded fixture and the live response, so a drift in either fails the tier.GITEA_AXI_E2E_URL, so the defaultnpm teststays dependency-free.Coverage
npm run test:coverage;src/**only, excluding the types-onlydeps.tsand the bin entrypointmain.ts.errors.tsnow 100%;tea.ts96%, remainder is defensive code unreachable through the seam).Verification
gitea/gitea:1.23.5container — 7/7 green, which also confirms the pinned tag pulls.POST /user/repos) requires thewrite:usertoken scope on Gitea 1.23, notwrite:repository— fixed inprovision.ts. Exactly the fixture-vs-live divergence class this tier exists to catch.Acceptance criteria (task 0019)
Reviewer notes
container:+services:).gitea/gitea:1.23.5was chosen to match the gitea-js client line (^1.23.0); bump deliberately.