The hand-rolled header Grid + ListView become one TableView (pinned 1.5.0, the
first release with UI Automation peers). The view model stays the owner of sort
and filter state: FilteredRepos is the ItemsSource, Sorting/ClearSorting are
intercepted into SortCommand (the control's third "clear" step starts the
ascending/descending cycle over), and the sort indicator plus the header's
composed automation name ("Branch, sorted descending") are written back from
SortColumn/SortDescending. The control's Excel-style filters stay off; each
header hosts the same funnel flyout as before (NameFilterButton etc.), bound to
the same view-model filters. Selection remains model state (IsSelected column),
the error line, WSL note, and Resolve link move to an always-on row-details
template (collapsed when empty).
Accessibility finding: TableView 1.5.0 inherits ListViewAutomationPeer's
children (rows only), so its header row, headers, and anything inside them are
unreachable by tree walking and the Table pattern's ColumnHeaders property
fails. AccessibleTableView's peer prepends the column header peers, restoring
what the old header exposed; ColumnHeaderContent gives cells "Name, Row 3,
alpha" names instead of the header Grid's type name.
Tests: gclo/UiTestFixture.cs is an offline seam (GCLO_UITEST_FIXTURE=1 plus the
magic token "gclo-uitest-fixture-token" only) that answers GitHub and git for one
fixed organization; gclo.UiTests/RepoTableTests.cs loads it in its own
collection (collections now run one at a time) and asserts the table renders,
headers sort through the view model via Invoke, and the Name funnel filters and
clears. Keyboard reachability of the funnels stays a manual check.
Closes#33
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Engine: IWslCloner/WslCloner over an IProcessRunner seam. Probe runs
`wsl.exe -e git --version`; the clone feeds a POSIX script to `sh -s` on stdin
with org/repo/url as positional parameters (nothing re-parsed by wsl.exe), and
the token reaches git only as GCLO_GIT_TOKEN via WSLENV through an inline
credential helper - never argv, never a file. Destination ~/gclo/<org>/<repo>
in the default distribution; an existing clone is fast-forwarded. The real
ProcessRunner decodes wsl.exe's UTF-16 messages and is coverage-excluded;
WslCloner is fully covered through FakeProcessRunner.
ViewModels: PathRecoveryDecision (Apply | CloneInWsl); WorkspaceViewModel
probes WSL once, lazily, before the recovery interaction (IsWslCloneAvailable,
WslAvailabilityDetail), runs the clone under the same IsResolvingPaths lock,
marks the row Done with a Note naming the \wsl.localhost path, and keeps the
payload on failure so the rename/skip route stays open. RepoItemViewModel.Note.
App: PathRecoveryDialog offers "Clone in WSL instead" as its secondary button
when available; row template shows the Note. README documents the option.
Verified the real script end to end in WSL (clone, then pull) on this machine.
Closes#8
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Scoop reads bucket/gclo.json from the default branch, so a PR against dev
would leave scoop install on the previous version until the next dev->main
merge. RELEASING.md now describes the real flow (merge, then main back into
dev; DEPS_PAT needed for checks to trigger).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- bucket/gclo.json: this repo is its own Scoop bucket; checkver github,
autoupdate keyed on SHA256SUMS.txt. Verified locally with scoop install.
- packaging/chocolatey: nuspec + Install-ChocolateyZipPackage script for the
same gclo-cli-win-x64.zip asset.
- .github/scripts/Update-PackageManifests.ps1: single source of truth that
re-points both manifests at a stable release (refuses prereleases).
- release.yml: write + attest + attach SHA256SUMS.txt on every release; on
stable tags update the manifests, choco pack, choco push when CHOCO_API_KEY
is set, and open a PR against dev with the updated manifests.
- gclo.Cli.Tests/PackagingManifestTests.cs: both manifests valid, stable, and
describing the same asset.
- docs/RELEASING.md + README: install and secret docs.
Closes#9
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>