v0.8.0 — E2E test suite + schema fixes + operational runbooks
E2E test infrastructure (reincarnation of #63 by @ecthelion77, Olivier Gintrand) plus three pre-existing schema bugs the suite surfaced on first run against GitLab CE 18.x. Also includes three operational runbooks (release atomicity recovery, ghcr first-publish, release ceremony) that close #47, #49, #51.
Added
- End-to-end test suite under
e2e/— 81 tests covering all 86 MCP tools
against a real GitLab CE container. 76 pass + 5 Premium-only skipped on a
fresh GitLab volume. Originally proposed in #63 by @ecthelion77; reincarnated
by maintainer onto currentmainwith corrections (seeInternalbelow). .github/workflows/e2e.yml— runs the E2E suite after the build workflow
completes, using a pre-warmed GitLab CE image..github/workflows/warm-gitlab.yml— weekly pre-warm of a GitLab CE image
with migrations already applied, cutting E2E boot time from 8-12 min cold to
~2 min. Manualworkflow_dispatchavailable for ad-hoc rebuilds.scripts/check-tool-coverage.sh— coverage gate wired intobuild.yml
that fails the build if a new tool is added tosrc/index.tswithout a
corresponding E2E test. Premium-only tools (group wiki) whitelisted.GITLAB_HOST_PORTenv override ine2e/docker-compose.ymlfor local
contributors whose host port 8080 is occupied by other services.
Fixed
GitLabRepositorySchemanow declarespath_with_namespaceandpath—
present in every/projectsresponse from GitLab but Zod was silently
stripping them, so tool consumers that relied on them (including the
search_repositoriesE2E test) sawundefined. Pre-existing bug onmain,
surfaced by the reincarnated suite.approveMergeRequest/unapproveMergeRequestno longer parse responses
as full MergeRequest objects — the/merge_requests/:iid/approveand
/unapproveendpoints in GitLab CE return a small approval-state object,
not the full MR. The old code threwInvalid arguments: id, iid, ... required
on every call. New schemaMergeRequestApprovalStateSchemaparses both
variants and tolerates the 204 No Content return from CE on unapprove.WikiPageFormatEnumaccepts'plaintext'— GitLab CE 18.x returns
'plaintext'on wiki pages created via API without an explicit format,
in addition to the 4 documented values. Enum was rejecting the response.
Internal
- Maintainer corrections applied during reincarnation of #63 — node:22-alpine
digest pin ine2e/Dockerfile;gitlab/gitlab-ce:18.11.3-ce.0pin in
docker-compose (was:latest);external_url 'http://gitlab.local'(nominal
hostname) so nginx listens on container port 80 matching the port mapping;
monitoring_whitelist = ['0.0.0.0/0', '::/0']so host-side
wait-for-gitlab.shcan poll/-/readinessthrough the docker bridge;
FIXTURES_DIRdefault changed from absolute/app/fixturesto relative
./fixturesso host runs work;ToolResulttype narrowed fromanyto a
shaped optional-content union; coverage-script regex tightened to.callTool(
context to eliminate 5 false positives;.dockerignoreadded;warm-gitlab.yml
permissions and:latestpush gating hardened. Full per-commit detail on the
reincarnation PR.
Documentation
docs/OPERATIONS.mdgained two operational runbooks:
"Release atomicity & recovery" (closes #47) covering the independent
failure modes ofbuild.ymlandpublish.ymlplusgh CLIrecovery
commands for each asymmetric case, and "First-publish runbook: ghcr.io
package" (closes #51) covering the one-time visibility/Actions-access
setup for a freshly created container package on GitHub.CONTRIBUTING.mdgained a "🎯 Release ceremony" section (closes #49)
documenting the release-driven publish model (since #43): when to cut a
release, the 8-step maintainer procedure, and the anti-patterns (no
manualnpm publish, no amends to published releases, no CHANGELOG
rewrites).CLAUDE.mdtest note refreshed to mention the newe2e/suite +
coverage gate, and to list all current unit test files.
Credits
- E2E suite design and ~80% of the implementation: @ecthelion77 (Olivier Gintrand).
Cherry-picked with authorship preserved on each of his 5 commits; the squash
merge tomaincarries aCo-authored-by:trailer.