Skip to content

Releases: Kevin-McIsaac/dsh-workspace-git-badge

dsh-git-badge 0.21.0

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 04 Nov 03:25
3866915

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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 13 Oct 08:07

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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 13 Oct 07:37

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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 12 Oct 03:30
d829a5c

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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 12 Oct 02:41
b195b22

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 workspaceId to 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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 18 Sep 01:40
83d5934

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 apply works (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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 17 Sep 01:34
ac7a717

Makes the main hover say base branch · pull requests merge into this.

Fixed

  • The default branch is now detected when refs/remotes/origin/HEAD is missing. defaultBranchFor read 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 on main still said no 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, then origin/master); a repo whose default is neither still answers undefined, 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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 17 Sep 01:17
fd94998

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: main is the base pull requests merge INTO, and none is ever opened FROM it, so no pull request there 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" on main), the row now reads base branch · pull requests merge into this. Its base-relative counts are suppressed there too — N ahead, M behind main while ON main is self-referential, and that divergence is already the chip's own ↑a ↓b token. Feature branches are unchanged: still no 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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 16 Sep 23:37
5003993

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 Tooltip only after the lazy detail=1 payload 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

Choose a tag to compare

@Kevin-McIsaac Kevin-McIsaac released this 16 Sep 05:25
4eda0f6

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
    of detail=1, and the total reuses the ahead count already computed.
  • /gh clean [<path>...] appears in the /gh menu 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 own RiskConfirmation: 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 before git 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 always git clean -n -- <paths> with the output quoted
    back verbatim (the user approves the list, not the idea), then an explicit yes,
    then git clean -f -- <paths> on named paths only. -x, -d and bare
    git clean -f are 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 is running. 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 90s prTtlMs silently 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 one gh pr view per
    open chip per minute, where it was one per ~2 minutes.
  • The branch hover shows only the merge axis. upstream and sync are gone
    — they stated the same divergence against the branch's own remote, in arrows,
    when merge already states it against the base branch in words. The merge
    row now ALWAYS renders: ready to merge, blocked: draft | review required | checks failing, no pull request, each joined with N 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 read abc1234 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 pr was offered on the
    default branch. The node half now publishes actions — the ranked rules in the
    configured order with the top entry flagged primary (also served as next,
    on every response), then the standing options (pr view <n>, pr, and the
    flagged clean). merge <n> becomes a standing entry whenever the PR is
    mergeable, so it now appears alongside a primary push/pull instead of only
    when it wins the ranking. The client renders the list verbatim and keeps only
    presentation — labels and the clean risk gate; actions rides the pr=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 ↓b were
    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". ✎n keeps 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, whose minWidth and flex only 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
    the detail=1 fetch — so a pointer that went straight to PR#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 its action:
    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; the pr extra is suppressed when the
    branch IS that default; and the card's action row reads the server's next
    directly, leaving the extras to the /gh picker where they belong.
  • The seam suite no longer writes into your real ~/.dsh/git-badge-seam.
    One block spawned the postinstall hook without SEAM_DATA_DIR, so the hook
    resolved its store to the machine's actual data directory: a test run
    overwrote the real backup-client.js/backup-index.js and left a
    restart-pending.json behind. It passed on CI only because the runner's
    $HOME is writable — under a read-only $HOME it 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