sourcecode 1.30.22__tar.gz → 1.30.24__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 (195) hide show
  1. {sourcecode-1.30.22 → sourcecode-1.30.24}/PKG-INFO +3 -3
  2. {sourcecode-1.30.22 → sourcecode-1.30.24}/README.md +2 -2
  3. {sourcecode-1.30.22 → sourcecode-1.30.24}/pyproject.toml +1 -1
  4. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/prepare_context.py +134 -29
  6. {sourcecode-1.30.22 → sourcecode-1.30.24}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  7. {sourcecode-1.30.22 → sourcecode-1.30.24}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  8. {sourcecode-1.30.22 → sourcecode-1.30.24}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  9. {sourcecode-1.30.22 → sourcecode-1.30.24}/.continue-here.md +0 -0
  10. {sourcecode-1.30.22 → sourcecode-1.30.24}/.github/workflows/build-windows.yml +0 -0
  11. {sourcecode-1.30.22 → sourcecode-1.30.24}/.gitignore +0 -0
  12. {sourcecode-1.30.22 → sourcecode-1.30.24}/.ruff.toml +0 -0
  13. {sourcecode-1.30.22 → sourcecode-1.30.24}/CONTRIBUTING.md +0 -0
  14. {sourcecode-1.30.22 → sourcecode-1.30.24}/LICENSE +0 -0
  15. {sourcecode-1.30.22 → sourcecode-1.30.24}/SECURITY.md +0 -0
  16. {sourcecode-1.30.22 → sourcecode-1.30.24}/docs/privacy.md +0 -0
  17. {sourcecode-1.30.22 → sourcecode-1.30.24}/docs/schema.md +0 -0
  18. {sourcecode-1.30.22 → sourcecode-1.30.24}/raw +0 -0
  19. {sourcecode-1.30.22 → sourcecode-1.30.24}/run_cli.py +0 -0
  20. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/adaptive_scanner.py +0 -0
  21. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/architecture_analyzer.py +0 -0
  22. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/architecture_summary.py +0 -0
  23. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/ast_extractor.py +0 -0
  24. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/classifier.py +0 -0
  25. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/cli.py +0 -0
  26. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/code_notes_analyzer.py +0 -0
  27. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/confidence_analyzer.py +0 -0
  28. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/context_scorer.py +0 -0
  29. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/context_summarizer.py +0 -0
  30. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/contract_model.py +0 -0
  31. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/contract_pipeline.py +0 -0
  32. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/coverage_parser.py +0 -0
  33. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/dependency_analyzer.py +0 -0
  34. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/__init__.py +0 -0
  35. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/base.py +0 -0
  36. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/csproj_parser.py +0 -0
  37. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/dart.py +0 -0
  38. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/dotnet.py +0 -0
  39. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/elixir.py +0 -0
  40. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/go.py +0 -0
  41. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/heuristic.py +0 -0
  42. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/hybrid.py +0 -0
  43. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/java.py +0 -0
  44. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/jvm_ext.py +0 -0
  45. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/nodejs.py +0 -0
  46. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/parsers.py +0 -0
  47. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/php.py +0 -0
  48. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/project.py +0 -0
  49. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/python.py +0 -0
  50. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/ruby.py +0 -0
  51. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/rust.py +0 -0
  52. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/systems.py +0 -0
  53. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/terraform.py +0 -0
  54. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/detectors/tooling.py +0 -0
  55. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/doc_analyzer.py +0 -0
  56. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/entrypoint_classifier.py +0 -0
  57. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/env_analyzer.py +0 -0
  58. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/file_classifier.py +0 -0
  59. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/flow_analyzer.py +0 -0
  60. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/git_analyzer.py +0 -0
  61. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/graph_analyzer.py +0 -0
  62. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/metrics_analyzer.py +0 -0
  63. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/pr_comment_renderer.py +0 -0
  64. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/progress.py +0 -0
  65. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/ranking_engine.py +0 -0
  66. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/redactor.py +0 -0
  67. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/relevance_scorer.py +0 -0
  68. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/repo_classifier.py +0 -0
  69. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/repository_ir.py +0 -0
  70. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/runtime_classifier.py +0 -0
  71. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/scanner.py +0 -0
  72. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/schema.py +0 -0
  73. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/semantic_analyzer.py +0 -0
  74. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/serializer.py +0 -0
  75. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/summarizer.py +0 -0
  76. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/__init__.py +0 -0
  77. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/config.py +0 -0
  78. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/consent.py +0 -0
  79. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/events.py +0 -0
  80. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/filters.py +0 -0
  81. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/telemetry/transport.py +0 -0
  82. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/tree_utils.py +0 -0
  83. {sourcecode-1.30.22 → sourcecode-1.30.24}/src/sourcecode/workspace.py +0 -0
  84. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/__init__.py +0 -0
  85. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/conftest.py +0 -0
  86. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/coverage.xml +0 -0
  87. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  88. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/fastapi_app/src/main.py +0 -0
  89. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  90. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/go_service/go.mod +0 -0
  91. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/jacoco.xml +0 -0
  92. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/latin1_sample.java +0 -0
  93. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/latin1_sample_iso.java +0 -0
  94. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/lcov.info +0 -0
  95. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  96. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/nextjs_app/package.json +0 -0
  97. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  98. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  99. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  100. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  101. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  102. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  103. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  104. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  105. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  106. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  107. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  108. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  109. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  110. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  111. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  112. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  113. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  114. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  115. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  116. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  117. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  118. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  119. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  120. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  121. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  122. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  123. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  124. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  125. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  126. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  127. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  128. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  129. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  130. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_architecture_analyzer.py +0 -0
  131. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_architecture_summary.py +0 -0
  132. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_ast_extractor.py +0 -0
  133. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_block1_reliability.py +0 -0
  134. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_block2_coverage.py +0 -0
  135. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_block5_quality.py +0 -0
  136. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_bug_fixes_v16.py +0 -0
  137. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_classifier.py +0 -0
  138. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_cli.py +0 -0
  139. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_code_notes_analyzer.py +0 -0
  140. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_context_scorer.py +0 -0
  141. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_contract_pipeline.py +0 -0
  142. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_coverage_parser.py +0 -0
  143. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_cross_consistency.py +0 -0
  144. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_dependency_analyzer_node_python.py +0 -0
  145. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_dependency_analyzer_polyglot.py +0 -0
  146. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_dependency_schema.py +0 -0
  147. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_dotnet.py +0 -0
  148. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_go_rust_java.py +0 -0
  149. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_nodejs.py +0 -0
  150. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_php_ruby_dart.py +0 -0
  151. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_python.py +0 -0
  152. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_universal_managed.py +0 -0
  153. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detector_universal_systems.py +0 -0
  154. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_detectors_base.py +0 -0
  155. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_doc_analyzer_jsdom.py +0 -0
  156. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_doc_analyzer_python.py +0 -0
  157. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_encoding_regression.py +0 -0
  158. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_graph_analyzer_polyglot.py +0 -0
  159. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_graph_analyzer_python_node.py +0 -0
  160. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_graph_schema.py +0 -0
  161. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_hybrid_inference.py +0 -0
  162. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration.py +0 -0
  163. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_dependencies.py +0 -0
  164. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_detection.py +0 -0
  165. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_docs.py +0 -0
  166. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_graph_modules.py +0 -0
  167. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_lqn.py +0 -0
  168. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_metrics.py +0 -0
  169. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_multistack.py +0 -0
  170. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_semantics.py +0 -0
  171. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_integration_universal.py +0 -0
  172. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_java_spring_integration.py +0 -0
  173. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_metrics_analyzer.py +0 -0
  174. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_output_ux.py +0 -0
  175. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_packaging.py +0 -0
  176. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_phase1_improvements.py +0 -0
  177. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_pipeline_integrity.py +0 -0
  178. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_real_projects.py +0 -0
  179. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_redactor.py +0 -0
  180. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_repository_ir.py +0 -0
  181. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_scanner.py +0 -0
  182. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_schema.py +0 -0
  183. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_schema_normalization.py +0 -0
  184. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_semantic_analyzer_node.py +0 -0
  185. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_semantic_analyzer_python.py +0 -0
  186. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_semantic_import_resolution.py +0 -0
  187. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_semantic_schema.py +0 -0
  188. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_signal_hierarchy.py +0 -0
  189. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_summarizer.py +0 -0
  190. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_surface_honesty.py +0 -0
  191. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_task_differentiation.py +0 -0
  192. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_telemetry.py +0 -0
  193. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_v131_improvements.py +0 -0
  194. {sourcecode-1.30.22 → sourcecode-1.30.24}/tests/test_v1_10_regressions.py +0 -0
  195. {sourcecode-1.30.22 → sourcecode-1.30.24}/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.22
3
+ Version: 1.30.24
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.22-blue)
224
+ ![Version](https://img.shields.io/badge/version-1.30.24-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.22
260
+ # sourcecode 1.30.24
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.22-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.30.24-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.22
41
+ # sourcecode 1.30.24
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.22"
7
+ version = "1.30.24"
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.22"
3
+ __version__ = "1.30.24"
@@ -25,6 +25,7 @@ class DiffSourceType(str, Enum):
25
25
  WORKTREE_STAGED = "WORKTREE_STAGED" # git diff --cached
26
26
  GIT_SINCE_REF = "GIT_SINCE_REF" # git diff ref HEAD
27
27
  GIT_RANGE = "GIT_RANGE" # git diff refA refB
28
+ HEAD_MINUS_1 = "HEAD_MINUS_1" # git diff HEAD~1 HEAD (auto-fallback when tree clean)
28
29
 
29
30
 
30
31
  # ─────────────────────────────────────────────────────────────────────────────
@@ -601,6 +602,83 @@ _FRONTEND_SYMPTOM_MAP: dict[str, list[str]] = {
601
602
  }
602
603
 
603
604
 
605
+ def _build_analysis_scope(
606
+ *,
607
+ task_name: str,
608
+ since: Optional[str],
609
+ delta_baseline: dict,
610
+ pr_scope_source: str,
611
+ pr_uncommitted_files: list,
612
+ ) -> dict:
613
+ """Build analysis_scope metadata from actual git resolution — never hardcoded."""
614
+ if task_name == "review-pr":
615
+ sources = pr_scope_source.split(",") if pr_scope_source else []
616
+ # Derive git_equivalent_command from sources
617
+ cmds: list[str] = []
618
+ if DiffSourceType.GIT_RANGE.value in sources or DiffSourceType.GIT_SINCE_REF.value in sources:
619
+ cmds.append(f"git diff --name-only {since} HEAD")
620
+ if DiffSourceType.HEAD_MINUS_1.value in sources:
621
+ cmds.append("git diff --name-only HEAD~1 HEAD")
622
+ if DiffSourceType.WORKTREE_UNSTAGED.value in sources:
623
+ cmds.append("git diff --name-only")
624
+ if DiffSourceType.WORKTREE_STAGED.value in sources:
625
+ cmds.append("git diff --name-only --cached")
626
+ git_cmd = " + ".join(cmds) if cmds else "git diff --name-only"
627
+ return {
628
+ "sources_used": sources,
629
+ "git_equivalent_command": git_cmd,
630
+ "includes_uncommitted": bool(pr_uncommitted_files),
631
+ "git_resolution": {
632
+ "source_of_truth": "RANGE" if since else (
633
+ "HEAD" if DiffSourceType.HEAD_MINUS_1.value in sources else "WORKTREE"
634
+ ),
635
+ "resolved_diff_strategy": pr_scope_source,
636
+ "commit_count_analyzed": 1 if DiffSourceType.HEAD_MINUS_1.value in sources else (
637
+ 0 if not since else None
638
+ ),
639
+ },
640
+ }
641
+
642
+ # delta
643
+ rpath = delta_baseline.get("resolution_path", "")
644
+ rref = delta_baseline.get("resolved_ref", "HEAD")
645
+
646
+ _COMMITTED_PATHS = {"exact_local_ref", "remote_tracking_ref", "symbolic_ref"}
647
+ if rpath in _COMMITTED_PATHS:
648
+ sources = [DiffSourceType.GIT_SINCE_REF.value]
649
+ git_cmd = f"git diff --name-only {rref} HEAD"
650
+ source_of_truth = "RANGE"
651
+ includes_uncommitted = False
652
+ elif rpath == "head_minus_1_fallback":
653
+ sources = [DiffSourceType.HEAD_MINUS_1.value]
654
+ git_cmd = "git diff --name-only HEAD~1 HEAD"
655
+ source_of_truth = "HEAD"
656
+ includes_uncommitted = False
657
+ elif rpath == "uncommitted_staged":
658
+ sources = [DiffSourceType.WORKTREE_STAGED.value]
659
+ git_cmd = "git diff --name-only --cached"
660
+ source_of_truth = "STAGED"
661
+ includes_uncommitted = True
662
+ else: # uncommitted_unstaged, uncommitted_changes, no_changes_confirmed
663
+ sources = [DiffSourceType.WORKTREE_UNSTAGED.value]
664
+ git_cmd = "git diff --name-only"
665
+ source_of_truth = "WORKTREE"
666
+ includes_uncommitted = True
667
+
668
+ return {
669
+ "sources_used": sources,
670
+ "git_equivalent_command": git_cmd,
671
+ "includes_uncommitted": includes_uncommitted,
672
+ "git_resolution": {
673
+ "source_of_truth": source_of_truth,
674
+ "resolved_diff_strategy": rpath or "unknown",
675
+ "commit_count_analyzed": 1 if rpath == "head_minus_1_fallback" else (
676
+ 0 if rpath == "no_changes_confirmed" else None
677
+ ),
678
+ },
679
+ }
680
+
681
+
604
682
  class TaskContextBuilder:
605
683
  def __init__(self, root: Path) -> None:
606
684
  self.root = root
@@ -870,9 +948,11 @@ class TaskContextBuilder:
870
948
  # For delta task, relevant_files must rank only files changed in the
871
949
  # specified git range, not the full repo by generic entrypoint scoring.
872
950
  _delta_files: Optional[set[str]] = None
951
+ _delta_baseline: dict = {} # resolution metadata threaded into analysis_scope
873
952
  if task_name == "delta":
874
- _delta_raw = self._get_git_changed_files(since=since)
875
- if _delta_raw is None:
953
+ _baseline = self._resolve_git_baseline(since=since)
954
+ _delta_baseline = _baseline
955
+ if _baseline["error"]:
876
956
  # Explicit --since ref couldn't be resolved — hard error, no fallback
877
957
  _avail_branches, _suggested = self._get_available_refs(since or "")
878
958
  _hints: list[str] = []
@@ -899,8 +979,11 @@ class TaskContextBuilder:
899
979
  error_hints=_hints,
900
980
  gaps=[f"Cannot compute delta: git ref '{since}' not found."] + _hints,
901
981
  ci_decision="git_ref_error",
982
+ resolution_path=_baseline.get("resolution_path"),
983
+ diff_validation_status=_baseline.get("diff_validation_status"),
902
984
  )
903
- elif _delta_raw:
985
+ _delta_raw = _baseline["files"]
986
+ if _delta_raw:
904
987
  _delta_files = set(_delta_raw)
905
988
 
906
989
  # ── 5d. review-pr: set _delta_files from pre-resolved git scope ──────────
@@ -1005,8 +1088,12 @@ class TaskContextBuilder:
1005
1088
  _pr_build_changes: dict = {}
1006
1089
  _pr_committed_changes: list[dict] = []
1007
1090
  _pr_uncommitted_changes: list[dict] = []
1008
- _pr_committed_files: list[str] = []
1009
- _pr_uncommitted_files: list[str] = []
1091
+ # Only default these for non-review-pr tasks — review-pr already set them
1092
+ # at line 714 via _get_pr_scope_files. Re-initializing here would shadow
1093
+ # those values and make _committed_set/_uncommitted_set always empty.
1094
+ if task_name != "review-pr":
1095
+ _pr_committed_files: list[str] = []
1096
+ _pr_uncommitted_files: list[str] = []
1010
1097
 
1011
1098
  if task_name == "review-pr":
1012
1099
  _pr_base_ref = since or "HEAD"
@@ -1515,7 +1602,11 @@ class TaskContextBuilder:
1515
1602
  changed_files: list[str] = []
1516
1603
  affected_entry_points: list[str] = []
1517
1604
  if task_name in ("delta", "review-pr"):
1518
- changed_files = sorted(_delta_files) if _delta_files else (self._get_git_changed_files(since=since) or [])
1605
+ # For delta: _delta_files already resolved via _resolve_git_baseline no second git call.
1606
+ # For review-pr: _get_git_changed_files fallback still valid as last resort.
1607
+ changed_files = sorted(_delta_files) if _delta_files else (
1608
+ [] if task_name == "delta" else (self._get_git_changed_files(since=since) or [])
1609
+ )
1519
1610
  _ep_set = {ep.path for ep in entry_points}
1520
1611
  # include framework-detected entry points AND files classified as
1521
1612
  # entrypoint/controller/security by artifact taxonomy
@@ -1582,21 +1673,16 @@ class TaskContextBuilder:
1582
1673
  committed_changes=_pr_committed_changes,
1583
1674
  uncommitted_changes=_pr_uncommitted_changes,
1584
1675
  # transparency: explicit diff scope
1585
- analysis_scope={
1586
- "sources_used": _pr_scope_source.split(",") if task_name == "review-pr" and _pr_scope_source else (
1587
- [DiffSourceType.GIT_SINCE_REF.value] if task_name == "delta" and since else
1588
- [DiffSourceType.WORKTREE_UNSTAGED.value] if task_name == "delta" else
1589
- []
1590
- ),
1591
- "git_equivalent_command": (
1592
- f"git diff --name-only {since} HEAD" if since else
1593
- "git diff --name-only"
1594
- ) if task_name in ("delta", "review-pr") else None,
1595
- "includes_uncommitted": bool(
1596
- (task_name == "review-pr" and _pr_uncommitted_files) or
1597
- (task_name == "delta" and not since)
1598
- ),
1599
- } if task_name in ("delta", "review-pr") else {},
1676
+ analysis_scope=_build_analysis_scope(
1677
+ task_name=task_name,
1678
+ since=since,
1679
+ delta_baseline=_delta_baseline,
1680
+ pr_scope_source=_pr_scope_source,
1681
+ pr_uncommitted_files=_pr_uncommitted_files,
1682
+ ) if task_name in ("delta", "review-pr") else {},
1683
+ resolved_since_ref=_delta_baseline.get("resolved_ref") if task_name == "delta" else None,
1684
+ resolution_path=_delta_baseline.get("resolution_path") if task_name == "delta" else None,
1685
+ diff_validation_status=_delta_baseline.get("diff_validation_status") if task_name == "delta" else None,
1600
1686
  )
1601
1687
 
1602
1688
  def render_prompt(self, output: TaskOutput) -> str:
@@ -1915,8 +2001,8 @@ class TaskContextBuilder:
1915
2001
 
1916
2002
  DiffSourceType mapping:
1917
2003
  since given → committed: GIT_RANGE(since, HEAD)
1918
- no since → committed: [] (no implicit HEAD~1 fallback)
1919
- always uncommitted: WORKTREE_UNSTAGED + WORKTREE_STAGED
2004
+ no since → uncommitted: WORKTREE_UNSTAGED + WORKTREE_STAGED
2005
+ no since + clean tree committed: HEAD_MINUS_1 (auto-fallback)
1920
2006
  """
1921
2007
  import subprocess
1922
2008
 
@@ -1962,6 +2048,17 @@ class TaskContextBuilder:
1962
2048
  if DiffSourceType.WORKTREE_STAGED.value not in sources:
1963
2049
  sources.append(DiffSourceType.WORKTREE_STAGED.value)
1964
2050
 
2051
+ # ── HEAD~1 fallback — working tree clean, surface last commit ────────
2052
+ # Without --since: if no unstaged/staged changes exist, fall back to the
2053
+ # last committed diff so a clean tree never silently returns no_changes.
2054
+ if since is None and not committed_files and not uncommitted_files:
2055
+ head_ok = _run("git", "rev-parse", "--verify", "HEAD~1")
2056
+ if head_ok is not None: # HEAD~1 exists
2057
+ head_committed = _run("git", "diff", "--name-only", "--relative", "HEAD~1", "HEAD")
2058
+ if head_committed:
2059
+ committed_files = head_committed
2060
+ sources.append(DiffSourceType.HEAD_MINUS_1.value)
2061
+
1965
2062
  # ── Drop paths outside self.root ──────────────────────────────────────
1966
2063
  def _drop_outside(lst: list[str]) -> list[str]:
1967
2064
  return [f for f in lst if not f.startswith("../") and not f.startswith("..\\")]
@@ -3164,25 +3261,33 @@ class TaskContextBuilder:
3164
3261
  }
3165
3262
 
3166
3263
  else:
3167
- # No since: uncommitted changes first
3264
+ # No since: unstaged staged → HEAD~1 — never error, clean tree is valid
3168
3265
  ok, out = _run("diff", "--name-only", "--relative", timeout=10)
3169
3266
  if ok:
3170
3267
  files = [line.strip() for line in out.splitlines() if line.strip()]
3171
3268
  if files:
3172
- return _make(files, "HEAD", "uncommitted_changes")
3269
+ return _make(files, "HEAD", "uncommitted_unstaged")
3270
+
3271
+ # Staged (committed to index but not yet to history)
3272
+ ok, out = _run("diff", "--name-only", "--cached", "--relative", timeout=10)
3273
+ if ok:
3274
+ files = [line.strip() for line in out.splitlines() if line.strip()]
3275
+ if files:
3276
+ return _make(files, "HEAD", "uncommitted_staged")
3173
3277
 
3174
- # HEAD~1 fallback
3278
+ # HEAD~1 fallback — working tree clean, surface last commit
3175
3279
  if _verify("HEAD~1"):
3176
3280
  files = _diff("HEAD~1")
3177
3281
  if files is not None:
3178
3282
  return _make(files or [], "HEAD~1", "head_minus_1_fallback")
3179
3283
 
3284
+ # Confirmed no changes: first commit or empty repo
3180
3285
  return {
3181
3286
  "files": [],
3182
3287
  "resolved_ref": "HEAD",
3183
- "resolution_path": "unresolvable",
3184
- "diff_validation_status": "invalid_ref",
3185
- "error": True,
3288
+ "resolution_path": "no_changes_confirmed",
3289
+ "diff_validation_status": "valid_empty",
3290
+ "error": False,
3186
3291
  }
3187
3292
 
3188
3293
  def _get_uncommitted_changed_files(self) -> list[str]:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes