sourcecode 1.30.9__tar.gz → 1.30.11__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 (190) hide show
  1. {sourcecode-1.30.9 → sourcecode-1.30.11}/PKG-INFO +3 -3
  2. {sourcecode-1.30.9 → sourcecode-1.30.11}/README.md +2 -2
  3. {sourcecode-1.30.9 → sourcecode-1.30.11}/pyproject.toml +1 -1
  4. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/cli.py +2 -3
  6. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/prepare_context.py +129 -113
  7. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_v1_10_regressions.py +2 -2
  8. {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  9. {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  10. {sourcecode-1.30.9 → sourcecode-1.30.11}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  11. {sourcecode-1.30.9 → sourcecode-1.30.11}/.continue-here.md +0 -0
  12. {sourcecode-1.30.9 → sourcecode-1.30.11}/.github/workflows/build-windows.yml +0 -0
  13. {sourcecode-1.30.9 → sourcecode-1.30.11}/.gitignore +0 -0
  14. {sourcecode-1.30.9 → sourcecode-1.30.11}/.ruff.toml +0 -0
  15. {sourcecode-1.30.9 → sourcecode-1.30.11}/CONTRIBUTING.md +0 -0
  16. {sourcecode-1.30.9 → sourcecode-1.30.11}/LICENSE +0 -0
  17. {sourcecode-1.30.9 → sourcecode-1.30.11}/SECURITY.md +0 -0
  18. {sourcecode-1.30.9 → sourcecode-1.30.11}/docs/privacy.md +0 -0
  19. {sourcecode-1.30.9 → sourcecode-1.30.11}/docs/schema.md +0 -0
  20. {sourcecode-1.30.9 → sourcecode-1.30.11}/raw +0 -0
  21. {sourcecode-1.30.9 → sourcecode-1.30.11}/run_cli.py +0 -0
  22. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/adaptive_scanner.py +0 -0
  23. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/architecture_analyzer.py +0 -0
  24. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/architecture_summary.py +0 -0
  25. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/ast_extractor.py +0 -0
  26. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/classifier.py +0 -0
  27. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/code_notes_analyzer.py +0 -0
  28. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/confidence_analyzer.py +0 -0
  29. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/context_scorer.py +0 -0
  30. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/context_summarizer.py +0 -0
  31. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/contract_model.py +0 -0
  32. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/contract_pipeline.py +0 -0
  33. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/coverage_parser.py +0 -0
  34. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/dependency_analyzer.py +0 -0
  35. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/__init__.py +0 -0
  36. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/base.py +0 -0
  37. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/csproj_parser.py +0 -0
  38. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/dart.py +0 -0
  39. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/dotnet.py +0 -0
  40. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/elixir.py +0 -0
  41. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/go.py +0 -0
  42. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/heuristic.py +0 -0
  43. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/hybrid.py +0 -0
  44. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/java.py +0 -0
  45. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/jvm_ext.py +0 -0
  46. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/nodejs.py +0 -0
  47. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/parsers.py +0 -0
  48. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/php.py +0 -0
  49. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/project.py +0 -0
  50. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/python.py +0 -0
  51. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/ruby.py +0 -0
  52. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/rust.py +0 -0
  53. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/systems.py +0 -0
  54. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/terraform.py +0 -0
  55. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/detectors/tooling.py +0 -0
  56. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/doc_analyzer.py +0 -0
  57. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/entrypoint_classifier.py +0 -0
  58. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/env_analyzer.py +0 -0
  59. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/file_classifier.py +0 -0
  60. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/flow_analyzer.py +0 -0
  61. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/git_analyzer.py +0 -0
  62. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/graph_analyzer.py +0 -0
  63. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/metrics_analyzer.py +0 -0
  64. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/progress.py +0 -0
  65. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/ranking_engine.py +0 -0
  66. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/redactor.py +0 -0
  67. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/relevance_scorer.py +0 -0
  68. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/repo_classifier.py +0 -0
  69. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/runtime_classifier.py +0 -0
  70. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/scanner.py +0 -0
  71. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/schema.py +0 -0
  72. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/semantic_analyzer.py +0 -0
  73. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/serializer.py +0 -0
  74. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/summarizer.py +0 -0
  75. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/__init__.py +0 -0
  76. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/config.py +0 -0
  77. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/consent.py +0 -0
  78. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/events.py +0 -0
  79. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/filters.py +0 -0
  80. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/telemetry/transport.py +0 -0
  81. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/tree_utils.py +0 -0
  82. {sourcecode-1.30.9 → sourcecode-1.30.11}/src/sourcecode/workspace.py +0 -0
  83. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/__init__.py +0 -0
  84. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/conftest.py +0 -0
  85. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/coverage.xml +0 -0
  86. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  87. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/fastapi_app/src/main.py +0 -0
  88. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  89. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/go_service/go.mod +0 -0
  90. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/jacoco.xml +0 -0
  91. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/latin1_sample.java +0 -0
  92. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/latin1_sample_iso.java +0 -0
  93. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/lcov.info +0 -0
  94. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  95. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/package.json +0 -0
  96. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  97. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  98. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  99. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  100. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  101. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  102. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  103. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  104. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  105. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  106. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  107. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  108. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  109. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  110. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  111. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  112. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  113. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  114. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  115. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  116. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  117. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  118. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  119. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  120. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  121. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  122. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  123. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  124. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  125. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  126. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  127. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  128. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  129. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_architecture_analyzer.py +0 -0
  130. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_architecture_summary.py +0 -0
  131. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_ast_extractor.py +0 -0
  132. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block1_reliability.py +0 -0
  133. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block2_coverage.py +0 -0
  134. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_block5_quality.py +0 -0
  135. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_bug_fixes_v16.py +0 -0
  136. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_classifier.py +0 -0
  137. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_cli.py +0 -0
  138. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_code_notes_analyzer.py +0 -0
  139. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_context_scorer.py +0 -0
  140. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_contract_pipeline.py +0 -0
  141. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_coverage_parser.py +0 -0
  142. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_cross_consistency.py +0 -0
  143. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_analyzer_node_python.py +0 -0
  144. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_analyzer_polyglot.py +0 -0
  145. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_dependency_schema.py +0 -0
  146. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_dotnet.py +0 -0
  147. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_go_rust_java.py +0 -0
  148. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_nodejs.py +0 -0
  149. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_php_ruby_dart.py +0 -0
  150. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_python.py +0 -0
  151. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_universal_managed.py +0 -0
  152. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detector_universal_systems.py +0 -0
  153. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_detectors_base.py +0 -0
  154. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_doc_analyzer_jsdom.py +0 -0
  155. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_doc_analyzer_python.py +0 -0
  156. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_encoding_regression.py +0 -0
  157. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_analyzer_polyglot.py +0 -0
  158. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_analyzer_python_node.py +0 -0
  159. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_graph_schema.py +0 -0
  160. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_hybrid_inference.py +0 -0
  161. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration.py +0 -0
  162. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_dependencies.py +0 -0
  163. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_detection.py +0 -0
  164. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_docs.py +0 -0
  165. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_graph_modules.py +0 -0
  166. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_lqn.py +0 -0
  167. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_metrics.py +0 -0
  168. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_multistack.py +0 -0
  169. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_semantics.py +0 -0
  170. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_integration_universal.py +0 -0
  171. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_java_spring_integration.py +0 -0
  172. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_metrics_analyzer.py +0 -0
  173. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_packaging.py +0 -0
  174. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_phase1_improvements.py +0 -0
  175. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_pipeline_integrity.py +0 -0
  176. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_real_projects.py +0 -0
  177. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_redactor.py +0 -0
  178. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_scanner.py +0 -0
  179. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_schema.py +0 -0
  180. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_schema_normalization.py +0 -0
  181. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_analyzer_node.py +0 -0
  182. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_analyzer_python.py +0 -0
  183. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_import_resolution.py +0 -0
  184. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_semantic_schema.py +0 -0
  185. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_signal_hierarchy.py +0 -0
  186. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_summarizer.py +0 -0
  187. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_surface_honesty.py +0 -0
  188. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_task_differentiation.py +0 -0
  189. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_telemetry.py +0 -0
  190. {sourcecode-1.30.9 → sourcecode-1.30.11}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.30.9
3
+ Version: 1.30.11
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
  **Deterministic, behavior-aware codebase context for AI agents and PR review.**
223
223
 
224
- ![Version](https://img.shields.io/badge/version-1.30.9-blue)
224
+ ![Version](https://img.shields.io/badge/version-1.30.11-blue)
225
225
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
226
226
 
227
227
  ---
@@ -257,7 +257,7 @@ pipx install sourcecode
257
257
 
258
258
  ```bash
259
259
  sourcecode version
260
- # sourcecode 1.30.9
260
+ # sourcecode 1.30.11
261
261
  ```
262
262
 
263
263
  ---
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Deterministic, behavior-aware codebase context for AI agents and PR review.**
4
4
 
5
- ![Version](https://img.shields.io/badge/version-1.30.9-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.30.11-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -38,7 +38,7 @@ pipx install sourcecode
38
38
 
39
39
  ```bash
40
40
  sourcecode version
41
- # sourcecode 1.30.9
41
+ # sourcecode 1.30.11
42
42
  ```
43
43
 
44
44
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.30.9"
7
+ version = "1.30.11"
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.30.9"
3
+ __version__ = "1.30.11"
@@ -1400,9 +1400,8 @@ def main(
1400
1400
  if _gc_early and not (_bad_gc & set(_gc_early.limitations)):
1401
1401
  _uc = _gc_early.uncommitted_changes
1402
1402
  if _uc:
1403
- _allowed_changed_files = (
1404
- set(_uc.staged) | set(_uc.unstaged) | set(_uc.untracked)
1405
- )
1403
+ # WORKTREE_UNSTAGED + WORKTREE_STAGED only; untracked excluded
1404
+ _allowed_changed_files = set(_uc.staged) | set(_uc.unstaged)
1406
1405
  if not _allowed_changed_files:
1407
1406
  typer.echo(
1408
1407
  "[changed-only] git unavailable or no uncommitted changes — falling back to full scan.",
@@ -14,10 +14,19 @@ Each task produces a focused context bundle:
14
14
  from __future__ import annotations
15
15
 
16
16
  from dataclasses import dataclass, field
17
+ from enum import Enum
17
18
  from pathlib import Path
18
19
  from typing import Any, Optional
19
20
 
20
21
 
22
+ class DiffSourceType(str, Enum):
23
+ """Explicit diff scope — never auto-merged, never implicit."""
24
+ WORKTREE_UNSTAGED = "WORKTREE_UNSTAGED" # git diff (no ref)
25
+ WORKTREE_STAGED = "WORKTREE_STAGED" # git diff --cached
26
+ GIT_SINCE_REF = "GIT_SINCE_REF" # git diff ref HEAD
27
+ GIT_RANGE = "GIT_RANGE" # git diff refA refB
28
+
29
+
21
30
  # ─────────────────────────────────────────────────────────────────────────────
22
31
  # Prompt templates
23
32
  # ─────────────────────────────────────────────────────────────────────────────
@@ -360,6 +369,11 @@ class TaskOutput:
360
369
  # honest output schema (review-pr only): runtime vs build split
361
370
  runtime_changes: list[dict] = field(default_factory=list)
362
371
  build_changes: dict = field(default_factory=dict)
372
+ # review-pr: committed vs uncommitted — never merged
373
+ committed_changes: list[dict] = field(default_factory=list)
374
+ uncommitted_changes: list[dict] = field(default_factory=list)
375
+ # transparency: explicit diff scope for every command
376
+ analysis_scope: dict = field(default_factory=dict)
363
377
 
364
378
 
365
379
  # ─────────────────────────────────────────────────────────────────────────────
@@ -406,7 +420,10 @@ def _java_why(path: str, file_class: "Optional[object]") -> str:
406
420
  if category == "data_access":
407
421
  return f"SQL queries for {domain} data access" if domain else "Data access layer"
408
422
  if category == "domain_model":
409
- return f"JPA entity for {class_name} persistence"
423
+ ev = _read_persistence_evidence(Path(path).parent.parent, path)
424
+ if ev:
425
+ return f"JPA entity for {class_name} persistence"
426
+ return f"Domain model — {class_name} (no persistence annotation detected)"
410
427
  if category == "configuration":
411
428
  return getattr(file_class, "reason", "Spring configuration class")
412
429
  if category == "security":
@@ -590,7 +607,8 @@ class TaskContextBuilder:
590
607
  scope_source="full_scan_fallback",
591
608
  repo_root=str(self.root),
592
609
  )
593
- _raw_scope, _pr_scope_source = self._get_pr_scope_files(since=since)
610
+ _raw_scope, _pr_scope_source, _pr_committed_files, _pr_uncommitted_files = \
611
+ self._get_pr_scope_files(since=since)
594
612
  if _raw_scope is None:
595
613
  # Explicit --since ref is invalid
596
614
  _avail_pr, _sug_pr = self._get_available_refs(since or "")
@@ -957,6 +975,10 @@ class TaskContextBuilder:
957
975
  _pr_base_ref: Optional[str] = None
958
976
  _pr_runtime_changes: list[dict] = []
959
977
  _pr_build_changes: dict = {}
978
+ _pr_committed_changes: list[dict] = []
979
+ _pr_uncommitted_changes: list[dict] = []
980
+ _pr_committed_files: list[str] = []
981
+ _pr_uncommitted_files: list[str] = []
960
982
 
961
983
  if task_name == "review-pr":
962
984
  _pr_base_ref = since or "HEAD"
@@ -1038,9 +1060,14 @@ class TaskContextBuilder:
1038
1060
  _seen_order.add(_f)
1039
1061
 
1040
1062
  # Build runtime_changes and build_changes — honest split, no score numbers
1063
+ # Also track committed vs uncommitted — NEVER merged
1041
1064
  _pr_runtime_changes: list[dict] = []
1065
+ _pr_committed_changes: list[dict] = []
1066
+ _pr_uncommitted_changes: list[dict] = []
1042
1067
  _pr_build_changes: dict = {}
1043
1068
  _build_artifact_files: list[str] = []
1069
+ _committed_set: set[str] = set(_pr_committed_files) if task_name == "review-pr" else set()
1070
+ _uncommitted_set: set[str] = set(_pr_uncommitted_files) if task_name == "review-pr" else set()
1044
1071
 
1045
1072
  _SCORE_TO_CONFIDENCE = {
1046
1073
  "high": lambda s: s >= 0.60,
@@ -1106,8 +1133,14 @@ class TaskContextBuilder:
1106
1133
  # File confidence: replaces numeric score
1107
1134
  _impact_s = _delta_impact_score_per_file.get(_f, 0.45)
1108
1135
  _f_conf = "high" if _impact_s >= 0.60 else ("medium" if _impact_s >= 0.40 else "low")
1109
- _pr_runtime_changes.append({
1136
+ _diff_source = (
1137
+ DiffSourceType.GIT_RANGE.value if _f in _committed_set
1138
+ else DiffSourceType.WORKTREE_UNSTAGED.value if _f in _uncommitted_set
1139
+ else "unknown"
1140
+ )
1141
+ _entry = {
1110
1142
  "path": _f,
1143
+ "diff_source": _diff_source,
1111
1144
  "role": _role_obj,
1112
1145
  "confidence": _f_conf,
1113
1146
  "artifact_type": _f_atype,
@@ -1117,7 +1150,13 @@ class TaskContextBuilder:
1117
1150
  "truth_level": "inferred",
1118
1151
  "confidence": _role_obj["confidence"],
1119
1152
  },
1120
- })
1153
+ }
1154
+ _pr_runtime_changes.append(_entry)
1155
+ # Split committed vs uncommitted — never merged
1156
+ if _f in _committed_set:
1157
+ _pr_committed_changes.append(_entry)
1158
+ elif _f in _uncommitted_set:
1159
+ _pr_uncommitted_changes.append(_entry)
1121
1160
 
1122
1161
  if _build_artifact_files:
1123
1162
  _pr_build_changes = {
@@ -1383,6 +1422,25 @@ class TaskContextBuilder:
1383
1422
  # honest output schema: runtime vs build split (review-pr only)
1384
1423
  runtime_changes=_pr_runtime_changes,
1385
1424
  build_changes=_pr_build_changes,
1425
+ # committed vs uncommitted — never merged
1426
+ committed_changes=_pr_committed_changes,
1427
+ uncommitted_changes=_pr_uncommitted_changes,
1428
+ # transparency: explicit diff scope
1429
+ analysis_scope={
1430
+ "sources_used": _pr_scope_source.split(",") if task_name == "review-pr" and _pr_scope_source else (
1431
+ [DiffSourceType.GIT_SINCE_REF.value] if task_name == "delta" and since else
1432
+ [DiffSourceType.WORKTREE_UNSTAGED.value] if task_name == "delta" else
1433
+ []
1434
+ ),
1435
+ "git_equivalent_command": (
1436
+ f"git diff --name-only {since} HEAD" if since else
1437
+ "git diff --name-only"
1438
+ ) if task_name in ("delta", "review-pr") else None,
1439
+ "includes_uncommitted": bool(
1440
+ (task_name == "review-pr" and _pr_uncommitted_files) or
1441
+ (task_name == "delta" and not since)
1442
+ ),
1443
+ } if task_name in ("delta", "review-pr") else {},
1386
1444
  )
1387
1445
 
1388
1446
  def render_prompt(self, output: TaskOutput) -> str:
@@ -1690,12 +1748,19 @@ class TaskContextBuilder:
1690
1748
  pass
1691
1749
  return None
1692
1750
 
1693
- def _get_pr_scope_files(self, since: Optional[str] = None) -> tuple[Optional[list[str]], str]:
1694
- """Return (files, scope_source) for review-pr scope resolution.
1751
+ def _get_pr_scope_files(
1752
+ self, since: Optional[str] = None
1753
+ ) -> "tuple[Optional[list[str]], str, list[str], list[str]]":
1754
+ """Return (all_files, scope_source, committed_files, uncommitted_files).
1695
1755
 
1696
- Returns (None, _) only when since is explicitly provided but the ref is invalid.
1697
- Returns ([], _) when git is available but no changes are found.
1698
- scope_source is a comma-separated list of active sources (git_diff, staged, untracked).
1756
+ Scopes are NEVER mixed committed and uncommitted tracked separately.
1757
+ Returns (None, _, _, _) only when since is explicitly provided but invalid.
1758
+ Returns ([], _, [], []) when git is available but no changes found.
1759
+
1760
+ DiffSourceType mapping:
1761
+ since given → committed: GIT_RANGE(since, HEAD)
1762
+ no since → committed: [] (no implicit HEAD~1 fallback)
1763
+ always → uncommitted: WORKTREE_UNSTAGED + WORKTREE_STAGED
1699
1764
  """
1700
1765
  import subprocess
1701
1766
 
@@ -1713,55 +1778,44 @@ class TaskContextBuilder:
1713
1778
  except (subprocess.TimeoutExpired, FileNotFoundError):
1714
1779
  return None
1715
1780
 
1716
- files: set[str] = set()
1781
+ committed_files: list[str] = []
1782
+ uncommitted_files: list[str] = []
1717
1783
  sources: list[str] = []
1718
1784
 
1785
+ # ── Committed scope (GIT_RANGE) — only when explicit ref given ──────
1719
1786
  if since is not None:
1720
1787
  committed = _run("git", "diff", "--name-only", "--relative", since, "HEAD")
1721
1788
  if committed is None:
1722
- return None, "git_diff" # invalid ref — hard error
1723
- if committed:
1724
- files.update(committed)
1725
- sources.append("git_diff")
1726
- else:
1727
- # Working tree vs HEAD~1: covers last commit + all uncommitted changes
1728
- h1_diff = _run("git", "diff", "--name-only", "--relative", "HEAD~1")
1729
- if h1_diff:
1730
- files.update(h1_diff)
1731
- sources.append("git_diff")
1732
- # Working tree vs HEAD: uncommitted only (may add new unstaged files)
1733
- h_diff = _run("git", "diff", "--name-only", "--relative", "HEAD")
1734
- if h_diff:
1735
- new = set(h_diff) - files
1736
- if new:
1737
- files.update(new)
1738
- if "git_diff" not in sources:
1739
- sources.append("git_diff")
1740
- # Staged changes not yet committed
1741
- staged = _run("git", "diff", "--name-only", "--cached", "--relative")
1742
- if staged:
1743
- new = set(staged) - files
1744
- if new:
1745
- files.update(new)
1746
- sources.append("staged")
1747
-
1748
- # Untracked files (both cases)
1749
- status = _run("git", "status", "--porcelain", "--short")
1750
- if status:
1751
- for line in status:
1752
- if line.startswith("??") and len(line) > 3:
1753
- f = line[3:].strip()
1754
- if f and not f.endswith("/") and f not in files:
1755
- files.add(f)
1756
- if "untracked" not in sources:
1757
- sources.append("untracked")
1758
-
1759
- # Drop paths outside self.root (../… prefix means above cwd — occurs when
1760
- # self.root is a subdirectory of the git repo and git status shows repo-level files).
1761
- files = {f for f in files if not f.startswith("../") and not f.startswith("..\\")}
1762
-
1763
- scope_source = ",".join(sources) if sources else "git_diff"
1764
- return sorted(files), scope_source
1789
+ return None, "git_diff", [], [] # invalid ref — hard error
1790
+ committed_files = committed
1791
+ if committed_files:
1792
+ sources.append(DiffSourceType.GIT_RANGE.value)
1793
+
1794
+ # ── Uncommitted scope ALWAYS separate, never implicit ──────────────
1795
+ # WORKTREE_UNSTAGED: modified but not staged
1796
+ unstaged = _run("git", "diff", "--name-only", "--relative")
1797
+ if unstaged:
1798
+ uncommitted_files.extend(f for f in unstaged if f not in uncommitted_files)
1799
+ if DiffSourceType.WORKTREE_UNSTAGED.value not in sources:
1800
+ sources.append(DiffSourceType.WORKTREE_UNSTAGED.value)
1801
+
1802
+ # WORKTREE_STAGED: staged, not yet committed
1803
+ staged = _run("git", "diff", "--name-only", "--cached", "--relative")
1804
+ if staged:
1805
+ uncommitted_files.extend(f for f in staged if f not in uncommitted_files)
1806
+ if DiffSourceType.WORKTREE_STAGED.value not in sources:
1807
+ sources.append(DiffSourceType.WORKTREE_STAGED.value)
1808
+
1809
+ # ── Drop paths outside self.root ──────────────────────────────────────
1810
+ def _drop_outside(lst: list[str]) -> list[str]:
1811
+ return [f for f in lst if not f.startswith("../") and not f.startswith("..\\")]
1812
+
1813
+ committed_files = _drop_outside(committed_files)
1814
+ uncommitted_files = _drop_outside(uncommitted_files)
1815
+
1816
+ all_files_set: set[str] = set(committed_files) | set(uncommitted_files)
1817
+ scope_source = ",".join(sources) if sources else "no_changes"
1818
+ return sorted(all_files_set), scope_source, committed_files, uncommitted_files
1765
1819
 
1766
1820
  def _expand_scope_for_analysis(self, scope_files: list[str]) -> list[str]:
1767
1821
  """Add sibling files in the same directories as scope_files (depth=1 expansion).
@@ -1949,44 +2003,9 @@ class TaskContextBuilder:
1949
2003
  if suffix in _CODE_EXTS and any(kw in stem_lower for kw in _DTO_KW):
1950
2004
  return {"artifact_type": "dto", "risk_areas": [], "impact_level": "low", "is_noise": False, "module": module, "confidence": "high"}
1951
2005
 
1952
- # Folder-based disambiguation: check directory path components for layer hints
1953
- # (innermost directory first) before falling back to unclassified source
1954
- _FOLDER_TYPE_MAP: dict[str, tuple[str, list[str], str]] = {
1955
- "controller": ("controller", ["api"], "high"),
1956
- "controllers": ("controller", ["api"], "high"),
1957
- "api": ("controller", ["api"], "high"),
1958
- "web": ("controller", ["api"], "high"),
1959
- "rest": ("controller", ["api"], "high"),
1960
- "resource": ("controller", ["api"], "high"),
1961
- "resources": ("controller", ["api"], "high"),
1962
- "service": ("service", ["transactions", "business_logic"],"high"),
1963
- "services": ("service", ["transactions", "business_logic"],"high"),
1964
- "business": ("service", ["transactions", "business_logic"],"high"),
1965
- "usecase": ("service", ["business_logic"], "high"),
1966
- "usecases": ("service", ["business_logic"], "high"),
1967
- "repository": ("repository", ["persistence"], "high"),
1968
- "repositories": ("repository", ["persistence"], "high"),
1969
- "dao": ("repository", ["persistence"], "high"),
1970
- "persistence": ("repository", ["persistence"], "high"),
1971
- "mapper": ("mapper", ["persistence"], "high"),
1972
- "mappers": ("mapper", ["persistence"], "high"),
1973
- "security": ("security", ["security"], "high"),
1974
- "auth": ("security", ["security"], "high"),
1975
- "config": ("config", ["config"], "medium"),
1976
- "configuration": ("config", ["config"], "medium"),
1977
- "configs": ("config", ["config"], "medium"),
1978
- "domain": ("domain_model", ["persistence"], "medium"),
1979
- "model": ("domain_model", ["persistence"], "medium"),
1980
- "models": ("domain_model", ["persistence"], "medium"),
1981
- "entity": ("domain_model", ["persistence"], "medium"),
1982
- "entities": ("domain_model", ["persistence"], "medium"),
1983
- }
2006
+ # No stem hint matched path/folder components are NOT valid evidence.
2007
+ # Fall through to unclassified source (extension-only, low confidence).
1984
2008
  if suffix in _CODE_EXTS:
1985
- for part in reversed(path_dir_parts): # innermost directory first
1986
- if part in _FOLDER_TYPE_MAP:
1987
- atype, risk_areas, impact_level = _FOLDER_TYPE_MAP[part]
1988
- return {"artifact_type": atype, "risk_areas": risk_areas, "impact_level": impact_level, "is_noise": False, "module": module, "confidence": "medium"}
1989
- # No stem or folder hint matched — last-resort source type (extension-only classification)
1990
2009
  return {"artifact_type": "source", "risk_areas": [], "impact_level": "medium", "is_noise": False, "module": module, "confidence": "low"}
1991
2010
 
1992
2011
  # Generic config / data files — fold into config type
@@ -2957,10 +2976,26 @@ class TaskContextBuilder:
2957
2976
  the scanned file tree.
2958
2977
  """
2959
2978
  import subprocess
2960
- ref = since or "HEAD~1"
2979
+
2980
+ if since is None:
2981
+ # No implicit HEAD~1 fallback — map to WORKTREE_UNSTAGED
2982
+ try:
2983
+ result = subprocess.run(
2984
+ ["git", "diff", "--name-only", "--relative"],
2985
+ cwd=str(self.root),
2986
+ capture_output=True, text=True,
2987
+ encoding="utf-8", errors="replace", timeout=10,
2988
+ )
2989
+ if result.returncode == 0:
2990
+ return [ln.strip() for ln in (result.stdout or "").splitlines() if ln.strip()]
2991
+ except (subprocess.TimeoutExpired, FileNotFoundError):
2992
+ pass
2993
+ return []
2994
+
2995
+ # Explicit since: GIT_SINCE_REF — committed range only, no silent fallback
2961
2996
  try:
2962
2997
  result = subprocess.run(
2963
- ["git", "diff", "--name-only", "--relative", ref, "HEAD"],
2998
+ ["git", "diff", "--name-only", "--relative", since, "HEAD"],
2964
2999
  cwd=str(self.root),
2965
3000
  capture_output=True,
2966
3001
  text=True,
@@ -2973,28 +3008,9 @@ class TaskContextBuilder:
2973
3008
  line.strip() for line in (result.stdout or "").splitlines()
2974
3009
  if line.strip()
2975
3010
  ]
2976
- # Non-zero exit with explicit ref = ref doesn't exist — no silent fallback
2977
- if since:
2978
- return None
3011
+ return None # ref doesn't exist — caller must fail fast
2979
3012
  except (subprocess.TimeoutExpired, FileNotFoundError):
2980
- if since:
2981
- return None
2982
- # No explicit since: fall back to uncommitted changes
2983
- try:
2984
- result = subprocess.run(
2985
- ["git", "diff", "--name-only", "--relative"],
2986
- cwd=str(self.root),
2987
- capture_output=True,
2988
- text=True,
2989
- encoding="utf-8",
2990
- errors="replace",
2991
- timeout=10,
2992
- )
2993
- if result.returncode == 0:
2994
- return [line.strip() for line in (result.stdout or "").splitlines() if line.strip()]
2995
- except (subprocess.TimeoutExpired, FileNotFoundError):
2996
- pass
2997
- return []
3013
+ return None
2998
3014
 
2999
3015
  def _get_available_refs(self, invalid_ref: str) -> tuple[list[str], Optional[str]]:
3000
3016
  """Return (available_branch_names, suggested_alternative) for error hints."""
@@ -556,7 +556,7 @@ class TestReviewPrSuspectedAreas:
556
556
  from pathlib import Path as _Path
557
557
  from sourcecode import prepare_context as _pc
558
558
  monkeypatch.setattr(_pc.TaskContextBuilder, "_resolve_git_root", lambda self: _Path(str(FIXTURE)))
559
- monkeypatch.setattr(_pc.TaskContextBuilder, "_get_pr_scope_files", lambda self, since=None: ([], "git_diff"))
559
+ monkeypatch.setattr(_pc.TaskContextBuilder, "_get_pr_scope_files", lambda self, since=None: ([], "git_diff", [], []))
560
560
  result = _invoke("prepare-context", "review-pr", str(FIXTURE))
561
561
  assert result.exit_code == 1
562
562
  data = _json(result)
@@ -571,7 +571,7 @@ class TestReviewPrSuspectedAreas:
571
571
  monkeypatch.setattr(_pc.TaskContextBuilder, "_resolve_git_root", lambda self: _Path(str(FIXTURE)))
572
572
  monkeypatch.setattr(
573
573
  _pc.TaskContextBuilder, "_get_pr_scope_files",
574
- lambda self, since=None: (_changed, "git_diff"),
574
+ lambda self, since=None: (_changed, "git_diff", _changed, []),
575
575
  )
576
576
  result = _invoke("prepare-context", "review-pr", str(FIXTURE))
577
577
  assert result.exit_code == 0, result.output
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes