Jev Skill Choice
Your SKILL.md folder, wired into a ComfyUI prompt
- text
- skills
- details
- response_json
What it is
Somewhere on your disk you probably have a folder of SKILL.md files - the format Claude Code and the shared agent convention use: one folder per skill, a markdown file with name and description in YAML front matter and the actual instructions in the body. Camera notes, brand voice rules, a lighting recipe, whatever you keep having to re-explain.
Jev Skill Choice turns that folder into a node input. You give it the work you're about to do, it picks the skills that actually apply, and it hands back their complete contents with a priority for each - as one STRING you can wire into a system prompt. So instead of maintaining a master mega-prompt that's 4,000 tokens of mostly-irrelevant rules, you keep twenty small files and get the relevant two.
Where it looks
The directory dropdown populates itself from four locations: ~/.agents/skills, <ComfyUI>/.agents/skills, ~/.claude/skills (or $CLAUDE_CONFIG_DIR/skills if you set it), and <ComfyUI>/.claude/skills. It walks them recursively, follows symlinks, and loads a linked skill once rather than twice.
Pick automatic to search all of them, pick one of the discovered paths, or pick custom and type a path - relative paths resolve against your ComfyUI directory and ~ works. Each SKILL.md gets its front matter parsed with PyYAML; without name and description it falls back to the directory name and the file contents. Only the SKILL.md files are read. Referenced scripts and assets in the same folder are not loaded, and not executed.
How the selection works
It's a two-pass filter, and the shape of it is the interesting part. First Jev scores how much this request even needs specialized guidance at all - a bare "make me a cat picture" gets filtered out and you get empty output, reported with a skill_not_needed reason rather than a skill force-fed to you. Assuming guidance is warranted, it ranks every skill by its description alone (cheap), takes the top shortlist_size (5 by default), and only then sends those full file contents for verification. Skills that don't clear threshold (0.5) get dropped.
max_selections (3) caps the result. strength_mode decides the priorities you get back: automatic scores each selected skill's role from 0 to 2 and drops zeroes, uniform gives every selected skill a flat 1. These are guidance weights handed to a language model - they don't touch any model weights, and automatic output is a judgment, not a measurement.
Inputs and outputs
Fill in prompt with the work itself and leave instructions alone unless your folder needs a stricter bar than "does this directly help, and are its prerequisites met". model and provider work exactly as in Jev Interpret and default to TypeSafe's jev-latest.
Four outputs. text is the one you'll wire - selected skills as markdown headings, each with its full body and a line like Application priority: 2 on a 0–2 scale - and the documented pattern is into OpenRouter Text's system input, with the generation request going separately to that node's prompt. skills is a DICT of records (name, path, description, content, strength). details and response_json are for inspection, including ranking and gate scores. If nothing is suitable, text is empty and skills is {"skills": []} - an empty result, not an error.
Installing it
Same pack, same install. Search ComfyUI-Jev in ComfyUI Manager and restart, or:
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/hndrr/ComfyUI-Jev.git
ComfyUI 0.36.0+ and Python 3.10+. PyYAML is doing real work here - it parses your front matter - so if it's somehow missing from your ComfyUI environment:
python -m pip install "aiohttp>=3.11.8" PyYAML
Key setup is the same as the rest of the pack:
export TYPESAFE_API_KEY="your-typesafe-key"
Common issues
- Errors naming a file. It's strict on purpose: an empty
SKILL.md, an unclosed---block, malformed YAML, front matter that isn't a mapping, or a blankname/descriptionall raise with the path in the message. Fix the file. - Empty output every time. Either nothing was discovered (check the four roots), or the gate decided the request doesn't need specialized guidance.
detailssays which -skill_not_neededorempty_catalog. - You edited a skill and got the old selection. Edits normally do propagate, since the node fingerprints the whole skill set. With identical contents,
refreshis the lever. - Your skills are being uploaded. Every discovered skill's description, plus the full text of the shortlisted ones, goes to the selected API with your prompt. Anything in a skill file you wouldn't paste into a third-party service goes with it.
- No track record. This pack is a work in progress with essentially no community discussion behind it, so the README and
docs/nodes.mdare the documentation.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Write a detailed image prompt for a warm, approachable perfume advertisement. | — |
| directory | COMBO | Select a discovered skill directory, automatic to use all discovered directories, or custom to enter a path. Discovers shared agent and Claude skills. | |
| instructions | STRING | Select skills that directly help with the requested work. Check each skill's purpose and prerequisites. | — |
| model | COMBO | 4 options: [object Object], [object Object], [object Object], [object Object] | |
| provider | COMBO | typesafe | 2 options: typesafe, openrouter |
| api_key | STRING | Empty uses the provider's environment variable. Entered keys are saved in workflows; remove before sharing. | |
| refresh | INT | 0 | Keep fixed to reuse results. Change to request a new judgment. |
| max_selections | INT | 3 | Maximum number of skills to return. May return none. |
| strength_mode | COMBO | automatic | Automatic scores each selected skill's role from 0 to 2. Uniform assigns 1 to every selected skill. These are guidance priorities. |
| shortlist_sizeopt | INT | 5 | — |
| thresholdopt | FLOAT | 0.500–1 | Minimum fit required for each selected skill. |
| gate_thresholdopt | FLOAT | 0.300–1 | Minimum need for specialized guidance before evaluating full skill contents. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| skills | DICT | — |
| details | DICT | — |
| response_json | STRING | — |