memstack-skill-loader 3.5.1__tar.gz → 3.5.3__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.
- {memstack_skill_loader-3.5.1/src/memstack_skill_loader.egg-info → memstack_skill_loader-3.5.3}/PKG-INFO +2 -2
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/README.md +10 -13
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/pyproject.toml +2 -2
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/config.py +51 -3
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/server.py +9 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3/src/memstack_skill_loader.egg-info}/PKG-INFO +2 -2
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/MANIFEST.in +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/setup.cfg +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/__init__.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/__main__.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/compression.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/dashboard.html +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/dashboard.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/indexer.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/license.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/search.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/stats.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/tfidf_search.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/version_check.py +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader.egg-info/SOURCES.txt +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader.egg-info/dependency_links.txt +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader.egg-info/entry_points.txt +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader.egg-info/requires.txt +0 -0
- {memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader.egg-info/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memstack-skill-loader
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.3
|
|
4
4
|
Summary: MCP server that vector-indexes MemStack Pro skills for on-demand loading
|
|
5
|
-
Requires-Python: >=3.
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: mcp>=1.0.0
|
|
7
7
|
Requires-Dist: lancedb>=0.6.0
|
|
8
8
|
Requires-Dist: sentence-transformers>=2.2.0
|
|
@@ -4,27 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
## Quick Start (5 minutes)
|
|
6
6
|
|
|
7
|
-
1. **
|
|
7
|
+
1. **Install from PyPI:**
|
|
8
8
|
```bash
|
|
9
|
-
|
|
10
|
-
git clone https://github.com/cwinvestments/memstack-skill-loader.git
|
|
9
|
+
pip install memstack-skill-loader
|
|
11
10
|
```
|
|
12
11
|
|
|
13
|
-
2. **
|
|
14
|
-
```bash
|
|
15
|
-
cd memstack-skill-loader
|
|
16
|
-
pip install -e . --break-system-packages
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
3. **Register with Claude Code:**
|
|
12
|
+
2. **Register with Claude Code:**
|
|
20
13
|
```bash
|
|
21
14
|
claude mcp add --scope user memstack-skills -- python -m memstack_skill_loader
|
|
22
15
|
```
|
|
23
16
|
|
|
24
|
-
|
|
17
|
+
3. **Restart Claude Code**, then type `list skills` to verify.
|
|
18
|
+
|
|
19
|
+
4. **Activate Pro** (if purchased at [memstack.pro](https://memstack.pro)):
|
|
20
|
+
```
|
|
21
|
+
activate_license(key="your-key-here", email="you@example.com")
|
|
22
|
+
```
|
|
25
23
|
|
|
26
|
-
>
|
|
27
|
-
> To use a different location, set `MEMSTACK_SKILLS_DIR=/path/to/memstack/skills`.
|
|
24
|
+
> To override the skills path, set `MEMSTACK_SKILLS_DIR=/path/to/your/memstack/skills`.
|
|
28
25
|
|
|
29
26
|
> See [QUICKSTART.md](QUICKSTART.md) for detailed setup, [QUICK-REFERENCE.md](QUICK-REFERENCE.md) for the full skill catalog, and [TROUBLESHOOTING.md](TROUBLESHOOTING.md) if you hit issues.
|
|
30
27
|
|
|
@@ -4,9 +4,9 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "memstack-skill-loader"
|
|
7
|
-
version = "3.5.
|
|
7
|
+
version = "3.5.3"
|
|
8
8
|
description = "MCP server that vector-indexes MemStack Pro skills for on-demand loading"
|
|
9
|
-
requires-python = ">=3.
|
|
9
|
+
requires-python = ">=3.10"
|
|
10
10
|
dependencies = [
|
|
11
11
|
"mcp>=1.0.0",
|
|
12
12
|
"lancedb>=0.6.0",
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/config.py
RENAMED
|
@@ -60,14 +60,62 @@ class Config:
|
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def _auto_discover_skills() -> SkillSource | None:
|
|
64
|
+
"""Scan common locations for MemStack skills when no config.json exists (PyPI installs)."""
|
|
65
|
+
env_dir = os.environ.get("MEMSTACK_SKILLS_DIR")
|
|
66
|
+
if env_dir:
|
|
67
|
+
p = Path(env_dir).expanduser()
|
|
68
|
+
if p.exists():
|
|
69
|
+
skill_files = list(p.glob("**/SKILL.md"))
|
|
70
|
+
if skill_files:
|
|
71
|
+
print(f"Using MEMSTACK_SKILLS_DIR: {p} ({len(skill_files)} skills found)", file=sys.stderr)
|
|
72
|
+
return SkillSource(type="local", path=str(p), pattern="**/SKILL.md", label="MemStack")
|
|
73
|
+
|
|
74
|
+
home = Path.home()
|
|
75
|
+
candidates = [
|
|
76
|
+
home / ".claude" / "plugins" / "cache" / "cwinvestments-memstack" / "memstack",
|
|
77
|
+
home / ".claude" / "plugins" / "marketplaces" / "cwinvestments-memstack" / "skills",
|
|
78
|
+
home / "memstack" / "skills",
|
|
79
|
+
Path.cwd().parent / "memstack" / "skills",
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
for candidate in candidates:
|
|
83
|
+
if candidate.name == "memstack":
|
|
84
|
+
version_dirs = sorted(candidate.glob("*/skills"), reverse=True)
|
|
85
|
+
for vdir in version_dirs:
|
|
86
|
+
skill_files = list(vdir.glob("**/SKILL.md"))
|
|
87
|
+
if skill_files:
|
|
88
|
+
print(f"Auto-detected skills at: {vdir} ({len(skill_files)} skills found)", file=sys.stderr)
|
|
89
|
+
return SkillSource(type="local", path=str(vdir), pattern="**/SKILL.md", label="MemStack")
|
|
90
|
+
else:
|
|
91
|
+
if candidate.exists():
|
|
92
|
+
skill_files = list(candidate.glob("**/SKILL.md"))
|
|
93
|
+
if skill_files:
|
|
94
|
+
print(f"Auto-detected skills at: {candidate} ({len(skill_files)} skills found)", file=sys.stderr)
|
|
95
|
+
return SkillSource(type="local", path=str(candidate), pattern="**/SKILL.md", label="MemStack")
|
|
96
|
+
|
|
97
|
+
print(
|
|
98
|
+
"No skills found. Install the MemStack plugin first: "
|
|
99
|
+
"/plugin marketplace add cwinvestments/memstack",
|
|
100
|
+
file=sys.stderr,
|
|
101
|
+
)
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
63
105
|
def load_config(config_path: Path | None = None) -> Config:
|
|
64
|
-
"""Load config from JSON file. Falls back to
|
|
106
|
+
"""Load config from JSON file. Falls back to auto-discovery if not found."""
|
|
65
107
|
if config_path is None:
|
|
66
108
|
config_path = Path(__file__).resolve().parent.parent.parent / "config.json"
|
|
67
109
|
|
|
68
110
|
if not config_path.exists():
|
|
69
|
-
|
|
70
|
-
|
|
111
|
+
source = _auto_discover_skills()
|
|
112
|
+
config = Config(
|
|
113
|
+
skill_sources=[source] if source else [],
|
|
114
|
+
auto_reindex_on_start=True,
|
|
115
|
+
)
|
|
116
|
+
if os.environ.get("MEMSTACK_PRO_LICENSE_KEY"):
|
|
117
|
+
config = config.with_pro_skills()
|
|
118
|
+
return config
|
|
71
119
|
|
|
72
120
|
try:
|
|
73
121
|
with open(config_path, encoding="utf-8") as f:
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/server.py
RENAMED
|
@@ -874,6 +874,15 @@ async def run():
|
|
|
874
874
|
from .stats import backfill_categories
|
|
875
875
|
backfill_categories(_CATEGORY_MAP)
|
|
876
876
|
|
|
877
|
+
# Auto-build index on first run (PyPI installs have no pre-built index).
|
|
878
|
+
if config.auto_reindex_on_start:
|
|
879
|
+
from .tfidf_search import _get_index as _peek_index
|
|
880
|
+
if _peek_index(config) is None:
|
|
881
|
+
from .indexer import build_index
|
|
882
|
+
print("[memstack] Building skill index for first time...", file=sys.stderr)
|
|
883
|
+
count = build_index(config)
|
|
884
|
+
print(f"[memstack] Indexed {count} skills.", file=sys.stderr)
|
|
885
|
+
|
|
877
886
|
# Pre-load TF-IDF index before stdio_server starts its stdin reader thread.
|
|
878
887
|
# On Windows, a blocking readline() in the stdin thread causes GIL contention
|
|
879
888
|
# that slows down CPU-intensive operations (like sklearn import) by ~20x.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memstack-skill-loader
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.3
|
|
4
4
|
Summary: MCP server that vector-indexes MemStack Pro skills for on-demand loading
|
|
5
|
-
Requires-Python: >=3.
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: mcp>=1.0.0
|
|
7
7
|
Requires-Dist: lancedb>=0.6.0
|
|
8
8
|
Requires-Dist: sentence-transformers>=2.2.0
|
|
File without changes
|
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/__init__.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/__main__.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/compression.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/dashboard.html
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/dashboard.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/indexer.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/license.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/search.py
RENAMED
|
File without changes
|
{memstack_skill_loader-3.5.1 → memstack_skill_loader-3.5.3}/src/memstack_skill_loader/stats.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|