Repository navigation
feat(abgui): a built-in log viewer, so a failed run can be read and sent - #9
Merged
Merged
Conversation
abgui has written a full transcript for every diff, seed and sync since v0.4.19 — the command it ran, abctl's stderr, per-step elapsed time (v0.4.24), and a footer with the outcome and duration. Reaching one meant knowing that ~/Library/Logs/abgui exists and going to Finder. That is a fair ask of a developer and a poor one of the administrator standing in front of a sync that just failed, which is precisely when the file matters. New "Logs" screen (Overview section): - every recorded run, newest first, with verb, start time, duration and the outcome from its footer — so a failure is identifiable without opening anything; - the full transcript in a selectable monospaced pane; - Copy Log, Save a Copy… (fileExporter) and Reveal in Finder, which are the three ways a transcript actually reaches a bug report. `RunLogIndex` builds the list from FILENAMES (`RunLog.fileName` already encodes verb, UTC start and run id) plus a bounded 2 KiB read of each file's TAIL for the footer. Listing fifty logs therefore costs a directory read and fifty small seeks, not fifty full transcripts — a 5 MiB run costs the same as an empty one. It is filesystem-only: no abctl, no network, no credentials, so the screen works when the tenant connection is the thing that is broken. A run with no footer is shown as unfinished rather than hidden — that is what an app killed mid-sync leaves behind, and it is worth seeing. The sharing caveat sits next to the Copy button, not in a help page: logs carry no credentials (the header command is CommandRecord's redacted form, stdin is a byte count), but they DO name the organization, configurations, blueprints, device serials and user email addresses. Someone about to paste one into an email should read that first, at that moment. `CommandClipboard.reveal` is shared with the transcript panes so both reveal identically. Go untouched and green. 5 new Swift tests cover filename parsing, the tail-read footer (asserting the file is larger than the probe window, which is the property that keeps the screen cheap), footerless runs, newest-first ordering with foreign files excluded, and failure classification. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
abgui has written a full transcript for every diff, seed and sync since v0.4.19 — the command it ran, abctl's stderr, per-step elapsed time (v0.4.24), and a footer with the outcome and duration.
Reaching one meant knowing
~/Library/Logs/abguiexists and going to Finder. That's a fair ask of a developer and a poor one of the administrator standing in front of a sync that just failed — which is exactly when the file matters.New "Logs" screen
fileExporter) and Reveal in Finder — the three ways a transcript actually reaches a bug report.Why it stays cheap to open
RunLogIndexbuilds the list from filenames (RunLog.fileNamealready encodes verb, UTC start and run id) plus a bounded 2 KiB read of each file's tail for the footer.Listing fifty logs costs a directory read and fifty small seeks — not fifty full transcripts. A 5 MiB run costs the same as an empty one. There's a test asserting the probed file is larger than the probe window, so that property can't quietly regress.
It's filesystem-only: no abctl, no network, no credentials. The screen works when the tenant connection is the thing that's broken.
A run with no footer shows as unfinished rather than being hidden — that's what an app killed mid-sync leaves behind, and it's worth seeing.
The sharing caveat is next to the Copy button
Not in a help page. Logs carry no credentials — the header command is
CommandRecord's redacted form, stdin is recorded as a byte count — but they do name the organization, configurations, blueprints, device serials and user email addresses. Someone about to paste one into an email should read that at that moment, not later.Verification
Go untouched and green. 5 new Swift tests: filename parsing, tail-read footer extraction, footerless runs, newest-first ordering with foreign files excluded (the same rule the pruner follows before deleting), and failure classification. macOS CI is the compile gate.
🤖 Generated with Claude Code