packages/elizaos/templates/min-plugin/SCAFFOLD.md
You (the coding agent spawned by the Eliza orchestrator) are responsible for turning this template into a working Eliza plugin. Read this entire file before editing.
Every file in this template contains one or both of:
__PLUGIN_NAME__ — the npm-style package name. Use lowercase, hyphenated. Scope under @elizaos/plugin- for first-party plugins, otherwise pick a sensible scope (@user/plugin-foo).__PLUGIN_DISPLAY_NAME__ — the human-readable display name shown in the dashboard.Replace all occurrences in package.json, src/, tests/, and README.md. Do not leave a single placeholder behind — verification will fail.
In package.json:
description with one factual sentence about what the plugin does.elizaos.plugin.category to one of the canonical categories (utility, ai-provider, connector, dev-tools, data, media, social).The default infoProvider is a smoke implementation. Add real actions, providers, services, and types for whatever the user asked for. Keep at least one passing test in tests/ per real action you add.
Run, in this order, from the plugin's package directory:
bun run typecheck
bun run lint
bun run test
All three must exit zero. If one fails, fix it. Do not silence errors with unsafe casts to any, // @ts-ignore, broad try/catch, or ?? defaultValue patterns that hide missing data.
After verification passes, emit a single line on stdout:
PLUGIN_CREATE_DONE {"pluginName":"<__PLUGIN_NAME__>","files":["<list>"],"tests":{"passed":<n>,"failed":0},"lint":"ok","typecheck":"ok","description":"<one factual sentence>"}
Field contract (all required except description):
pluginName — string, the npm-style package name you used in package.json.files — array of repo-relative paths you created or modified.tests — object with the exact Vitest count: passed is the verified passed count and failed must be 0.lint — literal "ok", only after bun run lint exits zero.typecheck — literal "ok", only after bun run typecheck exits zero.description — optional one-sentence summary of what the plugin does.Do not emit legacy fields such as name, testsPassed, or lintClean; the orchestrator rejects them.
The orchestrator will cross-check the claims against disk and the verification log. If anything you assert does not match reality, it will retry you with a structured failure report (capped by ELIZA_APP_VERIFICATION_MAX_RETRIES, default 3).
src/actions/, src/providers/, src/evaluators/. The plugin barrel is wiring only.console.* in any runtime code.any, no unknown without a validating boundary, no as escapes, no ?? defaultValue for missing required data.