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.
Files changed (178) hide show
  1. sourcecode-1.6.0/.continue-here.md +105 -0
  2. {sourcecode-1.5.0 → sourcecode-1.6.0}/PKG-INFO +1 -1
  3. {sourcecode-1.5.0 → sourcecode-1.6.0}/pyproject.toml +1 -1
  4. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/cli.py +0 -6
  6. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/contract_pipeline.py +12 -2
  7. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/java.py +40 -0
  8. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/serializer.py +4 -0
  9. {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  10. {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  11. {sourcecode-1.5.0 → sourcecode-1.6.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  12. {sourcecode-1.5.0 → sourcecode-1.6.0}/.github/workflows/build-windows.yml +0 -0
  13. {sourcecode-1.5.0 → sourcecode-1.6.0}/.gitignore +0 -0
  14. {sourcecode-1.5.0 → sourcecode-1.6.0}/.ruff.toml +0 -0
  15. {sourcecode-1.5.0 → sourcecode-1.6.0}/CONTRIBUTING.md +0 -0
  16. {sourcecode-1.5.0 → sourcecode-1.6.0}/LICENSE +0 -0
  17. {sourcecode-1.5.0 → sourcecode-1.6.0}/README.md +0 -0
  18. {sourcecode-1.5.0 → sourcecode-1.6.0}/SECURITY.md +0 -0
  19. {sourcecode-1.5.0 → sourcecode-1.6.0}/docs/privacy.md +0 -0
  20. {sourcecode-1.5.0 → sourcecode-1.6.0}/docs/schema.md +0 -0
  21. {sourcecode-1.5.0 → sourcecode-1.6.0}/raw +0 -0
  22. {sourcecode-1.5.0 → sourcecode-1.6.0}/run_cli.py +0 -0
  23. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/adaptive_scanner.py +0 -0
  24. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/architecture_analyzer.py +0 -0
  25. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/architecture_summary.py +0 -0
  26. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/ast_extractor.py +0 -0
  27. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/classifier.py +0 -0
  28. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  29. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/confidence_analyzer.py +0 -0
  30. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/context_scorer.py +0 -0
  31. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/context_summarizer.py +0 -0
  32. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/contract_model.py +0 -0
  33. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/coverage_parser.py +0 -0
  34. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/dependency_analyzer.py +0 -0
  35. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/__init__.py +0 -0
  36. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/base.py +0 -0
  37. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  38. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/dart.py +0 -0
  39. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/dotnet.py +0 -0
  40. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/elixir.py +0 -0
  41. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/go.py +0 -0
  42. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/heuristic.py +0 -0
  43. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/hybrid.py +0 -0
  44. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  45. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/nodejs.py +0 -0
  46. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/parsers.py +0 -0
  47. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/php.py +0 -0
  48. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/project.py +0 -0
  49. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/python.py +0 -0
  50. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/ruby.py +0 -0
  51. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/rust.py +0 -0
  52. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/systems.py +0 -0
  53. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/terraform.py +0 -0
  54. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/detectors/tooling.py +0 -0
  55. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/doc_analyzer.py +0 -0
  56. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  57. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/env_analyzer.py +0 -0
  58. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/file_classifier.py +0 -0
  59. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/git_analyzer.py +0 -0
  60. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/graph_analyzer.py +0 -0
  61. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/metrics_analyzer.py +0 -0
  62. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/prepare_context.py +0 -0
  63. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/ranking_engine.py +0 -0
  64. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/redactor.py +0 -0
  65. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/relevance_scorer.py +0 -0
  66. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/repo_classifier.py +0 -0
  67. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/runtime_classifier.py +0 -0
  68. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/scanner.py +0 -0
  69. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/schema.py +0 -0
  70. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/semantic_analyzer.py +0 -0
  71. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/summarizer.py +0 -0
  72. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/__init__.py +0 -0
  73. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/config.py +0 -0
  74. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/consent.py +0 -0
  75. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/events.py +0 -0
  76. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/filters.py +0 -0
  77. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/telemetry/transport.py +0 -0
  78. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/tree_utils.py +0 -0
  79. {sourcecode-1.5.0 → sourcecode-1.6.0}/src/sourcecode/workspace.py +0 -0
  80. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/__init__.py +0 -0
  81. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/conftest.py +0 -0
  82. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/coverage.xml +0 -0
  83. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  84. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  85. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  86. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/go_service/go.mod +0 -0
  87. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/jacoco.xml +0 -0
  88. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/lcov.info +0 -0
  89. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  90. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/package.json +0 -0
  91. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  92. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  93. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  94. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  95. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  96. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  97. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  114. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  115. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  116. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  117. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  118. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  119. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  120. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  121. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_architecture_analyzer.py +0 -0
  122. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_architecture_summary.py +0 -0
  123. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_ast_extractor.py +0 -0
  124. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block1_reliability.py +0 -0
  125. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block2_coverage.py +0 -0
  126. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_block5_quality.py +0 -0
  127. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_classifier.py +0 -0
  128. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_cli.py +0 -0
  129. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_code_notes_analyzer.py +0 -0
  130. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_context_scorer.py +0 -0
  131. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_contract_pipeline.py +0 -0
  132. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_coverage_parser.py +0 -0
  133. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_cross_consistency.py +0 -0
  134. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  135. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  136. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_dependency_schema.py +0 -0
  137. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_dotnet.py +0 -0
  138. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_go_rust_java.py +0 -0
  139. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_nodejs.py +0 -0
  140. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_php_ruby_dart.py +0 -0
  141. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_python.py +0 -0
  142. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_universal_managed.py +0 -0
  143. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detector_universal_systems.py +0 -0
  144. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_detectors_base.py +0 -0
  145. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  146. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_doc_analyzer_python.py +0 -0
  147. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  148. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_analyzer_python_node.py +0 -0
  149. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_graph_schema.py +0 -0
  150. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_hybrid_inference.py +0 -0
  151. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration.py +0 -0
  152. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_dependencies.py +0 -0
  153. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_detection.py +0 -0
  154. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_docs.py +0 -0
  155. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_graph_modules.py +0 -0
  156. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_lqn.py +0 -0
  157. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_metrics.py +0 -0
  158. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_multistack.py +0 -0
  159. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_semantics.py +0 -0
  160. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_integration_universal.py +0 -0
  161. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_java_spring_integration.py +0 -0
  162. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_metrics_analyzer.py +0 -0
  163. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_packaging.py +0 -0
  164. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_phase1_improvements.py +0 -0
  165. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_pipeline_integrity.py +0 -0
  166. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_real_projects.py +0 -0
  167. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_redactor.py +0 -0
  168. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_scanner.py +0 -0
  169. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_schema.py +0 -0
  170. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_schema_normalization.py +0 -0
  171. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_analyzer_node.py +0 -0
  172. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_analyzer_python.py +0 -0
  173. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_import_resolution.py +0 -0
  174. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_semantic_schema.py +0 -0
  175. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_signal_hierarchy.py +0 -0
  176. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_summarizer.py +0 -0
  177. {sourcecode-1.5.0 → sourcecode-1.6.0}/tests/test_telemetry.py +0 -0
  178. {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`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Deterministic codebase context for AI coding agents
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.5.0"
7
+ version = "1.6.0"
8
8
  description = "Deterministic codebase context for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.5.0"
3
+ __version__ = "1.6.0"
@@ -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 in entry_paths, scorer.score(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
- return sorted(contracts, key=lambda c: (-(c.fan_in + c.fan_out), c.path))
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.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes