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
84b361962e
docs: describe the per-run build tag and the push gate
2026-10-14 18:02:49 +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
8ff67f5859
docs: describe the write-ahead audit model and bring the contract files up to date
2026-10-14 18:01:55 +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
f86b9b529c
docs: record S2 results, mark findings fixed or waived, update the security model
2026-10-14 17:55:59 +02:00
Latte
d7cac91175
ci: raise the coverage gate to 90 percent; docs: reconcile OAuth docs with the implementation
2026-10-14 17:53:58 +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
5baf73f38b
docs: security threat model and review findings
2026-10-14 17:04:47 +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
566d0b65dd
feat: add per-user OAuth mode proxying sign-in to Gitea
...
Authorization server for MCP clients (SDK provider with dynamic client
registration, PKCE, refresh rotation and revocation) that signs users in
through Gitea and runs tool calls with the user's own Gitea token.
- consent page with CSRF protection and a browser-binding cookie on the
Gitea callback (confused-deputy protection for the shared Gitea app)
- encrypted token store (Fernet, HKDF-derived key, 0600, atomic writes,
symlink and corrupt-file refusal); our tokens stored only as hashes
- tokens bound to the MCP endpoint resource and the gitea scope; the
static bearer keeps working next to OAuth
- code replay and refresh token reuse revoke the grant
- automatic upstream refresh with per-session locking; invalid_grant
ends the session and never falls back to the admin token
- OAuth-only deployments (no GITEA_TOKEN, no bearer) may start
- rate limit on the OAuth endpoints, query strings dropped from access logs
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
cfbf1fb893
fix: keep the embedded env template in sync with .env.example
2026-10-14 16:25:37 +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
e139ae826f
docs: regenerate tool inventory after annotation overrides
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Failing after 35s
ci / lint (push) Successful in 47s
ci / test-mcp (push) Failing after 48s
ci / test-integration (push) Successful in 52s
ci / security (push) Failing after 29s
ci / test-unit (push) Successful in 1m57s
ci / build-and-push (push) Successful in 18s
2026-10-14 16:13:57 +02:00
Latte
7c7cfc05ff
docs: rewrite README and docs for the full-access design, generate tool inventory
2026-10-14 16:13:11 +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