package app import ( "context" "fmt" "io" "strings" ) var supportedCommands = []string{"version", "run", "regenerate-artifacts", "run-stage", "analyze", "publish", "clean", "session", "config"} // Execute dispatches CLI commands and returns a process exit code. func Execute(args []string, stdout, stderr io.Writer) int { return executeWithDependencies(args, stdout, stderr, commandDependencies{}, executePlan) } func executeWithPipelineExecutor(args []string, stdout, stderr io.Writer, executor pipelineExecutor) int { return executeWithDependencies(args, stdout, stderr, commandDependencies{}, executor) } func executeWithDependencies(args []string, stdout, stderr io.Writer, deps commandDependencies, executor pipelineExecutor) int { if deps.diagnostics == nil { deps.diagnostics = stderr } deps = normalizeCommandDependencies(deps) if len(args) == 0 { printUsage(stderr) return 1 } ctx := context.Background() cmd := args[0] cmdArgs := args[1:] var err error switch cmd { case "version": err = Version(cmdArgs, stdout) case "run": err = runWithDependencies(ctx, cmdArgs, stdout, executor, deps) case "regenerate-artifacts": err = regenerateArtifactsWithDependencies(ctx, cmdArgs, stdout, executor, deps) case "run-stage": err = runStageWithDependencies(ctx, cmdArgs, stdout, executor, deps) case "analyze": err = analyzeWithDependencies(ctx, cmdArgs, stdout, executor, deps) case "publish": err = publishWithDependencies(ctx, cmdArgs, stdout, executor, deps) case "session": err = sessionWithDependencies(ctx, cmdArgs, stdout, deps) case "clean": err = cleanWithDependencies(ctx, cmdArgs, stdout, deps) case "config": err = configWithDependencies(ctx, cmdArgs, stdout, deps) default: fmt.Fprintf(stderr, "unknown command: %q\n\n", cmd) printUsage(stderr) return 1 } if err != nil { fmt.Fprintf(stderr, "%v\n", err) return 1 } return 0 } func printUsage(w io.Writer) { fmt.Fprintf(w, "Usage: narratio <%s>\n", strings.Join(supportedCommands, "|")) }