Productionize: tests, CLI, CI/CD, self-update #1

Merged
KofTwentyTwo merged 9 commits from dev into main 2026-07-03 14:59:46 +00:00
9 Commits
Author SHA1 Message Date
James MaesandClaude Fable 5 beceada68a UX overhaul: repo table, selection, per-row progress, activity log (#4)
- Two-phase flow: Load repos fills a selectable, sortable table
  (checkbox column + select-all, Name/Status/Branch/Archived headers);
  Sync selected runs only checked repos via a new engine overload that
  takes an explicit repository list
- Per-row progress bars: determinate clone percent, indeterminate pull
- Always-on activity log (IActivityLog/FileActivityLog in the engine,
  %LOCALAPPDATA%\gclo\logs, never throws) wired into GUI and CLI;
  View > Activity log menu opens a viewer with open-logs-folder
- Retry failed re-runs exactly the failed repos; Open folder appears
  after a run; live target-path preview + optional org subfolder toggle
- 29 new tests (90 total); also replaces a StatusText race in the old
  view-model suite that CI caught (org-lookup message could overwrite
  the sync summary on slow runners)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:54:38 -05:00
James MaesandClaude Fable 5 e23ebdc8ad Commit WinUI publish profiles; CI cannot build without them
The dotnet gitignore template excludes *.pubxml (a web convention), but
packaged WinUI builds resolve PublishProfile=win-$(Platform).pubxml at
build time: fresh checkouts failed with NETSDK1198 on CI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:48:29 -05:00
James MaesandClaude Fable 5 c101b44c53 Extract gclo.ViewModels: no business logic in the UI project (#3)
- New UI-framework-free library holds MainViewModel, RepoItemViewModel,
  and AppSettings persistence (theme mapping stays in the app)
- Testability seams: injectable progress factory (synchronous in tests;
  Progress<T> in the app) and org-lookup debounce interval
- 14 new view-model tests (61 total): command gating, sync flow with
  per-repo outcomes, cancellation, debounced org lookup incl. supersede
  and failure paths, concurrency clamping, item status formatting
- The WinUI project now contains only XAML, dialogs, pickers, brushes,
  and update plumbing

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:35:44 -05:00
James MaesandClaude Fable 5 7e9b898ccb Usage-first README + complete community files
- README: Download & install up top (Releases assets, channels), PAT
  scopes table, GUI walkthrough with screenshot placeholders, CLI section
  with examples + exit codes, build-from-source, attribution incl. Velopack
- SECURITY.md: private vulnerability reporting channel, token-handling
  guarantees; CONTRIBUTING.md verified against real commands + CI table +
  branch model; CODEOWNERS; bug/feature issue forms; PR template
- About dialog: Velopack added to attributions

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:13:28 -05:00
James MaesandClaude Fable 5 7c1c98f94a gclo = Git Clone Large Organizations; auto-changelogs on releases
- Official name expansion applied: README, CLI help, About dialog,
  window title, CLI docs
- Release pipeline now attaches auto-generated changelogs (categorized
  by labels via .github/release.yml) to every GitHub Release

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:08:57 -05:00
James MaesandClaude Fable 5 47b102bc6c Validate Windows-invalid paths before checkout; enable core.longpaths
Fixes the owner-reported class of clone failures on repos that are fine on
Linux but break on Windows (#2):

- Clones are two-phase (fetch, then checkout) so core.longpaths=true is set
  before any file touches disk — deep paths past MAX_PATH now clone fine
- WindowsPathValidator walks the tree before every checkout (clone, pull
  merge, unborn repair): invalid characters, trailing space/dot, reserved
  device names, >255-char segments, case-only collisions
- Failures surface as InvalidRepositoryPathsException with per-path reasons
  and suggested sanitized names instead of raw libgit2 errors
- FetchAndPull also sets core.longpaths and validates incoming trees

12 new tests (47 total), fixtures forged via ObjectDatabase plumbing.
Recovery UX (rename/skip mapping) tracked in #2 for the UX overhaul.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:06:04 -05:00
James MaesandClaude Fable 5 7fe0d5b1ef Move development tracking to GitHub Issues
TODO.md becomes a pointer; roadmap lives in issue #11, priority work in #2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 09:00:04 -05:00
James MaesandClaude Fable 5 cbdce91363 Productionize: integration tests, CLI, CI/CD, Velopack self-update
- 15 real-git integration tests for LibGit2GitClient against local fixture
  repos (35 tests total; engine line coverage 60.6%)
- gclo.Cli: scriptable head over the engine (sync/orgs, --json, exit codes
  0/1/2, token via env/file/stdin only) + docs/CLI.md; verified against
  live GitHub (orgs incl. personal account, parallel clone, pull path)
- Velopack 1.2.0: custom Main entry point, UpdateService (GithubSource),
  Help > Check for updates with update-and-restart flow
- GitHub Actions: CI (x64 -warnaserror, tests, coverage gate >=60%,
  dotnet format gate), CodeQL, dependency review, Dependabot, tag-driven
  release pipeline (Velopack pack/upload, CLI zip, gated NuGet + winget)
  + docs/RELEASING.md
- TODO.md status updates; T22 (Windows-invalid paths) prioritized next

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 08:55:12 -05:00
James MaesandClaude Fable 5 2f23065efb Add working TODO as the operating plan
Every owner request as an individual tracked task: done / in progress /
queued (execution order) / deferred / needs-owner-action.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 08:43:31 -05:00