skilljit 0.1.0
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.
- package/README.md +186 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +103 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/proxy.d.ts +12 -0
- package/dist/commands/proxy.js +54 -0
- package/dist/commands/proxy.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.js +21 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/sync.d.ts +28 -0
- package/dist/commands/sync.js +34 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# skilljit
|
|
2
|
+
|
|
3
|
+
Just-in-time skill and MCP tool routing for Claude — install thousands of skills at
|
|
4
|
+
the token cost of one. Nothing loads into context until a task actually needs it.
|
|
5
|
+
|
|
6
|
+
## Why the tool list never changes
|
|
7
|
+
|
|
8
|
+
The obvious way to add tools on demand is the MCP `notifications/tools/list_changed`
|
|
9
|
+
notification. It's broken in Claude Desktop —
|
|
10
|
+
[anthropics/claude-code#50339](https://github.com/anthropics/claude-code/issues/50339)
|
|
11
|
+
documents it being ignored across 336+ versions (empty client capabilities, an SDK
|
|
12
|
+
handler that never fires, a frozen tool-list reference) and Anthropic closed the issue
|
|
13
|
+
as **not planned**. The issue's own recommended workaround is to *"declare all tools
|
|
14
|
+
at startup and dispatch internally via mode/action parameters."*
|
|
15
|
+
|
|
16
|
+
That's what skilljit does. Its MCP tool list is **fixed and never changes** — five
|
|
17
|
+
tools, always. Skills and upstream MCP tools are found and loaded through those five
|
|
18
|
+
tools, not by re-registering the tool list. This is why skilljit works on Claude
|
|
19
|
+
Desktop, Claude Code, Codex, and Cursor while `list_changed`-based proxies silently
|
|
20
|
+
degrade on at least one of them.
|
|
21
|
+
|
|
22
|
+
## The problem
|
|
23
|
+
|
|
24
|
+
Claude's Agent Skills use progressive disclosure: each skill's `name` + `description`
|
|
25
|
+
(~100 tokens) sits in the system prompt on every turn, and only the body loads on
|
|
26
|
+
demand. That works at 10 skills. It collapses at scale — the ecosystem is already
|
|
27
|
+
there, with tens of thousands of skills across thousands of repos. Installing 200 of
|
|
28
|
+
them costs tens of thousands of tokens *per turn*, forever. So nobody does — everyone
|
|
29
|
+
installs ten and the rest are unreachable.
|
|
30
|
+
|
|
31
|
+
MCP has the identical problem, worse: every connected server's full tool schemas load
|
|
32
|
+
at startup, commonly 20–50k tokens before the user types anything.
|
|
33
|
+
|
|
34
|
+
| | Without skilljit | With skilljit |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Skills reachable | ~10 | tens of thousands |
|
|
37
|
+
| Per-turn skill overhead | 1k–20k tokens, grows forever | ~flat |
|
|
38
|
+
| Per-turn MCP tool overhead | 20k–50k tokens | ~flat |
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npx -y skilljit sync
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
That's the primary path — the MCP ecosystem is npx-first, and Claude Code / Desktop
|
|
47
|
+
configs already expect this shape.
|
|
48
|
+
|
|
49
|
+
A thin Python companion is also published for
|
|
50
|
+
[`claude-agent-sdk`](https://pypi.org/project/skilljit/) users who want to query the
|
|
51
|
+
same catalog directly instead of going through MCP:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install skilljit
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
See [`python/README.md`](https://github.com/aqibsidd/skilljit/blob/main/python/README.md)
|
|
58
|
+
for what that package does and doesn't do — it forwards the CLI to `npx -y skilljit`
|
|
59
|
+
and adds a read-only `Catalog` for Python.
|
|
60
|
+
|
|
61
|
+
## Quickstart
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 1. Build the local catalog from GitHub sources (SQLite, ~/.skilljit/catalog.db)
|
|
65
|
+
skilljit sync
|
|
66
|
+
|
|
67
|
+
# 2. Search it — no network call, no context cost
|
|
68
|
+
skilljit search "postgres migration"
|
|
69
|
+
|
|
70
|
+
# 3. Point your MCP client at the server
|
|
71
|
+
skilljit serve
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Add to your MCP client config (e.g. `claude_desktop_config.json`):
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"skilljit": {
|
|
80
|
+
"command": "npx",
|
|
81
|
+
"args": ["-y", "skilljit", "serve"]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Other commands: `skilljit stats` (catalog size + how to read live savings),
|
|
88
|
+
`skilljit init <configPath>` (preview routing your existing MCP servers through
|
|
89
|
+
skilljit — never mutates the original), `skilljit adopt <configPath>` (apply it),
|
|
90
|
+
`skilljit doctor [configPath]` (verify upstreams still work), `skilljit restore
|
|
91
|
+
<configPath>` (undo `adopt`).
|
|
92
|
+
|
|
93
|
+
## The five tools
|
|
94
|
+
|
|
95
|
+
skilljit exposes a fixed surface — it never grows or shrinks at runtime.
|
|
96
|
+
|
|
97
|
+
| Tool | Returns |
|
|
98
|
+
|---|---|
|
|
99
|
+
| `skill_find(query, limit=8)` | Cheap candidates: id, source, one-line description, install count, audit status. |
|
|
100
|
+
| `skill_load(name)` | Full SKILL.md body for one skill by id. The only point a skill's full content enters context. |
|
|
101
|
+
| `tool_find(query, limit=8)` | Matching upstream MCP tools' full JSON Schema, across every connected server. |
|
|
102
|
+
| `tool_call(server, tool, args)` | Generic dispatcher to the matched upstream server and tool. |
|
|
103
|
+
| `skilljit_stats()` | Tokens saved this session vs. loading every cataloged skill (and configured tool) the traditional way. |
|
|
104
|
+
|
|
105
|
+
`skill_find` → `skill_load` is progressive disclosure rebuilt as a **pull**: the
|
|
106
|
+
always-loaded cost stops scaling with catalog size.
|
|
107
|
+
|
|
108
|
+
`tool_find` and `tool_call` only appear once you've configured upstream MCP servers
|
|
109
|
+
via `skilljit adopt` (see below) — run skills-only and the surface is 3 tools, not 5.
|
|
110
|
+
This is what makes the skills half independently shippable and testable from the
|
|
111
|
+
proxy half.
|
|
112
|
+
|
|
113
|
+
## MCP proxy — routing your other MCP servers
|
|
114
|
+
|
|
115
|
+
Passing `skilljit serve --config <path>` (the config path you previously ran
|
|
116
|
+
`skilljit adopt` on) turns on `tool_find`/`tool_call` for the servers it adopted.
|
|
117
|
+
Safety comes first here, since this touches configs you already rely on:
|
|
118
|
+
|
|
119
|
+
- **`skilljit init <configPath>`** never mutates the original file — it writes a
|
|
120
|
+
proposed config and prints a diff.
|
|
121
|
+
- **`skilljit adopt <configPath>`** is a dry run by default; pass `--yes` to actually
|
|
122
|
+
write the change, after backing up the original.
|
|
123
|
+
- **`--keep server1,server2`** leaves those servers untouched — fully visible in the
|
|
124
|
+
static tool list, no `tool_find` round-trip. Useful for hot-path tools you call on
|
|
125
|
+
every turn. (Keep is per-server, not per-tool, in this version.)
|
|
126
|
+
- **`skilljit doctor [configPath]`** verifies every adopted upstream still spawns,
|
|
127
|
+
handshakes, and lists tools.
|
|
128
|
+
- **`skilljit restore <configPath>`** is one command that puts the original config
|
|
129
|
+
back.
|
|
130
|
+
- One upstream MCP server being unavailable doesn't affect the others: `tool_call`
|
|
131
|
+
returns a clean error for that server, everything else keeps working.
|
|
132
|
+
|
|
133
|
+
## Security
|
|
134
|
+
|
|
135
|
+
Skills are, functionally, instructions from a stranger that an agent will follow —
|
|
136
|
+
Anthropic warns explicitly that a malicious skill can exfiltrate data or misuse tools.
|
|
137
|
+
skilljit treats that as a feature to design for, not an afterthought:
|
|
138
|
+
|
|
139
|
+
- Every `skill_find` result surfaces the skill's audit status alongside its
|
|
140
|
+
description.
|
|
141
|
+
- `skill_load` warns loudly in the returned content when a skill failed its audit, or
|
|
142
|
+
hasn't been audited at all — the same posture as installing software from an
|
|
143
|
+
unknown source.
|
|
144
|
+
|
|
145
|
+
## Benchmark
|
|
146
|
+
|
|
147
|
+
The repo ships a labeled set of 41 `(task → correct skill)` pairs and a recall@k
|
|
148
|
+
harness, so "the search works" is a measured claim rather than a vibe. Current
|
|
149
|
+
numbers, reproducible with
|
|
150
|
+
[`node bench/run.mjs`](https://github.com/aqibsidd/skilljit/blob/main/bench/run.mjs):
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
skilljit bench — 41 queries over 41 skills
|
|
154
|
+
|
|
155
|
+
recall@1: 37/41 (90.2%)
|
|
156
|
+
recall@3: 38/41 (92.7%)
|
|
157
|
+
recall@8: 41/41 (100.0%)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Search is SQLite FTS5 + BM25 — no embeddings in v1. That's a deliberate YAGNI call:
|
|
161
|
+
FTS5 ships identically in both the Node (`better-sqlite3`) and Python (stdlib)
|
|
162
|
+
implementations, with no model download or extra runtime deps. The residual recall
|
|
163
|
+
risk (skill descriptions are semantic — "use when the user mentions PDFs…") is
|
|
164
|
+
mitigated structurally: `skill_find` returns several candidates for Claude to
|
|
165
|
+
consider and re-query on, rather than committing to a one-shot top-1 result.
|
|
166
|
+
Embeddings stay an opt-in option, to be added only if this benchmark shows FTS5
|
|
167
|
+
recall is genuinely inadequate.
|
|
168
|
+
|
|
169
|
+
## Architecture
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
skilljit/
|
|
173
|
+
packages/core/ catalog store, FTS5 index, ranking, token accounting
|
|
174
|
+
packages/proxy/ upstream MCP server management, config adopt/restore, tool_find/tool_call routing
|
|
175
|
+
packages/mcp/ the MCP stdio server (the five fixed tools)
|
|
176
|
+
packages/cli/ skilljit sync | search | serve | stats | init | adopt | restore | doctor (this package)
|
|
177
|
+
python/ pip package — CLI shim + read-only query API for Agent SDK users
|
|
178
|
+
bench/ labeled task→skill eval set + recall@k harness
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
See the [main repo](https://github.com/aqibsidd/skilljit) for the full source,
|
|
182
|
+
issue tracker, and publishing setup.
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
MIT
|
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { Catalog, defaultCatalogPath } from "@skilljit/core";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { createServer } from "@skilljit/mcp";
|
|
6
|
+
import { latestAdoption, resolveManagedUpstreams } from "@skilljit/proxy";
|
|
7
|
+
import { runSync } from "./commands/sync.js";
|
|
8
|
+
import { runSearch, formatSearchResults } from "./commands/search.js";
|
|
9
|
+
import { defaultStateDir, cmdInit, cmdAdopt, cmdRestore, cmdDoctor } from "./commands/proxy.js";
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name("skilljit")
|
|
13
|
+
.description("Just-in-time skill and MCP tool routing for Claude. " +
|
|
14
|
+
"Install thousands of skills at the token cost of one — nothing loads " +
|
|
15
|
+
"into context until a task actually needs it.")
|
|
16
|
+
.version("0.1.0");
|
|
17
|
+
program
|
|
18
|
+
.command("sync")
|
|
19
|
+
.description("Refresh the local skill catalog from configured GitHub sources")
|
|
20
|
+
.option("--db <path>", "catalog db path", defaultCatalogPath())
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
const result = await runSync({ dbPath: options.db, log: (l) => console.log(l) });
|
|
23
|
+
console.log(`\nDone. ${result.total} skill(s) in catalog.`);
|
|
24
|
+
if (result.failedSources.length > 0) {
|
|
25
|
+
console.log(`${result.failedSources.length} source(s) failed to sync (see above).`);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
program
|
|
29
|
+
.command("search <query>")
|
|
30
|
+
.description("Search the local skill catalog (no network, no context cost)")
|
|
31
|
+
.option("--db <path>", "catalog db path", defaultCatalogPath())
|
|
32
|
+
.option("-n, --limit <n>", "max results", "8")
|
|
33
|
+
.action((query, options) => {
|
|
34
|
+
const hits = runSearch({ dbPath: options.db, query, limit: Number(options.limit) });
|
|
35
|
+
console.log(formatSearchResults(hits));
|
|
36
|
+
});
|
|
37
|
+
program
|
|
38
|
+
.command("serve")
|
|
39
|
+
.description("Run the skilljit MCP stdio server (this is what your MCP client config should launch)")
|
|
40
|
+
.option("--db <path>", "catalog db path", defaultCatalogPath())
|
|
41
|
+
.option("--config <path>", "MCP client config previously passed to `skilljit adopt`, to enable tool_find/tool_call")
|
|
42
|
+
.action(async (options) => {
|
|
43
|
+
let upstreams;
|
|
44
|
+
if (options.config) {
|
|
45
|
+
const record = latestAdoption(defaultStateDir(), options.config);
|
|
46
|
+
if (record)
|
|
47
|
+
upstreams = resolveManagedUpstreams(record);
|
|
48
|
+
}
|
|
49
|
+
const { server } = createServer({ catalogPath: options.db, upstreams });
|
|
50
|
+
await server.connect(new StdioServerTransport());
|
|
51
|
+
});
|
|
52
|
+
program
|
|
53
|
+
.command("stats")
|
|
54
|
+
.description("Print current catalog size (token savings accrue per-session inside a running MCP connection)")
|
|
55
|
+
.option("--db <path>", "catalog db path", defaultCatalogPath())
|
|
56
|
+
.action((options) => {
|
|
57
|
+
const catalog = new Catalog(options.db);
|
|
58
|
+
console.log(`${catalog.count()} skill(s) in local catalog (${options.db}).`);
|
|
59
|
+
console.log("Run `skilljit serve` and call the skilljit_stats tool from your MCP client for live savings.");
|
|
60
|
+
catalog.close();
|
|
61
|
+
});
|
|
62
|
+
function parseKeepList(value) {
|
|
63
|
+
return value
|
|
64
|
+
.split(",")
|
|
65
|
+
.map((s) => s.trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
}
|
|
68
|
+
program
|
|
69
|
+
.command("init <configPath>")
|
|
70
|
+
.description("Preview adopting an MCP client config (e.g. claude_desktop_config.json) into skilljit — never touches the original file")
|
|
71
|
+
.option("--keep <names>", "comma-separated server names to leave untouched (fully visible, no routing)", parseKeepList, [])
|
|
72
|
+
.action(async (configPath, options) => {
|
|
73
|
+
await cmdInit({ configPath, keep: options.keep }, (l) => console.log(l));
|
|
74
|
+
});
|
|
75
|
+
program
|
|
76
|
+
.command("adopt <configPath>")
|
|
77
|
+
.description("Route servers in an MCP client config through skilljit (backs up the original first)")
|
|
78
|
+
.option("--keep <names>", "comma-separated server names to leave untouched", parseKeepList, [])
|
|
79
|
+
.option("--yes", "actually write the change (otherwise this is a dry run)")
|
|
80
|
+
.action(async (configPath, options) => {
|
|
81
|
+
await cmdAdopt({ configPath, keep: options.keep, yes: options.yes }, (l) => console.log(l));
|
|
82
|
+
});
|
|
83
|
+
program
|
|
84
|
+
.command("restore <configPath>")
|
|
85
|
+
.description("Undo `skilljit adopt` — restores the config from its backup")
|
|
86
|
+
.action(async (configPath) => {
|
|
87
|
+
await cmdRestore(configPath, undefined, (l) => console.log(l));
|
|
88
|
+
});
|
|
89
|
+
program
|
|
90
|
+
.command("doctor [configPath]")
|
|
91
|
+
.description("Check that every upstream MCP server skilljit is routing for a config still spawns and lists tools")
|
|
92
|
+
.action(async (configPath) => {
|
|
93
|
+
if (!configPath) {
|
|
94
|
+
console.log("Usage: skilljit doctor <configPath> (the config previously passed to `skilljit adopt`)");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
await cmdDoctor(configPath, undefined, (l) => console.log(l));
|
|
98
|
+
});
|
|
99
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
100
|
+
console.error(err instanceof Error ? err.message : err);
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function defaultStateDir(): string;
|
|
2
|
+
export interface ProxyCliOptions {
|
|
3
|
+
configPath: string;
|
|
4
|
+
keep: string[];
|
|
5
|
+
stateDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function cmdInit(opts: ProxyCliOptions, log: (s: string) => void): Promise<void>;
|
|
8
|
+
export declare function cmdAdopt(opts: ProxyCliOptions & {
|
|
9
|
+
yes?: boolean;
|
|
10
|
+
}, log: (s: string) => void): Promise<void>;
|
|
11
|
+
export declare function cmdRestore(configPath: string, stateDir: string | undefined, log: (s: string) => void): Promise<void>;
|
|
12
|
+
export declare function cmdDoctor(configPath: string, stateDir: string | undefined, log: (s: string) => void): Promise<void>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { runInit, runAdopt, runRestore, runDoctor, resolveManagedUpstreams, latestAdoption, } from "@skilljit/proxy";
|
|
4
|
+
export function defaultStateDir() {
|
|
5
|
+
return process.env.SKILLJIT_HOME ?? path.join(os.homedir(), ".skilljit");
|
|
6
|
+
}
|
|
7
|
+
export async function cmdInit(opts, log) {
|
|
8
|
+
const result = await runInit({
|
|
9
|
+
configPath: opts.configPath,
|
|
10
|
+
stateDir: opts.stateDir ?? defaultStateDir(),
|
|
11
|
+
passthroughServerNames: opts.keep,
|
|
12
|
+
});
|
|
13
|
+
log(`Proposed config written to ${result.proposedPath} (original untouched).\n`);
|
|
14
|
+
log("Changes:");
|
|
15
|
+
log(result.diff);
|
|
16
|
+
log(`\n${result.routedServerNames.length} server(s) would be routed through skilljit: ${result.routedServerNames.join(", ") || "(none)"}`);
|
|
17
|
+
log(`\nReview it, then run: skilljit adopt ${opts.configPath} --yes` + (opts.keep.length ? ` --keep ${opts.keep.join(",")}` : ""));
|
|
18
|
+
}
|
|
19
|
+
export async function cmdAdopt(opts, log) {
|
|
20
|
+
if (!opts.yes) {
|
|
21
|
+
log("This will rewrite your MCP config in place (a backup is kept for `skilljit restore`).");
|
|
22
|
+
log("Re-run with --yes to proceed, or `skilljit init` first to preview the diff.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const record = await runAdopt({
|
|
26
|
+
configPath: opts.configPath,
|
|
27
|
+
stateDir: opts.stateDir ?? defaultStateDir(),
|
|
28
|
+
passthroughServerNames: opts.keep,
|
|
29
|
+
});
|
|
30
|
+
log(`Adopted. Backup saved to ${record.backupPath}.`);
|
|
31
|
+
log(`Routed servers: ${record.routedServerNames.join(", ") || "(none)"}`);
|
|
32
|
+
log(`Restart your MCP client, then run \`skilljit restore ${opts.configPath}\` any time to undo this.`);
|
|
33
|
+
}
|
|
34
|
+
export async function cmdRestore(configPath, stateDir, log) {
|
|
35
|
+
await runRestore({ configPath, stateDir: stateDir ?? defaultStateDir() });
|
|
36
|
+
log(`Restored ${configPath} to its pre-adopt state.`);
|
|
37
|
+
}
|
|
38
|
+
export async function cmdDoctor(configPath, stateDir, log) {
|
|
39
|
+
const record = latestAdoption(stateDir ?? defaultStateDir(), configPath);
|
|
40
|
+
if (!record) {
|
|
41
|
+
log(`No skilljit adoption found for ${configPath}. Nothing to check — run \`skilljit init\` / \`adopt\` first.`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const specs = resolveManagedUpstreams(record);
|
|
45
|
+
if (specs.length === 0) {
|
|
46
|
+
log("No routed upstream servers to check.");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const report = await runDoctor(specs);
|
|
50
|
+
for (const [name, entry] of Object.entries(report)) {
|
|
51
|
+
log(entry.ok ? `✓ ${name} — ${entry.toolCount} tool(s)` : `✗ ${name} — ${entry.error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/commands/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SkillSearchHit } from "@skilljit/core";
|
|
2
|
+
export interface SearchOptions {
|
|
3
|
+
dbPath: string;
|
|
4
|
+
query: string;
|
|
5
|
+
limit?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function runSearch(opts: SearchOptions): SkillSearchHit[];
|
|
8
|
+
export declare function formatSearchResults(hits: SkillSearchHit[]): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Catalog } from "@skilljit/core";
|
|
2
|
+
export function runSearch(opts) {
|
|
3
|
+
const catalog = new Catalog(opts.dbPath);
|
|
4
|
+
try {
|
|
5
|
+
return catalog.searchSkills(opts.query, opts.limit ?? 8);
|
|
6
|
+
}
|
|
7
|
+
finally {
|
|
8
|
+
catalog.close();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function formatSearchResults(hits) {
|
|
12
|
+
if (hits.length === 0)
|
|
13
|
+
return "No matching skills found.";
|
|
14
|
+
return hits
|
|
15
|
+
.map((h, i) => {
|
|
16
|
+
const audit = h.skill.auditStatus && h.skill.auditStatus !== "unaudited" ? ` [audit: ${h.skill.auditStatus}]` : "";
|
|
17
|
+
return `${i + 1}. ${h.skill.name} (${h.skill.source})${audit}\n ${h.skill.description}`;
|
|
18
|
+
})
|
|
19
|
+
.join("\n");
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AASzC,MAAM,UAAU,SAAS,CAAC,IAAmB;IAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,2BAA2B,CAAC;IAC1D,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5F,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface SyncOptions {
|
|
2
|
+
dbPath: string;
|
|
3
|
+
sources?: {
|
|
4
|
+
owner: string;
|
|
5
|
+
repo: string;
|
|
6
|
+
}[];
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
log?: (line: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface SyncResult {
|
|
11
|
+
total: number;
|
|
12
|
+
perSource: {
|
|
13
|
+
owner: string;
|
|
14
|
+
repo: string;
|
|
15
|
+
count: number;
|
|
16
|
+
}[];
|
|
17
|
+
failedSources: {
|
|
18
|
+
owner: string;
|
|
19
|
+
repo: string;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Ingest every configured GitHub source into the local catalog db.
|
|
24
|
+
* One source failing (network error, rate limit, repo renamed) does not
|
|
25
|
+
* abort the rest — skilljit's catalog should degrade gracefully, not
|
|
26
|
+
* die because one upstream repo is briefly unavailable.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runSync(opts: SyncOptions): Promise<SyncResult>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Catalog, ingestGithubRepo, DEFAULT_GITHUB_SOURCES } from "@skilljit/core";
|
|
2
|
+
/**
|
|
3
|
+
* Ingest every configured GitHub source into the local catalog db.
|
|
4
|
+
* One source failing (network error, rate limit, repo renamed) does not
|
|
5
|
+
* abort the rest — skilljit's catalog should degrade gracefully, not
|
|
6
|
+
* die because one upstream repo is briefly unavailable.
|
|
7
|
+
*/
|
|
8
|
+
export async function runSync(opts) {
|
|
9
|
+
const log = opts.log ?? (() => { });
|
|
10
|
+
const sources = opts.sources ?? DEFAULT_GITHUB_SOURCES;
|
|
11
|
+
const catalog = new Catalog(opts.dbPath);
|
|
12
|
+
const perSource = [];
|
|
13
|
+
const failedSources = [];
|
|
14
|
+
try {
|
|
15
|
+
for (const { owner, repo } of sources) {
|
|
16
|
+
log(`syncing github:${owner}/${repo} ...`);
|
|
17
|
+
try {
|
|
18
|
+
const skills = await ingestGithubRepo(owner, repo, { fetchImpl: opts.fetchImpl });
|
|
19
|
+
catalog.upsertSkills(skills);
|
|
20
|
+
perSource.push({ owner, repo, count: skills.length });
|
|
21
|
+
log(` ${skills.length} skill(s) found`);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
failedSources.push({ owner, repo });
|
|
25
|
+
log(` failed: ${err.message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { total: catalog.count(), perSource, failedSources };
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
catalog.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAenF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAgC,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACtC,GAAG,CAAC,kBAAkB,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC7B,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACtD,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,GAAG,CAAC,aAAc,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skilljit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Just-in-time skill and MCP tool routing for Claude — install thousands of skills at the token cost of one.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "aqibsidd",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/aqibsidd/skilljit.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/aqibsidd/skilljit#readme",
|
|
13
|
+
"bugs": "https://github.com/aqibsidd/skilljit/issues",
|
|
14
|
+
"bin": {
|
|
15
|
+
"skilljit": "./dist/bin.js"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"claude",
|
|
24
|
+
"mcp",
|
|
25
|
+
"agent-skills",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"token-optimization"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/bin.js",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@skilljit/core": "^0.1.0",
|
|
36
|
+
"@skilljit/mcp": "^0.1.0",
|
|
37
|
+
"@skilljit/proxy": "^0.1.0",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
39
|
+
"commander": "^15.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.7.0",
|
|
43
|
+
"vitest": "^4.1.11"
|
|
44
|
+
}
|
|
45
|
+
}
|