feat(gitea): IssueTracker client + inject into brain server (#52)
Implements the IssueTracker port as a real Gitea REST client (#49c) — the new outbound dependency the brain server gains for capture. - CreateIssue / CommentIssue / CloseIssue(+optional closing comment) over the Gitea API. Owner is the const "mathias", never caller-supplied, so a caller cannot redirect a write to another owner's repo. - Token read once at construction (BRAIN_GITEA_TOKEN), held in the struct, travels only in the Authorization header — never logged or in argv. Error messages carry status + truncated body, never the token (regression-tested). gitea.New returns nil when URL or token is unset, so missing config = tracker disabled via one nil check. - Injected into the MCP server behind the capture.IssueTracker interface via WithIssueTracker (constructor injection, swappable/testable); main wires it from BRAIN_GITEA_URL (default https://git.d-ma.be) + BRAIN_GITEA_TOKEN. Consumed by the capture use-case in #53. Tests use httptest transports: create (owner+auth header asserted), comment, close with/without comment, error path that proves the token never leaks into an error string. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/api"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/claudewatcher"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/embed"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/gitea"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/graphstore"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/graphsync"
|
||||
"github.com/mathiasbq/hyperguild/ingestion/internal/llm"
|
||||
@@ -175,6 +176,15 @@ func main() {
|
||||
logger.Info("brain reranker configured", "url", rerankURL, "model", rerankModel)
|
||||
}
|
||||
|
||||
// Gitea ticket tracker for the capture capability (#52). Token via env
|
||||
// only — never logged or in argv. Both vars must be set to enable it;
|
||||
// gitea.New returns nil otherwise, leaving ticket integration off.
|
||||
giteaURL := envOr("BRAIN_GITEA_URL", "https://git.d-ma.be")
|
||||
if tracker := gitea.New(giteaURL, os.Getenv("BRAIN_GITEA_TOKEN")); tracker != nil {
|
||||
mcpSrv = mcpSrv.WithIssueTracker(tracker)
|
||||
logger.Info("brain gitea tracker configured", "url", giteaURL)
|
||||
}
|
||||
|
||||
// Hybrid retrieval (pgvector + nomic-embed-text). Both env vars must
|
||||
// be set together for the path to wire on; otherwise BM25-only.
|
||||
var vectorStore *vectorstore.PGStore
|
||||
|
||||
Reference in New Issue
Block a user