Releases: tomaspozo/agentlink
Releases · tomaspozo/agentlink
v1.4.1
Changed
- The release script bumps both plugin manifests, the
builder.mdstamp, and the changelog in lockstep with the CLI.scripts/release.shgained a--lockstepmode (skips the confirm prompt, tolerates an empty[Unreleased]for a CLI-only release) and now also stampsagents/builder.md. The normal entry point is the CLI repo'sscripts/release.sh, which invokes this with--lockstepso both repos release at the same version.
v1.4.0
Added
- Migrations are forward-only — a new immutability rule. A migration becomes immutable the moment it is either committed to git or deployed to any environment: editing a committed migration is forbidden (fix forward with a new
db migrate), and an uncommitted migration may be edited/regenerated only after confirming with the user that it has not reached production (a prod deploy from a dirty tree can push one). Added at the decision layer inagents/builder.mdand as an authoritative section inskills/cli/references/migration_system.md; the "Fix a broken migration" / "Remove a migration" troubleshooting steps and thecliskill's manual-fix list were reconciled to gate on uncommitted-and-not-deployed instead of telling the agent to edit migration files. AGENTLINK_VERSIONstamp inagents/builder.md. Records the current version (plugin + CLI ship in lockstep, same number) and how the agent should reason about contract drift from a project'sagentlink.json(version/appliedVersion). Kept in sync by the release script.
Changed
- Prefer the project-local CLI (
pnpm exec agentlink) overnpx …@latestfor in-project work (pairs with the CLI's 1.4 devDependency pinning).agents/builder.mdand thecliskill gained a "Running the CLI" section explaining the convention and the name split — the package isagentlink-sh, the installed binary isagentlink, and barenpx agentlinkis unsafe (it resolves a different npm package when no local install exists). Swept ~230 in-project command references across the skills,README.md,rules/agentlink.mdc, and the destructive-DB hooks fromnpx agentlink-sh@latest <cmd>topnpm exec agentlink <cmd>;createand recovery commands keep@latest(no local CLI exists yet). The hooks now point users atpnpm exec agentlink db rebuild— the block matcher is invocation-prefix-agnostic, so destructive-reset blocking still fires.
v1.3.1
Added
databaseskill: "deprecate, don't delete" rule for deployed cron/storage resources. The imperative deploy step only applies files that are present and never reconciles deletions (unlikerbac/), so removing acron/orstorage/file leaves the resource live in an already-deployed DB. New rule inskills/database/SKILL.md: rename todeprecated-<name>.sql, comment out the original definition, then for cron append an idempotentcron.unschedule(jobid) FROM cron.job WHERE jobname='<name>'(the bareunschedulethrows when absent and rolls back the cron folder); for storage emit no SQL and delete the bucket from the dashboard (objects cascade), sinceDELETE FROM storage.bucketsorphans objects that keep counting against Storage usage.
v1.3.0
Added
- New
notificationsskill — the entry point for transactional / non-auth email. Teaches the builder how AgentLink sends app-driven email (welcome, "export ready", receipts, alerts) through the queue:api._admin_send_email→ PGMQ →internal-queue-worker→internal-send-email→ Resend, withpublic.internal_logs_emailfor idempotency/observability.SKILL.mdcovers the server-only send rule, the send API, the welcome sample + its confirmation-timing nuance, and cross-links auth (auth emails), cli (per-env Resend setup), edge-functions, and database.references/transactional-email.mdis the deep dive: add-an-email recipe, theinternal_logs_*convention, retry/dead-letter viaread_ct, local resend-box testing, and troubleshooting. Registered inagents/builder.md(now 7 preloaded skills);authandedge-functionsSKILLs cross-link it so non-auth email is routed to the right place. builderagent: the transactional-vs-auth email split is now spelled out at the decision layer. Two new rows in the architecture matrix (agents/builder.md) route app-driven email toapi._admin_send_email(...)→internal-send-email(notificationsskill) and Supabase Auth email to the_hook_send_email→internal-send-auth-emailhook (authskill, flagged a separate function). A new "Email: two paths, never crossed" subsection adds the originator litmus test (does your code decide to send it? → notifications; does an auth event trigger it? → auth hook), warns against routing auth email throughapi._admin_send_emailor adding auth templates to theinternal-send-emailregistry, and notes the scaffoldedwelcomeemail is deliberately a notification, not an auth hook, so it never collides with the signup confirmation.notificationsskill: migration guide for projects scaffolded before the unified email path. New section inskills/notifications/SKILL.mdfor older projects that shipped a dedicatedinternal-invite-memberedge function: recommend consolidating onto theinviteregistry entry ininternal-send-email(confirm with the user first — it removes a function and leaves an orphaned cloud deployment to delete), with exact steps (add theinvitetemplate, repoint_internal_admin_create_invitation/_resend_invitationtoapi._admin_send_email('invite', …)with nodedupe_key, delete the function + itsconfig.tomlblock,db apply/db migrate/deploy, thensupabase functions deleteon cloud). Generalizes to any bespoke per-email function; notes auth emails stay on the auth hook.
Changed
- Prescriptive docs migrated off the per-function invite pattern to the unified
api._admin_send_email('invite')→internal-send-emailpath.agents/references/recipes.md(Recipe 2),skills/auth/SKILL.md(invitation RPC row + troubleshooting),skills/auth/references/rls_patterns.md,skills/edge-functions/SKILL.md(naming table + resend link), andskills/cli/references/resend.mdno longer teach the standaloneinternal-invite-memberfunction as the canonical invite-email path.
v1.2.4
Added
- New
skills/cli/references/resend.md— the single source for Resend configuration. Covers both consumers of Resend (Auth SMTP for the built-in mailer +_hook_send_email, and the transactional edge functions likeinternal-invite-member), now that Resend is configured per cloud environment: the FROM address is the source of truth inagentlink.json(cloud.environments.<env>.resend.fromEmail, hand-editable) while the API key lives only in that env's Supabase secret store and is sticky (untouched unless--api-keyis passed). Documents the--api-key/--email/--nameflags (positionals are deprecated), the first-time all-or-nothing rule, the cross-domain--yesconfirmation, local resend-box vs cloud SMTP, recipes (change display name, rotate key, promote dev→prod), and the "email not sending" debug flow.
Changed
- Skills updated for per-env Resend.
skills/auth/SKILL.md's "Email Hooks with Resend" troubleshooting no longer keys offcheck'sresend_configured(that field was removed from the CLI — Resend is per-env now); it tells the agent to readcloud.environments.<env>.resendinagentlink.jsonand validate the env's secret store, and links to the newcli/references/resend.md.skills/cli/SKILL.mdupdates the Resend prerequisite row and reference list to point at it;skills/edge-functions/SKILL.mdcross-links it from the reference list for email-sending functions. The embeddedRESEND_API_KEY/RESEND_FROM_EMAILcomponent descriptions (cli/src/components.json, regenerated) were rewritten to the per-env / source-of-truth model.
v1.2.3
Changed
withSupabase: migrate the edge-functions docs to the new@supabase/serverauth API. The wrapper'sallowoption is deprecated in favor ofauth(allowstill works but warns and will be removed in a future major), and the auth values were renamed —'public'→'publishable'and'always'→'none'(including colon variants like'public:<name>'), with thectx.authTypefield nowctx.authMode. Updated all references acrossskills/edge-functions/(SKILL.md, references/with_supabase.md, edge_functions.md, api_key_migration.md) andrules/agentlink.mdcto useauth:and the new value names, taking care not to touch the unrelatedpublicschema. The scaffold's bundled functions only ever usedauth: "secret"/auth: "user", so generated code needed no value renames.
v1.2.2
Changed
- Document prerequisites and stop the agent from hand-creating a scaffold. Two failure modes where the agent built project files by hand instead of running the CLI. (1) No Node/npx on the machine — the
npx agentlink-sh@latestcall timed out and the agent treated the failure as a cue to create files manually. Added a Prerequisites section toREADME.mdandskills/cli/SKILL.md(Node 18+ always; Supabase CLI; Docker +psqlfor local; a Supabase account for cloud; Resend for transactional email), with an explicit⚠️ that a missingnode/npxmakes the command time out and is a stop-and-install signal, never a reason to scaffold by hand. (2) The Scaffold Map read as a build checklist on an unscaffolded project — added a 🛑 banner toreferences/scaffold-map.mdstating it's an inventory of what the CLI already created (noagentlink.json= unscaffolded = run the CLI, never hand-create the listed tables/RPCs/routes), and stated the precondition incli/SKILL.md's reference list. Also hardenedrules/agentlink.mdc: an unscaffolded-detection rule at the entry point (noagentlink.json→ CLI first, never hand-create) and a directory/init-ordering rule (settle location + dev env, then let the CLI create and init the directory — don'tmkdir/git init/lay out structure by hand; checknode --versionfirst).
v1.2.1
Changed
- Cursor: the always-on rule now engages AgentLink on the default agent, not just the selected
builder. In Cursor thebuilderagent is user-selectable rather than a forced default (unlike Claude Code'ssettings.jsonwiring), so a user who opens a normal chat and asks to "build an app" gets Cursor's generic agent — which asked raw frontend/backend questions instead of using AgentLink. Sincerules/agentlink.mdc(alwaysApply: true) is the only surface guaranteed to load regardless of agent selection, it's been promoted from pure architecture guardrails to also be the entry point/router: a new "Engaging AgentLink" section tells any agent to treat build/scaffold/Supabase-backend requests as AgentLink tasks (load the matching skill, scaffold only via the CLI, don't improvise a stack), and a "Building a new app" section ports the essentialbuilderbehaviors the generic agent was missing (plan-first; the blank-project kickoff — multi-tenancy / entry point + look-and-feel / product + entities → brief inAGENTS.md; ask-about-product-not-architecture; DB/deploy work via the CLI, never the Supabase connector MCP). - Scaffold guidance: the local-vs-cloud dev-env question is now on the surfaces that actually load at scaffold time. The "ask the user local Docker vs Supabase Cloud first" instruction previously lived only in
agents/builder.mdandreferences/workflows.md— neither reliably reaches the model in Cursor (no forced agent) or when onlycli/SKILL.mdis loaded.cli/SKILL.mdframed--skip-envas the unconditional "canonical path when an AGENT is doing the scaffolding", so the agent ran--skip-env -yand handed offenv add devwithout ever asking. Added a 🛑 scaffold-decision callout to the top ofcli/SKILL.md's "Scaffold a new project" section and reframed--skip-envas the cloud path after the user chose cloud (not a blanket default); added a matching "Scaffolding a new project" section torules/agentlink.mdc.
v1.2.0
Added
- Cursor-compatible plugin (same repo, dual-format). The plugin now installs in Cursor as well as Claude Code, sharing the skills,
builderagent, references, and assets verbatim. Added the Cursor-native files alongside the Claude Code ones:.cursor-plugin/plugin.json(manifest with explicitagents/skills/rules/hookspaths so Cursor doesn't auto-discover the Claude-formathooks/hooks.json),.cursor-plugin/marketplace.json, andrules/agentlink.mdc— an always-on rule carrying the core guardrails (schema isolation, RPC-first, function-naming security model, RLS-on-every-table, write-apply-migrate / never-reset,withSupabaseallowvalues). The destructive-DB guard is ported to Cursor's contract inhooks/cursor.hooks.json+hooks/block-destructive-db.cursor.sh: samedb reset/db rebuild/db push --forcematching as the Claude hook, but reading thebeforeShellExecutiontop-levelcommandand blocking via a{"permission":"deny"}JSON verdict (exit 0) instead of stderr + exit 2. Nothing existing changed behavior —claude --plugin-dir ./agentis unaffected. In Cursor thebuilderis a user-selectable agent rather than a forced default.scripts/release.shnow bumps bothplugin.jsonmanifests together so they never drift.
Changed
database+authskills: explicit workflow for cron / storage / RBAC changes, and the GRANT-vs-RBAC-permission distinction. A change tocron/,storage/, orrbac/is excluded fromdb apply's schema diff, so the skills now spell out the loop — edit the imperative file → apply it withdb apply(applies them alongside schema) or the newdb resources(those folders only) — plus a concrete "what you're changing → which file → then" table, and a 🛑 that dropping acron.schedule()/bucket/policy/RBAC row into aschemas/file silently never runs. Also disambiguates the two things called "permission": a SQL GRANT on a table/function is DDL (lives in the object's schema file, applies withdb apply), whereas the RBAC permission model (auth_verify_accesskeys + role bindings) is reference data inrbac/(applies withdb resources). Theauthskill's "add a gated capability" steps now name both apply commands.- Skills corrected for the new default
db apply/db migrate/db rebuildbehavior, then scrubbed of all under-the-hood detail. Two passes. First, docs describing the old create-only / Docker behavior were fixed:db applynow applies changes to existing objects (anALTER) directly with no Docker,db migrateneeds no Docker,db rebuildis genuine recovery (not needed to pick up a schema edit, and it never regenerates migration files),npx supabase db diffisn't used, and standalone seed DML in schema files is rejected. Second — and the bigger cleanup — every implementation detail the app-building agent doesn't act on was removed from the agent-facing docs and re-expressed as observable behavior. Out: engine/library names (pg-delta,pg-topo,pglite, "the converger", "shadow database", "declarative apply", "catalog-export", "materialize"); internal CLI function/constant names (runSQL,bootstrapCloudEnv,getApiKeys,ensureAccessToken,pickOrg,setDefaultEnvironment,MANAGED_KEYS,writeMigrationTemplates,repairMigrations); and CLI-maintainer content misplaced in app skills (themigration_system.md"Adding an Extension/Migration → editcli/src/…→ rebuild the CLI" sections — an app agent never edits CLI source).migration_system.mdwas rewritten from a maintainer deep-dive into a lean agent reference. In: the same rules and behaviors — "db applyresolves dependency order automatically", "strips surrounding quotes from identifiers" (the snake_case rule +42601), "a blanket grant gets applied after the per-function REVOKEs" (the dev/prod-divergence why), no-Docker, ALTER-aware, prod-is-migrations-only. Net: the skills describe what the commands do and what rules to follow, never the library that produces it — which also makes them staleness-proof against a future engine swap. Swept acrosscli/{SKILL.md, references/*},database/{SKILL.md, references/*},rpc/references/rpc_patterns.md,auth/{SKILL.md, references/rls_patterns.md},agents/builder.md, andrules/agentlink.mdc. - Docs are now editor-neutral — Cursor is a co-equal agent editor, not a footnote. The CLI gained an editor choice (Claude Code / Cursor / both) and never requires an agent editor on PATH to scaffold, so the skills + agent now say so.
skills/cli/SKILL.md: the Prerequisites section no longer claims the CLI "validates Claude Code is present" (it never did — that abort was removed long ago); it now states the CLI needs the Supabase CLI (+psqlfor local) and writes editor config regardless of which agent is installed. The scaffold descriptions say "configures your chosen agent editor (Claude Code and/or Cursor)".references/troubleshooting.md: replaced the stale "Claude Code not found on PATH → scaffold aborts" entry with a "plugin/skills don't show up after scaffold" entry covering both editors (Claude Code auto-installs from.claude/settings.local.jsonon first launch; Cursor needs a one-time/add-plugin tomaspozo/agentlink), and fixed the quick-reference table row.references/workflows.md: "prompt passed to Claude Code" → "to your agent".agents/builder.md: the cloud hand-off line and scaffold-completion line are editor-neutral.README.md: the wizard intro, the existing-project install section (now shows the Cursor/add-pluginpath next to the Claude Code marketplace commands), and local-dev note mention both editors. builderagent +cliskill: corrected the new-project scaffold guidance (wrong flag, folder nesting, no env choice). The "New project setup" section inagents/builder.mdand Workflow #1 inskills/cli/references/workflows.mdnow: (1) tell the agent to ask the user local-Docker vs Supabase-Cloud for the dev environment first, and pick the command accordingly (--localthe agent can run end-to-end; cloud needs browser OAuth →--skip-envthen hand offenv add dev); (2) document the.vs<name>target rule — a<name>arg always resolves to a subfolder (cwd/<name>), so when already inside the target dir use., and nevercd foo && npx … foo(it nests intofoo/foo/); (3) fix the malformednpx . --skip-envtonpx agentlink-sh@latest . --skip-env; and (4) list the real scaffold flags and call out that--no-launchdoes not exist (removed) — an unknown flag errors before anything scaffolds. Also removed the stale--no-launchrow from thecliskill's flag table (skills/cli/SKILL.md), which was the source the agent learned the dead flag from. Fixes the observed failure where the agent passed--no-launch(command errored) and then nested a project by re-running with a name from inside the target directory.databaseskill: declarative schema files are now explicitly DDL-only — no seed/data DML. Added a prominent rule (and a "Seed / default rows" row to the where-to-put-objects table) forbidding standaloneINSERT/UPDATE/DELETE/MERGE/TRUNCATEinsupabase/database/schemas/files. Such data is silently dropped by the converger (db apply/db migratediff catalog objects, not rows), and the CLI now hard-errors on it — so the skill directs seed/reference data to its proper home:supabase/seed.sql(local), a migration (prod-bound reference data), or therbac/reconcile (roles/permissions). Clarifies that DML inside a function body is fine (it's part of the function's DDL).- Plugin renamed
link→agentlink; marketplace namespace is nowtomaspozo. Install is now/plugin install agentlink@tomaspozo(the/plugin marketplace add tomaspozo/agentlinkGitHub path is unchanged). Swept the live references:settings.json(agentlink:builder), theagentlink:frontendskill cross-ref inagents/builder.md, and the README. The CLI that scaffolds projects (cli/src/claude-settings.ts) and the landing page install snippet (www/components/start-page-plugin.tsx) were updated to match — without the CLI change, newly scaffolded projects would register a plugin/marketplace name that no longer resolves and silently fail to load it. - Destructive-command hook now blocks
db rebuild(the CLI'sdb resetwas removed;db rebuildis the reset). The CLI consolidateddb resetintodb rebuild—db rebuildnow runssupabase db resetinternally (replays migrations) then re-applies schema files + imperative resources, without regenerating migrations. So the hook that keeps resets user-initiated now matchesagentlink … db rebuild(in addition to a rawsupabase db reset) and points the user atnpx agentlink-sh@latest db rebuild. Thecliskill's "Database rebuild" section + the troubleshooting entries are reworded to the new reset-then-re-apply behavior (no more migration regeneration), and staledb resetcommand references across the skills are updated todb rebuild. frontend+cliskills: documented the scaffold's page-anatomy primitives and the neutral-shadcn list/picker rules. The scaffold now shipsPageHeader(page hero) + a realPageShell(page wrapper) and a curated shadcnui/set, so the skills teach the agent to compose them instead of re-inventing.frontend/SKILL.mdcorrects the Shared Components table (PageShell= wrapper,PageHeader= hero), adds a page anatomy section (PageShell → PageHeader → content; lists use shadcnTable, pickers use shadcnSelect, never a native<select>; loading usesListSkeleton, empty usesEmptyState), lists the curatedui/components, and adds the on-demand escape hatch (npx shadcn@latest add <name> --yes) as the first move for any missing primitive — never hand-roll or fall back to a native element. `references/...
v1.1.0
Added
builderagent: orchestration recipes reference (agents/references/recipes.md). Cross-cutting, end-to-end worked examples that combine the layers the architecture keeps separate —api.*RPCs, edge functions, andpg_cron+ PGMQ wired through the prebuilt admin functions. Three recipes: a scheduled outbound-HTTP "ping engine" (with a PGMQ fan-out variant), a queued side-effect (invite-member email), and a periodic third-party sync — each ending with a "what goes where" mapping back to the principles. Thedatabaseandedge-functionsskills' background-work sections link to it.cliskill: Scaffold Map reference (skills/cli/references/scaffold-map.md). A deterministic, version-matched inventory of everything a fresh scaffold ships with — every table, RPC,_auth_*/_internal_admin_*/_hook_*function, RBAC role + permission, and frontend route/hook/component — so the agent reads it instead of doing a discovery pass on a freshly scaffolded project.
Changed
database+cliskills: documented the imperative resource folders (cron/,storage/,rbac/). These three top-level folders undersupabase/database/are excluded fromdeclarative applyand from migrations, and applied imperatively by the deploy step on every env (incl. prod) — the only path that reliably reaches prod for cron jobs, storage buckets/policies, and RBAC data (pg-delta's Supabase integration filters the cron + storage schemas; RBAC is reference data). Cron files moved fromschemas/api/cron/to the top-levelcron/folder; addedstorage/guidance with the idempotency rules (cron.scheduleupserts by name; buckets viaINSERT … ON CONFLICT; policies viaDROP POLICY IF EXISTS+CREATE POLICY). Swept thedatabaseSKILL +naming_conventions, thecliSKILL +migration_system, the scaffold-map reference, and the builder recipes to the new paths. Added adb resetsection + a troubleshooting entry: a rawsupabase db resetdrops custom roles/cron/storage (migrations-only replay) — usenpx agentlink-sh db reset(resets + re-applies imperative resources) ordb applyto restore them.builderagent: the Architecture section is now a decision framework, not just a description of layers. Added a decision matrix (concern → default decision → owning skill), a Decision protocol (decide from the principles by default; confirm when the user dictates an implementation; research the Supabase docs then decide for uncovered patterns), and named the prebuilt cron/queue building blocks the agent must reuse (_internal_admin_call_edge_function,api._admin_enqueue_task, the queue lifecycle helpers,internal-queue-worker,process-stale-tasks). Reworded the discovery-phase guidance into two explicit buckets — product decisions (ask) vs. architecture & runtime mechanics (decide) — so the agent stops surfacing settled choices like "edge function vs. in-databasepg_net?" as user questions.edge-functionsskill: outbound HTTP is always an edge function, never in-databasepg_net. Added an explicit rule (with the canonicalcron → call edge fn → RPC fetch → fetch URLs → RPC writeflow) scopingpg_netto its only sanctioned use — waking an edge function via_internal_admin_call_edge_function. Thedatabaseskill's cron-file convention now points to it.builderagent: trimmed the always-loaded prompt ~40% (453 → 267 lines). Reference-grade detail that duplicated the on-demand skills — the CLI command table,check/--force-update/info/--debug/upgrading prose, the managed-files/base-snapshot mechanics, thesupabase/database/tree diagram, the schema-usage table, and the long.from()/SECURITY INVOKERcode blocks — was reduced to a rule plus a "Load the X skill" pointer (verified each is covered as well or better in the owning skill). Invariants the agent must obey even with no skill loaded (RPC-first / never.from(), never-reset / migrations-only, the prod-deploy CAN/MUST-NOT boundary, the function-prefix table, the decision framework) stay inline. Removed a redundant end-of-file "How the CLI tracks schema files" block that duplicated the Managed-files section.
Fixed
- Destructive-command hook no longer lets
npx supabase db resetthrough. The block regex was anchored such that it only matched a baresupabase db resetat the start of the command — the commonnpx supabase db reset(and any path/prefixed form) slipped past unblocked. Rewrote it to matchdb resetin every form of bothsupabaseandagentlinkinvocations (npx / path /@latestprefixes, inside&&/;/|chains), so the agent can't reset the database — directly or via the newagentlink db resetwrapper — without the user. The block message now points the user atnpx agentlink-sh@latest db reset(which also restores the imperative resources a raw reset drops).