sorcery-go/cmd/gaze/main.go

122 lines
3.1 KiB
Go
Executable File

// Package main is the gaze CLI — the all-seeing eye of the Coven.
//
// Gaze answers inventory queries: file lists, tablet dumps, dependency
// trees, reverse owner lookups, and SBOM exports. It is read-only by
// design — the Warding keeps the data it inspects immutable.
package main
import (
"encoding/json"
"flag"
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
usage()
os.Exit(1)
}
switch os.Args[1] {
case "install":
install(os.Args[2:])
case "tablet":
tablet(os.Args[2:])
case "depends":
depends(os.Args[2:])
case "essence":
essence(os.Args[2:])
case "whereis":
whereis(os.Args[2:])
case "sbom":
sbom(os.Args[2:])
case "help", "-h", "--help":
usage()
default:
fmt.Fprintf(os.Stderr, "unknown subcommand: %s\n", os.Args[1])
os.Exit(2)
}
}
func usage() {
fmt.Print(`gaze — the all-seeing eye
Usage:
gaze install <spell> List every file owned by an Essence
gaze tablet <spell> Show the y/n answers stored in the Tablet
gaze depends <spell> Print the live dependency DAG
gaze essence <hash> Show which spell+config produced this blob
gaze whereis <file> Reverse lookup: which spell owns this file
gaze sbom [essence_id] Emit CycloneDX SBOM on stdout
`)
}
func install(args []string) {
fs := flag.NewFlagSet("install", flag.ExitOnError)
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "gaze install: missing spell name")
os.Exit(2)
}
fmt.Printf("📜 Files owned by %s:\n (none — spell not cast yet)\n", fs.Arg(0))
}
func tablet(args []string) {
fs := flag.NewFlagSet("tablet", flag.ExitOnError)
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "gaze tablet: missing spell name")
os.Exit(2)
}
fmt.Printf("📜 Tablet for %s: (no y/n answers recorded yet)\n", fs.Arg(0))
}
func depends(args []string) {
fs := flag.NewFlagSet("depends", flag.ExitOnError)
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "gaze depends: missing spell name")
os.Exit(2)
}
fmt.Printf("📜 Dependency tree for %s: (empty grimoire)\n", fs.Arg(0))
}
func essence(args []string) {
fs := flag.NewFlagSet("essence", flag.ExitOnError)
hashOnly := fs.Bool("hash-only", false, "print only the Merkle root")
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "gaze essence: missing essence id")
os.Exit(2)
}
if *hashOnly {
fmt.Println(fs.Arg(0))
return
}
fmt.Printf("📜 Essence %s: not found in Tomb\n", fs.Arg(0))
}
func whereis(args []string) {
fs := flag.NewFlagSet("whereis", flag.ExitOnError)
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "gaze whereis: missing file path")
os.Exit(2)
}
fmt.Printf("📜 Owner of %s: orphaned (untracked)\n", fs.Arg(0))
}
func sbom(args []string) {
fs := flag.NewFlagSet("sbom", flag.ExitOnError)
format := fs.String("format", "cyclonedx", "cyclonedx | spdx")
_ = fs.Parse(args)
out := map[string]interface{}{
"schema": "CycloneDX v1.4",
"components": []interface{}{},
"format": *format,
}
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
_ = enc.Encode(out)
}