Skip to content

feat(cfl)!: explicit search scope, strict limits, implement page view --full - #462

Closed
rianjs wants to merge 6 commits into
455-cfl-body-formatfrom
455-cfl-search
Closed

feat(cfl)!: explicit search scope, strict limits, implement page view --full#462
rianjs wants to merge 6 commits into
455-cfl-body-formatfrom
455-cfl-search

Conversation

@rianjs

@rianjs rianjs commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Implements items 6, 8, and 9 of #455. Stacked on #459; will retarget as bases merge.

  • page view --full now emits the extended metadata promised by the output contract (parent ID, creation time, author ID where available), composes with --body-format, and --full --content-only is rejected before network access. Commands with no defined full projection now reject --full instead of silently ignoring it.
  • Search no longer applies configured default_space implicitly; --space scopes explicitly. Raw --cql is mutually exclusive with the positional query and all query-builder filters — conflicts are rejected before config/network instead of silently dropped.
  • Limit validation: attachment list --limit and search --limit both reject zero and negative values before API-client construction (previously silent coercion to 25 and short-circuit-to-empty respectively).

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: a1c76779d6e8
Profile: claude-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
go:implementation-tests 2
policies:conventions 2
structure:repo-health 0
documentation:docs 2
go:implementation-tests (2 findings)

Minor - tools/cfl/internal/cmd/page/view_test.go:164

The PR adds both --full --content-only and --full --web rejections in the cobra Args validator (view.go:88-93), which means both run before PersistentPreRunE loads config. TestView_FullContentOnlyFailsBeforeConfig pins the pre-config contract for the --full --content-only case via rootCmd.Execute() with a missing config path. There is no analogous integration test for --full --web. The behavior is correct — Args runs before PersistentPreRunE and therefore before config load — but only half the new contract is pinned by a cobra-level pre-config test. Add a parallel TestView_FullWebFailsBeforeConfig that passes --full --web to rootCmd.Execute() with a missing config path and asserts both the error text and that no config error appears, matching the pattern already established at line 164.

Nits - tools/cfl/api/search_test.go:118

TestClient_Search_RawCQLConflicts is the only new test in this file that omits t.Parallel() at both the outer level and in each subtest. The subtests use only an empty &Client{} (no network), so there is no correctness concern, but the inconsistency with every other test in the file (TestClient_Search_Success, TestClient_Search_EmptyResults, TestClient_Search_Pagination, the TestBuildCQL_* suite, etc.) makes the omission look unintentional. Add t.Parallel() to the outer function and to each subtest closure.

policies:conventions (2 findings)

Minor - tools/cfl/internal/cmd/OUTPUT_SPEC.md:209

The flag-specific behavior section documents --full's incompatibilities but omits the --content-only + --web rejection that view.go enforces (lines 127-130). The output contract should be self-consistent: any flag interaction that the code rejects before network access belongs here.

Add one bullet under the existing --full incompatibility line:

- `--content-only` is incompatible with `--web` (web opens a browser and emits no body text).

Minor - tools/cfl/README.md:286

--full is registered as a root PersistentFlag and applies to six commands (page list, page view, space list, space view, attachment list, search), but it is absent from the Global Flags table (lines 182-191). A user reading that section has no way to discover the flag; they would only find it buried as a prose note under cfl page view. Add a row to the Global Flags table, e.g.:

| `--full` | | `false` | Inspection-oriented output; supported on view, list, and search commands |

This keeps the table the authoritative surface for flags that are globally registered, consistent with how --no-color and --output are documented there.

documentation:docs (2 findings)

Major - skills/Confluence/CliReference.md:27

The Global Flags table lists json as a valid value for -o/--output FORMAT (table (default), json, plain), but resource -o json was removed in #392. OUTPUT_SPEC.md now mandates that invalid output format: "json" is a hard error, and tools/cfl/README.md (also changed in this PR) correctly shows only table and plain. Two additional stale spots in this same file repeat the same incorrect claim: line 51 lists cfl page view PAGE_ID -o json as a working command with description "Full JSON output", and lines 207-209 in the Output section tell users to "Use -o json for machine-readable output" for scripting. All three will produce an immediate CLI error. Fix: remove json from the flag description on line 27, drop the -o json row from the page-view table, and replace the scripting guidance with -o plain (TSV) or a note that JSON output was removed and the alternative is parsing the stable plain/table columns.

Minor - tools/cfl/README.md:286

go install github.com/open-cli-collective/confluence-cli/cmd/cfl@latest points at the old archived single-tool repo, which no longer receives releases. Anyone following this instruction installs a stale binary and will miss all changes shipped after the consolidation. The correct install path in the monorepo is github.com/open-cli-collective/atlassian-cli/tools/cfl/cmd/cfl@latest (assuming the submodule is independently versioned), or if go install is not supported for this workspace submodule, the snippet should be replaced with the Homebrew or binary-download approach with a note that source installs should use make build-cfl from a clone.

Reviewer Coverage

Reviewer Status Inspected Skipped Constraints
go:implementation-tests complete_broad tools/cfl/api/pages.go, tools/cfl/api/pages_test.go, tools/cfl/api/search.go, tools/cfl/api/search_test.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/attachment/list_test.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/page/view_test.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/root/root_test.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/cmd/search/search_test.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable unavailable
policies:conventions complete_broad README.md, docs/ARTIFACT_CONTRACT.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go unavailable Shared cli-common docs and .github automation were not available locally; reviewed against repo-local docs only.
structure:repo-health complete_broad tools/cfl/api/pages.go, tools/cfl/api/search.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable unavailable
documentation:docs complete_broad README.md, docs/ARTIFACT_CONTRACT.md, skills/Confluence/CliReference.md, skills/Confluence/SKILL.md, skills/Confluence/Workflows/ManageAttachments.md, skills/Confluence/Workflows/SearchPages.md, skills/Confluence/Workflows/ViewPage.md, tools/cfl/CHANGELOG.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md unavailable unavailable

0 PR discussion threads considered. 0 summarized; 0 resolved.


Completed in 5m 51s | ~$2.03 (est.) | claude-sonnet-4-6 | cr 0.10.259
Field Value
Model claude-sonnet-4-6
Reviewers go:implementation-tests, policies:conventions, structure:repo-health, documentation:docs
Engine claude_cli · claude-sonnet-4-6
Reviewed by cr · rianjs-bot[bot]
Duration 5m 51s wall · 12m 26s compute
Cost ~$2.03 (est.)
Tokens 31 in / 42.6k out

Per-workstream usage

Workstream Model In Out Cache read Cache create Cost Duration
orchestrator-selection claude-sonnet-4-6 4 3.0k 18.4k 20.7k ~$0.13 (est.) 53s
go:implementation-tests claude-sonnet-4-6 6 15.5k 151.0k 113.9k ~$0.70 (est.) 4m 18s
policies:conventions claude-sonnet-4-6 5 7.4k 55.3k 54.6k ~$0.33 (est.) 2m 03s
structure:repo-health claude-sonnet-4-6 7 7.7k 145.5k 49.7k ~$0.35 (est.) 2m 22s
documentation:docs claude-sonnet-4-6 5 8.0k 56.0k 60.0k ~$0.36 (est.) 2m 18s
orchestrator-rollup claude-sonnet-4-6 4 1.1k 18.4k 37.7k ~$0.16 (est.) 30s

testutil.Equal(t, "", rootOpts.Stdout.(*bytes.Buffer).String())
}

func TestView_FullContentOnlyFailsBeforeConfig(t *testing.T) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR adds both --full --content-only and --full --web rejections in the cobra Args validator (view.go:88-93), which means both run before PersistentPreRunE loads config. TestView_FullContentOnlyFailsBeforeConfig pins the pre-config contract for the --full --content-only case via rootCmd.Execute() with a missing config path. There is no analogous integration test for --full --web. The behavior is correct — Args runs before PersistentPreRunE and therefore before config load — but only half the new contract is pinned by a cobra-level pre-config test. Add a parallel TestView_FullWebFailsBeforeConfig that passes --full --web to rootCmd.Execute() with a missing config path and asserts both the error text and that no config error appears, matching the pattern already established at line 164.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added TestView_FullWebFailsBeforeConfig mirroring the content-only pre-config test: missing config path, asserts the --full/--web error text and no config error.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — the parallel pre-config regression test covers the --full --web contract as requested.

Summary:
Added cobra-level coverage confirming --full --web fails before config loading.

Comment thread tools/cfl/README.md
@@ -286,6 +286,7 @@ View a Confluence page. **Content is displayed as markdown by default.**

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

File-level note: tools/cfl/README.md

--full is registered as a root PersistentFlag and applies to six commands (page list, page view, space list, space view, attachment list, search), but it is absent from the Global Flags table (lines 182-191). A user reading that section has no way to discover the flag; they would only find it buried as a prose note under cfl page view. Add a row to the Global Flags table, e.g.:

| `--full` | | `false` | Inspection-oriented output; supported on view, list, and search commands |

This keeps the table the authoritative surface for flags that are globally registered, consistent with how --no-color and --output are documented there.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a --full row to the Global Flags table noting view/list/search support and rejection elsewhere.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed—this makes --full discoverable from the Global Flags table and documents its supported scope. Thanks.

Summary:
--full is now documented in the Global Flags table, including supported commands and rejection elsewhere.


Flag-specific behavior:
- `--content-only` emits only the body and implies untruncated output.
- `--full` is incompatible with `--content-only` and `--web` because both discard metadata.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The flag-specific behavior section documents --full's incompatibilities but omits the --content-only + --web rejection that view.go enforces (lines 127-130). The output contract should be self-consistent: any flag interaction that the code rejects before network access belongs here.

Add one bullet under the existing --full incompatibility line:

- `--content-only` is incompatible with `--web` (web opens a browser and emits no body text).

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the --content-only/--web incompatibility bullet to the flag-specific behavior list.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed—the output spec now documents the --content-only and --web incompatibility.

Summary:
Documented the rejected --content-only + --web flag combination in the output contract.

}

func TestClient_Search_RawCQLConflicts(t *testing.T) {
tests := []struct {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TestClient_Search_RawCQLConflicts is the only new test in this file that omits t.Parallel() at both the outer level and in each subtest. The subtests use only an empty &Client{} (no network), so there is no correctness concern, but the inconsistency with every other test in the file (TestClient_Search_Success, TestClient_Search_EmptyResults, TestClient_Search_Pagination, the TestBuildCQL_* suite, etc.) makes the omission look unintentional. Add t.Parallel() to the outer function and to each subtest closure.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added t.Parallel() to the outer test and each subtest closure.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing this.

Summary:
Added t.Parallel() to the outer test and each subtest closure.

Comment thread tools/cfl/README.md
@@ -286,6 +286,7 @@ View a Confluence page. **Content is displayed as markdown by default.**

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

File-level note: tools/cfl/README.md

go install github.com/open-cli-collective/confluence-cli/cmd/cfl@latest points at the old archived single-tool repo, which no longer receives releases. Anyone following this instruction installs a stale binary and will miss all changes shipped after the consolidation. The correct install path in the monorepo is github.com/open-cli-collective/atlassian-cli/tools/cfl/cmd/cfl@latest (assuming the submodule is independently versioned), or if go install is not supported for this workspace submodule, the snippet should be replaced with the Homebrew or binary-download approach with a note that source installs should use make build-cfl from a clone.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The module path is still github.com/open-cli-collective/confluence-cli, so a monorepo go install path would not resolve; replaced the snippet with clone + make build-cfl and a note steering to Homebrew, per your alternative.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for confirming. Replacing the stale go install instruction with the clone + make build-cfl path and steering users to Homebrew addresses the issue.

Summary:
Replaced the stale archived-repository go install instruction with supported clone-and-build guidance and a Homebrew recommendation.

Comment thread skills/Confluence/CliReference.md Outdated
@@ -25,7 +25,7 @@ cfl config test
| Flag | Description |
|------|-------------|
| `-o, --output FORMAT` | Output format (see SKILL.md "Output Representation and Format"): `table` (default), `json`, `plain` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Global Flags table lists json as a valid value for -o/--output FORMAT (table (default), json, plain), but resource -o json was removed in #392. OUTPUT_SPEC.md now mandates that invalid output format: "json" is a hard error, and tools/cfl/README.md (also changed in this PR) correctly shows only table and plain. Two additional stale spots in this same file repeat the same incorrect claim: line 51 lists cfl page view PAGE_ID -o json as a working command with description "Full JSON output", and lines 207-209 in the Output section tell users to "Use -o json for machine-readable output" for scripting. All three will produce an immediate CLI error. Fix: remove json from the flag description on line 27, drop the -o json row from the page-view table, and replace the scripting guidance with -o plain (TSV) or a note that JSON output was removed and the alternative is parsing the stable plain/table columns.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed json from the flag description, dropped the -o json row, and replaced the scripting guidance with -o plain (TSV) plus a pointer to --body-format adf|xhtml for exact bodies.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks—this addresses the stale JSON-output guidance.

Summary:
Removed obsolete -o json documentation and updated scripting guidance to use plain TSV output with body-format options for exact bodies.

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: 541e0ce38fae
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
go:implementation-tests 0
policies:conventions 0
documentation:docs 2
structure:repo-health 0
documentation:docs (2 findings)

Major - tools/cfl/README.md:134

The newly revised source-build instructions state that Go 1.24 is sufficient, but both go.work and tools/cfl/go.mod require Go 1.26. A reader following this path with Go 1.24 or 1.25 will fail before building. Update the prerequisite to Go 1.26 or later.

Major - tools/cfl/README.md:131

make build-cfl writes the executable to bin/cfl; it neither installs it nor adds it to PATH. The immediately following quick-start commands invoke cfl, so a source user will get command-not-found. Document invoking ./bin/cfl or add an explicit install/PATH step.

Reviewer Coverage

Reviewer Status Inspected Skipped Constraints
go:implementation-tests complete_broad tools/cfl/api/pages.go, tools/cfl/api/pages_test.go, tools/cfl/api/search.go, tools/cfl/api/search_test.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/attachment/list_test.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/page/view_test.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/root/root_test.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/cmd/search/search_test.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable Targeted Go tests could not fully run because the sandbox denies httptest local TCP listeners; root, pageview, and present packages passed before/alongside that restriction.
policies:conventions complete_broad README.md, docs/ARTIFACT_CONTRACT.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go unavailable Focused Go tests were constrained by the sandbox: root tests passed with CGO disabled, while other packages require loopback httptest listeners that the environment disallows.; Shared cli-common standards were not present locally, so review used the available repo-local development and output-contract guidance.
documentation:docs complete_broad README.md, docs/ARTIFACT_CONTRACT.md, skills/Confluence/CliReference.md, skills/Confluence/SKILL.md, skills/Confluence/Workflows/ManageAttachments.md, skills/Confluence/Workflows/SearchPages.md, skills/Confluence/Workflows/ViewPage.md, tools/cfl/CHANGELOG.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md unavailable Documentation-only review; validated changed claims against local command and build implementation. Did not perform live Confluence or external-link checks.
structure:repo-health complete_broad tools/cfl/api/pages.go, tools/cfl/api/search.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable Targeted Go tests could not complete because the sandbox disallows httptest from binding loopback ports; source and focused test coverage were inspected.

6 PR discussion threads considered. 6 summarized; 6 resolved.


Completed in 3m 31s | unavailable | gpt-5.6-terra | cr 0.10.260
Field Value
Model gpt-5.6-terra
Reviewers go:implementation-tests, policies:conventions, documentation:docs, structure:repo-health
Engine codex_cli · gpt-5.6-terra
Reviewed by cr · rianjs-bot[bot]
Duration 3m 31s wall · 6m 32s compute
Cost unavailable
Tokens 1.6M in / 16.2k out

Per-workstream usage

Workstream Model In Out Cache read Cache create Cost Duration
orchestrator-selection gpt-5.6-terra 16.9k 641 10.5k unavailable unavailable 14s
go:implementation-tests gpt-5.6-terra 529.9k 4.7k 455.2k unavailable unavailable 1m 52s
policies:conventions gpt-5.6-terra 350.9k 3.1k 294.1k unavailable unavailable 1m 24s
documentation:docs gpt-5.6-terra 306.4k 4.1k 254.7k unavailable unavailable 1m 27s
structure:repo-health gpt-5.6-terra 329.2k 3.0k 283.4k unavailable unavailable 1m 24s
orchestrator-rollup gpt-5.6-terra 36.9k 766 27.1k unavailable unavailable 7s

Comment thread tools/cfl/README.md Outdated
```

Requires Go 1.24 or later.
Requires Go 1.24 or later. (`go install` of the old `confluence-cli` module path installs a stale pre-monorepo binary; use Homebrew or a clone instead.)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The newly revised source-build instructions state that Go 1.24 is sufficient, but both go.work and tools/cfl/go.mod require Go 1.26. A reader following this path with Go 1.24 or 1.25 will fail before building. Update the prerequisite to Go 1.26 or later.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — prerequisite now says Go 1.26 or later, matching go.work and tools/cfl/go.mod.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed — the prerequisite now matches the Go 1.26 requirement. Thanks for fixing this.

Summary:
Source-build prerequisite updated to Go 1.26 or later, matching go.work and tools/cfl/go.mod.

Comment thread tools/cfl/README.md
go install github.com/open-cli-collective/confluence-cli/cmd/cfl@latest
git clone https://github.com/open-cli-collective/atlassian-cli.git
cd atlassian-cli
make build-cfl

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make build-cfl writes the executable to bin/cfl; it neither installs it nor adds it to PATH. The immediately following quick-start commands invoke cfl, so a source user will get command-not-found. Document invoking ./bin/cfl or add an explicit install/PATH step.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added ./bin/cfl --version to the snippet and documented copying bin/cfl onto PATH.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks—this addresses the issue by making the initial invocation explicit and documenting how to put cfl on PATH.

Summary:
Quick-start command availability is now documented.

rianjs added 2 commits July 17, 2026 10:27
# Conflicts:
#	tools/cfl/internal/cmd/OUTPUT_SPEC.md
#	tools/cfl/internal/cmd/page/view.go
#	tools/cfl/internal/cmd/root/root.go

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: d87e0a92d05e
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
go:implementation-tests 1
policies:conventions 1
documentation:docs 2
structure:repo-health 0
go:implementation-tests (1 finding)

Minor - tools/cfl/internal/present/detail.go:101

--full unconditionally renders Parent ID, Created At, and Author ID, converting unavailable values to -. These are optional API fields (and the PR promises author ID only where available); this also conflicts with the detail-output convention to omit absent optional fields. Root pages and responses without author/creation metadata therefore emit misleading empty labels. Append each full field only when its value is present (and timestamp non-zero), and add a presenter/view test covering omitted metadata.

policies:conventions (1 finding)

Minor - tools/cfl/README.md:194

This wording implies that every view or list command supports --full, but the root allowlist only permits page list, page view, space list, space view, attachment list, and search; for example, cfl page history list --full is rejected. Enumerate the supported command paths here (or link to the authoritative output spec) so the public flag contract does not overpromise.

documentation:docs (2 findings)

Major - skills/Confluence/Workflows/SearchPages.md:12

This workflow still directs agents to use -o json and parse a JSON envelope, but the current root command rejects resource JSON output (-o accepts only table and plain). Any scripted search following this guidance fails before executing. Replace the JSON example and the Always use -o json advice with the supported -o plain TSV output and identify the ID column for extraction.

Minor - skills/Confluence/SKILL.md:52

The new generic scripting advice says to parse ID: <id> lines, but list and search commands emit tables (or TSV with -o plain) and do not produce ID: detail lines. This can mislead agents extracting IDs from search results. Qualify this as detail-command output, and direct list/search scripting to -o plain TSV with the first column as the ID.

Reviewer Coverage

Reviewer Status Inspected Skipped Constraints
go:implementation-tests complete_broad tools/cfl/api/pages.go, tools/cfl/api/pages_test.go, tools/cfl/api/search.go, tools/cfl/api/search_test.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/attachment/list_test.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/page/view_test.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/root/root_test.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/cmd/search/search_test.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable Focused on the assigned Go implementation and behavioral tests. The targeted go test invocation was blocked by the sandbox (httptest cannot bind a listener; several packages also fail to locate a clang path containing spaces).
policies:conventions complete_broad README.md, docs/ARTIFACT_CONTRACT.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go unavailable Focused Go tests could not build because the toolchain's clang invocation fails on the workspace path containing spaces.; The optional local cli-common and shared automation documentation copies were not present.
documentation:docs complete_broad README.md, docs/ARTIFACT_CONTRACT.md, skills/Confluence/CliReference.md, skills/Confluence/SKILL.md, skills/Confluence/Workflows/ManageAttachments.md, skills/Confluence/Workflows/SearchPages.md, skills/Confluence/Workflows/ViewPage.md, tools/cfl/CHANGELOG.md, tools/cfl/README.md, tools/cfl/internal/cmd/OUTPUT_SPEC.md unavailable Documentation-only review; implementation was inspected to verify documented command behavior. External URLs were not live-checked.
structure:repo-health complete_broad tools/cfl/api/pages.go, tools/cfl/api/search.go, tools/cfl/internal/cmd/attachment/list.go, tools/cfl/internal/cmd/page/view.go, tools/cfl/internal/cmd/root/root.go, tools/cfl/internal/cmd/search/search.go, tools/cfl/internal/pageview/projection.go, tools/cfl/internal/present/detail.go unavailable Focused on assigned cross-layer files and their immediate contracts/tests. Targeted Go tests could not complete because the sandbox toolchain failed to resolve a workspace path containing spaces.

2 PR discussion threads considered. 2 summarized; 2 resolved.


Completed in 2m 43s | unavailable | gpt-5.6-terra | cr 0.10.260
Field Value
Model gpt-5.6-terra
Reviewers go:implementation-tests, policies:conventions, documentation:docs, structure:repo-health
Engine codex_cli · gpt-5.6-terra
Reviewed by cr · rianjs-bot[bot]
Duration 2m 43s wall · 6m 31s compute
Cost unavailable
Tokens 1.8M in / 17.9k out

Per-workstream usage

Workstream Model In Out Cache read Cache create Cost Duration
orchestrator-selection gpt-5.6-terra 62.1k 1.3k 46.8k unavailable unavailable 13s
go:implementation-tests gpt-5.6-terra 474.6k 4.0k 397.3k unavailable unavailable 1m 42s
policies:conventions gpt-5.6-terra 443.2k 3.9k 386.0k unavailable unavailable 1m 35s
documentation:docs gpt-5.6-terra 322.5k 3.4k 264.2k unavailable unavailable 1m 17s
structure:repo-health gpt-5.6-terra 390.0k 3.7k 340.5k unavailable unavailable 1m 35s
orchestrator-rollup gpt-5.6-terra 90.9k 1.6k 71.7k unavailable unavailable 7s

- `full` (`--full`) — inspection-oriented additions on page/space views and supported list/search commands
- **Page body format** — `--body-format markdown|adf|xhtml` on page view/create/edit. Omission means Markdown; ADF and XHTML are exact.
- **Output format** — how it's rendered: `table` (default), `plain` (`-o plain`). For scripted extraction, parse `ID: <id>` lines from command output.
- **Output format** — how it's rendered: `table` (default) or `plain` (`-o plain`). For scripted extraction, parse `ID: <id>` lines from command output.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new generic scripting advice says to parse ID: <id> lines, but list and search commands emit tables (or TSV with -o plain) and do not produce ID: detail lines. This can mislead agents extracting IDs from search results. Qualify this as detail-command output, and direct list/search scripting to -o plain TSV with the first column as the ID.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qualified the ID: guidance as detail/mutation output; list/search scripting now points at -o plain TSV with the first column as the ID.

Comment thread tools/cfl/README.md
| `--config` | `-c` | `~/.config/cfl/config.yml` | Path to config file |
| `--output` | `-o` | `table` | Output format: `table`, `plain` |
| `--no-color` | | `false` | Disable colored output |
| `--full` | | `false` | Inspection-oriented output; supported on view, list, and search commands (rejected elsewhere) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This wording implies that every view or list command supports --full, but the root allowlist only permits page list, page view, space list, space view, attachment list, and search; for example, cfl page history list --full is rejected. Enumerate the supported command paths here (or link to the authoritative output spec) so the public flag contract does not overpromise.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The --full row now enumerates the exact allowlist (page list, page view, space list, space view, attachment list, search) and notes rejection elsewhere.

}
if proj.Full {
fields = append(fields,
sharedpresent.Field{Label: "Parent ID", Value: orDash(proj.ParentID)},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--full unconditionally renders Parent ID, Created At, and Author ID, converting unavailable values to -. These are optional API fields (and the PR promises author ID only where available); this also conflicts with the detail-output convention to omit absent optional fields. Root pages and responses without author/creation metadata therefore emit misleading empty labels. Append each full field only when its value is present (and timestamp non-zero), and add a presenter/view test covering omitted metadata.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 8fbd5ad: Parent ID, Created At, and Author ID are appended only when present (timestamps non-zero), matching the omit-absent-optional-fields convention, with presenter and page-view tests for root pages and missing metadata.

@@ -12,10 +12,11 @@ Search, find, and filter Confluence pages using full-text search, CQL, or space-
| "search in SPACE" | `cfl search "query" --space KEY` | Space-scoped search |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

File-level note: skills/Confluence/Workflows/SearchPages.md

This workflow still directs agents to use -o json and parse a JSON envelope, but the current root command rejects resource JSON output (-o accepts only table and plain). Any scripted search following this guidance fails before executing. Replace the JSON example and the Always use -o json advice with the supported -o plain TSV output and identify the ID column for extraction.

Reply inline to this comment.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SearchPages.md now teaches -o plain TSV with the ID column identified; all -o json guidance is gone.

@rianjs

rianjs commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

Auto-closed when base branch 455-cfl-body-format was deleted after #459 merged. Continued in #464 (same branch, reconciled with main).

@rianjs rianjs mentioned this pull request Jul 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant