Cursor-plugin repositories must have the four core GitHub Actions workflows listed below. MCP-server repositories require a different set of three; see MCP-server Variations. Optional workflows are documented at the end.
Triggers: push to main, pull_request to main
Validates the structural integrity of the plugin before merging.
Required checks:
| Check | Description |
|---|---|
| JSON validity | plugin.json (and mcp.json if present) parse without errors |
| Manifest fields | All required fields exist, name is kebab-case |
| Skill file existence | Every path in plugin.json skills array points to a real file |
| Rule file existence | Every path in plugin.json rules array points to a real file |
| Frontmatter | Skills have YAML frontmatter starting with ---; rules have .mdc frontmatter |
| Credential scanning | No hardcoded passwords, API keys, or tokens in source files |
Conditional checks (include if applicable):
| Check | Condition |
|---|---|
| Python syntax | If mcp-server/ exists, py_compile all .py files |
| Test suite | If tests/ exists, run pytest tests/ -v |
| Content counts | If README contains stat counts, verify they match actual file counts |
Triggers: push to main (with paths-ignore for docs, markdown, and .github/ changes)
Automatic version bump, tagging, and GitHub Release creation.
Flow:
- Read current version from
.cursor-plugin/plugin.json - Parse commit messages since last tag for bump type:
feat!:orBREAKING CHANGE= majorfeat:= minor- Everything else = patch
- Compute new semver version
- Update
plugin.jsonversion andREADME.mdversion badge - Commit with
chore: bump version to X.Y.Z [skip ci] - Create git tag
vX.Y.Z - Create GitHub Release with grouped release notes
- Sync repo About section (description, homepage, topics) via
gh repo edit
Requirements:
concurrency: { group: release, cancel-in-progress: false }to prevent race conditionspermissions: contents: writefetch-depth: 0on checkout for full git history
Triggers: push to main, pull_request to main, workflow_dispatch
Runs the ecosystem drift checker against the repo's own agent files to detect version-signal drift and missing or broken required references.
Required configuration:
- uses: TMHSDigital/Developer-Tools-Directory/.github/actions/drift-check@v1.9
with:
mode: self
format: gh-summarymode: self checks only the calling repo's checkout; no cross-repo token is needed. Findings at info severity are advisory. Findings at error or warn severity indicate real drift that should be addressed.
Triggers: schedule (daily or weekly), workflow_dispatch
Marks issues and PRs as stale after inactivity and closes them after further inactivity. Use actions/stale with sensible defaults (e.g., 30 days stale, 7 days to close).
| Workflow | Purpose | When to include |
|---|---|---|
pages.yml |
GitHub Pages deployment | Repos with a docs/ site; generated by scaffold by default |
label-sync.yml |
Auto-label PRs by changed file paths | Any repo; generated by scaffold but not required |
codeql.yml |
Security scanning via GitHub CodeQL | Repos with substantial code (MCP servers, TypeScript packages) |
dependency-review.yml |
PR dependency audit | Repos with external dependencies |
release-drafter.yml |
Draft release notes automatically | Repos with frequent PRs |
ci.yml |
Extended test/lint/build pipeline | Repos with complex test suites |
| Domain-specific update | Auto-fetch external data (e.g., native DBs, API schemas) | Repos that consume external data |
MCP-server repos require three workflows: drift-check.yml, stale.yml, and publish.yml. This is a different set from cursor-plugin repos, not a superset or subset.
validate.ymlis not required. Every check invalidate.yml(plugin.jsonvalidity, manifest fields, skill and rule file existence) assumes aplugin.json. MCP-server repos have noplugin.json, sovalidate.ymldoes not apply. CI validation is still expected; useci.ymlor an equivalent workflow suited to the server's runtime.publish.ymlreplacesrelease.yml. MCP servers release via npm publish (OIDC provenance recommended; see versioning.md). A conventional-commitrelease.ymlthat readsplugin.jsondoes not apply.pages.ymlis optional. Include it if the repo has adocs/site; omit it otherwise.drift-check.ymlandstale.ymlare required, same as cursor-plugin repos.
- Use lowercase with hyphens:
validate.yml,release.yml,pages.yml - The
name:field inside the workflow should be title case:Validate,Release,Deploy GitHub Pages - Job names should be descriptive:
validate-json,bump-version-and-release,deploy
- Use
${{ secrets.GITHUB_TOKEN }}(automatically provided) for all Git operations - Never store custom secrets unless absolutely required (e.g., npm publish tokens)
- Set minimal
permissionsat the workflow level, not at the job level
Every repo must protect main with a GitHub ruleset or classic branch protection that enforces the following. The meta-repo's main protection ruleset is the reference implementation.
Required rules:
- Direct pushes to
mainblocked; all changes land via pull request. - Force pushes blocked (
non_fast_forward). - Branch deletion blocked.
- Empty bypass-actors list (policy applies to repo owner and admins).
- Squash-merge only. Merge commits and rebase merges should be disabled.
Required status checks (minimum for plugin/tool repos):
- JSON/manifest validation job
- Skill and rule file-existence job
- Credential-scanning / safety-scan job
CodeQL(if the repo includes source code substantive enough to scan)- Any repo-specific sync-check or safety-scan jobs
Repos using the meta-repo's VERSION-file-driven release model additionally require:
feat/fix commits require VERSION bump(PR gate, runs invalidate.yml)
The companion Check VERSION vs latest tag job in release.yml is a post-merge guard that runs on push to main. It should NOT be added to the PR-required-contexts list; doing so will permanently block every PR because release.yml does not run on PRs.
Required approvals are a per-repo decision: solo-maintainer repos may set 0 approvals provided all other gates pass; multi-maintainer repos should require at least 1.
Configuration lives in repo settings, not in git. Document the current ruleset in .github/workflows/README.md so the state is discoverable without admin access.
Note: the tool-repo release model described in
release.ymlabove uses conventional-commit auto-bumps and does not currently require theVERSION/version-bump-checkgates. The meta-repo deviates intentionally. A decision on whether to propagate theVERSION-file model to tool repos is deferred; seeROADMAP.md.