Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,21 +77,24 @@ 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:

| 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.

---

Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions apps/cursor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion apps/cursor/src/app/plugins/new/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export default function Page() {
<br />
We follow the{" "}
<a
href="https://open-plugins.com"
href="https://agent-plugins.org"
target="_blank"
rel="noreferrer"
className="text-foreground border-b border-border border-dashed"
Expand Down
2 changes: 1 addition & 1 deletion apps/cursor/src/components/forms/plugin-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ export function PluginForm() {
We&apos;ll scan for rules, MCP servers, skills, agents, and more
following the{" "}
<a
href="https://open-plugins.com"
href="https://agent-plugins.org"
target="_blank"
rel="noreferrer"
className="border-b border-border border-dashed hover:text-foreground transition-colors"
Expand Down
11 changes: 9 additions & 2 deletions apps/cursor/src/lib/cron-auth.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { timingSafeEqual } from "node:crypto";
import { NextResponse } from "next/server";

/**
Expand All @@ -24,8 +25,14 @@ export function requireCronAuth(request: Request): NextResponse | null {
);
}

const header = request.headers.get("authorization");
if (header !== `Bearer ${cronSecret}`) {
const header = request.headers.get("authorization") ?? "";
const expected = Buffer.from(`Bearer ${cronSecret}`);
const received = Buffer.from(header);
// Constant-time compare so the response time does not leak how much of
// the secret matched. Lengths must match first or timingSafeEqual throws.
const authorized =
received.length === expected.length && timingSafeEqual(received, expected);
if (!authorized) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

Expand Down
2 changes: 1 addition & 1 deletion apps/cursor/src/lib/github-plugin/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ export async function parseGitHubPlugin(
throw new GitHubParseError(
`No plugin components found in: ${scannedPrefixes}. ` +
`We looked for: ${hints.join(", ")}. ` +
`Make sure your repo follows the Open Plugins standard (https://open-plugins.com).`,
`Make sure your repo follows the Open Plugins standard (https://agent-plugins.org).`,
"no_components",
);
}
Expand Down
20 changes: 1 addition & 19 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.