Files
2026-05-16 03:57:48 +08:00

98 lines
1.8 KiB
Go

package cmd
import (
"fmt"
"os"
"path/filepath"
"sort"
"strings"
"cliprepo/internal/config"
"cliprepo/internal/resolver"
"cliprepo/internal/tree"
"github.com/atotto/clipboard"
"github.com/spf13/cobra"
)
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
}
treeStr, err := tree.Generate(".")
if err != nil {
return err
}
var builder strings.Builder
builder.WriteString(treeStr)
builder.WriteString("\n\n")
r := resolver.New(".")
raw, ok := cfg.Preset[delineate]
if !ok {
return fmt.Errorf("preset not found: %s", delineate)
}
patterns := []string(raw)
var files []string
for _, pattern := range patterns {
matches, err := r.ResolvePattern(pattern)
if err != nil {
return err
}
files = append(files, matches...)
}
files = r.Unique(files)
sort.Strings(files)
for _, file := range files {
content, err := os.ReadFile(file)
if err != nil {
continue
}
filePath := file
if cfg.Config.PathMode == "absolute" {
abs, _ := filepath.Abs(file)
filePath = abs
}
block := strings.ReplaceAll(template, "{{path}}", filePath)
block = strings.ReplaceAll(block, "{{content}}", string(content))
builder.WriteString(block)
builder.WriteString("\n\n")
}
result := builder.String()
// 6. output
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")
}