pycode-kg 0.28.2__tar.gz → 0.29.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 (63) hide show
  1. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/PKG-INFO +8 -9
  2. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/README.md +6 -6
  3. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/pyproject.toml +6 -9
  4. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/__init__.py +1 -1
  5. pycode_kg-0.29.0/src/pycode_kg/cli/cmd_mcp.py +37 -0
  6. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/explain.py +2 -2
  7. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/mcp_server.py +232 -746
  8. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/pycodekg_thorough_analysis.py +4 -2
  9. pycode_kg-0.28.2/src/pycode_kg/cli/cmd_mcp.py +0 -75
  10. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/LICENSE +0 -0
  11. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/.DS_Store +0 -0
  12. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/__main__.py +0 -0
  13. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/analysis/__init__.py +0 -0
  14. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/analysis/bridge.py +0 -0
  15. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/analysis/centrality.py +0 -0
  16. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/analysis/framework_detector.py +0 -0
  17. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/app.py +0 -0
  18. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/architecture.py +0 -0
  19. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/build_pycodekg_sqlite.py +0 -0
  20. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/__init__.py +0 -0
  21. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_analyze.py +0 -0
  22. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_architecture.py +0 -0
  23. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_bridges.py +0 -0
  24. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_build.py +0 -0
  25. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_build_full.py +0 -0
  26. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_centrality.py +0 -0
  27. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_explain.py +0 -0
  28. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_framework_nodes.py +0 -0
  29. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_hooks.py +0 -0
  30. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_init.py +0 -0
  31. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_model.py +0 -0
  32. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_query.py +0 -0
  33. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_quilt.py +0 -0
  34. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_snapshot.py +0 -0
  35. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/cmd_viz.py +0 -0
  36. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/main.py +0 -0
  37. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/cli/options.py +0 -0
  38. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/config.py +0 -0
  39. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/graph.py +0 -0
  40. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/graph_html.py +0 -0
  41. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/index.py +0 -0
  42. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/kg.py +0 -0
  43. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/layout3d.py +0 -0
  44. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/module/__init__.py +0 -0
  45. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/module/base.py +0 -0
  46. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/module/extractor.py +0 -0
  47. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/module/types.py +0 -0
  48. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/pycodekg.py +0 -0
  49. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/ranking/__init__.py +0 -0
  50. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/ranking/cli_rank.py +0 -0
  51. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/ranking/coderank.py +0 -0
  52. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/render.py +0 -0
  53. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/report.py +0 -0
  54. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/resolution.py +0 -0
  55. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/scene3d.py +0 -0
  56. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/snapshots.py +0 -0
  57. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/sql/004_add_centrality_table.sql +0 -0
  58. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/store.py +0 -0
  59. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/theme.py +0 -0
  60. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/utils.py +0 -0
  61. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/visitor.py +0 -0
  62. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/viz3d.py +0 -0
  63. {pycode_kg-0.28.2 → pycode_kg-0.29.0}/src/pycode_kg/viz3d_timeline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycode-kg
3
- Version: 0.28.2
3
+ Version: 0.29.0
4
4
  Summary: A tool to build a searchable knowledge graph from Python repositories
5
5
  License-Expression: Elastic-2.0
6
6
  License-File: LICENSE
@@ -21,11 +21,10 @@ Provides-Extra: viz3d
21
21
  Requires-Dist: PyQt5 (>=5.15.0) ; extra == "all"
22
22
  Requires-Dist: PyQt5 (>=5.15.0) ; extra == "viz3d"
23
23
  Requires-Dist: click (>=8.1.0,<9)
24
- Requires-Dist: kgmodule-utils[semantic,viz3d] (>=0.27.0)
24
+ Requires-Dist: kgmodule-utils[mcp,semantic,viz3d] (>=0.29.0)
25
25
  Requires-Dist: kgmodule-utils[viz3d-qt,viz3d-render] (>=0.27.0) ; extra == "viz3d"
26
26
  Requires-Dist: markdown (>=3.6) ; extra == "all"
27
27
  Requires-Dist: markdown (>=3.6) ; extra == "viz3d"
28
- Requires-Dist: mcp (>=1.3.0,<2)
29
28
  Requires-Dist: networkx (>=3.0)
30
29
  Requires-Dist: numpy (>=1.24.0)
31
30
  Requires-Dist: pandas (>=2.0.0)
@@ -60,7 +59,7 @@ Description-Content-Type: text/markdown
60
59
 
61
60
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13-blue.svg)](https://www.python.org/)
62
61
  [![License: Elastic-2.0](https://img.shields.io/badge/License-Elastic%202.0-blue.svg)](https://www.elastic.co/licensing/elastic-license)
63
- [![Version](https://img.shields.io/badge/version-0.28.2-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
62
+ [![Version](https://img.shields.io/badge/version-0.29.0-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
64
63
  [![CI](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml/badge.svg)](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml)
65
64
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
66
65
  [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.19737993-blue.svg)](https://doi.org/10.5281/zenodo.19737993)
@@ -137,9 +136,9 @@ jq '.docstring_coverage.total' ~/.claude/pycodekg_analysis_latest.json
137
136
 
138
137
  ### 2. Agentic — MCP server for grounded AI workflows
139
138
 
140
- Run `pycodekg mcp` and Claude (or any MCP-aware client) gets nineteen tools backed by the same graph: `graph_stats`, `query_codebase`, `pack_snippets`, `get_node`, `list_nodes`, `callers`, `explain`, `centrality`, `bridge_centrality`, `framework_nodes`, `analyze_repo`, `snapshot_list / show / diff`, and more. Setup for Claude Code, Claude Desktop, Kilo Code, Copilot, and Cline is a single line — see [docs/MCP.md](docs/MCP.md) and [docs/INSTALLATION.md](docs/INSTALLATION.md).
139
+ Run `pycodekg mcp` and Claude (or any MCP-aware client) gets nineteen tools backed by the same graph: `stats`, `query`, `pack`, `get_node`, `list_nodes`, `callers`, `explain`, `centrality`, `bridge_centrality`, `framework_nodes`, `analyze_repo`, `snapshot_list / show / diff`, and more. Setup for Claude Code, Claude Desktop, Kilo Code, Copilot, and Cline is a single line — see [docs/MCP.md](docs/MCP.md) and [docs/INSTALLATION.md](docs/INSTALLATION.md).
141
140
 
142
- The agent benefit isn't subtle. Tools like `pack_snippets` return *actual source* with line numbers and surrounding context; `callers` returns the *real* fan-in resolved across import aliases, not a regex's best guess. The agent stops fabricating function signatures and starts citing them. Multi-step workflows — *"find the auth path, list its callers, summarize what changes if I rename it"* — collapse from dozens of `grep`s and file reads into a handful of source-grounded calls.
141
+ The agent benefit isn't subtle. Tools like `pack` return *actual source* with line numbers and surrounding context; `callers` returns the *real* fan-in resolved across import aliases, not a regex's best guess. The agent stops fabricating function signatures and starts citing them. Multi-step workflows — *"find the auth path, list its callers, summarize what changes if I rename it"* — collapse from dozens of `grep`s and file reads into a handful of source-grounded calls.
143
142
 
144
143
  Independent assessments tend to put it the same way:
145
144
 
@@ -255,7 +254,7 @@ src/pycode_kg/
255
254
  └── viz3d_timeline.py # Metric history timeline
256
255
  ```
257
256
 
258
- The MCP server, the CLI, and the Streamlit app are thin wrappers over the same store + index + ranking core — there is exactly one code path for each capability. The latest architectural deep-dive is in [docs/analysis_v0.28.2.md](docs/analysis_v0.28.2.md), produced (of course) by `pycodekg analyze` against this very repo.
257
+ The MCP server, the CLI, and the Streamlit app are thin wrappers over the same store + index + ranking core — there is exactly one code path for each capability. The latest architectural deep-dive is in [docs/analysis_v0.29.0.md](docs/analysis_v0.29.0.md), produced (of course) by `pycodekg analyze` against this very repo.
259
258
 
260
259
  ---
261
260
 
@@ -282,13 +281,13 @@ If you use PyCodeKG in your research or project, please cite it:
282
281
 
283
282
  [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.19737993-blue.svg)](https://doi.org/10.5281/zenodo.19737993)
284
283
 
285
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.28.2) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
284
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.29.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
286
285
 
287
286
  ```bibtex
288
287
  @software{suchanek_pycode_kg,
289
288
  author = {Suchanek, Eric G.},
290
289
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
291
- version = {0.28.2},
290
+ version = {0.29.0},
292
291
  year = {2026},
293
292
  publisher = {Flux-Frontiers},
294
293
  url = {https://github.com/Flux-Frontiers/pycode_kg},
@@ -5,7 +5,7 @@
5
5
 
6
6
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13-blue.svg)](https://www.python.org/)
7
7
  [![License: Elastic-2.0](https://img.shields.io/badge/License-Elastic%202.0-blue.svg)](https://www.elastic.co/licensing/elastic-license)
8
- [![Version](https://img.shields.io/badge/version-0.28.2-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
8
+ [![Version](https://img.shields.io/badge/version-0.29.0-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
9
9
  [![CI](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml/badge.svg)](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml)
10
10
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
11
11
  [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.19737993-blue.svg)](https://doi.org/10.5281/zenodo.19737993)
@@ -82,9 +82,9 @@ jq '.docstring_coverage.total' ~/.claude/pycodekg_analysis_latest.json
82
82
 
83
83
  ### 2. Agentic — MCP server for grounded AI workflows
84
84
 
85
- Run `pycodekg mcp` and Claude (or any MCP-aware client) gets nineteen tools backed by the same graph: `graph_stats`, `query_codebase`, `pack_snippets`, `get_node`, `list_nodes`, `callers`, `explain`, `centrality`, `bridge_centrality`, `framework_nodes`, `analyze_repo`, `snapshot_list / show / diff`, and more. Setup for Claude Code, Claude Desktop, Kilo Code, Copilot, and Cline is a single line — see [docs/MCP.md](docs/MCP.md) and [docs/INSTALLATION.md](docs/INSTALLATION.md).
85
+ Run `pycodekg mcp` and Claude (or any MCP-aware client) gets nineteen tools backed by the same graph: `stats`, `query`, `pack`, `get_node`, `list_nodes`, `callers`, `explain`, `centrality`, `bridge_centrality`, `framework_nodes`, `analyze_repo`, `snapshot_list / show / diff`, and more. Setup for Claude Code, Claude Desktop, Kilo Code, Copilot, and Cline is a single line — see [docs/MCP.md](docs/MCP.md) and [docs/INSTALLATION.md](docs/INSTALLATION.md).
86
86
 
87
- The agent benefit isn't subtle. Tools like `pack_snippets` return *actual source* with line numbers and surrounding context; `callers` returns the *real* fan-in resolved across import aliases, not a regex's best guess. The agent stops fabricating function signatures and starts citing them. Multi-step workflows — *"find the auth path, list its callers, summarize what changes if I rename it"* — collapse from dozens of `grep`s and file reads into a handful of source-grounded calls.
87
+ The agent benefit isn't subtle. Tools like `pack` return *actual source* with line numbers and surrounding context; `callers` returns the *real* fan-in resolved across import aliases, not a regex's best guess. The agent stops fabricating function signatures and starts citing them. Multi-step workflows — *"find the auth path, list its callers, summarize what changes if I rename it"* — collapse from dozens of `grep`s and file reads into a handful of source-grounded calls.
88
88
 
89
89
  Independent assessments tend to put it the same way:
90
90
 
@@ -200,7 +200,7 @@ src/pycode_kg/
200
200
  └── viz3d_timeline.py # Metric history timeline
201
201
  ```
202
202
 
203
- The MCP server, the CLI, and the Streamlit app are thin wrappers over the same store + index + ranking core — there is exactly one code path for each capability. The latest architectural deep-dive is in [docs/analysis_v0.28.2.md](docs/analysis_v0.28.2.md), produced (of course) by `pycodekg analyze` against this very repo.
203
+ The MCP server, the CLI, and the Streamlit app are thin wrappers over the same store + index + ranking core — there is exactly one code path for each capability. The latest architectural deep-dive is in [docs/analysis_v0.29.0.md](docs/analysis_v0.29.0.md), produced (of course) by `pycodekg analyze` against this very repo.
204
204
 
205
205
  ---
206
206
 
@@ -227,13 +227,13 @@ If you use PyCodeKG in your research or project, please cite it:
227
227
 
228
228
  [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.19737993-blue.svg)](https://doi.org/10.5281/zenodo.19737993)
229
229
 
230
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.28.2) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
230
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.29.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
231
231
 
232
232
  ```bibtex
233
233
  @software{suchanek_pycode_kg,
234
234
  author = {Suchanek, Eric G.},
235
235
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
236
- version = {0.28.2},
236
+ version = {0.29.0},
237
237
  year = {2026},
238
238
  publisher = {Flux-Frontiers},
239
239
  url = {https://github.com/Flux-Frontiers/pycode_kg},
@@ -70,7 +70,7 @@ torch = [
70
70
  # ---------------------------------------------------------------------------
71
71
  [project]
72
72
  name = "pycode-kg"
73
- version = "0.28.2"
73
+ version = "0.29.0"
74
74
  description = "A tool to build a searchable knowledge graph from Python repositories"
75
75
  readme = "README.md"
76
76
  license = "Elastic-2.0"
@@ -90,13 +90,6 @@ classifiers = [
90
90
  requires-python = ">=3.12,<3.14"
91
91
  dependencies = [
92
92
  "click>=8.1.0,<9",
93
- # Upper-bounded: mcp 2.0 removed the bundled `mcp.server.fastmcp` module
94
- # (FastMCP was split out into the standalone `fastmcp` package) and rebuilt
95
- # mcp.server around new submodules. src/pycode_kg/mcp_server.py imports
96
- # FastMCP from mcp, so an unbounded floor lets a clean install pull 2.x and
97
- # break `pycodekg-mcp` at import time. Lift this only alongside a port to
98
- # the standalone fastmcp package.
99
- "mcp>=1.3.0,<2",
100
93
  "networkx>=3.0",
101
94
  "numpy>=1.24.0",
102
95
  "pandas>=2.0.0",
@@ -169,7 +162,11 @@ dependencies = [
169
162
  # and the _domain_metrics() hook, none of which exist before 0.20.0.
170
163
  # Against 0.19.x the manager silently reports itself as "kg-utils" and
171
164
  # drops module_node_counts entirely.
172
- "kgmodule-utils[semantic,viz3d]>=0.27.0",
165
+ #
166
+ # 0.29.0: the MCP server is kg_utils.mcp's ([mcp] brings mcp itself, capped
167
+ # below 2.0 there), PyCodeKG.stats() is the fleet stats shape, and LanceDB
168
+ # is gone.
169
+ "kgmodule-utils[semantic,viz3d,mcp]>=0.29.0",
173
170
  ]
174
171
 
175
172
  [project.optional-dependencies]
@@ -36,7 +36,7 @@ Author: Eric G. Suchanek, PhD
36
36
  License: Elastic 2.0
37
37
  """
38
38
 
39
- __version__ = "0.28.2"
39
+ __version__ = "0.29.0"
40
40
  __author__ = "Eric G. Suchanek, PhD"
41
41
 
42
42
  # Low-level primitives (locked v0 contract)
@@ -0,0 +1,37 @@
1
+ """
2
+ cmd_mcp.py
3
+
4
+ ``pycodekg mcp`` -- the fleet's standard MCP command, from :mod:`kg_utils.mcp`:
5
+
6
+ pycodekg mcp [--repo DIR] [--db FILE] [--vectors FILE] [--model NAME]
7
+ [--transport stdio|streamable-http] [--host H] [--port N]
8
+ [--manifest]
9
+
10
+ Registering it imports neither ``mcp`` nor the server module, so every other
11
+ ``pycodekg`` command starts as fast as before.
12
+
13
+ Author: Eric G. Suchanek, PhD
14
+
15
+ License: Elastic 2.0
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ from pathlib import Path
21
+ from typing import TYPE_CHECKING
22
+
23
+ from kg_utils.mcp import add_mcp_command
24
+
25
+ from pycode_kg.cli.main import cli
26
+
27
+ if TYPE_CHECKING:
28
+ from kg_utils.mcp import KGServer
29
+
30
+
31
+ def _build_server(repo: Path, db: Path | None, vectors: Path | None, model: str | None) -> KGServer:
32
+ from pycode_kg.mcp_server import build_server # noqa: PLC0415 -- see the module docstring
33
+
34
+ return build_server(repo, db, vectors, model)
35
+
36
+
37
+ mcp_command = add_mcp_command(cli, _build_server)
@@ -26,7 +26,7 @@ def render_explain(
26
26
  node_id: str,
27
27
  *,
28
28
  limit: int = 10,
29
- snippets_hint: str = "pack_snippets()",
29
+ snippets_hint: str = "pack()",
30
30
  ) -> str:
31
31
  """
32
32
  Render a Markdown natural-language explanation of a code node.
@@ -37,7 +37,7 @@ def render_explain(
37
37
  (e.g. ``fn:src/pycode_kg/store.py:GraphStore.expand``).
38
38
  :param limit: Maximum callers and callees to list. Pass 0 to list all.
39
39
  :param snippets_hint: Closing call-to-action shown to the consumer for
40
- retrieving the full source — ``"pack_snippets()"``
40
+ retrieving the full source — ``"pack()"``
41
41
  for MCP, ``"pycodekg pack"`` for CLI.
42
42
  :return: Markdown string, or a "Node Not Found" header when the ID does
43
43
  not exist in the knowledge graph.