From 9709692db832de2ad40f365bda165cc2dc7ff95c Mon Sep 17 00:00:00 2001 From: tegwick Date: Fri, 15 May 2026 01:47:59 +0200 Subject: [PATCH] Use repo-scoping scope context endpoint --- .../context_resolvers/repo_scoping.py | 4 +- tests/test_repo_scoping_context_resolver.py | 66 +++++++++++++++++++ workplans/custodian-WP-0003-event-bridge.md | 2 +- ...-0003c-event-bridge-context-integration.md | 2 +- 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 tests/test_repo_scoping_context_resolver.py diff --git a/src/activity_core/context_resolvers/repo_scoping.py b/src/activity_core/context_resolvers/repo_scoping.py index 9e23635..8958b08 100644 --- a/src/activity_core/context_resolvers/repo_scoping.py +++ b/src/activity_core/context_resolvers/repo_scoping.py @@ -2,7 +2,7 @@ Registered as source type 'repo-scoping'. Supported queries: - - repo_profile: GET {REPO_SCOPING_URL}/repos/{repo_slug}/scope + - repo_profile: GET {REPO_SCOPING_URL}/repos/{repo_slug}/scope/context 5-minute in-process cache keyed by (query, repo_slug). Cache is per-worker- process; not shared across Temporal workers. @@ -36,7 +36,7 @@ class RepoScopingContextResolver(ContextResolver): ts, val = _CACHE[cache_key] if now - ts < _CACHE_TTL: return val - url = f"{_REPO_SCOPING_URL.rstrip('/')}/repos/{repo_slug}/scope" + url = f"{_REPO_SCOPING_URL.rstrip('/')}/repos/{repo_slug}/scope/context" resp = httpx.get(url, timeout=10.0) resp.raise_for_status() result: dict[str, Any] = resp.json() diff --git a/tests/test_repo_scoping_context_resolver.py b/tests/test_repo_scoping_context_resolver.py new file mode 100644 index 0000000..449822f --- /dev/null +++ b/tests/test_repo_scoping_context_resolver.py @@ -0,0 +1,66 @@ +from activity_core.context_resolvers import repo_scoping + + +class Response: + def __init__(self, body): + self.body = body + + def raise_for_status(self): + return None + + def json(self): + return self.body + + +def test_repo_scoping_context_resolver_calls_scope_context_endpoint(monkeypatch): + calls = [] + body = { + "repo_slug": "repo-scoping", + "capabilities": ["Generate SCOPE.md"], + "tags": ["api", "scope"], + "scope_md_exists": True, + "scope_summary": "Maps repositories into reviewable context.", + } + + def fake_get(url, timeout): + calls.append((url, timeout)) + return Response(body) + + repo_scoping._CACHE.clear() + monkeypatch.setattr(repo_scoping, "_REPO_SCOPING_URL", "http://repo-scoping.local/") + monkeypatch.setattr(repo_scoping.httpx, "get", fake_get) + + resolver = repo_scoping.RepoScopingContextResolver() + result = resolver.resolve( + "repo_profile", + None, + {"repo_slug": "repo-scoping"}, + ) + + assert result == body + assert calls == [ + ( + "http://repo-scoping.local/repos/repo-scoping/scope/context", + 10.0, + ) + ] + + cached = resolver.resolve( + "repo_profile", + None, + {"repo_slug": "repo-scoping"}, + ) + + assert cached == body + assert len(calls) == 1 + + +def test_repo_scoping_context_resolver_ignores_unknown_queries(monkeypatch): + repo_scoping._CACHE.clear() + monkeypatch.setattr( + repo_scoping.httpx, + "get", + lambda *args, **kwargs: (_ for _ in ()).throw(AssertionError("unexpected HTTP")), + ) + + assert repo_scoping.RepoScopingContextResolver().resolve("unknown", None, {}) == {} diff --git a/workplans/custodian-WP-0003-event-bridge.md b/workplans/custodian-WP-0003-event-bridge.md index 67e4b27..b0d6e8c 100644 --- a/workplans/custodian-WP-0003-event-bridge.md +++ b/workplans/custodian-WP-0003-event-bridge.md @@ -601,7 +601,7 @@ to `context[source.bind_to]`. A resolver that raises logs a warning and binds Registered as source type `repo-scoping`. Supported queries: -- `repo_profile`: `GET {REPO_SCOPING_URL}/repos/{params['repo_slug']}/scope` +- `repo_profile`: `GET {REPO_SCOPING_URL}/repos/{params['repo_slug']}/scope/context` Returns dict with `capabilities`, `tags`, `scope_summary`, `scope_md_exists`. 5-minute in-process cache keyed by `(query, repo_slug)`. Cache is per-worker- diff --git a/workplans/custodian-WP-0003c-event-bridge-context-integration.md b/workplans/custodian-WP-0003c-event-bridge-context-integration.md index f5ccb5e..650a7d7 100644 --- a/workplans/custodian-WP-0003c-event-bridge-context-integration.md +++ b/workplans/custodian-WP-0003c-event-bridge-context-integration.md @@ -123,7 +123,7 @@ to `context[source.bind_to]`. A resolver that raises logs a warning and binds Registered as source type `repo-scoping`. Supported queries: -- `repo_profile`: `GET {REPO_SCOPING_URL}/repos/{params['repo_slug']}/scope` +- `repo_profile`: `GET {REPO_SCOPING_URL}/repos/{params['repo_slug']}/scope/context` Returns dict with `capabilities`, `tags`, `scope_summary`, `scope_md_exists`. 5-minute in-process cache keyed by `(query, repo_slug)`. Cache is per-worker-