diff --git a/internal/api/confluence.go b/internal/api/confluence.go index c2fa87a..f4389bc 100644 --- a/internal/api/confluence.go +++ b/internal/api/confluence.go @@ -702,9 +702,39 @@ func (s *ConfluenceService) GetPageChildren(ctx context.Context, pageID string, return nil, err } + // v2 API returns empty Type for pages — set it explicitly + for _, child := range result.Results { + if child.Type == "" { + child.Type = "page" + } + } + return &result, nil } +// GetChildFolders gets immediate child folders of a page using CQL search. +// The v2 /pages/{id}/children endpoint only returns pages, not folders. +// This uses v1 CQL search with "parent = {id} AND type = folder" as a workaround. +// Limited to 100 results (no pagination) — sufficient for practical use. +func (s *ConfluenceService) GetChildFolders(ctx context.Context, pageID string) ([]*PageChild, error) { + cql := fmt.Sprintf("parent = %s AND type = folder", pageID) + searchResult, err := s.SearchWithCQL(ctx, cql, 100, "") + if err != nil { + return nil, err + } + + folders := make([]*PageChild, 0, len(searchResult.Results)) + for _, r := range searchResult.Results { + folders = append(folders, &PageChild{ + ID: r.ID, + Title: r.Title, + Status: r.Status, + Type: "folder", + }) + } + return folders, nil +} + // GetPageDescendants gets all descendants of a page (children, grandchildren, etc.). func (s *ConfluenceService) GetPageDescendants(ctx context.Context, pageID string, limit int, cursor string) (*ChildrenResponse, error) { path := fmt.Sprintf("%s/pages/%s/descendants", s.baseURL(), pageID) diff --git a/internal/cmd/confluence/page/children.go b/internal/cmd/confluence/page/children.go index b510190..8b70450 100644 --- a/internal/cmd/confluence/page/children.go +++ b/internal/cmd/confluence/page/children.go @@ -118,6 +118,16 @@ func runChildren(opts *ChildrenOptions) error { return fmt.Errorf("failed to get children: %w", err) } children = result.Results + + // Also fetch child folders (v2 API only returns pages, not folders) + if opts.Type == "" || opts.Type == "folder" { + folders, folderErr := confluence.GetChildFolders(ctx, opts.PageID) + if folderErr != nil { + fmt.Fprintf(opts.IO.ErrOut, "Warning: could not fetch child folders: %v\n", folderErr) + } else { + children = append(children, folders...) + } + } } if err != nil {