sourcecode 1.35.22__tar.gz → 1.35.23__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 (107) hide show
  1. {sourcecode-1.35.22 → sourcecode-1.35.23}/PKG-INFO +3 -3
  2. {sourcecode-1.35.22 → sourcecode-1.35.23}/README.md +2 -2
  3. {sourcecode-1.35.22 → sourcecode-1.35.23}/pyproject.toml +1 -1
  4. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/canonical_ir.py +4 -4
  6. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/migrate_check.py +1 -1
  7. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/prepare_context.py +21 -2
  8. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/repository_ir.py +1 -0
  9. {sourcecode-1.35.22 → sourcecode-1.35.23}/.github/workflows/build-windows.yml +0 -0
  10. {sourcecode-1.35.22 → sourcecode-1.35.23}/.gitignore +0 -0
  11. {sourcecode-1.35.22 → sourcecode-1.35.23}/.ruff.toml +0 -0
  12. {sourcecode-1.35.22 → sourcecode-1.35.23}/CHANGELOG.md +0 -0
  13. {sourcecode-1.35.22 → sourcecode-1.35.23}/CONTRIBUTING.md +0 -0
  14. {sourcecode-1.35.22 → sourcecode-1.35.23}/LICENSE +0 -0
  15. {sourcecode-1.35.22 → sourcecode-1.35.23}/SECURITY.md +0 -0
  16. {sourcecode-1.35.22 → sourcecode-1.35.23}/raw +0 -0
  17. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/adaptive_scanner.py +0 -0
  18. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/architecture_analyzer.py +0 -0
  19. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/architecture_summary.py +0 -0
  20. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/ast_extractor.py +0 -0
  21. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/cache.py +0 -0
  22. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/cir_graphs.py +0 -0
  23. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/classifier.py +0 -0
  24. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/cli.py +0 -0
  25. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/code_notes_analyzer.py +0 -0
  26. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/confidence_analyzer.py +0 -0
  27. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/context_scorer.py +0 -0
  28. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/context_summarizer.py +0 -0
  29. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/contract_model.py +0 -0
  30. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/contract_pipeline.py +0 -0
  31. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/coverage_parser.py +0 -0
  32. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/dependency_analyzer.py +0 -0
  33. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/__init__.py +0 -0
  34. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/base.py +0 -0
  35. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/csproj_parser.py +0 -0
  36. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/dart.py +0 -0
  37. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/dotnet.py +0 -0
  38. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/elixir.py +0 -0
  39. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/go.py +0 -0
  40. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/heuristic.py +0 -0
  41. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/hybrid.py +0 -0
  42. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/java.py +0 -0
  43. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/jvm_ext.py +0 -0
  44. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/nodejs.py +0 -0
  45. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/parsers.py +0 -0
  46. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/php.py +0 -0
  47. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/project.py +0 -0
  48. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/python.py +0 -0
  49. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/ruby.py +0 -0
  50. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/rust.py +0 -0
  51. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/systems.py +0 -0
  52. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/terraform.py +0 -0
  53. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/detectors/tooling.py +0 -0
  54. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/doc_analyzer.py +0 -0
  55. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/entrypoint_classifier.py +0 -0
  56. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/env_analyzer.py +0 -0
  57. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/error_schema.py +0 -0
  58. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/explain.py +0 -0
  59. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/file_classifier.py +0 -0
  60. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/flow_analyzer.py +0 -0
  61. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/fqn_utils.py +0 -0
  62. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/git_analyzer.py +0 -0
  63. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/graph_analyzer.py +0 -0
  64. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/license.py +0 -0
  65. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/__init__.py +0 -0
  66. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  67. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  68. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  69. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  70. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  71. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/orchestrator.py +0 -0
  72. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/registry.py +0 -0
  73. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/runner.py +0 -0
  74. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp/server.py +0 -0
  75. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/mcp_nudge.py +0 -0
  76. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/metrics_analyzer.py +0 -0
  77. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/output_budget.py +0 -0
  78. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/path_filters.py +0 -0
  79. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/pr_comment_renderer.py +0 -0
  80. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/pr_impact.py +0 -0
  81. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/progress.py +0 -0
  82. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/ranking_engine.py +0 -0
  83. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/redactor.py +0 -0
  84. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/relevance_scorer.py +0 -0
  85. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/repo_classifier.py +0 -0
  86. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/ris.py +0 -0
  87. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/runtime_classifier.py +0 -0
  88. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/scanner.py +0 -0
  89. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/schema.py +0 -0
  90. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/semantic_analyzer.py +0 -0
  91. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/serializer.py +0 -0
  92. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_event_topology.py +0 -0
  93. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_findings.py +0 -0
  94. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_impact.py +0 -0
  95. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_model.py +0 -0
  96. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_security_audit.py +0 -0
  97. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_semantic.py +0 -0
  98. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/spring_tx_analyzer.py +0 -0
  99. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/summarizer.py +0 -0
  100. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/__init__.py +0 -0
  101. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/config.py +0 -0
  102. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/consent.py +0 -0
  103. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/events.py +0 -0
  104. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/filters.py +0 -0
  105. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/telemetry/transport.py +0 -0
  106. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/tree_utils.py +0 -0
  107. {sourcecode-1.35.22 → sourcecode-1.35.23}/src/sourcecode/workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.35.22
3
+ Version: 1.35.23
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
@@ -40,7 +40,7 @@ Description-Content-Type: text/markdown
40
40
 
41
41
  **Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
42
42
 
43
- ![Version](https://img.shields.io/badge/version-1.35.20-blue)
43
+ ![Version](https://img.shields.io/badge/version-1.35.23-blue)
44
44
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
45
45
 
46
46
  ---
@@ -114,7 +114,7 @@ pipx install sourcecode
114
114
 
115
115
  ```bash
116
116
  sourcecode version
117
- # sourcecode 1.35.20
117
+ # sourcecode 1.35.23
118
118
  ```
119
119
 
120
120
  ---
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
4
4
 
5
- ![Version](https://img.shields.io/badge/version-1.35.20-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.35.23-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -76,7 +76,7 @@ pipx install sourcecode
76
76
 
77
77
  ```bash
78
78
  sourcecode version
79
- # sourcecode 1.35.20
79
+ # sourcecode 1.35.23
80
80
  ```
81
81
 
82
82
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.35.22"
7
+ version = "1.35.23"
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.35.22"
3
+ __version__ = "1.35.23"
@@ -244,11 +244,11 @@ def _route_to_canonical_endpoint(route: dict) -> CanonicalEndpoint:
244
244
  security_dict = route.get("security_annotations")
245
245
  security: Optional[CanonicalSecurity] = None
246
246
  if security_dict:
247
- # Determine source_scope from inheritance_depth:
248
- # depth=0 → annotation on method or class (method takes precedence)
249
- # depth>0 → inherited from parent class
250
247
  depth = route.get("inheritance_depth") or 0
251
- scope = "inherited" if depth > 0 else "method"
248
+ if depth > 0:
249
+ scope = "inherited"
250
+ else:
251
+ scope = security_dict.get("_scope", "method")
252
252
  security = CanonicalSecurity.from_policy_dict(security_dict, source_scope=scope)
253
253
 
254
254
  endpoint_id = CanonicalEndpoint.make_id(method, path, controller_class, handler_symbol)
@@ -422,7 +422,7 @@ def run_migrate_check(
422
422
 
423
423
  def _detect_spring_boot_2(root: Path) -> bool:
424
424
  """Return True if any pom.xml or build.gradle declares spring-boot 2.x."""
425
- _SB2 = re.compile(r"spring.boot[^\"'\n]*[\"']?2\.\d+", re.IGNORECASE)
425
+ _SB2 = re.compile(r"spring[-.]boot[^\"'\n]*[\"']?2\.\d+", re.IGNORECASE)
426
426
  for name in ("pom.xml", "build.gradle", "build.gradle.kts"):
427
427
  candidate = root / name
428
428
  try:
@@ -1034,6 +1034,12 @@ class TaskContextBuilder:
1034
1034
  if g
1035
1035
  ]
1036
1036
 
1037
+ _ris_key_deps = compact.get("key_dependencies") or []
1038
+ # Fall through to full analysis if deps expected but RIS has none.
1039
+ # RIS may have been built before dependency analysis was run on this repo.
1040
+ if spec.enable_dependencies and not _ris_key_deps:
1041
+ return None
1042
+
1037
1043
  return TaskOutput(
1038
1044
  task=task_name,
1039
1045
  goal=spec.goal,
@@ -1043,7 +1049,7 @@ class TaskContextBuilder:
1043
1049
  suspected_areas=[],
1044
1050
  improvement_opportunities=[],
1045
1051
  test_gaps=[],
1046
- key_dependencies=compact.get("key_dependencies") or [],
1052
+ key_dependencies=_ris_key_deps,
1047
1053
  code_notes_summary=None,
1048
1054
  limitations=[],
1049
1055
  confidence=compact.get("confidence") or compact.get("confidence_summary") or "high",
@@ -1303,7 +1309,20 @@ class TaskContextBuilder:
1303
1309
  from dataclasses import asdict
1304
1310
  from sourcecode.dependency_analyzer import DependencyAnalyzer
1305
1311
 
1306
- dep_records, dep_summary = DependencyAnalyzer().analyze(self.root)
1312
+ _dep_analyzer = DependencyAnalyzer()
1313
+ dep_records, dep_summary = _dep_analyzer.analyze(self.root)
1314
+ # For multi-module repos (Maven/Gradle), root pom.xml is a parent POM
1315
+ # with few deps. Per-workspace analysis finds the actual module deps.
1316
+ if workspace_analysis.workspaces:
1317
+ for _ws in workspace_analysis.workspaces:
1318
+ _ws_root = self.root / _ws.path
1319
+ if _ws_root.exists() and _ws_root.is_dir():
1320
+ try:
1321
+ _ws_deps, _ws_summary = _dep_analyzer.analyze(_ws_root)
1322
+ dep_records = dep_records + _ws_deps
1323
+ dep_summary.limitations.extend(_ws_summary.limitations)
1324
+ except Exception:
1325
+ pass
1307
1326
  primary_eco = stacks[0].stack if stacks else ""
1308
1327
  _direct_raw = [
1309
1328
  d for d in dep_records
@@ -2543,6 +2543,7 @@ def _route_security_from_sym(
2543
2543
  for candidate in filter(None, [method_sym, class_sym]):
2544
2544
  result = _extract_from(candidate)
2545
2545
  if result is not None:
2546
+ result["_scope"] = "class" if candidate is class_sym else "method"
2546
2547
  return result
2547
2548
  return None
2548
2549
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes