package cmd import ( "fmt" "os" "github.com/spf13/cobra" "sourcecraft.dev/bigbes/confluence-md-utilities/api" "sourcecraft.dev/bigbes/confluence-md-utilities/converter" ) var ( pullOutput string pullRaw bool ) var pullCmd = &cobra.Command{ Use: "pull ", Short: "Pull a page from Confluence and convert to Markdown", Long: `Fetch a Confluence page by URL, extract its storage format body, and convert it to Markdown. Supported URL formats: https://confluence.example.com/pages/viewpage.action?pageId=12345 https://confluence.example.com/display/SPACE/Page+Title Use --raw to get the Confluence storage XML without converting to Markdown. Authentication via --token flag or CONFLUENCE_TOKEN environment variable.`, Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { token := resolveToken() if token == "" { return fmt.Errorf("Confluence token required: use --token flag or set CONFLUENCE_TOKEN env var") } ref, err := api.ParsePageURL(args[0]) if err != nil { return err } client := api.NewClient(ref.BaseURL, token) page, err := client.GetPage(ref) if err != nil { return err } xmlBody := page.Body.Storage.Value fmt.Fprintf(os.Stderr, "Pulled page: %s (id=%s, version=%d)\n", page.Title, page.ID, page.Version.Number) var result string if pullRaw { result = xmlBody } else { result, err = converter.ConfluenceToMarkdown(xmlBody) if err != nil { return fmt.Errorf("converting to markdown: %w", err) } } if pullOutput != "" { if err := os.WriteFile(pullOutput, []byte(result), 0644); err != nil { return err } fmt.Fprintf(os.Stderr, "Written to %s\n", pullOutput) return nil } fmt.Print(result) return nil }, } func init() { pullCmd.Flags().StringVarP(&pullOutput, "output", "o", "", "Output file (default: stdout)") pullCmd.Flags().BoolVar(&pullRaw, "raw", false, "Output raw Confluence storage XML instead of Markdown") rootCmd.AddCommand(pullCmd) }