1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package cmd
6
7import (
8 "errors"
9 "os"
10
11 "git.secluded.site/np/cmd/g"
12 "git.secluded.site/np/cmd/t"
13 "git.secluded.site/np/internal/cli"
14 "git.secluded.site/np/internal/config"
15 "git.secluded.site/np/internal/db"
16 "git.secluded.site/np/internal/i18n"
17 "github.com/spf13/cobra"
18)
19
20var (
21 languageFlag string
22
23 rootCmd = &cobra.Command{
24 Use: "np",
25 Short: "nasin pali - task planning for LLM agents",
26 Long: `A CLI tool for guiding LLMs through structured task planning and execution`,
27 }
28)
29
30func RootCmd() *cobra.Command {
31 return rootCmd
32}
33
34func init() {
35 rootCmd.SilenceUsage = true
36 rootCmd.PersistentFlags().StringVar(&languageFlag, "lang", "", "Override language (en, tok)")
37
38 rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
39 if err := openEnvironment(); err != nil {
40 return err
41 }
42 cmd.SetContext(cli.WithEnvironment(cmd.Context(), environment))
43 return nil
44 }
45 rootCmd.PersistentPostRunE = func(cmd *cobra.Command, args []string) error {
46 return closeEnvironment()
47 }
48
49 rootCmd.AddCommand(sCmd)
50 rootCmd.AddCommand(aCmd)
51 rootCmd.AddCommand(pCmd)
52 rootCmd.AddCommand(rCmd)
53 rootCmd.AddCommand(mCmd)
54 rootCmd.AddCommand(g.GCmd)
55 rootCmd.AddCommand(t.TCmd)
56}
57
58var environment *cli.Environment
59
60func openEnvironment() error {
61 if environment != nil {
62 return nil
63 }
64
65 cfg, err := config.Load()
66 if err != nil {
67 return err
68 }
69
70 lang := resolveLanguage(cfg)
71 localizer, err := i18n.Load(lang)
72 if err != nil {
73 return err
74 }
75
76 env, err := cli.OpenEnvironment(db.Options{}, nil, cfg, localizer)
77 if err != nil {
78 return err
79 }
80 environment = env
81 return nil
82}
83
84func resolveLanguage(cfg config.Config) string {
85 if languageFlag != "" {
86 return languageFlag
87 }
88 if envLang := os.Getenv("NP_LANG"); envLang != "" {
89 return envLang
90 }
91 return cfg.UI.Language
92}
93
94func closeEnvironment() error {
95 if environment == nil {
96 return nil
97 }
98 err := environment.Close()
99 environment = nil
100 return err
101}
102
103func requireEnvironment() (*cli.Environment, error) {
104 if environment == nil {
105 return nil, errors.New("cli: environment not initialised")
106 }
107 return environment, nil
108}