jev-skillful
Per-prompt capability router for coding agents that picks at most one installed skill, MCP server, subagent or command via Jev, or none.
Overview
Skillful watches prompts in Claude Code, Codex, Pi and OMP and decides whether any capability already installed on the machine (a skill, MCP server, subagent or slash command) is relevant. It injects at most one primary suggestion plus two runners-up, and abstaining is a first-class outcome handled by a `none` option in the same Choice question.
It is aimed at developers with large local capability catalogs; the author's machine has around 230 skills across two runtimes. A local catalog scan builds a BM25 shortlist of about 15 with per-kind quotas, then one TypeSafe request asks a Choice over the shortlist plus none and per-candidate Nouls to rank runners-up. Results are cached by prompt hash and catalog fingerprint, routing has a 2-second budget, and errors never fail the prompt. The README is unusually candid: its own eval shows recall and top-1 targets are not met, and it attributes the gap to the BM25 shortlist rather than the decision model.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Choice | Which shortlisted capability, or none, is relevant to this prompt? | — |
| Yes / no | Is this candidate capability relevant (used to rank runners-up)? | — |
How it works
- Hook intercepts the prompt; cache hit injects in under 250 ms
- Local catalog scan and BM25 with per-kind quotas build a shortlist of about 15
- One TypeSafe request: Choice over shortlist plus none, and per-candidate Nouls
- Inject at most one primary and two runners-up, or nothing; on error or timeout inject a one-line reminder
Strengths
- Never blocks the prompt; strict 2,000 ms routing budget
- Abstention via a none option avoids a separate classifier
- Measured eval harness; README reports p95 route latency of 406 ms and noneF1 0.813
- No server or account; you bring your own TypeSafe key
Caveats
- README reports holdout recall@K of 0.600 against a 0.90 target
- Shortlist quality from BM25 limits what the decision model can pick
- Requires a TypeSafe API key
Getting started
npx @mrgoonie/skillful install (set TYPESAFE_API_KEY).At a glance
- Type
- MCP server
- Status
- beta
- Language
- TypeScript
- Runtime
- Node / agent hooks
- Has code
- yes
- Has tests
- yes
Use cases and integrations
How curated lists describe it
Per-prompt capability router for coding agents: resolves installed skills, MCP servers, agents and commands against your prompt via TypeSafe Jev, and measures whether the injection actually helps.
hellogumbo/awesome-jev
Frequently asked questions
What can Skillful suggest?
Installed skills, MCP servers, subagents and slash commands, at most one primary plus two alternatives per prompt.
What happens when no capability is needed?
The Choice includes a none option, and nothing is injected.
Does it meet its quality targets?
Not yet. The README reports recall and top-1 below target and says the bottleneck is the BM25 shortlist.
Related projects
Hooks for Claude Code, Codex and pi that use Jev to suggest a skill each turn, plus a rule gate for subagent model routing.
HookbetaJavaScriptMIT plugin and local MCP server that hands an agent's closed questions to Jev or local Laya, with policy gates and receipts.
Agent skillproductionPythonClaude Code and Codex skill that routes a task to one of 27 specialist roles, with an optional Jev engine for catalog selection.
ProjectbetaPythonOrchestrator that probes which coding agents are installed and logged in, then has Jev pick the best one for a task.
Agent skillbetaPythonAgent toolkit for Claude Code and Codex whose optional /d router uses Jev to pick agents, skills and workflows and gate dispatch on intent.
ProjectbetaPythonChooses the model tier, skills and MCP servers for each coding-agent session with two Jev requests, then launches Claude Code or Codex.
MCP serverbetaPython