sourcecode 1.16.0__tar.gz → 1.17.0__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.
Potentially problematic release.
This version of sourcecode might be problematic. Click here for more details.
- {sourcecode-1.16.0 → sourcecode-1.17.0}/PKG-INFO +3 -3
- {sourcecode-1.16.0 → sourcecode-1.17.0}/README.md +2 -2
- {sourcecode-1.16.0 → sourcecode-1.17.0}/pyproject.toml +1 -1
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/cli.py +32 -9
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/java.py +10 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/prepare_context.py +40 -4
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/serializer.py +23 -13
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.continue-here.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.gitignore +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/.ruff.toml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/CONTRIBUTING.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/LICENSE +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/SECURITY.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/docs/privacy.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/docs/schema.md +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/raw +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/run_cli.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/__init__.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/conftest.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_classifier.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_cli.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_python.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_packaging.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_real_projects.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_redactor.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_scanner.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_schema.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_summarizer.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_telemetry.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.16.0 → sourcecode-1.17.0}/tests/test_workspace_analyzer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.17.0
|
|
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
|
**Compressed AI-ready context for Java/Spring enterprise codebases.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -255,7 +255,7 @@ pipx install sourcecode
|
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
257
|
sourcecode version
|
|
258
|
-
# sourcecode 1.
|
|
258
|
+
# sourcecode 1.17.0
|
|
259
259
|
```
|
|
260
260
|
|
|
261
261
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Compressed AI-ready context for Java/Spring enterprise codebases.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -36,7 +36,7 @@ pipx install sourcecode
|
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
sourcecode version
|
|
39
|
-
# sourcecode 1.
|
|
39
|
+
# sourcecode 1.17.0
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
---
|
|
@@ -511,6 +511,11 @@ def main(
|
|
|
511
511
|
"--agent",
|
|
512
512
|
help="Structured noise-free JSON for AI agents: identity, entry points, dependencies, confidence, gaps.",
|
|
513
513
|
),
|
|
514
|
+
full: bool = typer.Option(
|
|
515
|
+
False,
|
|
516
|
+
"--full",
|
|
517
|
+
help="Remove truncation limits on transactional_boundaries, mybatis.dto_mappers, and other capped lists.",
|
|
518
|
+
),
|
|
514
519
|
trace_pipeline: bool = typer.Option(
|
|
515
520
|
False,
|
|
516
521
|
"--trace-pipeline",
|
|
@@ -1504,12 +1509,12 @@ def main(
|
|
|
1504
1509
|
else:
|
|
1505
1510
|
content = json.dumps(data, indent=2, ensure_ascii=False)
|
|
1506
1511
|
elif agent:
|
|
1507
|
-
data = agent_view(sm)
|
|
1512
|
+
data = agent_view(sm, full=full)
|
|
1508
1513
|
if not no_redact:
|
|
1509
1514
|
data = redact_dict(data)
|
|
1510
1515
|
content = json.dumps(data, indent=2, ensure_ascii=False)
|
|
1511
1516
|
elif compact:
|
|
1512
|
-
data = compact_view(sm, no_tree=no_tree)
|
|
1517
|
+
data = compact_view(sm, no_tree=no_tree, full=full)
|
|
1513
1518
|
if not no_redact:
|
|
1514
1519
|
data = redact_dict(data)
|
|
1515
1520
|
content = json.dumps(data, indent=2, ensure_ascii=False)
|
|
@@ -1607,6 +1612,17 @@ def prepare_context_cmd(
|
|
|
1607
1612
|
"-c",
|
|
1608
1613
|
help="Copy output to system clipboard after a successful run. No-op when clipboard is unavailable.",
|
|
1609
1614
|
),
|
|
1615
|
+
output_path: Optional[Path] = typer.Option(
|
|
1616
|
+
None,
|
|
1617
|
+
"--output",
|
|
1618
|
+
"-o",
|
|
1619
|
+
help="Write output to a file instead of stdout (UTF-8, avoids PowerShell BOM on Windows).",
|
|
1620
|
+
),
|
|
1621
|
+
symptom: Optional[str] = typer.Option(
|
|
1622
|
+
None,
|
|
1623
|
+
"--symptom",
|
|
1624
|
+
help="(fix-bug) Keyword hint for the bug: boosts matching files and surfaces related code notes.",
|
|
1625
|
+
),
|
|
1610
1626
|
) -> None:
|
|
1611
1627
|
"""Task-specific context for AI coding agents.
|
|
1612
1628
|
|
|
@@ -1673,7 +1689,7 @@ def prepare_context_cmd(
|
|
|
1673
1689
|
from dataclasses import asdict
|
|
1674
1690
|
|
|
1675
1691
|
builder = TaskContextBuilder(target)
|
|
1676
|
-
output = builder.build(task, since=since)
|
|
1692
|
+
output = builder.build(task, since=since, symptom=symptom)
|
|
1677
1693
|
|
|
1678
1694
|
# Task-specific content-filter: each task emphasizes different output fields.
|
|
1679
1695
|
# Fields marked False are suppressed from this task's output to reduce noise.
|
|
@@ -1757,16 +1773,23 @@ def prepare_context_cmd(
|
|
|
1757
1773
|
out["affected_entry_points"] = output.affected_entry_points
|
|
1758
1774
|
if output.limitations:
|
|
1759
1775
|
out["limitations"] = output.limitations
|
|
1776
|
+
if output.symptom:
|
|
1777
|
+
out["symptom"] = output.symptom
|
|
1778
|
+
if output.related_notes:
|
|
1779
|
+
out["related_notes"] = output.related_notes
|
|
1760
1780
|
if llm_prompt:
|
|
1761
1781
|
out["llm_prompt"] = builder.render_prompt(output)
|
|
1762
1782
|
|
|
1763
|
-
import sys as _sys
|
|
1764
1783
|
_pc_content = json.dumps(out, indent=2, ensure_ascii=False)
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
_sys
|
|
1769
|
-
|
|
1784
|
+
if output_path is not None:
|
|
1785
|
+
output_path.write_text(_pc_content, encoding="utf-8")
|
|
1786
|
+
else:
|
|
1787
|
+
import sys as _sys
|
|
1788
|
+
_pc_bytes = _pc_content.encode("utf-8")
|
|
1789
|
+
_sys.stdout.buffer.write(_pc_bytes)
|
|
1790
|
+
if not _pc_content.endswith("\n"):
|
|
1791
|
+
_sys.stdout.buffer.write(b"\n")
|
|
1792
|
+
_sys.stdout.buffer.flush()
|
|
1770
1793
|
|
|
1771
1794
|
if copy:
|
|
1772
1795
|
_trimmed = _pc_content.strip()
|
|
@@ -272,6 +272,16 @@ class JavaDetector(AbstractDetector):
|
|
|
272
272
|
frameworks.append(FrameworkDetection(name="Jakarta EE", source=source))
|
|
273
273
|
if "mybatis" in text:
|
|
274
274
|
frameworks.append(FrameworkDetection(name="MyBatis", source=source))
|
|
275
|
+
if "spring-boot-starter-security" in text or "spring-security-core" in text:
|
|
276
|
+
frameworks.append(FrameworkDetection(name="Spring Security", source=source))
|
|
277
|
+
if "spring-boot-starter-data-jpa" in text or "spring-data-jpa" in text:
|
|
278
|
+
frameworks.append(FrameworkDetection(name="Spring Data JPA", source=source))
|
|
279
|
+
if "spring-ldap-core" in text or "spring-security-ldap" in text:
|
|
280
|
+
frameworks.append(FrameworkDetection(name="Spring LDAP", source=source))
|
|
281
|
+
if "spring-aspects" in text or "spring-aop" in text:
|
|
282
|
+
frameworks.append(FrameworkDetection(name="Spring AOP", source=source))
|
|
283
|
+
if "spring-boot-starter-activemq" in text or "activemq-broker" in text or "activemq-client" in text:
|
|
284
|
+
frameworks.append(FrameworkDetection(name="ActiveMQ", source=source))
|
|
275
285
|
return frameworks
|
|
276
286
|
|
|
277
287
|
def _collect_entry_points(self, context: DetectionContext) -> list[EntryPoint]:
|
|
@@ -321,6 +321,8 @@ class TaskOutput:
|
|
|
321
321
|
why_these_files: dict[str, str] = field(default_factory=dict) # path → why relevant
|
|
322
322
|
changed_files: list[str] = field(default_factory=list) # delta task only
|
|
323
323
|
affected_entry_points: list[str] = field(default_factory=list) # delta task only
|
|
324
|
+
symptom: Optional[str] = None # fix-bug only
|
|
325
|
+
related_notes: list[dict] = field(default_factory=list) # fix-bug + symptom only
|
|
324
326
|
|
|
325
327
|
|
|
326
328
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -385,7 +387,7 @@ class TaskContextBuilder:
|
|
|
385
387
|
def __init__(self, root: Path) -> None:
|
|
386
388
|
self.root = root
|
|
387
389
|
|
|
388
|
-
def build(self, task_name: str, *, since: Optional[str] = None) -> TaskOutput:
|
|
390
|
+
def build(self, task_name: str, *, since: Optional[str] = None, symptom: Optional[str] = None) -> TaskOutput:
|
|
389
391
|
if task_name not in TASKS:
|
|
390
392
|
raise ValueError(
|
|
391
393
|
f"Unknown task '{task_name}'. Available: {', '.join(TASKS)}"
|
|
@@ -630,6 +632,32 @@ class TaskContextBuilder:
|
|
|
630
632
|
delta_files=_delta_files,
|
|
631
633
|
)
|
|
632
634
|
|
|
635
|
+
# ── 6b. Symptom keyword boost + related notes (fix-bug + --symptom) ──
|
|
636
|
+
symptom_keywords: list[str] = []
|
|
637
|
+
related_notes: list[dict] = []
|
|
638
|
+
if task_name == "fix-bug" and symptom:
|
|
639
|
+
import re as _re
|
|
640
|
+
symptom_keywords = [
|
|
641
|
+
w.lower() for w in _re.split(r"[\s\W]+", symptom)
|
|
642
|
+
if len(w) > 2
|
|
643
|
+
]
|
|
644
|
+
if symptom_keywords:
|
|
645
|
+
# Surface code notes whose text contains any keyword
|
|
646
|
+
for _n in cn_notes_for_ranking:
|
|
647
|
+
_text = (getattr(_n, "text", "") or "").lower()
|
|
648
|
+
if any(kw in _text for kw in symptom_keywords):
|
|
649
|
+
related_notes.append({
|
|
650
|
+
"kind": getattr(_n, "kind", ""),
|
|
651
|
+
"path": getattr(_n, "path", ""),
|
|
652
|
+
"line": getattr(_n, "line", None),
|
|
653
|
+
"text": getattr(_n, "text", ""),
|
|
654
|
+
})
|
|
655
|
+
# Re-rank relevant_files: boost files whose path matches keywords
|
|
656
|
+
def _symptom_score(rf: "RelevantFile") -> float:
|
|
657
|
+
path_lower = rf.path.lower()
|
|
658
|
+
return rf.score + 0.2 * sum(1.0 for kw in symptom_keywords if kw in path_lower)
|
|
659
|
+
relevant_files = sorted(relevant_files, key=lambda rf: -_symptom_score(rf))
|
|
660
|
+
|
|
633
661
|
# ── 7. Test gaps (generate-tests only) ────────────────────────────
|
|
634
662
|
test_gaps: list[str] = []
|
|
635
663
|
if task_name == "generate-tests":
|
|
@@ -708,6 +736,8 @@ class TaskContextBuilder:
|
|
|
708
736
|
why_these_files=why_these_files,
|
|
709
737
|
changed_files=changed_files,
|
|
710
738
|
affected_entry_points=affected_entry_points,
|
|
739
|
+
symptom=symptom if task_name == "fix-bug" and symptom else None,
|
|
740
|
+
related_notes=related_notes,
|
|
711
741
|
)
|
|
712
742
|
|
|
713
743
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -988,12 +1018,18 @@ class TaskContextBuilder:
|
|
|
988
1018
|
return Path(path).suffix.lower() in _SOURCE_EXTENSIONS
|
|
989
1019
|
|
|
990
1020
|
def _get_git_changed_files(self, since: Optional[str] = None) -> list[str]:
|
|
991
|
-
"""Get files changed since a git ref (default: HEAD~1) relative to root.
|
|
1021
|
+
"""Get files changed since a git ref (default: HEAD~1) relative to self.root.
|
|
1022
|
+
|
|
1023
|
+
Uses --relative so paths are relative to cwd (self.root), not the git repo
|
|
1024
|
+
root. This is critical for monorepos where self.root is a subpath of the
|
|
1025
|
+
git root and git diff would otherwise return prefixed paths that don't match
|
|
1026
|
+
the scanned file tree.
|
|
1027
|
+
"""
|
|
992
1028
|
import subprocess
|
|
993
1029
|
ref = since or "HEAD~1"
|
|
994
1030
|
try:
|
|
995
1031
|
result = subprocess.run(
|
|
996
|
-
["git", "diff", "--name-only", ref, "HEAD"],
|
|
1032
|
+
["git", "diff", "--name-only", "--relative", ref, "HEAD"],
|
|
997
1033
|
cwd=str(self.root),
|
|
998
1034
|
capture_output=True,
|
|
999
1035
|
text=True,
|
|
@@ -1011,7 +1047,7 @@ class TaskContextBuilder:
|
|
|
1011
1047
|
# Fallback: uncommitted changes
|
|
1012
1048
|
try:
|
|
1013
1049
|
result = subprocess.run(
|
|
1014
|
-
["git", "diff", "--name-only"],
|
|
1050
|
+
["git", "diff", "--name-only", "--relative"],
|
|
1015
1051
|
cwd=str(self.root),
|
|
1016
1052
|
capture_output=True,
|
|
1017
1053
|
text=True,
|
|
@@ -42,6 +42,14 @@ _MAX_DEFAULT_CONTRACTS = 20 # max contracts in default/standard contract output
|
|
|
42
42
|
_MAX_HARD_SIGNALS_DEFAULT = 20 # max hard_signals entries in default output
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
def _truncate_note(text: str, limit: int) -> str:
|
|
46
|
+
"""Truncate note text at word boundary, appending … when cut."""
|
|
47
|
+
if len(text) <= limit:
|
|
48
|
+
return text
|
|
49
|
+
cut = text[:limit].rsplit(" ", 1)[0]
|
|
50
|
+
return cut.rstrip(".,;") + "…"
|
|
51
|
+
|
|
52
|
+
|
|
45
53
|
def _cap_contracts_for_output(
|
|
46
54
|
contracts: list[Any],
|
|
47
55
|
max_count: int = _MAX_DEFAULT_CONTRACTS,
|
|
@@ -301,7 +309,7 @@ def _is_dto_mapper(path: str, root: Optional[Path] = None) -> bool:
|
|
|
301
309
|
return False
|
|
302
310
|
|
|
303
311
|
|
|
304
|
-
def _mybatis_pairing(sm: "SourceMap") -> "Optional[dict[str, Any]]":
|
|
312
|
+
def _mybatis_pairing(sm: "SourceMap", *, full: bool = False) -> "Optional[dict[str, Any]]":
|
|
305
313
|
"""Lightweight MyBatis mapper interface <-> XML file pairing from file_paths.
|
|
306
314
|
|
|
307
315
|
Separates genuine @Mapper interfaces (need XML) from DtoMapper bean-mapping
|
|
@@ -343,7 +351,11 @@ def _mybatis_pairing(sm: "SourceMap") -> "Optional[dict[str, Any]]":
|
|
|
343
351
|
if missing_xml:
|
|
344
352
|
result["missing_xml"] = missing_xml[:5]
|
|
345
353
|
if dto_mappers:
|
|
346
|
-
|
|
354
|
+
_total_dto = len(dto_mappers)
|
|
355
|
+
result["dto_mappers"] = dto_mappers if full else dto_mappers[:10]
|
|
356
|
+
result["dto_mappers_total"] = _total_dto
|
|
357
|
+
if _total_dto > 10 and not full:
|
|
358
|
+
result["dto_mappers_truncated"] = True
|
|
347
359
|
return result
|
|
348
360
|
|
|
349
361
|
|
|
@@ -398,14 +410,14 @@ def _spring_profiles_context(sm: "SourceMap") -> "Optional[dict[str, Any]]":
|
|
|
398
410
|
return result
|
|
399
411
|
|
|
400
412
|
|
|
401
|
-
def _transactional_summary(sm: "SourceMap") -> "Optional[dict[str, Any]]":
|
|
413
|
+
def _transactional_summary(sm: "SourceMap", *, full: bool = False) -> "Optional[dict[str, Any]]":
|
|
402
414
|
"""Surface @Transactional class boundaries from the Java stack detection."""
|
|
403
415
|
for s in sm.stacks:
|
|
404
416
|
classes = getattr(s, "transactional_classes", [])
|
|
405
417
|
if classes:
|
|
406
418
|
total = len(classes)
|
|
407
419
|
result: dict[str, Any] = {"count": total, "classes": classes}
|
|
408
|
-
if total > 10:
|
|
420
|
+
if total > 10 and not full:
|
|
409
421
|
result["classes"] = classes[:10]
|
|
410
422
|
result["truncated"] = True
|
|
411
423
|
result["note"] = f"showing 10 of {total}; use --full for complete list"
|
|
@@ -435,9 +447,7 @@ def _security_surface_from_eps(eps: list) -> "Optional[dict[str, Any]]":
|
|
|
435
447
|
"Values used in @M3FiltroSeguridad(nombreRecurso=VALUE) on REST controller "
|
|
436
448
|
"methods. Each value names a permission resource checked at runtime."
|
|
437
449
|
),
|
|
438
|
-
# resource_names kept for backward compatibility; resources is the canonical key
|
|
439
450
|
"resource_names": resource_names,
|
|
440
|
-
"resources": resource_names,
|
|
441
451
|
}
|
|
442
452
|
|
|
443
453
|
|
|
@@ -831,7 +841,7 @@ def _section_confidence(sm: SourceMap) -> dict[str, str]:
|
|
|
831
841
|
}
|
|
832
842
|
|
|
833
843
|
|
|
834
|
-
def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
|
|
844
|
+
def compact_view(sm: SourceMap, *, no_tree: bool = False, full: bool = False) -> dict[str, Any]:
|
|
835
845
|
"""Context package ready for prompt or handoff (~300-500 tokens).
|
|
836
846
|
|
|
837
847
|
Answers: what it is, where it enters, what depends on what,
|
|
@@ -914,7 +924,7 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
|
|
|
914
924
|
"kind": getattr(n, "kind", ""),
|
|
915
925
|
"path": getattr(n, "path", ""),
|
|
916
926
|
"line": getattr(n, "line", None),
|
|
917
|
-
**({"text": getattr(n, "text", "")
|
|
927
|
+
**({"text": _truncate_note(getattr(n, "text", ""), 120)} if getattr(n, "text", "") else {}),
|
|
918
928
|
}
|
|
919
929
|
for n in _sorted_notes[:_CODE_NOTES_CAP]
|
|
920
930
|
]
|
|
@@ -988,8 +998,8 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
|
|
|
988
998
|
_deployment["app_server_hint"] = _app_server
|
|
989
999
|
_deploy_risks = _project_deployment_risks(sm)
|
|
990
1000
|
_security_surface = _security_surface_from_eps(sm.entry_points)
|
|
991
|
-
_mybatis = _mybatis_pairing(sm)
|
|
992
|
-
_transactional = _transactional_summary(sm)
|
|
1001
|
+
_mybatis = _mybatis_pairing(sm, full=full)
|
|
1002
|
+
_transactional = _transactional_summary(sm, full=full)
|
|
993
1003
|
_git_ctx = _compact_git_context(sm)
|
|
994
1004
|
_spring_profiles = _spring_profiles_context(sm)
|
|
995
1005
|
|
|
@@ -1321,7 +1331,7 @@ def validate_cross_analyzer_consistency(
|
|
|
1321
1331
|
return findings
|
|
1322
1332
|
|
|
1323
1333
|
|
|
1324
|
-
def agent_view(sm: SourceMap) -> dict[str, Any]:
|
|
1334
|
+
def agent_view(sm: SourceMap, *, full: bool = False) -> dict[str, Any]:
|
|
1325
1335
|
"""Opinionated output for AI agents — structured, noise-free, gap-aware.
|
|
1326
1336
|
|
|
1327
1337
|
Output order:
|
|
@@ -1508,10 +1518,10 @@ def agent_view(sm: SourceMap) -> dict[str, Any]:
|
|
|
1508
1518
|
_sec_surf = _security_surface_from_eps(sm.entry_points)
|
|
1509
1519
|
if _sec_surf:
|
|
1510
1520
|
signals["security_surface"] = _sec_surf
|
|
1511
|
-
_mb = _mybatis_pairing(sm)
|
|
1521
|
+
_mb = _mybatis_pairing(sm, full=full)
|
|
1512
1522
|
if _mb:
|
|
1513
1523
|
signals["mybatis"] = _mb
|
|
1514
|
-
_txn = _transactional_summary(sm)
|
|
1524
|
+
_txn = _transactional_summary(sm, full=full)
|
|
1515
1525
|
if _txn:
|
|
1516
1526
|
signals["transactional_boundaries"] = _txn
|
|
1517
1527
|
|
{sourcecode-1.16.0 → sourcecode-1.17.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.16.0 → sourcecode-1.17.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.16.0 → sourcecode-1.17.0}/.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
|
|
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
|
{sourcecode-1.16.0 → sourcecode-1.17.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml
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
|
|
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
|