commands¶
Provenance¶
- Source:
.spec/spexcode/.plugins/commands/spec.md - Source SHA-256:
a9328f4dacfcd7b134fe94321242dfd85f8f7ebd0ad89c4aaac2ffc0b48627ae
The invocable command plugins live here: leaf plugins whose body is a prompt preset a human can pick
from the / dropdown while launching or driving a session, each carrying surface: command. Grouping them keeps .plugins/ legible at
a glance — the command presets on this shelf, the skill plugins on [[skills]], the auxiliary system
contracts on [[prompts]], with [[core]] (the dev-flow contract subsystem) a flat child beside them.
Invocation belongs to the backend prompt boundary, not to whichever client happens to render the picker.
Every compose surface sends the raw /<preset> [[node]]… <free text> prompt; the shared resolver expands the
live surface: command body before either [[launch]] starts a worker or [[dispatch]] sends text to one. At
launch, the raw invocation remains the session's originating prompt and identity source, so links inside a
plugin body can never invent a node target. Dashboard and phone menus are therefore discovery/insertion
chrome, while dashboard, phone, CLI, API, and in-process fallback all invoke through the same backend
resolution. A preset with {{targets}} always receives the resolved target block; one without that placeholder
gets a target block only when the invocation actually names a target, so a targetless utility remains a small
prompt. An unknown leading /name stays ordinary prompt text and is never swallowed or guessed.
This node is a shelf, not a surface (the [[prompts]] shape): it declares no surface field and
gathers nothing itself. Discovery is recursive and field-driven ([[surface]]), so a resident plugs in
exactly as it would at the root — the gather set is path-independent, so shelving a command changes
nothing about what /api/plugins and the launcher offer. A plugin that serves BOTH surfaces (e.g.
[[distill]], skill and command) shelves once by its primary identity, never duplicated. The init
templates mirror this layout. The shelf stays pure presentation: moving a resident beneath it changes
neither that plugin's identity nor the surfaces gathered from its frontmatter.