diff --git a/packages/skills-build/package.json b/packages/skills-build/package.json index b738a26..d1bff45 100644 --- a/packages/skills-build/package.json +++ b/packages/skills-build/package.json @@ -1,14 +1,18 @@ { - "name": "postgres-best-practices-build", + "name": "skills-build", "version": "1.0.0", "type": "module", "author": "Supabase", "license": "MIT", "description": "Build system for Supabase agent skills", "scripts": { - "build": "tsx src/build.ts", - "validate": "tsx src/validate.ts", - "dev": "npm run validate && npm run build" + "validate": "tsx src/cli.ts validate", + "build": "tsx src/cli.ts build", + "dev": "npm run validate && npm run build", + "validate:postgres": "tsx src/cli.ts validate --skill postgres-best-practices", + "validate:supabase": "tsx src/cli.ts validate --skill supabase", + "build:postgres": "tsx src/cli.ts build --skill postgres-best-practices", + "build:supabase": "tsx src/cli.ts build --skill supabase" }, "devDependencies": { "@types/node": "^20.10.0", diff --git a/packages/skills-build/src/cli.ts b/packages/skills-build/src/cli.ts new file mode 100644 index 0000000..278bfa2 --- /dev/null +++ b/packages/skills-build/src/cli.ts @@ -0,0 +1,39 @@ +import { getAllSkillNames } from "./skills-config.js"; +import * as postgres from "./postgres/build.js"; + +const args = process.argv.slice(2); +const command = args[0]; // validate or build +const skillFlag = args.indexOf("--skill"); +const specificSkill = skillFlag !== -1 ? args[skillFlag + 1] : null; + +async function main() { + if (!command || !["validate", "build"].includes(command)) { + console.error("Usage: tsx src/cli.ts [--skill ]"); + console.error("Available skills:", getAllSkillNames().join(", ")); + process.exit(1); + } + + const skillsToProcess = specificSkill ? [specificSkill] : getAllSkillNames(); + + console.log(`Running ${command} for skills:`, skillsToProcess.join(", ")); + + for (const skillName of skillsToProcess) { + if (skillName === "postgres-best-practices") { + console.log(`\n[${skillName}] Running ${command}...`); + if (command === "build") { + await postgres.buildAgents(); + } + // TODO: Add validate support + } else if (skillName === "supabase") { + console.log(`\n[${skillName}] Skipping (not implemented yet)`); + // TODO: Implement supabase build/validate + } + } + + console.log("\n✅ Done!"); +} + +main().catch((error) => { + console.error("Error:", error); + process.exit(1); +}); diff --git a/packages/skills-build/src/skills-config.ts b/packages/skills-build/src/skills-config.ts new file mode 100644 index 0000000..9db1758 --- /dev/null +++ b/packages/skills-build/src/skills-config.ts @@ -0,0 +1,34 @@ +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import type { SkillConfig } from "./types.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const BUILD_DIR = join(__dirname, ".."); + +export const SKILLS: Record = { + "postgres-best-practices": { + name: "postgres-best-practices", + type: "rule-based", + skillDir: join(BUILD_DIR, "../skills/postgres-best-practices"), + agentsOutput: join(BUILD_DIR, "../skills/postgres-best-practices/AGENTS.md"), + metadataFile: join(BUILD_DIR, "../skills/postgres-best-practices/metadata.json"), + }, + "supabase": { + name: "supabase", + type: "reference-based", + skillDir: join(BUILD_DIR, "../skills/supabase"), + agentsOutput: join(BUILD_DIR, "../skills/supabase/AGENTS.md"), + metadataFile: join(BUILD_DIR, "../skills/supabase/metadata.json"), + }, +}; + +// Get skill config by name +export function getSkillConfig(name: string): SkillConfig | undefined { + return SKILLS[name]; +} + +// Get all skill names +export function getAllSkillNames(): string[] { + return Object.keys(SKILLS); +} diff --git a/packages/skills-build/src/types.ts b/packages/skills-build/src/types.ts index 440359b..f45ad45 100644 --- a/packages/skills-build/src/types.ts +++ b/packages/skills-build/src/types.ts @@ -57,3 +57,29 @@ export interface ValidationResult { errors: string[]; warnings: string[]; } + +// Skill configuration types +export type SkillType = "rule-based" | "reference-based"; + +export interface SkillConfig { + name: string; + type: SkillType; + skillDir: string; + agentsOutput: string; + metadataFile: string; +} + +// Reference-based skill types (for supabase) +export interface Resource { + path: string; + title: string; + content: string; + featureArea: string; + type: "hub" | "sub-resource"; +} + +export interface ReferenceParseResult { + resource: Resource | null; + errors: string[]; + warnings: string[]; +}