@@ -182,7 +182,6 @@ func run(cmd *cobra.Command, args []string) error {
182
182
if err := utils .EnsureConfigDirectories (); err != nil {
183
183
return fmt .Errorf ("failed to ensure config directories: %w" , err )
184
184
}
185
-
186
185
// If no arguments are provided, use the current directory
187
186
if len (args ) == 0 {
188
187
currentDir , err := os .Getwd ()
@@ -355,7 +354,6 @@ func run(cmd *cobra.Command, args []string) error {
355
354
"excluded" : excludedInfo ,
356
355
}
357
356
358
-
359
357
if err := spinner .Finish (); err != nil {
360
358
return fmt .Errorf ("failed to finish spinner: %w" , err )
361
359
}
@@ -369,13 +367,9 @@ func run(cmd *cobra.Command, args []string) error {
369
367
// Check if save is set in config or flag
370
368
autoSave , _ := cmd .Flags ().GetBool ("save" )
371
369
if cfg .AutoSave || autoSave {
372
- currentDir , err := os .Getwd ()
373
- if err != nil {
374
- return fmt .Errorf ("failed to get current directory: %w" , err )
375
- }
376
-
377
- if err := autoSaveOutput (rendered , currentDir ); err != nil {
378
- utils .PrintColouredMessage ("❌" , fmt .Sprintf ("Error saving file: %v" , err ), color .FgRed )
370
+ // Pass the output flag value to autoSaveOutput
371
+ if err := autoSaveOutput (rendered , output , args [0 ]); err != nil { // Assuming args[0] is a representative source path
372
+ utils .PrintColouredMessage ("❌" , fmt .Sprintf ("Error auto-saving file: %v" , err ), color .FgRed )
379
373
}
380
374
}
381
375
@@ -394,7 +388,13 @@ func run(cmd *cobra.Command, args []string) error {
394
388
utils .PrintColouredMessage ("❌" , fmt .Sprintf ("LLM output error: %v" , err ), color .FgRed )
395
389
}
396
390
} else {
397
- if err := handleOutput (rendered , tokens , encoding , noClipboard , output , jsonOutput , report || verbose , allFiles ); err != nil {
391
+ // If both --save and --output are used, we don't want handleOutput to write the file
392
+ // as autoSaveOutput will handle it
393
+ outputForHandleOutput := output
394
+ if (cfg .AutoSave || autoSave ) && output != "" {
395
+ outputForHandleOutput = ""
396
+ }
397
+ if err := handleOutput (rendered , tokens , encoding , noClipboard , outputForHandleOutput , jsonOutput , report || verbose , allFiles ); err != nil {
398
398
return fmt .Errorf ("failed to handle output: %w" , err )
399
399
}
400
400
}
@@ -469,24 +469,34 @@ func handleOutput(rendered string, countTokens bool, encoding string, noClipboar
469
469
}
470
470
fmt .Println (string (jsonBytes ))
471
471
} else {
472
+ outputWritten := false
473
+ if output != "" {
474
+ err := utils .WriteToFile (output , rendered )
475
+ if err != nil {
476
+ // Report the error but continue to potentially copy to clipboard or print
477
+ utils .PrintColouredMessage ("❌" , fmt .Sprintf ("Failed to write to file %s: %v" , output , err ), color .FgRed )
478
+ } else {
479
+ utils .AddMessage ("✅" , fmt .Sprintf ("Written to file: %s" , output ), color .FgGreen , 20 )
480
+ outputWritten = true
481
+ }
482
+ }
483
+
484
+ clipboardCopied := false
472
485
if ! noClipboard {
473
486
err := utils .CopyToClipboard (rendered )
474
487
if err == nil {
475
488
utils .AddMessage ("✅" , "Copied to clipboard successfully." , color .FgGreen , 5 )
476
- return nil
489
+ clipboardCopied = true
490
+ } else {
491
+ // Only show clipboard error if we didn't write to a file
492
+ if ! outputWritten {
493
+ utils .PrintColouredMessage ("⚠️" , fmt .Sprintf ("Failed to copy to clipboard: %v." , err ), color .FgYellow )
494
+ }
477
495
}
478
- // If clipboard copy failed, fall back to console output
479
- utils .PrintColouredMessage ("i" , fmt .Sprintf ("Failed to copy to clipboard: %v. Falling back to console output." , err ), color .FgYellow )
480
496
}
481
497
482
- if output != "" {
483
- err := utils .WriteToFile (output , rendered )
484
- if err != nil {
485
- return fmt .Errorf ("failed to write to file: %w" , err )
486
- }
487
- utils .AddMessage ("✅" , fmt .Sprintf ("Written to file: %s" , output ), color .FgGreen , 20 )
488
- } else {
489
- // If no output file is specified, print to console
498
+ // If neither output file was written nor clipboard was copied, print to console
499
+ if ! outputWritten && ! clipboardCopied {
490
500
fmt .Print (rendered )
491
501
}
492
502
}
@@ -727,26 +737,55 @@ func performVRAMEstimation(content string) error {
727
737
return nil
728
738
}
729
739
730
- func autoSaveOutput (content string , sourcePath string ) error {
731
- homeDir , err := os .UserHomeDir ()
732
- if err != nil {
733
- return fmt .Errorf ("failed to get user home directory: %w" , err )
740
+ // autoSaveOutput saves the content based on the combination of --save and --output flags:
741
+ // - If only --save is used, save to ~/ingest/<dirname>.md
742
+ // - If --save and --output ./somefile.md, only save to ./somefile.md
743
+ // - If --save and --output somefile.md, save to ~/ingest/somefile.md
744
+ func autoSaveOutput (content string , outputPath string , sourcePath string ) error {
745
+ var finalPath string
746
+
747
+ if outputPath != "" {
748
+ if strings .HasPrefix (outputPath , "./" ) || strings .HasPrefix (outputPath , "../" ) || filepath .IsAbs (outputPath ) {
749
+ // Case: --output starts with ./ or ../ or is absolute path
750
+ // Save only to the specified output path
751
+ absOutputPath , err := filepath .Abs (outputPath )
752
+ if err != nil {
753
+ return fmt .Errorf ("failed to get absolute path for output file %s: %w" , outputPath , err )
754
+ }
755
+ finalPath = absOutputPath
756
+ } else {
757
+ // Case: --output is just a filename
758
+ // Save to ~/ingest/ with the specified filename
759
+ homeDir , err := os .UserHomeDir ()
760
+ if err != nil {
761
+ return fmt .Errorf ("failed to get user home directory: %w" , err )
762
+ }
763
+ ingestDir := filepath .Join (homeDir , "ingest" )
764
+ finalPath = filepath .Join (ingestDir , outputPath )
765
+ }
766
+ } else {
767
+ // Default --save behavior
768
+ homeDir , err := os .UserHomeDir ()
769
+ if err != nil {
770
+ return fmt .Errorf ("failed to get user home directory: %w" , err )
771
+ }
772
+ ingestDir := filepath .Join (homeDir , "ingest" )
773
+ fileName := filepath .Base (sourcePath ) + ".md"
774
+ finalPath = filepath .Join (ingestDir , fileName )
734
775
}
735
776
736
- ingestDir := filepath .Join (homeDir , "ingest" )
737
- if err := os .MkdirAll (ingestDir , 0700 ); err != nil {
738
- return fmt .Errorf ("failed to create ingest directory: %w" , err )
777
+ // Ensure the directory for the final path exists
778
+ finalDir := filepath .Dir (finalPath )
779
+ if err := os .MkdirAll (finalDir , 0700 ); err != nil {
780
+ return fmt .Errorf ("failed to create directory %s for auto-save file: %w" , finalDir , err )
739
781
}
740
782
741
- fileName := filepath .Base (sourcePath ) + ".md"
742
- filePath := filepath .Join (ingestDir , fileName )
743
-
744
- if err := os .WriteFile (filePath , []byte (content ), 0600 ); err != nil {
745
- return fmt .Errorf ("failed to write file: %w" , err )
783
+ // Write the file using os.WriteFile
784
+ if err := os .WriteFile (finalPath , []byte (content ), 0600 ); err != nil {
785
+ return fmt .Errorf ("failed to write auto-save file to %s: %w" , finalPath , err )
746
786
}
747
787
748
- utils .AddMessage ("✅" , fmt .Sprintf ("Automatically saved to %s" , filePath ), color .FgGreen , 10 )
749
-
788
+ utils .AddMessage ("💾" , fmt .Sprintf ("Auto-saved to: %s" , finalPath ), color .FgMagenta , 15 ) // Changed icon and message slightly
750
789
return nil
751
790
}
752
791
0 commit comments