sourcecode 1.30.9__tar.gz → 1.30.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sourcecode-1.30.9 → sourcecode-1.30.11}/PKG-INFO +3 -3
- {sourcecode-1.30.9 → sourcecode-1.30.11}/README.md +2 -2
- {sourcecode-1.30.9 → sourcecode-1.30.11}/pyproject.toml +1 -1
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/cli.py +2 -3
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/prepare_context.py +129 -113
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_v1_10_regressions.py +2 -2
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.continue-here.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.gitignore +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/.ruff.toml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/CONTRIBUTING.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/LICENSE +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/SECURITY.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/docs/privacy.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/docs/schema.md +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/raw +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/run_cli.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/flow_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/__init__.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/conftest.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_classifier.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_cli.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_python.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_packaging.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_real_projects.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_redactor.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_scanner.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_schema.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_summarizer.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_telemetry.py +0 -0
- {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_workspace_analyzer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.30.
|
|
3
|
+
Version: 1.30.11
|
|
4
4
|
Summary: Deterministic codebase context for AI coding agents
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -221,7 +221,7 @@ Description-Content-Type: text/markdown
|
|
|
221
221
|
|
|
222
222
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -257,7 +257,7 @@ pipx install sourcecode
|
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
259
|
sourcecode version
|
|
260
|
-
# sourcecode 1.30.
|
|
260
|
+
# sourcecode 1.30.11
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -38,7 +38,7 @@ pipx install sourcecode
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
sourcecode version
|
|
41
|
-
# sourcecode 1.30.
|
|
41
|
+
# sourcecode 1.30.11
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
---
|
|
@@ -1400,9 +1400,8 @@ def main(
|
|
|
1400
1400
|
if _gc_early and not (_bad_gc & set(_gc_early.limitations)):
|
|
1401
1401
|
_uc = _gc_early.uncommitted_changes
|
|
1402
1402
|
if _uc:
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
)
|
|
1403
|
+
# WORKTREE_UNSTAGED + WORKTREE_STAGED only; untracked excluded
|
|
1404
|
+
_allowed_changed_files = set(_uc.staged) | set(_uc.unstaged)
|
|
1406
1405
|
if not _allowed_changed_files:
|
|
1407
1406
|
typer.echo(
|
|
1408
1407
|
"[changed-only] git unavailable or no uncommitted changes — falling back to full scan.",
|
|
@@ -14,10 +14,19 @@ Each task produces a focused context bundle:
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
16
|
from dataclasses import dataclass, field
|
|
17
|
+
from enum import Enum
|
|
17
18
|
from pathlib import Path
|
|
18
19
|
from typing import Any, Optional
|
|
19
20
|
|
|
20
21
|
|
|
22
|
+
class DiffSourceType(str, Enum):
|
|
23
|
+
"""Explicit diff scope — never auto-merged, never implicit."""
|
|
24
|
+
WORKTREE_UNSTAGED = "WORKTREE_UNSTAGED" # git diff (no ref)
|
|
25
|
+
WORKTREE_STAGED = "WORKTREE_STAGED" # git diff --cached
|
|
26
|
+
GIT_SINCE_REF = "GIT_SINCE_REF" # git diff ref HEAD
|
|
27
|
+
GIT_RANGE = "GIT_RANGE" # git diff refA refB
|
|
28
|
+
|
|
29
|
+
|
|
21
30
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
22
31
|
# Prompt templates
|
|
23
32
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -360,6 +369,11 @@ class TaskOutput:
|
|
|
360
369
|
# honest output schema (review-pr only): runtime vs build split
|
|
361
370
|
runtime_changes: list[dict] = field(default_factory=list)
|
|
362
371
|
build_changes: dict = field(default_factory=dict)
|
|
372
|
+
# review-pr: committed vs uncommitted — never merged
|
|
373
|
+
committed_changes: list[dict] = field(default_factory=list)
|
|
374
|
+
uncommitted_changes: list[dict] = field(default_factory=list)
|
|
375
|
+
# transparency: explicit diff scope for every command
|
|
376
|
+
analysis_scope: dict = field(default_factory=dict)
|
|
363
377
|
|
|
364
378
|
|
|
365
379
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -406,7 +420,10 @@ def _java_why(path: str, file_class: "Optional[object]") -> str:
|
|
|
406
420
|
if category == "data_access":
|
|
407
421
|
return f"SQL queries for {domain} data access" if domain else "Data access layer"
|
|
408
422
|
if category == "domain_model":
|
|
409
|
-
|
|
423
|
+
ev = _read_persistence_evidence(Path(path).parent.parent, path)
|
|
424
|
+
if ev:
|
|
425
|
+
return f"JPA entity for {class_name} persistence"
|
|
426
|
+
return f"Domain model — {class_name} (no persistence annotation detected)"
|
|
410
427
|
if category == "configuration":
|
|
411
428
|
return getattr(file_class, "reason", "Spring configuration class")
|
|
412
429
|
if category == "security":
|
|
@@ -590,7 +607,8 @@ class TaskContextBuilder:
|
|
|
590
607
|
scope_source="full_scan_fallback",
|
|
591
608
|
repo_root=str(self.root),
|
|
592
609
|
)
|
|
593
|
-
_raw_scope, _pr_scope_source =
|
|
610
|
+
_raw_scope, _pr_scope_source, _pr_committed_files, _pr_uncommitted_files = \
|
|
611
|
+
self._get_pr_scope_files(since=since)
|
|
594
612
|
if _raw_scope is None:
|
|
595
613
|
# Explicit --since ref is invalid
|
|
596
614
|
_avail_pr, _sug_pr = self._get_available_refs(since or "")
|
|
@@ -957,6 +975,10 @@ class TaskContextBuilder:
|
|
|
957
975
|
_pr_base_ref: Optional[str] = None
|
|
958
976
|
_pr_runtime_changes: list[dict] = []
|
|
959
977
|
_pr_build_changes: dict = {}
|
|
978
|
+
_pr_committed_changes: list[dict] = []
|
|
979
|
+
_pr_uncommitted_changes: list[dict] = []
|
|
980
|
+
_pr_committed_files: list[str] = []
|
|
981
|
+
_pr_uncommitted_files: list[str] = []
|
|
960
982
|
|
|
961
983
|
if task_name == "review-pr":
|
|
962
984
|
_pr_base_ref = since or "HEAD"
|
|
@@ -1038,9 +1060,14 @@ class TaskContextBuilder:
|
|
|
1038
1060
|
_seen_order.add(_f)
|
|
1039
1061
|
|
|
1040
1062
|
# Build runtime_changes and build_changes — honest split, no score numbers
|
|
1063
|
+
# Also track committed vs uncommitted — NEVER merged
|
|
1041
1064
|
_pr_runtime_changes: list[dict] = []
|
|
1065
|
+
_pr_committed_changes: list[dict] = []
|
|
1066
|
+
_pr_uncommitted_changes: list[dict] = []
|
|
1042
1067
|
_pr_build_changes: dict = {}
|
|
1043
1068
|
_build_artifact_files: list[str] = []
|
|
1069
|
+
_committed_set: set[str] = set(_pr_committed_files) if task_name == "review-pr" else set()
|
|
1070
|
+
_uncommitted_set: set[str] = set(_pr_uncommitted_files) if task_name == "review-pr" else set()
|
|
1044
1071
|
|
|
1045
1072
|
_SCORE_TO_CONFIDENCE = {
|
|
1046
1073
|
"high": lambda s: s >= 0.60,
|
|
@@ -1106,8 +1133,14 @@ class TaskContextBuilder:
|
|
|
1106
1133
|
# File confidence: replaces numeric score
|
|
1107
1134
|
_impact_s = _delta_impact_score_per_file.get(_f, 0.45)
|
|
1108
1135
|
_f_conf = "high" if _impact_s >= 0.60 else ("medium" if _impact_s >= 0.40 else "low")
|
|
1109
|
-
|
|
1136
|
+
_diff_source = (
|
|
1137
|
+
DiffSourceType.GIT_RANGE.value if _f in _committed_set
|
|
1138
|
+
else DiffSourceType.WORKTREE_UNSTAGED.value if _f in _uncommitted_set
|
|
1139
|
+
else "unknown"
|
|
1140
|
+
)
|
|
1141
|
+
_entry = {
|
|
1110
1142
|
"path": _f,
|
|
1143
|
+
"diff_source": _diff_source,
|
|
1111
1144
|
"role": _role_obj,
|
|
1112
1145
|
"confidence": _f_conf,
|
|
1113
1146
|
"artifact_type": _f_atype,
|
|
@@ -1117,7 +1150,13 @@ class TaskContextBuilder:
|
|
|
1117
1150
|
"truth_level": "inferred",
|
|
1118
1151
|
"confidence": _role_obj["confidence"],
|
|
1119
1152
|
},
|
|
1120
|
-
}
|
|
1153
|
+
}
|
|
1154
|
+
_pr_runtime_changes.append(_entry)
|
|
1155
|
+
# Split committed vs uncommitted — never merged
|
|
1156
|
+
if _f in _committed_set:
|
|
1157
|
+
_pr_committed_changes.append(_entry)
|
|
1158
|
+
elif _f in _uncommitted_set:
|
|
1159
|
+
_pr_uncommitted_changes.append(_entry)
|
|
1121
1160
|
|
|
1122
1161
|
if _build_artifact_files:
|
|
1123
1162
|
_pr_build_changes = {
|
|
@@ -1383,6 +1422,25 @@ class TaskContextBuilder:
|
|
|
1383
1422
|
# honest output schema: runtime vs build split (review-pr only)
|
|
1384
1423
|
runtime_changes=_pr_runtime_changes,
|
|
1385
1424
|
build_changes=_pr_build_changes,
|
|
1425
|
+
# committed vs uncommitted — never merged
|
|
1426
|
+
committed_changes=_pr_committed_changes,
|
|
1427
|
+
uncommitted_changes=_pr_uncommitted_changes,
|
|
1428
|
+
# transparency: explicit diff scope
|
|
1429
|
+
analysis_scope={
|
|
1430
|
+
"sources_used": _pr_scope_source.split(",") if task_name == "review-pr" and _pr_scope_source else (
|
|
1431
|
+
[DiffSourceType.GIT_SINCE_REF.value] if task_name == "delta" and since else
|
|
1432
|
+
[DiffSourceType.WORKTREE_UNSTAGED.value] if task_name == "delta" else
|
|
1433
|
+
[]
|
|
1434
|
+
),
|
|
1435
|
+
"git_equivalent_command": (
|
|
1436
|
+
f"git diff --name-only {since} HEAD" if since else
|
|
1437
|
+
"git diff --name-only"
|
|
1438
|
+
) if task_name in ("delta", "review-pr") else None,
|
|
1439
|
+
"includes_uncommitted": bool(
|
|
1440
|
+
(task_name == "review-pr" and _pr_uncommitted_files) or
|
|
1441
|
+
(task_name == "delta" and not since)
|
|
1442
|
+
),
|
|
1443
|
+
} if task_name in ("delta", "review-pr") else {},
|
|
1386
1444
|
)
|
|
1387
1445
|
|
|
1388
1446
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -1690,12 +1748,19 @@ class TaskContextBuilder:
|
|
|
1690
1748
|
pass
|
|
1691
1749
|
return None
|
|
1692
1750
|
|
|
1693
|
-
def _get_pr_scope_files(
|
|
1694
|
-
|
|
1751
|
+
def _get_pr_scope_files(
|
|
1752
|
+
self, since: Optional[str] = None
|
|
1753
|
+
) -> "tuple[Optional[list[str]], str, list[str], list[str]]":
|
|
1754
|
+
"""Return (all_files, scope_source, committed_files, uncommitted_files).
|
|
1695
1755
|
|
|
1696
|
-
|
|
1697
|
-
Returns (
|
|
1698
|
-
|
|
1756
|
+
Scopes are NEVER mixed — committed and uncommitted tracked separately.
|
|
1757
|
+
Returns (None, _, _, _) only when since is explicitly provided but invalid.
|
|
1758
|
+
Returns ([], _, [], []) when git is available but no changes found.
|
|
1759
|
+
|
|
1760
|
+
DiffSourceType mapping:
|
|
1761
|
+
since given → committed: GIT_RANGE(since, HEAD)
|
|
1762
|
+
no since → committed: [] (no implicit HEAD~1 fallback)
|
|
1763
|
+
always → uncommitted: WORKTREE_UNSTAGED + WORKTREE_STAGED
|
|
1699
1764
|
"""
|
|
1700
1765
|
import subprocess
|
|
1701
1766
|
|
|
@@ -1713,55 +1778,44 @@ class TaskContextBuilder:
|
|
|
1713
1778
|
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
1714
1779
|
return None
|
|
1715
1780
|
|
|
1716
|
-
|
|
1781
|
+
committed_files: list[str] = []
|
|
1782
|
+
uncommitted_files: list[str] = []
|
|
1717
1783
|
sources: list[str] = []
|
|
1718
1784
|
|
|
1785
|
+
# ── Committed scope (GIT_RANGE) — only when explicit ref given ──────
|
|
1719
1786
|
if since is not None:
|
|
1720
1787
|
committed = _run("git", "diff", "--name-only", "--relative", since, "HEAD")
|
|
1721
1788
|
if committed is None:
|
|
1722
|
-
return None, "git_diff" # invalid ref — hard error
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
sources.append(
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
if
|
|
1751
|
-
|
|
1752
|
-
if line.startswith("??") and len(line) > 3:
|
|
1753
|
-
f = line[3:].strip()
|
|
1754
|
-
if f and not f.endswith("/") and f not in files:
|
|
1755
|
-
files.add(f)
|
|
1756
|
-
if "untracked" not in sources:
|
|
1757
|
-
sources.append("untracked")
|
|
1758
|
-
|
|
1759
|
-
# Drop paths outside self.root (../… prefix means above cwd — occurs when
|
|
1760
|
-
# self.root is a subdirectory of the git repo and git status shows repo-level files).
|
|
1761
|
-
files = {f for f in files if not f.startswith("../") and not f.startswith("..\\")}
|
|
1762
|
-
|
|
1763
|
-
scope_source = ",".join(sources) if sources else "git_diff"
|
|
1764
|
-
return sorted(files), scope_source
|
|
1789
|
+
return None, "git_diff", [], [] # invalid ref — hard error
|
|
1790
|
+
committed_files = committed
|
|
1791
|
+
if committed_files:
|
|
1792
|
+
sources.append(DiffSourceType.GIT_RANGE.value)
|
|
1793
|
+
|
|
1794
|
+
# ── Uncommitted scope — ALWAYS separate, never implicit ──────────────
|
|
1795
|
+
# WORKTREE_UNSTAGED: modified but not staged
|
|
1796
|
+
unstaged = _run("git", "diff", "--name-only", "--relative")
|
|
1797
|
+
if unstaged:
|
|
1798
|
+
uncommitted_files.extend(f for f in unstaged if f not in uncommitted_files)
|
|
1799
|
+
if DiffSourceType.WORKTREE_UNSTAGED.value not in sources:
|
|
1800
|
+
sources.append(DiffSourceType.WORKTREE_UNSTAGED.value)
|
|
1801
|
+
|
|
1802
|
+
# WORKTREE_STAGED: staged, not yet committed
|
|
1803
|
+
staged = _run("git", "diff", "--name-only", "--cached", "--relative")
|
|
1804
|
+
if staged:
|
|
1805
|
+
uncommitted_files.extend(f for f in staged if f not in uncommitted_files)
|
|
1806
|
+
if DiffSourceType.WORKTREE_STAGED.value not in sources:
|
|
1807
|
+
sources.append(DiffSourceType.WORKTREE_STAGED.value)
|
|
1808
|
+
|
|
1809
|
+
# ── Drop paths outside self.root ──────────────────────────────────────
|
|
1810
|
+
def _drop_outside(lst: list[str]) -> list[str]:
|
|
1811
|
+
return [f for f in lst if not f.startswith("../") and not f.startswith("..\\")]
|
|
1812
|
+
|
|
1813
|
+
committed_files = _drop_outside(committed_files)
|
|
1814
|
+
uncommitted_files = _drop_outside(uncommitted_files)
|
|
1815
|
+
|
|
1816
|
+
all_files_set: set[str] = set(committed_files) | set(uncommitted_files)
|
|
1817
|
+
scope_source = ",".join(sources) if sources else "no_changes"
|
|
1818
|
+
return sorted(all_files_set), scope_source, committed_files, uncommitted_files
|
|
1765
1819
|
|
|
1766
1820
|
def _expand_scope_for_analysis(self, scope_files: list[str]) -> list[str]:
|
|
1767
1821
|
"""Add sibling files in the same directories as scope_files (depth=1 expansion).
|
|
@@ -1949,44 +2003,9 @@ class TaskContextBuilder:
|
|
|
1949
2003
|
if suffix in _CODE_EXTS and any(kw in stem_lower for kw in _DTO_KW):
|
|
1950
2004
|
return {"artifact_type": "dto", "risk_areas": [], "impact_level": "low", "is_noise": False, "module": module, "confidence": "high"}
|
|
1951
2005
|
|
|
1952
|
-
#
|
|
1953
|
-
#
|
|
1954
|
-
_FOLDER_TYPE_MAP: dict[str, tuple[str, list[str], str]] = {
|
|
1955
|
-
"controller": ("controller", ["api"], "high"),
|
|
1956
|
-
"controllers": ("controller", ["api"], "high"),
|
|
1957
|
-
"api": ("controller", ["api"], "high"),
|
|
1958
|
-
"web": ("controller", ["api"], "high"),
|
|
1959
|
-
"rest": ("controller", ["api"], "high"),
|
|
1960
|
-
"resource": ("controller", ["api"], "high"),
|
|
1961
|
-
"resources": ("controller", ["api"], "high"),
|
|
1962
|
-
"service": ("service", ["transactions", "business_logic"],"high"),
|
|
1963
|
-
"services": ("service", ["transactions", "business_logic"],"high"),
|
|
1964
|
-
"business": ("service", ["transactions", "business_logic"],"high"),
|
|
1965
|
-
"usecase": ("service", ["business_logic"], "high"),
|
|
1966
|
-
"usecases": ("service", ["business_logic"], "high"),
|
|
1967
|
-
"repository": ("repository", ["persistence"], "high"),
|
|
1968
|
-
"repositories": ("repository", ["persistence"], "high"),
|
|
1969
|
-
"dao": ("repository", ["persistence"], "high"),
|
|
1970
|
-
"persistence": ("repository", ["persistence"], "high"),
|
|
1971
|
-
"mapper": ("mapper", ["persistence"], "high"),
|
|
1972
|
-
"mappers": ("mapper", ["persistence"], "high"),
|
|
1973
|
-
"security": ("security", ["security"], "high"),
|
|
1974
|
-
"auth": ("security", ["security"], "high"),
|
|
1975
|
-
"config": ("config", ["config"], "medium"),
|
|
1976
|
-
"configuration": ("config", ["config"], "medium"),
|
|
1977
|
-
"configs": ("config", ["config"], "medium"),
|
|
1978
|
-
"domain": ("domain_model", ["persistence"], "medium"),
|
|
1979
|
-
"model": ("domain_model", ["persistence"], "medium"),
|
|
1980
|
-
"models": ("domain_model", ["persistence"], "medium"),
|
|
1981
|
-
"entity": ("domain_model", ["persistence"], "medium"),
|
|
1982
|
-
"entities": ("domain_model", ["persistence"], "medium"),
|
|
1983
|
-
}
|
|
2006
|
+
# No stem hint matched — path/folder components are NOT valid evidence.
|
|
2007
|
+
# Fall through to unclassified source (extension-only, low confidence).
|
|
1984
2008
|
if suffix in _CODE_EXTS:
|
|
1985
|
-
for part in reversed(path_dir_parts): # innermost directory first
|
|
1986
|
-
if part in _FOLDER_TYPE_MAP:
|
|
1987
|
-
atype, risk_areas, impact_level = _FOLDER_TYPE_MAP[part]
|
|
1988
|
-
return {"artifact_type": atype, "risk_areas": risk_areas, "impact_level": impact_level, "is_noise": False, "module": module, "confidence": "medium"}
|
|
1989
|
-
# No stem or folder hint matched — last-resort source type (extension-only classification)
|
|
1990
2009
|
return {"artifact_type": "source", "risk_areas": [], "impact_level": "medium", "is_noise": False, "module": module, "confidence": "low"}
|
|
1991
2010
|
|
|
1992
2011
|
# Generic config / data files — fold into config type
|
|
@@ -2957,10 +2976,26 @@ class TaskContextBuilder:
|
|
|
2957
2976
|
the scanned file tree.
|
|
2958
2977
|
"""
|
|
2959
2978
|
import subprocess
|
|
2960
|
-
|
|
2979
|
+
|
|
2980
|
+
if since is None:
|
|
2981
|
+
# No implicit HEAD~1 fallback — map to WORKTREE_UNSTAGED
|
|
2982
|
+
try:
|
|
2983
|
+
result = subprocess.run(
|
|
2984
|
+
["git", "diff", "--name-only", "--relative"],
|
|
2985
|
+
cwd=str(self.root),
|
|
2986
|
+
capture_output=True, text=True,
|
|
2987
|
+
encoding="utf-8", errors="replace", timeout=10,
|
|
2988
|
+
)
|
|
2989
|
+
if result.returncode == 0:
|
|
2990
|
+
return [ln.strip() for ln in (result.stdout or "").splitlines() if ln.strip()]
|
|
2991
|
+
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
2992
|
+
pass
|
|
2993
|
+
return []
|
|
2994
|
+
|
|
2995
|
+
# Explicit since: GIT_SINCE_REF — committed range only, no silent fallback
|
|
2961
2996
|
try:
|
|
2962
2997
|
result = subprocess.run(
|
|
2963
|
-
["git", "diff", "--name-only", "--relative",
|
|
2998
|
+
["git", "diff", "--name-only", "--relative", since, "HEAD"],
|
|
2964
2999
|
cwd=str(self.root),
|
|
2965
3000
|
capture_output=True,
|
|
2966
3001
|
text=True,
|
|
@@ -2973,28 +3008,9 @@ class TaskContextBuilder:
|
|
|
2973
3008
|
line.strip() for line in (result.stdout or "").splitlines()
|
|
2974
3009
|
if line.strip()
|
|
2975
3010
|
]
|
|
2976
|
-
#
|
|
2977
|
-
if since:
|
|
2978
|
-
return None
|
|
3011
|
+
return None # ref doesn't exist — caller must fail fast
|
|
2979
3012
|
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
2980
|
-
|
|
2981
|
-
return None
|
|
2982
|
-
# No explicit since: fall back to uncommitted changes
|
|
2983
|
-
try:
|
|
2984
|
-
result = subprocess.run(
|
|
2985
|
-
["git", "diff", "--name-only", "--relative"],
|
|
2986
|
-
cwd=str(self.root),
|
|
2987
|
-
capture_output=True,
|
|
2988
|
-
text=True,
|
|
2989
|
-
encoding="utf-8",
|
|
2990
|
-
errors="replace",
|
|
2991
|
-
timeout=10,
|
|
2992
|
-
)
|
|
2993
|
-
if result.returncode == 0:
|
|
2994
|
-
return [line.strip() for line in (result.stdout or "").splitlines() if line.strip()]
|
|
2995
|
-
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
2996
|
-
pass
|
|
2997
|
-
return []
|
|
3013
|
+
return None
|
|
2998
3014
|
|
|
2999
3015
|
def _get_available_refs(self, invalid_ref: str) -> tuple[list[str], Optional[str]]:
|
|
3000
3016
|
"""Return (available_branch_names, suggested_alternative) for error hints."""
|
|
@@ -556,7 +556,7 @@ class TestReviewPrSuspectedAreas:
|
|
|
556
556
|
from pathlib import Path as _Path
|
|
557
557
|
from sourcecode import prepare_context as _pc
|
|
558
558
|
monkeypatch.setattr(_pc.TaskContextBuilder, "_resolve_git_root", lambda self: _Path(str(FIXTURE)))
|
|
559
|
-
monkeypatch.setattr(_pc.TaskContextBuilder, "_get_pr_scope_files", lambda self, since=None: ([], "git_diff"))
|
|
559
|
+
monkeypatch.setattr(_pc.TaskContextBuilder, "_get_pr_scope_files", lambda self, since=None: ([], "git_diff", [], []))
|
|
560
560
|
result = _invoke("prepare-context", "review-pr", str(FIXTURE))
|
|
561
561
|
assert result.exit_code == 1
|
|
562
562
|
data = _json(result)
|
|
@@ -571,7 +571,7 @@ class TestReviewPrSuspectedAreas:
|
|
|
571
571
|
monkeypatch.setattr(_pc.TaskContextBuilder, "_resolve_git_root", lambda self: _Path(str(FIXTURE)))
|
|
572
572
|
monkeypatch.setattr(
|
|
573
573
|
_pc.TaskContextBuilder, "_get_pr_scope_files",
|
|
574
|
-
lambda self, since=None: (_changed, "git_diff"),
|
|
574
|
+
lambda self, since=None: (_changed, "git_diff", _changed, []),
|
|
575
575
|
)
|
|
576
576
|
result = _invoke("prepare-context", "review-pr", str(FIXTURE))
|
|
577
577
|
assert result.exit_code == 0, result.output
|
{sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|