Releases: shayuc137/sshq
Release list
v0.4.1
Changelog
- e11651f chore(release): prepare v0.4.1
- dea93d2 docs(skill): add Windows non-ASCII output recipes reference
- 379620f docs(skill): generate global flags and pin the hand-written tables to code
- 3c9945f feat(exec): add --raw for envelope-free output with exit code passthrough
- 7d4d26f feat(output): stamp every envelope with protocol sshq/3
- 7f0a147 fix(cluster): report exit_code null for hosts that never ran
- 94fd4f4 fix(cp): honor --timeout on the daemon path and drop the inherited default
- 6cddafb fix(output): classify dial and run-phase errors instead of internal_error
- 4cb6d2c style: gofmt alignment drift in policy.go and exec_test.go
- 823ee18 test(contract): publish envelope JSON Schema and golden contract tests
v0.4.0
BREAKING: envelope schema v3
JSON envelopes and process exit codes are redesigned around one rule: the output explains itself. Anything consuming the v2 envelope must update. See CHANGELOG for the full list:
- Success is
{"data": ...}(exec adds a top-levelexit_code); errors are{"error": {"code", "hint", "action"}}. Theokandschema_versionfields are gone. - 14 machine-readable
error.codevalues;result_indeterminatemarks operations that may have executed and must never be blindly retried. - Process exit codes are tri-state:
0good answer,1completed with a bad answer,2sshq failed. Remote exit code passthrough is removed. - exec
data.hostis nowdata.alias;update --checkexits0when an update is available (reverses v0.3.1).
Upgrading from v0.3.x with sshq update
The binary updates correctly, but the old updater may print skill_error: "new binary reported an unknown skill update error" and exit 2 at the end. This is a false alarm: the old binary cannot parse the new binary's v3 envelope when refreshing skills. Run sshq skill status to confirm — skills are updated. This affects only the one-time jump from v0.3.x.
Also in this release
- Daemon freshness:
~/.ssh/confighot-reload and a shared shell-profile cache — config and cache changes apply without restarting the daemon; newsshq cache clear. - READMEs rewritten in both languages; sudo-free installation.
v0.3.1
v0.3.0
sshq v0.3.0
This release is built from a real-world field report: an agent drove sshq through a WireGuard + ProxyJump + Windows repair session and filed 14 issues. All of them are fixed here, plus the structural changes to keep them from coming back.
Breaking: JSON envelope schema v2
The remote command's exit code is now a top-level envelope field:
{"ok": true, "exit_code": 2, "data": {"stdout": "", "stderr": "..."}, "schema_version": 2}ok: truemeans the sshq call itself completed — connection made, command ran, output captured. It has never meant "the remote command succeeded", but v1 made that easy to misread. Check top-levelexit_codefor the remote result.data.exit_codeis kept for compatibility; new integrations should read the top-level field.- Transport failures stay
ok: falsewith noexit_code. cluster execreports per-host exit codes the same way; its top-levelexit_codeis the first nonzero remote code in alias order.
ProxyJump everywhere
probe and trust used to dial the target directly, timing out on any host behind a jump — while exec connected fine. All alias-taking commands now share one connection path (ProxyJump chain included):
probe <alias>probes through the jump chain and reportsprobe_path(via-proxy/direct),resolved_hostname,proxy_jump. Old direct-TCP behavior is available asprobe --direct.trust <alias>andtrust --replacefetch host keys through the jump chain, so the fix suggested by a host-key error actually works in the environment that produced it.- Host-key errors now include the alias, resolved endpoint, ProxyJump, the known_hosts entries that were checked, and both fingerprints.
New: sshq doctor
One call to tell configuration, network, jump, host-key, auth and shell problems apart:
sshq doctor <alias>
Seven ordered checks with skip-on-failure, a failed_check field, and a next_action that is always runnable as-is. Exit 0 when all green, 1 otherwise.
New: skill freshness
- On startup, sshq warns on stderr (once per binary version) when installed agent skills are older than the binary.
sshq skill updaterefreshes every existing installation in place — Claude Code, Codex, user or project scope — without creating new ones.
PowerShell scripts actually work now
--script-file --shell powershell previously lost multi-line constructs (arrays, functions, here-strings produced no output, exit 0) and mangled non-ASCII on CJK codepages. Scripts now run via -EncodedCommand (UTF-16LE, whole-script parsing, codepage-independent); scripts over 8 KiB upload to a temp file and run with -File, cleaned up afterwards. PowerShell's CLIXML stderr noise is decoded back to plain text.
Windows quality-of-life
cp --mkdirscreates missing remote parent directories (SFTP and raw fallback).cluster execoutput is now codepage-decoded and includes per-host stderr (previously dropped).- Windows profiles record
powershell_path/pwsh_path, so a WindowsApps-aliaspwshcan't masquerade as installed. - New guides: Windows path conventions, background tasks via Task Scheduler, and a remote-support runbook (WireGuard peer → OpenSSH → trust → cleanup).
Fixes
- Shortcut form
sshq <alias> "<cmd>"now accepts the exec flags (--script-file,--shell,--no-daemon); skill docs teach the canonicalsshq execform and every documented command line is verified against the CLI by a contract test. sshq versionno longer printsunknownfor go-install builds: pseudo-versions yield the real commit and date, and fields that genuinely don't exist are omitted.config add/setecho the fully resolved host and point atsshq doctorfor verification.
Upgrading
- Install the new binary (releases, or
go install github.com/shayuc137/sshq/cmd/sshq@v0.3.0). - Run
sshq skill updateto refresh installed agent skills — sshq will remind you if you forget. - If you parse
--jsonoutput: read top-levelexit_code, keep treatingokas call-level status.
Changelog
- 0e715c5 docs(skill): document PowerShell script-file execution mechanics
- 675d355 docs(skill): stamp documentation version 0.3.0
- c02c0d6 feat(cli): add sshq doctor — one-shot structured diagnosis
- 715baf4 feat(cli): shortcut form shares exec flags + skill doc contract tests
- 9a4c73e feat(conn): unify probe/trust/exec on shared DialTCP connection path
- 9793740 feat(exec): stabilize PowerShell --script-file via -EncodedCommand
- 5a2f5cf feat(output): hoist remote exit_code to envelope top level, schema v2
- cc1f40f feat(skill): outdated-skill reminder + sshq skill update
- 02d716d feat(version): add --version flag and fix go-install version detection
- aab3f43 feat(version): auto-detect VCS info via runtime/debug.ReadBuildInfo
- 2e1ddb4 feat: Windows UX pack — encoding audit, cp --mkdirs, config verify, recipes
- d9cbbf5 fix(version): omit unavailable commit/date instead of printing unknown
- b5c969c fix: remove unused resolveProxyChain functions (staticcheck U1000)
v0.2.0
What's new
Security layer
- Encrypted credential store — passwords encrypted with age using SSH public key.
sshq credential set/list/delete. - Capability policy — command whitelist/blacklist, path whitelist, per-host override/append.
sshq policy validate/check/list/grant/revoke. - Tunnel forward whitelist —
local_forward_whitelist/remote_forward_whitelistrestrict tunnel targets. Supports exact match, port wildcard, port range, host wildcard. - Temporary grants —
sshq policy grantwith TTL, requires terminal (agents cannot self-grant), never overrides blacklists. - Audit logging — JSONL metadata for all operations. Fail-closed.
sshq auditquery CLI.
New commands
sshq docs --verify— detect drift between command tree and skill reference docs.sshq policy check --local-forward/--remote-forward— test tunnel forward policy decisions.
CLI improvements
sshq skill install --codex/--project— simplified from--target/--scope.- Connecting status moved to verbose — stderr silent by default.
Documentation
- README rewritten: problem-driven intro, TTY before/after demo, security model, platform-specific install (no Go required).
- All 8 bilingual guides updated with policy/audit coverage.
- SKILL.md restructured: environment checks, safety confirmations, JSON-first error handling.
- Reference docs enhanced with output fields, exit codes, and agent handling notes.
Install
# Linux amd64
curl -L https://github.com/shayuc137/sshq/releases/download/v0.2.0/sshq_0.2.0_linux_amd64.tar.gz | tar xz
sudo mv sshq /usr/local/bin/
# macOS (Apple Silicon)
curl -L https://github.com/shayuc137/sshq/releases/download/v0.2.0/sshq_0.2.0_darwin_arm64.tar.gz | tar xz
sudo mv sshq /usr/local/bin/
# Or with Go
go install github.com/shayuc137/sshq/cmd/sshq@v0.2.0Full changelog: https://github.com/shayuc137/sshq/blob/main/CHANGELOG.md
v0.1.0
Changelog
- 006e923 feat: C1 config parser and host commands (ls/search/info)
- 2647a26 feat: C1 remote profile detection and cache
- 3cfd2e6 feat: C1 sshq cp with SFTP engine
- 412b634 feat: C2 SSH connect and exec command
- a19f124 feat: C2 SSH raw stream fallback for cp
- 94efc60 feat: C2 multi-shell exec with --script-file
- 3e81519 feat: C3 Windows encoding transcoding and transfer guard
- 7369733 feat: C3 daemon with connection pool and streaming IPC
- 7431c4e feat: C3 server-to-server streaming relay
- f49c006 feat: C4 TCP probe command with batch support
- ad2d474 feat: IPC v2 protocol upgrade — envelope + typed payload
- 166541d feat: Phase 0 project skeleton
- 3cf675e feat: ProxyJump support with recursive chain resolution
- 6c8e2ba feat: SSH tunnel management (local + remote forward)
- 7da793b feat: add sshq skill package and docs generator
- a41a656 feat: auto stdin injection for Windows shells
- 6573822 feat: auto-generate CLI command reference docs
- 0388d8e feat: cluster concurrent exec with tag/env filtering
- b1f69d3 feat: config CRUD — add, set, remove SSH hosts via CLI
- eb4367c feat: exec pipeline — shell override, timeout, alias shortcut
- c4a421b feat: fix --env filter, add cluster --hosts, env key compat
- 7aa8f97 feat: sshq skill install/export/status with embedded skill files
- 766de23 feat: trust command and structured SSH error messages
- b53278c fix: Phase 4.5 — close acceptance gaps before Phase 5
- 331b7ad fix: Windows profile detection and SFTP PosixRename fallback
- 1a28a48 fix: address trellis-check findings
- a12c7d7 fix: align go.mod version to 1.26.0
- 8f081e7 fix: handle MSYS2/Cygwin detection and refine transfer guard
- 324fa88 fix: handle SIGINT/SIGTERM for transfer cleanup
- 93ab339 fix: quality check fixes — cluster fallback, proxy cycle guard, sync
- 65ef00a fix: remove unused stub function and Tunnel struct fields
- 89b4303 init: project skeleton with MIT license
- f71852f refactor: architecture cleanup — daemon dispatch, stubs, cache, trust, verbose
- b041752 refactor: deepen output.Writer — TTY auto-detect, kill compact format
- 4e78480 refactor: introduce sshclient.Client wrapper type
- eece836 style: gofmt Phase 1-3 legacy files