dataset.go
package cmd
import (
"context"
"flag"
"fmt"
"skraak/tools"
)
// RunDatasetCreate creates a new dataset.
//
// JSON output schema:
//
// {
// "dataset": {
// "id": string, // Dataset ID (12 characters)
// "name": string, // Dataset name
// "description": string, // Optional description (nullable)
// "created_at": string, // Creation timestamp (RFC3339)
// "last_modified": string, // Last modification timestamp (RFC3339)
// "active": bool, // Whether the dataset is active
// "type": string // Dataset type: "structured"/"unstructured"/"test"/"train"
// },
// "message": string // Success message
// }
func RunDatasetCreate(args []string) error {
fs := flag.NewFlagSet("create dataset", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
name := fs.String("name", "", "Dataset name (required)")
dsType := fs.String("type", "structured", "Dataset type: structured (default), unstructured, test, train")
description := fs.String("description", "", "Dataset description (optional)")
fs.Usage = usagePrinter(fs,
"skraak create dataset [options]",
"Create a new dataset.",
"skraak create dataset --db ./db/skraak.duckdb --name \"My Dataset\"",
"skraak create dataset --db ./db/skraak.duckdb --name \"Training Data\" --type train --description \"For ML training\"",
)
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if err := requireFlags(fs, map[string]any{"--db": *dbPath, "--name": *name}); err != nil {
return err
}
defer initEventLog(*dbPath)()
input := tools.DatasetInput{
DBPath: *dbPath,
Name: name,
Type: dsType,
Description: description,
}
output, err := tools.CreateOrUpdateDataset(context.Background(), input)
if err != nil {
return fmt.Errorf("creating dataset: %w", err)
}
return printJSON(output)
}
// RunDatasetUpdate updates an existing dataset.
//
// JSON output schema: same as RunDatasetCreate
func RunDatasetUpdate(args []string) error {
fs := flag.NewFlagSet("update dataset", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
id := fs.String("id", "", "Dataset ID (required)")
name := fs.String("name", "", "New dataset name")
dsType := fs.String("type", "", "New dataset type: structured, unstructured, test, train")
description := fs.String("description", "", "New dataset description")
fs.Usage = usagePrinter(fs,
"skraak update dataset [options]",
"Update an existing dataset. Only provided fields are updated.",
"skraak update dataset --db ./db/skraak.duckdb --id abc123 --name \"Updated Name\"",
"skraak update dataset --db ./db/skraak.duckdb --id abc123 --type train",
)
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if err := requireFlags(fs, map[string]any{"--db": *dbPath, "--id": *id}); err != nil {
return err
}
defer initEventLog(*dbPath)()
input := tools.DatasetInput{
DBPath: *dbPath,
ID: id,
}
if *name != "" {
input.Name = name
}
if *dsType != "" {
input.Type = dsType
}
if *description != "" {
input.Description = description
}
output, err := tools.CreateOrUpdateDataset(context.Background(), input)
if err != nil {
return fmt.Errorf("updating dataset: %w", err)
}
return printJSON(output)
}