Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/planetscale

src/index.ts

132 lines · 3.3 KB · TypeScript
import configureLoop from './configure-loop.ts'
import createWebhook from './create-webhook.ts'
import draftLoop from './draft-loop.ts'
import handleWebhook from './handle-webhook.ts'
import listAnomalies from './list-anomalies.ts'
import listBranches from './list-branches.ts'
import listDatabases from './list-databases.ts'
import listOrganizations from './list-organizations.ts'
import listQueries from './list-queries.ts'
import pollAnomalies from './poll-anomalies.ts'
import request from './request.ts'
import runLoop from './run-loop.ts'
import smokeTest from './smoke-test.ts'
import { optionalString, requireRecord } from './types.ts'

type PlanetscaleAction =
	| 'overview'
	| 'smoke-test'
	| 'draft-loop'
	| 'run-loop'
	| 'configure-loop'
	| 'handle-webhook'
	| 'poll-anomalies'
	| 'create-webhook'
	| 'list-organizations'
	| 'list-databases'
	| 'list-branches'
	| 'list-anomalies'
	| 'list-queries'
	| 'request'

function overview() {
	return {
		name: '@kody/planetscale',
		communityUrl: 'https://kody.codes/@kody/planetscale',
		description:
			'Turn PlanetScale Insights anomalies into GitHub issues, implementer PRs, and a human review ping.',
		actions: [
			'smoke-test',
			'draft-loop',
			'run-loop',
			'configure-loop',
			'handle-webhook',
			'poll-anomalies',
			'create-webhook',
			'list-organizations',
			'list-databases',
			'list-branches',
			'list-anomalies',
			'list-queries',
			'request',
		],
		loop: [
			'Insights anomaly (webhook or poll)',
			'GitHub issue',
			'Cursor implementer PR',
			'Reviewer agent',
			'Human ping',
		],
	}
}

function asAction(value: string): PlanetscaleAction {
	switch (value) {
		case 'overview':
		case 'smoke-test':
		case 'draft-loop':
		case 'run-loop':
		case 'configure-loop':
		case 'handle-webhook':
		case 'poll-anomalies':
		case 'create-webhook':
		case 'list-organizations':
		case 'list-databases':
		case 'list-branches':
		case 'list-anomalies':
		case 'list-queries':
		case 'request':
			return value
		default: {
			const _never: never = value as never
			throw new Error(`Unknown action: ${String(_never)}`)
		}
	}
}

/**
 * PlanetScale Insights → GitHub issue → implementer PR → human ping.
 * @example
 * import planetscale from 'kody:@kody/planetscale'
 * await planetscale({ action: 'smoke-test' })
 */
export default async function planetscale(
	params: { action?: string } & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'planetscale')
	const action = asAction(optionalString(input.action, 'action') ?? 'overview')
	switch (action) {
		case 'overview':
			return overview()
		case 'smoke-test':
			return smokeTest(input)
		case 'draft-loop':
			return draftLoop(input)
		case 'run-loop':
			return runLoop(input)
		case 'configure-loop':
			return configureLoop(input)
		case 'handle-webhook':
			return handleWebhook(input)
		case 'poll-anomalies':
			return pollAnomalies(input)
		case 'create-webhook':
			return createWebhook(input)
		case 'list-organizations':
			return listOrganizations(input)
		case 'list-databases':
			return listDatabases(input)
		case 'list-branches':
			return listBranches(input)
		case 'list-anomalies':
			return listAnomalies(input)
		case 'list-queries':
			return listQueries(input)
		case 'request':
			return request(input)
		default: {
			const _never: never = action
			throw new Error(`Unknown action: ${String(_never)}`)
		}
	}
}