Hardens the local stdio MCP transport, proves it end-to-end, records project conventions in CLAUDE.md, and makes the Gitea workflows complete by testing the package build in CI.
Local MCP (stdio) — made solid
stdout is now strictly reserved for the JSON-RPC stream._configure_stderr_logging() pins all logging to stderr and rewrites any stray stdout handler, so a log line can never corrupt the protocol (the classic stdio-MCP failure).
Extracted a pure, testable build_server() from _serve().
End-to-end tests over the mcp in-memory transport: initialize + tools/list + tools/call, covering a successful round trip and a policy denial surfaced as an MCP error (not a crash).
CLAUDE.md
No AI attribution anywhere in the project (commits, PRs, releases, comments, docs).
Documented the stdio transport invariants (stdout reserved, build_server vs _serve).
Workflows — complete & tested
New package job in test.yml: uv build, then smoke-test both install profiles —
core install excludes the web stack and the aegis-gitea-mcp stdio entry exits 2 with an actionable message;
the [server] extra pulls in fastapi/uvicorn and imports the server entry.
Catches packaging / console-script regressions on every push and PR.
Locally mirrored the CI package smoke: core wheel installs without FastAPI; stdio entry exits 2.
## Summary
Hardens the local stdio MCP transport, proves it end-to-end, records project conventions in `CLAUDE.md`, and makes the Gitea workflows complete by testing the package build in CI.
### Local MCP (stdio) — made solid
- **stdout is now strictly reserved for the JSON-RPC stream.** `_configure_stderr_logging()` pins all logging to stderr and rewrites any stray stdout handler, so a log line can never corrupt the protocol (the classic stdio-MCP failure).
- Extracted a pure, testable `build_server()` from `_serve()`.
- **End-to-end tests over the `mcp` in-memory transport**: `initialize` + `tools/list` + `tools/call`, covering a successful round trip and a policy denial surfaced as an MCP error (not a crash).
### CLAUDE.md
- **No AI attribution** anywhere in the project (commits, PRs, releases, comments, docs).
- Documented the stdio transport invariants (stdout reserved, `build_server` vs `_serve`).
### Workflows — complete & tested
- New `package` job in `test.yml`: `uv build`, then smoke-test **both** install profiles —
- core install excludes the web stack and the `aegis-gitea-mcp` stdio entry exits 2 with an actionable message;
- the `[server]` extra pulls in fastapi/uvicorn and imports the server entry.
- Catches packaging / console-script regressions on every push and PR.
### Verification
- ruff + ruff-format + black + mypy (strict) clean.
- pytest: 350 passed, 1 skipped; coverage 83.99% (threshold 80%).
- Locally mirrored the CI package smoke: core wheel installs without FastAPI; stdio entry exits 2.
Reserve stdout for the JSON-RPC stream: _configure_stderr_logging() pins all
logging to stderr (and rewrites any stray stdout handler) so a log line can
never corrupt the stdio protocol. Extract a pure, testable build_server() from
_serve(). Add end-to-end tests over the mcp in-memory transport (initialize +
tools/list + tools/call), covering a successful round trip and a policy denial
surfaced as an MCP error.
Record that no 'Generated with Claude Code' / Co-Authored-By / 'made by Claude'
attribution may appear in commits, PRs, releases, comments or docs. Add stdio
transport notes (stdout reserved for JSON-RPC, build_server vs _serve).
Add a package job to the test workflow: uv build, then verify a clean core
install excludes the web stack and the aegis-gitea-mcp stdio entry exits 2 with
an actionable message, and that the [server] extra pulls in fastapi/uvicorn and
imports the server entry. Catches packaging/console-script regressions in CI.
Gitea's act_runner does not reliably support the actions/upload-artifact@v4
backend. Drop the artifact upload from the test workflow (the package job's
purpose is to build and smoke-test, not to store wheels) and make the publish
workflow's upload best-effort (continue-on-error) so a flaky artifact backend
cannot block a release — the package is still published to the registry.
Latte
merged commit 2bb74807bc into dev2026-06-27 13:29:11 +00:00
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.
Summary
Hardens the local stdio MCP transport, proves it end-to-end, records project conventions in
CLAUDE.md, and makes the Gitea workflows complete by testing the package build in CI.Local MCP (stdio) — made solid
_configure_stderr_logging()pins all logging to stderr and rewrites any stray stdout handler, so a log line can never corrupt the protocol (the classic stdio-MCP failure).build_server()from_serve().mcpin-memory transport:initialize+tools/list+tools/call, covering a successful round trip and a policy denial surfaced as an MCP error (not a crash).CLAUDE.md
build_servervs_serve).Workflows — complete & tested
packagejob intest.yml:uv build, then smoke-test both install profiles —aegis-gitea-mcpstdio entry exits 2 with an actionable message;[server]extra pulls in fastapi/uvicorn and imports the server entry.Verification