sourcecode 1.23.0__tar.gz → 1.24.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 (189) hide show
  1. {sourcecode-1.23.0 → sourcecode-1.24.0}/PKG-INFO +3 -3
  2. {sourcecode-1.23.0 → sourcecode-1.24.0}/README.md +2 -2
  3. {sourcecode-1.23.0 → sourcecode-1.24.0}/pyproject.toml +1 -1
  4. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/prepare_context.py +97 -103
  6. {sourcecode-1.23.0 → sourcecode-1.24.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  7. {sourcecode-1.23.0 → sourcecode-1.24.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  8. {sourcecode-1.23.0 → sourcecode-1.24.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  9. {sourcecode-1.23.0 → sourcecode-1.24.0}/.continue-here.md +0 -0
  10. {sourcecode-1.23.0 → sourcecode-1.24.0}/.github/workflows/build-windows.yml +0 -0
  11. {sourcecode-1.23.0 → sourcecode-1.24.0}/.gitignore +0 -0
  12. {sourcecode-1.23.0 → sourcecode-1.24.0}/.ruff.toml +0 -0
  13. {sourcecode-1.23.0 → sourcecode-1.24.0}/CONTRIBUTING.md +0 -0
  14. {sourcecode-1.23.0 → sourcecode-1.24.0}/LICENSE +0 -0
  15. {sourcecode-1.23.0 → sourcecode-1.24.0}/SECURITY.md +0 -0
  16. {sourcecode-1.23.0 → sourcecode-1.24.0}/docs/privacy.md +0 -0
  17. {sourcecode-1.23.0 → sourcecode-1.24.0}/docs/schema.md +0 -0
  18. {sourcecode-1.23.0 → sourcecode-1.24.0}/raw +0 -0
  19. {sourcecode-1.23.0 → sourcecode-1.24.0}/run_cli.py +0 -0
  20. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/adaptive_scanner.py +0 -0
  21. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/architecture_analyzer.py +0 -0
  22. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/architecture_summary.py +0 -0
  23. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/ast_extractor.py +0 -0
  24. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/classifier.py +0 -0
  25. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/cli.py +0 -0
  26. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  27. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/confidence_analyzer.py +0 -0
  28. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/context_scorer.py +0 -0
  29. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/context_summarizer.py +0 -0
  30. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/contract_model.py +0 -0
  31. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/contract_pipeline.py +0 -0
  32. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/coverage_parser.py +0 -0
  33. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/dependency_analyzer.py +0 -0
  34. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/__init__.py +0 -0
  35. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/base.py +0 -0
  36. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  37. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/dart.py +0 -0
  38. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/dotnet.py +0 -0
  39. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/elixir.py +0 -0
  40. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/go.py +0 -0
  41. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/heuristic.py +0 -0
  42. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/hybrid.py +0 -0
  43. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/java.py +0 -0
  44. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  45. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/nodejs.py +0 -0
  46. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/parsers.py +0 -0
  47. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/php.py +0 -0
  48. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/project.py +0 -0
  49. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/python.py +0 -0
  50. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/ruby.py +0 -0
  51. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/rust.py +0 -0
  52. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/systems.py +0 -0
  53. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/terraform.py +0 -0
  54. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/detectors/tooling.py +0 -0
  55. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/doc_analyzer.py +0 -0
  56. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  57. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/env_analyzer.py +0 -0
  58. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/file_classifier.py +0 -0
  59. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/git_analyzer.py +0 -0
  60. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/graph_analyzer.py +0 -0
  61. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/metrics_analyzer.py +0 -0
  62. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/progress.py +0 -0
  63. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/ranking_engine.py +0 -0
  64. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/redactor.py +0 -0
  65. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/relevance_scorer.py +0 -0
  66. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/repo_classifier.py +0 -0
  67. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/runtime_classifier.py +0 -0
  68. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/scanner.py +0 -0
  69. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/schema.py +0 -0
  70. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/semantic_analyzer.py +0 -0
  71. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/serializer.py +0 -0
  72. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/summarizer.py +0 -0
  73. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/__init__.py +0 -0
  74. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/config.py +0 -0
  75. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/consent.py +0 -0
  76. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/events.py +0 -0
  77. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/filters.py +0 -0
  78. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/telemetry/transport.py +0 -0
  79. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/tree_utils.py +0 -0
  80. {sourcecode-1.23.0 → sourcecode-1.24.0}/src/sourcecode/workspace.py +0 -0
  81. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/__init__.py +0 -0
  82. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/conftest.py +0 -0
  83. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/coverage.xml +0 -0
  84. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  85. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  86. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  87. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/go_service/go.mod +0 -0
  88. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/jacoco.xml +0 -0
  89. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/latin1_sample.java +0 -0
  90. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/latin1_sample_iso.java +0 -0
  91. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/lcov.info +0 -0
  92. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  93. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/nextjs_app/package.json +0 -0
  94. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  95. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  96. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  97. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  98. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  99. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  100. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  101. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  102. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  103. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  104. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  105. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  106. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  107. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  108. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  109. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  110. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  111. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  112. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  113. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  114. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  115. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  116. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  117. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  118. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  119. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  120. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  121. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  122. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  123. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  124. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  125. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  126. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  127. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_architecture_analyzer.py +0 -0
  128. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_architecture_summary.py +0 -0
  129. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_ast_extractor.py +0 -0
  130. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_block1_reliability.py +0 -0
  131. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_block2_coverage.py +0 -0
  132. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_block5_quality.py +0 -0
  133. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_bug_fixes_v16.py +0 -0
  134. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_classifier.py +0 -0
  135. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_cli.py +0 -0
  136. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_code_notes_analyzer.py +0 -0
  137. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_context_scorer.py +0 -0
  138. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_contract_pipeline.py +0 -0
  139. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_coverage_parser.py +0 -0
  140. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_cross_consistency.py +0 -0
  141. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  142. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  143. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_dependency_schema.py +0 -0
  144. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_dotnet.py +0 -0
  145. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_go_rust_java.py +0 -0
  146. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_nodejs.py +0 -0
  147. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_php_ruby_dart.py +0 -0
  148. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_python.py +0 -0
  149. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_universal_managed.py +0 -0
  150. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detector_universal_systems.py +0 -0
  151. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_detectors_base.py +0 -0
  152. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  153. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_doc_analyzer_python.py +0 -0
  154. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_encoding_regression.py +0 -0
  155. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  156. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_graph_analyzer_python_node.py +0 -0
  157. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_graph_schema.py +0 -0
  158. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_hybrid_inference.py +0 -0
  159. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration.py +0 -0
  160. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_dependencies.py +0 -0
  161. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_detection.py +0 -0
  162. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_docs.py +0 -0
  163. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_graph_modules.py +0 -0
  164. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_lqn.py +0 -0
  165. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_metrics.py +0 -0
  166. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_multistack.py +0 -0
  167. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_semantics.py +0 -0
  168. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_integration_universal.py +0 -0
  169. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_java_spring_integration.py +0 -0
  170. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_metrics_analyzer.py +0 -0
  171. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_packaging.py +0 -0
  172. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_phase1_improvements.py +0 -0
  173. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_pipeline_integrity.py +0 -0
  174. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_real_projects.py +0 -0
  175. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_redactor.py +0 -0
  176. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_scanner.py +0 -0
  177. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_schema.py +0 -0
  178. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_schema_normalization.py +0 -0
  179. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_semantic_analyzer_node.py +0 -0
  180. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_semantic_analyzer_python.py +0 -0
  181. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_semantic_import_resolution.py +0 -0
  182. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_semantic_schema.py +0 -0
  183. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_signal_hierarchy.py +0 -0
  184. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_summarizer.py +0 -0
  185. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_surface_honesty.py +0 -0
  186. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_task_differentiation.py +0 -0
  187. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_telemetry.py +0 -0
  188. {sourcecode-1.23.0 → sourcecode-1.24.0}/tests/test_v1_10_regressions.py +0 -0
  189. {sourcecode-1.23.0 → sourcecode-1.24.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.23.0
3
+ Version: 1.24.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
- ![Version](https://img.shields.io/badge/version-1.23.0-blue)
224
+ ![Version](https://img.shields.io/badge/version-1.24.0-blue)
225
225
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
226
226
 
227
227
  ---
@@ -255,7 +255,7 @@ pipx install sourcecode
255
255
 
256
256
  ```bash
257
257
  sourcecode version
258
- # sourcecode 1.23.0
258
+ # sourcecode 1.24.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
- ![Version](https://img.shields.io/badge/version-1.23.0-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.24.0-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -36,7 +36,7 @@ pipx install sourcecode
36
36
 
37
37
  ```bash
38
38
  sourcecode version
39
- # sourcecode 1.23.0
39
+ # sourcecode 1.24.0
40
40
  ```
41
41
 
42
42
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.23.0"
7
+ version = "1.24.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.23.0"
3
+ __version__ = "1.24.0"
@@ -1777,118 +1777,108 @@ class TaskContextBuilder:
1777
1777
  path=path, role=role, score=rel_score, reason=reason, why=why_str
1778
1778
  )))
1779
1779
  why[path] = why_str
1780
- for trigger_name in triggers[:3]:
1781
- trigger_full = next((f for f in changed_files if Path(f).name == trigger_name), None)
1782
- if trigger_full:
1783
- graph_edges.append({"from": trigger_full, "to": path, "edge_type": "module_proximity", "hop": 1})
1780
+ # module_proximity is heuristic (not a verified import) — excluded from structural graph
1784
1781
 
1785
1782
  related.sort(key=lambda x: (-x[0], x[1]))
1786
1783
  relevant.extend(rf for _, _, rf in related[:10])
1787
1784
 
1788
- # ── Step 3b: import-link expansion (bounded file scan) ────────────────
1789
- # Find files in the same module that import/reference a changed file.
1790
- # More precise than directory proximity: based on actual import statements.
1791
- _import_candidates = [
1785
+ # ── Steps 3b–3c: BFS multi-hop import propagation (repo-wide, 3 hops max)
1786
+ # Each hop expands from whatever was found in the previous hop into ALL
1787
+ # remaining source files not restricted to original module/dir.
1788
+ # This enables A→B→C discovery even when B and C are in different modules.
1789
+ _BFS_SCANNABLE = frozenset({".py", ".java", ".kt", ".ts", ".js", ".tsx", ".jsx", ".mjs"})
1790
+ _bfs_all_sources = [
1792
1791
  p for p in all_paths
1793
- if p not in existing_paths and Path(p).suffix.lower() in {
1794
- ".py", ".java", ".kt", ".ts", ".js", ".tsx", ".jsx", ".mjs"
1795
- }
1796
- and (
1797
- _extract_ddd_domain(p) in affected_modules_set
1798
- or str(Path(p).parent).replace("\\", "/") in changed_dirs
1799
- )
1792
+ if Path(p).suffix.lower() in _BFS_SCANNABLE
1793
+ ]
1794
+
1795
+ _bfs_seen: set[str] = {rf.path for rf in relevant}
1796
+ _bfs_frontier: list[str] = [
1797
+ f for f in changed_files
1798
+ if Path(f).suffix.lower() in _BFS_SCANNABLE
1800
1799
  ]
1801
- if _import_candidates:
1802
- _import_dep_map = self._scan_import_dependents(
1803
- changed_paths=changed_files,
1804
- candidate_paths=_import_candidates,
1800
+
1801
+ # (max results added from this hop, max_candidates scanned per seed)
1802
+ _BFS_HOP_BUDGET = [
1803
+ (8, 60), # hop 1 — broad: callers of changed files
1804
+ (6, 50), # hop 2 — transitives: callers of hop-1 files
1805
+ (4, 30), # hop 3 — deep transitives: callers of hop-2 files
1806
+ ]
1807
+
1808
+ # (hop_num, score, path, RelevantFile) — merged across all hops then added to relevant
1809
+ _bfs_collected: list[tuple[int, float, str, RelevantFile]] = []
1810
+
1811
+ for _hop_num, (_max_results, _max_cands) in enumerate(_BFS_HOP_BUDGET, start=1):
1812
+ if not _bfs_frontier:
1813
+ break
1814
+
1815
+ _bfs_candidates = [p for p in _bfs_all_sources if p not in _bfs_seen]
1816
+ if not _bfs_candidates:
1817
+ break
1818
+
1819
+ _hop_dep_map = self._scan_import_dependents(
1820
+ changed_paths=_bfs_frontier,
1821
+ candidate_paths=_bfs_candidates,
1822
+ max_candidates=_max_cands,
1805
1823
  )
1806
- _import_seen = {rf.path for rf in relevant}
1807
- _import_extra: list[tuple[float, str, RelevantFile]] = []
1808
- for changed_path, dep_paths in _import_dep_map.items():
1809
- changed_atype = classifications[changed_path]["artifact_type"]
1810
- for dep_path in dep_paths:
1811
- if dep_path in _import_seen:
1824
+
1825
+ # collect (score, path) pairs for this hop to build the next frontier
1826
+ _hop_scored: list[tuple[float, str]] = []
1827
+
1828
+ for _seed_path, _dep_paths in _hop_dep_map.items():
1829
+ _seed_atype = (
1830
+ classifications[_seed_path]["artifact_type"]
1831
+ if _seed_path in classifications
1832
+ else self._classify_changed_file(_seed_path)["artifact_type"]
1833
+ )
1834
+ for _dep_path in _dep_paths:
1835
+ if _dep_path in _bfs_seen:
1812
1836
  continue
1813
- dep_cls = self._classify_changed_file(dep_path)
1814
- if dep_cls["is_noise"]:
1837
+ _bfs_seen.add(_dep_path)
1838
+
1839
+ _dep_cls = self._classify_changed_file(_dep_path)
1840
+ if _dep_cls["is_noise"]:
1815
1841
  continue
1816
- dep_atype = dep_cls["artifact_type"]
1817
- dep_base = _ARTIFACT_SCORE.get(dep_atype, 0.45)
1818
- dep_score = round(dep_base * 0.70, 2)
1819
- dep_role = _role_in_system(dep_path, dep_atype, dep_path in ep_paths)
1820
- why_str = (
1821
- f"artifact_type: {dep_atype} | role_in_system: {dep_role}"
1822
- f" | impact_area: {_classify_impact_area(dep_path, dep_cls['risk_areas'], dep_atype)}"
1823
- f" | propagation_risk: {_PROPAGATION_RISK.get(dep_atype, 'low')}"
1824
- f" | change_effect: {_CHANGE_EFFECT.get(dep_atype, 'modifies application logic')}"
1825
- f" | pulled_by: import-link from {Path(changed_path).name}"
1842
+
1843
+ _dep_atype = _dep_cls["artifact_type"]
1844
+ _dep_score_base = _ARTIFACT_SCORE.get(_dep_atype, 0.45)
1845
+ # score decays 30% per hop so transitives rank below direct dependents
1846
+ _dep_score = round(_dep_score_base * (0.70 ** _hop_num), 2)
1847
+ _dep_role = _role_in_system(_dep_path, _dep_atype, _dep_path in ep_paths)
1848
+
1849
+ _why_str = (
1850
+ f"artifact_type: {_dep_atype} | role_in_system: {_dep_role}"
1851
+ f" | impact_area: {_classify_impact_area(_dep_path, _dep_cls['risk_areas'], _dep_atype)}"
1852
+ f" | propagation_risk: {_PROPAGATION_RISK.get(_dep_atype, 'low')}"
1853
+ f" | change_effect: {_CHANGE_EFFECT.get(_dep_atype, 'modifies application logic')}"
1854
+ f" | pulled_by: hop-{_hop_num} import from {Path(_seed_path).name}"
1855
+ )
1856
+ _reason = (
1857
+ f"hop-{_hop_num} import-dependent of {Path(_seed_path).name}"
1858
+ f" ({_seed_atype}) | score: {_dep_score:.2f}"
1826
1859
  )
1827
- reason = f"import-dependent of {Path(changed_path).name} ({changed_atype}) | score: {dep_score:.2f}"
1828
- _import_extra.append((dep_score, dep_path, RelevantFile(
1829
- path=dep_path, role=dep_role, score=dep_score,
1830
- reason=reason, why=why_str,
1860
+ why[_dep_path] = _why_str
1861
+ # Tests are consumers, not structural dependencies — exclude from import graph.
1862
+ # They remain in relevant_files but must not seed further BFS hops.
1863
+ _is_test = _dep_atype == "test"
1864
+ if not _is_test:
1865
+ graph_edges.append({
1866
+ "from": _seed_path, "to": _dep_path,
1867
+ "edge_type": "import_dependency", "hop": _hop_num,
1868
+ })
1869
+ _hop_scored.append((_dep_score, _dep_path))
1870
+ _bfs_collected.append((_hop_num, _dep_score, _dep_path, RelevantFile(
1871
+ path=_dep_path, role=_dep_role, score=_dep_score,
1872
+ reason=_reason, why=_why_str,
1831
1873
  )))
1832
- why[dep_path] = why_str
1833
- _import_seen.add(dep_path)
1834
- graph_edges.append({"from": changed_path, "to": dep_path, "edge_type": "import_dependency", "hop": 1})
1835
- _import_extra.sort(key=lambda x: (-x[0], x[1]))
1836
- relevant.extend(rf for _, _, rf in _import_extra[:8])
1837
-
1838
- # ── Step 3c: hop-2 import propagation (callers of hop-1 dependents) ────
1839
- _hop1_seeds = list(dict.fromkeys(
1840
- dep_path
1841
- for dep_paths in (_import_dep_map.values() if _import_candidates else [])
1842
- for dep_path in dep_paths
1843
- ))
1844
- if _hop1_seeds:
1845
- _hop2_seen = {rf.path for rf in relevant}
1846
- _hop2_candidates = [
1847
- p for p in all_paths
1848
- if p not in _hop2_seen
1849
- and Path(p).suffix.lower() in {".py", ".java", ".kt", ".ts", ".js", ".tsx", ".jsx", ".mjs"}
1850
- and (
1851
- _extract_ddd_domain(p) in affected_modules_set
1852
- or str(Path(p).parent).replace("\\", "/") in changed_dirs
1853
- )
1854
- ]
1855
- if _hop2_candidates:
1856
- _hop2_dep_map = self._scan_import_dependents(
1857
- changed_paths=_hop1_seeds,
1858
- candidate_paths=_hop2_candidates,
1859
- max_candidates=20,
1860
- )
1861
- _hop2_extra: list[tuple[float, str, RelevantFile]] = []
1862
- for hop1_path, dep_paths in _hop2_dep_map.items():
1863
- hop1_cls = self._classify_changed_file(hop1_path)
1864
- hop1_atype = hop1_cls["artifact_type"]
1865
- for dep_path in dep_paths:
1866
- if dep_path in _hop2_seen:
1867
- continue
1868
- dep_cls = self._classify_changed_file(dep_path)
1869
- if dep_cls["is_noise"]:
1870
- continue
1871
- dep_atype = dep_cls["artifact_type"]
1872
- dep_base = _ARTIFACT_SCORE.get(dep_atype, 0.45)
1873
- dep_score = round(dep_base * 0.50, 2)
1874
- dep_role = _role_in_system(dep_path, dep_atype, dep_path in ep_paths)
1875
- why_str = (
1876
- f"artifact_type: {dep_atype} | role_in_system: {dep_role}"
1877
- f" | impact_area: {_classify_impact_area(dep_path, dep_cls['risk_areas'], dep_atype)}"
1878
- f" | propagation_risk: {_PROPAGATION_RISK.get(dep_atype, 'low')}"
1879
- f" | change_effect: {_CHANGE_EFFECT.get(dep_atype, 'modifies application logic')}"
1880
- f" | pulled_by: hop-2 import from {Path(hop1_path).name}"
1881
- )
1882
- reason = f"hop-2 import-dependent of {Path(hop1_path).name} ({hop1_atype}) | score: {dep_score:.2f}"
1883
- _hop2_extra.append((dep_score, dep_path, RelevantFile(
1884
- path=dep_path, role=dep_role, score=dep_score,
1885
- reason=reason, why=why_str,
1886
- )))
1887
- why[dep_path] = why_str
1888
- _hop2_seen.add(dep_path)
1889
- graph_edges.append({"from": hop1_path, "to": dep_path, "edge_type": "import_dependency", "hop": 2})
1890
- _hop2_extra.sort(key=lambda x: (-x[0], x[1]))
1891
- relevant.extend(rf for _, _, rf in _hop2_extra[:5])
1874
+
1875
+ # next frontier = top-N files by score from this hop
1876
+ _hop_scored.sort(key=lambda x: -x[0])
1877
+ _bfs_frontier = [p for _, p in _hop_scored[:_max_results]]
1878
+
1879
+ # merge into relevant: closer hops first, then higher score; cap total at 20
1880
+ _bfs_collected.sort(key=lambda x: (x[0], -x[1], x[2]))
1881
+ relevant.extend(rf for _, _, _, rf in _bfs_collected[:20])
1892
1882
 
1893
1883
  # ── Step 3d: per-file impact scores, change_type, system_impact ─────────
1894
1884
  # Downstream fanout: count graph edges originating from each changed file
@@ -2054,9 +2044,13 @@ class TaskContextBuilder:
2054
2044
  }
2055
2045
 
2056
2046
  # ── Step 6: analysis gaps ──────────────────────────────────────────────
2057
- _hop_desc = f"+ hop-2 import propagation (propagation_depth={_max_hop})" if _max_hop >= 2 else ""
2047
+ _bfs_note = (
2048
+ f"BFS multi-hop import propagation repo-wide (propagation_depth={_max_hop})"
2049
+ if _max_hop >= 1
2050
+ else "no import-link propagation (no scannable changed files)"
2051
+ )
2058
2052
  analysis_gaps: list[str] = [
2059
- f"Related file expansion uses type-aware propagation chains + bounded import-link scanning {_hop_desc}+ module/directory heuristics".replace(" ", " ").strip(),
2053
+ f"Related file expansion: type-aware chain expansion + {_bfs_note} + module/directory heuristics",
2060
2054
  ]
2061
2055
  if noise_count > 0 and meaningful > 0:
2062
2056
  analysis_gaps.append(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes