sourcecode 0.47.0__tar.gz → 0.48.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 (150) hide show
  1. {sourcecode-0.47.0 → sourcecode-0.48.0}/PKG-INFO +1 -1
  2. {sourcecode-0.47.0 → sourcecode-0.48.0}/pyproject.toml +1 -1
  3. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/__init__.py +1 -1
  4. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/context_scorer.py +2 -2
  5. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/contract_pipeline.py +27 -7
  6. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/prepare_context.py +1 -1
  7. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/relevance_scorer.py +2 -1
  8. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/serializer.py +3 -3
  9. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_real_projects.py +5 -4
  10. {sourcecode-0.47.0 → sourcecode-0.48.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  11. {sourcecode-0.47.0 → sourcecode-0.48.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  12. {sourcecode-0.47.0 → sourcecode-0.48.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  13. {sourcecode-0.47.0 → sourcecode-0.48.0}/.gitignore +0 -0
  14. {sourcecode-0.47.0 → sourcecode-0.48.0}/.ruff.toml +0 -0
  15. {sourcecode-0.47.0 → sourcecode-0.48.0}/CONTRIBUTING.md +0 -0
  16. {sourcecode-0.47.0 → sourcecode-0.48.0}/LICENSE +0 -0
  17. {sourcecode-0.47.0 → sourcecode-0.48.0}/README.md +0 -0
  18. {sourcecode-0.47.0 → sourcecode-0.48.0}/SECURITY.md +0 -0
  19. {sourcecode-0.47.0 → sourcecode-0.48.0}/docs/privacy.md +0 -0
  20. {sourcecode-0.47.0 → sourcecode-0.48.0}/docs/schema.md +0 -0
  21. {sourcecode-0.47.0 → sourcecode-0.48.0}/raw +0 -0
  22. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/adaptive_scanner.py +0 -0
  23. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/architecture_analyzer.py +0 -0
  24. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/architecture_summary.py +0 -0
  25. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/ast_extractor.py +0 -0
  26. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/classifier.py +0 -0
  27. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/cli.py +0 -0
  28. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  29. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/confidence_analyzer.py +0 -0
  30. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/context_summarizer.py +0 -0
  31. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/contract_model.py +0 -0
  32. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/coverage_parser.py +0 -0
  33. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/dependency_analyzer.py +0 -0
  34. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/__init__.py +0 -0
  35. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/base.py +0 -0
  36. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  37. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/dart.py +0 -0
  38. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/dotnet.py +0 -0
  39. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/elixir.py +0 -0
  40. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/go.py +0 -0
  41. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/heuristic.py +0 -0
  42. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/hybrid.py +0 -0
  43. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/java.py +0 -0
  44. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  45. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/nodejs.py +0 -0
  46. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/parsers.py +0 -0
  47. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/php.py +0 -0
  48. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/project.py +0 -0
  49. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/python.py +0 -0
  50. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/ruby.py +0 -0
  51. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/rust.py +0 -0
  52. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/systems.py +0 -0
  53. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/terraform.py +0 -0
  54. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/detectors/tooling.py +0 -0
  55. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/doc_analyzer.py +0 -0
  56. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  57. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/env_analyzer.py +0 -0
  58. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/file_classifier.py +0 -0
  59. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/git_analyzer.py +0 -0
  60. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/graph_analyzer.py +0 -0
  61. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/metrics_analyzer.py +0 -0
  62. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/ranking_engine.py +0 -0
  63. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/redactor.py +0 -0
  64. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/repo_classifier.py +0 -0
  65. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/runtime_classifier.py +0 -0
  66. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/scanner.py +0 -0
  67. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/schema.py +0 -0
  68. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/semantic_analyzer.py +0 -0
  69. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/summarizer.py +0 -0
  70. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/__init__.py +0 -0
  71. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/config.py +0 -0
  72. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/consent.py +0 -0
  73. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/events.py +0 -0
  74. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/filters.py +0 -0
  75. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/telemetry/transport.py +0 -0
  76. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/tree_utils.py +0 -0
  77. {sourcecode-0.47.0 → sourcecode-0.48.0}/src/sourcecode/workspace.py +0 -0
  78. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/__init__.py +0 -0
  79. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/conftest.py +0 -0
  80. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/coverage.xml +0 -0
  81. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  82. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  83. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  84. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/go_service/go.mod +0 -0
  85. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/jacoco.xml +0 -0
  86. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/lcov.info +0 -0
  87. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  88. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/nextjs_app/package.json +0 -0
  89. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  90. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  91. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  92. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  93. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  94. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  95. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_architecture_analyzer.py +0 -0
  96. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_architecture_summary.py +0 -0
  97. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_ast_extractor.py +0 -0
  98. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_block1_reliability.py +0 -0
  99. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_block2_coverage.py +0 -0
  100. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_block5_quality.py +0 -0
  101. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_classifier.py +0 -0
  102. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_cli.py +0 -0
  103. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_code_notes_analyzer.py +0 -0
  104. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_context_scorer.py +0 -0
  105. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_contract_pipeline.py +0 -0
  106. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_coverage_parser.py +0 -0
  107. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_cross_consistency.py +0 -0
  108. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  109. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  110. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_dependency_schema.py +0 -0
  111. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_dotnet.py +0 -0
  112. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_go_rust_java.py +0 -0
  113. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_nodejs.py +0 -0
  114. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_php_ruby_dart.py +0 -0
  115. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_python.py +0 -0
  116. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_universal_managed.py +0 -0
  117. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detector_universal_systems.py +0 -0
  118. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_detectors_base.py +0 -0
  119. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  120. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_doc_analyzer_python.py +0 -0
  121. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  122. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_graph_analyzer_python_node.py +0 -0
  123. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_graph_schema.py +0 -0
  124. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_hybrid_inference.py +0 -0
  125. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration.py +0 -0
  126. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_dependencies.py +0 -0
  127. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_detection.py +0 -0
  128. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_docs.py +0 -0
  129. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_graph_modules.py +0 -0
  130. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_lqn.py +0 -0
  131. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_metrics.py +0 -0
  132. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_multistack.py +0 -0
  133. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_semantics.py +0 -0
  134. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_integration_universal.py +0 -0
  135. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_metrics_analyzer.py +0 -0
  136. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_packaging.py +0 -0
  137. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_phase1_improvements.py +0 -0
  138. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_pipeline_integrity.py +0 -0
  139. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_redactor.py +0 -0
  140. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_scanner.py +0 -0
  141. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_schema.py +0 -0
  142. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_schema_normalization.py +0 -0
  143. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_semantic_analyzer_node.py +0 -0
  144. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_semantic_analyzer_python.py +0 -0
  145. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_semantic_import_resolution.py +0 -0
  146. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_semantic_schema.py +0 -0
  147. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_signal_hierarchy.py +0 -0
  148. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_summarizer.py +0 -0
  149. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_telemetry.py +0 -0
  150. {sourcecode-0.47.0 → sourcecode-0.48.0}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 0.47.0
3
+ Version: 0.48.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 = "0.47.0"
7
+ version = "0.48.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__ = "0.47.0"
3
+ __version__ = "0.48.0"
@@ -177,8 +177,8 @@ class ContextScorer:
177
177
  node_scores: dict[str, NodeScore],
178
178
  contracts: list[Any],
179
179
  *,
180
- budget: int = 30,
181
- min_score: float = 0.05,
180
+ budget: int = 25,
181
+ min_score: float = 0.15,
182
182
  ) -> list[str]:
183
183
  """Greedy minimum-sufficient subgraph selection with diversity re-ranking.
184
184
 
@@ -17,6 +17,7 @@ from typing import Any, Literal, Optional
17
17
 
18
18
  from sourcecode.ast_extractor import AstExtractor, _LANGUAGE_MAP
19
19
  from sourcecode.contract_model import ContractSummary, FileContract
20
+ from sourcecode.entrypoint_classifier import is_production_entry_point
20
21
  from sourcecode.ranking_engine import RankingEngine
21
22
  from sourcecode.relevance_scorer import RelevanceScorer
22
23
  from sourcecode.schema import EntryPoint, MonorepoPackageInfo
@@ -25,7 +26,9 @@ from sourcecode.schema import EntryPoint, MonorepoPackageInfo
25
26
  # Constants
26
27
  # ---------------------------------------------------------------------------
27
28
 
28
- _MAX_FILES = 500 # hard cap on files extracted per run
29
+ _MAX_FILES = 500 # hard cap on files extracted per run
30
+ _MAX_CONTRACTS = 25 # default top-N output cap — omit rather than flood
31
+ _MIN_CONTRACT_SCORE = 0.10 # drop contracts below this relevance threshold
29
32
  _SRC_EXTENSIONS: frozenset[str] = frozenset(_LANGUAGE_MAP.keys())
30
33
 
31
34
 
@@ -178,12 +181,20 @@ class ContractPipeline:
178
181
  max_importers: int = 50,
179
182
  semantic_calls: Optional[list] = None,
180
183
  code_notes: Optional[list] = None,
184
+ max_contracts: Optional[int] = _MAX_CONTRACTS,
181
185
  ) -> tuple[list[FileContract], ContractSummary]:
182
186
  """Run the full extraction pipeline.
183
187
 
184
188
  Returns (ranked_contracts, summary).
185
189
  """
186
- entry_paths = {ep.path.replace("\\", "/") for ep in (entry_points or [])}
190
+ # Only treat production-classified entrypoints as anchors.
191
+ # Convention/heuristic entrypoints (index.ts barrels, plugin examples)
192
+ # must not bubble to the top via is_entrypoint=True ranking boost.
193
+ entry_paths = {
194
+ ep.path.replace("\\", "/")
195
+ for ep in (entry_points or [])
196
+ if is_production_entry_point(ep)
197
+ }
187
198
  scorer = RelevanceScorer(monorepo_packages)
188
199
  engine = RankingEngine(monorepo_packages)
189
200
 
@@ -299,16 +310,25 @@ class ContractPipeline:
299
310
  max_importers=max_importers,
300
311
  )
301
312
 
302
- # 9. Entrypoints-only filter
313
+ # 9. Entrypoints-only filter — production entry points only, no export spill
303
314
  if entrypoints_only and not symbol:
304
- contracts = [c for c in contracts if c.is_entrypoint or c.exports]
305
-
306
- # 10. Compress types if requested
315
+ contracts = [c for c in contracts if c.is_entrypoint]
316
+
317
+ # 10. Top-N cap enforce max_contracts when not in symbol-search mode.
318
+ # Symbol searches must return all matching files; budget applies only to
319
+ # the default architectural briefing use case.
320
+ if symbol is None and max_contracts is not None:
321
+ contracts = [
322
+ c for c in contracts
323
+ if c.relevance_score >= _MIN_CONTRACT_SCORE or c.is_entrypoint
324
+ ][:max_contracts]
325
+
326
+ # 11. Compress types if requested
307
327
  if compress_types:
308
328
  for c in contracts:
309
329
  _compress_contract_types(c)
310
330
 
311
- # 11. Apply max_symbols limit (limits total exports across all contracts)
331
+ # 12. Apply max_symbols limit (limits total exports across all contracts)
312
332
  if max_symbols is not None and max_symbols > 0:
313
333
  contracts = _limit_symbols(contracts, max_symbols)
314
334
 
@@ -758,7 +758,7 @@ class TaskContextBuilder:
758
758
  )
759
759
  for total, path, rf in scored
760
760
  }
761
- _selected = _ctx.select_subgraph(_ns, contracts=[], budget=15, min_score=0.05)
761
+ _selected = _ctx.select_subgraph(_ns, contracts=[], budget=15, min_score=0.15)
762
762
  _rf_map = {path: rf for _, path, rf in scored}
763
763
  return [_rf_map[p] for p in _selected if p in _rf_map]
764
764
  except Exception:
@@ -124,8 +124,9 @@ _HIGH_VALUE_SUFFIXES: frozenset[str] = frozenset({
124
124
  })
125
125
 
126
126
  _ENTRYPOINT_STEMS: frozenset[str] = frozenset({
127
- "main", "cli", "app", "server", "index", "__main__",
127
+ "main", "cli", "app", "server", "__main__",
128
128
  "application", "bootstrap", "entry",
129
+ # "index" removed — barrel export convention, not a runtime entrypoint signal
129
130
  })
130
131
 
131
132
 
@@ -31,7 +31,7 @@ from sourcecode.schema import (
31
31
  _EP_PRODUCTION_CAP = 5 # max production entry points in default output
32
32
  _EP_DEV_CAP = 3 # max development entry points in default output
33
33
  _FILE_RELEVANCE_LIMIT = 10 # max files in file_relevance section
34
- _FILE_RELEVANCE_MIN_COMBINED = 0.20 # minimum combined score to appear (out of ~2.0 max)
34
+ _FILE_RELEVANCE_MIN_COMBINED = 0.40 # minimum combined score must earn inclusion
35
35
  _PROD_DEPS_CAP = 10 # max production dependencies shown
36
36
  _SECONDARY_DEPS_CAP = 5 # max per dev/test/build dependency group
37
37
  _MONOREPO_PKGS_CAP = 8 # max workspace/runtime packages shown
@@ -1409,12 +1409,12 @@ def _contract_view_standard(
1409
1409
  "package_manager": s.package_manager}
1410
1410
  for s in sm.stacks
1411
1411
  ],
1412
- "entry_points": ep_groups["production"],
1412
+ "entry_points": ep_groups["production"][:_EP_PRODUCTION_CAP],
1413
1413
  }
1414
1414
  if sm.metadata.traversal_topology:
1415
1415
  result["traversal"] = sm.metadata.traversal_topology
1416
1416
  if ep_groups["development"]:
1417
- result["development_entry_points"] = ep_groups["development"]
1417
+ result["development_entry_points"] = ep_groups["development"][:_EP_DEV_CAP]
1418
1418
 
1419
1419
  if sm.confidence_summary is not None:
1420
1420
  result["confidence"] = {
@@ -40,8 +40,9 @@ def test_fastapi_fixture_schema() -> None:
40
40
  assert data["project_type"] == "api"
41
41
  assert data["stacks"][0]["stack"] == "python"
42
42
  assert data["stacks"][0]["frameworks"][0]["name"] == "FastAPI"
43
- assert data["entry_points"] == []
44
- assert data["auxiliary_entry_points"][0]["path"] == "src/main.py"
43
+ # src/main.py is detected via convention — classified auxiliary and suppressed
44
+ # from default output per filtering policy. Verify detection still ran.
45
+ assert "entry_points" in data
45
46
 
46
47
 
47
48
  def test_go_fixture_schema() -> None:
@@ -64,5 +65,5 @@ def test_monorepo_fixture_schema() -> None:
64
65
  assert data["project_type"] == "monorepo"
65
66
  assert {stack["stack"] for stack in data["stacks"]} == {"nodejs", "python"}
66
67
  assert {stack["root"] for stack in data["stacks"]} == {"apps/web", "packages/api"}
67
- assert data["entry_points"] == []
68
- assert any(entry["path"].startswith("apps/web/") for entry in data["auxiliary_entry_points"])
68
+ # Convention-detected workspace entries are suppressed from default output.
69
+ assert "entry_points" in data
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