Skip to content

Skills & rules

Two artifact nodes put skill or rules content on a wire. Rules are always inject-only. Skills support two run modes.

GlyphNodePalette tabReads
✦Skillskills<name>/SKILL.md
§RulesrulesCLAUDE.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).


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.

ModeGlyphWhat 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.


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.


Each node stores a name plus an optional absolute path.

  1. Path first. If the node has a path and the scanner still knows that file, it is used verbatim (inject).
  2. Then by name. Candidates are filtered by kind and name, narrowed by origin and then by source when those are set, and the lowest precedence layer wins.
  3. 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.


Skills carry an origin bucket and a precedence layer. Lower layer wins a name collision.

LayerOriginWhere
10project.claude/skills, .agents/skills, .cursor/skills, .opencode/skills in the repo
20custom.threadle/skills/custom in the repo
30imported.threadle/skills/imported in the repo
40custom~/.config/threadle/skills/custom
50imported~/.config/threadle/skills/imported
60global~/.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).


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.

ValueMeaning
truethe model may pick the skill up on its own
falseexplicit /skill-name only

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.

Terminal window
threadle skills # list
threadle skills import./review.SKILL.md
threadle skills export review-diff./out.md
threadle skills toggle review-diff --manual # or --auto
threadle open skill review-diff # UI deep link + focus
threadle open rules CLAUDE.md

Full command reference: CLI. Skills · CLI. Open UI.