GXVVTHNXT2IZPR4OB77VMU6GXFEA5TUFZ2MHMA5ASU2DSTFPLDLQC 2Y2ZW565SRONQ2UXPLX5SRP2HDFWMRF5KDXKSKVRCHBBGEGMTVIQC 7NS27QXZMVTZBK4VPMYL5IKGSTTAWR6NDG5SOVITNX44VNIRZPMAC KS7LFF6M5Y6UGBBA7G63BJRR5XS4P4R3PSZPG752NSGZ3Z6GY72QC IFVRAERTCCDICNTYTG3TX2WASB6RXQQEJWWXQMQZJSQDQ3HLE5OQC 5LMYPB2QHNVDLYCRWLOMCPY35ZKHHPYVW5XHASE66L6PJZSOCXYQC 2GJMZ6YA6OPHNS5KFFFI6POQ2BJ33SSS3NIPXYBFTJSN4BZBVEVAC fmt.Fprintf(os.Stderr, " %s import bulk --db ./db/skraak.duckdb --dataset abc123 --csv import.csv --log progress.log\n", os.Args[0])
fmt.Fprintf(os.Stderr, " %s xxhash --file recording.wav\n", os.Args[0])fmt.Fprintf(os.Stderr, " %s metadata --file recording.wav\n", os.Args[0])
package cmdimport ("encoding/json""flag""fmt""os""skraak/utils")// RunXXHash handles the "xxhash" subcommandfunc RunXXHash(args []string) {fs := flag.NewFlagSet("xxhash", flag.ExitOnError)filePath := fs.String("file", "", "Path to file (required)")fs.Usage = func() {fmt.Fprintf(os.Stderr, "Usage: skraak xxhash --file <path>\n\n")fmt.Fprintf(os.Stderr, "Compute XXH64 hash of a file (same format stored in database).\n\n")fmt.Fprintf(os.Stderr, "Options:\n")fs.PrintDefaults()fmt.Fprintf(os.Stderr, "\nExamples:\n")fmt.Fprintf(os.Stderr, " skraak xxhash --file recording.wav\n")fmt.Fprintf(os.Stderr, " skraak xxhash --file /path/to/audio.wav | jq '.hash'\n")}if err := fs.Parse(args); err != nil {os.Exit(1)}if *filePath == "" {fmt.Fprintf(os.Stderr, "Error: --file is required\n\n")fs.Usage()os.Exit(1)}// Compute hashhash, err := utils.ComputeXXH64(*filePath)if err != nil {fmt.Fprintf(os.Stderr, "Error: %v\n", err)os.Exit(1)}// Output as JSONoutput := map[string]string{"file": *filePath,"hash": hash,}enc := json.NewEncoder(os.Stdout)enc.SetIndent("", " ")enc.Encode(output)}
package cmdimport ("encoding/json""flag""fmt""os""skraak/utils")// RunMetadata handles the "metadata" subcommandfunc RunMetadata(args []string) {fs := flag.NewFlagSet("metadata", flag.ExitOnError)filePath := fs.String("file", "", "Path to WAV file (required)")fs.Usage = func() {fmt.Fprintf(os.Stderr, "Usage: skraak metadata --file <path>\n\n")fmt.Fprintf(os.Stderr, "Extract metadata from a WAV file header.\n\n")fmt.Fprintf(os.Stderr, "Options:\n")fs.PrintDefaults()fmt.Fprintf(os.Stderr, "\nExamples:\n")fmt.Fprintf(os.Stderr, " skraak metadata --file recording.wav\n")fmt.Fprintf(os.Stderr, " skraak metadata --file /path/to/audio.wav | jq '.duration_seconds'\n")}if err := fs.Parse(args); err != nil {os.Exit(1)}if *filePath == "" {fmt.Fprintf(os.Stderr, "Error: --file is required\n\n")fs.Usage()os.Exit(1)}// Parse WAV headermetadata, err := utils.ParseWAVHeader(*filePath)if err != nil {fmt.Fprintf(os.Stderr, "Error: %v\n", err)os.Exit(1)}// Output as JSONoutput := map[string]interface{}{"file": *filePath,"duration_seconds": metadata.Duration,"sample_rate": metadata.SampleRate,"channels": metadata.Channels,"bits_per_sample": metadata.BitsPerSample,}// Add optional fields if presentif metadata.Comment != "" {output["comment"] = metadata.Comment}if metadata.Artist != "" {output["artist"] = metadata.Artist}if !metadata.FileModTime.IsZero() {output["file_mod_time"] = metadata.FileModTime.Format("2006-01-02T15:04:05Z07:00")}enc := json.NewEncoder(os.Stdout)enc.SetIndent("", " ")enc.Encode(output)}
# File utilities./skraak xxhash --file recording.wav # Compute XXH64 hash (same format as DB)./skraak metadata --file recording.wav # Extract WAV metadata```### CLI Design Policy**All CLI tools MUST output JSON** for consistency and composability with Unix tools (jq, grep, etc.).```bash# JSON output allows piping to jq./skraak xxhash --file recording.wav | jq '.hash'./skraak metadata --file recording.wav | jq '.duration_seconds'# JSON output allows chaining commandsHASH=$(./skraak xxhash --file recording.wav | jq -r '.hash')DURATION=$(./skraak metadata --file recording.wav | jq -r '.duration_seconds')