sourcecode 1.31.7__py3-none-any.whl → 1.31.8__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 CHANGED
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.31.7"
3
+ __version__ = "1.31.8"
@@ -330,7 +330,7 @@ class ArchitectureAnalyzer:
330
330
  tentative = True
331
331
  if not _hard_evidence:
332
332
  limitations.append(
333
- "Pattern not confirmed by module import graph; run with --graph-modules for structural validation"
333
+ "Pattern inferred from directory structure; import graph not available structural dependency direction unverified"
334
334
  )
335
335
  if not _hard_evidence:
336
336
  matched_dirs = sorted({
sourcecode/cli.py CHANGED
@@ -836,6 +836,7 @@ def main(
836
836
  code_notes = True
837
837
  no_tree = True # agents never need the raw file tree
838
838
  architecture = True # agents need full architectural signal (M4)
839
+ graph_modules = True # IC-003: import graph needed for architecture confidence
839
840
 
840
841
  # ── GAP-9: Cache check — serve from .sourcecode-cache when git SHA unchanged ──
841
842
  import hashlib as _hashlib
@@ -1212,6 +1212,41 @@ class TaskContextBuilder:
1212
1212
  symptom=symptom if task_name == "fix-bug" else None,
1213
1213
  )
1214
1214
 
1215
+ # ── IC-006: fix-bug suspected_areas — recompute from ranked files + bug notes ──
1216
+ # relevant_files is now ranked by RankingEngine (git churn, fan_in, centrality, notes).
1217
+ # suspected_areas should reflect that ranking, not raw comment count.
1218
+ if task_name == "fix-bug" and relevant_files:
1219
+ _bug_kinds = {"FIXME", "BUG", "HACK", "XXX"}
1220
+ _bug_counts: dict[str, int] = {}
1221
+ for _note in cn_notes_for_ranking:
1222
+ if _note.kind in _bug_kinds:
1223
+ _bug_counts[_note.path] = _bug_counts.get(_note.path, 0) + 1
1224
+
1225
+ # Primary: top-ranked RelevantFile objects (dataclass, use .path/.reason)
1226
+ _ranked_paths = [rf.path for rf in relevant_files[:30]]
1227
+ _primary: list[str] = []
1228
+ for rf in relevant_files[:30]:
1229
+ p = rf.path
1230
+ if not p:
1231
+ continue
1232
+ n = _bug_counts.get(p, 0)
1233
+ reason_str = str(rf.reason) if rf.reason else ""
1234
+ note_str = f" ({n} bug annotation{'s' if n > 1 else ''})" if n else ""
1235
+ _primary.append(f"{p}{note_str}" + (f" — {reason_str}" if reason_str else ""))
1236
+ if len(_primary) >= 5:
1237
+ break
1238
+
1239
+ # Secondary: remaining high-note files not already in primary
1240
+ _ranked_set = set(_ranked_paths[:len(_primary)])
1241
+ _secondary = [
1242
+ f"{p} ({n} annotation{'s' if n > 1 else ''})"
1243
+ for p, n in sorted(_bug_counts.items(), key=lambda x: -x[1])
1244
+ if p not in _ranked_set
1245
+ ][:3]
1246
+
1247
+ if _primary or _secondary:
1248
+ suspected_areas = _primary + _secondary
1249
+
1215
1250
  # ── 6b. review-pr: derive PR-specific impact sections from delta analysis ──
1216
1251
  _pr_security_impact: dict = {}
1217
1252
  _pr_transactional_impact: dict = {}
@@ -1537,6 +1537,18 @@ def _assemble(
1537
1537
  by_type.setdefault(e.type, []).append(e.from_symbol)
1538
1538
  reverse_graph_out[target] = by_type
1539
1539
 
1540
+ # IC-005: aggregate event flow edges already built in _build_relations
1541
+ _listen_edges = [e for e in sorted_rels if e.type == "listens_to_event"]
1542
+ _publish_edges = [e for e in sorted_rels if e.type == "publishes_event"]
1543
+ _spring_events: Optional[dict] = None
1544
+ if _listen_edges or _publish_edges:
1545
+ _spring_events = {
1546
+ "listeners": sorted({e.from_symbol for e in _listen_edges}),
1547
+ "publishers": sorted({e.from_symbol for e in _publish_edges}),
1548
+ "event_types": sorted({e.to_symbol for e in _listen_edges + _publish_edges}),
1549
+ "flow_count": len(_listen_edges) + len(_publish_edges),
1550
+ }
1551
+
1540
1552
  return {
1541
1553
  "schema_version": "final-v1",
1542
1554
  "graph": {
@@ -1558,7 +1570,11 @@ def _assemble(
1558
1570
  },
1559
1571
  "subsystems": subsystems,
1560
1572
  "change_set": change_set_out,
1561
- "route_surface": _build_route_surface(sorted_syms, route_diffs),
1573
+ "route_surface": _build_route_surface(sorted_syms, route_diffs, extends_map={
1574
+ e.from_symbol: e.to_symbol.split(".")[-1]
1575
+ for e in sorted_rels if e.type == "extends"
1576
+ }),
1577
+ **({"spring_events": _spring_events} if _spring_events else {}),
1562
1578
  "audit": {
1563
1579
  "dropped_fields": dropped_fields,
1564
1580
  },
@@ -1569,30 +1585,119 @@ def _assemble(
1569
1585
  # Route surface helper (Fix 4)
1570
1586
  # ---------------------------------------------------------------------------
1571
1587
 
1572
- def _build_route_surface(symbols: list[SymbolRecord], route_diffs: Optional[list[dict]]) -> list[dict]:
1573
- """Return route surface: diffs when --since provided, else static snapshot of all endpoints."""
1588
+ def _build_route_surface(
1589
+ symbols: list[SymbolRecord],
1590
+ route_diffs: Optional[list[dict]],
1591
+ extends_map: Optional[dict[str, str]] = None,
1592
+ ) -> list[dict]:
1593
+ """Return route surface with inheritance projection.
1594
+
1595
+ extends_map: child_fqn → parent_simple_name derived from RelationEdge extends edges.
1596
+ Projects inherited endpoints onto subclasses that have a class-level @RequestMapping
1597
+ prefix but zero own method-level endpoints (IC-001 fix).
1598
+ """
1574
1599
  if route_diffs:
1575
1600
  return route_diffs
1601
+
1602
+ # Phase 1: build per-class metadata (prefix) and own endpoint list
1603
+ class_info: dict[str, dict] = {} # simple_name → {fqn, prefix, own_endpoints}
1604
+ for sym in symbols:
1605
+ if sym.type not in ("class", "interface"):
1606
+ continue
1607
+ simple = sym.symbol.split(".")[-1]
1608
+ prefix = ""
1609
+ if "@RequestMapping" in sym.annotations:
1610
+ args = sym.annotation_values.get("@RequestMapping", "")
1611
+ prefix = _parse_route_path(args)
1612
+ class_info[simple] = {"fqn": sym.symbol, "prefix": prefix, "own_endpoints": []}
1613
+
1576
1614
  routes: list[dict] = []
1615
+ seen: set[tuple] = set()
1616
+
1617
+ # Phase 2: emit own endpoint symbols and record them per class
1577
1618
  for sym in symbols:
1578
1619
  if sym.symbol_kind != "endpoint":
1579
1620
  continue
1580
1621
  ann_name = next((a for a in sym.annotations if a in _ENDPOINT_ANNOTATIONS), None)
1581
1622
  if not ann_name:
1582
1623
  continue
1624
+ cls_fqn = _enclosing_class(sym.symbol)
1625
+ cls_simple = cls_fqn.split(".")[-1]
1583
1626
  args = sym.annotation_values.get(ann_name, "")
1584
- path = _parse_route_path(args)
1585
- method = _parse_route_http_method(ann_name, args)
1586
- if not path and not method:
1587
- continue
1588
- routes.append({
1589
- "symbol": sym.symbol,
1590
- "controller": _enclosing_class(sym.symbol),
1591
- "path": path,
1592
- "method": method or "GET",
1593
- "stable_id": sym.stable_id,
1594
- })
1595
- return sorted(routes, key=lambda r: (r["controller"], r["path"]))
1627
+ suffix = _parse_route_path(args)
1628
+ method = _parse_route_http_method(ann_name, args) or "GET"
1629
+
1630
+ if cls_simple in class_info:
1631
+ class_info[cls_simple]["own_endpoints"].append(
1632
+ (method, suffix, sym.symbol, sym.stable_id)
1633
+ )
1634
+
1635
+ prefix = class_info.get(cls_simple, {}).get("prefix", "")
1636
+ full_path = (prefix + "/" + suffix).replace("//", "/").rstrip("/") or "/"
1637
+ if not full_path.startswith("/"):
1638
+ full_path = "/" + full_path
1639
+
1640
+ key = (sym.symbol, method, prefix)
1641
+ if key not in seen:
1642
+ seen.add(key)
1643
+ routes.append({
1644
+ "symbol": sym.symbol,
1645
+ "controller": cls_fqn,
1646
+ "declaring_class": cls_fqn,
1647
+ "effective_class": cls_fqn,
1648
+ "path": full_path,
1649
+ "method": method,
1650
+ "stable_id": sym.stable_id,
1651
+ "inheritance_depth": 0,
1652
+ })
1653
+
1654
+ # Phase 3: inheritance projection — subclasses with zero own endpoints
1655
+ # but with a class-level @RequestMapping prefix inherit parent methods.
1656
+ if extends_map:
1657
+ fqn_to_simple: dict[str, str] = {d["fqn"]: s for s, d in class_info.items()}
1658
+ simple_extends: dict[str, str] = {
1659
+ fqn_to_simple.get(child_fqn, child_fqn.split(".")[-1]): parent_simple
1660
+ for child_fqn, parent_simple in extends_map.items()
1661
+ }
1662
+
1663
+ for cls_simple, data in class_info.items():
1664
+ if data["own_endpoints"]:
1665
+ continue
1666
+ if not data["prefix"]:
1667
+ continue
1668
+
1669
+ chain = simple_extends.get(cls_simple)
1670
+ visited: set[str] = {cls_simple}
1671
+ depth = 1
1672
+ while chain and chain not in visited:
1673
+ visited.add(chain)
1674
+ parent = class_info.get(chain)
1675
+ if not parent:
1676
+ break
1677
+ if parent["own_endpoints"]:
1678
+ for verb, suffix, declaring_sym, stable_id in parent["own_endpoints"]:
1679
+ prefix = data["prefix"]
1680
+ full_path = (prefix + "/" + suffix).replace("//", "/").rstrip("/") or "/"
1681
+ if not full_path.startswith("/"):
1682
+ full_path = "/" + full_path
1683
+ key = (cls_simple, declaring_sym, verb, prefix)
1684
+ if key not in seen:
1685
+ seen.add(key)
1686
+ routes.append({
1687
+ "symbol": declaring_sym,
1688
+ "controller": data["fqn"],
1689
+ "declaring_class": parent["fqn"],
1690
+ "effective_class": data["fqn"],
1691
+ "path": full_path,
1692
+ "method": verb,
1693
+ "stable_id": stable_id,
1694
+ "inheritance_depth": depth,
1695
+ })
1696
+ break
1697
+ chain = simple_extends.get(chain)
1698
+ depth += 1
1699
+
1700
+ return sorted(routes, key=lambda r: (r["effective_class"], r["path"]))
1596
1701
 
1597
1702
 
1598
1703
  # ---------------------------------------------------------------------------
@@ -1803,7 +1908,7 @@ def apply_ir_size_limits(
1803
1908
  # Convenience: find Java files in a repo
1804
1909
  # ---------------------------------------------------------------------------
1805
1910
 
1806
- def find_java_files(root: Path, *, max_files: int = 500) -> list[str]:
1911
+ def find_java_files(root: Path, *, max_files: int = 3000) -> list[str]:
1807
1912
  """Return relative paths to Java files under root, excluding test dirs and vendor."""
1808
1913
  results: list[str] = []
1809
1914
  for p in sorted(root.rglob("*.java")):
@@ -141,6 +141,11 @@ class RuntimeClassifier:
141
141
  raw.append((ws_path, self._load_pkg_json(pkg_root)))
142
142
 
143
143
  fan_in = self._compute_fan_in(raw)
144
+ # IC-004: merge Maven pom.xml cross-module fan_in when no JS deps detected
145
+ maven_fan_in = self._compute_maven_fan_in(root, workspace_paths)
146
+ for ws_path, count in maven_fan_in.items():
147
+ fan_in[ws_path] = fan_in.get(ws_path, 0) + count
148
+
144
149
  results: list[MonorepoPackageInfo] = []
145
150
 
146
151
  for ws_path, pkg_json in raw:
@@ -280,6 +285,9 @@ class RuntimeClassifier:
280
285
  scores["infrastructure_layer"] = scores.get("infrastructure_layer", 0) + fan_boost
281
286
 
282
287
  if not scores:
288
+ # IC-004: Java/Maven fallback — no JS signals but module may have a pom.xml
289
+ if not pkg_json:
290
+ return self._classify_maven_module(ws_path, name, fan_in)
283
291
  return "unknown", signals, "low"
284
292
 
285
293
  best_role = max(scores, key=lambda r: (scores[r], _ROLE_PRIORITY.get(r, 0)))
@@ -326,6 +334,76 @@ class RuntimeClassifier:
326
334
  def _criticality(self, role: str, fan_in: int) -> str:
327
335
  if role in {"runtime_core", "plugin_host"}:
328
336
  return "high"
329
- if role in {"backend_runtime", "frontend_runtime", "composition_layer"} or fan_in >= 3:
337
+ # IC-004: infrastructure_layer with high fan_in = shared foundation = high criticality
338
+ if role == "infrastructure_layer" and fan_in >= 3:
339
+ return "high"
340
+ if role in {"backend_runtime", "frontend_runtime", "composition_layer",
341
+ "infrastructure_layer"} or fan_in >= 3:
330
342
  return "medium"
331
343
  return "low"
344
+
345
+ def _compute_maven_fan_in(self, root: Path, workspace_paths: list[str]) -> dict[str, int]:
346
+ """IC-004: Compute cross-module fan_in from all pom.xml files under each workspace.
347
+
348
+ Scans all pom.xml files (top-level and sub-module) within each workspace path.
349
+ Counts distinct modules that declare a dependency containing another module's leaf name.
350
+ Uses 1 hit per source module (not per pom file) to avoid inflation.
351
+ """
352
+ fan_in: dict[str, int] = {}
353
+ leaf_to_path: dict[str, str] = {ws.split("/")[-1]: ws for ws in workspace_paths}
354
+
355
+ for ws_path in workspace_paths:
356
+ ws_dir = root / ws_path
357
+ if not ws_dir.is_dir():
358
+ continue
359
+ deps_found: set[str] = set()
360
+ for pom in ws_dir.rglob("pom.xml"):
361
+ if "target/" in str(pom):
362
+ continue
363
+ try:
364
+ content = pom.read_text(encoding="utf-8", errors="replace")
365
+ except OSError:
366
+ continue
367
+ for dep_leaf, target_path in leaf_to_path.items():
368
+ if target_path != ws_path and dep_leaf in content:
369
+ deps_found.add(target_path)
370
+ for target_path in deps_found:
371
+ fan_in[target_path] = fan_in.get(target_path, 0) + 1
372
+
373
+ return fan_in
374
+
375
+ def _classify_maven_module(
376
+ self, ws_path: str, name: str, fan_in: int
377
+ ) -> tuple[str, list[str], str]:
378
+ """IC-004: Classify a Java/Maven module by path conventions and fan_in.
379
+
380
+ Called when no JS signals exist (no package.json). Uses path name patterns
381
+ and pom fan_in (cross-module dependency count) to determine role/criticality.
382
+ """
383
+ signals: list[str] = ["maven:module"]
384
+ leaf = ws_path.lower().rstrip("/").split("/")[-1]
385
+
386
+ if re.search(r"\b(common|shared|util|utils|lib|base|foundation)\b", leaf):
387
+ signals.append("maven:shared_library")
388
+ return "infrastructure_layer", signals, "high" if fan_in >= 3 else "medium"
389
+
390
+ if re.search(r"\b(integration|it|test|tests|e2e)\b", leaf):
391
+ signals.append("maven:test_module")
392
+ return "test_layer", signals, "low"
393
+
394
+ if re.search(r"\b(admin|web|api|rest|controller|ui)\b", leaf):
395
+ signals.append("maven:web_module")
396
+ return "backend_runtime", signals, "medium"
397
+
398
+ if re.search(r"\b(core|framework|domain|service|profile)\b", leaf):
399
+ signals.append("maven:core_module")
400
+ return "backend_runtime", signals, "high" if fan_in >= 2 else "medium"
401
+
402
+ if fan_in >= 3:
403
+ signals.append(f"maven:high_fan_in({fan_in})")
404
+ return "infrastructure_layer", signals, "high"
405
+ if fan_in >= 1:
406
+ signals.append(f"maven:fan_in({fan_in})")
407
+ return "infrastructure_layer", signals, "medium"
408
+
409
+ return "unknown", signals, "low"
sourcecode/serializer.py CHANGED
@@ -379,6 +379,59 @@ def _spring_boot_version(sm: "SourceMap") -> "Optional[str]":
379
379
  return None
380
380
 
381
381
 
382
+ def _spring_event_signal(sm: "SourceMap") -> "Optional[dict[str, Any]]":
383
+ """IC-005: Surface @EventListener and publishEvent from Java source files.
384
+
385
+ Scans sm.file_paths for Java files containing Spring event annotations.
386
+ Only runs on Java/Spring projects. Lightweight — path heuristics first,
387
+ then targeted content scan on candidate files only.
388
+ """
389
+ import re as _re
390
+ java_paths = [p for p in sm.file_paths if p.endswith(".java") and "target/" not in p]
391
+ if not java_paths:
392
+ return None
393
+ _frameworks = [f.name for s in (sm.stacks or []) for f in s.frameworks]
394
+ if not any("Spring" in fw for fw in _frameworks):
395
+ return None
396
+
397
+ analyzed_path = getattr(sm.metadata, "analyzed_path", None) if sm.metadata else None
398
+ root = Path(analyzed_path) if analyzed_path else None
399
+
400
+ listeners: list[str] = []
401
+ publishers: list[str] = []
402
+ event_types: set[str] = set()
403
+ _publish_re = _re.compile(r"\.publishEvent\s*\(\s*new\s+(\w+)")
404
+
405
+ for rel_path in java_paths:
406
+ if root is None:
407
+ break
408
+ try:
409
+ content = (root / rel_path).read_text(encoding="utf-8", errors="replace")
410
+ except OSError:
411
+ continue
412
+ if "@EventListener" in content:
413
+ cls_m = _re.search(r"class\s+(\w+)", content)
414
+ cls_name = cls_m.group(1) if cls_m else Path(rel_path).stem
415
+ if cls_name not in listeners:
416
+ listeners.append(cls_name)
417
+ for m in _publish_re.finditer(content):
418
+ event_types.add(m.group(1))
419
+ cls_m = _re.search(r"class\s+(\w+)", content)
420
+ cls_name = cls_m.group(1) if cls_m else Path(rel_path).stem
421
+ if cls_name not in publishers:
422
+ publishers.append(cls_name)
423
+
424
+ if not listeners and not publishers:
425
+ return None
426
+
427
+ return {
428
+ "listeners": sorted(set(listeners))[:10],
429
+ "publishers": sorted(set(publishers))[:10],
430
+ "event_types": sorted(event_types)[:10],
431
+ "flow_count": len(listeners) + len(publishers),
432
+ }
433
+
434
+
382
435
  def _spring_profiles_context(sm: "SourceMap") -> "Optional[dict[str, Any]]":
383
436
  """Build structured spring_profiles block: detected names + per-profile file variants."""
384
437
  # Gather profile names from env_summary (populated by env_analyzer scanning
@@ -1949,6 +2002,11 @@ def agent_view(sm: SourceMap, *, full: bool = False) -> dict[str, Any]:
1949
2002
  if _txn:
1950
2003
  signals["transactional_boundaries"] = _txn
1951
2004
 
2005
+ # IC-005: Spring event flows (@EventListener / publishEvent)
2006
+ _evf = _spring_event_signal(sm)
2007
+ if _evf:
2008
+ signals["event_flows"] = _evf
2009
+
1952
2010
  if signals:
1953
2011
  result["signals"] = signals
1954
2012
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.31.7
3
+ Version: 1.31.8
4
4
  Summary: Deterministic codebase context for AI coding agents
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -225,7 +225,7 @@ Description-Content-Type: text/markdown
225
225
 
226
226
  **Deterministic, behavior-aware codebase context for AI agents and PR review.**
227
227
 
228
- ![Version](https://img.shields.io/badge/version-1.31.7-blue)
228
+ ![Version](https://img.shields.io/badge/version-1.31.8-blue)
229
229
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
230
230
 
231
231
  ---
@@ -261,7 +261,7 @@ pipx install sourcecode
261
261
 
262
262
  ```bash
263
263
  sourcecode version
264
- # sourcecode 1.31.7
264
+ # sourcecode 1.31.8
265
265
  ```
266
266
 
267
267
  ---
@@ -1,10 +1,10 @@
1
- sourcecode/__init__.py,sha256=8R-nJsTbK4mRxB0Ix8W0xEdhYCBpK8R-2dyS_nBxiDc,103
1
+ sourcecode/__init__.py,sha256=WLMYz2pzDdC0wqKacYMZ3CjPguJO9qdTzERPE9XQ_8c,103
2
2
  sourcecode/adaptive_scanner.py,sha256=XffluXKzJUXrMtjEiAOnSNPZnztdIcts17T9ouHeID0,10521
3
- sourcecode/architecture_analyzer.py,sha256=MyBa0Hf5HmkudZQDLKrjcWDKETXETXl0mQX1swtTwAA,39091
3
+ sourcecode/architecture_analyzer.py,sha256=4R13Yb02OrPeB4IH3z6V_g7HWhmGcRHbI8CobCVnRrc,39111
4
4
  sourcecode/architecture_summary.py,sha256=z34_6v7cSwy98cof2UVciGho7SCrZ93tiqMmq5WNzRQ,20405
5
5
  sourcecode/ast_extractor.py,sha256=XgrZg2DcWcUm9r87cRG3KGO7IK2TIL_N-CvhSbUmmh4,49901
6
6
  sourcecode/classifier.py,sha256=-0t0HLc9L9UleMLfclfLM3AXhBjUb_AYyBPDbvgWtac,7755
7
- sourcecode/cli.py,sha256=L0KDRruMogpw9kq7trZ7dmWQuFC746GIEN1oym6LmCE,131802
7
+ sourcecode/cli.py,sha256=paiZvANOzPPIznA7M90XSsaQd-F4B-jr0Nx9CpsQKz4,131891
8
8
  sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
9
9
  sourcecode/confidence_analyzer.py,sha256=ZUn-Nywi5TEQcuozqK_vfOyPT-a1dYYO42elAtVFV-k,16412
10
10
  sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
@@ -23,18 +23,18 @@ sourcecode/graph_analyzer.py,sha256=iUK-7pSV-cvGqqD2hENdYmhnm0wcXFEyK-xnu5ul8OU,
23
23
  sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
24
24
  sourcecode/path_filters.py,sha256=ROFRQ8eSLBEMiixK9f45-RO7um4VEEcjoD5AA4I427I,3739
25
25
  sourcecode/pr_comment_renderer.py,sha256=smHslxiG14lrytCkq5nFrFu-qTHgA-t-LFYfdrfjz2o,14423
26
- sourcecode/prepare_context.py,sha256=-9kTYuPhwr79mF6lNe9tI7glGAU_d84GyVurHceGroo,189427
26
+ sourcecode/prepare_context.py,sha256=_bIelOcv1vdyffyv38NI_Acu7-YxWLA7o6kgaiasCbY,191161
27
27
  sourcecode/progress.py,sha256=qn30sWaHOkjTgXsSBmiPkz7Rsbwc5oSlIe6JNEMYp_k,3149
28
28
  sourcecode/ranking_engine.py,sha256=ZAucq_YX2KkWUuAZf4P0lhtQ_38vEFnUhuGtSZd1S0E,12970
29
29
  sourcecode/redactor.py,sha256=xuGcadGEHaPw4qZXlMDvzMCsr4VOkdp3oBQptHyJk8c,2884
30
30
  sourcecode/relevance_scorer.py,sha256=MYF4FFkveAQps9SmTeTlh6ODiBz2F--_hWNeHMLtUHQ,8405
31
31
  sourcecode/repo_classifier.py,sha256=FG1vaWKdWXsWdl-S8hjVMiTqcwgaRXkDyvK4rPcOGtQ,22681
32
- sourcecode/repository_ir.py,sha256=fLt33wadCMY77jd34YwkYbUT5TyNu2G0LX0x76Krsvo,68348
33
- sourcecode/runtime_classifier.py,sha256=zWX3r3HCKHc-qtIobErOa8aKMmaoPYREtJKvPcBGPjQ,14792
32
+ sourcecode/repository_ir.py,sha256=haK4OuASLBH5zSDxxN-tdpLOGLfOIo7hRfDXMgjNiQ0,72961
33
+ sourcecode/runtime_classifier.py,sha256=uTAD6BDCiBLUZEDRfqk718kM4RTT_vAbfkcOI2_Xx58,18432
34
34
  sourcecode/scanner.py,sha256=WdOQ78mMzjR1NjmKTlbxdgwinnCTfAhxCVLBEFQiFHU,8899
35
35
  sourcecode/schema.py,sha256=fj3BZ3IcnNV4j21BFIEvz8Qnw_vZoqIbzzRg-qQ-nd0,24530
36
36
  sourcecode/semantic_analyzer.py,sha256=12TwXYkYbDcBdu0heX_EmfPM2EkO8a_r5osf0SaeQbs,88956
37
- sourcecode/serializer.py,sha256=1y9DAkH2aBzlsmkHcSSc-t72_4fv9RZIuG4uhhGG5QE,111933
37
+ sourcecode/serializer.py,sha256=upGg24ALEk9almaZeqyiGdritdd4F1bvR2-jr_dv3RM,114144
38
38
  sourcecode/summarizer.py,sha256=lPlKhMh28nueXkPo2xKeD3DUFYVGRlJMIdY-8TSM-ls,17486
39
39
  sourcecode/tree_utils.py,sha256=8GAkIfQAsvtEudIeW1l4ooH_oRtrWR8cpJQJsEa_Pfw,2093
40
40
  sourcecode/workspace.py,sha256=X_6NmNnitvT3_38V-JDChydo_sR68s249hLFlrQskU0,8271
@@ -73,8 +73,8 @@ sourcecode/telemetry/consent.py,sha256=wLMvGNJeSSyZoNkQXpoUioY6mMv4Qdvuw7S9jAEWn
73
73
  sourcecode/telemetry/events.py,sha256=oEvvulfsv5GIDWG2174gSS6tNB95w38AIYiYeifGKlE,2294
74
74
  sourcecode/telemetry/filters.py,sha256=Asa71oRl7q3Wt_FMwuufIZJFzSYdgRNKS8LHCIyFeYE,4805
75
75
  sourcecode/telemetry/transport.py,sha256=KJeIPCPWMdmbCP3ySGs2iUlia34U6vWne2dZsUezesw,1560
76
- sourcecode-1.31.7.dist-info/METADATA,sha256=O08_eBOxRxeDd8UkUKyIrW6haJHuQvAddgiFAEma0dQ,29083
77
- sourcecode-1.31.7.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
78
- sourcecode-1.31.7.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
79
- sourcecode-1.31.7.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
80
- sourcecode-1.31.7.dist-info/RECORD,,
76
+ sourcecode-1.31.8.dist-info/METADATA,sha256=s7Lh8sXmHkwJKe-pQUg9wbhf0Yrv8giYMOHYiaLp658,29083
77
+ sourcecode-1.31.8.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
78
+ sourcecode-1.31.8.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
79
+ sourcecode-1.31.8.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
80
+ sourcecode-1.31.8.dist-info/RECORD,,