Skip to content

feat: show progress during owner-wide planning#6

Merged
osolmaz merged 1 commit into
mainfrom
progress-status
Jul 8, 2026
Merged

feat: show progress during owner-wide planning#6
osolmaz merged 1 commit into
mainfrom
progress-status

Conversation

@osolmaz

@osolmaz osolmaz commented Jul 8, 2026

Copy link
Copy Markdown
Member

Opened on behalf of Onur Solmaz (osolmaz).

Summary

Owner-wide runs could look frozen while the CLI fetched, planned, and applied work across many repositories.
This change adds one quiet progress line for the long phases while keeping the final command output clean.
It also bounds the network concurrency so large accounts finish faster without firing every request at once.

What Changed

The CLI now reports progress on stderr and still prints the final plan and apply summaries on stdout.
The status line covers repository detail loading, planning, and the mutation phase of apply.

  • Added --progress and --no-progress.
  • Enabled progress automatically only for interactive stderr outside CI.
  • Added repository-detail progress during owner-wide discovery.
  • Added apply progress after confirmation, counted against repositories with real changes.
  • Added bounded concurrency for repository planning and repository-detail fetches.
  • Preserved final plan ordering under concurrency.
  • Kept progress rendering dependency-free.
  • Added a small src/shared layer for the concurrency helper and updated Slophammer boundaries.

Testing

I tested the local unit path, the repo quality gates, and live non-mutating CLI flows.
The live plan run confirmed that progress stays on stderr and the final plan stays on stdout.
The live apply smoke used a clean repository, so it verified the apply command path without mutating GitHub state; the mutation progress path is covered by unit tests.

  • npm run check
  • npm run dry
  • npm run mutate
  • npm run slophammer
  • npx -y @simpledoc/simpledoc check
  • git diff --check
  • node dist/src/cli/main.js plan osolmaz --all --progress --token "$(gh auth token)" >/tmp/github-sane-defaults-progress-plan.out 2>/tmp/github-sane-defaults-progress-plan.err
  • node dist/src/cli/main.js apply osolmaz/acpx --yes --progress --token "$(gh auth token)" >/tmp/github-sane-defaults-progress-apply-clean.out 2>/tmp/github-sane-defaults-progress-apply-clean.err

Risks

The progress bar is disabled by default in non-interactive output and CI, so automation behavior stays stable.
The apply phase remains sequential; only planning and repository-detail reads use bounded concurrency.

  • Final output remains script-friendly on stdout.
  • Progress is best-effort UI only and does not affect the plan or apply result.
  • Rate-limit wait progress is not included because the CLI does not have retry/backoff logic yet.

@osolmaz osolmaz force-pushed the progress-status branch 2 times, most recently from 6baea2c to 2a2f3ac Compare July 8, 2026 12:33
@osolmaz

osolmaz commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

Validation report for commit 2a2f3ac.

Implemented a dependency-free progress reporter plus bounded planning/repository-detail concurrency. The CLI keeps progress on stderr, keeps final plan/apply output on stdout, and preserves final plan ordering.

Checks run:

  • npm run check - passed, 10 test files / 61 tests
  • npm run dry - passed
  • npm run mutate - passed in dry-run mode, 61 tests
  • npm run slophammer - passed
  • npx -y @simpledoc/simpledoc check - passed
  • git diff --check - passed
  • codex review --base main -c 'sandbox_mode="danger-full-access"' - passed, no actionable correctness issues
  • GitHub Actions test - passed in 38s

Smoke test:

node dist/src/cli/main.js plan osolmaz --all --progress --token "$(gh auth token)" >/tmp/github-sane-defaults-progress-plan.out 2>/tmp/github-sane-defaults-progress-plan.err

Result: Plan: 152 repositories, 145 with changes, 7 already clean. Progress output was written to stderr and the final plan was written to stdout.

@osolmaz osolmaz enabled auto-merge (squash) July 8, 2026 12:38
@osolmaz osolmaz force-pushed the progress-status branch from 2a2f3ac to c08719b Compare July 8, 2026 13:17
@osolmaz

osolmaz commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

Final validation report for commit c08719b.

Implemented progress for the long owner-wide phases:

  • Repository detail loading now reports progress during owner-wide discovery.
  • Planning progress remains on stderr.
  • Apply now reports progress after confirmation, counted only against repositories with real changes.
  • Final plan and apply output still go to stdout.
  • Planning and repository-detail reads use bounded concurrency while preserving final ordering.

Checks run:

  • npm run check - passed, 10 test files / 62 tests
  • npm run dry - passed
  • npm run mutate - passed in dry-run mode, 62 tests
  • npm run slophammer - passed
  • npx -y @simpledoc/simpledoc check - passed
  • git diff --check - passed
  • codex review --base main -c 'sandbox_mode="danger-full-access"' - passed, no correctness issues found
  • GitHub Actions test - passed on commit c08719b

Smoke tests:

node dist/src/cli/main.js plan osolmaz --all --progress --token "$(gh auth token)" >/tmp/github-sane-defaults-progress-plan.out 2>/tmp/github-sane-defaults-progress-plan.err

Result: Plan: 152 repositories, with repository-detail progress on stderr and final output on stdout.

node dist/src/cli/main.js apply osolmaz/acpx --yes --progress --token "$(gh auth token)" >/tmp/github-sane-defaults-progress-apply-clean.out 2>/tmp/github-sane-defaults-progress-apply-clean.err

Result: clean no-change apply path passed without mutating GitHub state. The apply mutation progress path is covered by unit tests.

@osolmaz osolmaz merged commit 1ddb660 into main Jul 8, 2026
1 check passed
@osolmaz osolmaz deleted the progress-status branch July 8, 2026 13:24
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