diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9295e1d9..d0eb869f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -5,6 +5,13 @@ on:
branches: [main]
pull_request:
+permissions:
+ contents: read
+
+concurrency:
+ group: ci-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
jobs:
checks:
name: Lint & typecheck
diff --git a/README.md b/README.md
index 25bd9c7f..47a48c14 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ All content is submitted through the website — no pull requests needed for dat
1. Go to [cursor.directory/plugins/new](https://cursor.directory/plugins/new)
2. Sign in with GitHub or Google
-3. Paste a GitHub repo URL — we auto-detect components following the [Open Plugins](https://open-plugins.com) standard
+3. Paste a GitHub repo URL — we auto-detect components following the [Open Plugins](https://agent-plugins.org) standard
4. Click **Submit**
Auto-detected components:
@@ -85,13 +85,16 @@ Auto-detected components:
| Component | Path |
|-----------|------|
| Rules | `rules/*.mdc` |
-| MCP Servers | `.mcp.json` |
+| MCP Servers | `.mcp.json` or `mcp.json` |
| Skills | `skills/*/SKILL.md` |
| Agents | `agents/*.md` |
+| Commands | `commands/*.md` |
| Hooks | `hooks/hooks.json` |
| LSP Servers | `.lsp.json` |
-See the [Open Plugins specification](https://open-plugins.com/plugin-builders/specification) and [plugin template](https://github.com/cursor/plugin-template) for details.
+The manifest is read from `.plugin/plugin.json`, `.cursor-plugin/plugin.json` or `.claude-plugin/plugin.json` (first match wins). For monorepos, the same paths are also scanned inside every directory listed as `plugins[].source` in `.cursor-plugin/marketplace.json` and every directory that contains its own `.cursor-plugin/plugin.json`.
+
+See the [Open Plugins specification](https://agent-plugins.org/specification) and [plugin template](https://github.com/cursor/plugin-template) for details.
---
@@ -104,7 +107,7 @@ See the [Open Plugins specification](https://open-plugins.com/plugin-builders/sp
- **Styling**: [Tailwind CSS](https://tailwindcss.com)
- **UI**: [Radix UI](https://radix-ui.com) + [shadcn/ui](https://ui.shadcn.com)
- **Search**: [Fuse.js](https://fusejs.io) (client-side fuzzy search)
-- **URL State**: [nuqs](https://nuqs.47ng.com)
+- **URL State**: [nuqs](https://nuqs.dev)
- **Linting**: [Biome](https://biomejs.dev)
## Plugin security scan
diff --git a/apps/cursor/package.json b/apps/cursor/package.json
index 811e9f34..2526576d 100644
--- a/apps/cursor/package.json
+++ b/apps/cursor/package.json
@@ -6,7 +6,7 @@
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
- "lint": "next lint",
+ "lint": "biome check .",
"typecheck": "tsc --noEmit",
"seed:extract": "bun run --env-file=.env src/scripts/extract-from-github.ts",
"seed:insert": "bun run --env-file=.env src/scripts/insert-from-jsonl.ts"
@@ -54,7 +54,7 @@
"zod": "^4.4.3"
},
"devDependencies": {
- "@biomejs/biome": "2.4.14",
+ "@biomejs/biome": "2.4.15",
"@tailwindcss/postcss": "^4.2.4",
"@types/node": "^25.6.0",
"@types/react": "^19",
diff --git a/apps/cursor/src/app/plugins/new/page.tsx b/apps/cursor/src/app/plugins/new/page.tsx
index 116690e0..a51b2ca9 100644
--- a/apps/cursor/src/app/plugins/new/page.tsx
+++ b/apps/cursor/src/app/plugins/new/page.tsx
@@ -46,7 +46,7 @@ export default function Page() {
We follow the{" "}