sourcecode 1.7.0__tar.gz → 1.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. {sourcecode-1.7.0 → sourcecode-1.9.0}/PKG-INFO +1 -1
  2. {sourcecode-1.7.0 → sourcecode-1.9.0}/pyproject.toml +1 -1
  3. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/__init__.py +1 -1
  4. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/cli.py +53 -74
  5. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/serializer.py +7 -1
  6. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_cli.py +11 -6
  7. {sourcecode-1.7.0 → sourcecode-1.9.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  8. {sourcecode-1.7.0 → sourcecode-1.9.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  9. {sourcecode-1.7.0 → sourcecode-1.9.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  10. {sourcecode-1.7.0 → sourcecode-1.9.0}/.continue-here.md +0 -0
  11. {sourcecode-1.7.0 → sourcecode-1.9.0}/.github/workflows/build-windows.yml +0 -0
  12. {sourcecode-1.7.0 → sourcecode-1.9.0}/.gitignore +0 -0
  13. {sourcecode-1.7.0 → sourcecode-1.9.0}/.ruff.toml +0 -0
  14. {sourcecode-1.7.0 → sourcecode-1.9.0}/CONTRIBUTING.md +0 -0
  15. {sourcecode-1.7.0 → sourcecode-1.9.0}/LICENSE +0 -0
  16. {sourcecode-1.7.0 → sourcecode-1.9.0}/README.md +0 -0
  17. {sourcecode-1.7.0 → sourcecode-1.9.0}/SECURITY.md +0 -0
  18. {sourcecode-1.7.0 → sourcecode-1.9.0}/docs/privacy.md +0 -0
  19. {sourcecode-1.7.0 → sourcecode-1.9.0}/docs/schema.md +0 -0
  20. {sourcecode-1.7.0 → sourcecode-1.9.0}/raw +0 -0
  21. {sourcecode-1.7.0 → sourcecode-1.9.0}/run_cli.py +0 -0
  22. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/adaptive_scanner.py +0 -0
  23. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/architecture_analyzer.py +0 -0
  24. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/architecture_summary.py +0 -0
  25. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/ast_extractor.py +0 -0
  26. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/classifier.py +0 -0
  27. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  28. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/confidence_analyzer.py +0 -0
  29. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/context_scorer.py +0 -0
  30. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/context_summarizer.py +0 -0
  31. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/contract_model.py +0 -0
  32. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/contract_pipeline.py +0 -0
  33. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/coverage_parser.py +0 -0
  34. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/dependency_analyzer.py +0 -0
  35. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/__init__.py +0 -0
  36. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/base.py +0 -0
  37. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  38. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/dart.py +0 -0
  39. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/dotnet.py +0 -0
  40. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/elixir.py +0 -0
  41. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/go.py +0 -0
  42. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/heuristic.py +0 -0
  43. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/hybrid.py +0 -0
  44. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/java.py +0 -0
  45. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  46. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/nodejs.py +0 -0
  47. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/parsers.py +0 -0
  48. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/php.py +0 -0
  49. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/project.py +0 -0
  50. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/python.py +0 -0
  51. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/ruby.py +0 -0
  52. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/rust.py +0 -0
  53. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/systems.py +0 -0
  54. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/terraform.py +0 -0
  55. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/detectors/tooling.py +0 -0
  56. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/doc_analyzer.py +0 -0
  57. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  58. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/env_analyzer.py +0 -0
  59. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/file_classifier.py +0 -0
  60. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/git_analyzer.py +0 -0
  61. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/graph_analyzer.py +0 -0
  62. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/metrics_analyzer.py +0 -0
  63. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/prepare_context.py +0 -0
  64. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/progress.py +0 -0
  65. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/ranking_engine.py +0 -0
  66. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/redactor.py +0 -0
  67. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/relevance_scorer.py +0 -0
  68. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/repo_classifier.py +0 -0
  69. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/runtime_classifier.py +0 -0
  70. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/scanner.py +0 -0
  71. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/schema.py +0 -0
  72. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/semantic_analyzer.py +0 -0
  73. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/summarizer.py +0 -0
  74. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/__init__.py +0 -0
  75. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/config.py +0 -0
  76. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/consent.py +0 -0
  77. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/events.py +0 -0
  78. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/filters.py +0 -0
  79. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/telemetry/transport.py +0 -0
  80. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/tree_utils.py +0 -0
  81. {sourcecode-1.7.0 → sourcecode-1.9.0}/src/sourcecode/workspace.py +0 -0
  82. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/__init__.py +0 -0
  83. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/conftest.py +0 -0
  84. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/coverage.xml +0 -0
  85. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  86. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  87. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  88. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/go_service/go.mod +0 -0
  89. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/jacoco.xml +0 -0
  90. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/lcov.info +0 -0
  91. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  92. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/nextjs_app/package.json +0 -0
  93. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  94. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  95. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  96. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  97. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  98. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  99. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  100. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  101. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  102. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  103. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  104. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  105. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  106. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  107. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  108. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  109. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  110. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  111. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  112. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  113. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  114. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  115. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  116. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  117. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  118. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  119. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  120. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  121. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  122. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  123. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_architecture_analyzer.py +0 -0
  124. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_architecture_summary.py +0 -0
  125. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_ast_extractor.py +0 -0
  126. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_block1_reliability.py +0 -0
  127. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_block2_coverage.py +0 -0
  128. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_block5_quality.py +0 -0
  129. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_bug_fixes_v16.py +0 -0
  130. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_classifier.py +0 -0
  131. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_code_notes_analyzer.py +0 -0
  132. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_context_scorer.py +0 -0
  133. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_contract_pipeline.py +0 -0
  134. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_coverage_parser.py +0 -0
  135. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_cross_consistency.py +0 -0
  136. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  137. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  138. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_dependency_schema.py +0 -0
  139. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_dotnet.py +0 -0
  140. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_go_rust_java.py +0 -0
  141. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_nodejs.py +0 -0
  142. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_php_ruby_dart.py +0 -0
  143. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_python.py +0 -0
  144. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_universal_managed.py +0 -0
  145. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detector_universal_systems.py +0 -0
  146. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_detectors_base.py +0 -0
  147. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  148. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_doc_analyzer_python.py +0 -0
  149. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  150. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_graph_analyzer_python_node.py +0 -0
  151. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_graph_schema.py +0 -0
  152. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_hybrid_inference.py +0 -0
  153. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration.py +0 -0
  154. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_dependencies.py +0 -0
  155. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_detection.py +0 -0
  156. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_docs.py +0 -0
  157. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_graph_modules.py +0 -0
  158. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_lqn.py +0 -0
  159. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_metrics.py +0 -0
  160. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_multistack.py +0 -0
  161. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_semantics.py +0 -0
  162. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_integration_universal.py +0 -0
  163. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_java_spring_integration.py +0 -0
  164. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_metrics_analyzer.py +0 -0
  165. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_packaging.py +0 -0
  166. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_phase1_improvements.py +0 -0
  167. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_pipeline_integrity.py +0 -0
  168. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_real_projects.py +0 -0
  169. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_redactor.py +0 -0
  170. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_scanner.py +0 -0
  171. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_schema.py +0 -0
  172. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_schema_normalization.py +0 -0
  173. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_semantic_analyzer_node.py +0 -0
  174. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_semantic_analyzer_python.py +0 -0
  175. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_semantic_import_resolution.py +0 -0
  176. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_semantic_schema.py +0 -0
  177. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_signal_hierarchy.py +0 -0
  178. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_summarizer.py +0 -0
  179. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_telemetry.py +0 -0
  180. {sourcecode-1.7.0 → sourcecode-1.9.0}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.7.0
3
+ Version: 1.9.0
4
4
  Summary: Deterministic codebase context for AI coding agents
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.7.0"
7
+ version = "1.9.0"
8
8
  description = "Deterministic codebase context for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.7.0"
3
+ __version__ = "1.9.0"
@@ -354,32 +354,29 @@ def main(
354
354
  "json",
355
355
  "--format",
356
356
  "-f",
357
- help="Output format: json (default) or yaml. Both carry identical data — yaml is more human-readable, json is preferred for agent pipelines.",
357
+ help="Output format: json (default) or yaml.",
358
358
  show_default=True,
359
359
  ),
360
360
  output: Optional[Path] = typer.Option(
361
361
  None,
362
362
  "--output",
363
363
  "-o",
364
- help="Write output to a file instead of stdout. Useful for storing analysis snapshots or piping to downstream tools.",
364
+ help="Write output to a file instead of stdout.",
365
365
  ),
366
366
  compact: bool = typer.Option(
367
367
  False,
368
368
  "--compact",
369
369
  help=(
370
- "Compact output (~600–800 tokens): project type, stacks, production entry points, "
371
- "dependency summary, confidence summary, and analysis gaps. "
372
- "Omits file tree, raw dependency lists, docs, and module graph. "
373
- "Designed for agent context windows. Automatically enables --dependencies, --env-map, and --code-notes."
370
+ "High-signal summary (~600–800 tokens): stacks, entry points, "
371
+ "dependency summary, confidence, and gaps. "
372
+ "Optimized for agent context windows."
374
373
  ),
375
374
  ),
376
375
  dependencies: bool = typer.Option(
377
376
  False,
378
377
  "--dependencies",
379
- help=(
380
- "Analyze direct and transitive dependencies. Reads manifests (pyproject.toml, package.json, go.mod, etc.) "
381
- "and lockfiles when available. Adds dependency_summary and key_dependencies to output."
382
- ),
378
+ hidden=True,
379
+ help="Analyze direct dependencies from manifests and lockfiles.",
383
380
  ),
384
381
  graph_modules: bool = typer.Option(
385
382
  False,
@@ -422,10 +419,7 @@ def main(
422
419
  no_redact: bool = typer.Option(
423
420
  False,
424
421
  "--no-redact",
425
- help=(
426
- "Disable automatic secret redaction. By default, potential secrets (API keys, tokens, passwords) "
427
- "are replaced with [REDACTED]. Use with caution — output may contain sensitive values."
428
- ),
422
+ help="Disable secret redaction. Use with caution — output may contain sensitive values.",
429
423
  ),
430
424
  version: Optional[bool] = typer.Option(
431
425
  None,
@@ -438,10 +432,7 @@ def main(
438
432
  depth: int = typer.Option(
439
433
  4,
440
434
  "--depth",
441
- help=(
442
- "Maximum depth for file tree traversal (default: 4, range: 1–20). "
443
- "Increase for deeply nested projects — Maven/Java requires at least 8 (src/main/java/...)."
444
- ),
435
+ help="File tree traversal depth (default: 4). Java/Maven projects auto-adjust to 12.",
445
436
  min=1,
446
437
  max=20,
447
438
  ),
@@ -480,72 +471,58 @@ def main(
480
471
  False,
481
472
  "--git-context",
482
473
  "-g",
483
- help="Include git activity: recent commits, change hotspots (most frequently modified files), pending uncommitted changes, and contributors. Adds git_context to output.",
474
+ help="Include git activity: recent commits, change hotspots, and uncommitted changes.",
484
475
  ),
485
476
  git_depth: int = typer.Option(
486
477
  20,
487
478
  "--git-depth",
488
- help="Number of recent commits to include with --git-context (default: 20, max: 100).",
479
+ hidden=True,
480
+ help="Number of recent commits to include with --git-context (default: 20).",
489
481
  min=1,
490
482
  max=100,
491
483
  ),
492
484
  git_days: int = typer.Option(
493
485
  90,
494
486
  "--git-days",
495
- help="Time window in days for detecting change hotspots with --git-context (default: 90). Hotspots are files with the most commits in this window.",
487
+ hidden=True,
488
+ help="Time window in days for change hotspot detection (default: 90).",
496
489
  min=1,
497
490
  max=3650,
498
491
  ),
499
492
  env_map: bool = typer.Option(
500
493
  False,
501
494
  "--env-map",
502
- help="Map environment variables: keys, types (string/int/bool/url/path), categories (database/auth/service/...), and which files reference them. Adds env_map and env_summary.",
495
+ hidden=True,
496
+ help="Map environment variables referenced across the codebase.",
503
497
  ),
504
498
  code_notes: bool = typer.Option(
505
499
  False,
506
500
  "--code-notes",
507
- help=(
508
- "Extract inline annotations: TODO, FIXME, HACK, NOTE, DEPRECATED, WARNING, BUG, XXX, OPTIMIZE — "
509
- "with file location and enclosing symbol. "
510
- "Also detects Architecture Decision Records (ADRs) in docs/decisions/, docs/adr/, and similar paths."
511
- ),
501
+ hidden=True,
502
+ help="Extract inline annotations: TODO, FIXME, HACK, DEPRECATED, ADRs.",
512
503
  ),
513
504
  agent: bool = typer.Option(
514
505
  False,
515
506
  "--agent",
516
- help=(
517
- "Agent-optimized output: structured, noise-free JSON for AI consumption. "
518
- "Automatically enables --dependencies, --env-map, and --code-notes. Suppresses file tree. "
519
- "Output includes: identity, entry points, architecture, runtime dependencies, "
520
- "operational signals, confidence summary, and analysis gaps. No empty sections."
521
- ),
507
+ help="Structured noise-free JSON for AI agents: identity, entry points, dependencies, confidence, gaps.",
522
508
  ),
523
509
  trace_pipeline: bool = typer.Option(
524
510
  False,
525
511
  "--trace-pipeline",
526
- help=(
527
- "Diagnostic mode: include pipeline_trace in output showing every candidate, filter decision, "
528
- "and data origin across all pipeline stages. "
529
- "Use to diagnose unexpected or contaminated results. Not intended for normal agent use."
530
- ),
512
+ hidden=True,
513
+ help="Diagnostic: include full pipeline trace in output.",
531
514
  ),
532
515
  mode: str = typer.Option(
533
516
  "contract",
534
517
  "--mode",
535
- help=(
536
- "Output mode: contract (default) | standard | raw. "
537
- "contract: minimal per-file contracts — exports, signatures, deps. "
538
- "Smallest output, recommended for AI agents. "
539
- "minimal is accepted as an alias for contract. "
540
- "standard: full per-file detail with imports, relevance scores, extraction method. "
541
- "raw: project-level analysis only (stacks, entry points, dependency summary). "
542
- "No per-file contracts."
543
- ),
518
+ hidden=True,
519
+ help="Output mode: contract (default) | standard | raw.",
544
520
  ),
545
521
  max_symbols: Optional[int] = typer.Option(
546
522
  None,
547
523
  "--max-symbols",
548
- help="Limit total exported semantic nodes across all file contracts. Trims lowest-ranked files first.",
524
+ hidden=True,
525
+ help="Limit total exported semantic nodes across all file contracts.",
549
526
  min=1,
550
527
  ),
551
528
  dependency_depth: int = typer.Option(
@@ -559,22 +536,25 @@ def main(
559
536
  entrypoints_only: bool = typer.Option(
560
537
  False,
561
538
  "--entrypoints-only",
562
- help="Contract mode: include only files that are runtime entrypoints or have exported symbols (public API surface). Note: 'entrypoints' here includes all files with exports, not strictly detected runtime entry points.",
539
+ hidden=True,
540
+ help="Include only files with exported symbols or runtime entrypoints.",
563
541
  ),
564
542
  changed_only: bool = typer.Option(
565
543
  False,
566
544
  "--changed-only",
567
- help="Contract mode: include only git-modified files (staged, unstaged, untracked).",
545
+ help="Limit output to git-modified files (staged, unstaged, untracked).",
568
546
  ),
569
547
  rank_by: str = typer.Option(
570
548
  "relevance",
571
549
  "--rank-by",
550
+ hidden=True,
572
551
  help="Contract ranking strategy: relevance (default) | centrality | git-churn.",
573
552
  ),
574
553
  emit_graph: bool = typer.Option(
575
554
  False,
576
555
  "--emit-graph",
577
- help="Contract mode: include a compact dependency graph (nodes + edges) in output.",
556
+ hidden=True,
557
+ help="Include a compact dependency graph in contract output.",
578
558
  ),
579
559
  compress_types: bool = typer.Option(
580
560
  False,
@@ -585,16 +565,13 @@ def main(
585
565
  symbol: Optional[str] = typer.Option(
586
566
  None,
587
567
  "--symbol",
588
- help="Contract mode: extract localized context for a specific symbol name. Returns defining file + all importers.",
568
+ help="Extract context for a specific symbol: defining file + all importers.",
589
569
  ),
590
570
  max_importers: int = typer.Option(
591
571
  50,
592
572
  "--max-importers",
593
- help=(
594
- "Maximum importer files returned by --symbol (default: 50). "
595
- "Popular symbols can have hundreds of importers — this prevents output explosion. "
596
- "Defining files are never truncated. Override: --symbol Foo --max-importers 200."
597
- ),
573
+ hidden=True,
574
+ help="Maximum importer files returned by --symbol (default: 50).",
598
575
  min=1,
599
576
  max=10000,
600
577
  ),
@@ -789,22 +766,9 @@ def main(
789
766
  env_map = True
790
767
  code_notes = True
791
768
  no_tree = True # agents never need the raw file tree
792
- typer.echo("[agent] dependencies env-map code-notes (no-tree)", err=True)
793
- # Warn about flags that are computed but excluded from agent_view output
794
- _agent_suppressed: list[str] = []
795
- if full_metrics:
796
- _agent_suppressed.append("--full-metrics")
797
- if graph_modules:
798
- _agent_suppressed.append("--graph-modules")
799
- if docs:
800
- _agent_suppressed.append("--docs")
801
- if _agent_suppressed:
802
- typer.echo(
803
- f"[agent] warning: {', '.join(_agent_suppressed)} computed but excluded "
804
- "from --agent output — agent_view does not include these sections. "
805
- "Remove these flags to skip unnecessary computation.",
806
- err=True,
807
- )
769
+
770
+ _progress = Progress()
771
+ _progress.start("scanning files")
808
772
 
809
773
  scanner = AdaptiveScanner(target, topology=_topology, base_depth=effective_depth)
810
774
  raw_tree = scanner.scan_tree()
@@ -842,6 +806,7 @@ def main(
842
806
  node = child
843
807
  return pruned
844
808
 
809
+ _progress.update("parsing manifests")
845
810
  file_tree = filter_sensitive_files(raw_tree)
846
811
  detector = ProjectDetector(build_default_detectors())
847
812
  workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
@@ -1310,6 +1275,7 @@ def main(
1310
1275
 
1311
1276
  # Git Context (--git-context flag)
1312
1277
  if git_context:
1278
+ _progress.update("git analysis")
1313
1279
  from sourcecode.git_analyzer import GitAnalyzer
1314
1280
  sm.git_context = GitAnalyzer().analyze(target, depth=git_depth, days=git_days)
1315
1281
 
@@ -1417,6 +1383,7 @@ def main(
1417
1383
  changed_only = False
1418
1384
 
1419
1385
  # Contract pipeline — runs for mode=contract|standard|deep|hybrid (skip for raw)
1386
+ _progress.update("extracting contracts")
1420
1387
  _is_contract_mode = mode in ("contract", "standard")
1421
1388
  _pipeline_error = False
1422
1389
  if _is_contract_mode:
@@ -1487,6 +1454,7 @@ def main(
1487
1454
  )
1488
1455
 
1489
1456
  # 4. Serialize
1457
+ _progress.update("serializing output")
1490
1458
  if _is_contract_mode and not agent:
1491
1459
  from sourcecode.serializer import contract_view as _contract_view
1492
1460
  _depth = _CONTRACT_DEPTH.get(mode, "minimal")
@@ -1517,7 +1485,17 @@ def main(
1517
1485
  if _is_contract_mode and sm.file_contracts:
1518
1486
  from sourcecode.serializer import _serialize_contract_minimal
1519
1487
  data.pop("file_relevance", None)
1520
- data["contracts"] = [_serialize_contract_minimal(c) for c in sm.file_contracts]
1488
+ _MAX_AGENT_CONTRACTS = 10
1489
+ _all_contracts = sm.file_contracts
1490
+ _sorted = sorted(_all_contracts, key=lambda c: getattr(c, "relevance_score", 0.0), reverse=True)
1491
+ _sampled = _sorted[:_MAX_AGENT_CONTRACTS]
1492
+ _total_contracts = len(_all_contracts)
1493
+ data["contracts"] = [_serialize_contract_minimal(c) for c in _sampled]
1494
+ data["contracts_meta"] = {
1495
+ "total": _total_contracts,
1496
+ "shown": len(_sampled),
1497
+ "truncated": _total_contracts > _MAX_AGENT_CONTRACTS,
1498
+ }
1521
1499
  if sm.contract_summary is not None:
1522
1500
  cs = sm.contract_summary
1523
1501
  data["contract_summary"] = {
@@ -1578,6 +1556,7 @@ def main(
1578
1556
  pass
1579
1557
 
1580
1558
  # 6. Write output (CLI-04)
1559
+ _progress.finish()
1581
1560
  write_output(content, output=output)
1582
1561
 
1583
1562
  if _pipeline_error:
@@ -958,7 +958,13 @@ def agent_view(sm: SourceMap) -> dict[str, Any]:
958
958
  "sections": _section_confidence(sm),
959
959
  }
960
960
  if cs.hard_signals:
961
- conf["hard_signals"] = cs.hard_signals
961
+ _MAX_HARD_SIGNALS = 20
962
+ _hs = cs.hard_signals
963
+ _hs_total = len(_hs)
964
+ conf["hard_signals"] = _hs[:_MAX_HARD_SIGNALS]
965
+ if _hs_total > _MAX_HARD_SIGNALS:
966
+ conf["hard_signals_truncated"] = True
967
+ conf["hard_signals_total"] = _hs_total
962
968
  if cs.soft_signals:
963
969
  conf["soft_signals"] = cs.soft_signals
964
970
  if cs.ignored_signals:
@@ -42,18 +42,23 @@ def test_telemetry_status():
42
42
  assert "Telemetry" in result.output
43
43
 
44
44
 
45
- def test_help_contains_all_flags():
45
+ def test_help_contains_core_flags():
46
46
  result = invoke(["--help"])
47
47
  assert result.exit_code == 0
48
+ # Core visible flags
48
49
  assert "--format" in result.output
49
50
  assert "--output" in result.output
50
51
  assert "--compact" in result.output
51
- assert "--dependencies" in result.output
52
- assert "--graph-modules" in result.output
53
- assert "--graph-detail" in result.output
54
- assert "--max-nodes" in result.output
55
- assert "--graph-edges" in result.output
52
+ assert "--git-context" in result.output
53
+ assert "--agent" in result.output
54
+ assert "--changed-only" in result.output
55
+ assert "--symbol" in result.output
56
56
  assert "--no-redact" in result.output
57
+ # Hidden flags must not appear in default help
58
+ assert "--dependencies" not in result.output
59
+ assert "--graph-modules" not in result.output
60
+ assert "--semantics" not in result.output
61
+ assert "--architecture" not in result.output
57
62
 
58
63
 
59
64
  def test_no_args_runs_without_exception(tmp_project: Path):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes