- Store gate pattern: wrap store-backed UI in
<template x-if="$store.myStore"> and mount cleanup on the inner element.
- Store definition: use
createStore from /js/AlpineStore.js; do not register Alpine stores inline in HTML or via alpine:init.
- Notifications: use
toastFrontendError, toastFrontendSuccess, or backend notification helpers; do not render inline error boxes.
- Python extensions: use
extensions/python/<point>/ for named lifecycle hooks and extensions/python/_functions/<module>/<qualname>/<start|end>/ for implicit @extensible hooks. The flattened extensions/python/<module>_<qualname>_<start|end>/ layout is stale and should be flagged.
- API handlers: subclass
ApiHandler and return a dict or Response.
- Tools: subclass
Tool from helpers.tool.
- AgentContext imports: use
from agent import AgentContext, AgentContextType, never helpers.context.
- Hooks runtime targeting: use
sys.executable only for framework runtime work and /opt/venv/bin/python for agent-runtime installs.
- execute.py pattern: expose
main() and end with if __name__ == "__main__": sys.exit(main()).
- Community contribution: plugin name must match
^[a-z0-9_]+$, match the directory name, and stay unique in the published index.
- LICENSE: a file named
LICENSE at the plugin root is optional for local-only plugins but required at the repository root before Plugin Index submission; if missing, rate Structure Validation as warning (not pass) and state that clearly in findings.