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}