Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ Format loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

- No unreleased changes yet.

## [1.0.11] - 2026-05-28

### Fixed

- Kept dashboard graph neighborhoods functional when a user's installed
local graph export is valid but older than the packaged runtime graph. The
monitor still refuses to extract a mismatched packaged SQLite index, but now
falls back to the local `graph.json` instead of showing an empty graph.

## [1.0.10] - 2026-05-28

### Fixed
Expand Down Expand Up @@ -1599,6 +1608,7 @@ pass. Full test suite: **1316 passed, 2 skipped**.
- 5 dead imports removed (`os`, `Mapping`, `timedelta` from
`ctx_lifecycle`; `Path` from `intake_gate`, `intake_pipeline`).

[1.0.11]: https://github.com/stevesolun/ctx/releases/tag/v1.0.11
[1.0.10]: https://github.com/stevesolun/ctx/releases/tag/v1.0.10
[1.0.9]: https://github.com/stevesolun/ctx/releases/tag/v1.0.9
[1.0.8]: https://github.com/stevesolun/ctx/releases/tag/v1.0.8
Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ ones are flagged. New ones self-ingest.

---

**v1.0.10** — MIT, CI-matrixed (Ubuntu 3.12 plus Windows/macOS 3.11/3.12),
**v1.0.11** — MIT, CI-matrixed (Ubuntu 3.12 plus Windows/macOS 3.11/3.12),
3,915 tests collected. Ships console scripts including `ctx-init`,
`ctx-monitor` (local dashboard with graph + wiki + load/unload for
skills, agents, and MCP servers, plus Harness Setup for user-owned LLMs),
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "claude-ctx"
version = "1.0.10"
version = "1.0.11"
description = "Skill and agent recommendation system for Claude Code — knowledge graph, wiki, and intake quality gates"
authors = [{ name = "Steve Solun" }]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion src/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""ctx — skill and agent recommendation for Claude Code."""

__version__ = "1.0.10"
__version__ = "1.0.11"
2 changes: 1 addition & 1 deletion src/ctx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
ctx.utils - low-level primitives (safe names, atomic IO)
"""

__version__ = "1.0.10"
__version__ = "1.0.11"


# Public library surface — anything listed here is safe for third-
Expand Down
9 changes: 0 additions & 9 deletions src/ctx_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3256,15 +3256,6 @@ def _graph_neighborhood(
)
if indexed is not None:
return indexed
manifest_export_id = _dashboard_graph_manifest_export_id()
packaged_export_id = _packaged_graph_export_id()
if (
not _dashboard_graph_index_path().is_file()
and manifest_export_id is not None
and packaged_export_id is not None
and manifest_export_id != packaged_export_id
):
return {"nodes": [], "edges": [], "center": None}
try:
G = _load_dashboard_graph()
except Exception: # noqa: BLE001 — graph is advisory; blank on error
Expand Down
22 changes: 11 additions & 11 deletions src/tests/test_ctx_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2145,28 +2145,26 @@ def test_dashboard_index_extraction_skips_packaged_export_mismatch(
assert cm._ensure_dashboard_graph_index() is None


def test_graph_neighborhood_skips_full_graph_on_packaged_export_mismatch(
def test_graph_neighborhood_uses_local_graph_on_packaged_export_mismatch(
fake_claude: Path,
monkeypatch: pytest.MonkeyPatch,
) -> None:
import networkx as nx

graph_dir = fake_claude / "skill-wiki" / "graphify-out"
graph_dir.mkdir(parents=True)
(graph_dir / "graph-export-manifest.json").write_text(
json.dumps({"version": 1, "export_id": "old-local-export"}),
encoding="utf-8",
)
monkeypatch.setattr(cm, "_packaged_graph_export_id", lambda: "new-packaged-export")
monkeypatch.setattr(
cm,
"_load_dashboard_graph",
lambda: (_ for _ in ()).throw(AssertionError("full graph loaded")),
)
G = nx.Graph()
G.add_node("mcp-server:github", label="GitHub", type="mcp-server", tags=["git"])
monkeypatch.setattr(cm, "_load_dashboard_graph", lambda: G)

assert cm._graph_neighborhood("github", entity_type="mcp-server") == {
"nodes": [],
"edges": [],
"center": None,
}
result = cm._graph_neighborhood("github", entity_type="mcp-server")
assert result["center"] == "mcp-server:github"
assert result["nodes"][0]["data"]["type"] == "mcp-server"


def test_dashboard_index_extraction_works_with_installed_graph_report(
Expand Down Expand Up @@ -3372,6 +3370,7 @@ def fake_load_graph():
"available": True,
})
monkeypatch.setattr(cm, "_load_dashboard_graph", fake_load_graph)
monkeypatch.setattr(cm, "_top_degree_seeds_from_index", lambda _limit=18: [])
monkeypatch.setattr(cm, "_GRAPH_CACHE_VALUE", None)

html_out = cm._render_graph(None)
Expand All @@ -3394,6 +3393,7 @@ def _bad(*_a, **_k):
# braces in case a downstream path still routes through it.
monkeypatch.setitem(sys.modules, "ctx.core.graph.resolve_graph", fake)
monkeypatch.setitem(sys.modules, "resolve_graph", fake)
monkeypatch.setattr(cm, "_graph_stats", lambda: {"available": False})
monkeypatch.setattr(cm, "_GRAPH_CACHE_VALUE", None)
monkeypatch.setattr(cm, "_GRAPH_CACHE_KEY", None)
html_out = cm._render_graph(None)
Expand Down
Loading