Skills & rules
Two artifact nodes put skill or rules content on a wire. Rules are always inject-only. Skills support two run modes.
| Glyph | Node | Palette tab | Reads |
|---|---|---|---|
| ✦ | Skill | skills | <name>/SKILL.md |
| § | Rules | rules | CLAUDE.md, AGENTS.md, .cursorrules, .cursor/rules/*, .github/copilot-instructions.md |
Skill nodes accept an optional inbound text wire. Rules stay source-only (no input handle).
Skill modes: inject vs invoke
Section titled “Skill modes: inject vs invoke”Toggle ↦ / ▶ on the skill card (or set mode in graph JSON). In invoke mode, click the provider chip to cycle Claude / Cursor / opencode / Codex / Copilot / Antigravity / Grok.
| Mode | Glyph | What runs |
|---|---|---|
| inject (default) | ↦ | Read SKILL.md and put it on the text lane (same as before). |
| invoke | ▶ | Run the chosen provider with prompt /{name} plus any inbound text. |
Invoke uses Agent Skills slash convention. Claude and Cursor resolve skills natively from their skill homes. Other CLIs receive the same /{name} prompt (skill discovery varies by tool). Default provider is Claude.
Optional provider / model on the node JSON:
{ "type": "skill", "name": "pdf-fill", "mode": "invoke", "provider": "cursor" }Example workflow: Skill invoke + Judge (skill-invoke-judge). Invoke → ? Judge → pass / fail / unsure.
What lands on the wire (inject)
Section titled “What lands on the wire (inject)”The file content is wrapped with a provenance header so a merged text lane stays attributable:
# Skill: pdf-fill (.claude/skills)
<contents of SKILL.md>Rules files get # Rules: <name> (<source>). Content is capped at 512,000 characters. The run log records ✦ skill <name>: 4213 chars.
From there it is ordinary text: wire it into an agent alongside a prompt, or through a ⋈ Merge.
Inject-mode skills and rules are usually inputs to a run, not terminal results. Invoke may wire straight into an ⇤ Output or a Judge. The node’s output is the provider result text, not the markdown file.
How they resolve
Section titled “How they resolve”Each node stores a name plus an optional absolute path.
- Path first. If the node has a path and the scanner still knows that file, it is used verbatim (inject).
- Then by name. Candidates are filtered by kind and name, narrowed by
originand then bysourcewhen those are set, and the lowest precedence layer wins. - No match fails inject:
no skill named "x" found on this machine. Invoke only needs the skill name for the slash prompt (Claude / Cursor resolve it in-session. Other providers get the same/{name}prompt).
Exporting a portable graph clears the path, so a shared workflow re-resolves by name on the importing machine.
Only paths the scanner itself discovered are readable for inject. Arbitrary file paths are refused.
Origins & shadowing
Section titled “Origins & shadowing”Skills carry an origin bucket and a precedence layer. Lower layer wins a name collision.
| Layer | Origin | Where |
|---|---|---|
| 10 | project | .claude/skills, .agents/skills, .cursor/skills, .opencode/skills in the repo |
| 20 | custom | .threadle/skills/custom in the repo |
| 30 | imported | .threadle/skills/imported in the repo |
| 40 | custom | ~/.config/threadle/skills/custom |
| 50 | imported | ~/.config/threadle/skills/imported |
| 60 | global | ~/.claude/skills, ~/.config/opencode/skills, ~/.cursor/skills, ~/.agents/skills |
When two skills share a name, the loser records shadowedBy. Shadowed skills are hidden from the palette. A placed node shows shadowed in its subtitle (warning only).
Auto-invoke
Section titled “Auto-invoke”autoInvoke mirrors the skill’s disable-model-invocation frontmatter field. It does not change inject vs invoke mode on the node. It describes whether the model may pick the skill up on its own inside a session.
| Value | Meaning |
|---|---|
true | the model may pick the skill up on its own |
false | explicit /skill-name only |
Wiring examples
Section titled “Wiring examples”Inject into an agent:
✦ Skill (inject) ─┐ ├──▶ ⟨/⟩ Agent ──▶ ⇤ Output✎ Prompt ─────────┘Invoke then branch:
✎ Prompt ──▶ ✦ Skill (invoke) ──▶ ? Judge ─┬─ pass → ⇤ ├─ fail → ⇤ └─ unsure → ⇤A node with neither a path nor a name is a loose end: pick a skill/rules file.
Manage skill libraries from the shell (same APIs as the Skills view). Needs a running server.
threadle skills # listthreadle skills import./review.SKILL.mdthreadle skills export review-diff./out.mdthreadle skills toggle review-diff --manual # or --autothreadle open skill review-diff # UI deep link + focusthreadle open rules CLAUDE.mdFull command reference: CLI. Skills · CLI. Open UI.
Related
Section titled “Related”- Judge
- Nodes overview
- Context nodes
- Agents & sessions
- CLI.
threadle skills/threadle open - Workflow examples
- Graph lint