// Command repair-category-prompts replaces legacy A1 / Platform Demo categories.prompt // HTML marketing formulas with aiprompts.CategoryEnhanceUserTemplate (JSON-compatible // user overlay: {{name}} {{description}} {{attrs}} {{category}} {{language}}; stores // both prompt->>'sl' and "*"). Does not touch title_template / description_template // (formulas are appended as plain-text instructions at enhance render time). // // Usage (from apps/api): // // go run ./cmd/repair-category-prompts -dry-run // go run ./cmd/repair-category-prompts -apply // // DATABASE_URL / -postgres required. Default is dry-run (count only). package main import ( "context" "encoding/json" "flag" "fmt" "log" "os" "strings" "time" "github.com/descrybe/descrybe-v2/apps/api/internal/catalog" "github.com/jackc/pgx/v5/pgxpool" ) func main() { postgresURL := flag.String("postgres", os.Getenv("DATABASE_URL"), "Postgres URL (DATABASE_URL)") dryRun := flag.Bool("dry-run", true, "count rows that would update (default true)") apply := flag.Bool("apply", false, "write updates (implies not dry-run)") flag.Parse() if strings.TrimSpace(*postgresURL) == "" { log.Fatal("-postgres / DATABASE_URL is required") } doDryRun := *dryRun if *apply { doDryRun = false } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() pg, err := pgxpool.New(ctx, *postgresURL) if err != nil { log.Fatalf("postgres: %v", err) } defer pg.Close() // Always print dry-run counts first when applying, so operators see the delta. preview, err := catalog.RepairA1DemoCategoryEnhancePrompts(ctx, pg, true) if err != nil { log.Fatalf("dry-run: %v", err) } printResult("dry-run", preview) if doDryRun { return } res, err := catalog.RepairA1DemoCategoryEnhancePrompts(ctx, pg, false) if err != nil { log.Fatalf("apply: %v", err) } printResult("apply", res) } func printResult(phase string, res catalog.RepairCategoryEnhancePromptsResult) { b, err := json.MarshalIndent(res, "", " ") if err != nil { log.Printf("%s: %+v", phase, res) return } fmt.Printf("%s:\n%s\n", phase, string(b)) }