89 Commits
Author SHA1 Message Date
Latte 79bce1d210 test: regenerate the coverage report and the sweep baseline, document the baseline and the runner policy 2026-10-14 18:17:11 +02:00
Latte d1b9a4845e test: write failure paths, expired OAuth token, non-admin admin-tool refusals and webhook credential leak checks 2026-10-14 18:14:44 +02:00
Latte 84fa29e380 test: merged-commit lookup, scheduled auto-merge cancel and repository transfer answers 2026-10-14 18:12:46 +02:00
Latte 7dc749d7cd test: manage runners at every scope, rerun and delete a completed run, fail when the runner is required 2026-10-14 18:09:17 +02:00
Latte 9e51f72ec9 test: pin the sweep outcome per tool in a baseline, seed a GPG key, fail loudly when seeding finds no run 2026-10-14 18:06:29 +02:00
Latte 4e108771f8 ci: build under a per-run local tag, untag registry refs only, gate the image push on every test job 2026-10-14 18:02:43 +02:00
Latte 59d0e43aae docs: fix the claude mcp add form, pin the package index, document known limitations
The --env option swallowed the server name, so the stdio command is reordered. uvx now always
names the project registry because the package name is not registered on public PyPI.
README gains a Known limitations section, the READ_ONLY wording is corrected, packaging.md
warns about --extra-index-url and the Le Chat admin requirement is mentioned.
2026-10-14 18:01:19 +02:00
Latte 8786502b8c test: sweep checks the audit trail and keeps the unit test free of em dashes
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Successful in 32s
ci / lint (push) Successful in 44s
ci / test-mcp (push) Successful in 1m19s
ci / security (push) Successful in 1m33s
ci / test-integration (push) Successful in 2m30s
ci / test-unit (push) Successful in 3m45s
ci / build-and-push (push) Successful in 40s
2026-10-14 17:57:54 +02:00
Latte 446ec11954 test: integration coverage report, suite docs and harness isolation fix 2026-10-14 17:57:54 +02:00
Latte ae6d83c3bd test: setup command against the live instance 2026-10-14 17:57:54 +02:00
Latte fed75b17c8 test: per-user OAuth mode against the live instance 2026-10-14 17:57:54 +02:00
Latte 303bd9aa21 test: sweep every tool through the MCP server against a seeded Gitea 2026-10-14 17:57:54 +02:00
Latte 22c8157ca4 test: Actions run scenario on an act_runner container 2026-10-14 17:57:54 +02:00
Latte 29b12bfe0d test: admin, sudo, notification, user and package scenarios 2026-10-14 17:57:54 +02:00
Latte 825c3c93e2 test: issue, pull request, release, secret, variable and webhook scenarios 2026-10-14 17:57:54 +02:00
Latte 51c766b231 test: integration helpers and org, team and repo scenarios through the MCP server 2026-10-14 17:57:54 +02:00
Latte 0f5f5cdd95 fix: do not echo setting values in configuration errors; test: stdio and config redaction 2026-10-14 17:52:07 +02:00
Latte 984673e8cf fix: reject a trailing newline in sudo; test: malformed input suite 2026-10-14 17:49:37 +02:00
Latte 421a6507c0 fix: redact a data field in Action secret responses; test: secret echo suite 2026-10-14 17:46:11 +02:00
Latte fef80a5b21 test: security suite for auth, startup, redaction; fix: mask secrets in object keys 2026-10-14 17:44:20 +02:00
Latte 766968fa42 ci: pin actions to commit SHAs, guard Docker jobs from forks, scan the image, gate publish on security (SEC-06, SEC-07, SEC-14, SEC-15, SEC-16) 2026-10-14 17:40:16 +02:00
Latte 6f7a3c0e5b fix: refuse a token store directory owned by another user or left writable (SEC-13) 2026-10-14 17:36:21 +02:00
Latte d96c3ac604 fix: reject whitespace and control characters in base URLs and warn on plain http Gitea (SEC-10) 2026-10-14 17:34:15 +02:00
Latte 87f048cc4d fix: quota pending sign-ins and registrations per address, keep young clients, write the store off the loop (SEC-09) 2026-10-14 17:32:03 +02:00
Latte f57c237bed fix: rate limit /token and /revoke, bucket IPv6 by /64 and warn about untrusted forwarded headers (SEC-08) 2026-10-14 17:29:12 +02:00
Latte 782d416e46 fix: require a matching Origin on consent and name the binding cookie per flow (SEC-17, SEC-19) 2026-10-14 17:26:52 +02:00
Latte 8be859243d fix: add OAUTH_REDIRECT_ALLOWLIST for client registration and waive the open default (SEC-05) 2026-10-14 17:24:41 +02:00
Latte 79aa4f7fc0 fix: load ./.env only when private and owned, add --env-file and AEGIS_ENV_FILE (SEC-04) 2026-10-14 17:22:29 +02:00
Latte 7307214ab6 fix: create the audit log 0600 in a 0700 directory and refuse symlinks (SEC-11) 2026-10-14 17:18:29 +02:00
Latte fd5e4b71f3 fix: record the calling client and only schema-known names in audit entries (SEC-12, SEC-18) 2026-10-14 17:14:13 +02:00
Latte 43eebd3089 fix: write-ahead audit entry so calls stop when the audit log stops accepting writes (SEC-03) 2026-10-14 17:11:53 +02:00
Latte 5b622e64e2 fix: redact stored webhook authorization headers and other secret fields by key name (SEC-02) 2026-10-14 17:08:59 +02:00
Latte d5ca530db3 fix: cap and type-check the unauthenticated consent POST body (SEC-01) 2026-10-14 17:07:06 +02:00
Latte ce5ae6caa5 fix: redact identity secrets through a public hook and mask issued agm_ tokens
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Failing after 30s
ci / lint (push) Successful in 42s
ci / test-integration (push) Successful in 46s
ci / security (push) Failing after 27s
ci / test-mcp (push) Successful in 1m16s
ci / test-unit (push) Successful in 2m17s
ci / build-and-push (push) Successful in 17s
Identity gains a redact field that the executor honours, so the OAuth
resolver no longer needs an executor subclass overriding private
internals. Opaque agm_ tokens issued by our authorization server are now
masked by the secret patterns wherever they appear in content.
2026-10-14 16:45:36 +02:00
Latte e02cede9f2 fix: drop the obsolete OAuth-unavailable startup warning test 2026-10-14 16:44:04 +02:00
Latte 7286440d64 test: cover the per-user OAuth flow, threat cases, store and startup 2026-10-14 16:41:18 +02:00
Latte 5e144772b2 test: add MCP smoke tests over stdio and streamable HTTP, from source and from the built image
ci / lint (push) Successful in 41s
ci / security (push) Failing after 28s
ci / build-and-push (push) Successful in 17s
ci / gitleaks (push) Successful in 9s
ci / docs-check (push) Failing after 30s
ci / test-integration (push) Successful in 46s
ci / test-mcp (push) Successful in 1m16s
ci / test-unit (push) Successful in 1m52s
2026-10-14 16:26:16 +02:00
Latte cf3d2e17d3 fix: fail closed on an unwritable audit log, bound the rate limiter and harden startup
The audit logger is opened at startup (exit 2 on failure) and obtained before
every call, which is refused with audit_unavailable otherwise. Audit records only
take validated path and sudo values and use the request id as correlation id. The
rate limiter evicts idle keys, caps tracked keys, audits the first excess per key
and window and uses the settings passed to the app. FORWARDED_ALLOW_IPS is now a
setting, and startup warns about a missing host allow-list and unavailable OAuth.
2026-10-14 16:24:51 +02:00
Latte a3222d5ebe fix: report an invalid --port with a short message instead of listing every choice 2026-10-14 16:24:51 +02:00
Latte c73a7cc3ce fix: serialize the admin login lookup so concurrent first calls send one request 2026-10-14 16:24:51 +02:00
Latte 68bd8700dc feat: add docs drift check 2026-10-14 16:13:11 +02:00
Latte c9e2c481e7 feat: add MCP server core, stdio and streamable HTTP transports and serve command
Low-level SDK server built from the catalog plus gitea_api_request, with TOOLSETS/READ_ONLY/DISABLED_TOOLS filters, schema validation without value echo, one audit event per call, static bearer verifier, identity resolver hook, /health, DNS-rebinding protection, rate limiting and fail-closed startup checks.
2026-10-14 16:13:11 +02:00
Latte 72462105f5 fix: keep the harness admin password out of the docker exec argv 2026-10-14 16:11:46 +02:00
Latte 517c675048 fix: harden setup against plain http, untrusted output and unsafe values
Require consent before sending the token over plain http to a non-loopback
host, strip control characters from server-supplied text, restrict env values
and tokens to printable ASCII, validate the URLs like other env values and
fsync the directory after the atomic replace.
2026-10-14 16:11:01 +02:00
Latte 6c9b2b74ca test: satisfy lint in catalog override test 2026-10-14 16:10:04 +02:00
Latte 6b11d29919 fix: annotate POST render endpoints read-only and irreversible POSTs destructive 2026-10-14 16:09:59 +02:00
Latte 156e963e21 fix: key slash encoding on route, redact more request secrets, bound JSON depth and uploads
Slash safety is decided per (path template, parameter) so single-segment
routes such as releases/tags/{tag} and editorconfig/{filepath} keep %2F.
Adds authorization_header, remote_password, mirror_password, mirror_token and
the AWS key fields to the redacted request fields. Deeply nested JSON from
Gitea is treated as text instead of raising RecursionError, and base64
uploads are capped before decoding.
2026-10-14 16:08:42 +02:00
Latte 1a039e32ab ci: single Gitea Actions pipeline, uv-based image, scoped docker cleanup
Replace lint/test/docker workflows with ci.yml (gitleaks, lint, test-unit, test-integration, test-mcp, build-and-push, docs-check, security). Rebuild the Dockerfile as a digest-pinned multi-stage uv build running as uid 1000, add .dockerignore, a hardened compose file and a gitleaks config. The integration harness now falls back to /etc/hostname and /proc/self to find its own container.
2026-10-14 15:59:19 +02:00
Latte 9e50859133 feat: add Gitea request executor with result envelope, pagination and redaction 2026-10-14 15:55:56 +02:00
Latte 041b3ea7ff feat: generate the tool catalog from the pinned swagger
Adds scripts/generate_catalog.py (with --check), the naming rules, schema conversion, the committed tools.json for all 537 operations and the load_catalog() loader.
2026-10-14 15:51:01 +02:00