sourcecode 1.5.0__tar.gz → 1.6.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.
- sourcecode-1.6.0/.continue-here.md +105 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/PKG-INFO +1 -1
- {sourcecode-1.5.0 → sourcecode-1.6.0}/pyproject.toml +1 -1
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/cli.py +0 -6
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/contract_pipeline.py +12 -2
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/java.py +40 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/serializer.py +4 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.gitignore +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/.ruff.toml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/CONTRIBUTING.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/LICENSE +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/README.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/SECURITY.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/docs/privacy.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/docs/schema.md +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/raw +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/run_cli.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/__init__.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/conftest.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_classifier.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_cli.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_python.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_packaging.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_real_projects.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_redactor.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_scanner.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_schema.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_summarizer.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_telemetry.py +0 -0
- {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Continue Here — sourcecode Java/Spring Enterprise Bug Fixes v1.5.x
|
|
2
|
+
**Created:** 2026-05-08
|
|
3
|
+
**Session context:** Ad-hoc benchmark-driven bug fixes (not a GSD phase execution)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What Was Done This Session
|
|
8
|
+
|
|
9
|
+
Applied 5 fixes targeting regressions in v1.5.0 benchmark report on saint-server (3681 .java, 460 *RestController*, 52 *Mapper.xml, Spring Boot 2.7.18 DDD+legacy layout).
|
|
10
|
+
|
|
11
|
+
### Root Causes Found and Fixed
|
|
12
|
+
|
|
13
|
+
| ID | File(s) | Root Cause | Fix |
|
|
14
|
+
|----|---------|-----------|-----|
|
|
15
|
+
| N1 | `detectors/java.py` | Scanner `depth >= max_depth=10` cuts `ddd/*/infraestructure/rest/` files silently. Path `src/main/java/com/m3/saint/ddd/domain/infraestructure/rest/` = 10 parts → excluded from file_tree → not in entry_points. | New `_augment_deep_java_controllers()`: direct `os.walk` of `src/main/java/` for `*Controller*.java` files not in file_tree |
|
|
16
|
+
| G3 | `contract_pipeline.py` | Mapper.xml score=0.3 (no `.xml` suffix boost) < Java score=0.4. 3000+ files compete for 2500-file cap — all 52 Mapper.xml cut. | `_is_priority()`: Mapper.xml gets same priority as entry_points in cap sort |
|
|
17
|
+
| T11 | `contract_pipeline.py` | Centrality sort key ignored `is_entrypoint`. REST controllers have low fan_in → ranked below JPA entities. | Added `-c.is_entrypoint` as primary key in centrality sort |
|
|
18
|
+
| P3-B | `cli.py` | Auto-switch to centrality when DDD architecture detected — actively hurt REST controller visibility. | Removed 5-line P3-B block |
|
|
19
|
+
| N2 | `serializer.py` | `hotspots` removed from top-level output in v1.5.0, only in `semantic_summary`. Breaking for consumers using `d["hotspots"]`. | Restore `result["hotspots"]` at top level when `semantic_summary.hotspots` exists |
|
|
20
|
+
|
|
21
|
+
### Modified Files (uncommitted — user requested no commits)
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
src/sourcecode/cli.py # P3-B removed (DDD auto-centrality switch)
|
|
25
|
+
src/sourcecode/contract_pipeline.py # G3: _is_priority() + T11: centrality sort key
|
|
26
|
+
src/sourcecode/detectors/java.py # N1: _augment_deep_java_controllers() method
|
|
27
|
+
src/sourcecode/serializer.py # N2: result["hotspots"] top-level restored
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Test Status
|
|
31
|
+
- 651 passed, 3 skipped (subset excluding pre-existing failures) — zero regressions
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## What Remains
|
|
36
|
+
|
|
37
|
+
### Not Fixed (deferred)
|
|
38
|
+
|
|
39
|
+
| ID | Description |
|
|
40
|
+
|----|-------------|
|
|
41
|
+
| M1 | `prepare-context` from monorepo root detects Angular instead of saint-server Java. Requires monorepo subproject routing in `prepare_context.py` → `TaskContextBuilder` / `RepoClassifier`. |
|
|
42
|
+
| M2 | `@M3FiltroSeguridad` custom security annotation not aggregated into security map |
|
|
43
|
+
| M3 | Spring profiles detected but not linked to `application-{profile}.yml` files |
|
|
44
|
+
|
|
45
|
+
### Verification Commands (run against saint-server after commit)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# N1: DDD controllers now captured (need --depth 12+ for tree, augment works at any depth)
|
|
49
|
+
sourcecode saint-server --depth 12 --entrypoints-only --format json | python -c "
|
|
50
|
+
import sys, json
|
|
51
|
+
d = json.load(sys.stdin)
|
|
52
|
+
rest = [x for x in d.get('contracts', []) if 'RestController' in x.get('path','')]
|
|
53
|
+
ddd = [x for x in rest if '/ddd/' in x['path'] or '/infraestructure/' in x['path']]
|
|
54
|
+
print(f'REST total: {len(rest)} | DDD: {len(ddd)}')"
|
|
55
|
+
|
|
56
|
+
# G3: MyBatis XML in contracts
|
|
57
|
+
sourcecode saint-server --depth 10 --format json | python -c "
|
|
58
|
+
import sys, json
|
|
59
|
+
d = json.load(sys.stdin)
|
|
60
|
+
xml = [x for x in d.get('contracts', []) if x.get('language') == 'mybatis-xml']
|
|
61
|
+
print(f'MyBatis contracts: {len(xml)}')"
|
|
62
|
+
|
|
63
|
+
# N2: hotspots at top level restored
|
|
64
|
+
sourcecode saint-server --semantics --format json | python -c "
|
|
65
|
+
import sys, json
|
|
66
|
+
d = json.load(sys.stdin)
|
|
67
|
+
print('top-level hotspots:', len(d.get('hotspots', [])))
|
|
68
|
+
print('semantic_summary.hotspots:', len(d.get('semantic_summary',{}).get('hotspots',[])))"
|
|
69
|
+
|
|
70
|
+
# T11: centrality now surfaces REST controllers
|
|
71
|
+
sourcecode saint-server --rank-by centrality --depth 10 --format json | python -c "
|
|
72
|
+
import sys, json
|
|
73
|
+
d = json.load(sys.stdin)
|
|
74
|
+
rest = [x for x in d.get('contracts', []) if 'RestController' in x.get('path','')]
|
|
75
|
+
print(f'REST in centrality: {len(rest)}')"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Note on N1 depth:** `_augment_deep_java_controllers` bypasses the scanner depth limit and always walks `src/main/java/` directly. DDD controllers will be detected as entry_points regardless of `--depth`. However, for these same files to appear in the general file_paths (not just entry_points), the scanner itself needs `--depth >= 11`.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Previous Session Fixes (already committed)
|
|
83
|
+
|
|
84
|
+
C1/C2/C3/G1/G2/G3 from v1.4.0→v1.5.0:
|
|
85
|
+
- `--mode standard` key `file_contracts` → `contracts`
|
|
86
|
+
- Controller-first scan, cap 500→1000
|
|
87
|
+
- DDD bounded contexts from package structure
|
|
88
|
+
- Maven BOM limitation warning
|
|
89
|
+
- MyBatis XML extractor (code existed but files were cut by cap — fixed in this session)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## GSD Project State (unchanged)
|
|
94
|
+
|
|
95
|
+
All 13 phases complete (see `.planning/STATE.md`). Both sessions were ad-hoc bug work from benchmark reports, not planned phase executions.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Resume Instructions
|
|
100
|
+
|
|
101
|
+
1. `git diff --stat` — verify 4 uncommitted files
|
|
102
|
+
2. `python -m pytest tests/ --ignore=tests/test_block2_coverage.py --ignore=tests/test_dependency_analyzer_node_python.py --ignore=tests/test_pipeline_integrity.py -q`
|
|
103
|
+
3. Commit the fixes
|
|
104
|
+
4. Run verification commands above against saint-server
|
|
105
|
+
5. If tackling M1, entry point is `prepare_context.py:TaskContextBuilder.build()` + `repo_classifier.py`
|
|
@@ -1399,12 +1399,6 @@ def main(
|
|
|
1399
1399
|
))
|
|
1400
1400
|
sm = _replace(sm, pipeline_trace=_trace.build_trace())
|
|
1401
1401
|
|
|
1402
|
-
# P3-B: Auto-switch to centrality ranking when DDD layout detected
|
|
1403
|
-
if (rank_by == "relevance"
|
|
1404
|
-
and sm.architecture is not None
|
|
1405
|
-
and sm.architecture.pattern == "ddd"):
|
|
1406
|
-
rank_by = "centrality"
|
|
1407
|
-
|
|
1408
1402
|
# Contract pipeline — runs for mode=contract|standard|deep|hybrid (skip for raw)
|
|
1409
1403
|
_is_contract_mode = mode in ("contract", "standard")
|
|
1410
1404
|
_pipeline_error = False
|
|
@@ -240,10 +240,18 @@ class ContractPipeline:
|
|
|
240
240
|
|
|
241
241
|
# Apply max_files cap — bypass when symbol search to ensure defining files are found.
|
|
242
242
|
# A symbol query over a large repo needs all files; result set is small after filtering.
|
|
243
|
+
# MyBatis Mapper.xml contracts rank below Java files on path score alone (.xml has no
|
|
244
|
+
# suffix boost). Give them the same priority slot as entry_points so they survive the cap.
|
|
245
|
+
def _is_priority(p: str) -> bool:
|
|
246
|
+
if p in entry_paths:
|
|
247
|
+
return True
|
|
248
|
+
name = p.rsplit("/", 1)[-1]
|
|
249
|
+
return name.lower().endswith("mapper.xml")
|
|
250
|
+
|
|
243
251
|
if symbol is None and len(src_paths) > self.max_files:
|
|
244
252
|
src_paths = sorted(
|
|
245
253
|
src_paths,
|
|
246
|
-
key=lambda p: (p
|
|
254
|
+
key=lambda p: (_is_priority(p), scorer.score(p)),
|
|
247
255
|
reverse=True,
|
|
248
256
|
)[:self.max_files]
|
|
249
257
|
|
|
@@ -362,7 +370,9 @@ class ContractPipeline:
|
|
|
362
370
|
|
|
363
371
|
def _rank(self, contracts: list[FileContract], rank_by: RankStrategy) -> list[FileContract]:
|
|
364
372
|
if rank_by == "centrality":
|
|
365
|
-
|
|
373
|
+
# Entrypoints (REST controllers, main classes) surface first even in centrality mode:
|
|
374
|
+
# they have low fan_in (not imported) but are the primary API surface.
|
|
375
|
+
return sorted(contracts, key=lambda c: (-c.is_entrypoint, -(c.fan_in + c.fan_out), c.path))
|
|
366
376
|
if rank_by == "git-churn":
|
|
367
377
|
return sorted(contracts, key=lambda c: (-c.is_changed, -c.relevance_score, c.path))
|
|
368
378
|
# Default: relevance — path breaks ties deterministically
|
|
@@ -225,6 +225,12 @@ class JavaDetector(AbstractDetector):
|
|
|
225
225
|
all_paths = flatten_file_tree(context.file_tree)
|
|
226
226
|
all_java = [p for p in all_paths if p.endswith(".java")]
|
|
227
227
|
|
|
228
|
+
# Augment with a direct scan of standard Java source roots for Controller-named
|
|
229
|
+
# files that the depth-limited file_tree scanner may have missed.
|
|
230
|
+
# DDD layouts place REST controllers at depth 10+ (e.g.
|
|
231
|
+
# src/main/java/com/org/app/ddd/domain/infraestructure/rest/XxxRestController.java).
|
|
232
|
+
self._augment_deep_java_controllers(context, all_java)
|
|
233
|
+
|
|
228
234
|
# 1. @SpringBootApplication entry: Application.java / Main.java by name
|
|
229
235
|
app_candidates = [
|
|
230
236
|
p for p in all_java
|
|
@@ -270,6 +276,40 @@ class JavaDetector(AbstractDetector):
|
|
|
270
276
|
unique_eps.append(ep)
|
|
271
277
|
return unique_eps
|
|
272
278
|
|
|
279
|
+
def _augment_deep_java_controllers(self, context: DetectionContext, all_java: list[str]) -> None:
|
|
280
|
+
"""Scan standard Java source roots for *Controller*.java files not in all_java.
|
|
281
|
+
|
|
282
|
+
The depth-limited file_tree scanner misses files at depth >= max_depth.
|
|
283
|
+
DDD layouts place REST controllers deep (e.g. depth 10+), so we supplement
|
|
284
|
+
with a direct filesystem walk scoped to the standard Maven/Gradle source root.
|
|
285
|
+
"""
|
|
286
|
+
import os as _os
|
|
287
|
+
existing = set(all_java)
|
|
288
|
+
# Standard Java source root candidates (Maven first, then Gradle/other)
|
|
289
|
+
_SRC_ROOTS = ("src/main/java", "src/main/kotlin", "src/java", "src")
|
|
290
|
+
for src_root_name in _SRC_ROOTS:
|
|
291
|
+
src_root = context.root / src_root_name
|
|
292
|
+
if not src_root.is_dir():
|
|
293
|
+
continue
|
|
294
|
+
try:
|
|
295
|
+
for dirpath, _dirs, filenames in _os.walk(str(src_root)):
|
|
296
|
+
for fname in filenames:
|
|
297
|
+
if "Controller" not in fname or not fname.endswith(".java"):
|
|
298
|
+
continue
|
|
299
|
+
full = Path(dirpath) / fname
|
|
300
|
+
if full.is_symlink():
|
|
301
|
+
continue
|
|
302
|
+
try:
|
|
303
|
+
rel = str(full.relative_to(context.root)).replace("\\", "/")
|
|
304
|
+
if rel not in existing:
|
|
305
|
+
all_java.append(rel)
|
|
306
|
+
existing.add(rel)
|
|
307
|
+
except ValueError:
|
|
308
|
+
pass
|
|
309
|
+
except OSError:
|
|
310
|
+
pass
|
|
311
|
+
return # use only first matching source root
|
|
312
|
+
|
|
273
313
|
def _scan_java_file_for_entry_points(self, abs_path: Path, rel_path: str) -> list[EntryPoint]:
|
|
274
314
|
try:
|
|
275
315
|
if abs_path.stat().st_size > _MAX_FILE_SIZE:
|
|
@@ -1110,6 +1110,10 @@ def standard_view(sm: SourceMap, *, include_tree: bool = False) -> dict[str, Any
|
|
|
1110
1110
|
|
|
1111
1111
|
if sm.semantic_summary is not None and sm.semantic_summary.requested:
|
|
1112
1112
|
result["semantic_summary"] = asdict(sm.semantic_summary)
|
|
1113
|
+
# Backward compat: also emit hotspots at top level (moved to semantic_summary in v1.5.0).
|
|
1114
|
+
# Consumers reading d["hotspots"] directly still work.
|
|
1115
|
+
if sm.semantic_summary.hotspots:
|
|
1116
|
+
result["hotspots"] = sm.semantic_summary.hotspots[:10]
|
|
1113
1117
|
# Defensive filter: never emit objects with null required fields.
|
|
1114
1118
|
# A null entry in these arrays is worse than a shorter array — it causes
|
|
1115
1119
|
# agents to misinterpret the analysis as valid when it is not.
|
{sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.5.0 → sourcecode-1.6.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
|
{sourcecode-1.5.0 → sourcecode-1.6.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
|