Back to Twenty

Twenty Codex Plugin — Best Practices Compliance Checklist

packages/twenty-codex-plugin/CHECKLIST.md

2.9.08.6 KB
Original Source

Twenty Codex Plugin — Best Practices Compliance Checklist

This file is the authoritative compliance matrix. Every row maps an official requirement (Codex build guide, Codex best-practices guide, or OpenAI reference implementation) to either an automated check (a scripts/validate.js assertion function) or a manual sign-off.

A release is shippable when:

  1. yarn workspace twenty-codex-plugin validate exits 0 (all [automated] rows green).
  2. Every [manual] row has a current sign-off date.

Sources of Truth

Plugin Manifest (.codex-plugin/plugin.json)

#RequirementSourceCheck
M1name present, kebab-case, lowercaseBuild guide §Naming[automated] assertJsonMetadata
M2version follows SemVer and matches package.jsonBuild guide §Manifest[automated] assertJsonMetadata
M3description present and conciseBuild guide §Required fields[automated] assertInterfaceFields (planned)
M4mcpServers points at ./.mcp.jsonBuild guide §MCP[automated] assertJsonMetadata
M5skills points at ./skills/Build guide §Skills[automated] assertJsonMetadata
M6interface.displayName present and non-emptyBuild guide §Interface[automated] assertInterfaceFields (planned)
M7interface.shortDescription ≤ 64 charsBuild guide §Marketplace[automated] assertInterfaceFields (planned)
M8interface.longDescription present, multi-sentenceBuild guide §Marketplace[automated] assertInterfaceFields (planned)
M9interface.category matches marketplace enum (Coding)Build guide §Marketplace[automated] assertInterfaceFields (planned)
M10interface.capabilities non-empty subset of Interactive,Read,WriteBuild guide §Capabilities[automated] assertInterfaceFields (planned)
M11interface.websiteURL, privacyPolicyURL, termsOfServiceURL presentBuild guide §Publisher links[automated] assertInterfaceFields (planned)
M12interface.brandColor matches #RRGGBB and reflects Twenty brandBuild guide §Marketplace[automated] assertInterfaceFields (planned), [manual] brand alignment
M13interface.defaultPrompt is a non-empty array of stringsBuild guide §Defaults[automated] assertInterfaceFields (planned)
M14All manifest paths start with ./ and stay within plugin rootBuild guide §Paths[automated] assertJsonMetadata

Assets (assets/)

#RequirementSourceCheck
A1interface.logo exists and is PNGBuild guide §Assets[automated] assertAssets (planned)
A2Logo PNG is ≥ 256×256Build guide §Assets[automated] assertAssets (planned, PNG IHDR parse)
A3interface.composerIcon exists and is valid SVG or PNGBuild guide §Assets[automated] assertAssets (planned)
A4interface.screenshots has ≥ 1 entryBuild guide §Assets[automated] assertAssets (planned)
A5Every screenshot path exists and is PNGBuild guide §Assets[automated] assertAssets (planned)
A6Screenshots show the plugin in action (not placeholder mocks)Build guide §Marketplace[manual] reviewer sign-off

Skills (skills/<name>/SKILL.md)

#RequirementSourceCheck
S1Canonical five skills presentInternal convention[automated] assertSkills
S2No legacy skill names anywhereInternal convention[automated] assertNoLegacySkillReferences
S3Each SKILL.md has YAML frontmatter with name + description onlyBuild guide §Skills[automated] assertSkills
S4Frontmatter name matches directoryBuild guide §Skills[automated] assertSkills
S5Each skill has agents/openai.yaml with display_name, short_description (≤64), default_prompt (mentions $<skill>)OpenAI Agent format[automated] assertSkills
S6Each skill is scoped to a single job with clear boundariesBest practices §Skill scope[manual] cross-skill audit
S7Each skill includes a ## When to use trigger-phrase sectionBest practices §Descriptions[automated] assertSkillTriggerPhrases (planned)
S8Descriptions are disjoint across skills (no routing collision)Best practices §Descriptions[manual] cross-skill audit

References (references/)

#RequirementSourceCheck
R1All required reference files existInternal convention[automated] assertReferences
R2use-twenty-mcp formatting contract intact across SKILL.md and result-formatting.mdInternal convention[automated] assertTwentyMcpFormattingContract
R3Front component guidance correctly split across develop-app skill, layout.md, front-components.md, standalone-pages.md, app-structure.md, front-component-ui.mdInternal convention[automated] assertFrontComponentGuidance
R4CLI guidance correctly split between develop-app and manage-appInternal convention[automated] assertCliGuidanceSplit
R5concepts/how-apps-work.md is foundational and linked from every skillInternal convention[automated] assertHowAppsWork

MCP (.mcp.json and scripts/setup-mcp.sh)

#RequirementSourceCheck
MCP1.mcp.json declares only the public twenty-docs serverInternal convention[automated] assertJsonMetadata
MCP2No workspace-specific MCP configs bundled anywhereInternal convention[automated] assertNoBundledMcpConfig
MCP3No bearer tokens or API keys anywhere in the packageBuild guide §Security[automated] assertNoBundledMcpConfig
MCP4No non-placeholder URLs in any fileInternal convention[automated] assertNoBundledMcpConfig
MCP5scripts/setup-mcp.sh passes bash -n syntax checkInternal convention[automated] assertSetupHelper
MCP6setup-mcp.sh correctly normalizes representative URLsInternal convention[automated] assertSetupHelper

Marketplace & Distribution

#RequirementSourceCheck
D1templates/marketplace.example.json matches plugin name/versionInternal convention[automated] assertMarketplaceTemplate (planned)
D2Optional repo-level .agents/plugins/marketplace.json points at ./packages/twenty-codex-pluginBuild guide §Distribution[automated] assertJsonMetadata
D3CHANGELOG.md updated for every version bumpReference impl[manual] release reviewer sign-off

Process

#RequirementSourceCheck
P1validate.js runs in CI on every PR touching the pluginReference impl[manual] confirm .github/workflows/ci-codex-plugin.yml is active
P2validate.js has its own unit testsInternal convention[manual] confirm scripts/__tests__/ exists and runs
P3Version bump procedure documentedInternal convention[manual] confirm CONTRIBUTING.md covers it

Manual Sign-off Log

When a manual row above is verified, add a line here.

DateRow(s)ReviewerNotes
2026-05-28S6, S8Codex plugin compliance passSkill descriptions reviewed side-by-side; "When To Use" sections added to all five SKILL.md files with explicit "do not use this skill for X" boundary callouts referencing the four siblings. Routing surface is disjoint.
2026-05-28M12Codex plugin compliance passbrandColor: #000000 matches the actual logo background in assets/twenty-logo.svg.

Deferred Items

Tracked for a follow-up PR; not blocking the current release.

ItemReason for deferral
Real marketplace screenshots (A4, A5, A6)Requires real captures against a demo workspace. assets/screenshots/README.md documents what's needed; plugin.json screenshots stays [] until the PNGs land so assertAssets does not regress.
Splitting standalone-pages.md / front-component-ui.mdThe cross-doc contracts assert dozens of exact fragments per file. The mechanical risk of fragment drift outweighs the readability gain at current size (~450 lines each). Re-evaluate when either exceeds 600 lines.
hooks/hooks.json SessionStart hookThe Codex hook schema for plugin-bundled hooks needs deeper validation; a misconfigured SessionStart hook would fire on every Codex session. Add only when the format is verified against a working reference implementation.