memorykit 0.8.0__tar.gz → 0.8.2__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.
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.2 — 2026-10-25
4
+
5
+ - The `rag` provider finds a sibling indexkit inside Claude Code's versioned
6
+ plugin cache (`cache/<marketplace>/indexkit/<version>/`), choosing the
7
+ highest installed version. Since indexkit 0.6.4 no longer puts a launcher on
8
+ `PATH`, provider operations otherwise reported indexkit as not installed.
9
+
10
+ ## 0.8.1 — 2026-10-25
11
+
12
+ - The `rag` provider finds the sibling indexkit launcher at its new
13
+ `scripts/indexkit` location and falls back to `bin/` for an older checkout.
14
+ - Drop the `$schema` key from `plugin.json`. The claude.ai-hosted plugin sync
15
+ (Claude Desktop) does not recognize it and stripped it with a warning on
16
+ every sync. No change to the plugin's behavior.
17
+
3
18
  ## 0.8.0 — 2026-08-30
4
19
 
5
20
  - Add safe automatic project detection for GitHub Copilot plugin installs.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: memorykit
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Provenance-bound durable memory: an immutable record contract, a validator, append-only review state, and a standard-library stdio MCP server. No Python dependencies; requires git on PATH.
5
5
  Project-URL: Homepage, https://github.com/mbeacom/context-kit
6
6
  Project-URL: Repository, https://github.com/mbeacom/context-kit
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "memorykit"
3
- version = "0.8.0"
3
+ version = "0.8.2"
4
4
  description = "Provenance-bound durable memory: an immutable record contract, a validator, append-only review state, and a standard-library stdio MCP server. No Python dependencies; requires git on PATH."
5
5
  requires-python = ">=3.10"
6
6
  keywords = [
@@ -19,6 +19,6 @@ Two entry points, one implementation:
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- __version__ = "0.8.0"
22
+ __version__ = "0.8.2"
23
23
 
24
24
  __all__ = ["__version__"]
@@ -26,7 +26,7 @@ from pathlib import Path
26
26
  from typing import Any
27
27
 
28
28
  SERVER_NAME = "context-kit-memory"
29
- SERVER_VERSION = "0.8.0"
29
+ SERVER_VERSION = "0.8.2"
30
30
  # Newest first. The client's requested version is echoed when supported.
31
31
  SUPPORTED_PROTOCOLS = ("2025-06-18", "2025-03-26", "2024-11-05")
32
32
  # The provider is this package's sibling module, so one path is correct in both
@@ -1510,7 +1510,7 @@ def _provider_executable(spec: ProviderSpec) -> str:
1510
1510
  )
1511
1511
 
1512
1512
 
1513
- def _indexkit_root() -> Path | None:
1513
+ def _indexkit_root(origin: Path | None = None) -> Path | None:
1514
1514
  """The sibling indexkit plugin root, when deployed alongside `memory`.
1515
1515
 
1516
1516
  `memory` hard-depends on `indexkit`, so both are installed together and
@@ -1526,15 +1526,38 @@ def _indexkit_root() -> Path | None:
1526
1526
  Only a directory that actually contains the launcher counts, so a packaged
1527
1527
  install finds nothing and degrades to PATH resolution, which is the right
1528
1528
  answer there.
1529
+
1530
+ Claude Code's plugin cache adds a version level
1531
+ (`cache/<marketplace>/indexkit/<version>/`), so a sibling directory without
1532
+ a bootstrap of its own is searched one level down for the highest version
1533
+ that has one. GitHub Copilot CLI installs unversioned and matches directly.
1529
1534
  """
1530
- for ancestor in Path(__file__).resolve().parents[1:5]:
1535
+ for ancestor in (origin or Path(__file__)).resolve().parents[1:5]:
1531
1536
  for name in ("indexkit", "local-rag"):
1532
1537
  candidate = ancestor / name
1533
1538
  if (candidate / "scripts" / "bootstrap.sh").is_file():
1534
1539
  return candidate
1540
+ versioned = _highest_versioned_root(candidate)
1541
+ if versioned is not None:
1542
+ return versioned
1535
1543
  return None
1536
1544
 
1537
1545
 
1546
+ def _highest_versioned_root(directory: Path) -> Path | None:
1547
+ """The highest `<directory>/<version>/` that contains an indexkit bootstrap."""
1548
+ if not directory.is_dir():
1549
+ return None
1550
+ best: tuple[tuple[int, ...], Path] | None = None
1551
+ for child in directory.iterdir():
1552
+ match = re.fullmatch(r"v?(\d+(?:\.\d+)*)", child.name)
1553
+ if match is None or not (child / "scripts" / "bootstrap.sh").is_file():
1554
+ continue
1555
+ key = tuple(int(part) for part in match.group(1).split("."))
1556
+ if best is None or key > best[0]:
1557
+ best = (key, child)
1558
+ return None if best is None else best[1]
1559
+
1560
+
1538
1561
  def _bundled_executable(spec: ProviderSpec) -> Path | None:
1539
1562
  """Resolve a sibling context-kit plugin launcher that is not on PATH."""
1540
1563
  if spec.name != "rag":
@@ -1542,10 +1565,14 @@ def _bundled_executable(spec: ProviderSpec) -> Path | None:
1542
1565
  root = _indexkit_root()
1543
1566
  if root is None:
1544
1567
  return None
1545
- for name in (spec.executable, *spec.legacy_executables):
1546
- candidate = root / "bin" / name
1547
- if candidate.is_file() and os.access(candidate, os.X_OK):
1548
- return candidate
1568
+ # indexkit >= 0.6.4 ships its launcher under `scripts/`, because hosted
1569
+ # plugin sync skips any plugin with a top-level `bin/`. `bin/` stays as a
1570
+ # fallback for an older sibling checkout.
1571
+ for directory in ("scripts", "bin"):
1572
+ for name in (spec.executable, *spec.legacy_executables):
1573
+ candidate = root / directory / name
1574
+ if candidate.is_file() and os.access(candidate, os.X_OK):
1575
+ return candidate
1549
1576
  return None
1550
1577
 
1551
1578
 
File without changes
File without changes
File without changes