Build for Dunea
Review checklist
Every review rule, by id: what dunea-plugin check catches, what the server checks at upload, and what a reviewer checks by hand.
Every listing version is checked against one public checklist. Each rule has a stable id. dunea-plugin check reports findings with these ids, the marketplace stores them with each version, and a reviewer who rejects a version cites them, so a rejection always says exactly what to fix.
The rules come from REVIEW_RULES in @dunea/plugin-sdk:
import { REVIEW_RULES } from '@dunea/plugin-sdk';
REVIEW_RULES['DUN-P001']; // 'Ask only for the permissions the listing actually uses'The rules
Checked by says where a rule is caught first:
- check:
dunea-plugin checkfinds it on your machine, and the marketplace runs the same check when you upload. Errors block submission; warnings are for you and the reviewer to weigh. - upload: the marketplace checks it when you upload (it needs the network or your account).
- reviewer: a person checks it during review.
Every rule can also be cited by a reviewer.
| Id | Rule | Applies to | Checked by |
|---|---|---|---|
DUN-M001 | Manifest must validate against the schema | All | check |
DUN-M002 | Version must be higher than the last approved version | All | check |
DUN-U001 | Endpoints must be public https URLs (no localhost, private or IP-literal hosts) | Plugins, templates | check |
DUN-U002 | webhookUrl must respond (any status below 500) | Plugins | upload |
DUN-U003 | panel.url and icon must respond 2xx/3xx | All | upload |
DUN-L001 | Listing needs at least 1 screenshot (3 recommended) | All | check |
DUN-L002 | Description must explain what it does, who it is for and what it costs, in plain language | All | check, reviewer |
DUN-L003 | No misleading names, trademarks you do not own, or claims you cannot back up | All | reviewer |
DUN-P001 | Ask only for the permissions the listing actually uses | Plugins | check, reviewer |
DUN-P002 | New permissions in an update are re-approved by every owner | Plugins | check |
DUN-B001 | Paid listings, paid tools and usage need Stripe payouts connected | Paid listings | upload |
DUN-B002 | Tool prices must be disclosed in the description and match real value | Plugins with paid tools or usage | check, reviewer |
DUN-S001 | Site scripts must be necessary for the feature, consent-categorised correctly, and fast | Plugins with site scripts | check, reviewer |
DUN-S002 | No tracking or data collection beyond what the privacy policy states | Plugins | reviewer |
DUN-T001 | Theme text must meet WCAG AA contrast (4.5:1) on background and surface | Themes | check |
DUN-T002 | Primary button text must meet 4.5:1 on the primary colour | Themes | check |
DUN-T003 | Template preview must be live and match the snapshot | Templates | check, reviewer |
DUN-T004 | Templates must not contain secrets, real customer data or another creator’s work | Templates | reviewer |
DUN-K001 | Skills must not instruct the AI to bypass safety, pricing or permission rules | Skills | check, reviewer |
DUN-Q001 | It has to work: reviewers install it on a test app and use the main flow | All | reviewer |
DUN-B100–DUN-B109 | Block code: import allowlist, no eval, dynamic import, network, raw HTML, storage, navigation, script/iframe or Node globals; a default export (details) | Plugins and themes with blocks | check, reviewer |
Some rules are warnings in check and decided by the reviewer. For example, fewer than 3 screenshots is a warning, and no screenshots is an error for plugins and templates (DUN-L001); a description that doesn't mention credits when a tool is priced is a warning (DUN-B002); a new permission in an update is flagged so you know every owner will be asked again (DUN-P002).
Notes on the rules
DUN-U001.localhost, private network addresses and bare IP addresses are rejected forwebhookUrl,panel.url, site scripts andpreviewUrl. Use a public hostname with a valid certificate.DUN-L002. Say what it does, who it is for and what it costs in the first lines ofdescription. If the listing is paid, or has paid tools or usage, the description has to say so.DUN-P001. Reviewers compare every permission with what the plugin does. "We might need it later" is a rejection; add the permission in the version that uses it.DUN-B002. Disclose each paid tool's price and the usage price in the description. See Priced tools and metered usage.DUN-S001,DUN-S002. Every site script is reviewed by hand. See Site scripts and consent.DUN-T001,DUN-T002. Contrast is checked fortextonbackgroundandsurface, andprimaryTextonprimary, in both palettes if you havedarkColors.mutedtext below 4.5:1 is a warning. See Themes.DUN-T003,DUN-T004. See Templates.DUN-K001. See Skills for what the check looks for.DUN-Q001. Reviewers install every plugin on a test app (templates are remixed, themes and skills applied) and use its main flow. Make sure that works without special setup, or explain the setup in the version's changelog.
Rejections
A rejected version has reviewNotes from the reviewer and rejectionCodes: each rule id it broke, with the rule's text. dunea-plugin status prints both:
Order Alerts (order-alerts) — listed, 42 active installs
1.3.0 rejected reviewed 2026-11-03T10:12:00.000Z
review notes: customers:read is not used by any event or tool. The description doesn't say create_label costs 2 credits.
DUN-P001: Ask only for the permissions the listing actually uses
DUN-B002: Tool prices must be disclosed in the description and match real value
1.2.0 approved reviewed 2026-10-20T08:40:00.000ZFix every cited rule, bump version, and submit again. If you think a rejection is wrong, reply with the listing slug, the version and the rule id; see Community and help.
Publishing, review and guidelines
How a listing goes from draft to the marketplace: check, test installs, review, fast-track updates, rollbacks, analytics and a checklist before you submit.
Versioning and permission changes
Ship updates safely: version numbers, review, and what happens when a new version asks for more permissions.