on main help sign in
Merge branch 'main' into uv-crush
4645157Ayman Bagabas
cmd/root.go+26
@@ -3,6 +3,7 @@ package cmd
3import (
3import (
4 "context"
4 "context"
5 "fmt"
5 "fmt"
6+ "io"
6 "os"
7 "os"
7 "sync"
8 "sync"
8 "time"
9 "time"
@@ -18,6 +19,7 @@ import (
18 "github.com/charmbracelet/crush/internal/tui"
19 "github.com/charmbracelet/crush/internal/tui"
19 "github.com/charmbracelet/crush/internal/version"
20 "github.com/charmbracelet/crush/internal/version"
20 "github.com/charmbracelet/fang"
21 "github.com/charmbracelet/fang"
22+ "github.com/charmbracelet/x/term"
21 "github.com/spf13/cobra"
23 "github.com/spf13/cobra"
22)
24)
23
25
@@ -99,6 +101,12 @@ to assist developers in writing, debugging, and understanding code directly from
99 // Initialize MCP tools early for both modes
101 // Initialize MCP tools early for both modes
100 initMCPTools(ctx, app)
102 initMCPTools(ctx, app)
101
103
104+ prompt, err = maybePrependStdin(prompt)
105+ if err != nil {
106+ logging.Error("Failed to read stdin: %v", err)
107+ return err
108+ }
109+
102 // Non-interactive mode
110 // Non-interactive mode
103 if prompt != "" {
111 if prompt != "" {
104 // Run non-interactive flow using the App method
112 // Run non-interactive flow using the App method
@@ -301,3 +309,21 @@ func init() {
301 return format.SupportedFormats, cobra.ShellCompDirectiveNoFileComp
309 return format.SupportedFormats, cobra.ShellCompDirectiveNoFileComp
302 })
310 })
303}
311}
312+
313+func maybePrependStdin(prompt string) (string, error) {
314+ if term.IsTerminal(os.Stdin.Fd()) {
315+ return prompt, nil
316+ }
317+ fi, err := os.Stdin.Stat()
318+ if err != nil {
319+ return prompt, err
320+ }
321+ if fi.Mode()&os.ModeNamedPipe == 0 {
322+ return prompt, nil
323+ }
324+ bts, err := io.ReadAll(os.Stdin)
325+ if err != nil {
326+ return prompt, err
327+ }
328+ return string(bts) + "\n\n" + prompt, nil
329+}
go.mod+2−2
@@ -20,7 +20,7 @@ require (
20 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.1
20 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.1
21 github.com/charmbracelet/fang v0.1.0
21 github.com/charmbracelet/fang v0.1.0
22 github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe
22 github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe
23− github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1.0.20250513162854-28902d027c40
23+ github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71
24 github.com/charmbracelet/x/ansi v0.9.3
24 github.com/charmbracelet/x/ansi v0.9.3
25 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c
25 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250627134340-c144409e381c
26 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a
26 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a
@@ -81,7 +81,7 @@ require (
81 github.com/charmbracelet/colorprofile v0.3.1 // indirect
81 github.com/charmbracelet/colorprofile v0.3.1 // indirect
82 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa // indirect
82 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa // indirect
83 github.com/charmbracelet/x/exp/slice v0.0.0-20250611152503-f53cdd7e01ef
83 github.com/charmbracelet/x/exp/slice v0.0.0-20250611152503-f53cdd7e01ef
84− github.com/charmbracelet/x/term v0.2.1 // indirect
84+ github.com/charmbracelet/x/term v0.2.1
85 github.com/charmbracelet/x/windows v0.2.1 // indirect
85 github.com/charmbracelet/x/windows v0.2.1 // indirect
86 github.com/davecgh/go-spew v1.1.1 // indirect
86 github.com/davecgh/go-spew v1.1.1 // indirect
87 github.com/disintegration/gift v1.1.2 // indirect
87 github.com/disintegration/gift v1.1.2 // indirect