gh-glance 0.16.2 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/CHANGELOG.md +64 -1
  2. package/README.md +80 -17
  3. package/index.mjs +795 -253
  4. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.17.1] - 2026-10-26
11
+
12
+ ### Fixed
13
+
14
+ - A full debt-group journal no longer pins every pane of an account behind
15
+ "Local coordination accounting overflow". Quiescent groups now merge once the
16
+ journal is half full, after any active probe finishes or expires, so the
17
+ journal can free space for retiring a control receipt. Ledgers already wedged
18
+ in this state recover automatically after upgrading.
19
+ - Pasted or multi-character input such as `12` is ignored instead of being read
20
+ as a tab number. Single-digit tab keys are unchanged.
21
+ - Webhook events now match configured targets whose repository name differs in
22
+ case from the name GitHub sends, including access-removal events that fence
23
+ cached data. Ambiguity across hosts is still rejected.
24
+ - A collector view with an old snapshot shows `Stale` or `Cached` with its
25
+ source age. It shows `Disconnected`, still with that age, only when the
26
+ collector connection or its app authorization is lost.
27
+
28
+ ### Changed
29
+
30
+ - Updated React to 19.3.0 and refreshed existing tooling/action versions.
31
+ Patched the development-only brace-expansion and Zod vulnerabilities.
32
+ - README: Homebrew installation (`brew install juan294/tap/gh-glance`) is
33
+ documented, with a note to use one installation method.
34
+ - Development CI monitoring uses Sutura v0.4.0.
35
+ - A journal that is genuinely full of unsettled requests reports "Local
36
+ coordination journal is full" with an automatic retry instead of the hard
37
+ accounting-overflow notice.
38
+ - `gh-glance --doctor` reports debt-journal occupancy as `debt groups`, and
39
+ for a hard coordination failure, including a ledger that is missing or
40
+ unreadable, names the state file and the `repair`: quit every pane, move the
41
+ ledger, its recovery journal and `registry.json` aside, relaunch.
42
+
43
+ ## [0.17.0] - 2026-10-25
44
+
45
+ ### Added
46
+
47
+ - Contextual, paginated help with the selected GitHub host and repository,
48
+ complete diagnostics and recovery actions, including in narrow terminals.
49
+ - Optional Actions setup checks with `s` in standalone mode: one read-only
50
+ request lists up to 100 workflows, reports incomplete coverage and keeps a
51
+ separate result for five minutes. Press `g` to open the repository's Actions
52
+ page, including from collector and SSH views.
53
+
54
+ ### Changed
55
+
56
+ - Empty tabs explain what was checked, what the result means and what to do
57
+ next. Saved views, waiting, overdue data and failed refreshes retain their
58
+ actual source-check context.
59
+ - README: the provenance note now says the published package is the exact
60
+ tarball tested for the release pull request.
61
+ - Development CI monitoring uses Sutura v0.3.9 with a repository-scoped App token.
62
+
63
+ ### Fixed
64
+
65
+ - Preserve actionable login and local-storage remedies in short terminal panes.
66
+ - Distinguish partial or disabled Security coverage from an all-clear result,
67
+ and disclose uncertain check times without inventing freshness.
68
+ - Keep setup and browser failures separate from workflow-run results, with
69
+ bounded retries, shared rate-limit accounting and account-change fencing.
70
+
10
71
  ## [0.16.2] - 2026-10-03
11
72
 
12
73
  No change to the dashboard itself: `index.mjs` is identical to 0.16.1. This
@@ -1254,7 +1315,9 @@ engineering, security, QA and UX. What follows is what changed as a result.
1254
1315
  - The `main` field from `package.json`. It advertised the file as importable,
1255
1316
  but importing it took over the terminal or exited the host process.
1256
1317
 
1257
- [Unreleased]: https://github.com/juan294/gh-glance/compare/v0.16.2...HEAD
1318
+ [Unreleased]: https://github.com/juan294/gh-glance/compare/v0.17.1...HEAD
1319
+ [0.17.1]: https://github.com/juan294/gh-glance/compare/v0.17.0...v0.17.1
1320
+ [0.17.0]: https://github.com/juan294/gh-glance/compare/v0.16.2...v0.17.0
1258
1321
  [0.16.2]: https://github.com/juan294/gh-glance/compare/v0.16.1...v0.16.2
1259
1322
  [0.16.1]: https://github.com/juan294/gh-glance/compare/v0.16.0...v0.16.1
1260
1323
  [0.16.0]: https://github.com/juan294/gh-glance/compare/v0.15.2...v0.16.0
package/README.md CHANGED
@@ -25,14 +25,14 @@ without switching to the browser.
25
25
  ╭─ Actions · owner/repo ──────────────────────────────────────────────────╮
26
26
  │ TITLE │WORKFLOW │BRANCH │TIME │UPDATED │
27
27
  │ ─────────────────────────────────────────────────────────────────────── │
28
- │ >+ ci: pin actions to com… #443 CI develop 1m20s 44d ago │
29
- │ x fix: restore the prima… #442 Code… develop 1m28s 44d ago │
30
- │ + chore: bump dependenci… #441 CI dependa…int-10 30s 44d ago │
31
- │ - docs: update the readme #440 CI develop 15s 45d ago │
28
+ │ >+ ci: pin actions to com… #443 CI develop 1m20s 85d ago │
29
+ │ x fix: restore the prima… #442 Code… develop 1m28s 85d ago │
30
+ │ + chore: bump dependenci… #441 CI dependa…int-10 30s 85d ago │
31
+ │ - docs: update the readme #440 CI develop 15s 86d ago │
32
32
  │ │
33
33
  │ │
34
34
  ╰──────────────────────────────────────────────────────────────── 4 of 4 ─╯
35
- · Watching Refresh: r Quit: q Move: ↑↓ Open: Ent Width: w
35
+ · Watching Refresh: r Quit: q Help: ? Move: ↑↓ Open: Ent w
36
36
  ```
37
37
 
38
38
  > Generated from this candidate's real binary under the repository PTY harness
@@ -121,10 +121,28 @@ current.
121
121
 
122
122
  ## Install
123
123
 
124
+ With Homebrew on macOS or Linux:
125
+
126
+ ```bash
127
+ brew install juan294/tap/gh-glance
128
+ ```
129
+
130
+ Future updates use your normal `brew upgrade`. The
131
+ [Homebrew tap](https://github.com/juan294/homebrew-tap) follows published npm
132
+ releases automatically and supplies its own Node runtime. If moving from npm,
133
+ remove existing npm copies first; the tap README includes migration commands.
134
+ Restart running dashboard panes after upgrading.
135
+
136
+ Alternatively, install with npm (Node.js 22 or newer):
137
+
124
138
  ```bash
125
139
  npm install -g gh-glance
126
140
  ```
127
141
 
142
+ Use one installation method. NVM keeps global npm packages separate for each
143
+ Node installation, so an npm update may not affect a copy launched from another
144
+ prefix.
145
+
128
146
  That is the whole install for the default standalone dashboard. `gh-glance`
129
147
  ships as a single `index.mjs` with no build step, so there is nothing to
130
148
  compile. The optional collector, SSH, webhook, and GitHub App modes use the
@@ -134,15 +152,20 @@ The installed package is a CLI, not a JavaScript library. The `gh-glance`
134
152
  executable is supported; package-root and deep imports are intentionally
135
153
  blocked so an internal test seam cannot become an accidental public API.
136
154
 
137
- Every published version is built and signed by GitHub Actions from a tagged
138
- commit on `main`, never from a maintainer's laptop, and carries [npm
155
+ Every published version is the exact tarball GitHub Actions packed and tested
156
+ for the release pull request, published by GitHub Actions from a tagged commit
157
+ on `main`, never from a maintainer's laptop, and carries [npm
139
158
  provenance](https://docs.npmjs.com/generating-provenance-statements) linking
140
- the tarball back to the workflow run and commit that produced it. The
159
+ the tarball back to the workflow run and commit that published it. The
141
160
  "Provenance" section on the [package
142
161
  page](https://www.npmjs.com/package/gh-glance) shows the exact source.
143
162
 
144
163
  ### First run
145
164
 
165
+ The footer keeps `?` available for contextual help, even in a narrow pane.
166
+ Help explains the selected repository and host, the current observation, and
167
+ what to do next; its pages keep long targets and recovery details reachable.
168
+
146
169
  The default standalone dashboard uses the credentials and active account
147
170
  already selected by your local `gh` CLI. It does not persist or display the
148
171
  token. Check that account before starting the dashboard:
@@ -176,6 +199,33 @@ the core gh-glance minimum remains unchanged. To keep simultaneous panes on
176
199
  different accounts, use separate `GH_CONFIG_DIR` values as described under
177
200
  [No account pinning](#limitations).
178
201
 
202
+ A successful empty result is different from a check that has not succeeded.
203
+ Actions says “No workflow runs found” and explains that runs come from workflows
204
+ with matching triggers. Issues and Pull requests report open items. Security
205
+ reports only the sources it could check and keeps unavailable-source notes visible.
206
+ An empty result is not a repository-wide health or security clearance.
207
+
208
+ On Actions, press `s` for an optional read-only setup check or `g` to open the
209
+ selected repository's Actions page. The setup check lists at most 100 workflows
210
+ in one request. It reports partial coverage and unfamiliar states explicitly;
211
+ zero workflows or an access error does not prove that Actions is disabled.
212
+ Setup results have their own check time and do not change the run list or its
213
+ freshness. A successful or partial result is reused for five minutes. Failures
214
+ keep the prior dated result and require `s` to retry after at least 30 seconds
215
+ and any shared API hold. There is no automatic setup retry. Setup checks are
216
+ available only in standalone mode; connected collector and SSH views offer `g`
217
+ instead. Neither key creates, enables, edits, or dispatches a workflow.
218
+
219
+ “Checking” and “Waiting to check” mean no successful result is available yet.
220
+ A failed load shows the actual recovery action. A failed refresh keeps the prior
221
+ result and its original check time. “Needs an update” describes overdue data;
222
+ it does not by itself mean a network request failed. Unknown or future source
223
+ clocks show “Last-check time unavailable”.
224
+
225
+ With the default on-demand policy, Issues, Pull requests and Security show a
226
+ saved view between checks. Press `r` to check again; opening the tab also follows
227
+ the normal refresh policy. These tabs do not promise continuous polling.
228
+
179
229
  ### From a clone
180
230
 
181
231
  For hacking on it, or to run an unreleased revision:
@@ -251,8 +301,10 @@ stdout isn't a terminal rather than streaming redraw frames into a pipe.
251
301
  | `Enter` | Open the selected item, or accept an onboarding prompt |
252
302
  | `r` | Request a current-tab refresh. It sends the cached validators, so an unchanged tab answers `304` and spends nothing. A safe grant is still required. |
253
303
  | `R` | Resynchronize the current tab: one generation without validators, and the only key that clears a negative capability backoff. Still subject to the budget and the secondary cooldown. |
304
+ | `s` | On Actions, request or reuse a read-only setup check (standalone only) |
305
+ | `g` | On Actions, open the selected repository’s Actions page |
254
306
  | `w` | Adjust table column widths |
255
- | `?` | Show the keys without leaving the dashboard (any key closes it) |
307
+ | `?` | Open or close contextual help; `n` / `p` moves through its pages |
256
308
  | `q` / `Esc` / `Ctrl+C` | Quit (`Esc` leaves width mode) |
257
309
 
258
310
  ### Adjusting column widths
@@ -304,9 +356,16 @@ switch `gh` into non-interactive mode and require choosing a visibility in
304
356
  advance. Press `q` or `Esc` to decline. To watch an existing repository without
305
357
  attaching this folder, restart with `gh-glance --repo owner/name`.
306
358
 
307
- When the repository was chosen explicitly, with `--repo` or `GH_REPO`, the panel
308
- says so: `╭─ Actions · acme/widget ─`. That is what tells two side-by-side panes
309
- apart. It is dropped before the tab name when the pane is too narrow for both.
359
+ The panel names the selected repository, including targets inferred from Git
360
+ remotes: `╭─ Actions · acme/widget ─`. Non-default hosts are included in the
361
+ target. Selection does not prove that the active account can access it. When
362
+ the pane is too narrow for the target, press `?` to read its complete name and
363
+ host, the current check state, source time, recovery action, and key reference.
364
+
365
+ Help wraps long text and uses `n` / `p` for next / previous page. `?` closes it;
366
+ any other ordinary key closes help without performing that key's usual action.
367
+ `q`, `Esc`, and `Ctrl+C` still quit. Width mode keeps its own keys: leave it
368
+ before opening help.
310
369
 
311
370
  If `gh-glance` is started without an interactive stdin (for example with stdin
312
371
  redirected), the key handlers cannot run and the status bar shows only `Quit: ^C`
@@ -724,11 +783,14 @@ and the lock path separately. A readable metadata file does not make an aged
724
783
  orphan lock or invalid snapshot healthy; plain doctor never repairs either.
725
784
  When one cached identity names the selected host, plain doctor also reads its
726
785
  quota ledger without changing it or contacting GitHub. It reports receipt and
727
- debt totals, observer age, the current recovery cause, and an actual retry time
728
- when one is known. If several cached identities match, it says the scope is
729
- unavailable instead of choosing an account. For a corrupt or unreadable quota
786
+ debt totals, debt-group occupancy (`debt groups`), observer age, the current
787
+ recovery cause, and an actual retry time when one is known. If several cached
788
+ identities match, it says the scope is unavailable instead of choosing an
789
+ account. For a corrupt or unreadable quota
730
790
  file, it names the coordination directory and a `quota-[redacted].json` file
731
- pattern with the cause. The private quota fingerprint stays out of reports.
791
+ pattern with the cause. For a hard coordination failure it also prints a
792
+ `repair` line with the manual steps. The private quota fingerprint stays out of
793
+ reports.
732
794
 
733
795
  Use `gh-glance --doctor --probe` when live capability evidence is needed. Probe
734
796
  mode uses an ephemeral governor lease and admits every quota-consuming endpoint
@@ -1082,7 +1144,8 @@ GH_GLANCE_ICONS=ascii gh-glance
1082
1144
  | `Upgrade waiting for legacy quota reset` | The older panes are gone, but left spend that cannot be proven settled. It waits for the affected rate-limit window to reset rather than assume the quota is free. This one has a deadline and clears itself. |
1083
1145
  | `Upgrade blocked: older spend cannot be settled or waited out` | Older spend has no reliable reset or child evidence. Verify old children ended and use `gh-glance --doctor` to inspect reserved units. An unidentifiable old child may require a verified system restart before a later observer can retire its charge. Keep the quota files as accounting evidence. |
1084
1146
  | `Coordination state unavailable; evidence preserved` | Coordination state could not be read and was deliberately not overwritten, so nothing is lost. Run `gh-glance --doctor` and check the config directory's permissions. |
1085
- | `Local coordination` corruption, overflow, full storage, or unsafe permissions | Run `gh-glance --doctor`; its read-only report gives the exact cause and redacted local file location when known. Repair storage or permissions, then let the app retry. Preserve corrupt and overflow evidence for diagnosis. |
1147
+ | `Local coordination journal is full` | Every slot for unsettled or recently settled requests is in use. The app retries by itself, and older requests settle after about an hour. Nothing needs repair. `gh-glance --doctor` shows the occupancy as `debt groups`. |
1148
+ | `Local coordination` corruption, overflow, full storage, or unsafe permissions | Run `gh-glance --doctor`; its read-only report gives the exact cause and redacted local file location when known. For a hard failure it also prints a `repair` line: quit every pane, move the state file, its `.recovery.json` and `registry.json` aside, then relaunch. Otherwise repair storage or permissions and let the app retry. Preserve corrupt and overflow evidence for diagnosis. |
1086
1149
  | `Saving request result` or `Recovering interrupted request` | The original request may have consumed quota. The app keeps its charge, retries settlement without repeating HTTP, and waits for safe observer evidence before retiring uncertain debt. |
1087
1150
  | `GitHub request limit` | A shared secondary hold preserves GitHub's retry deadline. Wait for the shown time; if the repeated-limit circuit explicitly asks, press `r` once to retry. Repeated refresh cannot bypass a hold. |
1088
1151
  | `Collector connection unavailable` or `GitHub App authorization unavailable` | Restore the selected collector connection or App authorization. The mode does not switch to independent requests. Cached rows remain labeled with their source age. |