Skip to content

feat: comprehensive hint coverage across all CLI commands#900

Merged
Aureliolo merged 5 commits intomainfrom
feat/cli-hint-coverage
Mar 28, 2026
Merged

feat: comprehensive hint coverage across all CLI commands#900
Aureliolo merged 5 commits intomainfrom
feat/cli-hint-coverage

Conversation

@Aureliolo
Copy link
Copy Markdown
Owner

Summary

  • Add ~45 contextual hints across all 14 CLI command files so every config key and per-command flag is discoverable through the hint system
  • First-ever usage of HintGuidance (previously zero calls anywhere in the codebase)
  • Significantly expand HintTip coverage for auto-config suggestions
  • Add HintNextStep hints for destructive action feedback (stop --volumes, wipe --no-backup)
  • Add HintError for unhealthy backend in status command

Hint tier usage:

  • HintError: Error recovery (unhealthy backend -> run doctor)
  • HintNextStep: Natural next actions + destructive-action confirmations (always shown)
  • HintTip: Config automation suggestions like auto_pull, auto_restart (once per session in auto mode)
  • HintGuidance: Flag/feature discovery like --watch, --wide, --keep N (only in hints always mode)

Commands covered:

update, start, stop, status, logs, init, cleanup, backup, wipe, doctor, config, uninstall, version + update_cleanup (auto-cleanup helper)

Test plan

  • go -C cli build ./... -- compiles cleanly
  • go -C cli test ./... -- all tests pass
  • go -C cli vet ./... -- no issues
  • go -C cli tool golangci-lint run -- 0 issues
  • All pre-commit and pre-push hooks pass
  • Manual: run synthorg config set hints always then exercise each command to verify hints appear
  • Manual: run with hints auto to verify HintTip deduplication and HintGuidance suppression

Review coverage

Pre-reviewed by 3 agents (go-reviewer, go-conventions-enforcer, docs-consistency). 5 findings addressed:

  1. Extracted hintAfterConfigSet helper to keep runConfigSet under 50-line limit
  2. Removed redundant GetGlobalOpts+NewUIWithOptions instantiations in update.go
  3. Fixed unreachable hints in logs.go follow mode (moved before blocking composeRun)
  4. Promoted destructive-action hints to HintNextStep (stop --volumes, wipe --no-backup/--keep-images)
  5. Docs-consistency agent confirmed no documentation updates needed

🤖 Generated with Claude Code

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 28, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b87fee80-a9d8-45fe-8fd8-b171f73bbdcc

📥 Commits

Reviewing files that changed from the base of the PR and between fe1595f and c5bff6d.

📒 Files selected for processing (1)
  • cli/cmd/cleanup.go

Walkthrough

The PR adds user-facing UI hints and guidance across many CLI commands (backup, cleanup, config, doctor, init, logs, start, status, stop, uninstall, update, update_cleanup, version, wipe). It introduces new helpers (hintAfterConfigSet, hintComposeRestart, hintAfterInit), updates several functions to return status values used to conditionally emit hints, adjusts control flow where needed to emit hints after actions, and documents hint tiers in CLAUDE.md. No exported/public API signatures were changed.

Suggested labels

autorelease: tagged

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: comprehensive hint coverage across all CLI commands' directly and clearly summarizes the main change: adding contextual hints across all CLI commands for improved user guidance and discoverability.
Description check ✅ Passed The description is comprehensive and well-organized, covering the summary of changes, hint tier usage, affected commands, test plan, and review coverage—all directly related to the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 50.00% which is sufficient. The required threshold is 40.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 28, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA c5bff6d.
Ensure that dependencies are being submitted on PR branches. Re-running this action after a short time may resolve the issue. See the documentation for more information and troubleshooting advice.

Scanned Files

None

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a comprehensive set of contextual hints and guidance across the CLI commands to improve user discoverability of features and configurations. Key changes include adding tips for flags like --output, --limit, and --fix, as well as guidance on configuration settings like auto_cleanup and auto_pull. The review feedback identifies opportunities to improve code maintainability by deduplicating hint strings in the logs command and consolidating UI component instantiations in the update command.

cli/cmd/logs.go Outdated
Comment on lines +86 to +95
out.HintGuidance("Filter by service: 'synthorg logs backend'. Use --since 1h for time-based filtering.")
}

composeArgs := buildLogsArgs(strings.TrimSpace(logTail), args)
return composeRun(ctx, cmd, info, safeDir, composeArgs...)
if err := composeRun(ctx, cmd, info, safeDir, composeArgs...); err != nil {
return err
}

out.HintTip("Use -f to follow log output in real time.")
out.HintGuidance("Filter by service: 'synthorg logs backend'. Use --since 1h for time-based filtering.")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The guidance hint "Filter by service: 'synthorg logs backend'. Use --since 1h for time-based filtering." is duplicated on lines 86 and 95. To improve maintainability and avoid potential inconsistencies, consider extracting this string into a constant or a local variable at the beginning of the function.

return performRestart(ctx, out, info, safeDir, state, opts.UIOptions())
restarted, restartErr := performRestart(ctx, out, info, safeDir, state, opts.UIOptions())
if restarted {
restartOut := ui.NewUIWithOptions(out, opts.UIOptions())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

This creates a new ui.UI instance. Another instance is created on line 635 for the --no-restart case. To improve efficiency and align with the PR's goal of reducing redundant instantiations, consider creating a single ui.UI instance at the top of the restartIfRunning function and reusing it.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cli/cmd/wipe.go (1)

186-204: ⚠️ Potential issue | 🟡 Minor

manualStart also becomes true for wipe --yes.

promptStartAfterWipe() returns true without showing a prompt when prompting is disabled, so this condition also fires on successful --yes wipes. That makes the auto_start_after_wipe tip show even though the restart already happened automatically in this run.

Suggested fix
-	manualStart := startAfter && !wc.state.AutoStartAfterWipe
+	manualStart := wc.shouldPrompt() && startAfter && !wc.state.AutoStartAfterWipe
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/cmd/wipe.go` around lines 186 - 204, The current logic sets manualStart
:= startAfter && !wc.state.AutoStartAfterWipe which incorrectly stays true when
startAfter came from a non-interactive prompt (e.g. --yes) and containers were
actually restarted; change to record the user's prompt intent separately (e.g.
promptRequested := startAfter && !wc.state.AutoStartAfterWipe), attempt the
restart and track success (e.g. restarted := false; if startAfter { if err :=
wc.startContainers(); err != nil { /* handle as now */ } else { restarted = true
} }), and finally set manualStart = promptRequested && !restarted so the
auto_start_after_wipe hint only shows when the restart did not occur; reference
manualStart, startAfter, wc.startContainers(), and wc.state.AutoStartAfterWipe
when implementing.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@cli/cmd/logs.go`:
- Around line 80-97: The duplicate guidance string passed to out.HintGuidance in
logs.go should be extracted to a single shared constant (e.g., const
logsGuidance = "Filter by service: 'synthorg logs backend'. Use --since 1h for
time-based filtering.") and both call sites (the conditional when logFollow is
true and the post-composeRun call) should reference that constant instead of
hardcoding the message; add the const near the top of the file and replace both
out.HintGuidance invocations to use logsGuidance so future edits remain
consistent.

In `@cli/cmd/status.go`:
- Around line 298-300: The hint always suggests "--services" even when the user
already passed it, leading to a confusing message; modify the conditional where
out.HintGuidance is called (related to statusWide and statusServices) so the
guidance text is tailored: if !statusWide && !statusServices show "Use --wide to
show port mappings, or --services to filter by name.", if !statusWide &&
statusServices show "Use --wide to show port mappings." (use the existing
statusWide and statusServices flags and the out.HintGuidance call to select the
appropriate message).

In `@cli/cmd/update.go`:
- Line 166: The hint message shown via out.HintGuidance is self-referential when
already running in --check mode; update the call that currently prints "Use
--check for scripted update detection (exit code 10 = update available)." to
instead explain the exit-code semantics directly (e.g., state that exit code 10
indicates an update is available and other codes for no-update/error) so users
in check mode get clear guidance; locate the out.HintGuidance(...) invocation
and replace its text accordingly.

---

Outside diff comments:
In `@cli/cmd/wipe.go`:
- Around line 186-204: The current logic sets manualStart := startAfter &&
!wc.state.AutoStartAfterWipe which incorrectly stays true when startAfter came
from a non-interactive prompt (e.g. --yes) and containers were actually
restarted; change to record the user's prompt intent separately (e.g.
promptRequested := startAfter && !wc.state.AutoStartAfterWipe), attempt the
restart and track success (e.g. restarted := false; if startAfter { if err :=
wc.startContainers(); err != nil { /* handle as now */ } else { restarted = true
} }), and finally set manualStart = promptRequested && !restarted so the
auto_start_after_wipe hint only shows when the restart did not occur; reference
manualStart, startAfter, wc.startContainers(), and wc.state.AutoStartAfterWipe
when implementing.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4e08ed28-b84d-4c69-a5be-c96eea5e9637

📥 Commits

Reviewing files that changed from the base of the PR and between 8758e8d and 4ca1056.

📒 Files selected for processing (14)
  • cli/cmd/backup.go
  • cli/cmd/cleanup.go
  • cli/cmd/config.go
  • cli/cmd/doctor.go
  • cli/cmd/init.go
  • cli/cmd/logs.go
  • cli/cmd/start.go
  • cli/cmd/status.go
  • cli/cmd/stop.go
  • cli/cmd/uninstall.go
  • cli/cmd/update.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/version.go
  • cli/cmd/wipe.go
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: CLI Test (windows-latest)
  • GitHub Check: Dependency Review
  • GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (2)
cli/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Use native Go testing.F fuzz functions (Fuzz*) for property-based fuzzing tests.

Files:

  • cli/cmd/version.go
  • cli/cmd/doctor.go
  • cli/cmd/backup.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/config.go
  • cli/cmd/wipe.go
  • cli/cmd/stop.go
  • cli/cmd/cleanup.go
  • cli/cmd/init.go
  • cli/cmd/uninstall.go
  • cli/cmd/logs.go
  • cli/cmd/status.go
  • cli/cmd/start.go
  • cli/cmd/update.go
**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Use go -C cli (without cd) to run Go tooling from the project root, changing directory internally. Never use cd cli in Bash commands as it poisons the shell's working directory.

Files:

  • cli/cmd/version.go
  • cli/cmd/doctor.go
  • cli/cmd/backup.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/config.go
  • cli/cmd/wipe.go
  • cli/cmd/stop.go
  • cli/cmd/cleanup.go
  • cli/cmd/init.go
  • cli/cmd/uninstall.go
  • cli/cmd/logs.go
  • cli/cmd/status.go
  • cli/cmd/start.go
  • cli/cmd/update.go
🧠 Learnings (8)
📚 Learning: 2026-03-15T18:17:43.675Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T18:17:43.675Z
Learning: Applies to cli/** : CLI: Go 1.26+, dependencies in cli/go.mod (Cobra, charmbracelet/huh).

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/go.mod : Go CLI dependencies: Go 1.26+, Cobra (commands), charmbracelet/huh (interactive CLI), charmbracelet/lipgloss (styled output).

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Go 1.26+ required; CLI dependencies in `cli/go.mod` (Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf)

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-21T14:12:17.848Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T14:12:17.848Z
Learning: Applies to cli/go.mod : CLI uses Go 1.26+. Dependencies: Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
📚 Learning: 2026-03-28T12:42:32.168Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-28T12:42:32.168Z
Learning: Applies to cli/go.mod : Require Go 1.26+. Core dependencies: Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf. Use `go -C cli` (not `cd cli`) to run commands from project root.

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Applies to cli/**/*.go : Use Cobra for CLI command structure, charmbracelet/huh for interactive prompts, and charmbracelet/lipgloss for terminal styling

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/**/*.go : Go CLI (Go 1.26+) uses Cobra for commands, charmbracelet/huh for interactive CLI, charmbracelet/lipgloss for styled output. Cross-platform builds (linux/darwin/windows × amd64/arm64). GoReleaser for releases with cosign keyless signing of checksums.txt. SLSA L3 provenance attestations via actions/attest-build-provenance.

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-19T11:19:40.044Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:19:40.044Z
Learning: Applies to go.mod : Maintain Go 1.26+ requirement. Dependencies: Cobra (CLI framework), charmbracelet/huh and charmbracelet/lipgloss (UI), sigstore-go (code signing), go-containerregistry (container image verification), go-tuf (TUF client for Sigstore).

Applied to files:

  • cli/cmd/logs.go
🔇 Additional comments (23)
cli/cmd/update_cleanup.go (1)

89-89: Good post-action discovery hint placement.

Line 89 cleanly adds contextual guidance without altering cleanup behavior, and it stays aligned with the new HintGuidance usage model.

cli/cmd/cleanup.go (3)

83-85: Nice state-aware hint for the empty-result path.

Lines 83-85 provide actionable guidance only when auto_cleanup is disabled, which keeps the message relevant.


100-102: Clear safety guidance for --all mode.

Lines 100-102 improve operator awareness of scope and in-use removal limits at the right point in the flow.


195-197: Good contextual follow-up after successful cleanup.

Lines 195-197 provide a practical next-step hint only when removal actually happened, which is a strong UX fit.

cli/cmd/version.go (1)

28-28: Verification passed: HintGuidance method and --check flag both correctly implemented.

The HintGuidance method exists on the UI type at cli/internal/ui/ui.go:263 and correctly respects the hints configuration (returns early if hints != "always"). The update command's --check flag is properly defined at cli/cmd/update.go:55. The implementation is sound.

cli/cmd/doctor.go (1)

126-138: Hint routing here is clean and behavior-safe.

The added doctor hints improve recovery/discovery without changing execution logic or error flow.

cli/cmd/config.go (1)

300-338: Good helper extraction for post-config set guidance.

Centralizing these hints keeps runConfigSet lean and makes key-specific UX messaging easier to maintain.

cli/cmd/backup.go (1)

401-403: These backup hints are well-placed and improve command discoverability.

Nice additions for local export, list filtering, and safety-backup awareness without affecting runtime behavior.

Also applies to: 485-485, 609-609

cli/cmd/uninstall.go (1)

80-80: Post-uninstall guidance is clear and useful.

The new hints make retained-state outcomes explicit and give a concrete reinstall path.

Also applies to: 91-91, 113-113

cli/cmd/init.go (1)

106-110: Strong onboarding improvement after initialization.

The dev-channel warning and config follow-up guidance are timely and low-risk additions.

cli/cmd/start.go (1)

121-121: Great start-flow hint coverage across execution modes.

This gives users clear next actions for dry-run, foreground, no-wait, and no-pull scenarios while keeping behavior unchanged.

Also applies to: 155-155, 180-180, 188-191

cli/cmd/stop.go (1)

74-79: Good destructive-action feedback and restart guidance.

The new hints clearly distinguish preserved vs deleted persistent data and provide an immediate next command.

cli/cmd/status.go (3)

92-98: Good error propagation before post-run guidance.

This correctly preserves runStatusOnce failures and only emits guidance on success.


292-293: Helpful next-step hint for empty stack state.

The added prompt after “No containers running” is clear and actionable.


408-409: Strong unhealthy-backend recovery guidance.

The diagnostic hint is well-placed in the unhealthy branch.

cli/cmd/update.go (7)

92-94: UI initialization placement is clean and reusable.

Initializing opts/out once in runUpdate improves consistency for subsequent hint emissions.


106-106: --cli-only follow-up hint is clear.

Good discoverability for the complementary --images-only path.


110-116: Explicit error handling plus reciprocal hint looks good.

Returning early on updateComposeAndImages error and adding the complementary guidance is solid.


162-162: Good next-step hint when update is available.

This is the right hint tier and location for actionable follow-up.


239-241: Nice auto-config tip gating.

Conditioning the auto_update_cli tip on !autoAccept avoids noisy guidance for already-automated setups.


415-417: Manual-pull detection and post-action hinting are well integrated.

The manualPull flag plus post-success HintTip is coherent and keeps hints tied to successful operations.

Also applies to: 438-438, 454-460


677-683: Restart result handling and conditional tip are correctly scoped.

Capturing (restarted, restartErr) before hinting avoids false-positive tips and preserves original error flow.

cli/cmd/wipe.go (1)

170-179: Helpful outcome-specific hints.

The --keep-images next step and --no-backup warning both fit the completed wipe state and improve post-action guidance without changing the workflow.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@cli/cmd/config.go`:
- Around line 504-511: Extract the duplicate compose restart hint logic used in
runConfigSet and runConfigUnset into a shared helper (e.g.,
hintAfterComposeChange or reuse hintAfterConfigSet) that takes the State and the
hint text; move the os.Stat + config.SecurePath check (using
composeAffectingKeys and state.DataDir) into that helper and call
out.HintGuidance with the passed message ("Restart containers with 'synthorg
stop && synthorg start' to apply the new/default value."), so both runConfigSet
and runConfigUnset call the same helper instead of duplicating the
SecurePath/Stat logic.
- Around line 308-313: Add the same CodeQL-tracing comment used in
regenerateCompose before direct calls to config.SecurePath in hintAfterConfigSet
and runConfigUnset: place a line reading "// Use config.SecurePath directly so
that CodeQL can trace the sanitization for go/path-injection." immediately above
the SecurePath call(s) (the calls to config.SecurePath in hintAfterConfigSet and
in runConfigUnset) so static analysis can consistently see the sanitization.

In `@cli/cmd/doctor.go`:
- Around line 124-137: The hint "Run 'synthorg doctor' again to verify fixes."
is shown even when doctorAutoFix returns early without doing any fixes; change
doctorAutoFix to return a boolean indicating whether any fixes were performed
(e.g., func doctorAutoFix(...) (bool, error) or (bool)), update the call site in
runDoctor to capture that value, and only call out.HintGuidance("Run 'synthorg
doctor' again to verify fixes.") when the returned fixesPerformed is true; keep
existing logging/error handling behavior otherwise.

In `@cli/cmd/logs.go`:
- Around line 85-98: The code prints the same logsFilterHint twice when
logFollow is true because HintGuidance(logsFilterHint) is called both before
composeRun and after it; update the post-run section to skip the second
out.HintGuidance(logsFilterHint) when the logFollow flag is set (i.e., only call
out.HintGuidance(logsFilterHint) after composeRun if logFollow is false),
keeping the pre-run hint for follow mode and leaving HintTip unconditional.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3ad69821-494c-4fcb-a452-8898ecf72b46

📥 Commits

Reviewing files that changed from the base of the PR and between 4ca1056 and 6c93f01.

📒 Files selected for processing (10)
  • CLAUDE.md
  • cli/cmd/config.go
  • cli/cmd/doctor.go
  • cli/cmd/init.go
  • cli/cmd/logs.go
  • cli/cmd/status.go
  • cli/cmd/stop.go
  • cli/cmd/update.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/wipe.go
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: CLI Test (windows-latest)
  • GitHub Check: Dependency Review
  • GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (3)
cli/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Use native Go testing.F fuzz functions (Fuzz*) for property-based fuzzing tests.

Files:

  • cli/cmd/stop.go
  • cli/cmd/init.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/logs.go
  • cli/cmd/doctor.go
  • cli/cmd/status.go
  • cli/cmd/config.go
  • cli/cmd/update.go
  • cli/cmd/wipe.go
**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Use go -C cli (without cd) to run Go tooling from the project root, changing directory internally. Never use cd cli in Bash commands as it poisons the shell's working directory.

Files:

  • cli/cmd/stop.go
  • cli/cmd/init.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/logs.go
  • cli/cmd/doctor.go
  • cli/cmd/status.go
  • cli/cmd/config.go
  • cli/cmd/update.go
  • cli/cmd/wipe.go
**/*.md

📄 CodeRabbit inference engine (CLAUDE.md)

When a spec topic is referenced (e.g., 'the Agents page' or 'the Engine page's Crash Recovery section'), read the relevant docs/design/ page before coding. When approved deviations occur, update the relevant docs/design/ page to reflect the new reality.

Files:

  • CLAUDE.md
🧠 Learnings (8)
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Applies to cli/**/*.go : Use Cobra for CLI command structure, charmbracelet/huh for interactive prompts, and charmbracelet/lipgloss for terminal styling

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-15T18:17:43.675Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T18:17:43.675Z
Learning: Applies to cli/** : CLI: Go 1.26+, dependencies in cli/go.mod (Cobra, charmbracelet/huh).

Applied to files:

  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Go 1.26+ required; CLI dependencies in `cli/go.mod` (Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf)

Applied to files:

  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-21T14:12:17.848Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T14:12:17.848Z
Learning: Applies to cli/go.mod : CLI uses Go 1.26+. Dependencies: Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf

Applied to files:

  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-28T12:42:32.168Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-28T12:42:32.168Z
Learning: Applies to cli/go.mod : Require Go 1.26+. Core dependencies: Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf. Use `go -C cli` (not `cd cli`) to run commands from project root.

Applied to files:

  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/**/*.go : Go CLI (Go 1.26+) uses Cobra for commands, charmbracelet/huh for interactive CLI, charmbracelet/lipgloss for styled output. Cross-platform builds (linux/darwin/windows × amd64/arm64). GoReleaser for releases with cosign keyless signing of checksums.txt. SLSA L3 provenance attestations via actions/attest-build-provenance.

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/go.mod : Go CLI dependencies: Go 1.26+, Cobra (commands), charmbracelet/huh (interactive CLI), charmbracelet/lipgloss (styled output).

Applied to files:

  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-19T11:19:40.044Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:19:40.044Z
Learning: Applies to go.mod : Maintain Go 1.26+ requirement. Dependencies: Cobra (CLI framework), charmbracelet/huh and charmbracelet/lipgloss (UI), sigstore-go (code signing), go-containerregistry (container image verification), go-tuf (TUF client for Sigstore).

Applied to files:

  • cli/cmd/logs.go
🪛 GitHub Check: CodeQL
cli/cmd/config.go

[failure] 310-310: Uncontrolled data used in path expression
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.


[failure] 507-507: Uncontrolled data used in path expression
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.

🔇 Additional comments (17)
CLAUDE.md (1)

90-102: LGTM!

The hint tier documentation accurately reflects the implementation. The visibility rules align with the code in cli/internal/ui/ui.go (HintTip's session deduplication via sessionTipsSeen sync.Map, HintGuidance's hints != "always" gate). The table format is clear and will help developers choose the appropriate tier.

cli/cmd/stop.go (1)

74-79: LGTM!

The hint tier selections are appropriate:

  • HintNextStep for the restart suggestion (natural next action, always shown)
  • Warn for destructive volume removal feedback
  • HintGuidance for --volumes flag discovery (only shown in hints always mode)

The conditional logic correctly distinguishes between the two --volumes states.

cli/cmd/wipe.go (2)

172-179: LGTM!

The hint additions for destructive operations are well-placed:

  • HintNextStep for the --keep-images follow-up action is appropriate
  • HintNextStep for the --no-backup data loss warning ensures users are informed about the irreversibility

186-204: LGTM!

The manualStart logic is well-designed:

  1. Only tracks manual start decisions (when shouldPrompt() is true)
  2. Correctly suppresses the tip when restart fails (line 191)
  3. HintTip is the appropriate tier for config automation suggestions (once per session in auto mode)
cli/cmd/update_cleanup.go (1)

89-91: LGTM!

HintGuidance is the correct tier for flag discovery (--keep N). The removed > 0 guard ensures the hint only appears when relevant (after actual cleanup occurred).

cli/cmd/status.go (3)

92-98: LGTM!

Good refactor to explicit error handling. HintGuidance is the correct tier for flag discovery (--watch, --check), and it's appropriately placed on the success path only.


292-305: LGTM!

The conditional guidance correctly avoids suggesting --services when it's already in use. The tier selections are appropriate:

  • HintNextStep for the "run start" suggestion (natural next action)
  • HintGuidance for flag discovery (wide/services)

410-413: LGTM!

HintError is the correct tier for error recovery guidance, ensuring it's always visible (unless --quiet) when the backend is unhealthy.

cli/cmd/config.go (1)

304-346: Good helper extraction with appropriate hint tiers.

The hintAfterConfigSet function provides helpful context-specific guidance. The use of out.Step() for the hints key (lines 319-327) is clever — it avoids the issue where HintGuidance would be swallowed when transitioning from hints never.

The tier selections are appropriate:

  • HintGuidance for compose restart (flag/feature discovery)
  • HintGuidance for color/output/timestamps explanations
cli/cmd/init.go (1)

106-116: LGTM!

The hintAfterInit helper provides appropriate post-init guidance:

  • HintTip for the dev channel warning (shown once per session in auto mode)
  • HintGuidance for config customization discovery (only in hints always mode)

The placement after printInitSuccess ensures hints appear after the success message.

cli/cmd/doctor.go (2)

158-165: Good refactor: threading status through return values.

Returning doctorStatus from printDoctorFooter and renderDoctorSummary avoids a redundant classifyDoctor call in runDoctor. This keeps the classification logic in one place and improves efficiency.


351-381: LGTM!

The renderDoctorSummary function now cleanly returns the computed status, enabling callers to use it without re-running classification. The implementation is correct.

cli/cmd/update.go (5)

92-116: LGTM!

Creating the UI instance early allows emitting hints for both the --cli-only and --images-only paths. The reciprocal hints at Lines 106 and 114 provide useful cross-discovery between the two modes. Error propagation at Lines 110-112 is correct.


162-167: Exit-code guidance has been improved.

The hint at Line 166 now explains the exit-code semantics ("Exit code 0 means up to date; exit code 10 means an update is available") rather than suggesting --check while already in --check mode. This addresses the prior feedback about self-referential guidance.


239-241: LGTM!

The hint to enable auto_update_cli is correctly gated on !autoAccept, ensuring it only appears when the user manually confirmed the update.


438-460: LGTM!

The manualPull tracking at Line 438 correctly captures whether state.AutoPull was false before the confirmation prompt. The hint at Lines 457-459 is only shown after a successful pull that required manual confirmation—appropriate for suggesting the auto_pull config key.


633-680: LGTM!

The auto_restart hint at Lines 678-679 is correctly placed within the branch where the user explicitly confirmed the restart via the interactive prompt. This avoids showing the hint when:

  • --no-restart was used
  • state.AutoRestart is already true
  • --yes was passed (handled in the earlier branch)

The early creation of uiOut at Lines 633-634 is appropriate for the consolidated hint output.

Aureliolo and others added 4 commits March 28, 2026 15:18
Add ~45 contextual hints so every config key and per-command flag is
discoverable through the hint system. This is the first usage of
HintGuidance (previously zero calls) and significantly expands HintTip
coverage. Users with `hints always` can now learn about every feature;
`auto` mode shows the most useful tips once per session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract hintAfterConfigSet helper to keep runConfigSet under 50 lines
- Create UI instance once in runUpdate/updateContainerImages instead of
  per-hint-call instantiation
- Move follow-mode hints before composeRun in logs.go (post-run code is
  unreachable when -f blocks until Ctrl+C)
- Promote destructive-action hints (stop --volumes, wipe --no-backup,
  wipe --keep-images) to HintNextStep so they always show

Pre-reviewed by 3 agents, 5 findings addressed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mini

- Extract duplicate logs guidance string to logsFilterHint constant
- Change stop --volumes data-loss message from HintNextStep to Warn (correct tier)
- Fix hintAfterConfigSet using pre-save UI options: use Step() for hints mode
  self-description so it's visible regardless of old mode
- Guard compose restart hint on compose.yml existence (pre-init users)
- Add compose restart hint to runConfigUnset for symmetry with runConfigSet
- Fix self-referential --check guidance in update (explain exit codes directly)
- Neutral wording for --cli-only/--images-only hints (no "also" implying update)
- Extract hintAfterInit helper to keep runInit under 50-line limit
- Consolidate UI instances in restartIfRunning: single uiOut, under 50 lines
- Tailor status --services hint when user already passed --services
- Guard wipe manualStart hint on shouldPrompt() to exclude --yes mode
- Thread classifyDoctor result through printDoctorFooter/renderDoctorSummary
- Gate update_cleanup HintGuidance on removed > 0
- Document hint tier system (HintError/NextStep/Tip/Guidance) in CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…dings

- Extract hintComposeRestart helper with CodeQL-tracing comment to fix
  go/path-injection alerts on config.SecurePath calls in hintAfterConfigSet
  and runConfigUnset (both now call shared helper)
- Guard post-run logsFilterHint on !logFollow to prevent duplicate emission
- Make doctorAutoFix return bool; only show "run doctor again" when fixes ran

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Aureliolo Aureliolo force-pushed the feat/cli-hint-coverage branch from 6c93f01 to fe1595f Compare March 28, 2026 14:20
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@cli/cmd/cleanup.go`:
- Around line 83-85: Replace the hidden hint call so users see the suggestion:
in the block that checks state.AutoCleanup, change the call from
out.HintGuidance(...) to out.HintTip(...) (keep the existing message "Run
'synthorg config set auto_cleanup true' to clean up automatically after
updates.") so the auto-config suggestion is visible in default mode; locate the
check referencing state.AutoCleanup and the call to out.HintGuidance to make
this swap.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 032cc7ea-7edf-4a9e-9a46-85e3c73544f8

📥 Commits

Reviewing files that changed from the base of the PR and between 6c93f01 and fe1595f.

📒 Files selected for processing (15)
  • CLAUDE.md
  • cli/cmd/backup.go
  • cli/cmd/cleanup.go
  • cli/cmd/config.go
  • cli/cmd/doctor.go
  • cli/cmd/init.go
  • cli/cmd/logs.go
  • cli/cmd/start.go
  • cli/cmd/status.go
  • cli/cmd/stop.go
  • cli/cmd/uninstall.go
  • cli/cmd/update.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/version.go
  • cli/cmd/wipe.go
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: CLI Test (windows-latest)
  • GitHub Check: Analyze (python)
  • GitHub Check: Dependency Review
🧰 Additional context used
📓 Path-based instructions (1)
cli/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

cli/**/*.go: Use Cobra for CLI command structure; place all commands in cmd/ with global options, exit codes, and environment variable constants defined centrally
Use native Go testing.F fuzz functions for fuzzing; run fuzz targets with -fuzz=FuzzName -fuzztime=Ns flag (seed corpus runs without -fuzz flag)
Run Go tools via go -C cli (changes directory internally) -- NEVER use cd cli in Bash which poisons the working directory for subsequent commands
Run golangci-lint via go -C cli tool golangci-lint run since linter is registered as a tool in cli/go.mod

Files:

  • cli/cmd/version.go
  • cli/cmd/stop.go
  • cli/cmd/update_cleanup.go
  • cli/cmd/init.go
  • cli/cmd/backup.go
  • cli/cmd/cleanup.go
  • cli/cmd/uninstall.go
  • cli/cmd/logs.go
  • cli/cmd/wipe.go
  • cli/cmd/start.go
  • cli/cmd/status.go
  • cli/cmd/doctor.go
  • cli/cmd/config.go
  • cli/cmd/update.go
🧠 Learnings (10)
📚 Learning: 2026-03-15T18:17:43.675Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T18:17:43.675Z
Learning: Applies to cli/** : CLI: Go 1.26+, dependencies in cli/go.mod (Cobra, charmbracelet/huh).

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/go.mod : Go CLI dependencies: Go 1.26+, Cobra (commands), charmbracelet/huh (interactive CLI), charmbracelet/lipgloss (styled output).

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Version bumping (pre-1.0): `fix:` = patch, `feat:` = patch, `feat!:` = minor, `BREAKING CHANGE` trailer = minor. Update version in `pyproject.toml` (`[tool.commitizen].version`) and `src/synthorg/__init__.py` (`__version__`)

Applied to files:

  • cli/cmd/version.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Go 1.26+ required; CLI dependencies in `cli/go.mod` (Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf)

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
  • cli/cmd/update.go
📚 Learning: 2026-03-21T14:12:17.848Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T14:12:17.848Z
Learning: Applies to cli/go.mod : CLI uses Go 1.26+. Dependencies: Cobra, charmbracelet/huh, charmbracelet/lipgloss, sigstore-go, go-containerregistry, go-tuf

Applied to files:

  • cli/cmd/version.go
  • cli/cmd/logs.go
📚 Learning: 2026-03-21T12:54:22.557Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-21T12:54:22.557Z
Learning: Applies to cli/**/*.go : Use Cobra for CLI command structure, charmbracelet/huh for interactive prompts, and charmbracelet/lipgloss for terminal styling

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-28T14:16:08.138Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-28T14:16:08.138Z
Learning: Applies to cli/**/*.go : Use Cobra for CLI command structure; place all commands in `cmd/` with global options, exit codes, and environment variable constants defined centrally

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/**/*.go : Go CLI (Go 1.26+) uses Cobra for commands, charmbracelet/huh for interactive CLI, charmbracelet/lipgloss for styled output. Cross-platform builds (linux/darwin/windows × amd64/arm64). GoReleaser for releases with cosign keyless signing of checksums.txt. SLSA L3 provenance attestations via actions/attest-build-provenance.

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-19T11:19:40.044Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:19:40.044Z
Learning: Applies to go.mod : Maintain Go 1.26+ requirement. Dependencies: Cobra (CLI framework), charmbracelet/huh and charmbracelet/lipgloss (UI), sigstore-go (code signing), go-containerregistry (container image verification), go-tuf (TUF client for Sigstore).

Applied to files:

  • cli/cmd/logs.go
📚 Learning: 2026-03-15T21:49:53.264Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:49:53.264Z
Learning: Fix everything valid — never skip when review agents find valid issues (including pre-existing issues in surrounding code, suggestions, and findings adjacent to the PR's changes). No deferring, no 'out of scope' skipping.

Applied to files:

  • cli/cmd/config.go
🪛 GitHub Check: CodeQL
cli/cmd/config.go

[failure] 351-351: Uncontrolled data used in path expression
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.
This path depends on a user-provided value.

🔇 Additional comments (27)
cli/cmd/version.go (1)

28-28: Good passive guidance placement.

This keeps version --short clean while adding optional discoverability for update checks in full output mode.

cli/cmd/update_cleanup.go (1)

89-91: Conditional hint is correctly scoped.

Showing this only when removals happened avoids unnecessary output and gives useful follow-up guidance.

cli/cmd/stop.go (1)

74-79: Clear post-stop UX for destructive vs non-destructive paths.

The split messaging around --volumes is explicit and helps prevent accidental data-loss confusion.

CLAUDE.md (1)

90-102: Hint tier documentation is clear and implementation-aligned.

The visibility matrix and tier intent are explicit and easy to apply consistently across commands.

cli/cmd/cleanup.go (1)

100-102: Guidance tiers are well chosen for discoverability hints.

Both additions are feature/flag discovery hints and are appropriately non-intrusive.

Also applies to: 195-197

cli/cmd/backup.go (1)

401-403: Nice contextual hint coverage across create/list/restore paths.

These hints are well-placed and conditionally shown where they add actionable follow-up without cluttering core output.

Also applies to: 485-485, 609-609

cli/cmd/init.go (1)

106-106: Good extraction and contextual post-init guidance.

Moving this into hintAfterInit improves readability and keeps channel-specific messaging easy to evolve.

Also applies to: 110-116

cli/cmd/uninstall.go (1)

80-80: Post-uninstall guidance is clear and contextual.

The added hints improve operator clarity around preserved assets and reinstall path without altering uninstall control flow.

Also applies to: 91-91, 113-113

cli/cmd/logs.go (1)

82-100: LGTM! Hint placement correctly handles follow-mode blocking.

The conditional logic properly addresses the follow-mode scenario:

  • In follow mode (-f), the guidance hint is emitted before composeRun blocks (line 88), so users see it immediately.
  • After composeRun completes, the tip for -f is always shown (line 96), but the guidance hint is only shown when NOT in follow mode (line 97-99), avoiding duplicate emission.

This correctly implements the fix from the prior review feedback.

cli/cmd/status.go (3)

92-98: LGTM! Post-status guidance improves discoverability.

After successful status output, the guidance about --watch vs --check helps users understand the available monitoring options. The UI is correctly instantiated only after runStatusOnce succeeds.


298-304: LGTM! Hint now correctly tailors to active flags.

The conditional now avoids suggesting --services when it's already in use, addressing the prior review feedback. When statusServices is non-empty, only --wide is suggested.


412-412: LGTM! Appropriate use of HintError for unhealthy backend.

HintError is the correct tier for error recovery guidance, directing users to synthorg doctor for diagnostics when the backend is unhealthy.

cli/cmd/start.go (3)

121-122: LGTM! Clear next-step guidance after dry-run.

The HintNextStep appropriately tells users how to proceed after previewing the start operation.


154-155: LGTM! Foreground mode guidance is helpful.

Explaining that Ctrl+C stops the process and logs stream to the terminal helps users understand the blocking behavior before composeRun blocks indefinitely.


188-191: LGTM! Conditional hints for post-start context.

The monitoring tip and the --no-pull guidance are both appropriately gated by their respective conditions, providing relevant context without noise.

cli/cmd/wipe.go (2)

170-179: LGTM! Destructive-action feedback is appropriately tiered as HintNextStep.

The hints for --keep-images and --no-backup use HintNextStep as specified in the PR objectives for destructive-action feedback, ensuring they're always shown regardless of hints mode.


186-204: LGTM! Config tip logic correctly handles edge cases.

The manualStart flag is:

  1. Set when user manually confirmed restart (not auto-accepted)
  2. Cleared on restart failure (line 191) to avoid a confusing tip when containers couldn't start

This ensures the auto-config tip is only shown in the success case where it's actually actionable.

cli/cmd/config.go (3)

304-340: LGTM! Well-designed helper with correct handling of hints mode edge case.

The hintAfterConfigSet function correctly:

  1. Uses Step() instead of HintGuidance() for the hints key because the UI was created with the old hints mode—HintGuidance would be swallowed when changing from "never".
  2. Provides contextual guidance for display preference keys (color, output, timestamps).

342-354: CodeQL false positive: path is sanitized by SecurePath.

The static analysis flags line 351, but config.SecurePath at line 347 validates the path is absolute and cleans it before use. The comment explicitly documents this for CodeQL tracing. This is a known limitation where CodeQL cannot always trace sanitization through function calls.

The silent early return on SecurePath error (line 348-350) is appropriate—hint failure shouldn't break the config set operation.


512-514: LGTM! Consistent hint pattern for config unset.

Using the shared hintComposeRestart helper maintains consistency with config set and avoids code duplication, as suggested in prior review feedback.

cli/cmd/doctor.go (2)

124-139: LGTM! Conditional hints now correctly tied to doctor status.

The refactored logic addresses the prior review feedback:

  1. printDoctorFooter returns doctorStatus to avoid redundant classification calls.
  2. doctorAutoFix returns a bool indicating whether fixes were performed.
  3. The "verify fixes" hint (line 133) only shows when fixed == true.
  4. The --fix suggestion (line 138) only shows when issues exist AND --fix wasn't used.

202-262: LGTM! doctorAutoFix return values are correct.

The function returns:

  • false when healthy (line 209)
  • false when no fixable issues in selected checks (line 232)
  • needComposeFix || needRestart after attempting fixes (line 262)

This ensures the caller only shows the "verify fixes" hint when actions were actually taken.

cli/cmd/update.go (5)

92-116: LGTM! Clean separation with reciprocal hints.

The hints for --cli-only and --images-only modes provide complementary guidance, helping users who may want to run both update types separately understand how to complete the other half.


162-167: LGTM! Exit code guidance now correctly explains semantics.

Line 166 now explains the exit code meanings directly ("Exit code 0 means up to date; exit code 10 means an update is available") instead of the self-referential "Use --check..." that was flagged in the prior review.


239-241: LGTM! Config tip appropriately gated.

The auto_update_cli suggestion only appears when the user manually confirmed the update (!autoAccept), avoiding redundant suggestions when auto-accept is already configured.


438-460: LGTM! Manual pull tracking is correct.

The manualPull flag is set before the confirmation prompt (line 438), so it correctly reflects whether the user was prompted regardless of the prompt outcome. The config tip at lines 457-459 only shows on successful completion when manual intervention was required.


676-680: LGTM! Restart config tip correctly gated on success.

The auto_restart suggestion only appears when restarted is true (line 677), ensuring users only see the tip when they've manually confirmed and successfully completed a restart.

Config automation suggestions belong in HintTip (visible once per session
in auto mode), not HintGuidance (invisible in default mode).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Aureliolo Aureliolo merged commit 937974e into main Mar 28, 2026
11 of 12 checks passed
@Aureliolo Aureliolo deleted the feat/cli-hint-coverage branch March 28, 2026 14:26
Aureliolo added a commit that referenced this pull request Mar 30, 2026
🤖 I have created a release *beep* *boop*
---
#MAJOR CHANGES; We got a somewhat working webui :)

##
[0.5.0](v0.4.9...v0.5.0)
(2026-03-30)


### Features

* add analytics trends and budget forecast API endpoints
([#798](#798))
([16b61f5](16b61f5))
* add department policies to default templates
([#852](#852))
([7a41548](7a41548))
* add remaining activity event types (task_started, tool_used,
delegation, cost_incurred)
([#832](#832))
([4252fac](4252fac))
* agent performance, activity, and history API endpoints
([#811](#811))
([9b75c1d](9b75c1d))
* Agent Profiles and Detail pages (biography, career, performance)
([#874](#874))
([62d7880](62d7880))
* app shell, Storybook, and CI/CD pipeline
([#819](#819))
([d4dde90](d4dde90))
* Approvals page with risk grouping, urgency indicators, batch actions
([#889](#889))
([4e9673d](4e9673d))
* Budget Panel page (P&L dashboard, breakdown charts, forecast)
([#890](#890))
([b63b0f1](b63b0f1))
* build infrastructure layer (API client, auth, WebSocket)
([#815](#815))
([9f01d3e](9f01d3e))
* CLI global options infrastructure, UI modes, exit codes, env vars
([#891](#891))
([fef4fc5](fef4fc5))
* CodeMirror editor and theme preferences toggle
([#905](#905),
[#807](#807))
([#909](#909))
([41fbedc](41fbedc))
* Company page (department/agent management)
([#888](#888))
([cfb88b0](cfb88b0))
* comprehensive hint coverage across all CLI commands
([#900](#900))
([937974e](937974e))
* config system extensions, per-command flags for
init/start/stop/status/logs
([#895](#895))
([32f83fe](32f83fe))
* configurable currency system replacing hardcoded USD
([#854](#854))
([b372551](b372551))
* Dashboard page (metric cards, activity feed, budget burn)
([#861](#861))
([7d519d5](7d519d5))
* department health, provider status, and activity feed endpoints
([#818](#818))
([6d5f196](6d5f196))
* design tokens and core UI components
([#833](#833))
([ed887f2](ed887f2))
* extend approval, meeting, and budget API responses
([#834](#834))
([31472bf](31472bf))
* frontend polish -- real-time UX, accessibility, responsive,
performance ([#790](#790),
[#792](#792),
[#791](#791),
[#793](#793))
([#917](#917))
([f04a537](f04a537))
* implement human roles and access control levels
([#856](#856))
([d6d8a06](d6d8a06))
* implement semantic conflict detection in workspace merge
([#860](#860))
([d97283b](d97283b))
* interaction components and animation patterns
([#853](#853))
([82d4b01](82d4b01))
* Login page + first-run bootstrap + Company page
([#789](#789),
[#888](#888))
([#896](#896))
([8758e8d](8758e8d))
* Meetings page with timeline viz, token bars, contribution formatting
([#788](#788))
([#904](#904))
([b207f46](b207f46))
* Messages page with threading, channel badges, sender indicators
([#787](#787))
([#903](#903))
([28293ad](28293ad))
* Org Chart force-directed view and drag-drop reassignment
([#872](#872),
[#873](#873))
([#912](#912))
([a68a938](a68a938))
* Org Chart page (living nodes, status, CRUD, department health)
([#870](#870))
([0acbdae](0acbdae))
* per-command flags for remaining commands, auto-behavior wiring,
help/discoverability
([#897](#897))
([3f7afa2](3f7afa2))
* Providers page with backend rework -- health, CRUD, subscription auth
([#893](#893))
([9f8dd98](9f8dd98))
* scaffold React + Vite + TypeScript + Tailwind project
([#799](#799))
([bd151aa](bd151aa))
* Settings page with search, dependency indicators, grouped rendering
([#784](#784))
([#902](#902))
([a7b9870](a7b9870))
* Setup Wizard rebuild with template comparison, cost estimator, theme
customization ([#879](#879))
([ae8b50b](ae8b50b))
* setup wizard UX -- template filters, card metadata, provider form
reuse ([#910](#910))
([7f04676](7f04676))
* setup wizard UX overhaul -- mode choice, step reorder, provider fixes
([#907](#907))
([ee964c4](ee964c4))
* structured ModelRequirement in template agent configs
([#795](#795))
([7433548](7433548))
* Task Board page (rich Kanban, filtering, dependency viz)
([#871](#871))
([04a19b0](04a19b0))


### Bug Fixes

* align frontend types with backend and debounce WS refetches
([#916](#916))
([134c11b](134c11b))
* auto-cleanup targets newly pulled images instead of old ones
([#884](#884))
([50e6591](50e6591))
* correct wipe backup-skip flow and harden error handling
([#808](#808))
([c05860f](c05860f))
* improve provider setup in wizard, subscription auth, dashboard bugs
([#914](#914))
([87bf8e6](87bf8e6))
* improve update channel detection and add config get command
([#814](#814))
([6b137f0](6b137f0))
* resolve all ESLint warnings, add zero-warnings enforcement
([#899](#899))
([079b46a](079b46a))
* subscription auth uses api_key, base URL optional for cloud providers
([#915](#915))
([f0098dd](f0098dd))


### Refactoring

* semantic analyzer cleanup -- shared filtering, concurrency, extraction
([#908](#908))
([81372bf](81372bf))


### Documentation

* brand identity and UX design system from
[#765](#765) exploration
([#804](#804))
([389a9f4](389a9f4))
* page structure and information architecture for v0.5.0 dashboard
([#809](#809))
([f8d6d4a](f8d6d4a))
* write UX design guidelines with WCAG-verified color system
([#816](#816))
([4a4594e](4a4594e))


### Tests

* add unit tests for agent hooks and page components
([#875](#875))
([#901](#901))
([1d81546](1d81546))


### CI/CD

* bump actions/deploy-pages from 4.0.5 to 5.0.0 in the major group
([#831](#831))
([01c19de](01c19de))
* bump astral-sh/setup-uv from 7.6.0 to 8.0.0 in
/.github/actions/setup-python-uv in the all group
([#920](#920))
([5f6ba54](5f6ba54))
* bump codecov/codecov-action from 5.5.3 to 6.0.0 in the major group
([#868](#868))
([f22a181](f22a181))
* bump github/codeql-action from 4.34.1 to 4.35.0 in the all group
([#883](#883))
([87a4890](87a4890))
* bump sigstore/cosign-installer from 4.1.0 to 4.1.1 in the
minor-and-patch group
([#830](#830))
([7a69050](7a69050))
* bump the all group with 3 updates
([#923](#923))
([ff27c8e](ff27c8e))
* bump wrangler from 4.76.0 to 4.77.0 in /.github in the minor-and-patch
group ([#822](#822))
([07d43eb](07d43eb))
* bump wrangler from 4.77.0 to 4.78.0 in /.github in the all group
([#882](#882))
([f84118d](f84118d))


### Maintenance

* add design system enforcement hook and component inventory
([#846](#846))
([15abc43](15abc43))
* add dev-only auth bypass for frontend testing
([#885](#885))
([6cdcd8a](6cdcd8a))
* add pre-push rebase check hook
([#855](#855))
([b637a04](b637a04))
* backend hardening -- eviction/size-caps and model validation
([#911](#911))
([81253d9](81253d9))
* bump axios from 1.13.6 to 1.14.0 in /web in the all group across 1
directory ([#922](#922))
([b1b0232](b1b0232))
* bump brace-expansion from 5.0.4 to 5.0.5 in /web
([#862](#862))
([ba4a565](ba4a565))
* bump eslint-plugin-react-refresh from 0.4.26 to 0.5.2 in /web
([#801](#801))
([7574bb5](7574bb5))
* bump faker from 40.11.0 to 40.11.1 in the minor-and-patch group
([#803](#803))
([14d322e](14d322e))
* bump https://github.com/astral-sh/ruff-pre-commit from v0.15.7 to
0.15.8 ([#864](#864))
([f52901e](f52901e))
* bump nginxinc/nginx-unprivileged from `6582a34` to `f99cc61` in
/docker/web in the all group
([#919](#919))
([df85e4f](df85e4f))
* bump nginxinc/nginx-unprivileged from `ccbac1a` to `6582a34` in
/docker/web ([#800](#800))
([f4e9450](f4e9450))
* bump node from `44bcbf4` to `71be405` in /docker/sandbox
([#827](#827))
([91bec67](91bec67))
* bump node from `5209bca` to `cf38e1f` in /docker/web
([#863](#863))
([66d6043](66d6043))
* bump picomatch in /site
([#842](#842))
([5f20bcc](5f20bcc))
* bump recharts 2-&gt;3 and @types/node 22-&gt;25 in /web
([#802](#802))
([a908800](a908800))
* Bump requests from 2.32.5 to 2.33.0
([#843](#843))
([41daf69](41daf69))
* bump smol-toml from 1.6.0 to 1.6.1 in /site
([#826](#826))
([3e5dbe4](3e5dbe4))
* bump the all group with 3 updates
([#921](#921))
([7bace0b](7bace0b))
* bump the minor-and-patch group across 1 directory with 2 updates
([#829](#829))
([93e611f](93e611f))
* bump the minor-and-patch group across 1 directory with 3 updates
([#841](#841))
([7010c8e](7010c8e))
* bump the minor-and-patch group across 1 directory with 3 updates
([#869](#869))
([548cee5](548cee5))
* bump the minor-and-patch group in /site with 2 updates
([#865](#865))
([9558101](9558101))
* bump the minor-and-patch group with 2 updates
([#867](#867))
([4830706](4830706))
* consolidate Dependabot groups to 1 PR per ecosystem
([06d2556](06d2556))
* consolidate Dependabot groups to 1 PR per ecosystem
([#881](#881))
([06d2556](06d2556))
* improve worktree skill with full dep sync and status enhancements
([#906](#906))
([772c625](772c625))
* remove Vue remnants and document framework decision
([#851](#851))
([bf2adf6](bf2adf6))
* update web dependencies and fix brace-expansion CVE
([#880](#880))
([a7a0ed6](a7a0ed6))
* upgrade to Storybook 10 and TypeScript 6
([#845](#845))
([52d95f2](52d95f2))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants