package cmd import ( "fmt" "os" "path/filepath" "strings" "cliprepo/internal/config" "cliprepo/internal/tree" "cliprepo/internal/utils" "github.com/spf13/cobra" "github.com/atotto/clipboard" ) var delineate string var useClipboard bool var runCmd = &cobra.Command{ Use: "run", Short: "Generate LLM context from repo", RunE: func(cmd *cobra.Command, args []string) error { cfg, err := config.Load() if err != nil { return err } // 1. tree treeStr, err := tree.Generate(".") if err != nil { return err } var builder strings.Builder // builder.WriteString("===== PROJECT TREE =====\n") builder.WriteString(treeStr) builder.WriteString("\n\n") // 2. preset files var patterns []string raw, ok := cfg.Preset[delineate] if !ok { return fmt.Errorf("preset not found: %s", delineate) } patterns = append(patterns, raw...) files, err := utils.ExpandGlob(patterns) if err != nil { return err } // 3. template template := cfg.Prompts.Preset for _, file := range files { content, err := os.ReadFile(file) if err != nil { continue } path := file if cfg.Config.PathMode == "absolute" { abs, _ := filepath.Abs(file) path = abs } block := strings.ReplaceAll(template, "{{path}}", path) block = strings.ReplaceAll(block, "{{content}}", string(content)) builder.WriteString(block) builder.WriteString("\n\n") } result := builder.String() if useClipboard { return clipboard.WriteAll(result) } fmt.Println(result) return nil }, } func init() { rootCmd.AddCommand(runCmd) runCmd.Flags().StringVar(&delineate, "delineate", "", "preset key") runCmd.Flags().BoolVar(&useClipboard, "clipboard", false, "copy output to clipboard") }