pycode-kg 0.20.0__tar.gz → 0.21.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 (62) hide show
  1. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/PKG-INFO +10 -11
  2. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/README.md +4 -3
  3. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/pyproject.toml +40 -18
  4. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/__init__.py +1 -1
  5. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/analysis/__init__.py +6 -0
  6. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/analysis/bridge.py +1 -1
  7. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/analysis/centrality.py +1 -1
  8. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/analysis/framework_detector.py +1 -1
  9. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/app.py +94 -366
  10. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_hooks.py +11 -27
  11. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_viz.py +107 -0
  12. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/explain.py +2 -8
  13. pycode_kg-0.21.0/src/pycode_kg/graph_html.py +131 -0
  14. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/layout3d.py +6 -16
  15. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/mcp_server.py +12 -19
  16. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg.py +1 -1
  17. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg_thorough_analysis.py +3 -3
  18. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/snapshots.py +1 -1
  19. pycode_kg-0.21.0/src/pycode_kg/theme.py +188 -0
  20. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/viz3d.py +93 -34
  21. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/LICENSE +0 -0
  22. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/.DS_Store +0 -0
  23. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/__main__.py +0 -0
  24. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/analysis/hybrid_rank.py +0 -0
  25. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/architecture.py +0 -0
  26. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/build_pycodekg_sqlite.py +0 -0
  27. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/__init__.py +0 -0
  28. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_analyze.py +0 -0
  29. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_architecture.py +0 -0
  30. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_bridges.py +0 -0
  31. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_build.py +0 -0
  32. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_build_full.py +0 -0
  33. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_centrality.py +0 -0
  34. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_explain.py +0 -0
  35. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_framework_nodes.py +0 -0
  36. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_init.py +0 -0
  37. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_mcp.py +0 -0
  38. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_model.py +0 -0
  39. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_query.py +0 -0
  40. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/cmd_snapshot.py +0 -0
  41. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/main.py +0 -0
  42. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/cli/options.py +0 -0
  43. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/config.py +0 -0
  44. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/graph.py +0 -0
  45. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/index.py +0 -0
  46. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/kg.py +0 -0
  47. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/module/__init__.py +0 -0
  48. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/module/base.py +0 -0
  49. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/module/extractor.py +0 -0
  50. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/module/types.py +0 -0
  51. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg_query.py +0 -0
  52. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg_snippet_packer.py +0 -0
  53. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg_viz.py +0 -0
  54. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/pycodekg_viz3d.py +0 -0
  55. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/ranking/__init__.py +0 -0
  56. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/ranking/cli_rank.py +0 -0
  57. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/ranking/coderank.py +0 -0
  58. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/sql/004_add_centrality_table.sql +0 -0
  59. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/store.py +0 -0
  60. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/utils.py +0 -0
  61. {pycode_kg-0.20.0 → pycode_kg-0.21.0}/src/pycode_kg/visitor.py +0 -0
  62. {pycode_kg-0.20.0 → pycode_kg-0.21.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.20.0
3
+ Version: 0.21.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
@@ -17,7 +17,6 @@ Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
18
  Provides-Extra: all
19
19
  Provides-Extra: dev
20
- Provides-Extra: kgdeps
21
20
  Provides-Extra: viz
22
21
  Provides-Extra: viz3d
23
22
  Requires-Dist: PyQt5 (>=5.15.0) ; extra == "all"
@@ -25,12 +24,11 @@ Requires-Dist: PyQt5 (>=5.15.0) ; extra == "viz3d"
25
24
  Requires-Dist: click (>=8.1.0,<9)
26
25
  Requires-Dist: detect-secrets (>=1.5.0) ; extra == "all"
27
26
  Requires-Dist: detect-secrets (>=1.5.0) ; extra == "dev"
28
- Requires-Dist: doc-kg (>=0.18.1) ; extra == "dev"
29
- Requires-Dist: doc-kg (>=0.18.1) ; extra == "kgdeps"
30
- Requires-Dist: kgmodule-utils[semantic,sqlite-vec] (>=0.6.2)
27
+ Requires-Dist: kgmodule-utils[semantic,sqlite-vec,viz] (>=0.9.0)
31
28
  Requires-Dist: markdown (>=3.6) ; extra == "all"
32
29
  Requires-Dist: markdown (>=3.6) ; extra == "viz3d"
33
30
  Requires-Dist: mcp (>=1.0.0)
31
+ Requires-Dist: networkx (>=3.0)
34
32
  Requires-Dist: numpy (>=1.24.0)
35
33
  Requires-Dist: pandas (>=2.0.0)
36
34
  Requires-Dist: param (>=2.0.0) ; extra == "all"
@@ -56,12 +54,12 @@ Requires-Dist: ruff (>=0.4.0) ; extra == "all"
56
54
  Requires-Dist: ruff (>=0.4.0) ; extra == "dev"
57
55
  Requires-Dist: safetensors (>=0.5.0)
58
56
  Requires-Dist: sentence-transformers (>=5.4.1)
59
- Requires-Dist: streamlit (>=1.35.0) ; extra == "all"
60
- Requires-Dist: streamlit (>=1.35.0) ; extra == "viz"
57
+ Requires-Dist: streamlit (>=1.56.0) ; extra == "all"
58
+ Requires-Dist: streamlit (>=1.56.0) ; extra == "viz"
61
59
  Requires-Dist: torch (>=2.5.1)
62
60
  Requires-Dist: trame-vtk (>=2.0.0) ; extra == "all"
63
61
  Requires-Dist: trame-vtk (>=2.0.0) ; extra == "viz3d"
64
- Requires-Dist: transformers (>=4.40.0,<4.57)
62
+ Requires-Dist: transformers (>=5.5.0,<6)
65
63
  Requires-Dist: ty (>=0.0.41) ; extra == "all"
66
64
  Requires-Dist: ty (>=0.0.41) ; extra == "dev"
67
65
  Project-URL: Homepage, https://github.com/Flux-Frontiers/pycode_kg
@@ -75,7 +73,7 @@ Description-Content-Type: text/markdown
75
73
 
76
74
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13-blue.svg)](https://www.python.org/)
77
75
  [![License: Elastic-2.0](https://img.shields.io/badge/License-Elastic%202.0-blue.svg)](https://www.elastic.co/licensing/elastic-license)
78
- [![Version](https://img.shields.io/badge/version-0.20.0-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
76
+ [![Version](https://img.shields.io/badge/version-0.21.0-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
79
77
  [![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)
80
78
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
81
79
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
@@ -215,6 +213,7 @@ The graph is built around four node kinds (module, class, function, method) and
215
213
  | **Pull source-grounded context for an LLM** | `pycodekg pack "..." --format md` | [docs/CHEATSHEET.md](docs/CHEATSHEET.md) |
216
214
  | **Run a hybrid semantic + structural query** | `pycodekg query "..."` | [docs/CHEATSHEET.md](docs/CHEATSHEET.md) |
217
215
  | **Browse the graph interactively** | `pycodekg viz` (Streamlit) | [docs/INSTALLATION.md](docs/INSTALLATION.md) |
216
+ | **Share a graph as one file** | `pycodekg viz-export -o graph.html` | opens from `file://`, no server |
218
217
  | **See call graphs in 3-D** *(active development — functional but rough)* | `pycodekg viz3d --layout funnel` | [docs/VIZ3D.md](docs/VIZ3D.md) |
219
218
  | **Wire it into Claude / Copilot / Cline** | `pycodekg mcp` | [docs/MCP.md](docs/MCP.md) |
220
219
 
@@ -271,13 +270,13 @@ If you use PyCodeKG in your research or project, please cite it:
271
270
 
272
271
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
273
272
 
274
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.20.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
273
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
275
274
 
276
275
  ```bibtex
277
276
  @software{suchanek_pycode_kg,
278
277
  author = {Suchanek, Eric G.},
279
278
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
280
- version = {0.20.0},
279
+ version = {0.21.0},
281
280
  year = {2026},
282
281
  publisher = {Flux-Frontiers},
283
282
  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.20.0-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
8
+ [![Version](https://img.shields.io/badge/version-0.21.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://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
@@ -145,6 +145,7 @@ The graph is built around four node kinds (module, class, function, method) and
145
145
  | **Pull source-grounded context for an LLM** | `pycodekg pack "..." --format md` | [docs/CHEATSHEET.md](docs/CHEATSHEET.md) |
146
146
  | **Run a hybrid semantic + structural query** | `pycodekg query "..."` | [docs/CHEATSHEET.md](docs/CHEATSHEET.md) |
147
147
  | **Browse the graph interactively** | `pycodekg viz` (Streamlit) | [docs/INSTALLATION.md](docs/INSTALLATION.md) |
148
+ | **Share a graph as one file** | `pycodekg viz-export -o graph.html` | opens from `file://`, no server |
148
149
  | **See call graphs in 3-D** *(active development — functional but rough)* | `pycodekg viz3d --layout funnel` | [docs/VIZ3D.md](docs/VIZ3D.md) |
149
150
  | **Wire it into Claude / Copilot / Cline** | `pycodekg mcp` | [docs/MCP.md](docs/MCP.md) |
150
151
 
@@ -201,13 +202,13 @@ If you use PyCodeKG in your research or project, please cite it:
201
202
 
202
203
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
203
204
 
204
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.20.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
205
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.0) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
205
206
 
206
207
  ```bibtex
207
208
  @software{suchanek_pycode_kg,
208
209
  author = {Suchanek, Eric G.},
209
210
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
210
- version = {0.20.0},
211
+ version = {0.21.0},
211
212
  year = {2026},
212
213
  publisher = {Flux-Frontiers},
213
214
  url = {https://github.com/Flux-Frontiers/pycode_kg},
@@ -1,7 +1,7 @@
1
1
  # pyproject.toml — PyCodeKG package configuration (PEP 621)
2
2
  #
3
3
  # Author: Eric G. Suchanek, PhD
4
- # Last Revision: 2026-07-15
4
+ # Last Revision: 2026-07-28
5
5
  #
6
6
  # Build system : Poetry 2.x with PEP 621 [project] table
7
7
  #
@@ -10,7 +10,6 @@
10
10
  # pip install -e ".[dev]" core + dev tools (pytest, ruff, ty, etc.)
11
11
  # pip install -e ".[viz]" core + Streamlit/Plotly/PyVis visualizer
12
12
  # pip install -e ".[viz3d]" core + PyVista 3D visualizer
13
- # pip install -e ".[kgdeps]" core + KG integrations (doc-kg, agent-kg)
14
13
  # pip install -e ".[all]" everything above
15
14
  # pip install -e "." core runtime only
16
15
  #
@@ -20,7 +19,6 @@
20
19
  # poetry install --extras "dev" core + dev tools only
21
20
  # poetry install --extras "viz" core + Streamlit/Plotly visualizer only
22
21
  # poetry install --extras "viz3d" core + 3D visualizer only
23
- # poetry install --extras "kgdeps" core + KG integrations only
24
22
  # poetry install core runtime only
25
23
  #
26
24
  # First-time setup
@@ -46,12 +44,33 @@ build-backend = "poetry.core.masonry.api"
46
44
  [tool.poetry]
47
45
  packages = [{ include = "pycode_kg", from = "src" }]
48
46
 
47
+ # CPU-only torch on Linux: dev/CI here has no GPU, but the default PyPI linux
48
+ # wheel bundles the full CUDA runtime (~2.7G of nvidia-* packages, ~700M of
49
+ # triton) regardless. "explicit" priority means only packages naming this
50
+ # source use it — nothing else is redirected off PyPI. This affects local/CI
51
+ # installs only; it is not part of published wheel metadata, so `pip install
52
+ # pycode-kg` for a GPU user still resolves torch normally.
53
+ #
54
+ # Linux only: macOS/Windows torch builds are already CPU/MPS, and this index
55
+ # publishes the macOS ones without the "+cpu" local version label, so locking
56
+ # it globally leaves those platforms with no installable candidate.
57
+ [[tool.poetry.source]]
58
+ name = "pytorch-cpu"
59
+ url = "https://download.pytorch.org/whl/cpu"
60
+ priority = "explicit"
61
+
62
+ [tool.poetry.dependencies]
63
+ torch = [
64
+ { markers = "sys_platform == 'linux'", source = "pytorch-cpu" },
65
+ { markers = "sys_platform != 'linux'" },
66
+ ]
67
+
49
68
  # ---------------------------------------------------------------------------
50
69
  # PEP 621 project metadata
51
70
  # ---------------------------------------------------------------------------
52
71
  [project]
53
72
  name = "pycode-kg"
54
- version = "0.20.0"
73
+ version = "0.21.0"
55
74
  description = "A tool to build a searchable knowledge graph from Python repositories"
56
75
  readme = "README.md"
57
76
  license = "Elastic-2.0"
@@ -72,14 +91,15 @@ requires-python = ">=3.12,<3.14"
72
91
  dependencies = [
73
92
  "click>=8.1.0,<9",
74
93
  "mcp>=1.0.0",
94
+ "networkx>=3.0",
75
95
  "numpy>=1.24.0",
76
96
  "pandas>=2.0.0",
77
97
  "rich>=14.3.3,<15",
78
98
  "safetensors>=0.5.0",
79
99
  "sentence-transformers>=5.4.1",
80
100
  "torch>=2.5.1",
81
- "transformers>=4.40.0,<4.57",
82
- "kgmodule-utils[semantic,sqlite-vec]>=0.6.2",
101
+ "transformers>=5.5.0,<6",
102
+ "kgmodule-utils[semantic,sqlite-vec,viz]>=0.9.0",
83
103
  ]
84
104
 
85
105
  [project.optional-dependencies]
@@ -91,13 +111,11 @@ dev = [
91
111
  "pytest>=8.0.0",
92
112
  "pytest-cov>=5.0.0",
93
113
  "ruff>=0.4.0",
94
- "doc-kg>=0.18.1",
95
- # agent-kg not yet on PyPI — install manually: pip install git+https://github.com/Flux-Frontiers/agent_kg.git
96
114
  ]
97
115
  viz = [
98
116
  "plotly>=5.14.0",
99
117
  "pyvis>=0.3.2",
100
- "streamlit>=1.35.0",
118
+ "streamlit>=1.56.0",
101
119
  ]
102
120
  viz3d = [
103
121
  "markdown>=3.6",
@@ -108,10 +126,14 @@ viz3d = [
108
126
  "trame-vtk>=2.0.0",
109
127
  ]
110
128
 
111
- # note that dockg is on pypi; agent-kg is not yet — install manually from git
112
- kgdeps = [
113
- "doc-kg>=0.18.1",
114
- ]
129
+ # Cross-KG sibling packages (doc-kg, pycode-kg, agent-kg, kg-rag) are NOT
130
+ # declared here. They are never imported by this package, and listing them
131
+ # forces poetry's universal resolution to reconcile the transformers pin of
132
+ # every *published* sibling against this project's own -- a deadlock, since
133
+ # doc-kg and pycode-kg each depend on the other. Install them by hand:
134
+ # pip install doc-kg pycode-kg # both on PyPI
135
+ # pip install 'kg-rag @ git+https://github.com/Flux-Frontiers/KGRAG.git'
136
+ # pip install 'agent-kg @ git+https://github.com/Flux-Frontiers/agent_kg.git'
115
137
  all = [
116
138
  "detect-secrets>=1.5.0",
117
139
  "markdown>=3.6",
@@ -126,7 +148,7 @@ all = [
126
148
  "pyvistaqt>=0.11.0",
127
149
  "pyvis>=0.3.2",
128
150
  "ruff>=0.4.0",
129
- "streamlit>=1.35.0",
151
+ "streamlit>=1.56.0",
130
152
  "trame-vtk>=2.0.0",
131
153
  "ty>=0.0.41",
132
154
  ]
@@ -160,10 +182,10 @@ pycodekg-viz3d = "pycode_kg.cli.cmd_viz:viz3d"
160
182
  [tool.ruff]
161
183
  line-length = 100
162
184
  target-version = "py312"
163
- # Vendored Claude Code skills — not project code. The pre-commit hook's
164
- # exclude can't cover these (it runs with pass_filenames: false), so the
165
- # exclusion must live here.
166
- extend-exclude = [".claude"]
185
+ # Vendored agent scratch dirs (Claude Code skills, Codex) — not project code.
186
+ # The pre-commit hook's exclude can't cover these (it runs with
187
+ # pass_filenames: false), so the exclusion must live here.
188
+ extend-exclude = [".claude", ".agents", ".codex"]
167
189
 
168
190
  [tool.ruff.lint]
169
191
  # B023, BLE001, PLC0415 replace the retired pylint hook's cell-var-from-loop,
@@ -32,7 +32,7 @@ KGModule SDK (build new domain KGs)::
32
32
  from pycode_kg import KGModule, KGExtractor, PyCodeKGExtractor, NodeSpec, EdgeSpec
33
33
  """
34
34
 
35
- __version__ = "0.20.0"
35
+ __version__ = "0.21.0"
36
36
  __author__ = "Eric G. Suchanek, PhD"
37
37
 
38
38
  # Low-level primitives (locked v0 contract)
@@ -1,5 +1,7 @@
1
1
  """Analysis primitives for PyCodeKG."""
2
2
 
3
+ from kg_utils.analysis.scores import MetricRef, ScoreSet, available_metrics, load_scores
4
+
3
5
  from .centrality import (
4
6
  CentralityConfig,
5
7
  CentralityRecord,
@@ -10,6 +12,10 @@ from .centrality import (
10
12
  __all__ = [
11
13
  "CentralityConfig",
12
14
  "CentralityRecord",
15
+ "MetricRef",
16
+ "ScoreSet",
13
17
  "StructuralImportanceRanker",
14
18
  "aggregate_module_scores",
19
+ "available_metrics",
20
+ "load_scores",
15
21
  ]
@@ -4,7 +4,7 @@ Measures module interaction complexity: how many unique modules each module call
4
4
  For well-modularized codebases, identifies orchestrator and hub modules.
5
5
 
6
6
  Author: Eric G. Suchanek, PhD
7
- Last Revision: 2026-03-12 17:30:35
7
+ Last Revision: 2026-04-27 23:29:23
8
8
  License: Elastic 2.0
9
9
  """
10
10
 
@@ -12,7 +12,7 @@ Public API:
12
12
  - :func:`aggregate_module_scores` — roll node scores up to module level.
13
13
 
14
14
  Author: Eric G. Suchanek, PhD
15
- Last Revision: 2026-03-11 12:45:30
15
+ Last Revision: 2026-05-01 21:46:11
16
16
  """
17
17
 
18
18
  from __future__ import annotations
@@ -3,7 +3,7 @@ Framework Detector for PyCodeKG.
3
3
  Identifies repo-defining abstractions using centrality and cross-module signals.
4
4
 
5
5
  Author: Eric G. Suchanek, PhD
6
- Last Revision: 2026-03-12 17:30:35
6
+ Last Revision: 2026-07-15 22:51:18
7
7
  License: Elastic 2.0
8
8
  """
9
9