Skip to content

AGENTS.md

127 lines · 4.0 KB · Markdown
Raw

@kody/supabase — agent notes

Human setup and intent live in README.md. This file is for agents: imports, smoke/dryRun execute snippets, and edge cases. Secrets by name only — never paste PAT or service-role values. Do not enable the bundled smoke job unless the operator asks after a fork. Do not disable live webhooks or jobs.

Secrets

NamePurpose
supabasePatManagement API PAT; host api.supabase.com
supabaseServiceRoleKeyProject service role / secret key; host {projectRef}.supabase.co
supabasePat-<label> / supabaseServiceRoleKey-<label>Extra account via account, patSecretName, serviceRoleSecretName, or secretName

Import paths

ExportImport
root overview + smokekody:@kody/supabase
accountskody:@kody/supabase/accounts
setupkody:@kody/supabase/setup
smoke-testkody:@kody/supabase/smoke-test
list-projectskody:@kody/supabase/list-projects
get-projectkody:@kody/supabase/get-project
list-organizationskody:@kody/supabase/list-organizations
list-userskody:@kody/supabase/list-users
get-userkody:@kody/supabase/get-user
create-userkody:@kody/supabase/create-user
update-userkody:@kody/supabase/update-user
delete-userkody:@kody/supabase/delete-user
select-rowskody:@kody/supabase/select-rows
insert-rowskody:@kody/supabase/insert-rows
update-rowskody:@kody/supabase/update-rows
delete-rowskody:@kody/supabase/delete-rows
list-bucketskody:@kody/supabase/list-buckets
list-objectskody:@kody/supabase/list-objects
upload-objectkody:@kody/supabase/upload-object
delete-objectkody:@kody/supabase/delete-object
create-signed-urlkody:@kody/supabase/create-signed-url
requestkody:@kody/supabase/request
management-requestkody:@kody/supabase/management-request
typeskody:@kody/supabase/types

Prefer static kody:@kody/supabase/... imports from execute. Do not lead with packages.invoke.

Smoke test (read-only)

import supabase from 'kody:@kody/supabase'

export default async function main() {
	return await supabase()
	// Without credentials: { smoke: { ok: true, live: false }, setup URLs }
	// With secrets: read-only list calls — never writes
}

Or the dedicated export:

import smokeTest from 'kody:@kody/supabase/smoke-test'

export default async function main() {
	return await smokeTest()
}

dryRun / confirm

Pass dryRun: true on mutations to inspect method/path/body without calling Supabase. Live mutations also require confirm: true. Unfiltered update-rows / delete-rows need allowUnfiltered: true.

import insertRows from 'kody:@kody/supabase/insert-rows'

export default async function main() {
	return await insertRows({
		projectRef: 'yourprojectref00000',
		table: 'items',
		rows: [{ name: 'Preview only' }],
		dryRun: true,
	})
}

Read-only examples:

import listProjects from 'kody:@kody/supabase/list-projects'
import selectRows from 'kody:@kody/supabase/select-rows'

export default async function main() {
	const projects = await listProjects({ limit: 20 })
	const rows = await selectRows({
		projectRef: 'yourprojectref00000',
		table: 'items',
		select: 'id,name',
		limit: 10,
	})
	return { projects, rows }
}

Escape hatch:

import managementRequest from 'kody:@kody/supabase/management-request'

export default async function main() {
	return await managementRequest({ path: '/v1/projects' })
}

Edge cases

  • Management API base: https://api.supabase.com
  • Project API base: https://{projectRef}.supabase.co
  • PostgREST filters use operator strings such as { id: 'eq.1' }
  • ./list-users omits email and phone unless includeIdentifiers: true
  • Never hard-code a personal project ref in forks
  • Keep the smoke job enabled: false on the official listing
  • Fork/adapt: save the caller's own PAT / service-role secrets; keep dryRun / confirm / allowUnfiltered guards