feat: ★ Renovate view with update-group bulk merge #33

Merged
deadstyle merged 16 commits from feature/10-renovate-view into develop 2026-10-02 21:38:06 -05:00
Owner

Summary

The ★ Renovate view: every open Renovate PR on the host in one place, across five boxes, filling in as repositories load, with m merging an update everywhere it appears through the existing merge contract and confirm dialog.

Changes

  • Renovate logic (new pure package internal/core/renovate): detects Renovate PRs (renovate_user or renovate/ branch), parses PR update tables per spike #2 (with Renovate's optional columns like Age/Confidence accepted), infers ecosystem, groups by ecosystem + package + target version, scores impact (1 + log₂(1 + days open)), and parses Dependency Dashboards.
  • Core: fills each Renovate PR's updates when fetching and again at recheck (so the confirm dialog always shows what the PR carries at the pinned head); per-repo scan with cache peek; renovate_user wired from config.
  • Adapter/domain: PR created date (created_at) mapped for the impact score. Demo data gains ages and ecosystem-bearing titles so postgres groups ×2.
  • ★ view: [1] By repo (counts + impact, worst first, host totals), [2] Updates by dependency, [3] Renovate PRs, [4] Dashboards, [5] Failing / running CI; "scanned X of Y" coverage with failures; stale and abandoned scans dropped; refresh refetches.
  • Bulk merge from ★: group or marked PRs → recheck → generalized confirm dialog (repo-prefixed, deduped by repo + number, per-repo green-CI rule, skipped targets with reasons including failed rechecks, coverage warning for group merges) → per-PR results, failed ones stay marked.
  • Docs: ADR 0013, architecture.md.

Test plan

  • make check: format, golangci-lint (0 issues), go test -race ./... (all packages ok), govulncheck, build — pass locally; shellcheck runs in CI (not installed locally, no shell changes).
  • Backfilled tests for the Renovate package, core/adapter/demo, and the UI, each mutation-checked: parsing and reject rules, ecosystem inference, grouping, counting and impact, dashboards, fill-at-recheck, scan coverage/staleness/cancel/refresh, zero-repo hosts, the full ★ merge flow, and every ★ view fitting 80×24.
  • Reviews: spec and standards axes passed (two fix rounds); comments/test-quality review passed.

Closes #10

🤖 Generated with Claude Code

## Summary The ★ Renovate view: every open Renovate PR on the host in one place, across five boxes, filling in as repositories load, with `m` merging an update everywhere it appears through the existing merge contract and confirm dialog. ## Changes - **Renovate logic (new pure package `internal/core/renovate`):** detects Renovate PRs (renovate_user or `renovate/` branch), parses PR update tables per spike #2 (with Renovate's optional columns like Age/Confidence accepted), infers ecosystem, groups by ecosystem + package + target version, scores impact (1 + log₂(1 + days open)), and parses Dependency Dashboards. - **Core:** fills each Renovate PR's updates when fetching and again at recheck (so the confirm dialog always shows what the PR carries at the pinned head); per-repo scan with cache peek; `renovate_user` wired from config. - **Adapter/domain:** PR created date (`created_at`) mapped for the impact score. Demo data gains ages and ecosystem-bearing titles so postgres groups ×2. - **★ view:** `[1]` By repo (counts + impact, worst first, host totals), `[2]` Updates by dependency, `[3]` Renovate PRs, `[4]` Dashboards, `[5]` Failing / running CI; "scanned X of Y" coverage with failures; stale and abandoned scans dropped; refresh refetches. - **Bulk merge from ★:** group or marked PRs → recheck → generalized confirm dialog (repo-prefixed, deduped by repo + number, per-repo green-CI rule, skipped targets with reasons including failed rechecks, coverage warning for group merges) → per-PR results, failed ones stay marked. - **Docs:** ADR 0013, architecture.md. ## Test plan - `make check`: format, `golangci-lint` (0 issues), `go test -race ./...` (all packages ok), govulncheck, build — pass locally; shellcheck runs in CI (not installed locally, no shell changes). - Backfilled tests for the Renovate package, core/adapter/demo, and the UI, each mutation-checked: parsing and reject rules, ecosystem inference, grouping, counting and impact, dashboards, fill-at-recheck, scan coverage/staleness/cancel/refresh, zero-repo hosts, the full ★ merge flow, and every ★ view fitting 80×24. - Reviews: spec and standards axes passed (two fix rounds); comments/test-quality review passed. Closes #10 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Add internal/core/renovate (detection, PR-body and dashboard parsing,
grouping, impact scoring, view build), ChangeRequest.CreatedAt mapped
by the gitea adapter, Renovate filled by core on fetch and recheck,
Service.RenovateScan and PeekRenovateScan, demo ages, and fixtures.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ★ row now previews and opens five boxes built from a host-wide scan:
by repo, updates by dependency, Renovate change requests, dashboards and
failing CI. The scan fills in per repo with a coverage line, drops stale
results by sequence and is cancelled when the cursor leaves the row.

m on an update group or on marked rows rechecks and merges across repos
through the existing merge contract. The merge dialog now dedups by
(repo, number), prefixes the repo, lists skipped targets and warns when
the scan was incomplete. A hosted session passes renovate_user to core.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Folds the duplicated approve/close/comment/open handling, merge start and
finish bookkeeping, details scrolling and scan ref list into one path used
by both the repo boxes and the ★ boxes.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Format parse.go, drop unused return values from endMerge, starRechecked and
starMergeDone. List targets whose recheck failed as skipped lines in the star
merge dialog. Pass the host's renovate_user to the merge dialog so
author-detected Renovate PRs with an unparsed body show "packages unknown".

Refs #10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Covers detection rules, recheck re-parse, scan error wrapping, Peek
needing both lists, gitea created_at mapping and demo CreatedAt
invariants plus the demo postgres grouping.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cover detection, ignored columns, reject rules, ecosystem inference,
dashboard parsing, impact and Build ordering, grouping and buckets.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no repositories the scan never started, so every ★ box showed
Loading forever. A repo list that changes during r or the tick now keeps
refetching instead of falling back to the cache.

#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test(renovate): pin impact to hand-computed values; trim paraphrase comments
All checks were successful
ci / check (pull_request) Successful in 1m32s
89cfbb1fbd
#10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
deadstyle merged commit 74018cc129 into develop 2026-10-02 21:38:06 -05:00
deadstyle deleted branch feature/10-renovate-view 2026-10-02 21:38:06 -05:00
Sign in to join this conversation.
No description provided.