385b442b6f
Reframe the README around two transports and add a local stdio quickstart with uvx/pip and Claude Desktop / Claude Code wiring. New docs: local-quickstart.md and packaging.md (uv build/publish). Document resource-type-aware authorization and classified gitea_request in security.md; stdio env vars + audit-log fallback in configuration.md; local install in deployment.md; core+adapters in architecture.md. Add the missing root AGENTS.md contract, update CLAUDE.md with the core/adapter layout, fail-closed invariants, and the branching flow (HEAD -> feature -> dev -> main). Update roadmap/todo and .env.example. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1.8 KiB
1.8 KiB
PLAN — local stdio package + safe full-API coverage
Branch: feat/local-package-and-full-coverage (from dev). All PRs target dev.
Flow: HEAD -> custom branch -> dev -> main. Never push directly to dev/main.
Baseline (recorded Phase 0): 284 passed, 1 skipped, coverage 84.04%, threshold 80%.
Phase checklist
- Phase 0 — Branch from dev, baseline recorded, PLAN.md committed.
- Phase 1 — Extract transport-agnostic core + shared tool registry (+ boundary test).
- Phase 2 — stdio adapter (
stdio_app.py) + packaging (core +[server]extra, 0.2.0). - Phase 3 — Resource-type-aware authorization (fail-closed).
- Phase 4 — gitea_request classifier + known-path gate (unknown path => deny).
- Phase 5 — Tests: authz matrix, write-mode bypass, classifier, stdio adapter, boundary.
- Phase 6 — Docs & README (local vs server quickstart, authz model, packaging, CLAUDE/AGENTS).
- Phase 7 —
.gitea/workflows/publish.yml(uv build + publish to Gitea registry on tag). - Phase 8 — Verify green + coverage >= baseline,
uv build, push, open PR into dev.
Note: version bumped to 0.2.0 (the app already reported 0.2.0; pyproject was 0.1.0).
TODO(authz): make list_organizations user-scoped (/users/{login}/orgs) so it can
be allowed rather than denied in service-PAT mode.
Key deltas found during orientation
- No single tool registry today: definitions in
mcp_protocol.AVAILABLE_TOOLS, handlers inserver.TOOL_HANDLERS. Phase 1 unifies them. tools/raw_tools.pyimportsfastapi.HTTPException— the only core->web import to break.- Current authz is repo-only and lives in
server._verify_user_repository_access. - stdio mode must run with
AUTH_ENABLED=false(config otherwise requires MCP_API_KEYS). AGENTS.mdabsent at root though CLAUDE.md cites it; create it from the contract.