Repository navigation
Releases: Kevin-McIsaac/dsh-workspace-git-badge
Release list
dsh-git-badge 0.21.0
Changed
The badge follows the session's working directory. DSH records it with dsh-working-directory; the working_directory tool and the worktree tool commit a change, and the node half reads the workingDirectory projection through sessionController.projections(). A session that enters a linked worktree or another repository now updates the chip, the row and the hover card. The old assumption that the session cwd is immutable is gone (squash-merged in #85).
Both routes ride the authenticated /api transport. The plugin registers ctx.connection.fetch routes instead of exact webServer routes, so the Host/Origin fence and the session cookie apply. An unauthenticated request now gets a 401. The client URLs are unchanged (squash-merged in #85).
The /gh skill is registered at runtime. ctx.skills.register() replaces the boot-time copy into $DSH_HOME/skills/gh. The skill follows the plugin version and needs no writable home (squash-merged in #85).
Removed
The checkout CLI is gone, and DSH owns the session directory. The dsh-git-badge checkout CLI, the dsh-git-badge-checkout bin, the seam/ directory and the session-checkouts.json store are removed. This is a breaking change for anyone who ran the old registration command; require DSH 0.2.1 or newer. The linkedWorktrees card no longer suggests the retired command — it reports how many worktrees exist while the session stays in the workspace.
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, restart dsh web and refresh the browser. Both halves changed, so the new routes, the projection tracking and the client updates need a restart, not only a refresh. This version requires DSH 0.2.1 or newer.
dsh-git-badge 0.20.1
Fixed
The row's token survives a status dot. Upstream mounts sidebar.session.row.leading only while a row's primary state is idle, and gives the 16px cell to its own solid status dot otherwise: green for an unread completion, orange for a pending interaction. A busy session that went idle therefore showed the old dot until the session was opened, while its checkout already had something to say.
The plugin now rides the row-action strip — the one per-row seat React mounts in every state, hidden by CSS rather than unmounted — and paints the node half's token over the dot from that marker plus one injected stylesheet. The cell still decides: the fallback appears only when a solid dot occupies it, a running spinner is left alone, in sync never replaces the dot, and the mark is removed the moment the real seat returns. No upstream byte changes (squash-merged in #83).
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, restart dsh web and hard-refresh the browser. The fallback is client-half code.
dsh-git-badge 0.20.0
Removed
The seam patch is gone, and the install is one step again. Every surface now rides an upstream seat, so there is no apply, no status, no revert and no postinstall hook — the only CLI verb left is checkout (squash-merged in #67, #68). An install that an older version patched still works; to restore pristine DSH bytes, reinstall DSH with npm i -g @deepseek-ai/dsh@latest. Nothing in the plugin needs the patch.
Changed
The session-row glyph is the action token, on upstream's own leading seat. The row's 16px cell shows the one thing the conversation needs — resume, resolve, sync, pull, update, push, merge, commit, review, fix CI or an in sync disc — and the node half is the single authority for both the word and its colour (squash-merged in #66, #70, #71, #72). A clean checkout is never iconless: the disc is green when nothing is outstanding and amber when commits are not yet merged.
The two hover cards lead with the same action sentence. The chip card names the checkout verdict as a heading, the server's suggestion is next step, files is renamed changes, the merge row splits into state and base, and the row card renders the same action beside the checkout and the pull request — so the icon is explained one way everywhere (squash-merged in #69, #73, #75).
The chip names the base in its ahead/behind. A feature branch shows how far it is ahead of and behind the branch it will merge into, not only its upstream (squash-merged in #79, #80, #81).
Fixed
The push suggestion no longer offers a command git refuses. A branch created from origin/main tracks origin/main, so a bare git push fails under the default push.default=simple. The rule and the /gh push skill now suggest git push -u <remote> <branch> (squash-merged in #74).
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, restart dsh web. The node half changed, so the new glyph and the card rows need a restart, not only a browser refresh. There is no apply step.
dsh-git-badge 0.19.0
Fixed
revert refuses a backup from a different upstream generation. apply patches whichever SEAM_DATA_DIR it is pointed at, so the shipped default ($DSH_HOME/git-badge-seam) and a cloned repo's wrapper (seam/) each keep their own backup — and applying through one leaves the other's behind. After a DSH update that stale backup holds an older upstream, and revert restored it blindly: a silent downgrade of the installed package. It now validates the backup first — the current anchors must resolve against it — and refuses with a clear message, changing nothing.
status reports what revert would do, under a revert: line: restore, no-op, or REFUSE and why. SEAM.md had documented that line from the beginning and nobody had implemented it, so the refusal could arrive as a surprise at the one moment it was least welcome.
A worktree registration that cannot be written now says why. The store swallowed the cause, so npx dsh-git-badge checkout <path> reported only "could not write the registration" — no path, no reason, no recovery. It now names the target file, the real errno, and the three ways out.
Added
The chip's hover card names the linked worktrees a session is NOT following. That state used to be invisible: a registration a file sandbox refused left a badge describing the session's own checkout, which looks exactly like a session with nothing to follow, while the agent's work sat in a tree the UI never mentioned. The card now reads 2 linked · none registered — npx dsh-git-badge checkout <path>. It rides detail=1 like the card's other extras, so nothing at rest pays for the extra git worktree list.
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, restart dsh web. The node half changed, so the new card row needs a restart, not just a refresh.
dsh-git-badge 0.18.0
Fixed
The sidebar seam patch works again on DSH 0.2.0-rc.2. That release rewrote dsh-client-ui-workspace/lib/client.js (2821 → 4425 lines) and moved 8 of the 9 anchors the patcher pinned, so status reported drift and apply refused to write. The patch is now three anchors and +48/−0, down from nine and +74/−5 (squash-merged in #61).
Changed
The session-row action token is a pill. It was grey text beside the relative time, which made push — the one row that wants a decision — read as metadata.
- Each action now carries a glyph and a severity-tinted pill:
↑ push,↓ pull,✓ merge,✗ fix CI,! resolve,◆ review(squash-merged in #62). - Routine sync moved off grey onto the app's business-blue token, so the severity ramp is four steps — red, amber, green, blue.
- The glyph is
aria-hidden, so a screen reader still reads the word alone. - The patch is ONE seam now. Upstream declares
sidebar.session.row.hover, so the hover-card provenance line rides that seat and renders on an unpatched install. - The row token also renders in the flat grouping, because upstream no longer passes a
workspaceIdto the row component.
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, run npx dsh-git-badge apply and restart dsh web.
dsh-git-badge 0.17.4
Fixed
The documented patcher command finally runs. Every prompt the product shows — the input-chip tooltip, the postinstall hint, the README — said npx dsh-git-badge apply, and every one failed with "could not determine executable to run": npm's npx auto-runs a bin only when the bin's name matches the package name, and the package shipped two bins that did not match (dsh-git-badge-seam, dsh-git-badge-checkout).
- The package now ships the alias the prompts always assumed:
npx dsh-git-badge applyworks (squash-merged in #59). - The alias multiplexes the checkout bin too:
npx dsh-git-badge checkout <path|--clear>(npx cannot reach a package's second bin by name). - The legacy bins (
dsh-git-badge-seam,dsh-git-badge-checkout) stay for direct invocation.
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md
After upgrading, run npx dsh-git-badge apply and restart dsh web.
v0.17.3
Makes the main hover say base branch · pull requests merge into this.
Fixed
- The default branch is now detected when
refs/remotes/origin/HEADis missing.defaultBranchForread only that symref, so in a repo that has none —git clone --branch <x>, a pruned ref, or any repo that was only ever pushed to — it answered "no default branch" forever. Every default-branch rule was therefore silently inert: the 0.17.2 merge row onmainstill saidno pull request, and the node half still suggested opening a pull request FROM the default branch. The lookup now falls back, network-free, to the base branch this module already probes (origin/main, thenorigin/master); a repo whose default is neither still answersundefined, exactly as before.
This completes 0.17.2, whose merge-row wording was correct but unreachable without the flag.
The version in dsh-git-badge/package.json is what npm receives; publish.yml re-runs the suite before publishing.
v0.17.2
Fixes the branch-name hover on main.
Fixed
- The default branch's branch hover no longer says
no pull request. The always-render merge row (0.17.0) only ever made sense on a feature branch:mainis the base pull requests merge INTO, and none is ever opened FROM it, sono pull requestthere read as a nag for something that cannot exist. When the node half flags the branch as the default one (defaultBranch: true, the same flag the action rules use to suppress "open a pull request" onmain), the row now readsbase branch · pull requests merge into this. Its base-relative counts are suppressed there too —N ahead, M behind mainwhile ONmainis self-referential, and that divergence is already the chip's own↑a ↓btoken. Feature branches are unchanged: stillno pull request, still the counts when they are known.
The version in dsh-git-badge/package.json is what npm receives; publish.yml re-runs the suite before publishing.
v0.17.1
First-hover fix for the hover cards.
Fixed
- The branch, file-count and PR hovers now open on the first hover. They were wrapped in the shell's uncontrolled
Tooltiponly after the lazydetail=1payload arrived, so a wrapper mounted underneath a resting pointer could never open — the first hover did nothing and needed a leave-and-return.
Changed
- Internal simplification pass (#52), no user-facing change.
The version in dsh-git-badge/package.json is what npm receives; publish.yml re-runs the suite before publishing.
dsh-git-badge 0.17.0
Added
- The PR token has its own hover: the commits in that pull request.
PR#47 ✓
now shows the commits on the branch that are not on the base
(git log <base>..HEAD, capped at 10 with "… and k more"), in the same line
format as the branch hover's list — hash, subject, compressed age, full-width
with ellipsis. Nothing else rides it: the token already states the number and
CI state, so the one question left is what is in it. Hover-gated with the rest
ofdetail=1, and the total reuses the ahead count already computed. /gh clean [<path>...]appears in the/ghmenu behind a risk gate. The
menu is built from status, not from this skill's prose, so the verb is offered
there whenever untracked files exist — always last, never as the badge's
suggested action, and carrying the host's ownRiskConfirmation: Confirm
stays disabled until "I understand untracked files cannot be recovered" is
ticked. That gate names the risk; the agent then names the files
(git clean -n, quoted back) and asks again beforegit clean -f.- A
/gh clean [<path>...]verb, confirm-first by construction. Removing
untracked files is the one operation with no reflog and no stash entry, so the
verb's first step is alwaysgit clean -n -- <paths>with the output quoted
back verbatim (the user approves the list, not the idea), then an explicit yes,
thengit clean -f -- <paths>on named paths only.-x,-dand bare
git clean -fare forbidden — ignored files are often credentials and-d
turns one path into a tree. It stays out of the badge's ranked suggestions: a
destructive action the agent cannot infer intent for is never suggested, only
available on request.
Changed
- The session row's action token only appears when the session is idle. A turn
in flight is exactly when a git suggestion is noise: the checkout is still
moving and the agent has not finished. The row reads its run state from the
shell's standard kit —useSessions, the same selector hook the workspace UI
itself uses — and renders nothing while that session isrunning. The filter is
on render, not on the fetch, so the row's hover line is unaffected. On a shell
that seeds no such hook the row behaves as before, and the console says which of
the two it got. - The PR/CI token stops lagging behind the forge. The forge read is
TTL-bounded and its refresh is request-driven, while an idle chip only asks
every 60s — so the old 90sprTtlMssilently suppressed every other poll, and
a pull request that appeared on GitHub with no local git event to announce it
could take ~2.5 minutes to show up. At 20s the TTL no longer outlives the
client's poll, so the first refresh after the forge changes picks it up and the
worst case falls to roughly the poll interval. Cost: up to onegh pr viewper
open chip per minute, where it was one per ~2 minutes. - The branch hover shows only the merge axis.
upstreamandsyncare gone
— they stated the same divergence against the branch's own remote, in arrows,
whenmergealready states it against the base branch in words. Themerge
row now ALWAYS renders:ready to merge,blocked: draft | review required | checks failing,no pull request, each joined withN ahead, M behind main
when those counts are known. A row that can be absent is a row the reader has
to reconstruct. - The commit cells lost their trailing colon (a later change had reintroduced it
after the earlier removal), so both hovers readabc1234 subject · 2h ago. - One action list, built by the server. Both halves used to derive the
pull/push/commit/pr conditions, and the copies drifted: the card once promoted
a client-only extra into its action row, and/gh prwas offered on the
default branch. The node half now publishesactions— the ranked rules in the
configured order with the top entry flaggedprimary(also served asnext,
on every response), then the standing options (pr view <n>,pr, and the
flaggedclean).merge <n>becomes a standing entry whenever the PR is
mergeable, so it now appears alongside a primarypush/pullinstead of only
when it wins the ranking. The client renders the list verbatim and keeps only
presentation — labels and the clean risk gate;actionsrides thepr=1
payload only, so sidebar rows stay lean. Net: ~65 lines of duplicated client
rules deleted, and the conditions are unit-tested where the data lives. - The upstream sync numbers ride the branch's hover and link.
↑a ↓bwere
rendered inside the file count's names tooltip and outside the branch's compare
link, though they are the branch's standing against its upstream — so they now
sit with the branch name: same lineage hover, same compare-view link, and the
link's accessible name says "N ahead and M behind upstream".✎nkeeps its own
names tooltip. Visible side effect: the arrows render before a paused-operation
token rather than after it.
Fixed
- The PR token's hover lines its commits up like the branch hover. Both lists
now come from one renderer: a fixed-width monospace hash cell, so every
description starts on the same column and the list reads as a table. The PR
list had reused the card's label style, whoseminWidthandflexonly apply
inside a flex row — on a plain inline span they did nothing, so the hash sat
flush against its description with the columns ragged. - The PR token's hover is reachable by hovering the token itself. The commits
it lists are detail-only, and only the status mark and the branch name enabled
thedetail=1fetch — so a pointer that went straight toPR#47 ✓had rested
on nothing that fetches, and its hover could not open until the mark had been
hovered first. The token is now its own detail gate, in both its linked and
plain forms. - No more "open a pull request" on
main, and the hover card shows only the
server's verdict. Two layers disagreed: the node half correctly returned
nothing to do for a clean, synced default branch, while the client's extras
still offered/gh pr— and the card promoted that extra into itsaction:
row, so a checkout with nothing to do displayed a suggestion. The node half now
resolves the repository's default branch (refs/remotes/origin/HEAD,
TTL-cached and refreshed out of band like the fetch, so the hot path pays
nothing) and flags it on the response; theprextra is suppressed when the
branch IS that default; and the card's action row reads the server'snext
directly, leaving the extras to the/ghpicker where they belong. - The seam suite no longer writes into your real
~/.dsh/git-badge-seam.
One block spawned the postinstall hook withoutSEAM_DATA_DIR, so the hook
resolved its store to the machine's actual data directory: a test run
overwrote the realbackup-client.js/backup-index.jsand left a
restart-pending.jsonbehind. It passed on CI only because the runner's
$HOMEis writable — under a read-only$HOMEit failed with EROFS. The
block now takes a throwaway data dir like the rest of the file.
Full changelog: https://github.com/Kevin-McIsaac/dsh-workspace-git-badge/blob/main/dsh-git-badge/CHANGELOG.md