sourcecode 1.54.0__py3-none-any.whl → 1.56.0__py3-none-any.whl
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.
- sourcecode/__init__.py +1 -1
- sourcecode/contract_pipeline.py +4 -2
- sourcecode/license.py +53 -4
- sourcecode/spring_impact.py +124 -1
- {sourcecode-1.54.0.dist-info → sourcecode-1.56.0.dist-info}/METADATA +7 -4
- {sourcecode-1.54.0.dist-info → sourcecode-1.56.0.dist-info}/RECORD +9 -9
- {sourcecode-1.54.0.dist-info → sourcecode-1.56.0.dist-info}/WHEEL +0 -0
- {sourcecode-1.54.0.dist-info → sourcecode-1.56.0.dist-info}/entry_points.txt +0 -0
- {sourcecode-1.54.0.dist-info → sourcecode-1.56.0.dist-info}/licenses/LICENSE +0 -0
sourcecode/__init__.py
CHANGED
sourcecode/contract_pipeline.py
CHANGED
|
@@ -634,11 +634,13 @@ def _find_symbol_files(
|
|
|
634
634
|
try:
|
|
635
635
|
result = subprocess.run(
|
|
636
636
|
[
|
|
637
|
-
"grep", "-
|
|
637
|
+
"grep", "-rlF",
|
|
638
638
|
"--include=*.ts", "--include=*.tsx",
|
|
639
639
|
"--include=*.js", "--include=*.jsx",
|
|
640
640
|
"--include=*.py", "--include=*.java",
|
|
641
|
-
symbol
|
|
641
|
+
# -e guards a symbol that begins with '-' from being parsed as a
|
|
642
|
+
# flag; -- terminates options so the search root can't be either.
|
|
643
|
+
"-e", symbol, "--", ".",
|
|
642
644
|
],
|
|
643
645
|
cwd=str(root),
|
|
644
646
|
capture_output=True,
|
sourcecode/license.py
CHANGED
|
@@ -45,7 +45,33 @@ _DEFAULT_SUPABASE_URL: str = "https://qkndlmyekvujjdgthtmz.supabase.co"
|
|
|
45
45
|
# Paste your project's anon key here so `sourcecode activate` works out of the
|
|
46
46
|
# box; env var still overrides for testing against another project.
|
|
47
47
|
_DEFAULT_SUPABASE_ANON_KEY: str = "sb_publishable_qiJFLWjbBbTqjg-fb0mAGA_cl8PBOKH"
|
|
48
|
-
|
|
48
|
+
def _safe_supabase_url(override: "Optional[str]") -> str:
|
|
49
|
+
"""Validate the SOURCECODE_SUPABASE_URL override before trusting it.
|
|
50
|
+
|
|
51
|
+
The license key is POSTed to this host, so a plaintext ``http://`` endpoint
|
|
52
|
+
would expose the credential on the wire. Allow ``https://`` to any host, and
|
|
53
|
+
``http://`` only to loopback (Supabase local dev serves on
|
|
54
|
+
``http://127.0.0.1:54321``). Anything else is rejected back to the default.
|
|
55
|
+
"""
|
|
56
|
+
if not override or override == _DEFAULT_SUPABASE_URL:
|
|
57
|
+
return _DEFAULT_SUPABASE_URL
|
|
58
|
+
from urllib.parse import urlparse
|
|
59
|
+
|
|
60
|
+
parsed = urlparse(override)
|
|
61
|
+
host = (parsed.hostname or "").lower()
|
|
62
|
+
is_loopback = host in {"localhost", "127.0.0.1", "::1"}
|
|
63
|
+
if parsed.scheme == "https" or (parsed.scheme == "http" and is_loopback):
|
|
64
|
+
return override
|
|
65
|
+
sys.stderr.write(
|
|
66
|
+
f"[sourcecode] WARNING: ignoring SOURCECODE_SUPABASE_URL={override!r} — "
|
|
67
|
+
"must be https:// (or http:// to localhost). Using the default endpoint "
|
|
68
|
+
"to avoid sending the license key over plaintext.\n"
|
|
69
|
+
)
|
|
70
|
+
sys.stderr.flush()
|
|
71
|
+
return _DEFAULT_SUPABASE_URL
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
_SUPABASE_URL: str = _safe_supabase_url(os.environ.get("SOURCECODE_SUPABASE_URL"))
|
|
49
75
|
_SUPABASE_ANON_KEY: str = os.environ.get(
|
|
50
76
|
"SOURCECODE_SUPABASE_ANON_KEY",
|
|
51
77
|
_DEFAULT_SUPABASE_ANON_KEY,
|
|
@@ -152,12 +178,35 @@ _license_data: Optional[dict] = None
|
|
|
152
178
|
is_pro: bool = False
|
|
153
179
|
|
|
154
180
|
|
|
181
|
+
def _secure_dir() -> None:
|
|
182
|
+
"""Create ~/.sourcecode owner-only (0700). Holds the license secret.
|
|
183
|
+
|
|
184
|
+
``mkdir(mode=...)`` is ignored when the dir already exists, so chmod
|
|
185
|
+
unconditionally. Best-effort: a chmod failure (e.g. Windows) is non-fatal.
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
_LICENSE_DIR.mkdir(parents=True, exist_ok=True)
|
|
189
|
+
os.chmod(_LICENSE_DIR, 0o700)
|
|
190
|
+
except OSError:
|
|
191
|
+
pass
|
|
192
|
+
|
|
193
|
+
|
|
155
194
|
def _write_license_file(data: dict) -> None:
|
|
156
|
-
"""Atomically write license data via tmp file + rename.
|
|
195
|
+
"""Atomically write license data via tmp file + rename, owner-only (0600).
|
|
196
|
+
|
|
197
|
+
The payload contains the Pro ``license_key`` and account email, so the file
|
|
198
|
+
must not be world/group-readable on shared hosts. Permissions are set on the
|
|
199
|
+
tmp file *before* the rename so there is no readable window at the final path.
|
|
200
|
+
"""
|
|
201
|
+
_secure_dir()
|
|
157
202
|
payload = json.dumps(data, indent=2, ensure_ascii=False).encode("utf-8")
|
|
158
203
|
tmp = _LICENSE_FILE.with_suffix(".tmp")
|
|
159
204
|
try:
|
|
160
205
|
tmp.write_bytes(payload)
|
|
206
|
+
try:
|
|
207
|
+
os.chmod(tmp, 0o600)
|
|
208
|
+
except OSError:
|
|
209
|
+
pass
|
|
161
210
|
tmp.replace(_LICENSE_FILE)
|
|
162
211
|
except Exception:
|
|
163
212
|
try:
|
|
@@ -192,7 +241,7 @@ def check_delta_free_tier(repo_path: str) -> "tuple[bool, int, int]":
|
|
|
192
241
|
new_used = used + 1
|
|
193
242
|
runs[key] = new_used
|
|
194
243
|
try:
|
|
195
|
-
|
|
244
|
+
_secure_dir()
|
|
196
245
|
tmp = _DELTA_RUNS_FILE.with_suffix(".tmp")
|
|
197
246
|
tmp.write_text(json.dumps(runs, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
198
247
|
tmp.replace(_DELTA_RUNS_FILE)
|
|
@@ -506,7 +555,7 @@ def activate_license(license_key: str) -> None:
|
|
|
506
555
|
_emit_telemetry("activation", feature="key", success=False, error_kind="NotPro")
|
|
507
556
|
_fail("not_pro", "This license is not a Pro license.")
|
|
508
557
|
|
|
509
|
-
|
|
558
|
+
_secure_dir()
|
|
510
559
|
now = datetime.now(timezone.utc).isoformat()
|
|
511
560
|
data = {
|
|
512
561
|
"license_key": license_key,
|
sourcecode/spring_impact.py
CHANGED
|
@@ -182,6 +182,25 @@ _INERT_MARKER_SUPERTYPES = frozenset({
|
|
|
182
182
|
"Externalizable", "java.io.Externalizable",
|
|
183
183
|
})
|
|
184
184
|
|
|
185
|
+
# Concrete JDK base classes extended for implementation reuse, NOT framework-DI
|
|
186
|
+
# interfaces. `class Foo extends ArrayList` is code reuse, not polymorphic wiring,
|
|
187
|
+
# and consumers that merely hold an ArrayList/InputStream field are not callers of
|
|
188
|
+
# Foo. Validated on BroadleafCommerce: without this, CH-007 mis-recovered consumers
|
|
189
|
+
# of ArrayList/Stack/InputStream as callers of EmptyFilterValues/IdentityUtilContext/
|
|
190
|
+
# ResourceInputStream. Simple-name match (the external type is, by definition, not in-repo).
|
|
191
|
+
_NON_DI_SUPERTYPES = frozenset({
|
|
192
|
+
# java.util containers
|
|
193
|
+
"ArrayList", "LinkedList", "Vector", "Stack", "HashMap", "LinkedHashMap",
|
|
194
|
+
"TreeMap", "HashSet", "LinkedHashSet", "TreeSet", "ArrayDeque", "Properties",
|
|
195
|
+
"AbstractList", "AbstractMap", "AbstractSet", "AbstractCollection", "EnumMap",
|
|
196
|
+
# java.io / java.nio streams + readers
|
|
197
|
+
"InputStream", "OutputStream", "Reader", "Writer", "FilterInputStream",
|
|
198
|
+
"FilterOutputStream", "ByteArrayInputStream", "ByteArrayOutputStream",
|
|
199
|
+
# java.lang base classes
|
|
200
|
+
"Object", "Thread", "Throwable", "Exception", "RuntimeException", "Error",
|
|
201
|
+
"Number", "Enum", "ClassLoader", "ThreadLocal",
|
|
202
|
+
})
|
|
203
|
+
|
|
185
204
|
|
|
186
205
|
def _external_supertypes(cir, class_fqn: str) -> list[str]:
|
|
187
206
|
"""Return supertypes of class_fqn that are NOT in-repo symbols.
|
|
@@ -212,6 +231,8 @@ def _external_supertypes(cir, class_fqn: str) -> list[str]:
|
|
|
212
231
|
simple = to.rsplit(".", 1)[1] if "." in to else to
|
|
213
232
|
if simple in _INERT_MARKER_SUPERTYPES or to in _INERT_MARKER_SUPERTYPES:
|
|
214
233
|
continue
|
|
234
|
+
if simple in _NON_DI_SUPERTYPES:
|
|
235
|
+
continue # concrete JDK base extended for reuse, not DI dispatch
|
|
215
236
|
# Internal if it resolves to exactly one in-repo class (exact or simple-name).
|
|
216
237
|
if to in known:
|
|
217
238
|
continue
|
|
@@ -246,6 +267,51 @@ def _is_unmodeled_value_type(cir, class_fqn: str, model) -> bool:
|
|
|
246
267
|
return True
|
|
247
268
|
|
|
248
269
|
|
|
270
|
+
# CH-007 — external-interface DI bridge (caller recovery)
|
|
271
|
+
# ---------------------------------------------------------------------------
|
|
272
|
+
# When a class is reachable only through an external interface it implements
|
|
273
|
+
# (the CH-005 blind spot), its consumers inject/reference the *external* type,
|
|
274
|
+
# never the impl — so no reverse-graph edge names the impl and CH-001b (in-repo
|
|
275
|
+
# interface expansion) cannot bridge. The wiring sites are still in-repo, though:
|
|
276
|
+
# the raw dependency edges record `<consumer> -[injects|calls|instantiates|returns]->
|
|
277
|
+
# <external interface>`. Read those to recover the consumer classes, and count how
|
|
278
|
+
# many in-repo classes implement/extend each external supertype: exactly one means
|
|
279
|
+
# the binding is unambiguous (this impl IS the injected bean); several means any
|
|
280
|
+
# could be, so recover all candidates and flag the ambiguity rather than assert.
|
|
281
|
+
_DI_USE_EDGE_TYPES = frozenset({"injects", "calls", "instantiates", "returns"})
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def _recover_external_iface_callers(
|
|
285
|
+
cir, external_supertypes: list[str], impl_class_fqn: str
|
|
286
|
+
) -> tuple[list[str], int]:
|
|
287
|
+
"""Recover in-repo wiring/consumer classes for an impl wired via an external
|
|
288
|
+
interface (CH-007). See module note above.
|
|
289
|
+
|
|
290
|
+
Returns ``(recovered_caller_classes, max_impl_count)`` where max_impl_count is
|
|
291
|
+
the largest number of in-repo implementors across the matched supertypes — 1
|
|
292
|
+
means the impl→bean binding is unambiguous, >1 means it is not.
|
|
293
|
+
"""
|
|
294
|
+
deps = getattr(cir, "dependencies", None) or []
|
|
295
|
+
ext = set(external_supertypes)
|
|
296
|
+
if not ext:
|
|
297
|
+
return [], 0
|
|
298
|
+
recovered: list[str] = []
|
|
299
|
+
impl_count: dict[str, int] = {e: 0 for e in ext}
|
|
300
|
+
for edge in deps:
|
|
301
|
+
to = (edge.get("to") or "").strip()
|
|
302
|
+
if to not in ext:
|
|
303
|
+
continue
|
|
304
|
+
et = edge.get("type")
|
|
305
|
+
if et in ("implements", "extends"):
|
|
306
|
+
impl_count[to] = impl_count.get(to, 0) + 1
|
|
307
|
+
elif et in _DI_USE_EDGE_TYPES:
|
|
308
|
+
owner = normalize_owner_fqn((edge.get("from") or "").strip())
|
|
309
|
+
if owner and owner != impl_class_fqn:
|
|
310
|
+
recovered.append(owner)
|
|
311
|
+
max_impl = max(impl_count.values()) if impl_count else 0
|
|
312
|
+
return list(dict.fromkeys(recovered)), max_impl
|
|
313
|
+
|
|
314
|
+
|
|
249
315
|
# ---------------------------------------------------------------------------
|
|
250
316
|
# Symbol resolution
|
|
251
317
|
# ---------------------------------------------------------------------------
|
|
@@ -846,7 +912,57 @@ class ImpactOrchestrator:
|
|
|
846
912
|
if empty_blast and class_level_seed:
|
|
847
913
|
external_supertypes = _external_supertypes(cir, resolved_symbol)
|
|
848
914
|
framework_di_blind_spot = bool(external_supertypes)
|
|
915
|
+
|
|
916
|
+
# CH-007: external-interface DI bridge. Before treating the empty result as a
|
|
917
|
+
# blind spot, recover the in-repo wiring/consumer classes that inject the
|
|
918
|
+
# external supertype (they never name this impl, so the BFS missed them).
|
|
919
|
+
di_recovered_callers: list[str] = []
|
|
920
|
+
di_binding_ambiguous = False
|
|
849
921
|
if framework_di_blind_spot:
|
|
922
|
+
di_recovered_callers, _max_impl = _recover_external_iface_callers(
|
|
923
|
+
cir, external_supertypes, resolved_symbol
|
|
924
|
+
)
|
|
925
|
+
di_binding_ambiguous = _max_impl > 1
|
|
926
|
+
# Keep only genuinely new caller classes (not seeds / already found).
|
|
927
|
+
_known = set(seed_fqns) | set(direct_callers) | set(indirect_callers)
|
|
928
|
+
di_recovered_callers = [c for c in di_recovered_callers if c not in _known]
|
|
929
|
+
|
|
930
|
+
di_recovered = bool(di_recovered_callers)
|
|
931
|
+
if di_recovered:
|
|
932
|
+
# Merge recovered wiring sites into the chain and recompute the views
|
|
933
|
+
# that depend on the caller set (endpoints, findings, surfaces, risk).
|
|
934
|
+
direct_callers = direct_callers + di_recovered_callers
|
|
935
|
+
empty_blast = False
|
|
936
|
+
all_callers = direct_callers + indirect_callers
|
|
937
|
+
endpoints_affected = _collect_endpoints(all_callers, seed_fqns, model)
|
|
938
|
+
impact_findings_raw = _filter_findings(
|
|
939
|
+
all_findings, seed_fqns, direct_callers, indirect_callers, endpoints_affected
|
|
940
|
+
)
|
|
941
|
+
impact_findings_raw.sort(
|
|
942
|
+
key=lambda f: (SEVERITY_ORDER.get(f.severity, 9), f.symbol)
|
|
943
|
+
)
|
|
944
|
+
impact_findings = [f.to_dict() for f in impact_findings_raw]
|
|
945
|
+
security_surfaces = _build_security_surfaces(endpoints_affected, impact_findings_raw)
|
|
946
|
+
risk_level, risk_score = _compute_risk(
|
|
947
|
+
len(direct_callers), len(indirect_callers),
|
|
948
|
+
len(endpoints_affected), impact_findings_raw,
|
|
949
|
+
)
|
|
950
|
+
_ambig = (
|
|
951
|
+
" Binding is ambiguous (the external type has multiple in-repo "
|
|
952
|
+
"implementors); the recovered caller(s) wire one of them — verify "
|
|
953
|
+
"which bean is configured." if di_binding_ambiguous else ""
|
|
954
|
+
)
|
|
955
|
+
warnings.append(
|
|
956
|
+
f"External-interface DI bridge (CH-007): recovered "
|
|
957
|
+
f"{len(di_recovered_callers)} in-repo wiring/consumer class(es) that "
|
|
958
|
+
"inject the external supertype(s) [" + ", ".join(external_supertypes)
|
|
959
|
+
+ "] this class implements. These callers reference the interface, not "
|
|
960
|
+
"this class directly, so the static call-graph missed them. They reach "
|
|
961
|
+
"this class only if it is the bean configured for that interface — the "
|
|
962
|
+
"interface may also have framework/third-party implementations; verify "
|
|
963
|
+
"the wiring." + _ambig
|
|
964
|
+
)
|
|
965
|
+
elif framework_di_blind_spot:
|
|
850
966
|
warnings.append(
|
|
851
967
|
"Framework/external-interface DI blind spot (CH-005): this class "
|
|
852
968
|
"implements/extends external type(s) [" + ", ".join(external_supertypes)
|
|
@@ -900,6 +1016,10 @@ class ImpactOrchestrator:
|
|
|
900
1016
|
confidence: str
|
|
901
1017
|
if resolution == "not_found":
|
|
902
1018
|
confidence = "low"
|
|
1019
|
+
elif di_recovered:
|
|
1020
|
+
# Callers recovered structurally via the external-interface DI bridge.
|
|
1021
|
+
# Unambiguous binding (single in-repo impl) → medium; ambiguous → low.
|
|
1022
|
+
confidence = "low" if di_binding_ambiguous else "medium"
|
|
903
1023
|
elif framework_di_blind_spot or value_type_blind_spot or unresolved_ref_blind_spot:
|
|
904
1024
|
confidence = "low"
|
|
905
1025
|
elif resolution == "partial" or confidence_reducing:
|
|
@@ -931,11 +1051,14 @@ class ImpactOrchestrator:
|
|
|
931
1051
|
"model_build_time_ms": model.build_time_ms,
|
|
932
1052
|
"query_time_ms": elapsed_ms,
|
|
933
1053
|
"blind_spots": (
|
|
934
|
-
|
|
1054
|
+
# framework_di stops being a blind spot once CH-007 recovers callers
|
|
1055
|
+
(["framework_di"] if framework_di_blind_spot and not di_recovered else [])
|
|
935
1056
|
+ (["value_type"] if value_type_blind_spot else [])
|
|
936
1057
|
+ (["unresolved_refs"] if unresolved_ref_blind_spot else [])
|
|
937
1058
|
),
|
|
938
1059
|
"external_supertypes": external_supertypes,
|
|
1060
|
+
"external_iface_callers_recovered": len(di_recovered_callers),
|
|
1061
|
+
"external_iface_binding_ambiguous": di_binding_ambiguous,
|
|
939
1062
|
},
|
|
940
1063
|
)
|
|
941
1064
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.56.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
|
-

|
|
44
44
|

|
|
45
45
|
|
|
46
46
|
---
|
|
@@ -459,9 +459,12 @@ Unlike `impact` (which traces the caller graph), `impact-chain` builds on the Sp
|
|
|
459
459
|
| `impact_findings` | TX-001..005 and SEC-001..003 findings that touch the call chain |
|
|
460
460
|
| `risk_level` | `critical` \| `high` \| `medium` \| `low` |
|
|
461
461
|
| `confidence` | `high` \| `medium` \| `low` — `low` on a detected blind spot, `medium` on partial resolution or capped traversal. Informational interface↔impl expansion notices do **not** lower it, so a clean resolved query stays `high`. |
|
|
462
|
-
| `metadata.blind_spots` | `framework_di` and/or `value_type` when an empty result is unmodeled-edge driven, not real dead code |
|
|
462
|
+
| `metadata.blind_spots` | `framework_di` and/or `value_type` when an empty result is unmodeled-edge driven, not real dead code (CH-007 drops `framework_di` once it recovers the wiring callers) |
|
|
463
|
+
| `metadata.external_iface_callers_recovered` / `external_iface_binding_ambiguous` | CH-007 — count of in-repo wiring callers recovered through an external interface, and whether the impl→bean binding is ambiguous (multiple in-repo implementors) |
|
|
463
464
|
|
|
464
|
-
**Framework/DI blind spot (CH-005).** An empty blast radius is ambiguous: genuinely unused, or invoked through an edge the static graph does not model. When the target class implements/extends an **external** framework type (e.g. Spring Security's `RedirectStrategy`, a servlet `Filter`) it is typically wired by framework DI/config and invoked polymorphically — no in-repo edge names its methods, so `direct_callers` is `0`. Rather than report that as `risk:low` at high confidence (a dangerous false negative that reads as "safe to change"), `impact-chain` detects the external supertype, drops `confidence` to `low`, lists it in `metadata.external_supertypes`, and emits a `CH-005` warning telling you to search the DI/security/config wiring for the supertype. Inert markers (`Serializable`, `Cloneable`) are excluded.
|
|
465
|
+
**Framework/DI blind spot (CH-005).** An empty blast radius is ambiguous: genuinely unused, or invoked through an edge the static graph does not model. When the target class implements/extends an **external** framework type (e.g. Spring Security's `RedirectStrategy`, a servlet `Filter`) it is typically wired by framework DI/config and invoked polymorphically — no in-repo edge names its methods, so `direct_callers` is `0`. Rather than report that as `risk:low` at high confidence (a dangerous false negative that reads as "safe to change"), `impact-chain` detects the external supertype, drops `confidence` to `low`, lists it in `metadata.external_supertypes`, and emits a `CH-005` warning telling you to search the DI/security/config wiring for the supertype. Inert markers (`Serializable`, `Cloneable`) and concrete JDK base classes extended for reuse (`ArrayList`, `InputStream`, …) are excluded.
|
|
466
|
+
|
|
467
|
+
**External-interface DI caller recovery (CH-007).** When the target is wired through an external interface, the consumers that inject that interface never name the target, so the static caller graph misses them — but the wiring sites are still in-repo. `impact-chain` reads the dependency edges to recover the in-repo classes that inject/use the external supertype and attributes them as callers (so their endpoints map too). If exactly one in-repo class implements the interface the binding is unambiguous (`confidence:medium`); if several do, `metadata.external_iface_binding_ambiguous` is `true` and confidence stays `low`. `metadata.external_iface_callers_recovered` reports the count. Recovered callers reach the target only if it is the bean configured for that interface (which may also have framework/third-party implementations) — the warning says so. Validated on BroadleafCommerce: querying a `UserDetailsService` implementation recovers the security-config and login-service classes that wire it.
|
|
465
468
|
|
|
466
469
|
**Caller precision (CH-006).** `implements`/`extends` are structural type declarations, not calls — so they are excluded from the caller graph. Querying a class that implements a high-fanout interface (e.g. a 40-implementor `CustomEndpoint` or a shared `Mapper<E,D>` base) does **not** report its sibling implementors as callers; only real `injects`/`calls` edges count. This prevents a leaf class from being inflated to a large false blast radius.
|
|
467
470
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=Pkp631Fn1N1LTXdXhECw7jwtP1qHPqYOjr7-FG3sUJc,103
|
|
2
2
|
sourcecode/adaptive_scanner.py,sha256=XffluXKzJUXrMtjEiAOnSNPZnztdIcts17T9ouHeID0,10521
|
|
3
3
|
sourcecode/architecture_analyzer.py,sha256=liCwQmLgb5vplohy8arjYxs_HOIv5C9MjLh_gY6bc5Q,44115
|
|
4
4
|
sourcecode/architecture_summary.py,sha256=z34_6v7cSwy98cof2UVciGho7SCrZ93tiqMmq5WNzRQ,20405
|
|
@@ -13,7 +13,7 @@ sourcecode/confidence_analyzer.py,sha256=_jckZSxksV-OU38vbkxfVNBnWCtlCq8Vwfg23x1
|
|
|
13
13
|
sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
|
|
14
14
|
sourcecode/context_summarizer.py,sha256=zlbm8ytdvJToohU108-dwBmEl52xl0gXpf6PZBOW_2A,6540
|
|
15
15
|
sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,3917
|
|
16
|
-
sourcecode/contract_pipeline.py,sha256=
|
|
16
|
+
sourcecode/contract_pipeline.py,sha256=bNn9SYtwfI1CGKlYGxewexlp7_IWhpwSCae-BMuuVwQ,28895
|
|
17
17
|
sourcecode/coverage_parser.py,sha256=q0LeZJaX1bnntLu-ImksdBsMlpsVmk_iUfSaB4eaJGo,19702
|
|
18
18
|
sourcecode/dependency_analyzer.py,sha256=qEnRiKFkleZJyLf_DyznJbWD1GJ881iG4RRDqH9oGQ4,61524
|
|
19
19
|
sourcecode/doc_analyzer.py,sha256=05bjTUbDbmnbajD_cgRnACzS8T7xxBKVX4CjkJlhZg8,24411
|
|
@@ -29,7 +29,7 @@ sourcecode/fqn_utils.py,sha256=XLU7zDkNBXz_RZkIUNfpPmp1nekWtqP-fxV92tDV1vg,2158
|
|
|
29
29
|
sourcecode/git_analyzer.py,sha256=JStxTQXNjBWi_wLdwhsZs9mT-v50cSJIz4Agzn6Kh9I,13362
|
|
30
30
|
sourcecode/graph_analyzer.py,sha256=DHR8fY69oU_Pi4SYaWboX6EoEFrctQKB9dsjpqwGMzw,62403
|
|
31
31
|
sourcecode/integration_detector.py,sha256=ZJqrGwvZ4ee2JTGhlazKk67aZi173HxkhNpl8Yntpd8,6503
|
|
32
|
-
sourcecode/license.py,sha256=
|
|
32
|
+
sourcecode/license.py,sha256=JD-1pnH_2XR9lKr9p9KQZn9U31I9e5o6GYsN1XCVccw,22577
|
|
33
33
|
sourcecode/mcp_nudge.py,sha256=5ELU_ixzh6uA83NXLOZT8h00OhL53okfQdji3jyKOjg,2917
|
|
34
34
|
sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
|
|
35
35
|
sourcecode/migrate_check.py,sha256=H8iy7Vk8cGL0dnR3ZkFPS20CtfF5LJWuzQVQE4awQ9s,56192
|
|
@@ -55,7 +55,7 @@ sourcecode/semantic_analyzer.py,sha256=4OdG6tTSnTvq3_dSWMbQu8Ad1ndSCKeG-b9qM4hIx
|
|
|
55
55
|
sourcecode/serializer.py,sha256=TGzftrSKitZrtl6Hh-R05s4KdTOxwTmph_lGDbo2Wzg,125015
|
|
56
56
|
sourcecode/spring_event_topology.py,sha256=5_ON_21Le5zbG-1GRc5GLIi5HJfy_QjcXLVPC5WeUGQ,18055
|
|
57
57
|
sourcecode/spring_findings.py,sha256=G7Or2lKBUQbcTDqudLvSs9XvNg_YoAa-_lBOG_ULs8E,5457
|
|
58
|
-
sourcecode/spring_impact.py,sha256=
|
|
58
|
+
sourcecode/spring_impact.py,sha256=f8XJtOG41f7EHQCs64BBZ0mdMTwU40DRcMoQ59SVprg,53296
|
|
59
59
|
sourcecode/spring_model.py,sha256=zOAgFmrRbG4a6KLm1TJl55aWMyPNsz3OS3FSczqPG6A,16594
|
|
60
60
|
sourcecode/spring_security_audit.py,sha256=XtPJ1SXlZJ8k6VYmaWuAp7Bbir4UmreAL7doIGQ5I7o,20595
|
|
61
61
|
sourcecode/spring_semantic.py,sha256=O1nKSGVzlukuxLHQVuCPxc-XrcrMFxwlHA20_dmEGgM,13307
|
|
@@ -102,8 +102,8 @@ sourcecode/telemetry/consent.py,sha256=wLMvGNJeSSyZoNkQXpoUioY6mMv4Qdvuw7S9jAEWn
|
|
|
102
102
|
sourcecode/telemetry/events.py,sha256=LtzYfaX9Ilckj5PTvAcTpDa9mLqDsYPDUiDkRa58piY,2580
|
|
103
103
|
sourcecode/telemetry/filters.py,sha256=NHa5T-6DaZduQPFuC34jOqHWQgSizM-Ygq8aZ4j19ng,5834
|
|
104
104
|
sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
|
|
105
|
-
sourcecode-1.
|
|
106
|
-
sourcecode-1.
|
|
107
|
-
sourcecode-1.
|
|
108
|
-
sourcecode-1.
|
|
109
|
-
sourcecode-1.
|
|
105
|
+
sourcecode-1.56.0.dist-info/METADATA,sha256=3XaX5Y56V_x6f4WkArJ-hXRYyds-FnNpQqBXNrTNdLk,38464
|
|
106
|
+
sourcecode-1.56.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
107
|
+
sourcecode-1.56.0.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
|
|
108
|
+
sourcecode-1.56.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
|
|
109
|
+
sourcecode-1.56.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|