sourcecode 1.42.0__tar.gz → 1.44.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 (120) hide show
  1. {sourcecode-1.42.0 → sourcecode-1.44.0}/CHANGELOG.md +38 -0
  2. {sourcecode-1.42.0 → sourcecode-1.44.0}/PKG-INFO +3 -3
  3. {sourcecode-1.42.0 → sourcecode-1.44.0}/README.md +2 -2
  4. {sourcecode-1.42.0 → sourcecode-1.44.0}/pyproject.toml +1 -1
  5. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/repository_ir.py +26 -3
  7. {sourcecode-1.42.0 → sourcecode-1.44.0}/.github/workflows/build-windows.yml +0 -0
  8. {sourcecode-1.42.0 → sourcecode-1.44.0}/.gitignore +0 -0
  9. {sourcecode-1.42.0 → sourcecode-1.44.0}/.ruff.toml +0 -0
  10. {sourcecode-1.42.0 → sourcecode-1.44.0}/CONTRIBUTING.md +0 -0
  11. {sourcecode-1.42.0 → sourcecode-1.44.0}/LICENSE +0 -0
  12. {sourcecode-1.42.0 → sourcecode-1.44.0}/SECURITY.md +0 -0
  13. {sourcecode-1.42.0 → sourcecode-1.44.0}/raw +0 -0
  14. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/adaptive_scanner.py +0 -0
  15. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/architecture_analyzer.py +0 -0
  16. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/architecture_summary.py +0 -0
  17. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/ast_extractor.py +0 -0
  18. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/cache.py +0 -0
  19. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/canonical_ir.py +0 -0
  20. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/cir_graphs.py +0 -0
  21. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/classifier.py +0 -0
  22. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/cli.py +0 -0
  23. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  24. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/confidence_analyzer.py +0 -0
  25. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/context_scorer.py +0 -0
  26. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/context_summarizer.py +0 -0
  27. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/contract_model.py +0 -0
  28. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/contract_pipeline.py +0 -0
  29. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/coverage_parser.py +0 -0
  30. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/dependency_analyzer.py +0 -0
  31. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/__init__.py +0 -0
  32. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/base.py +0 -0
  33. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  34. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/dart.py +0 -0
  35. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/dotnet.py +0 -0
  36. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/elixir.py +0 -0
  37. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/go.py +0 -0
  38. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/heuristic.py +0 -0
  39. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/hybrid.py +0 -0
  40. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/java.py +0 -0
  41. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  42. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/nodejs.py +0 -0
  43. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/parsers.py +0 -0
  44. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/php.py +0 -0
  45. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/project.py +0 -0
  46. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/python.py +0 -0
  47. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/ruby.py +0 -0
  48. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/rust.py +0 -0
  49. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/systems.py +0 -0
  50. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/terraform.py +0 -0
  51. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/detectors/tooling.py +0 -0
  52. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/doc_analyzer.py +0 -0
  53. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  54. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/env_analyzer.py +0 -0
  55. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/error_schema.py +0 -0
  56. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/explain.py +0 -0
  57. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/file_chunker.py +0 -0
  58. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/file_classifier.py +0 -0
  59. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/flow_analyzer.py +0 -0
  60. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/format_contract.py +0 -0
  61. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/fqn_utils.py +0 -0
  62. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/git_analyzer.py +0 -0
  63. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/graph_analyzer.py +0 -0
  64. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/license.py +0 -0
  65. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/__init__.py +0 -0
  66. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  67. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  68. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  69. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  70. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  71. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  72. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/registry.py +0 -0
  73. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/runner.py +0 -0
  74. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp/server.py +0 -0
  75. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/mcp_nudge.py +0 -0
  76. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/metrics_analyzer.py +0 -0
  77. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/migrate_check.py +0 -0
  78. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/openapi_surface.py +0 -0
  79. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/output_budget.py +0 -0
  80. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/path_filters.py +0 -0
  81. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  82. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/pr_impact.py +0 -0
  83. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/prepare_context.py +0 -0
  84. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/progress.py +0 -0
  85. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/ranking_engine.py +0 -0
  86. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/redactor.py +0 -0
  87. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/relevance_scorer.py +0 -0
  88. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/rename_refactor.py +0 -0
  89. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/repo_classifier.py +0 -0
  90. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/ris.py +0 -0
  91. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/runtime_classifier.py +0 -0
  92. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/scanner.py +0 -0
  93. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/schema.py +0 -0
  94. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/security_config.py +0 -0
  95. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/semantic_analyzer.py +0 -0
  96. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/serializer.py +0 -0
  97. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_event_topology.py +0 -0
  98. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_findings.py +0 -0
  99. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_impact.py +0 -0
  100. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_model.py +0 -0
  101. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_security_audit.py +0 -0
  102. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_semantic.py +0 -0
  103. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  104. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/summarizer.py +0 -0
  105. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/__init__.py +0 -0
  106. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/config.py +0 -0
  107. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/consent.py +0 -0
  108. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/events.py +0 -0
  109. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/filters.py +0 -0
  110. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/telemetry/transport.py +0 -0
  111. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/tree_utils.py +0 -0
  112. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/validation_surface.py +0 -0
  113. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/version_check.py +0 -0
  114. {sourcecode-1.42.0 → sourcecode-1.44.0}/src/sourcecode/workspace.py +0 -0
  115. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/functions/README.md +0 -0
  116. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/functions/get-license/index.ts +0 -0
  117. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  118. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/functions/telemetry/index.ts +0 -0
  119. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/sql/license_event_ordering.sql +0 -0
  120. {sourcecode-1.42.0 → sourcecode-1.44.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.44.0] — 2026-06-16
4
+
5
+ ### Fixed
6
+ - **CH-004c — annotation-free structural classes dropped their inheritance edges.**
7
+ `build_repo_ir`'s fast pre-scan skips files with no recognized annotation marker,
8
+ emitting only minimal class-name symbols (for same-package resolution) and **no
9
+ relations**. A class with no annotation and no injected field of its own that
10
+ participates purely structurally — `class X extends Base implements I {}` — therefore
11
+ lost its `extends`/`implements` edges, so `implementation_graph` could not link
12
+ sub→supertype and impact analysis could not traverse the hierarchy. The pre-scan now
13
+ also keeps a file when a type declaration carries an `extends`/`implements` clause
14
+ (`_INHERIT_PRESCAN_RE`), routing it through full extraction so its inheritance edges
15
+ are built and resolved in pass 2 with the same-package map. Annotation-free leaf
16
+ classes with no inheritance still skip, preserving the pre-scan optimization. Closes
17
+ the last open layer of CH-004 (a/b shipped in 1.43.0).
18
+
19
+ ## [1.43.0] — 2026-06-16
20
+
21
+ ### Fixed
22
+ - **CH-004a — impact graph dropped field-injection-only classes.** `build_repo_ir`'s fast
23
+ pre-scan skips files with no recognized annotation marker; the marker set included
24
+ `@Inject` but not `@Autowired`, `@Resource`, `@Qualifier`, or `@Value`. A class wired
25
+ purely by field injection with no class-level stereotype (e.g. an abstract base controller
26
+ that holds the services its concrete subclasses inherit) was skipped entirely, so its
27
+ `injects` edges never existed and `impact-chain` could not traverse through it. Added the
28
+ field/setter-injection annotations (`@Autowired`, `@Resource`, `@Qualifier`, `@Value`,
29
+ `@PersistenceContext`, `@PersistenceUnit`) to the pre-scan marker set.
30
+ - **CH-004b — same-package supertypes were not FQN-resolved.** The `extends`/`implements`
31
+ edge builder resolved supertype names only via `import_map`, so a same-package
32
+ `extends Base` (which needs no Java import) produced a **bare-name** edge target. The
33
+ `implementation_graph` could then not link sub→supertype, making same-package class
34
+ hierarchies invisible to impact analysis. Supertypes are now resolved via
35
+ `_resolve_dep_type` (import + same-package + wildcard), matching `injects`/constructor edges.
36
+
37
+ Both fixes were surfaced by a field test on BroadleafCommerce (2985-file monolith); they
38
+ under-reported blast radius on any large repo, not just that one. See
39
+ `docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md`.
40
+
3
41
  ## [1.42.0] — 2026-06-16
4
42
 
5
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.42.0
3
+ Version: 1.44.0
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.39.0-blue)
43
+ ![Version](https://img.shields.io/badge/version-1.44.0-blue)
44
44
  ![Python](https://img.shields.io/badge/python-3.9%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.39.0
117
+ # sourcecode 1.44.0
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.39.0-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.44.0-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.9%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.39.0
79
+ # sourcecode 1.44.0
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.42.0"
7
+ version = "1.44.0"
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.42.0"
3
+ __version__ = "1.44.0"
@@ -131,6 +131,15 @@ _CLASS_DECL_RE = re.compile(
131
131
  r'\s*\{',
132
132
  )
133
133
 
134
+ # CH-004c: detect a type declaration that participates structurally via inheritance
135
+ # (`class X extends Base` / `interface I extends A` / `class C implements I`). Used by
136
+ # the fast pre-scan to NOT skip annotation-free files that still own extends/implements
137
+ # edges the impact graph needs. `[^{;]*?` keeps the match within a single declaration
138
+ # head (stops at the body `{` or a `;`), matching the precision of _CLASS_DECL_RE.
139
+ _INHERIT_PRESCAN_RE = re.compile(
140
+ r'\b(?:class|interface)\s+[A-Z]\w*[^{;]*?\b(?:extends|implements)\b'
141
+ )
142
+
134
143
  _METHOD_DECL_RE = re.compile(
135
144
  r'^(?P<modifiers>(?:(?:public|private|protected|static|final|synchronized'
136
145
  r'|abstract|default|native|strictfp|override)\s+)*)'
@@ -1265,7 +1274,11 @@ def _build_relations(
1265
1274
  # commas so each base produces its own edge and the reverse graph sees
1266
1275
  # every supertype (not a single mangled token).
1267
1276
  for base in _split_supertype_list(extends_str):
1268
- to = import_map.get(base, base)
1277
+ # CH-004: resolve same-package / wildcard-imported supertypes to their
1278
+ # FQN (not just import_map), else a same-package `extends Base` stays a
1279
+ # bare name and the implementation_graph cannot link sub→supertype.
1280
+ _sbase = re.sub(r'<.*', '', base).strip()
1281
+ to = _resolve_dep_type(_sbase) or import_map.get(_sbase, base)
1269
1282
  edges.append(RelationEdge(
1270
1283
  from_symbol=class_fqn,
1271
1284
  to_symbol=to,
@@ -1276,7 +1289,8 @@ def _build_relations(
1276
1289
 
1277
1290
  if implements_str:
1278
1291
  for base in _split_supertype_list(implements_str):
1279
- to = import_map.get(base, base)
1292
+ _sbase = re.sub(r'<.*', '', base).strip()
1293
+ to = _resolve_dep_type(_sbase) or import_map.get(_sbase, base)
1280
1294
  edges.append(RelationEdge(
1281
1295
  from_symbol=class_fqn,
1282
1296
  to_symbol=to,
@@ -3127,6 +3141,14 @@ def build_repo_ir(
3127
3141
  '@RequiredArgsConstructor', '@AllArgsConstructor',
3128
3142
  '@Inject', '@ApplicationScoped', '@RequestScoped', '@Singleton',
3129
3143
  '@EnableMethodSecurity', '@EnableGlobalMethodSecurity',
3144
+ # Field/setter injection markers (CH-004). A class wired purely by field
3145
+ # injection — no class-level stereotype — is still a node in the DI graph:
3146
+ # e.g. an abstract base controller that holds @Autowired/@Resource services
3147
+ # its concrete subclasses inherit. Omitting these pre-scan-skips such classes,
3148
+ # dropping their injects edges, so impact-chain cannot reach callers through
3149
+ # them (Broadleaf: AbstractCheckoutController → checkout endpoints went missing).
3150
+ '@Autowired', '@Resource', '@Qualifier', '@Value',
3151
+ '@PersistenceContext', '@PersistenceUnit',
3130
3152
  # JPA / persistence (needed for stereotype detection in all commands)
3131
3153
  '@Entity', '@MappedSuperclass', '@Embeddable',
3132
3154
  # AOP / messaging / event sourcing
@@ -3173,7 +3195,8 @@ def build_repo_ir(
3173
3195
  _meta_chars_read += len(source)
3174
3196
  # Fast pre-scan: if file has no relevant annotations skip full extraction.
3175
3197
  # Still register package/class name for same-package resolution.
3176
- if not any(marker in source for marker in _effective_markers):
3198
+ if not any(marker in source for marker in _effective_markers) \
3199
+ and not _INHERIT_PRESCAN_RE.search(source):
3177
3200
  pkg_m = _PKG_RE.search(source)
3178
3201
  _pkg = pkg_m.group(1) if pkg_m else ""
3179
3202
  # Minimal class-name symbols for same-package map (no methods/fields)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes