Resolution
NANOCLAW_TEMPLATES_DIR is a local path only, resolved once at load — never a URL, and never changed at runtime.
Failure boundaries
Per-component failures degrade; structural and trust violations reject the whole template.
Every skip or ignore produces a named line in the create response’s
templateReport. Components are never silently stripped.
plugin.json
Required. It is both the manifest and the discovery marker.
name is the plugin’s machine name, independent of the folder path, and is the folder it is stamped under.
The NanoClaw extension key
Display-name precedence:
--name → agentName → the template folder name.
Any other key under ai.nanoco.nanoclaw is reported as unrecognized and ignored.
mcp.json
Optional. Exactly two top-level fields are allowed — anything else skips the whole MCP component.
Every entry must declare
type. An sse entry is rejected as unsupported — that server is skipped with a notice, not the whole template.
- stdio
- streamable-http
Allowed fields:
type, command, args, env, cwd.A
${PLUGIN_DATA} subdirectory named as cwd is created at stamp time. ./ and ${PLUGIN_ROOT} directories must already exist in the shipped plugin.Secret lint
Applied to everyenv and headers value at stamp time. The literal "placeholder" always passes.
Key matching is case-insensitive and matches anywhere in the name, so
MY_SLACK_TOKEN_V2 matches on TOKEN.
The registry’s
check-templates.mjs fails on the credential-shaped-key case rather than warning, so a template that stamps cleanly locally can still be rejected by CI. It also does not strip auth-scheme prefixes, so a Bearer sk-… value trips the engine but not the registry script — though only when the key itself isn’t credential-shaped; an Authorization header still fails CI on the key rule. See Submitting a template.skills/<name>/
Each immediate child directory of skills/ containing a regular SKILL.md is one skill. Stray regular files in skills/ are ignored. A skill is skipped, with a reason, when:
- there is no
SKILL.md, or it is not a regular file SKILL.mdhas no YAML frontmatter, or the frontmatter is unclosed, invalid YAML, or not a mappingnameordescriptionis missing or empty
SKILL.md never degrades to a skipped skill.
The whole folder is copied into the group’s skills overlay, keyed to that group and never shared. Executable bits are preserved.
ai.nanoco.nanoclaw/
Extra context files are copied with the
context/ prefix stripped, so a reference written as additional_context/pricing.md in instructions.md resolves unchanged in the agent’s workspace. Nothing is injected automatically.
Task files
Each immediate.md file under tasks/ is one task. The filename is the task name; the body is the prompt.
The body must be non-empty. Task names must not collide on their truncated id slug; a colliding template is refused at first stamp, before anything is created.
Tasks are created with status
paused, fire in the group timezone, and follow normal frequency limits — four fires per 24 hours when ungated, more when a script gate is present. Templates cannot create one-time tasks or override the frequency limit.
Limits and containment
The tree is walked withlstat before any content is read, so a hostile template is rejected without its targets being touched.
These are abuse bounds, not sizing guidance; real templates are a few dozen files.
Plugin content is data on the host and code only in the container. The host process validates and copies plugin files but never executes, imports, or shells out to anything inside them. stdio servers, skill scripts, and task script gates all run in the agent container.
Where a stamped template lands
The runtime contract
stdio servers that shipped inside a plugin get the Agent Plugins runtime contract:
Servers added by
ncl or through an approval carry no plugin marker and pass through untouched.
Related pages
Building a template
The narrative version, with examples, registry standards, and the checks script.
Using a template
Stamping an agent and reading the create response.
Container config
The per-group config MCP servers are written into.
ncl CLI
groups create --template and the restamp flags.