{ "name": "jev-skill-suggestion", "version": "0.1.0", "description": "Keeps the skill listing out of the context window and lets TypeSafe's Jev, a System One decision model, pick at most one skill per prompt from the skills' descriptions, the way TypeSafe's skill-suggestion cookbook does: one request ranks every skill and asks whether the prompt needs a skill at all, a second re-reads the top three with their SKILL.md and can reject them all. The winner's SKILL.md is attached to the prompt, so the skills can be hidden from the model altogether (/jev-skill-suggestion:setup makes them user-invocable-only and /context counts them at 0). Falls back to the engine's built-in classifier when no key is set.", "author": { "name": "claude-code-templates", "url": "https://www.aitmpl.com" }, "repository": "https://github.com/davila7/claude-code-templates", "license": "MIT", "keywords": [ "mod", "function-hooks", "productivity", "skills", "context" ], "userConfig": { "typesafeApiKey": { "type": "string", "title": "TypeSafe API key", "description": "Key for TypeSafe's own API; preferred over the Gateway, since only it reports a calibrated confidence", "default": "", "sensitive": true }, "gatewayApiKey": { "type": "string", "title": "Vercel AI Gateway API key", "description": "Key for the AI Gateway; with none set the engine's built-in classifier is used instead", "default": "", "sensitive": true }, "provider": { "type": "string", "title": "Backend", "description": "Which backend to use; \"auto\" picks TypeSafe when its key is set, then the Gateway, then the built-in classifier", "default": "auto", "options": [ "auto", "typesafe", "gateway", "builtin" ] }, "typesafeBaseUrl": { "type": "string", "title": "TypeSafe base URL", "description": "Base URL of TypeSafe's own API; empty uses https://api.typesafe.ai", "default": "" }, "typesafeModel": { "type": "string", "title": "TypeSafe model", "description": "Decision model on TypeSafe's own API; empty uses jev-latest", "default": "" }, "gatewayBaseUrl": { "type": "string", "title": "AI Gateway base URL", "description": "Base URL of the AI Gateway; empty uses https://ai-gateway.vercel.sh/v4/ai", "default": "" }, "gatewayModel": { "type": "string", "title": "AI Gateway model", "description": "Decision model on the AI Gateway; empty uses typesafe-ai/jev", "default": "" }, "inject": { "type": "string", "title": "How the chosen skill reaches the model", "description": "\"content\" attaches the skill's SKILL.md to the prompt, so it loads even when the engine lists it as user-invocable-only or off; \"suggest\" only names it and the model loads it with the Skill tool", "default": "content", "options": [ "content", "suggest" ] }, "hideListing": { "type": "boolean", "title": "Hide the skill listing", "description": "Leave the engine's skill listing out of the main conversation's context; off keeps the listing and only adds the suggestion", "default": true }, "rerank": { "type": "boolean", "title": "Re-read the shortlist", "description": "Send a second request that re-reads the top skills with their full description and SKILL.md opening, and can reject them all; off suggests the top of the ranking alone", "default": true }, "shortlist": { "type": "number", "title": "Shortlist size", "description": "How many of the ranking the second request re-reads", "default": 3 }, "gateThreshold": { "type": "number", "title": "Needs-a-skill threshold", "description": "Mean of the three request nouls (acts on the user's system, would follow a documented procedure, prose does not suffice) under which nothing is suggested", "default": 0.3 }, "fitsThreshold": { "type": "number", "title": "Fits threshold", "description": "A shortlist whose best per-skill \"does this fit\" noul is under this is dropped entirely", "default": 0.3 }, "excerptChars": { "type": "number", "title": "SKILL.md excerpt", "description": "How many characters of each shortlisted skill's body the second request reads", "default": 700 }, "alwaysListed": { "type": "string", "title": "Always listed", "description": "Comma-separated skill names that stay in the listing whatever the prompt (the model can still see and call them)", "default": "" }, "neverSuggested": { "type": "string", "title": "Never suggested", "description": "Comma-separated skill names the decision model is never offered; they stay reachable by typing /name", "default": "" }, "timeoutMs": { "type": "number", "title": "Latency budget (ms)", "description": "How long to wait for a decision before letting the prompt through without a suggestion", "default": 800 }, "logDecisions": { "type": "boolean", "title": "Log decisions", "description": "Write each selection to the session log", "default": true } } }