Finalize repo-scoping runtime rename

This commit is contained in:
2026-05-15 21:16:34 +02:00
parent 084159e51c
commit 28fad1b248
62 changed files with 445 additions and 305 deletions

View File

@@ -1,7 +1,7 @@
from repo_registry.acceptance import AgenticReviewDecision
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.acceptance import AgenticReviewDecision
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
class BoundaryApprovingReviewer:

View File

@@ -1,12 +1,12 @@
import pytest
from repo_registry.acceptance import (
from repo_scoping.acceptance import (
AgenticReviewDecision,
validate_agentic_review_decision,
)
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
class RecordingAgenticReviewer:

View File

@@ -1,5 +1,5 @@
from repo_registry.candidate_graph.generator import CandidateGraphGenerator
from repo_registry.core.models import ContentChunk, ObservedFact, Repository
from repo_scoping.candidate_graph.generator import CandidateGraphGenerator
from repo_scoping.core.models import ContentChunk, ObservedFact, Repository
def fact(id, kind, name, path="", value="", metadata=None):
@@ -533,7 +533,7 @@ def test_candidate_generator_does_not_promote_owned_provider_vocabulary_to_capab
3,
"llm_provider",
"OpenRouter",
"src/repo_registry/repo_scanning/scanner.py",
"src/repo_scoping/repo_scanning/scanner.py",
"openrouter",
{"source_role": "implementation_source", "utility_relationship": "owned"},
),
@@ -541,7 +541,7 @@ def test_candidate_generator_does_not_promote_owned_provider_vocabulary_to_capab
4,
"provider_registry",
"LLM provider registry",
"src/repo_registry/repo_scanning/scanner.py",
"src/repo_scoping/repo_scanning/scanner.py",
metadata={
"source_role": "implementation_source",
"utility_relationship": "owned",
@@ -551,7 +551,7 @@ def test_candidate_generator_does_not_promote_owned_provider_vocabulary_to_capab
5,
"credential_config",
"OpenRouter API key",
"src/repo_registry/repo_scanning/scanner.py",
"src/repo_scoping/repo_scanning/scanner.py",
"OPENROUTER_API_KEY",
{"source_role": "implementation_source", "utility_relationship": "configure"},
),
@@ -619,7 +619,7 @@ def test_candidate_generator_recovers_repo_scoping_native_candidate_families():
17,
"interface",
"python route decorator",
"src/repo_registry/web_api/app.py",
"src/repo_scoping/web_api/app.py",
'@app.post("/repos")',
),
]

View File

@@ -1,10 +1,10 @@
from repo_registry.candidate_graph.generator import (
from repo_scoping.candidate_graph.generator import (
CandidateAbilityDraft,
CandidateCapabilityDraft,
CandidateFeatureDraft,
)
from repo_registry.candidate_graph.normalization import normalize_candidate_drafts
from repo_registry.core.models import SourceReference
from repo_scoping.candidate_graph.normalization import normalize_candidate_drafts
from repo_scoping.core.models import SourceReference
def ref(fact_id, path):

View File

@@ -2,10 +2,10 @@ import json
import pytest
from repo_registry.cli import main
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.cli import main
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
def make_service(tmp_path):

View File

@@ -1,5 +1,5 @@
from repo_registry.content_indexing.extractor import ContentExtractor
from repo_registry.core.models import ObservedFact
from repo_scoping.content_indexing.extractor import ContentExtractor
from repo_scoping.core.models import ObservedFact
def fact(id, kind, name, path="", line=None, source_role=""):

View File

@@ -1,6 +1,6 @@
import subprocess
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_scoping.repo_ingestion.git import GitIngestionService
def run(command, cwd):

View File

@@ -1,6 +1,6 @@
from datetime import date
from repo_registry.intent.bootstrap import bootstrap_intent_from_scope, scope_to_intent_text
from repo_scoping.intent.bootstrap import bootstrap_intent_from_scope, scope_to_intent_text
def test_scope_to_intent_text_replaces_scope_heading_and_marks_bootstrap():

View File

@@ -1,7 +1,7 @@
import pytest
from repo_registry.core.models import ContentChunk, Repository
from repo_registry.llm_extraction import (
from repo_scoping.core.models import ContentChunk, Repository
from repo_scoping.llm_extraction import (
LLMCandidateExtractor,
LLMExtractionError,
create_llm_connect_adapter,

View File

@@ -1,5 +1,5 @@
from repo_registry.core.models import ContentChunk, ObservedFact
from repo_registry.llm_extraction import (
from repo_scoping.core.models import ContentChunk, ObservedFact
from repo_scoping.llm_extraction import (
ExtractedAbility,
ExtractedCapability,
ExtractedEvidence,

View File

@@ -1,4 +1,4 @@
from repo_registry.acceptance import (
from repo_scoping.acceptance import (
active_quality_criteria_version,
criteria_registry_markdown,
load_quality_criteria,

View File

@@ -1,10 +1,10 @@
from repo_registry.acceptance import (
from repo_scoping.acceptance import (
blocking_quality_gate_outcomes,
evaluate_candidate_capability_quality,
evaluate_candidate_graph_quality,
quality_gate_outcome_dicts,
)
from repo_registry.core.models import (
from repo_scoping.core.models import (
AnalysisRun,
CandidateAbility,
CandidateCapability,
@@ -13,9 +13,9 @@ from repo_registry.core.models import (
Repository,
SourceReference,
)
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
def source_ref(path="src/app.py", kind="source"):

View File

@@ -2,17 +2,17 @@ import json
import logging
import subprocess
from repo_registry.core.logging import LOGGER_NAME
from repo_registry.core.models import SourceReference
from repo_registry.core.service import RegistryService
from repo_registry.llm_extraction import (
from repo_scoping.core.logging import LOGGER_NAME
from repo_scoping.core.models import SourceReference
from repo_scoping.core.service import RegistryService
from repo_scoping.llm_extraction import (
ExtractedAbility,
ExtractedCapability,
ExtractedFeature,
)
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.semantic import HashingEmbeddingProvider
from repo_registry.storage.sqlite import NotFoundError, RegistryStore
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.semantic import HashingEmbeddingProvider
from repo_scoping.storage.sqlite import NotFoundError, RegistryStore
from tests.fixtures import (
write_dependency_only_repo,
write_empty_repo,

View File

@@ -1,7 +1,21 @@
from repo_registry.repo_ingestion.metadata import RepositoryMetadataExtractor
from repo_scoping.repo_ingestion.metadata import RepositoryMetadataExtractor
def test_metadata_prefers_pyproject(tmp_path):
def test_metadata_prefers_source_identity_over_pyproject(tmp_path):
repo = tmp_path / "repo-scoping"
repo.mkdir()
(repo / "pyproject.toml").write_text(
'[project]\nname = "repo-registry"\ndescription = "Repository Scoping."\n',
encoding="utf-8",
)
metadata = RepositoryMetadataExtractor().extract(repo, str(repo))
assert metadata.name == "repo-scoping"
assert metadata.description == "Repository Scoping."
def test_metadata_uses_pyproject_when_source_name_is_generic(tmp_path):
repo = tmp_path / "repo"
repo.mkdir()
(repo / "pyproject.toml").write_text(
@@ -15,7 +29,7 @@ def test_metadata_prefers_pyproject(tmp_path):
assert metadata.description == "Extract invoice data."
def test_metadata_uses_package_json(tmp_path):
def test_metadata_uses_package_json_when_source_name_is_generic(tmp_path):
repo = tmp_path / "repo"
repo.mkdir()
(repo / "package.json").write_text(
@@ -29,8 +43,8 @@ def test_metadata_uses_package_json(tmp_path):
assert metadata.description == "Browse repository abilities."
def test_metadata_falls_back_to_readme_title(tmp_path):
repo = tmp_path / "repo-name"
def test_metadata_uses_readme_title_when_source_name_is_generic(tmp_path):
repo = tmp_path / "repository"
repo.mkdir()
(repo / "README.md").write_text(
"# Useful Registry\n\nExtra details follow.\n",
@@ -41,3 +55,19 @@ def test_metadata_falls_back_to_readme_title(tmp_path):
assert metadata.name == "Useful Registry"
assert metadata.description == "Extra details follow."
def test_metadata_strips_git_suffix_from_url_identity(tmp_path):
repo = tmp_path / "checkout"
repo.mkdir()
(repo / "pyproject.toml").write_text(
'[project]\nname = "old-package-name"\n',
encoding="utf-8",
)
metadata = RepositoryMetadataExtractor().extract(
repo,
"https://example.test/acme/repo-scoping.git",
)
assert metadata.name == "repo-scoping"

View File

@@ -1,4 +1,4 @@
from repo_registry.repo_scanning.scanner import DeterministicScanner
from repo_scoping.repo_scanning.scanner import DeterministicScanner
from tests.fixtures import (
write_javascript_typescript_package_repo,
write_misleading_docs_repo,

View File

@@ -1,9 +1,9 @@
import json
from pathlib import Path
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
def test_llm_connect_provider_expectations_are_detected_without_llm(tmp_path):

View File

@@ -3,7 +3,7 @@ from pathlib import Path
from fastapi.testclient import TestClient
from repo_registry.web_api.app import Settings, app, get_settings
from repo_scoping.web_api.app import Settings, app, get_settings
def override_settings(tmp_path):

View File

@@ -1,8 +1,8 @@
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.scope.generator import SCOPE_SECTIONS, ScopeGenerator
from repo_registry.scope.validator import ScopeValidator
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.scope.generator import SCOPE_SECTIONS, ScopeGenerator
from repo_scoping.scope.validator import ScopeValidator
from repo_scoping.storage.sqlite import RegistryStore
def make_service(tmp_path):
@@ -15,7 +15,7 @@ def test_scope_generator_renders_canonical_sections_and_capability_blocks(tmp_pa
service = make_service(tmp_path)
repository = service.register_repository(
name="Repo Registry",
url="https://example.test/coulomb/repo-registry.git",
url="https://example.test/coulomb/repo-scoping.git",
description="Generates repository scope files from approved characteristics.",
)
service.update_scope(
@@ -46,10 +46,10 @@ def test_scope_generator_renders_canonical_sections_and_capability_blocks(tmp_pa
type="business-usecase",
primary_class="business-usecase",
attributes=["scope", "preview"],
location="src/repo_registry/scope/generator.py",
location="src/repo_scoping/scope/generator.py",
)
content = ScopeGenerator(service).generate("repo-registry")
content = ScopeGenerator(service).generate("repo-scoping")
assert content.startswith("# SCOPE\n")
for section in SCOPE_SECTIONS:
@@ -57,7 +57,7 @@ def test_scope_generator_renders_canonical_sections_and_capability_blocks(tmp_pa
assert "Generates and validates SCOPE.md files" in content
assert "Maintain Repository Scope" in content
assert "Preview generated SCOPE.md" in content
assert "src/repo_registry/scope/generator.py" in content
assert "src/repo_scoping/scope/generator.py" in content
assert "```capability" in content
assert "type: api" in content
assert "title: Generate SCOPE.md" in content

View File

@@ -1,7 +1,7 @@
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.self_scoping.assessment import export_assessment_artifact
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.self_scoping.assessment import export_assessment_artifact
from repo_scoping.storage.sqlite import RegistryStore
def make_service(tmp_path):

View File

@@ -1,6 +1,6 @@
from pathlib import Path
from repo_registry.self_scoping.comparison import (
from repo_scoping.self_scoping.comparison import (
compare_assessment_to_golden,
comparison_markdown,
load_json,

View File

@@ -2,7 +2,7 @@ import json
import pytest
from repo_registry.self_scoping.review_store import (
from repo_scoping.self_scoping.review_store import (
list_assessment_artifacts,
list_golden_profiles,
load_json_artifact,

View File

@@ -2,7 +2,7 @@ import json
from fastapi.testclient import TestClient
from repo_registry.web_api.app import app
from repo_scoping.web_api.app import app
def write_json(path, payload):
@@ -47,7 +47,7 @@ def seed_review_artifacts(root):
{
"name": "HTTP API surface",
"type": "API",
"location": "src/repo_registry/web_api/app.py",
"location": "src/repo_scoping/web_api/app.py",
}
],
}
@@ -76,7 +76,7 @@ def seed_review_artifacts(root):
{
"name": "HTTP API surface",
"type": "API",
"location": "src/repo_registry/web_api/app.py",
"location": "src/repo_scoping/web_api/app.py",
}
],
}
@@ -92,7 +92,7 @@ def seed_review_artifacts(root):
def test_self_scoping_ui_compares_and_records_outcome(tmp_path, monkeypatch):
root = tmp_path / "self-scoping"
seed_review_artifacts(root)
monkeypatch.setenv("REPO_REGISTRY_SELF_SCOPING_ROOT", str(root))
monkeypatch.setenv("REPO_SCOPING_SELF_SCOPING_ROOT", str(root))
client = TestClient(app)
index = client.get("/ui/self-scoping")
@@ -126,7 +126,7 @@ def test_self_scoping_ui_compares_and_records_outcome(tmp_path, monkeypatch):
def test_self_scoping_ui_compares_two_assessment_runs(tmp_path, monkeypatch):
root = tmp_path / "self-scoping"
seed_review_artifacts(root)
monkeypatch.setenv("REPO_REGISTRY_SELF_SCOPING_ROOT", str(root))
monkeypatch.setenv("REPO_SCOPING_SELF_SCOPING_ROOT", str(root))
client = TestClient(app)
review = client.get(

View File

@@ -1,8 +1,8 @@
import sqlite3
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
def make_service(tmp_path):

View File

@@ -1,6 +1,6 @@
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
def make_service(tmp_path):

View File

@@ -3,11 +3,11 @@ import sqlite3
from fastapi.testclient import TestClient
from repo_registry.core.service import RegistryService
from repo_registry.repo_ingestion.git import GitIngestionService
from repo_registry.storage.sqlite import RegistryStore
from repo_registry.web_api import app as app_module
from repo_registry.web_api.app import Settings, app, get_service, get_settings
from repo_scoping.core.service import RegistryService
from repo_scoping.repo_ingestion.git import GitIngestionService
from repo_scoping.storage.sqlite import RegistryStore
from repo_scoping.web_api import app as app_module
from repo_scoping.web_api.app import Settings, app, get_service, get_settings
def add_candidate_capability(database_path, repository_id, analysis_run_id, name):
@@ -1063,12 +1063,12 @@ def test_api_service_settings_can_enable_hashing_embedding_provider(tmp_path):
def test_settings_can_load_from_environment(monkeypatch):
monkeypatch.setenv("REPO_REGISTRY_DATABASE_PATH", "var/env.sqlite3")
monkeypatch.setenv("REPO_REGISTRY_CHECKOUT_ROOT", "var/env-checkouts")
monkeypatch.setenv("REPO_REGISTRY_LLM_PROVIDER", "mock")
monkeypatch.setenv("REPO_REGISTRY_LLM_MODEL", "demo-model")
monkeypatch.setenv("REPO_REGISTRY_EMBEDDING_PROVIDER", "hashing")
monkeypatch.setenv("REPO_REGISTRY_LOG_LEVEL", "DEBUG")
monkeypatch.setenv("REPO_SCOPING_DATABASE_PATH", "var/env.sqlite3")
monkeypatch.setenv("REPO_SCOPING_CHECKOUT_ROOT", "var/env-checkouts")
monkeypatch.setenv("REPO_SCOPING_LLM_PROVIDER", "mock")
monkeypatch.setenv("REPO_SCOPING_LLM_MODEL", "demo-model")
monkeypatch.setenv("REPO_SCOPING_EMBEDDING_PROVIDER", "hashing")
monkeypatch.setenv("REPO_SCOPING_LOG_LEVEL", "DEBUG")
settings = Settings()
@@ -2696,7 +2696,7 @@ def test_ui_manual_registry_entry_loop(tmp_path):
delete_repository_response = client.post(
f"{repository_path}/delete",
data={"confirm_name": "Manual Repo"},
data={"confirm_name": "manual-repo"},
follow_redirects=False,
)
assert delete_repository_response.status_code == 303