- 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>
92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var repoCmd = &cobra.Command{
|
|
Use: "repo",
|
|
Short: "Work with repositories",
|
|
}
|
|
|
|
var repoCheckoutCmd = &cobra.Command{
|
|
Use: "checkout <url>",
|
|
Short: "Check out a repository into the working directory",
|
|
Long: "Creates a git worktree from the daemon's bare clone cache. Used by agents to check out repos on demand.",
|
|
Args: exactArgs(1),
|
|
RunE: runRepoCheckout,
|
|
}
|
|
|
|
func init() {
|
|
repoCmd.AddCommand(repoCheckoutCmd)
|
|
}
|
|
|
|
func runRepoCheckout(cmd *cobra.Command, args []string) error {
|
|
repoURL := args[0]
|
|
|
|
daemonPort := os.Getenv("MULTICA_DAEMON_PORT")
|
|
if daemonPort == "" {
|
|
return fmt.Errorf("MULTICA_DAEMON_PORT not set (this command is intended to be run by an agent inside a daemon task)")
|
|
}
|
|
|
|
workspaceID := os.Getenv("MULTICA_WORKSPACE_ID")
|
|
agentName := os.Getenv("MULTICA_AGENT_NAME")
|
|
taskID := os.Getenv("MULTICA_TASK_ID")
|
|
|
|
// Use current working directory as the checkout target.
|
|
workDir, err := os.Getwd()
|
|
if err != nil {
|
|
return fmt.Errorf("get working directory: %w", err)
|
|
}
|
|
|
|
reqBody := map[string]string{
|
|
"url": repoURL,
|
|
"workspace_id": workspaceID,
|
|
"workdir": workDir,
|
|
"agent_name": agentName,
|
|
"task_id": taskID,
|
|
}
|
|
|
|
data, err := json.Marshal(reqBody)
|
|
if err != nil {
|
|
return fmt.Errorf("encode request: %w", err)
|
|
}
|
|
|
|
client := &http.Client{Timeout: 5 * time.Minute}
|
|
resp, err := client.Post(
|
|
fmt.Sprintf("http://127.0.0.1:%s/repo/checkout", daemonPort),
|
|
"application/json",
|
|
bytes.NewReader(data),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("connect to daemon: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, _ := io.ReadAll(resp.Body)
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return fmt.Errorf("checkout failed: %s", string(body))
|
|
}
|
|
|
|
var result struct {
|
|
Path string `json:"path"`
|
|
BranchName string `json:"branch_name"`
|
|
}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
return fmt.Errorf("parse response: %w", err)
|
|
}
|
|
|
|
fmt.Fprintf(os.Stdout, "%s\n", result.Path)
|
|
fmt.Fprintf(os.Stderr, "Checked out %s → %s (branch: %s)\n", repoURL, result.Path, result.BranchName)
|
|
|
|
return nil
|
|
}
|