Skip to content

Commit e916062

Browse files
committed
Enhance CLI and API functionality with improved namespace handling and context retrieval
1 parent a3b164b commit e916062

5 files changed

Lines changed: 236 additions & 49 deletions

File tree

cmd/ccg/main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,19 @@ func main() {
6161
}
6262

6363
deps.ServeFunc = func(cfg cli.ServeConfig) error {
64+
repoRoot := os.Getenv("CCG_REPO_ROOT")
65+
if repoRoot == "" {
66+
// @domainRule local stdio MCP uses the launch working directory as the analysis boundary when no repo root is configured.
67+
if wd, err := os.Getwd(); err == nil {
68+
repoRoot = wd
69+
}
70+
}
6471
return mcpruntime.RunStdio(rt, mcpruntime.Options{
6572
CacheTTL: cfg.CacheTTL,
6673
NoCache: cfg.NoCache,
6774
OTELEndpoint: cfg.OTELEndpoint,
6875
NamespaceRoot: cfg.NamespaceRoot,
76+
RepoRoot: repoRoot,
6977
MaxFileBytes: cfg.MaxFileBytes,
7078
MaxTotalParsedBytes: cfg.MaxTotalParsedBytes,
7179
ServiceVersion: version,

internal/mcp/handler_docs.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ func (h *handlers) searchDocs(ctx context.Context, request mcp.CallToolRequest)
269269
if err != nil {
270270
return finalizeToolResult("", newToolResultErr(err.Error()))
271271
}
272-
namespace := requestNamespace(request)
273-
ctx = h.applyNamespace(ctx, request)
272+
namespace := resolveNamespace(ctx, requestNamespace(request))
273+
ctx = ctxns.WithNamespace(ctx, namespace)
274274
if h.deps.DB == nil {
275275
return mcp.NewToolResultError("DB is not configured"), nil
276276
}
@@ -373,8 +373,8 @@ func (h *handlers) retrieveDocs(ctx context.Context, request mcp.CallToolRequest
373373
}
374374
explain := request.GetBool("explain", false)
375375

376-
namespace := requestNamespace(request)
377-
ctx = h.applyNamespace(ctx, request)
376+
namespace := resolveNamespace(ctx, requestNamespace(request))
377+
ctx = ctxns.WithNamespace(ctx, namespace)
378378
if h.deps.DB == nil {
379379
return mcp.NewToolResultError("DB is not configured"), nil
380380
}

internal/mcp/handler_docs_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,29 @@ func TestSearchDocs_DBFallbackIsNamespaceIsolated(t *testing.T) {
587587
}
588588
}
589589

590+
func TestSearchDocs_DBFallbackDomainRuleUsesContextNamespace(t *testing.T) {
591+
deps := setupTestDeps(t)
592+
tmpDir := t.TempDir()
593+
deps.NamespaceRoot = filepath.Join(tmpDir, "namespaces")
594+
deps.RagIndexDir = filepath.Join(tmpDir, ".ccg")
595+
alpha := "alpha-service"
596+
beta := "beta-service"
597+
seedRetrieveDocsDBFallbackNode(t, deps, alpha, "alpha.Guard", "Guard", "guard.go", model.TagDomainRule, "breakglass alpha approval", "breakglass alpha approval")
598+
seedRetrieveDocsDBFallbackNode(t, deps, beta, "beta.Guard", "Guard", "guard.go", model.TagDomainRule, "breakglass beta approval", "breakglass beta approval")
599+
rebuildRetrieveDocsSearchBackend(t, deps, alpha)
600+
rebuildRetrieveDocsSearchBackend(t, deps, beta)
601+
602+
result := callToolWithNamespace(t, deps, alpha, "search_docs", map[string]any{"query": "breakglass", "limit": float64(5)})
603+
if result.IsError {
604+
t.Fatalf("search_docs context namespace DB fallback error: %v", getTextContent(result))
605+
}
606+
607+
results := decodeSearchDocsResults(t, result)
608+
if len(results) != 1 || results[0].Summary != "breakglass alpha approval" {
609+
t.Fatalf("expected only alpha domainRule result, got %#v", results)
610+
}
611+
}
612+
590613
func TestSearchDocs_DBFallbackAnnotationOnlyMatch(t *testing.T) {
591614
deps := setupTestDeps(t)
592615
tmpDir := t.TempDir()

0 commit comments

Comments
 (0)