From b0ad5089b1de33e7b2c12b8d708e1e3d20b293f4 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 3 Jul 2025 13:24:44 -0300 Subject: [PATCH] feat: read stdin (#101) * feat: read stdin Signed-off-by: Carlos Alexandro Becker * fix: mode pipe --------- Signed-off-by: Carlos Alexandro Becker --- cmd/root.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/cmd/root.go b/cmd/root.go index d741b859178e6c524b4b4e3a61863f144840812c..4ba90e0452a104c909ab0539ace93dbf07093e17 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "io" "os" "sync" "time" @@ -18,6 +19,7 @@ import ( "github.com/charmbracelet/crush/internal/tui" "github.com/charmbracelet/crush/internal/version" "github.com/charmbracelet/fang" + "github.com/charmbracelet/x/term" "github.com/spf13/cobra" ) @@ -99,6 +101,12 @@ to assist developers in writing, debugging, and understanding code directly from // Initialize MCP tools early for both modes initMCPTools(ctx, app) + prompt, err = maybePrependStdin(prompt) + if err != nil { + logging.Error("Failed to read stdin: %v", err) + return err + } + // Non-interactive mode if prompt != "" { // Run non-interactive flow using the App method @@ -301,3 +309,21 @@ func init() { return format.SupportedFormats, cobra.ShellCompDirectiveNoFileComp }) } + +func maybePrependStdin(prompt string) (string, error) { + if term.IsTerminal(os.Stdin.Fd()) { + return prompt, nil + } + fi, err := os.Stdin.Stat() + if err != nil { + return prompt, err + } + if fi.Mode()&os.ModeNamedPipe == 0 { + return prompt, nil + } + bts, err := io.ReadAll(os.Stdin) + if err != nil { + return prompt, err + } + return string(bts) + "\n\n" + prompt, nil +}