mirror of
https://github.com/multica-ai/multica.git
synced 2026-08-02 01:45:52 +02:00
- Add EXAMPLES section to leaf and sub help templates (gh CLI style) - Add example to attachment download command - Simplify attachment download description - Show help output when required args are missing (error first, then help) - Replace cobra.ExactArgs with custom exactArgs that prints help on failure Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/multica-ai/multica/server/internal/cli"
|
|
)
|
|
|
|
var attachmentCmd = &cobra.Command{
|
|
Use: "attachment",
|
|
Short: "Work with attachments",
|
|
}
|
|
|
|
var attachmentDownloadCmd = &cobra.Command{
|
|
Use: "download <attachment-id>",
|
|
Short: "Download an attachment to a local file",
|
|
Long: "Download an attachment by its ID to a local file.",
|
|
Example: ` # Download an image attachment to the current directory
|
|
$ multica attachment download abc123
|
|
|
|
# Download to a specific directory
|
|
$ multica attachment download abc123 -o /tmp/images`,
|
|
Args: exactArgs(1),
|
|
RunE: runAttachmentDownload,
|
|
}
|
|
|
|
func init() {
|
|
attachmentCmd.AddCommand(attachmentDownloadCmd)
|
|
|
|
attachmentDownloadCmd.Flags().StringP("output-dir", "o", ".", "Directory to save the downloaded file")
|
|
}
|
|
|
|
func runAttachmentDownload(cmd *cobra.Command, args []string) error {
|
|
client, err := newAPIClient(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
|
|
defer cancel()
|
|
|
|
// Fetch attachment metadata (includes signed download_url).
|
|
var att map[string]any
|
|
if err := client.GetJSON(ctx, "/api/attachments/"+args[0], &att); err != nil {
|
|
return fmt.Errorf("get attachment: %w", err)
|
|
}
|
|
|
|
downloadURL := strVal(att, "download_url")
|
|
if downloadURL == "" {
|
|
return fmt.Errorf("attachment has no download URL")
|
|
}
|
|
|
|
filename := filepath.Base(strVal(att, "filename"))
|
|
if filename == "" || filename == "." {
|
|
filename = args[0]
|
|
}
|
|
|
|
// Download the file content.
|
|
data, err := client.DownloadFile(ctx, downloadURL)
|
|
if err != nil {
|
|
return fmt.Errorf("download file: %w", err)
|
|
}
|
|
|
|
// Write to the output directory.
|
|
outputDir, _ := cmd.Flags().GetString("output-dir")
|
|
destPath := filepath.Join(outputDir, filename)
|
|
|
|
if err := os.WriteFile(destPath, data, 0o644); err != nil {
|
|
return fmt.Errorf("write file: %w", err)
|
|
}
|
|
|
|
// Print the absolute path so agents can reference the file.
|
|
abs, err := filepath.Abs(destPath)
|
|
if err != nil {
|
|
abs = destPath
|
|
}
|
|
fmt.Fprintln(os.Stderr, "Downloaded:", abs)
|
|
|
|
// Also print as JSON for --output json compatibility.
|
|
return cli.PrintJSON(os.Stdout, map[string]any{
|
|
"id": strVal(att, "id"),
|
|
"filename": filename,
|
|
"path": abs,
|
|
"size": strVal(att, "size_bytes"),
|
|
})
|
|
}
|