Agent-zero a0-review-plugin
Full audit of Agent Zero plugins in usr/plugins/. Reviews manifest validity, directory structure, code patterns (Store Gating, notifications, imports), security, and duplicate detection against the community index. Use when asked to review, audit, validate, or check an existing plugin before using or contributing it.
install
source · Clone the upstream repo
git clone https://github.com/agent0ai/agent-zero
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/agent0ai/agent-zero "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/a0-review-plugin" ~/.claude/skills/agent0ai-agent-zero-a0-review-plugin && rm -rf "$T"
manifest:
skills/a0-review-plugin/SKILL.mdsource content
Agent Zero Plugin Review
Full-audit workflow for plugins in
/a0/usr/plugins/<name>/. Run all 4 phases in order and report findings grouped by phase. Mark each item PASS, FAIL, or WARN.
For detailed checklists and code pattern references, read
checklists.md in this skill directory when needed.
Phase 1: Manifest Validation
Read
usr/plugins/<name>/plugin.yaml. Check:
- File exists at plugin root
- Valid YAML (parseable, mapping at top level)
-
field handling matches the intended distribution target: for community / Plugin Index plugins it must be present, non-empty, matchname
, and match the directory name; for local-only plugins, a missing^[a-z0-9_]+$
is a WARN rather than a FAILname -
present and non-emptytitle -
present and non-emptydescription -
present, follows semver or simpleversion
formatx.y.z -
is a list; each value is one of:settings_sections
,agent
,external
,mcp
,developerbackup -
andper_project_config
are booleans (if present)per_agent_config -
isalways_enabled
or absent (only framework core plugins should usefalse
)true - No unknown fields (warn on extra keys not in the schema)
Phase 2: Structure Validation
Inspect the plugin directory layout:
- Directory is under
(notusr/plugins/
- that is reserved for core)plugins/ - Directory name matches
^[a-z0-9_]+$ - If
exists: contains Python files only; each should subclassapi/ApiHandler - If
exists: contains Python files only; each should subclasstools/Tool - If
exists: check subdirs followextensions/
,python/<point>/
, orpython/_functions/<module>/<qualname>/<start|end>/
patterns; flag the retired flattenedwebui/<point>/
formpython/<module>_<qualname>_<start|end>/ - If
exists: shared Python logic (standard directory)helpers/ - If
exists: prompt templates (standard directory)prompts/ - If
exists: agent profiles withagents/
(standard directory)<profile>/agent.yaml - If
exists: configuration files such asconf/
(standard directory)model_providers.yaml - If
exists: plugin must declare at least onewebui/config.html
entrysettings_sections - If
exists: review whether it defines the lifecycle hook functions the plugin appears to rely on, especiallyhooks.py
,install
, andpre_update
when the plugin needs install-time, update-time, or cleanup behavior — ifuninstall
adds dependencies, flag a missinginstall()
as WARNuninstall() - If
exists: check it has aexecute.py
function andmain()if __name__ == "__main__": sys.exit(main()) -
at plugin root: Agent Zero does not require it for local plugins, but it is required at the repo root before submitting to the Plugin Index. If missing → WARN —LICENSELICENSE absent — required for community contribution (Plugin Index); optional for local-only use -
(if present): valid YAMLdefault_config.yaml - No unexpected top-level entries (WARN for anything outside the standard layout)
Standard top-level layout:
plugin.yaml, execute.py, hooks.py, default_config.yaml, optional README.md, LICENSE, __init__.py, plus api/, tools/, extensions/, webui/, helpers/, prompts/, agents/, conf/
Phase 3: Code Pattern Review
Read source files and check for violations of Agent Zero conventions.
Frontend (HTML/JS)
- Every component that accesses a store uses the Store Gate pattern:
<div x-data> <template x-if="$store.myStore"> <div x-init="$store.myStore.onOpen()" x-destroy="$store.myStore.cleanup()"> ... </div> </template> </div> - No
event listeners inside HTML files (store logic must be inalpine:init
files).js - Alpine stores use
imported fromcreateStore/js/AlpineStore.js - No inline error/success
blocks bound to<div>
or similar - must use notification system:store.error
/toastFrontendError(msg, "Plugin Name")
etc.toastFrontendSuccess(...)- Import from
/components/notifications/notification-store.js
- Static assets served via
(not hardcoded absolute paths)GET /plugins/<name>/... - Store module imported in HTML
via<head><script type="module" src="/plugins/<name>/webui/store.js">
Backend (Python)
- Correct import paths:
(notfrom agent import AgentContext, AgentContextType
)helpers.context
(not a local reimport)from initialize import initialize_agent
- API handlers subclass
fromApiHandlerpython/helpers/api.py - Tools subclass
fromToolhelpers.tool - Plugin settings read via
fromget_plugin_config("plugin-name", agent=agent)helpers.plugins - User messages sent via
, not direct socket writescontext.communicate(UserMessage(...)) -
environment targeting: if installing packages for the agent runtime (not framework), subprocess must explicitly target the correct interpreter (e.g.,hooks.py
)/opt/venv/bin/python - No
for agent-runtime deps (that installs into framework runtime instead)sys.executable -m pip install
Phase 4: Security + Index Review
Security checks
- No hardcoded secrets, API keys, tokens, or passwords in any file
- No
oreval()
on user-supplied inputexec() - File path operations use safe joins (no concatenation with user input that could escape the sandbox)
- Subprocess calls do not pass unsanitized user input as shell strings
- ZIP extraction (if any): path traversal protection in place
- No outbound network calls to third-party endpoints without user awareness (WARN if present, not automatic FAIL)
Duplicate detection against the community index
Fetch the current index:
https://github.com/agent0ai/a0-plugins/releases/download/generated-index/index.json
Check:
- Plugin
does not already exist as a folder in the indexname - No other index entry points to the same
URLgithub - Plugin purpose is not already covered by an existing index entry (WARN for semantic overlap, not FAIL)
Community readiness assessment
Summarize whether the plugin is ready for contribution:
- READY: all FAIL items resolved; for Plugin Index submission, no blocking WARN items (a missing
is a WARN but blocks contribution readiness until fixed)LICENSE - NEEDS WORK: list specific FAIL items to fix
- OPTIONAL IMPROVEMENTS: list non-blocking WARN items (if the user is only using the plugin locally, a missing
can be noted as optional)LICENSE
Reporting Format
## Plugin Review: <plugin_name> ### Phase 1: Manifest PASS name: my_plugin PASS title: My Plugin FAIL version: missing ... ### Phase 2: Structure PASS plugin.yaml present WARN Unexpected file at root: notes.txt ... ### Phase 3: Code Patterns PASS Store Gating: found in webui/main.html FAIL Inline error box found in webui/settings.html (use toastFrontendError instead) ... ### Phase 4: Security + Index PASS No hardcoded secrets found PASS No duplicate in community index WARN Outbound HTTP call to external service in api/handler.py:42 ### Summary Status: NEEDS WORK Fix required: version missing in plugin.yaml, inline error box in webui/settings.html
References
- Detailed pattern checklists: read
in this skill directorychecklists.md - Plugin architecture:
/a0/docs/agents/AGENTS.plugins.md - Developer lifecycle guide:
/a0/docs/developer/plugins.md - Component system:
/a0/docs/agents/AGENTS.components.md - If review passes and user wants to publish: read
/a0/skills/a0-contribute-plugin/SKILL.md