Not in the top 1,000 by GitHub stars

edtrackai/ship-ready-skills

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

plugins/supabase-grants-guard/skills/supabase-grants-check/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

skills/launch-security-check/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

skills/stripe-webhook-review/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

skills/supabase-grants-check/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

skills/supabase-rls-review/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

skills/unthrottled-route-check/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 8a7193870ac3

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 8a7193870ac3ea0027fb8735b48d63baf2e01f75

git clone --filter=blob:none --no-checkout https://github.com/edtrackai/ship-ready-skills.git .hotskills/edtrackai-ship-ready-skills && git -C .hotskills/edtrackai-ship-ready-skills checkout --detach 8a7193870ac3ea0027fb8735b48d63baf2e01f75 # Copy each selected skill directory from .hotskills/edtrackai-ship-ready-skills into .claude/skills/<skill-name>/
0GitHub stars
Not availablestars in 7 days
6skills in this repository
25commits in 30 days

Heat

Insufficient history

Not enough history yet to measure heat. It appears after a few days of data.

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Nov 4, 2026Nov 4, 20260

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

supabase-grants-check

When your agent uses it

Check Supabase migrations for the security side of the 30 Oct 2026 Data API grants change (Supabase's changelog schedules it) - GRANT ALL or write grants to anon, grants on tables with RLS off, policies whose role has no grant (42501), grants with no policy, SECURITY DEFINER functions anon can execute, default privileges that still auto-grant, and the local auto_expose_new_tables setting. Use when the user asks about Supabase grants, a 42501 permission-denied error, the 30 October change, or whether a GRANT fix is safe.

What it loads into context

Frontmatter

139 tokens

Always available to the agent

SKILL.md

1,094 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Scope
  2. Checks
  3. Report

Files

  • ../../../../.claude-plugin/marketplace.jsonasset1,115 bytes
  • ../../../../.claude-plugin/plugin.jsonasset863 bytes
  • ../../.claude-plugin/marketplace.jsonasset569 bytes
  • ../../.claude-plugin/plugin.jsonasset419 bytes
  • ../../hooks/hooks.jsonasset200 bytes
  • SKILL.mdcore4,464 bytes
Read SKILL.md

# supabase-grants-check

Review only. Don't edit files unless the user asks for the fixes afterwards.

## Scope
Read every `.sql` file under `supabase/migrations/` in filename order (later files can fix earlier ones), plus `supabase/config.toml` if it exists. Track per table in `public` (and any other schema the user says the Data API exposes) what holds at the end of the history: RLS on or off, the policies (command and roles) and the grants per role (`anon`, `authenticated`). Treat `grant all` as select, insert, update, delete, truncate, references and trigger. Treat `revoke` as removing privileges. Dashboard changes aren't in these files, so say that in the report instead of guessing. If the user can run SQL, point them to the free SQL checker on the live database. It checks the same things, and its C1–C7 ids match G1–G7 here.

## Checks
For each finding, give file:line, the id, severity and the fix.

| Id | Severity | Look for | Fix |
|---|---|---|---|
| G1 | critical | A table where `anon` or `authenticated` has any grant and RLS is never enabled | In one migration: `enable row level security`, add policies, then keep only the minimum grant. |
| G2 | high | `anon` holds insert, update, delete or truncate on a table (including through `grant all ... to anon`) | Revoke the writes from `anon`, for example `revoke insert, update, delete, truncate on public.t from anon;`. Signed-out visitors usually need `select` at most. |
View the complete source on GitHub

Skills included

  • supabase-grants-check
  • launch-security-check
  • stripe-webhook-review
  • supabase-grants-check
  • supabase-rls-review
  • unthrottled-route-check

Repository facts

License
MIT
Created
Oct 14, 2026
Last pushed
Oct 17, 2026
Forks
0
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 7, 2026

Show all 66 signals by file

.claude-plugin/marketplace.json

  • Network accessline 3
    "owner": {     "name": "Stack & Ship",     "url": "https://edtrackai.github.io"
  • Network accessline 4
    "name": "Stack & Ship",     "url": "https://edtrackai.github.io"   },
  • Network accessline 5
    "url": "https://edtrackai.github.io"

.claude-plugin/plugin.json

  • Network accessline 5
    "author": {     "name": "Stack & Ship",     "url": "https://edtrackai.github.io"
  • Network accessline 6
    "name": "Stack & Ship",     "url": "https://edtrackai.github.io"   },
  • Network accessline 7
    "url": "https://edtrackai.github.io"
  • Network accessline 8
    },   "homepage": "https://github.com/edtrackai/ship-ready-skills",   "repository": "https://github.com/edtrackai/ship-ready-skills",
  • Network accessline 9
    "homepage": "https://github.com/edtrackai/ship-ready-skills",
  • Network accessline 10
    "repository": "https://github.com/edtrackai/ship-ready-skills",

plugins/supabase-grants-guard/.claude-plugin/marketplace.json

  • Network accessline 1
    {   "name": "supabase-grants-check",   "owner": { "name": "Stack & Ship", "url": "https://edtrackai.github.io" },
  • Network accessline 2
    "name": "supabase-grants-check",   "owner": { "name": "Stack & Ship", "url": "https://edtrackai.github.io" },   "metadata": { "description": "Free Supabase Data API grants check for Claude Code." },
  • Network accessline 3
    "owner": { "name": "Stack & Ship", "url": "https://edtrackai.github.io" },

skills/launch-security-check/SKILL.md

  • Access to secretsline 26
    [Credential-related source omitted]

skills/supabase-rls-review/SKILL.md

  • Network accessline 21
    | R3 | high | A write policy that applies to `anon` (`to anon`, or `to public` with no auth check) | Write policies go to `authenticated` only, scoped to `auth.uid()`. | | R4 | high | `security definer` function with no `set search_path` | 
  • Network accessline 22
    | R4 | high | `security definer` function with no `set search_path` | Add `set search_path = ''` and schema-qualify names, or use `security invoker`. | | R5 | medium | A `public` table with no explicit per-table `grant` to the roles that us
  • Network accessline 23
    | R5 | medium | A `public` table with no explicit per-table `grant` to the roles that use it | Supabase's changelog schedules a change for 30 Oct 2026 after which new `public` tables on existing projects get no automatic grants to `anon`/`a

skills/unthrottled-route-check/SKILL.md

  • Network accessline 14
    ## Find the sinks Grep the route files for these method calls, whatever the client variable is called (`openai.`, `llm.`, `client.`...): - AI calls: `.chat.completions.create`/`.stream`/`.parse`, `.responses.create`/`.stream`/`.parse`, `.me
  • Network accessline 15
    Grep the route files for these method calls, whatever the client variable is called (`openai.`, `llm.`, `client.`...): - AI calls: `.chat.completions.create`/`.stream`/`.parse`, `.responses.create`/`.stream`/`.parse`, `.messages.create`, `.
  • Network accessline 16
    - AI calls: `.chat.completions.create`/`.stream`/`.parse`, `.responses.create`/`.stream`/`.parse`, `.messages.create`, `.messages.stream`, `.images.generate`, `.embeddings.create`, `.completions.create`, `streamText(`, `generateText(`, `gen

skills/unthrottled-route-check/scripts/scan-unthrottled.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 89
    /** First AI fetch: a literal URL, or fetch(BASE...) / fetch(`${BASE}...`) where BASE is a const AI host URL. */

skills/unthrottled-route-check/tests/fixtures/evasion/app/api/client2/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/evasion/app/api/fakelimit/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/evasion/app/api/llm/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/evasion/app/api/rawfetch/route.ts

  • Network accessline 1
    export async function POST() {   const r = await fetch("https://api.anthropic.com/v1/messages", { method: "POST", body: "{}" });
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    const r = await fetch("https://api.anthropic.com/v1/messages", { method: "POST", body: "{}" });

skills/unthrottled-route-check/tests/fixtures/evasion/app/api/words/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/fetchbase/app/api/constbase/route.ts

  • Network accessline 1
    const ANTHROPIC_URL = 'https://api.anthropic.com/v1/messages'; export async function POST() {   return fetch(ANTHROPIC_URL, { method: "POST", body: "{}" });
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    export async function POST() {   return fetch(ANTHROPIC_URL, { method: "POST", body: "{}" }); }
  • Network accessline 3
    return fetch(ANTHROPIC_URL, { method: "POST", body: "{}" });

skills/unthrottled-route-check/tests/fixtures/fetchbase/app/api/newurl/route.ts

  • Network accessline 1
    const HOST = `https://api.openai.com`; export async function POST() { return fetch(new URL("/v1/responses", HOST), { method: "POST" }); }
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    export async function POST() { return fetch(new URL("/v1/responses", HOST), { method: "POST" }); }

skills/unthrottled-route-check/tests/fixtures/fetchbase/app/api/tpl/route.ts

  • Network accessline 1
    const OPENAI_BASE = "https://api.openai.com/v1"; export async function POST() {   const r = await fetch(`${OPENAI_BASE}/chat/completions`, { method: "POST", body: "{}" });
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    export async function POST() {   const r = await fetch(`${OPENAI_BASE}/chat/completions`, { method: "POST", body: "{}" });   return new Response(r.body);
  • Network accessline 3
    const r = await fetch(`${OPENAI_BASE}/chat/completions`, { method: "POST", body: "{}" });

skills/unthrottled-route-check/tests/fixtures/mw/app/api/chat/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/mw/middleware.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/mwlookahead/app/api/chat/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/mwlookahead/middleware.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/mwpages/app/api/chat/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/mwpages/middleware.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/noise/app/api/protect/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/noise/app/api/rlpath/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/noise/app/api/unused/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/noise/lib/ratelimit-docs/notes.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/safe/app/api/chat/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/safe/app/api/checkout/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/safe/lib/rate-limit.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/vuln/app/api/chat/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/vuln/app/api/checkout/route.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 2
    [Credential-related source omitted]

skills/unthrottled-route-check/tests/fixtures/vuln/app/api/ok-comment/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/vuln/app/api/summarize/route.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/vuln/lib/ai.ts

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/fixtures/vuln/pages/api/gen.js

  • Executable scriptline 1
    Executable file

skills/unthrottled-route-check/tests/scan.test.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 51
    test("stripComments keeps URLs in strings and line numbers", () => {   const s = stripComments('const u = "https://x.y"; // ratelimit\n/* limiter\n */ ok');
  • Network accessline 52
    const s = stripComments('const u = "https://x.y"; // ratelimit\n/* limiter\n */ ok');
  • Network accessline 53
    assert.ok(s.includes("https://x.y"));
  • Network accessline 162
    test("bounded regexes: limiter, import and fetch detection stay fast on pathological input", async () => {   const { hasLimiter, findAiFetch } = await import("../scripts/scan-unthrottled.mjs");   const inputs = ["import " + "{a,".repeat(60_
  • Network accessline 163
    const { hasLimiter, findAiFetch } = await import("../scripts/scan-unthrottled.mjs");   const inputs = ["import " + "{a,".repeat(60_000), "const x = ".repeat(60_000), 'import a from "./ratelimit"\n' + "a".repeat(400_000), 'const B = "https:/
  • Network accessline 164
    const inputs = ["import " + "{a,".repeat(60_000), "const x = ".repeat(60_000), 'import a from "./ratelimit"\n' + "a".repeat(400_000), 'const B = "https://api.openai.com"\n' + "fetch(new URL(".repeat(30_000)];

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Signal confidence: 54 facts

and 4 more

Works with

  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.