// fluxrec command-line tool. // Personal Miniflux article recommender; see README.md. package main import ( "errors" "flag" "fmt" "os" "fluxrec/cmds" "fluxrec/core" ) func main() { if len(os.Args) < 2 { printHelp() os.Exit(1) } cmdName := os.Args[1] args := os.Args[2:] if cmdName == "help" || cmdName == "--help" || cmdName == "-h" { printHelp() return } var cmd core.Command switch cmdName { case "score": cmd = &cmds.ScoreCommand{} case "export": cmd = &cmds.ExportCommand{} case "train": cmd = &cmds.TrainCommand{} case "serve": cmd = &cmds.ServeCommand{} case "retrostar": cmd = &cmds.RetrostarCommand{} default: fmt.Fprintf(os.Stderr, "Unknown command: %s\n\n", cmdName) printHelp() os.Exit(1) } if err := cmd.Init(args); err != nil { if errors.Is(err, flag.ErrHelp) { os.Exit(0) } fmt.Fprintf(os.Stderr, "Error initializing %s command: %v\n", cmdName, err) os.Exit(1) } if err := cmd.Run(os.Stdin, os.Stdout); err != nil { fmt.Fprintf(os.Stderr, "Error running %s command: %v\n", cmdName, err) os.Exit(1) } } func printHelp() { fmt.Printf(`fluxrec [arguments] Personal Miniflux article recommender (see README.md). Commands: score Score stdin titles with a trained model (debugging) export Pull starred + sampled negatives from Miniflux into labels.jsonl train Train a TF-IDF + LR model from labels.jsonl serve Poll Miniflux, score, serve recommendations RSS (server) retrostar Model-ranked candidates for retroactive starring (cold start) Usage: echo "some title" | fluxrec score --model model.json `) }