Skip to content

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.