sourcecode 1.33.13__tar.gz → 1.33.14__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 (95) hide show
  1. {sourcecode-1.33.13 → sourcecode-1.33.14}/PKG-INFO +1 -1
  2. {sourcecode-1.33.13 → sourcecode-1.33.14}/pyproject.toml +1 -1
  3. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/__init__.py +1 -1
  4. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/prepare_context.py +25 -0
  5. {sourcecode-1.33.13 → sourcecode-1.33.14}/.github/workflows/build-windows.yml +0 -0
  6. {sourcecode-1.33.13 → sourcecode-1.33.14}/.gitignore +0 -0
  7. {sourcecode-1.33.13 → sourcecode-1.33.14}/.ruff.toml +0 -0
  8. {sourcecode-1.33.13 → sourcecode-1.33.14}/CHANGELOG.md +0 -0
  9. {sourcecode-1.33.13 → sourcecode-1.33.14}/CONTRIBUTING.md +0 -0
  10. {sourcecode-1.33.13 → sourcecode-1.33.14}/LICENSE +0 -0
  11. {sourcecode-1.33.13 → sourcecode-1.33.14}/README.md +0 -0
  12. {sourcecode-1.33.13 → sourcecode-1.33.14}/SECURITY.md +0 -0
  13. {sourcecode-1.33.13 → sourcecode-1.33.14}/raw +0 -0
  14. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/adaptive_scanner.py +0 -0
  15. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/architecture_analyzer.py +0 -0
  16. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/architecture_summary.py +0 -0
  17. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/ast_extractor.py +0 -0
  18. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/cache.py +0 -0
  19. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/canonical_ir.py +0 -0
  20. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/classifier.py +0 -0
  21. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/cli.py +0 -0
  22. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/code_notes_analyzer.py +0 -0
  23. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/confidence_analyzer.py +0 -0
  24. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/context_scorer.py +0 -0
  25. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/context_summarizer.py +0 -0
  26. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/contract_model.py +0 -0
  27. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/contract_pipeline.py +0 -0
  28. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/coverage_parser.py +0 -0
  29. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/dependency_analyzer.py +0 -0
  30. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/__init__.py +0 -0
  31. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/base.py +0 -0
  32. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/csproj_parser.py +0 -0
  33. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/dart.py +0 -0
  34. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/dotnet.py +0 -0
  35. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/elixir.py +0 -0
  36. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/go.py +0 -0
  37. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/heuristic.py +0 -0
  38. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/hybrid.py +0 -0
  39. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/java.py +0 -0
  40. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/jvm_ext.py +0 -0
  41. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/nodejs.py +0 -0
  42. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/parsers.py +0 -0
  43. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/php.py +0 -0
  44. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/project.py +0 -0
  45. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/python.py +0 -0
  46. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/ruby.py +0 -0
  47. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/rust.py +0 -0
  48. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/systems.py +0 -0
  49. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/terraform.py +0 -0
  50. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/detectors/tooling.py +0 -0
  51. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/doc_analyzer.py +0 -0
  52. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/entrypoint_classifier.py +0 -0
  53. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/env_analyzer.py +0 -0
  54. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/error_schema.py +0 -0
  55. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/file_classifier.py +0 -0
  56. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/flow_analyzer.py +0 -0
  57. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/git_analyzer.py +0 -0
  58. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/graph_analyzer.py +0 -0
  59. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/license.py +0 -0
  60. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/__init__.py +0 -0
  61. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  62. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  63. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  64. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  65. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  66. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/orchestrator.py +0 -0
  67. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/registry.py +0 -0
  68. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/runner.py +0 -0
  69. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp/server.py +0 -0
  70. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/mcp_nudge.py +0 -0
  71. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/metrics_analyzer.py +0 -0
  72. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/output_budget.py +0 -0
  73. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/path_filters.py +0 -0
  74. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/pr_comment_renderer.py +0 -0
  75. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/progress.py +0 -0
  76. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/ranking_engine.py +0 -0
  77. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/redactor.py +0 -0
  78. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/relevance_scorer.py +0 -0
  79. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/repo_classifier.py +0 -0
  80. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/repository_ir.py +0 -0
  81. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/ris.py +0 -0
  82. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/runtime_classifier.py +0 -0
  83. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/scanner.py +0 -0
  84. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/schema.py +0 -0
  85. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/semantic_analyzer.py +0 -0
  86. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/serializer.py +0 -0
  87. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/summarizer.py +0 -0
  88. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/__init__.py +0 -0
  89. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/config.py +0 -0
  90. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/consent.py +0 -0
  91. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/events.py +0 -0
  92. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/filters.py +0 -0
  93. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/telemetry/transport.py +0 -0
  94. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/tree_utils.py +0 -0
  95. {sourcecode-1.33.13 → sourcecode-1.33.14}/src/sourcecode/workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.33.13
3
+ Version: 1.33.14
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.33.13"
7
+ version = "1.33.14"
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"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.33.13"
3
+ __version__ = "1.33.14"
@@ -1781,7 +1781,12 @@ class TaskContextBuilder:
1781
1781
  # Pass 4: inject files whose path matches symptom keywords.
1782
1782
  # CamelCase-expand the filename stem so "OfflineSessionLoader" matches
1783
1783
  # the keyword "offline" even without an explicit directory separator.
1784
+ # Large repos: cap per-keyword injections so a common term like
1785
+ # "authentication" (50+ path matches in an IAM repo) cannot flood the
1786
+ # candidate list and push specific terms like "ldap" out of the budget.
1784
1787
  _p4_dirs_of_injected: set[str] = set() # directories of high-score injects
1788
+ _P4_KW_CAP = 15 # max path-injections per keyword in large repos
1789
+ _p4_kw_counts: dict[str, int] = {}
1785
1790
  for _p in all_paths:
1786
1791
  if _p in _existing_paths:
1787
1792
  continue
@@ -1798,6 +1803,16 @@ class TaskContextBuilder:
1798
1803
  _matching_kws = [kw for kw in symptom_keywords if kw in _p_search]
1799
1804
  if not _matching_kws:
1800
1805
  continue
1806
+ # In large repos, skip keywords already at cap; keep file only if at
1807
+ # least one keyword still has quota (multi-kw matches exhaust each
1808
+ # keyword's quota independently so specific terms survive longer).
1809
+ if _is_large_repo:
1810
+ _matching_kws = [
1811
+ kw for kw in _matching_kws
1812
+ if _p4_kw_counts.get(kw, 0) < _P4_KW_CAP
1813
+ ]
1814
+ if not _matching_kws:
1815
+ continue
1801
1816
  _boost = 0.2 * len(_matching_kws)
1802
1817
  _injected_score = round(min(0.5 + _boost, 1.0), 2)
1803
1818
  _first_kw = _matching_kws[0]
@@ -1810,6 +1825,9 @@ class TaskContextBuilder:
1810
1825
  ))
1811
1826
  _existing_paths.add(_p)
1812
1827
  _sx_direct_path.append(_p)
1828
+ if _is_large_repo:
1829
+ for _kw in _matching_kws:
1830
+ _p4_kw_counts[_kw] = _p4_kw_counts.get(_kw, 0) + 1
1813
1831
  if _injected_score >= 0.7:
1814
1832
  _p4_dirs_of_injected.add(str(Path(_p).parent))
1815
1833
 
@@ -1864,9 +1882,15 @@ class TaskContextBuilder:
1864
1882
  # architecturally adjacent classes that don't mention symptom keywords
1865
1883
  # in their own name (e.g. InfinispanOfflineSessionCacheEntryLifespan…
1866
1884
  # siblings in the same infinispan/ package).
1885
+ # Large repos: cap total co-location injections so that a keyword
1886
+ # matching many directories doesn't flood the candidate list.
1867
1887
  if _is_large_repo and _p4_dirs_of_injected:
1868
1888
  _coloc_existing = {rf.path for rf in relevant_files}
1889
+ _P4C_CAP = 30
1890
+ _coloc_count = 0
1869
1891
  for _cp in all_paths:
1892
+ if _coloc_count >= _P4C_CAP:
1893
+ break
1870
1894
  if _cp in _coloc_existing:
1871
1895
  continue
1872
1896
  if Path(_cp).suffix.lower() not in _src_exts:
@@ -1880,6 +1904,7 @@ class TaskContextBuilder:
1880
1904
  why="directory proximity injection",
1881
1905
  ))
1882
1906
  _coloc_existing.add(_cp)
1907
+ _coloc_count += 1
1883
1908
 
1884
1909
  # Sort before content scan so top candidates get read first.
1885
1910
  # In large repos: prioritise symptom_match files within each score band
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes