Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

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)
}