sourcecode 4.5.1__tar.gz → 4.5.3__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 (215) hide show
  1. {sourcecode-4.5.1 → sourcecode-4.5.3}/CHANGELOG.md +145 -0
  2. sourcecode-4.5.3/CLAUDE.md +74 -0
  3. {sourcecode-4.5.1 → sourcecode-4.5.3}/CONTRIBUTING.md +56 -0
  4. {sourcecode-4.5.1 → sourcecode-4.5.3}/PKG-INFO +4 -4
  5. {sourcecode-4.5.1 → sourcecode-4.5.3}/README.md +3 -3
  6. {sourcecode-4.5.1 → sourcecode-4.5.3}/pyproject.toml +1 -1
  7. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/__init__.py +1 -1
  8. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ast_extractor.py +1 -1
  9. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cli.py +555 -362
  10. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/client_calls.py +5 -2
  11. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_init.py +56 -15
  12. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/data_exposure.py +31 -2
  13. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/release_info.py +1 -1
  14. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/remedies.py +17 -0
  15. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ris.py +27 -17
  16. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_config_scan.py +19 -4
  17. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/servlet_surface.py +8 -2
  18. sourcecode-4.5.3/src/sourcecode/source_text.py +103 -0
  19. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/token_estimate.py +1 -1
  20. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_edit.py +2 -2
  21. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_repo.py +2 -1
  22. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_rules.py +32 -12
  23. {sourcecode-4.5.1 → sourcecode-4.5.3}/.github/workflows/build-windows.yml +0 -0
  24. {sourcecode-4.5.1 → sourcecode-4.5.3}/.gitignore +0 -0
  25. {sourcecode-4.5.1 → sourcecode-4.5.3}/.ruff.toml +0 -0
  26. {sourcecode-4.5.1 → sourcecode-4.5.3}/LICENSE +0 -0
  27. {sourcecode-4.5.1 → sourcecode-4.5.3}/SECURITY.md +0 -0
  28. {sourcecode-4.5.1 → sourcecode-4.5.3}/raw +0 -0
  29. {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/compare_integration_engines.py +0 -0
  30. {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/customer_smoke_test.sh +0 -0
  31. {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/generate_jdk_exports.py +0 -0
  32. {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/perf_harness.py +0 -0
  33. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/adaptive_scanner.py +0 -0
  34. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/archetype.py +0 -0
  35. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architectural_baseline.py +0 -0
  36. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architectural_delta.py +0 -0
  37. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architecture_analyzer.py +0 -0
  38. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architecture_summary.py +0 -0
  39. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/baseline_autocapture.py +0 -0
  40. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cache.py +0 -0
  41. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cache_model.py +0 -0
  42. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/call_surface.py +0 -0
  43. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/caller_metrics.py +0 -0
  44. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/caller_reach.py +0 -0
  45. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/canonical_ir.py +0 -0
  46. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/chain_rules.py +0 -0
  47. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/change_plan.py +0 -0
  48. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cir_graphs.py +0 -0
  49. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/classifier.py +0 -0
  50. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/code_notes_analyzer.py +0 -0
  51. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/compare.py +0 -0
  52. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/confidence_analyzer.py +0 -0
  53. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/constraint_diff.py +0 -0
  54. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_cache.py +0 -0
  55. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_graph.py +0 -0
  56. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_scorer.py +0 -0
  57. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_summarizer.py +0 -0
  58. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_diff.py +0 -0
  59. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_model.py +0 -0
  60. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_pipeline.py +0 -0
  61. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/coverage_parser.py +0 -0
  62. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/data_labels.py +0 -0
  63. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/defect_identity.py +0 -0
  64. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/degradation.py +0 -0
  65. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/dependency_analyzer.py +0 -0
  66. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/deployment_prefix.py +0 -0
  67. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/__init__.py +0 -0
  68. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/base.py +0 -0
  69. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/csproj_parser.py +0 -0
  70. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/dart.py +0 -0
  71. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/dotnet.py +0 -0
  72. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/elixir.py +0 -0
  73. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/go.py +0 -0
  74. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/heuristic.py +0 -0
  75. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/hybrid.py +0 -0
  76. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/java.py +0 -0
  77. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/jvm_ext.py +0 -0
  78. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/nodejs.py +0 -0
  79. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/parsers.py +0 -0
  80. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/php.py +0 -0
  81. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/project.py +0 -0
  82. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/python.py +0 -0
  83. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/ruby.py +0 -0
  84. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/rust.py +0 -0
  85. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/systems.py +0 -0
  86. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/terraform.py +0 -0
  87. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/tooling.py +0 -0
  88. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/doc_analyzer.py +0 -0
  89. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/dynamic_argument_surface.py +0 -0
  90. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/endpoint_literals.py +0 -0
  91. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/endpoint_metrics.py +0 -0
  92. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/entrypoint_classifier.py +0 -0
  93. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/env_analyzer.py +0 -0
  94. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/envelope.py +0 -0
  95. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/environment_resolution.py +0 -0
  96. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/error_schema.py +0 -0
  97. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/evidence_provider.py +0 -0
  98. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/explain.py +0 -0
  99. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/facts/__init__.py +0 -0
  100. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/facts/registry.json +0 -0
  101. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/file_chunker.py +0 -0
  102. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/file_classifier.py +0 -0
  103. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/filter_surface.py +0 -0
  104. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/format_contract.py +0 -0
  105. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/fqn_utils.py +0 -0
  106. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/git_analyzer.py +0 -0
  107. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/git_checkout.py +0 -0
  108. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/graph_analyzer.py +0 -0
  109. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/graph_evidence.py +0 -0
  110. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/hibernate_strat.py +0 -0
  111. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/identity_fallback.py +0 -0
  112. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/integration_coordinates.py +0 -0
  113. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/jdk_exports.py +0 -0
  114. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/license.py +0 -0
  115. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/__init__.py +0 -0
  116. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  117. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  118. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  119. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  120. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  121. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/orchestrator.py +0 -0
  122. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/registry.py +0 -0
  123. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/runner.py +0 -0
  124. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/server.py +0 -0
  125. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp_nudge.py +0 -0
  126. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/metrics_analyzer.py +0 -0
  127. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/migrate_check.py +0 -0
  128. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/migration_blast.py +0 -0
  129. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/non_coverage.py +0 -0
  130. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/openapi_surface.py +0 -0
  131. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/openrewrite_recipe.py +0 -0
  132. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/output_budget.py +0 -0
  133. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/parse_cache.py +0 -0
  134. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/path_admission.py +0 -0
  135. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/path_filters.py +0 -0
  136. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/perf.py +0 -0
  137. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pipe_contract.py +0 -0
  138. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/posture.py +0 -0
  139. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pr_comment_renderer.py +0 -0
  140. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pr_impact.py +0 -0
  141. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/prepare_context.py +0 -0
  142. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/progress.py +0 -0
  143. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ranking_engine.py +0 -0
  144. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/readiness_timeline.py +0 -0
  145. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/reconciliation.py +0 -0
  146. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/redactor.py +0 -0
  147. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/reference_facts.py +0 -0
  148. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/relevance_scorer.py +0 -0
  149. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/rename_refactor.py +0 -0
  150. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/repo_classifier.py +0 -0
  151. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/repository_ir.py +0 -0
  152. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/__init__.py +0 -0
  153. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/context.py +0 -0
  154. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/errors.py +0 -0
  155. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/executor.py +0 -0
  156. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/planner.py +0 -0
  157. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/query.py +0 -0
  158. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/request.py +0 -0
  159. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/resolution.py +0 -0
  160. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/result.py +0 -0
  161. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/retriever.py +0 -0
  162. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/runtime.py +0 -0
  163. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps.py +0 -0
  164. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  165. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_graph.py +0 -0
  166. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_impact.py +0 -0
  167. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_intf.py +0 -0
  168. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_struct.py +0 -0
  169. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  170. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/risk.py +0 -0
  171. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/rule_catalog.py +0 -0
  172. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/runtime_classifier.py +0 -0
  173. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/sarif.py +0 -0
  174. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/scanner.py +0 -0
  175. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/schema.py +0 -0
  176. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  177. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_config.py +0 -0
  178. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_posture.py +0 -0
  179. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_analyzer.py +0 -0
  180. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_impact_engine.py +0 -0
  181. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_integration_engine.py +0 -0
  182. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_services.py +0 -0
  183. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/serializer.py +0 -0
  184. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_event_topology.py +0 -0
  185. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_findings.py +0 -0
  186. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_impact.py +0 -0
  187. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_model.py +0 -0
  188. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_profiles.py +0 -0
  189. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_properties.py +0 -0
  190. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_security_audit.py +0 -0
  191. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_semantic.py +0 -0
  192. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_tx_analyzer.py +0 -0
  193. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/summarizer.py +0 -0
  194. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/target_admission.py +0 -0
  195. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/__init__.py +0 -0
  196. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/config.py +0 -0
  197. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/consent.py +0 -0
  198. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/events.py +0 -0
  199. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/filters.py +0 -0
  200. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/transport.py +0 -0
  201. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/test_gap_ranking.py +0 -0
  202. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/test_sources.py +0 -0
  203. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/tree_utils.py +0 -0
  204. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/type_usage_surface.py +0 -0
  205. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/validation_inference.py +0 -0
  206. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/validation_surface.py +0 -0
  207. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/version_check.py +0 -0
  208. {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/workspace.py +0 -0
  209. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/README.md +0 -0
  210. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/get-license/index.ts +0 -0
  211. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  212. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/telemetry/index.ts +0 -0
  213. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/license_event_ordering.sql +0 -0
  214. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/licensing_schema.sql +0 -0
  215. {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,151 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [4.5.3] — 2026-08-04
6
+
7
+ Patch: the fixable half of field evaluation #10 (7,5/10, CI reliability **4/10**), in one
8
+ battery. Five defects, one commit each, every one reproduced on a fixture before it was
9
+ touched. No new capability, no published field removed, no exit code moved.
10
+
11
+ Three of the evaluation's thirteen complaints are **not** fixed here because they did not
12
+ survive verification against HEAD — `spring-audit --compact` has shipped since 3.7.0 (the
13
+ second time that closed row has been re-derived as missing), the mojibake diagnosis is
14
+ wrong (`_force_utf8_streams` already reconfigures both streams; this is the **fourth**
15
+ field report of console mojibake and none has reproduced under measurement — the one
16
+ variable they share is the platform with no runner, C3-39), and the "dead surface"
17
+ capability ships as `endpoints --client-usage`. Full record and the F-A…F-E capability
18
+ queue in `.planning/FIELD-EVAL-10-2026-08-04.md`.
19
+
20
+ ### Fixed
21
+
22
+ - **`verify --init` derived a contract asserting an invariant the same build reported as
23
+ violated** (C1-24, **critical**). It proposed `no-sec-004` — *"SEC-004 fires nowhere in
24
+ this repository"* — on a tree where `spring-audit` reported SEC-004 `high`. Committed
25
+ without `--dry-run`, that gate is red on the commit it was derived from, on the
26
+ `core`-tier command whose promise is *"safe to gate CI on"*. Cause: the derivation
27
+ computed "fires nowhere" from the CIR pattern audit alone, and SEC-004…SEC-007 are
28
+ produced by `security_config_scan`, the second authority `spring-audit` also runs, which
29
+ returns nothing without a `root`. The root is now threaded through, so the derivation,
30
+ `verify`, `verify-edit` and the self-check all evaluate the same audit. **The safety net
31
+ had the same hole** — `execute_candidates` runs every candidate through the real engine
32
+ before publishing it, and it too evaluated without a root, so it approved the rule it
33
+ exists to stop. Same row, second half: SEC-005/006/007 appeared in **neither** the
34
+ proposed nor the rejected list, because the catalogue was built from the pattern
35
+ registries, which stop at SEC-004; it now comes from `rule_catalog.RULES`, the authority
36
+ `--help` and the README already render from.
37
+ - **The security configuration scan could not tell code from a comment** (E-2). `SEC-004`
38
+ and `SEC-007` fired identically on a live statement and on a commented-out block —
39
+ **31 % of the `high` findings** in the field, and the count understates it, because the
40
+ correlation engine wrote a persuasive paragraph about shared credentials over a block
41
+ that was switched off. Confident prose about dead code is worse than a terse warning: it
42
+ invites trust. This is E-1's class in a module written after E-1 closed, so the stripper
43
+ is now one authority (`source_text`) wired at the **three points a file is read** rather
44
+ than inside each rule — a rule added later is covered by construction. Comments are
45
+ **blanked, not deleted**, so offsets survive and every observation still points at the
46
+ line a reader can open. String literals are deliberately kept: these rules carry their
47
+ evidence *inside* the literal. A/B with the cache cold over BroadleafCommerce,
48
+ openmrs-core, keycloak and spring-petclinic: **byte-identical security findings** — the
49
+ fix removes false positives and loses no true one.
50
+ - **Two path conventions inside one document** (C2-24). `servlet_surface.mappings[].source_file`
51
+ emitted the platform separator while every other payload emits POSIX. The reported
52
+ emitter was one of **four**: checking for the recurrence found `client_calls` (the
53
+ `--client-usage` join, whose entire product is a join on path) and the file-too-large
54
+ branch of `ast_extractor`, which spelled the path differently from the two lines directly
55
+ above it; a static guard over every module then found a fourth in `token_estimate`. All
56
+ four fixed, and the guard now fails any `str(x.relative_to(y))` without normalisation.
57
+ - **An untracked source file was not counted as a change** (C3-40). `cache freshness`
58
+ reported `has_uncommitted_changes: False` with untracked files present, contradicting the
59
+ root scan's `--changed-only` help in the same CLI. The measurement underneath was worse
60
+ than the contradiction: an untracked `.java` file **is** in the IR, so the tree reported
61
+ `fresh: true` for a snapshot that never contained that file — a false *fresh*. Bound to
62
+ `baseline_autocapture.worktree_dirty`, which already had to answer this exactly right for
63
+ the architectural history; gitignored build output and cache directories are still not
64
+ modifications.
65
+ - **`data-exposure` measured nothing and offered no way to measure** (C4-14). It answered
66
+ `answered: false` and stopped, on the payload aimed at a regulated buyer — ninth
67
+ appearance of the C4 class. It now carries the registry remedy plus a `declare` block
68
+ (file, key, copy-pasteable example), all read from the module that parses them. The
69
+ example is **executed** in the battery — written to disk, parsed by the real loader, and
70
+ re-run to confirm the answer changes — because an example that has drifted from the schema
71
+ teaches a buyer the wrong shape.
72
+
73
+ ### Changed
74
+
75
+ - Cache-hit provenance moved from inside the `git_context` payload block to `_meta`
76
+ (`stale_fields_refreshed`). Surfaced by C3-40: written into the payload it changed that
77
+ block's *shape* depending on whether the answer came from cache, so one request answered
78
+ two ways compared unequal on a key describing the run rather than the repository. The
79
+ previous key was undocumented, unschema'd, underscore-prefixed and reachable only on one
80
+ cache path — treated as internal provenance rather than a published field, which is why
81
+ this is a patch and not a major.
82
+
83
+ ### Still open from this evaluation, on purpose
84
+
85
+ - **C1-25** — reachability is measured at type scope and attributed at member scope
86
+ (~1 700× over-attribution measured in one direction; global `@Configuration` defects
87
+ degraded to `internal` in the other). Feature-sized, and it **gates** the `exposure` join
88
+ (F-C): that table built on this model would put the over-attribution behind a
89
+ CISO-facing headline.
90
+ - **P-8** — a pricing decision, and the third independent arrival at the per-repository band.
91
+
92
+ ## [4.5.2] — 2026-08-04
93
+
94
+ Patch: two affordances that shipped command by command, and therefore drifted, become
95
+ properties of the CLI. No analysis changes, no published field is added or removed, no
96
+ exit code moves, and every payload is byte-identical to 4.5.1.
97
+
98
+ ### Fixed
99
+
100
+ - **60 of 84 commands did not accept `--copy` / `-c`.** Among them `verify`, `risk`,
101
+ `posture`, `verify-edit`, `schema`, `archetype`, `cold-start`, `enrich`,
102
+ `data-exposure`, `migrate-recipe`, `baseline capture`, every `cache`/`mcp` status
103
+ command, `version`, `auth status`, `telemetry status`, and all 29 `retrieve` intents.
104
+ The flag had been added one command at a time since it was introduced, so what a
105
+ reader could copy depended on which command they happened to be using. It is now a
106
+ property of the CLI: every command that answers a question publishes it, declared
107
+ through one factory (`cli._copy_option()`) so all of them bind `-c` and describe it
108
+ with the same sentence. The text answers gained it too — `ask version -c`,
109
+ `ask cache status -c`, `ask mcp status -c` — via `_emit_text_output`/`_TextAnswer`,
110
+ which collect the lines as they are printed so the clipboard holds exactly what the
111
+ reader saw.
112
+ - **Four commands published `--copy` and then dropped it on their empty-population
113
+ path.** `spring-audit`, `impact-chain`, `pr-impact` and the root `--changed-only`
114
+ scan passed a hard-coded `False` into the output seam when there were no Java files
115
+ or no changed files: the flag parsed, exited 0, and copied nothing. A shorter answer
116
+ is still the answer. Found by the new battery, not by hand.
117
+ - **65 of 84 commands ran silently, including the slowest ones.** Measured on
118
+ BroadleafCommerce: `ask risk` is 15.2 s, `verify-edit` 11.8 s, `posture` 5.9 s,
119
+ `migrate-recipe` 5.0 s, `archetype` 5.1 s, `retrieve <intent>` 4.6 s — none of them
120
+ wrote a byte while they worked, which is indistinguishable from a hang. They now draw
121
+ the existing `Progress` spinner on stderr, naming the phase. `retrieve`'s 29 intents
122
+ take it once in the adapter they share rather than in 29 copies. Every spinner stops
123
+ in a `finally`, so a failing run never prints its error underneath a live frame.
124
+ Nothing changes for a non-interactive consumer: `Progress` already disables itself
125
+ off-TTY, in CI, under `NO_COLOR` and on `TERM=dumb`, and only ever writes to stderr.
126
+
127
+ ### Added
128
+
129
+ - **`tests/test_output_affordances.py` — the mechanism, not a promise in a document.**
130
+ 426 checks whose population comes from the CLI registry itself: a command must
131
+ publish `--copy` or appear in `cli.COMMANDS_WITHOUT_COPY`, must start a spinner or
132
+ appear in `cli.COMMANDS_WITHOUT_PROGRESS`, must bind `-c` to `--copy`, and must
133
+ describe the flag with the shared help string. It also rejects a declared `--copy`
134
+ wired to a constant `False`, and rejects an exemption naming a command that no longer
135
+ exists — a stale entry would silently excuse the next command to take that name. The
136
+ same C4 remedy this project applies everywhere: the catalogue is generated, never
137
+ maintained by hand.
138
+ - Both affordances are now written down where the next change is made:
139
+ `CLAUDE.md` (new), `CONTRIBUTING.md` § *Adding a new command*, and a *Two things
140
+ every command does* section in `docs/USER_GUIDE.md` and `docs/MANUAL-USUARIO.md`.
141
+
142
+ ### Known limitation
143
+
144
+ - `ask chunk-file -c` still means `--chunk`, not `--copy`: it claimed the letter before
145
+ `--copy` existed, and removing it would break `ask chunk-file Big.java -c 3`, which
146
+ its `supported` tier does not permit inside a major. `--copy` works in full there. The
147
+ exception is recorded in `cli.COMMANDS_WITHOUT_COPY_SHORTHAND` rather than tolerated
148
+ silently, and the shorthand moves to `--copy` at the next major.
149
+
5
150
  ## [4.5.1] — 2026-08-03
6
151
 
7
152
  Patch: documentation only. No engine change, no published field, no exit code.
@@ -0,0 +1,74 @@
1
+ # Working on this repository
2
+
3
+ ## Non-negotiable: every new command ships both output affordances
4
+
5
+ When you add a CLI command — or a new answer, subcommand or output path on an
6
+ existing one — it **must** publish both of these. They are not polish, they are
7
+ part of what a command is here. Both are enforced by
8
+ `tests/test_output_affordances.py`, which derives its population from the CLI
9
+ registry, so a new command fails the suite until each has been decided.
10
+
11
+ ### 1. `--copy` / `-c` — the answer is copyable
12
+
13
+ Declare it with the shared factory, never a fresh `typer.Option`:
14
+
15
+ ```python
16
+ copy: bool = _copy_option(),
17
+ ```
18
+
19
+ Then **wire it through**. Declaring the flag and passing a hard-coded `False`
20
+ into `_emit_command_output` is the exact defect the battery was written for:
21
+
22
+ ```python
23
+ _emit_command_output(payload, output_path, copy, success_msg=...) # payload commands
24
+ _emit_text_output(text, copy) # single-block text
25
+ _TextAnswer() # → .say(line) per line, .done(copy) at the end # line-by-line answers
26
+ ```
27
+
28
+ Wire **every** return path, including the early ones (no Java files, no changed
29
+ files, nothing to report). A shorter answer is still the answer.
30
+
31
+ ### 2. `Progress()` — the wait is visible
32
+
33
+ If the command analyses a repository, start a spinner and stop it in `finally`,
34
+ so a raised `typer.Exit` never prints its error under a live spinner frame:
35
+
36
+ ```python
37
+ _prog = Progress()
38
+ _prog.start("building IR")
39
+ try:
40
+ result = analyse(target)
41
+ finally:
42
+ _prog.stop() # .finish() only when a "✓ done (3.2s)" line is wanted
43
+ ```
44
+
45
+ `Progress` writes to stderr only and disables itself off-TTY, in CI, under
46
+ `NO_COLOR` and on `TERM=dumb` — piped output, CI logs and MCP sessions stay
47
+ byte-identical. When commands delegate (`retrieve`'s 29 intents →
48
+ `_run_retrieval_intent`; `onboard`/`review-pr`/`fix-bug` → `prepare-context`),
49
+ put the spinner in the shared helper, not in 29 copies.
50
+
51
+ ### Opting out is a decision, not an omission
52
+
53
+ Add the command to `cli.COMMANDS_WITHOUT_COPY` or
54
+ `cli.COMMANDS_WITHOUT_PROGRESS` **with an inline comment stating why**:
55
+
56
+ - no `--copy` when stdout is a confirmation that an effect happened rather than
57
+ an answer worth keeping (`cache clear`, `mcp init`, `telemetry enable`)
58
+ - no spinner when the command reads local metadata, one named file, or a stored
59
+ history and returns in milliseconds (`version`, `cache status`, `trend`)
60
+
61
+ Anything that touches a repository gets both, however fast it is on a small one:
62
+ the same command runs on a 3 300-file monolith.
63
+
64
+ ## Related conventions this repo already enforces
65
+
66
+ - **One authority per fact.** A hand-written catalogue beside a generated one
67
+ drifts. Populations come from the CLI registry (`COMMAND_TIERS`,
68
+ `cli.HELP_PANELS`, the doc batteries), never from a list maintained by hand.
69
+ - **Never a confident falsehood.** An axis that could not be measured is
70
+ `unknown`, never `0` and never "not reachable".
71
+ - **Vendor-agnostic inference.** Logic never branches on a proprietary name;
72
+ names are evidence, never the rule.
73
+ - Run the suite with `-o addopts=""` to see the summary line; the entry point for
74
+ local runs is `run_cli.py`, not `python -m sourcecode.cli`.
@@ -84,6 +84,62 @@ tests/
84
84
  3. Register it in `detectors/__init__.py` → `build_default_detectors()`
85
85
  4. Add tests in `tests/test_detector_<language>.py`
86
86
 
87
+ ### Adding a new command (or a new answer to an existing one)
88
+
89
+ **Every command that answers a question ships two affordances. Both are
90
+ mandatory, both are enforced by `tests/test_output_affordances.py`, and the
91
+ battery derives its population from the CLI registry — so a new command fails
92
+ these tests until a decision has been taken about each.**
93
+
94
+ **1. The answer is copyable.** Declare the flag with the shared factory, never a
95
+ fresh `typer.Option`, so all ~75 commands describe it identically and all bind
96
+ the same shorthand:
97
+
98
+ ```python
99
+ @app.command("my-command")
100
+ def my_command_cmd(
101
+ path: Path = typer.Argument(Path(".")),
102
+ output_path: Optional[Path] = typer.Option(None, "--output", "-o"),
103
+ copy: bool = _copy_option(), # ← --copy / -c
104
+ ) -> None:
105
+ ...
106
+ _emit_command_output(payload, output_path, copy, success_msg=...)
107
+ ```
108
+
109
+ Then *wire it*. A declared `--copy` that reaches `_emit_command_output` as a
110
+ hard-coded `False` parses fine and does nothing; the battery fails on that
111
+ specific shape, because it is how four commands shipped a flag that silently
112
+ dropped the answer on their empty-repository path. Commands that answer in lines
113
+ rather than in a payload use `_emit_text_output(...)` or `_TextAnswer` instead.
114
+
115
+ **2. The wait is visible.** If the command analyses a repository, start a spinner
116
+ and stop it in a `finally`, so an error is never printed underneath a live
117
+ spinner frame:
118
+
119
+ ```python
120
+ _prog = Progress()
121
+ _prog.start("building IR")
122
+ try:
123
+ result = analyse(target)
124
+ finally:
125
+ _prog.stop() # .finish() when a "✓ done (3.2s)" line is wanted
126
+ ```
127
+
128
+ `Progress` costs nothing when nobody is watching: it disables itself off-TTY, in
129
+ CI, under `NO_COLOR`, and on `TERM=dumb`, and it only ever writes to stderr —
130
+ piped output and MCP sessions stay byte-identical. Put the spinner in the shared
131
+ helper when several commands delegate to one (`retrieve`'s 29 intents share
132
+ `_run_retrieval_intent`; `onboard`/`review-pr`/`fix-bug` delegate to
133
+ `prepare-context`), and the battery will see it through one level of call.
134
+
135
+ **Opting out** is allowed and must be explicit: add the command to
136
+ `cli.COMMANDS_WITHOUT_COPY` or `cli.COMMANDS_WITHOUT_PROGRESS` **with an inline
137
+ comment giving the reason**. A command whose stdout is a confirmation of an
138
+ effect (`cache clear`) does not need `--copy`; one that reads local metadata and
139
+ returns in milliseconds (`version`) does not need a spinner. Every other command
140
+ does. The exemption sets are checked against the registry too, so a renamed or
141
+ deleted command cannot leave a stale entry that silently excuses its successor.
142
+
87
143
  ### Modifying the output schema
88
144
 
89
145
  The schema is defined in `schema.py` as Python dataclasses. All fields must have defaults so that existing consumers are not broken. Add new fields at the end of the relevant dataclass with `Optional[T] = None` or `list[T] = field(default_factory=list)`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 4.5.1
3
+ Version: 4.5.3
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
42
42
 
43
43
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
44
 
45
- ![Version](https://img.shields.io/badge/version-4.5.1-blue)
45
+ ![Version](https://img.shields.io/badge/version-4.5.3-blue)
46
46
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
47
 
48
48
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -97,7 +97,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
97
97
  # pip / pipx
98
98
  pipx install sourcecode # or: pip install sourcecode
99
99
 
100
- ask version # ask 4.5.1 — and, on a build that has aged,
100
+ ask version # ask 4.5.3 — and, on a build that has aged,
101
101
  # how many releases have probably shipped since
102
102
  ```
103
103
 
@@ -309,7 +309,7 @@ from it.
309
309
  | `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority |
310
310
  | `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; the same composition as `risk`, with the scanner as the severity authority |
311
311
  | `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
312
- | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008) |
312
+ | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
313
313
  | `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
314
314
  | `spring-audit` | core | transactional anomalies + security surface + validation gaps | `--ci`, `-f github-comment` |
315
315
  | `migrate-check` | core | Boot 2→3 readiness: located blockers, per-dimension score, effort | `--blast-radius` orders the re-test plan |
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
6
 
7
- ![Version](https://img.shields.io/badge/version-4.5.1-blue)
7
+ ![Version](https://img.shields.io/badge/version-4.5.3-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
10
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -59,7 +59,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
59
59
  # pip / pipx
60
60
  pipx install sourcecode # or: pip install sourcecode
61
61
 
62
- ask version # ask 4.5.1 — and, on a build that has aged,
62
+ ask version # ask 4.5.3 — and, on a build that has aged,
63
63
  # how many releases have probably shipped since
64
64
  ```
65
65
 
@@ -271,7 +271,7 @@ from it.
271
271
  | `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority |
272
272
  | `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; the same composition as `risk`, with the scanner as the severity authority |
273
273
  | `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
274
- | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008) |
274
+ | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
275
275
  | `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
276
276
  | `spring-audit` | core | transactional anomalies + security surface + validation gaps | `--ci`, `-f github-comment` |
277
277
  | `migrate-check` | core | Boot 2→3 readiness: located blockers, per-dimension score, effort | `--blast-radius` orders the re-test plan |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "4.5.1"
7
+ version = "4.5.3"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "4.5.1"
7
+ __version__ = "4.5.3"
@@ -1252,7 +1252,7 @@ class AstExtractor:
1252
1252
  stat = path.stat()
1253
1253
  if stat.st_size > self.max_file_size:
1254
1254
  return FileContract(
1255
- path=str(path.relative_to(root)) if root else path.name,
1255
+ path=rel_path,
1256
1256
  language=language,
1257
1257
  extraction_method="heuristic",
1258
1258
  limitations=[f"file_too_large: {stat.st_size} bytes > {self.max_file_size}"],