Skip to content

Releases: abizer/nssh

v2.5.1

12 May 05:18
6deeb98

Choose a tag to compare

ci: bump goreleaser-action v6 -> v7 (#13)

## Summary

v7's only breaking change is the Node.js runtime (20 → 24). GitHub
deprecated Node 20 for actions in Sept 2026; the v2.5.0 release run
surfaced the deprecation warning. No input/output changes — `v6` and
`v7` accept the same `version` / `args` config.

`v7` floating tag currently resolves to `v7.2.1` (same SHA), matching
the floating-major-tag style this repo already uses for
`actions/checkout@v6` and `actions/setup-go@v6`.

## Test plan

- [x] `v7` floating tag confirmed to exist on
goreleaser/goreleaser-action
- [ ] Next release tag push exercises the bumped action (only runs on
`v*` tag push, so can't validate via CI on this PR — merge then cut a
patch tag if you want to smoke-test)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: a dependency bump in the GitHub Actions release workflow,
but it can affect tagging/release publishing behavior and only gets
exercised on release runs.
> 
> **Overview**
> The release GitHub Actions workflow now runs GoReleaser via
`goreleaser/goreleaser-action@v7` (was `@v6`) while keeping the same
`version` and `args` configuration.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
d86222e03b098704a09d9646bf13ea008c5f69bd. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v2.5.0

12 May 04:22
bfa3180

Choose a tag to compare

nssh: harden session recovery (#11)

Hardens the per-host session-recovery mechanism added in the original checkpoint.

- Skip `prepareRemote` SSH when joining an existing host session — the remote state was already set up by the first connect.
- Replay missed messages on reconnect via ntfy `?since=<id>`; track lastID across drops. Solves the laptop-closed-overnight case directly.
- New `subscribe-up` / `subscribe-down` LogEvent entries with reconnect gap, rendered by `nssh status --tail`.
- New `ping` / `pong` wire kinds + `pingTopic` helper to distinguish "alive" from "wedged" peers.
- Collision prompt when an existing session is found for the host: `[J]oin / [R]eplace (SIGTERM then SIGKILL) / [N]ew / [C]ancel`; default depends on liveness ping. Non-interactive shells silently join with a stderr warning. Flags: `--join` / `--replace` / `--new`.
- New `nssh sweep [--all|--older <dur>] <host>` subcommand to clean up orphan `mosh-server` processes on a remote. Safe with tmux-inside-mosh.

Follow-ups: #10 (auto-sweep on connect, spare-yourself in --all), #12 (per-session env-injection design — properly fixes the single-session-file rendezvous limitation).

v2.4.2

06 May 01:20
4bd4104

Choose a tag to compare

ci: fix brew style violations in generated cask (#9)

## Summary
\`brew test-bot\` is failing on \`abizer/homebrew-tap\` master ([run
25410956395](https://github.com/abizer/homebrew-tap/actions/runs/25410956395))
because the v2.4.1-generated \`Casks/nssh.rb\` has two RuboCop offenses:

1. \`Style/IfUnlessModifier\` — multi-line \`if OS.mac?\` for a single
statement. Rewritten as modifier-if.
2. \`Layout/EmptyLinesAroundBlockBody\` — blank line before the cask's
closing \`end\`, courtesy of goreleaser's \`# No zap stanza required\`
placeholder. Replaced by a real \`zap.trash\` stanza listing the dirs
nssh writes locally (\`~/.local/state/nssh\`, \`~/.config/nssh\`).

## Test plan
- [ ] Merge → cut a \`patch\` release (v2.4.2) → confirm goreleaser
pushes a fresh \`Casks/nssh.rb\` to the tap
- [ ] \`brew test-bot\` on the tap goes green
- [ ] On macOS: \`brew install --cask abizer/tap/nssh\`; \`nssh\`
launches without Gatekeeper alert; \`brew uninstall --cask --zap nssh\`
cleans up local state

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: only adjusts GoReleaser Homebrew cask generation to satisfy
`brew style`, without changing app runtime behavior beyond uninstall
cleanup metadata.
> 
> **Overview**
> Updates `.goreleaser.yaml` to change the generated Homebrew cask: the
post-install quarantine removal hook is rewritten as a single-line
modifier `if OS.mac?` to satisfy RuboCop.
> 
> Adds an explicit `zap.trash` section (listing `~/.local/state/nssh`
and `~/.config/nssh`) to avoid GoReleaser emitting the `# No zap stanza
required` placeholder that was causing `brew style` empty-line
violations.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
f88fc8bff30a35649abe4b1946992fcb5538bdbb. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v2.4.1

06 May 00:59
a998f43

Choose a tag to compare

ci: migrate goreleaser brews to homebrew_casks (#8)

## Summary
- `brews:` is being phased out by goreleaser ([deprecation
notice](https://goreleaser.com/deprecations/#brews)). The v2.4.0 release
log warned about this.
- Renames the section to `homebrew_casks:`, drops the formula-only
fields (`directory`, `license`, `install`, `test`), and adds a
post-install hook that strips `com.apple.quarantine` so unsigned darwin
binaries actually launch on modern macOS.

## Follow-up (in `abizer/homebrew-tap`)
- Add `tap_migrations.json` mapping `nssh` → cask, and delete the old
`Formula/nssh.rb` so existing `brew upgrade nssh` users land on the
cask.

## Test plan
- [ ] Cut a `patch` release via Actions → release → Run workflow;
confirm goreleaser publishes a cask to `abizer/homebrew-tap` under
`Casks/nssh.rb`
- [ ] `brew install --cask abizer/tap/nssh` on macOS, then `nssh` runs
without the "damaged / cannot be opened" Gatekeeper alert

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: release packaging config change only, but it can affect
macOS install/upgrade behavior if the tap expects a formula vs cask or
the post-install hook misbehaves.
> 
> **Overview**
> Updates GoReleaser Homebrew publishing from deprecated `brews` to
`homebrew_casks` for `nssh`, removing formula-specific fields
(`directory`, `license`, `install`, `test`).
> 
> Adds a macOS-only post-install hook to strip the
`com.apple.quarantine` xattr from the staged binary so the downloaded
(non-notarized) app can launch without Gatekeeper blocking.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
4c11a84028b2ffbac411bb03025e5bd7e4e9df80. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v2.4.0

06 May 00:45
0d0b525

Choose a tag to compare

ci: add workflow_dispatch release trigger (#7)

## Summary
- Adds `workflow_dispatch` to `release.yml` with a `bump:
patch|minor|major` choice input
- Computes the next semver from the latest `v*` tag, tags HEAD, and
pushes — then goreleaser runs in the same job (so no PAT needed;
`GITHUB_TOKEN`-pushed tags don't trigger downstream workflows)
- Existing `push: tags` path is preserved for manual `git push origin
vX.Y.Z`
- Guarded so dispatch only runs from `master`

## Test plan
- [ ] Actions → release → Run workflow on `master` with `bump=patch`
produces the next tag and a goreleaser run
- [ ] Manual `git tag vX.Y.Z && git push --tags` still triggers the
existing path

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes the release pipeline to create and push git tags
automatically, which can unintentionally cut releases or bump the wrong
version if misused. Risk is somewhat mitigated by restricting manual
dispatch runs to `master` and keeping the existing tag-push trigger.
> 
> **Overview**
> Adds a manual `workflow_dispatch` trigger to the `release` GitHub
Actions workflow with a `bump` input (`patch|minor|major`).
> 
> On manual runs, the workflow now computes the next `v*` semver tag
from the latest existing tag, creates and pushes that tag (guarded to
only run from `master`), then proceeds with the existing
GoReleaser-based release flow; the original `push: tags` trigger remains
unchanged.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
eae184a0d24e72646f119ce9a68e92c49134819f. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

v2.3.0

23 Apr 05:33
3dcc72b

Choose a tag to compare

nssh v2.3.0: status subcommand, unified wire events

v2.2.0

22 Apr 16:49
a28fd7d

Choose a tag to compare

nssh v2.2.0: ntfy read deadlines + one-shot remote prep

v2.1.0

20 Apr 21:42
cc0d7bc

Choose a tag to compare

nssh v2.1.0: release via goreleaser

v2.0.1

18 Apr 00:56
147938b

Choose a tag to compare

Full Changelog: v2.0.0...v2.0.1

v2.0.0

17 Apr 20:19
f949ded

Choose a tag to compare

Full Changelog: v1.4.0...v2.0.0