sourcecode 1.12.0__tar.gz → 1.13.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 (185) hide show
  1. {sourcecode-1.12.0 → sourcecode-1.13.0}/PKG-INFO +1 -1
  2. {sourcecode-1.12.0 → sourcecode-1.13.0}/pyproject.toml +1 -1
  3. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/__init__.py +1 -1
  4. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/architecture_summary.py +3 -3
  5. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/classifier.py +12 -3
  6. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/cli.py +9 -28
  7. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/java.py +7 -6
  8. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/prepare_context.py +17 -3
  9. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/serializer.py +12 -3
  10. {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  11. {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  12. {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  13. {sourcecode-1.12.0 → sourcecode-1.13.0}/.continue-here.md +0 -0
  14. {sourcecode-1.12.0 → sourcecode-1.13.0}/.github/workflows/build-windows.yml +0 -0
  15. {sourcecode-1.12.0 → sourcecode-1.13.0}/.gitignore +0 -0
  16. {sourcecode-1.12.0 → sourcecode-1.13.0}/.ruff.toml +0 -0
  17. {sourcecode-1.12.0 → sourcecode-1.13.0}/CONTRIBUTING.md +0 -0
  18. {sourcecode-1.12.0 → sourcecode-1.13.0}/LICENSE +0 -0
  19. {sourcecode-1.12.0 → sourcecode-1.13.0}/README.md +0 -0
  20. {sourcecode-1.12.0 → sourcecode-1.13.0}/SECURITY.md +0 -0
  21. {sourcecode-1.12.0 → sourcecode-1.13.0}/docs/privacy.md +0 -0
  22. {sourcecode-1.12.0 → sourcecode-1.13.0}/docs/schema.md +0 -0
  23. {sourcecode-1.12.0 → sourcecode-1.13.0}/raw +0 -0
  24. {sourcecode-1.12.0 → sourcecode-1.13.0}/run_cli.py +0 -0
  25. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/adaptive_scanner.py +0 -0
  26. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/architecture_analyzer.py +0 -0
  27. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/ast_extractor.py +0 -0
  28. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  29. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/confidence_analyzer.py +0 -0
  30. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/context_scorer.py +0 -0
  31. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/context_summarizer.py +0 -0
  32. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/contract_model.py +0 -0
  33. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/contract_pipeline.py +0 -0
  34. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/coverage_parser.py +0 -0
  35. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/dependency_analyzer.py +0 -0
  36. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/__init__.py +0 -0
  37. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/base.py +0 -0
  38. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  39. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/dart.py +0 -0
  40. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/dotnet.py +0 -0
  41. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/elixir.py +0 -0
  42. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/go.py +0 -0
  43. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/heuristic.py +0 -0
  44. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/hybrid.py +0 -0
  45. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  46. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/nodejs.py +0 -0
  47. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/parsers.py +0 -0
  48. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/php.py +0 -0
  49. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/project.py +0 -0
  50. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/python.py +0 -0
  51. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/ruby.py +0 -0
  52. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/rust.py +0 -0
  53. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/systems.py +0 -0
  54. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/terraform.py +0 -0
  55. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/tooling.py +0 -0
  56. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/doc_analyzer.py +0 -0
  57. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  58. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/env_analyzer.py +0 -0
  59. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/file_classifier.py +0 -0
  60. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/git_analyzer.py +0 -0
  61. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/graph_analyzer.py +0 -0
  62. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/metrics_analyzer.py +0 -0
  63. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/progress.py +0 -0
  64. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/ranking_engine.py +0 -0
  65. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/redactor.py +0 -0
  66. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/relevance_scorer.py +0 -0
  67. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/repo_classifier.py +0 -0
  68. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/runtime_classifier.py +0 -0
  69. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/scanner.py +0 -0
  70. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/schema.py +0 -0
  71. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/semantic_analyzer.py +0 -0
  72. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/summarizer.py +0 -0
  73. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/__init__.py +0 -0
  74. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/config.py +0 -0
  75. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/consent.py +0 -0
  76. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/events.py +0 -0
  77. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/filters.py +0 -0
  78. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/transport.py +0 -0
  79. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/tree_utils.py +0 -0
  80. {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/workspace.py +0 -0
  81. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/__init__.py +0 -0
  82. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/conftest.py +0 -0
  83. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/coverage.xml +0 -0
  84. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  85. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  86. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  87. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/go_service/go.mod +0 -0
  88. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/jacoco.xml +0 -0
  89. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/lcov.info +0 -0
  90. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  91. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/package.json +0 -0
  92. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  93. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  94. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  95. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  96. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  97. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  98. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  99. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  100. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  101. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  102. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  103. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  104. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  105. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  106. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  107. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  108. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  109. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  110. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  111. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  112. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  113. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  114. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  115. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  116. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  117. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  118. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  119. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  120. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  121. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  122. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  123. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  124. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  125. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_architecture_analyzer.py +0 -0
  126. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_architecture_summary.py +0 -0
  127. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_ast_extractor.py +0 -0
  128. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block1_reliability.py +0 -0
  129. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block2_coverage.py +0 -0
  130. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block5_quality.py +0 -0
  131. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_bug_fixes_v16.py +0 -0
  132. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_classifier.py +0 -0
  133. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_cli.py +0 -0
  134. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_code_notes_analyzer.py +0 -0
  135. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_context_scorer.py +0 -0
  136. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_contract_pipeline.py +0 -0
  137. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_coverage_parser.py +0 -0
  138. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_cross_consistency.py +0 -0
  139. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  140. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  141. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_schema.py +0 -0
  142. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_dotnet.py +0 -0
  143. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_go_rust_java.py +0 -0
  144. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_nodejs.py +0 -0
  145. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_php_ruby_dart.py +0 -0
  146. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_python.py +0 -0
  147. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_universal_managed.py +0 -0
  148. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_universal_systems.py +0 -0
  149. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detectors_base.py +0 -0
  150. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  151. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_doc_analyzer_python.py +0 -0
  152. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  153. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_analyzer_python_node.py +0 -0
  154. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_schema.py +0 -0
  155. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_hybrid_inference.py +0 -0
  156. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration.py +0 -0
  157. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_dependencies.py +0 -0
  158. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_detection.py +0 -0
  159. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_docs.py +0 -0
  160. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_graph_modules.py +0 -0
  161. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_lqn.py +0 -0
  162. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_metrics.py +0 -0
  163. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_multistack.py +0 -0
  164. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_semantics.py +0 -0
  165. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_universal.py +0 -0
  166. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_java_spring_integration.py +0 -0
  167. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_metrics_analyzer.py +0 -0
  168. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_packaging.py +0 -0
  169. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_phase1_improvements.py +0 -0
  170. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_pipeline_integrity.py +0 -0
  171. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_real_projects.py +0 -0
  172. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_redactor.py +0 -0
  173. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_scanner.py +0 -0
  174. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_schema.py +0 -0
  175. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_schema_normalization.py +0 -0
  176. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_analyzer_node.py +0 -0
  177. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_analyzer_python.py +0 -0
  178. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_import_resolution.py +0 -0
  179. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_schema.py +0 -0
  180. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_signal_hierarchy.py +0 -0
  181. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_summarizer.py +0 -0
  182. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_surface_honesty.py +0 -0
  183. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_telemetry.py +0 -0
  184. {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_v1_10_regressions.py +0 -0
  185. {sourcecode-1.12.0 → sourcecode-1.13.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.12.0
3
+ Version: 1.13.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.12.0"
7
+ version = "1.13.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.12.0"
3
+ __version__ = "1.13.0"
@@ -173,7 +173,7 @@ class ArchitectureSummarizer:
173
173
  fw_names = list(dict.fromkeys(fw_names))[:3] # dedup, preserve order
174
174
  else:
175
175
  # Filter out frameworks from auxiliary or tooling stacks (docs/, benchmarks/, etc.)
176
- fw_names = [
176
+ fw_names = list(dict.fromkeys(
177
177
  f.name
178
178
  for s in sm.stacks
179
179
  if not self._is_tooling_path(s.root or "")
@@ -181,7 +181,7 @@ class ArchitectureSummarizer:
181
181
  and not self._is_auxiliary_path(s.root or "")
182
182
  and not self._is_auxiliary_path(s.workspace or "")
183
183
  for f in s.frameworks[:2]
184
- ][:3]
184
+ ))[:3]
185
185
 
186
186
  fw_str = f" using {', '.join(fw_names)}" if fw_names else ""
187
187
  if runtime:
@@ -288,7 +288,7 @@ class ArchitectureSummarizer:
288
288
 
289
289
  def _summarize_java_entry(self, path: str, content: str, stacks: list[StackDetection]) -> list[str]:
290
290
  lines: list[str] = []
291
- frameworks = [f.name for stack in stacks for f in stack.frameworks]
291
+ frameworks = list(dict.fromkeys(f.name for stack in stacks for f in stack.frameworks))
292
292
  if frameworks:
293
293
  lines.append(f"Frameworks detectados: {', '.join(frameworks)}.")
294
294
  annotations = re.findall(r"@(SpringBootApplication|QuarkusMain|MicronautApplication|Application)\b", content)
@@ -150,9 +150,18 @@ class TypeClassifier:
150
150
  score = {"low": 0, "medium": 1, "high": 2}.get(stack.confidence, 0)
151
151
  manifest_weight = 1 if stack.manifests else 0
152
152
  priority = 0
153
- if project_type in {"webapp", "fullstack"} and stack.stack in {"nodejs", "elixir"} or project_type == "api" and stack.stack in _API_STACKS or project_type == "cli" and any(
154
- framework.name in _CLI_FRAMEWORKS for framework in stack.frameworks
155
- ) or project_type == "cli" and stack.stack in {"cpp", "dotnet"}:
153
+ # Backend server-side stacks with manifest evidence outrank frontend stacks
154
+ # in fullstack projects (e.g. Java+Spring wins over nodejs+Angular).
155
+ if (project_type in {"fullstack", "api"}
156
+ and stack.stack in _API_STACKS
157
+ and stack.manifests):
158
+ priority = 4
159
+ elif (project_type in {"webapp", "fullstack"} and stack.stack in {"nodejs", "elixir"}
160
+ or project_type == "api" and stack.stack in _API_STACKS
161
+ or project_type == "cli" and any(
162
+ framework.name in _CLI_FRAMEWORKS for framework in stack.frameworks
163
+ )
164
+ or project_type == "cli" and stack.stack in {"cpp", "dotnet"}):
156
165
  priority = 3
157
166
  return (priority, score, manifest_weight)
158
167
 
@@ -705,6 +705,11 @@ def main(
705
705
  elif mode not in _CONTRACT_MODES and mode != "raw":
706
706
  mode = "contract" # unknown → safe default
707
707
 
708
+ # --changed-only forces compact output to bound size; full contract/raw scan
709
+ # of a large repo produces 100KB+ even with only 2 changed files.
710
+ if changed_only and not compact and not agent:
711
+ compact = True
712
+
708
713
  # Legacy flags imply raw mode unless --mode was explicitly overridden.
709
714
  # --format yaml and --graph-modules are now compatible with contract_view:
710
715
  # yaml is a serialization format (not an output-section flag)
@@ -1498,33 +1503,6 @@ def main(
1498
1503
  content = json.dumps(data, indent=2, ensure_ascii=False)
1499
1504
  elif agent:
1500
1505
  data = agent_view(sm)
1501
- # When contract pipeline ran (mode=contract, no legacy flags), include
1502
- # per-file contracts in agent output so agents get structural context.
1503
- # Remove file_relevance — contracts cover this signal with more detail.
1504
- if _is_contract_mode and sm.file_contracts:
1505
- from sourcecode.serializer import _serialize_contract_minimal
1506
- data.pop("file_relevance", None)
1507
- _jvm_stacks_agent = {"java", "kotlin", "scala", "groovy"}
1508
- _is_jvm_agent = any(s.stack in _jvm_stacks_agent for s in sm.stacks)
1509
- _MAX_AGENT_CONTRACTS = 50 if _is_jvm_agent else 10
1510
- _all_contracts = sm.file_contracts
1511
- _sorted = sorted(_all_contracts, key=lambda c: getattr(c, "relevance_score", 0.0), reverse=True)
1512
- _sampled = _sorted[:_MAX_AGENT_CONTRACTS]
1513
- _total_contracts = len(_all_contracts)
1514
- data["contracts"] = [_serialize_contract_minimal(c) for c in _sampled]
1515
- data["contracts_meta"] = {
1516
- "total": _total_contracts,
1517
- "shown": len(_sampled),
1518
- "truncated": _total_contracts > _MAX_AGENT_CONTRACTS,
1519
- }
1520
- if sm.contract_summary is not None:
1521
- cs = sm.contract_summary
1522
- data["contract_summary"] = {
1523
- "files": cs.extracted_files,
1524
- "total": cs.total_files,
1525
- }
1526
- if cs.method_breakdown:
1527
- data["contract_summary"]["methods"] = cs.method_breakdown
1528
1506
  if not no_redact:
1529
1507
  data = redact_dict(data)
1530
1508
  content = json.dumps(data, indent=2, ensure_ascii=False)
@@ -1701,7 +1679,10 @@ def prepare_context_cmd(
1701
1679
  "project_summary": output.project_summary,
1702
1680
  "architecture_summary": output.architecture_summary,
1703
1681
  "confidence": output.confidence,
1704
- "relevant_files": [asdict(f) for f in output.relevant_files],
1682
+ "relevant_files": [
1683
+ {k: v for k, v in asdict(f).items() if v != ""}
1684
+ for f in output.relevant_files
1685
+ ],
1705
1686
  "why_these_files": output.why_these_files,
1706
1687
  "key_dependencies": output.key_dependencies,
1707
1688
  }
@@ -37,8 +37,9 @@ _REQUEST_METHOD_VERB_RE = re.compile(
37
37
  # @M3FiltroSeguridad custom security annotation
38
38
  _M3_FILTRO_RE = re.compile(r'@M3FiltroSeguridad\b')
39
39
  _M3_FILTRO_PARAMS_RE = re.compile(
40
- r'@M3FiltroSeguridad\s*\(\s*(?:nombreRecurso\s*=\s*"([^"]*)")?'
41
- r'(?:[^)]*nivelRequerido\s*=\s*(\d+))?'
40
+ r'@M3FiltroSeguridad\s*\(\s*'
41
+ r'(?:nombreRecurso\s*=\s*(?:"([^"]*)"|([\w.]+)))?' # group 1: string literal, group 2: constant ref
42
+ r'(?:[^)]*nivelRequerido\s*=\s*(\d+))?' # group 3: nivel
42
43
  )
43
44
 
44
45
  # Security config detection
@@ -391,8 +392,8 @@ class JavaDetector(AbstractDetector):
391
392
  security_evidence = None
392
393
  m3_match = _M3_FILTRO_PARAMS_RE.search(content)
393
394
  if m3_match:
394
- nombre = m3_match.group(1) or ""
395
- nivel = m3_match.group(2) or ""
395
+ nombre = m3_match.group(1) or m3_match.group(2) or ""
396
+ nivel = m3_match.group(3) or ""
396
397
  security_evidence = f"@M3FiltroSeguridad(nombreRecurso={nombre!r}, nivelRequerido={nivel})"
397
398
  return [EntryPoint(
398
399
  path=rel_path, stack="java", kind="rest_controller",
@@ -416,8 +417,8 @@ class JavaDetector(AbstractDetector):
416
417
  security_evidence = None
417
418
  m3_match = _M3_FILTRO_PARAMS_RE.search(content)
418
419
  if m3_match:
419
- nombre = m3_match.group(1) or ""
420
- nivel = m3_match.group(2) or ""
420
+ nombre = m3_match.group(1) or m3_match.group(2) or ""
421
+ nivel = m3_match.group(3) or ""
421
422
  security_evidence = f"@M3FiltroSeguridad(nombreRecurso={nombre!r}, nivelRequerido={nivel})"
422
423
  return [EntryPoint(
423
424
  path=rel_path, stack="java", kind="mvc_controller",
@@ -563,6 +563,15 @@ class TaskContextBuilder:
563
563
  except Exception:
564
564
  pass
565
565
 
566
+ # ── 5c. Delta: resolve git-changed files BEFORE ranking ───────────────
567
+ # For delta task, relevant_files must rank only files changed in the
568
+ # specified git range, not the full repo by generic entrypoint scoring.
569
+ _delta_files: Optional[set[str]] = None
570
+ if task_name == "delta":
571
+ _delta_raw = self._get_git_changed_files(since=since)
572
+ if _delta_raw:
573
+ _delta_files = set(_delta_raw)
574
+
566
575
  # ── 5c. review-pr suspected_areas (needs git uncommitted_files) ──────
567
576
  if task_name == "review-pr" and spec.enable_code_notes:
568
577
  pr_areas: dict[str, int] = {}
@@ -593,6 +602,7 @@ class TaskContextBuilder:
593
602
  git_hotspots=git_hotspots,
594
603
  uncommitted_files=uncommitted_files,
595
604
  code_notes=cn_notes_for_ranking if cn_notes_for_ranking else None,
605
+ delta_files=_delta_files,
596
606
  )
597
607
 
598
608
  # ── 7. Test gaps (generate-tests only) ────────────────────────────
@@ -640,11 +650,11 @@ class TaskContextBuilder:
640
650
  rf.path: rf.reason for rf in relevant_files
641
651
  }
642
652
 
643
- # ── 10. Delta: git changed files ──────────────────────────────────────
653
+ # ── 10. Delta: git changed files (reuse pre-computed set from step 5c) ──
644
654
  changed_files: list[str] = []
645
655
  affected_entry_points: list[str] = []
646
656
  if task_name == "delta":
647
- changed_files = self._get_git_changed_files(since=since)
657
+ changed_files = sorted(_delta_files) if _delta_files else self._get_git_changed_files(since=since)
648
658
  ep_set = {ep.path for ep in entry_points}
649
659
  affected_entry_points = [f for f in changed_files if f in ep_set]
650
660
 
@@ -746,6 +756,7 @@ class TaskContextBuilder:
746
756
  git_hotspots: Optional[dict[str, int]] = None,
747
757
  uncommitted_files: Optional[set[str]] = None,
748
758
  code_notes: Optional[list] = None,
759
+ delta_files: Optional[set[str]] = None,
749
760
  ) -> list[RelevantFile]:
750
761
  from sourcecode.ranking_engine import RankingEngine
751
762
  from sourcecode.file_classifier import FileClassifier
@@ -791,7 +802,10 @@ class TaskContextBuilder:
791
802
 
792
803
  scored: list[tuple[float, str, RelevantFile]] = []
793
804
 
794
- for path in all_paths:
805
+ # For delta task, score only files changed in the specified git range.
806
+ paths_to_score = [p for p in all_paths if p in delta_files] if delta_files else all_paths
807
+
808
+ for path in paths_to_score:
795
809
  if Path(path).suffix.lower() not in _ALL_EXTENSIONS:
796
810
  continue
797
811
  if any(pen in path for pen in spec.ranking_penalties):
@@ -700,17 +700,26 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
700
700
  for ep in ep_groups["production"][:_EP_PRODUCTION_CAP]
701
701
  ]
702
702
 
703
- # Stacks — name + method + confidence + frameworks (names only)
703
+ # Stacks — deduplicated: for same stack name, prefer manifest over heuristic
704
+ _stack_best: dict[str, Any] = {}
705
+ for _s in sm.stacks:
706
+ _existing = _stack_best.get(_s.stack)
707
+ if _existing is None:
708
+ _stack_best[_s.stack] = _s
709
+ elif _s.detection_method != "heuristic" and _existing.detection_method == "heuristic":
710
+ _stack_best[_s.stack] = _s
711
+ elif _s.primary and not _existing.primary and _s.detection_method == _existing.detection_method:
712
+ _stack_best[_s.stack] = _s
704
713
  stacks_compact = [
705
714
  {
706
715
  "stack": s.stack,
707
716
  "detection_method": s.detection_method,
708
717
  "confidence": s.confidence,
709
718
  **({"primary": True} if s.primary else {}),
710
- **({"frameworks": [f.name for f in s.frameworks]} if s.frameworks else {}),
719
+ **({"frameworks": list(dict.fromkeys(f.name for f in s.frameworks))} if s.frameworks else {}),
711
720
  **({"package_manager": s.package_manager} if s.package_manager else {}),
712
721
  }
713
- for s in sm.stacks
722
+ for s in _stack_best.values()
714
723
  ]
715
724
 
716
725
  # Confidence — overall only + anomalies
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes