codegraphcontext 0.5.4__py3-none-any.whl → 0.5.5__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.
@@ -654,7 +654,7 @@ class CodeFinder:
654
654
  OPTIONAL MATCH (repo:Repository)-[:CONTAINS]->(file)
655
655
  WITH file, repo, COLLECT({{
656
656
  imported_module: module.name,
657
- import_alias: module.alias,
657
+ import_alias: imp.alias,
658
658
  full_import_name: module.full_import_name
659
659
  }}) AS imports
660
660
  RETURN
@@ -191,12 +191,39 @@ async def run_scip_index_async(
191
191
  cgcignore_path=cgcignore_path,
192
192
  supported_extensions=set(parsers_keys),
193
193
  )
194
+ minimal_nodes = 0
194
195
  for repo_file in supplementary_files:
195
196
  abs_str = str(repo_file.resolve())
196
197
  if abs_str in scip_abs_paths:
197
198
  continue
198
199
  ts_parser = get_parser(repo_file.suffix)
199
200
  if not ts_parser:
201
+ # No parser: still record the file. `discover_files_to_index`
202
+ # returns supported extensions *plus* generic ones (.md, .json,
203
+ # .yaml, Dockerfile, .gitignore …), and the Tree-sitter pipeline
204
+ # gives those a minimal File node (pipeline.py, via
205
+ # `add_minimal_file_node`) precisely so the graph accounts for
206
+ # every discovered file.
207
+ #
208
+ # Skipping them here left the SCIP path short by exactly the
209
+ # number of non-code files, so `cgc index` compared a graph
210
+ # count against the discovery count and reported "only N of M
211
+ # files indexed. Continuing." on every run, forever.
212
+ try:
213
+ await asyncio.to_thread(
214
+ writer.add_minimal_file_node,
215
+ repo_file,
216
+ index_root,
217
+ is_dependency,
218
+ )
219
+ minimal_nodes += 1
220
+ processed += 1
221
+ if job_id:
222
+ job_manager.update_job(
223
+ job_id, processed_files=processed, current_file=abs_str
224
+ )
225
+ except Exception as e:
226
+ debug_log(f"Minimal file node failed for {abs_str}: {e}")
200
227
  continue
201
228
  try:
202
229
  ts_data = ts_parser.parse(repo_file, is_dependency, index_source=True)
@@ -223,6 +250,10 @@ async def run_scip_index_async(
223
250
  info_logger(
224
251
  f"[SCIP+TS] Supplemented {supplemented} files not covered by SCIP indexer"
225
252
  )
253
+ if minimal_nodes:
254
+ info_logger(
255
+ f"[SCIP+TS] Recorded {minimal_nodes} non-code file(s) as minimal File nodes"
256
+ )
226
257
 
227
258
  info_logger(
228
259
  f"[INHERITS] Resolving inheritance links across {len(files_data)} files..."
@@ -34,19 +34,41 @@ GO_QUERIES = {
34
34
  )
35
35
  ) @interface_node
36
36
  """,
37
+ # `import_spec` is a direct child of `import_declaration` only for a
38
+ # single-line `import "fmt"`. A grouped block — which gofmt produces for
39
+ # any file with more than one import, i.e. nearly all of them — nests the
40
+ # specs inside an `import_spec_list`, so matching only the direct-child
41
+ # shape returned zero imports for those files.
37
42
  "imports": """
38
43
  (import_declaration
39
44
  (import_spec
40
45
  path: (interpreted_string_literal) @path
41
46
  )
42
47
  ) @import
43
-
48
+
49
+ (import_declaration
50
+ (import_spec_list
51
+ (import_spec
52
+ path: (interpreted_string_literal) @path
53
+ )
54
+ )
55
+ ) @import
56
+
44
57
  (import_declaration
45
58
  (import_spec
46
59
  name: (package_identifier) @alias
47
60
  path: (interpreted_string_literal) @path
48
61
  )
49
62
  ) @import_alias
63
+
64
+ (import_declaration
65
+ (import_spec_list
66
+ (import_spec
67
+ name: (package_identifier) @alias
68
+ path: (interpreted_string_literal) @path
69
+ )
70
+ )
71
+ ) @import_alias
50
72
  """,
51
73
  "calls": """
52
74
  (call_expression
@@ -31,8 +31,16 @@ PHP_QUERIES = {
31
31
  name: (name) @name
32
32
  ) @trait
33
33
  """,
34
+ # A top-level `use App\Models\User;` is a `namespace_use_declaration`.
35
+ # `use_declaration` is the *trait* use inside a class body (relied on at
36
+ # ~line 309), so capturing it here dropped every real import and labelled
37
+ # trait uses as imports instead.
38
+ #
39
+ # Capture the clause rather than the declaration: it is the level that
40
+ # exists once per imported symbol, so the braced group form
41
+ # `use Foo\{A, B as C};` yields one row per symbol for free.
34
42
  "imports": """
35
- (use_declaration) @import
43
+ (namespace_use_clause) @import
36
44
  """,
37
45
  "calls": """
38
46
  (function_call_expression
@@ -394,40 +402,82 @@ class PhpTreeSitterParser:
394
402
  for node, capture_name in captures:
395
403
  if capture_name == "import":
396
404
  try:
397
- import_text = self._get_node_text(node)
398
- # use Foo\Bar as Baz;
399
- # Node usually has children: name (qualified_name), optional alias
400
-
401
- name_node = None
402
- alias_node = None
403
-
405
+ # `namespace_use_clause` shapes, in tree-sitter-php:
406
+ # App\Models\User -> qualified_name
407
+ # App\Models\Post as Blog -> qualified_name, name(alias)
408
+ # A -> name (group member)
409
+ # B as C -> name, name(alias) (group member)
410
+ # function Bar\helper -> qualified_name, with a
411
+ # leading `function`/`const` token
412
+ #
413
+ # The alias, when present, is always the final `name` child.
414
+ path_node = None
415
+ alias = None
416
+ name_children = []
417
+
404
418
  for child in node.children:
405
- if child.type == "qualified_name" or child.type == "name":
406
- name_node = child
407
- # Alias in PHP: use X as Y; The 'as' is usually implicit structure or explicit?
408
- # Tree sitter grammar: use_declaration -> use_clause -> (use_as_clause (qualified_name) (name))
409
-
410
- # Assuming simple handling for now, extracting string from text
411
- # Regex might be safer given tree complexity for `use`
412
- import_match = re.search(r'use\s+([\w\\]+)(?:\s+as\s+(\w+))?', import_text)
413
- if import_match:
414
- import_path = import_match.group(1).strip()
415
- alias = import_match.group(2).strip() if import_match.group(2) else None
416
-
417
- import_data = {
418
- "name": import_path,
419
- "full_import_name": import_text,
420
- "line_number": node.start_point[0] + 1,
421
- "alias": alias,
422
- "context": (None, None),
423
- "lang": self.language_name,
424
- "is_dependency": False,
425
- }
426
- imports.append(import_data)
419
+ if child.type == "qualified_name":
420
+ path_node = child
421
+ elif child.type == "name":
422
+ name_children.append(child)
423
+
424
+ if path_node is not None:
425
+ # qualified_name carries the path; a trailing bare name
426
+ # is therefore the alias.
427
+ import_path = self._get_node_text(path_node)
428
+ if name_children:
429
+ alias = self._get_node_text(name_children[-1])
430
+ elif name_children:
431
+ # Group member: first name is the symbol, second (if
432
+ # any) is its alias.
433
+ import_path = self._get_node_text(name_children[0])
434
+ if len(name_children) > 1:
435
+ alias = self._get_node_text(name_children[-1])
436
+ else:
437
+ continue
438
+
439
+ # A braced group prefixes its members: `use Foo\{A, B};`
440
+ # means Foo\A and Foo\B. Walk up to recover the prefix so
441
+ # the recorded path is the real fully-qualified name.
442
+ group = node.parent
443
+ if group is not None and group.type == "namespace_use_group":
444
+ decl = group.parent
445
+ if decl is not None:
446
+ # The prefix is a `namespace_name` sibling of the
447
+ # group (`use Foo\Bar\{A, B};` -> "Foo\Bar").
448
+ prefix_parts = [
449
+ self._get_node_text(c)
450
+ for c in decl.children
451
+ if c.type in ("namespace_name", "qualified_name", "name")
452
+ ]
453
+ if prefix_parts:
454
+ import_path = (
455
+ prefix_parts[0].rstrip("\\") + "\\" + import_path
456
+ )
457
+
458
+ import_path = import_path.strip()
459
+ if not import_path:
460
+ continue
461
+
462
+ import_data = {
463
+ # `name` is the symbol as referenced in code — the last
464
+ # segment, or the alias when one is given.
465
+ "name": alias or import_path.split("\\")[-1],
466
+ "full_import_name": import_path,
467
+ "line_number": node.start_point[0] + 1,
468
+ "alias": alias,
469
+ "context": (None, None),
470
+ "lang": self.language_name,
471
+ "is_dependency": False,
472
+ }
473
+ imports.append(import_data)
427
474
  except Exception as e:
428
475
  error_logger(f"Error parsing import: {e}")
429
476
  continue
430
477
 
478
+ # Query captures arrive in match order, not source order; sort so the
479
+ # emitted rows are deterministic across runs.
480
+ imports.sort(key=lambda i: (i["line_number"], i["full_import_name"]))
431
481
  return imports
432
482
 
433
483
  def _parse_calls(self, captures: list, source_code: str, var_type_map: dict) -> list[dict]:
@@ -303,9 +303,20 @@ class PythonTreeSitterParser:
303
303
  arg_text = self._get_node_text(name_node)
304
304
  elif p.type == 'typed_parameter':
305
305
  # Typed parameter: def foo(x: int)
306
- name_node = p.child_by_field_name('name')
307
- if name_node:
308
- arg_text = self._get_node_text(name_node)
306
+ # `typed_parameter` has no `name` field in
307
+ # tree-sitter-python — only `type`. Its children are
308
+ # (<identifier|splat>, ':', type), so the parameter
309
+ # is the first child. Looking up a `name` field here
310
+ # returned None and silently dropped every annotated
311
+ # parameter that had no default.
312
+ for child in p.children:
313
+ if child.type in (
314
+ 'identifier',
315
+ 'list_splat_pattern',
316
+ 'dictionary_splat_pattern',
317
+ ):
318
+ arg_text = self._get_node_text(child)
319
+ break
309
320
  elif p.type == 'typed_default_parameter':
310
321
  # Typed parameter with default: def foo(x: int = 5) or def foo(x: str = typer.Argument(...))
311
322
  name_node = p.child_by_field_name('name')
@@ -43,7 +43,7 @@ class CppToolkit:
43
43
  return """
44
44
  MATCH (f:File)-[i:IMPORTS]->(m:Module)
45
45
  RETURN f.name AS file_name, m.name AS module_name,
46
- m.full_import_name AS full_import_name, m.alias AS alias
46
+ m.full_import_name AS full_import_name, i.alias AS alias
47
47
  ORDER BY f.name
48
48
  """
49
49
 
@@ -15,9 +15,12 @@ See https://gcformat.com for the full specification.
15
15
  """
16
16
 
17
17
  import json
18
+ import logging
18
19
  import os
19
20
  from typing import Any
20
21
 
22
+ logger = logging.getLogger(__name__)
23
+
21
24
  _gcf_encode = None
22
25
  _gcf_checked = False
23
26
 
@@ -53,6 +56,9 @@ def encode_response(result: Any) -> str:
53
56
  if is_gcf_enabled():
54
57
  encoder = _load_gcf()
55
58
  if encoder is not None:
56
- return encoder(result)
59
+ try:
60
+ return encoder(result)
61
+ except Exception:
62
+ logger.debug("GCF encoding failed; falling back to JSON", exc_info=True)
57
63
 
58
64
  return json.dumps(result, indent=2)
@@ -61,11 +61,12 @@ def sanitize_bundle_filename(filename: str, default: str = "bundle.cgc") -> str:
61
61
  name = Path(filename).name
62
62
  if not name or name in (".", ".."):
63
63
  return default
64
- if not re.fullmatch(r"[\w.\-]+\.cgc", name, flags=re.IGNORECASE):
65
- if not name.endswith(".cgc"):
66
- sanitized = re.sub(r'[^\w.\-]+', '_', name)
67
- name = f"{sanitized}.cgc"
68
- return name
64
+ # Always sanitize the stem so that unsafe characters cannot bypass the
65
+ # check by simply appending a .cgc extension.
66
+ stem = name[:-4] if name.lower().endswith(".cgc") else name
67
+ sanitized_stem = re.sub(r"[^\w.\-]+", "_", stem)
68
+ # Re-attach the extension whether it was present or not.
69
+ return f"{sanitized_stem}.cgc"
69
70
 
70
71
 
71
72
  def is_safe_download_url(url: str) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codegraphcontext
3
- Version: 0.5.4
3
+ Version: 0.5.5
4
4
  Summary: An MCP server that indexes local code into a graph database to provide context to AI assistants.
5
5
  Author-email: Shashank Shekhar Singh <shashankshekharsingh1205@gmail.com>
6
6
  License: MIT License
@@ -39,7 +39,7 @@ codegraphcontext/core/simulator.py,sha256=Sb3PpnoMGVDWvqPVSv5dcQqiL3nTvhmLzzLzJ4
39
39
  codegraphcontext/core/watcher.py,sha256=nSfkmZueMBHxx8-7zNHScKtaSGfNWrfjWdAe-T0Y2vI,18793
40
40
  codegraphcontext/tools/__init__.py,sha256=iqQPEkDlGXO7rAaLNQrS_ZAbLSklBSK-OowpARq0mig,41
41
41
  codegraphcontext/tools/advanced_language_query_tool.py,sha256=QXDKcS3Ug6bNjzY3gjjS2zmPC5cEPyrHGJhAqPXTMuo,4025
42
- codegraphcontext/tools/code_finder.py,sha256=qUzXrZn2-7pLb2S0FKLI5ZkZtMApT84XaOlF-bSdtZw,72043
42
+ codegraphcontext/tools/code_finder.py,sha256=ZjHoOLYeC5Xc8N4VU5APqGiATzk9AB5gX9u9wVl0SEY,72040
43
43
  codegraphcontext/tools/graph_builder.py,sha256=uPHc4q8u7NQ7lSceRm4IwN3nLxgq9C0MvQtkY8HA9CE,57271
44
44
  codegraphcontext/tools/package_resolver.py,sha256=d2lkHNguvL_QRihD2bbBN-aMGrXRgsK-8pLWkci3nFk,7366
45
45
  codegraphcontext/tools/report_generator.py,sha256=HLCT6sUmYZxouSXsk0vc1ILV-j2jJjer_RXHTV5MskM,15377
@@ -66,7 +66,7 @@ codegraphcontext/tools/indexing/pre_scan.py,sha256=St7Hc3-NFTMYF39vWneJL6iIRIc78
66
66
  codegraphcontext/tools/indexing/sanitize.py,sha256=IaTP7Aztso3SsvjNZMEqJ1iktV4Tl75hXcYnCWBGpLs,1490
67
67
  codegraphcontext/tools/indexing/schema.py,sha256=AcHaqxDi9d5nGjZdg5S6mbjhHo98UYPRfcz1ZpvNEy4,9157
68
68
  codegraphcontext/tools/indexing/schema_contract.py,sha256=23ok37ASjvOsU8S-sqyRiKIkGhcUxQ8PSErbBmylggU,1815
69
- codegraphcontext/tools/indexing/scip_pipeline.py,sha256=QA5Tje2H7N9C0GHr_ocugDlcYhZAvyx3iVJxUbXLajU,11161
69
+ codegraphcontext/tools/indexing/scip_pipeline.py,sha256=Eb7VKN13vPOJ_Ag34c1yQ4c41TGvsemjMKFHnSjBuCg,12724
70
70
  codegraphcontext/tools/indexing/vector_resolver.py,sha256=0D0QClro7nx9Wx6hbbFlOsO4dqgcTrwPMqE0CsJK01o,5477
71
71
  codegraphcontext/tools/indexing/persistence/__init__.py,sha256=hFRlNgiYS7uN9X4e4xfP3c1BvcYSxpmq0k_uaDRn2Fg,121
72
72
  codegraphcontext/tools/indexing/persistence/utils.py,sha256=OtndHpE_R14mPz5i-Bo9mA7NsoIuYnCNER-oIwxDOYA,2028
@@ -82,7 +82,7 @@ codegraphcontext/tools/languages/css.py,sha256=aN1Nm8vHmfV0J0jQ-_q5x0YDTOtLV2IW-
82
82
  codegraphcontext/tools/languages/dart.py,sha256=yjqVA6XwoADrZab95p6wva0jT-PAGw_x90LR-cp2BDk,27160
83
83
  codegraphcontext/tools/languages/elisp.py,sha256=QVxJq328bR4DsQK8Vs8b9oxthx1Wm_BS1dsCSjD_P8I,22717
84
84
  codegraphcontext/tools/languages/elixir.py,sha256=EvJbTGefz7DUiXvxJQRbwMMcU_TGzaIi6fwd6htKZ9g,21836
85
- codegraphcontext/tools/languages/go.py,sha256=kU3thNHRhbrakz4YCP94YWp1AvhG_yR73PMLDPdmQME,26129
85
+ codegraphcontext/tools/languages/go.py,sha256=-i3A4lM_Fvp468AfBhCAo1icUmdrI12_z95l-_p_OOA,26938
86
86
  codegraphcontext/tools/languages/gradle.py,sha256=WA1nQTi-JMHv5vLTJ35ECW0dQCb4PELt1JxLDKbHijc,4566
87
87
  codegraphcontext/tools/languages/haskell.py,sha256=YyslUwcanFs00IinFrj7_TJ2IY2Q97NYsG2Y-9qqolU,19888
88
88
  codegraphcontext/tools/languages/html.py,sha256=cjzAH55-JYbObGcMiqjuYD6X0Cbs1Kj5ixcZv9BzMns,5595
@@ -93,8 +93,8 @@ codegraphcontext/tools/languages/lua.py,sha256=TxpOxFd47E4hKwkJpO7b_dMvWveYd4Eaq
93
93
  codegraphcontext/tools/languages/maven.py,sha256=yQjrdSRZJPy6tUopZ7x5qYp8Rtbug4PPbBjCdl9FMDY,6393
94
94
  codegraphcontext/tools/languages/mybatis.py,sha256=T6mVBCg7_5xOobBIAqZg9oHtZQy7sGFlkPHlK23FoTU,6469
95
95
  codegraphcontext/tools/languages/perl.py,sha256=vjz65VFoKLsql2gyaT44B3R0sieloQmxO7fHMp8aqLA,12837
96
- codegraphcontext/tools/languages/php.py,sha256=s4LPQ7jlRtvVdnDXWwnTD8Mv6V0MsSda4lK43WMn_GM,27163
97
- codegraphcontext/tools/languages/python.py,sha256=dJ2sQUm_9nOoyUTDlJqV3LigPpN4KhRQLwtBESE6oXY,32016
96
+ codegraphcontext/tools/languages/php.py,sha256=WwdFmWvBxQX8rsqHFCr8tdrz_W3pWv_COp1Bw-xiGiE,29804
97
+ codegraphcontext/tools/languages/python.py,sha256=6Fd05Hxc-jVRTa6t0wYuk8-yZ-0MdrRW3xo1TOucxEk,32714
98
98
  codegraphcontext/tools/languages/ruby.py,sha256=GCU2AOfU8H4nNzunf0F4OU_aLr3GGIWcSJgVhO89up8,23428
99
99
  codegraphcontext/tools/languages/rust.py,sha256=o_uhEL_a4REPYXqdH4tljucyXMs5ModaMfeT-sanTBc,15560
100
100
  codegraphcontext/tools/languages/scala.py,sha256=TmH_DK7baoo7_eMYdu9e7Cqb0ddVpibrhUO5TQD4AsI,23820
@@ -107,7 +107,7 @@ codegraphcontext/tools/languages/typescript.py,sha256=aVGXD-CHxCXs74WOOW1RMSEzz0
107
107
  codegraphcontext/tools/languages/typescriptjsx.py,sha256=b-XkR26fhFY8-0UBlayx7FYPAORqik7_LBTVZRvOhLE,7592
108
108
  codegraphcontext/tools/languages/vue.py,sha256=XKBoFea_4xMZaDStfkA52wgqc18yQ6COHDBHRduOe-0,1479
109
109
  codegraphcontext/tools/query_tool_languages/c_toolkit.py,sha256=kp-CFCOsFZa3sr3qOrH2Bh-ASwI-aaUCbqJSJZMt_Bs,271
110
- codegraphcontext/tools/query_tool_languages/cpp_toolkit.py,sha256=PW2yVzjYf-0f8GlR15EkXEH7_z_iqfGeUhjQCQH8GAY,3087
110
+ codegraphcontext/tools/query_tool_languages/cpp_toolkit.py,sha256=rVyZq1doOeNvTys24qHQ6YnPDJ8PuJvn72KrPX6rhkk,3087
111
111
  codegraphcontext/tools/query_tool_languages/csharp_toolkit.py,sha256=nnfBDN3ejnQytH9mUYKs7IK7RXBsYP4MoqITIZAZADY,281
112
112
  codegraphcontext/tools/query_tool_languages/dart_toolkit.py,sha256=W5ClOZ-KCRFmwr7XnEW16YTUfO7LJX67eHTlzXCl23A,277
113
113
  codegraphcontext/tools/query_tool_languages/elisp_toolkit.py,sha256=fH8T5HKULMSgq8m46kCUi7Ql1lglTH5taQemJLCrKi0,2591
@@ -126,10 +126,10 @@ codegraphcontext/tools/query_tool_languages/typescript_toolkit.py,sha256=xV7nPSp
126
126
  codegraphcontext/utils/cypher_ddl.py,sha256=SuFcCCnHtbyBMoEi6-vWLxt7WdOmRoJC5VAM025iX5I,2767
127
127
  codegraphcontext/utils/cypher_readonly.py,sha256=ZlgmFN2_78ME5N8kvgmW82CdvbQTtXVE1vO_I6kPnk0,3119
128
128
  codegraphcontext/utils/debug_log.py,sha256=eFKQmaB4iTGzcdytfwZszhcMJCK6jIPxPXKsJOncl4A,3023
129
- codegraphcontext/utils/gcf_encoder.py,sha256=d56j59t-cqR2tcBx8dQuXA0mFieTMDu8O20oAGCWrZY,1613
129
+ codegraphcontext/utils/gcf_encoder.py,sha256=H6G66BCqbOZpyM_4JOFne5F3YrZRA8fiMnT4S_gRCk8,1806
130
130
  codegraphcontext/utils/git_utils.py,sha256=D7ve2gpZaEHk4y6K4ga-o2ka89DVFX1acafD31YAyJM,1383
131
131
  codegraphcontext/utils/path_ignore.py,sha256=xaYCSq6nzUVX_mEdn3yrmwM--v7orJImga2XAQeiGB0,2168
132
- codegraphcontext/utils/path_sandbox.py,sha256=o6bLz3oQcidQwM89KBbmGbKJBtRyz7wgvNLvF7KGqMk,2664
132
+ codegraphcontext/utils/path_sandbox.py,sha256=AemD1DHVMA0lj9BpmRkKwJB2OaE0SewggmJnyi0dr04,2784
133
133
  codegraphcontext/utils/repo_path.py,sha256=BxS3y6RV_WaZhg_WxgJygS4SnQa-Ryth2fsicfnYorY,1121
134
134
  codegraphcontext/utils/tool_limits.py,sha256=3d-QnlzxBNocz58VKNhdsta7ZpWThs1AX46_gYXl6pQ,2751
135
135
  codegraphcontext/utils/tree_sitter_manager.py,sha256=Xr26xYL1HUP8V1Hk9d7tbS4RUb774f-Stc2DtuE7oN0,13307
@@ -173,9 +173,9 @@ codegraphcontext/viz/dist/wasm/tree-sitter-typescript.wasm,sha256=hRVATc7tOOHthq
173
173
  codegraphcontext/viz/dist/wasm/tree-sitter.wasm,sha256=CCeVuI_hXktkBD-DW01xYPv5XoAYVRIqzJUJI5te-RY,196763
174
174
  codegraphcontext/viz/dist/wasm/web-tree-sitter.js,sha256=DIaCNqRylrT_PBVw8g4ImeSnhP9uXNe_ycOlUiVGPko,153666
175
175
  codegraphcontext/viz/dist/wasm/web-tree-sitter.wasm,sha256=CCeVuI_hXktkBD-DW01xYPv5XoAYVRIqzJUJI5te-RY,196763
176
- codegraphcontext-0.5.4.dist-info/licenses/LICENSE,sha256=rh8M-bJpQYJnw2vtRVgt0t7piMZXh5QzaKeNEI0vqqA,1061
177
- codegraphcontext-0.5.4.dist-info/METADATA,sha256=hWjnvQZDiclBoydpqEo6fU7Z9G7b2xMWT7Phae4XoZ4,32847
178
- codegraphcontext-0.5.4.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
179
- codegraphcontext-0.5.4.dist-info/entry_points.txt,sha256=LCxWCWMshdvYGoHBPuQZ8C-e4CiNSHCLXofrNSGHkoE,103
180
- codegraphcontext-0.5.4.dist-info/top_level.txt,sha256=CBgc6LAPZIO5FS0nSYYkylDifHsZTIqw3Gf5UwDxeGI,17
181
- codegraphcontext-0.5.4.dist-info/RECORD,,
176
+ codegraphcontext-0.5.5.dist-info/licenses/LICENSE,sha256=rh8M-bJpQYJnw2vtRVgt0t7piMZXh5QzaKeNEI0vqqA,1061
177
+ codegraphcontext-0.5.5.dist-info/METADATA,sha256=g-1RGSS7QULexGiay2b2oPTWrrm8A3XiQYX8QC2D7Eo,32847
178
+ codegraphcontext-0.5.5.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
179
+ codegraphcontext-0.5.5.dist-info/entry_points.txt,sha256=LCxWCWMshdvYGoHBPuQZ8C-e4CiNSHCLXofrNSGHkoE,103
180
+ codegraphcontext-0.5.5.dist-info/top_level.txt,sha256=CBgc6LAPZIO5FS0nSYYkylDifHsZTIqw3Gf5UwDxeGI,17
181
+ codegraphcontext-0.5.5.dist-info/RECORD,,