## eneskirca/nodeterm — v0.4.0…v0.4.1

_296+ commits._

### Features
- **feat: one-way context links (#852)** (ef0c4af)
- **feat(ssh): warn before reopening a project that was shared to a hosted team** (20bc420)
- **feat(windows): in-app "Prepare for update" + session-host shutdown command (#829)** (83827a2)
- **feat(ssh): Share with team dialog, tab menu and ⌘K entries** (78e963d)
- **feat(windows): run the session host from a staged runtime outside the install dir (#829)** (f51a3db)
- **feat(ssh): Share with team orchestrator — ordered handover with reopen-on-failure** (0bf44a1)
- **feat(relay): one hosted tab per shared project, opened and closed live on share changes** (9289567)
- **feat(relay): hosted tab model — one tab per shared project, following share changes** (f1f0316)
- **feat(ssh): shareTeam IPC — probe, install, flush, bootstrap, kill-verify, resume, seed bookmark** (b41600c)
- **feat(ssh): generated remote shell for Share with team (probe, install, team CLI, kill-verify)** (fbabafd)
- **feat(workspace): handedOffTo — a project shared to a hosted team is never written again** (ba2f51b)
- **feat(relay): tell connected team members when the shared project set changes** (37f1274)
- **feat(relay): team resume — restart handed-over agents on the core's own tmux** (4c226c7)
- **feat(relay): team bootstrap — team, owner, adopted project and share in one idempotent verb** (5fc53a7)
- **feat(workspace): headless folder adoption by real path for team bootstrap** (8c5fe83)
- **feat(relay): stable admin error codes and JSON refusals on stdout** (3fef01c)
- **feat(kanban): show owning project in card modal header** (49396de)
- **feat(renderer): share a live link from every surface, gated by availability before the Pro gate** (de12535)
- **feat(renderer): the LIVE chip and its popover on the node, card, card modal and sidebar** (b39b2ea)
- **feat(renderer): live-link store and the copy the owner reads** (9e50908)
- **feat(canvas-control): group, move, arrange and align a project that is not on screen** (4adcb9f)
- **feat(watch-link): the live-link registry and owner IPC, wired into both shells and every bridge** (6c8e376)
- **feat(watch-link): keep links a locked keychain cannot unseal, and ask PtyManager whether a session exists** (af290b8)
- **feat(watch-link): the link host — viewer sessions, keyframes, throttling, chat and kick** (de64629)
- **feat(watch-link): a mid-stream filter says when it has settled** (436a788)
- **feat(pty): serialize a watcher's size sync per session, and report a session's current size** (c2d307a)
- **Merge pull request #1080 from eneskirca/feat/windows-ssh-agent-add** (762aeab)
- **Merge origin/main (#1078 ProxyJump) into feat/windows-ssh-agent-add** (59a52f9)
- **feat(ssh): add a passphrase-unlocked key to the Windows ssh-agent on opt-in** (2b3b735)

### Fixes
- **Merge pull request #1100 from probertson/fix/chat-turn-end-reload** (7b06d2e)
- **Merge origin/main into fix/chat-turn-end-reload** (a2e44e7)
- **Merge pull request #1101 from probertson/fix/chat-dialog-guard** (c06a1cc)
- **Merge pull request #1099 from probertson/fix/chat-queued-prompts** (ddfe965)
- **Merge pull request #1098 from probertson/fix/chat-line-breaks** (52af82a)
- **Merge pull request #1105 from eneskirca/fix/linux-node-tokens** (190eb76)
- **Merge pull request #1106 from eneskirca/fix/settings-dispatch-tdz** (a802c6c)
- **fix(settings): declare repository before the dispatch check reads it (#1090)** (cc3ce5f)
- **fix(node-identity): mint node tokens on a Linux desktop with no keyring** (6071407)
- **fix(kanban): route card file links by the card's project; keep .html editable outside link opens** (236add1)
- **Merge pull request #958 from ezwep/fix/854-focus-clear-pinned-panel** (fc1dad4)
- **Merge pull request #1097 from eneskirca/fix/welcome-two-column** (9b70c96)
- **Merge pull request #952 from ezwep/fix/restart-ctrlc-other-agents** (39f8ab1)
- **Merge pull request #942 from ezwep/fix/928-claude-restart** (b48bc7a)
- **Merge pull request #927 from ezwep/fix/842-codex-restart** (e128963)
- **Merge pull request #989 from ezwep/fix/subagent-card-stale-activity** (05d6776)
- **fix(welcome): lay the two start-screen lists out under the card row, side by side** (4e08f95)
- **fix(context-link): carry one-way reader through team sync and the edge menu (#852)** (6170005)
- **fix: keep one-way link direction through CLI links, bad readers and ropes (#852)** (a500163)
- **Merge pull request #1095 from eneskirca/fix/windows-ci-shutdown-preflight-tests** (14e448e)
- **fix(share-team): a refused ⇧⌘T entry is dropped, not put back on top** (87e83af)
- **fix(relay): a closed team tab is never reopened on the local core** (b90079a)
- **fix(relay): a viewer-fallback session follows share changes; docs for the final fixes** (09580a8)
- **fix(ssh): "Open here anyway" never resumes the team's conversations a second time** (08eb66e)
- **fix(relay): go to a shared node on its team tab; keep team tabs out of Recently closed** (209f69d)
- **fix(relay): team resume never resumes one node twice at once** (546e8c1)
- **fix(ssh): Share with team re-checks the canvas before it marks the project** (3c0e6b1)
- **fix(ssh): a cancelled install ends the share** (fff7a6b)
- **fix(ssh): seed only an issued join code; code the shutting-down bootstrap** (614e98e)
- **fix(ssh): Share with team never shares a home directory** (c84cb8a)
- **Merge pull request #1093 from eneskirca/fix/windows-update-session-host** (8723293)
- **Merge pull request #1089 from eneskirca/fix/pr-962-review** (b0a6d19)
- **Merge pull request #1091 from FabricioCasali/fix/ci-flaky-tests** (beb124f)
- **fix(relay): hosted team tabs follow share events per connection and never save a placeholder** (5bbc6b1)
- **fix(ssh): Share with team orchestrator — report a failed restore, guard every step after the bootstrap** (d2f37b1)
- **fix(relay): hosted tabs keep the host id, order share events and grey every bound tab** (fa3f837)
- **fix(ssh): share probe never runs an unrecognised server; refuse unsafe values; tmux-message kill verdicts** (92de54e)
- **fix(workspace): handedOffTo guards every remote write; keep sshProjectIds as identity** (2719d0a)
- **fix(workspace): only an owner client's load hands out a pending adoption** (f56d7af)
- **fix(workspace): adoptFolder refuses unreadable state, localizes reuse, keeps rev and survives stale saves** (7f6beeb)
- **Merge pull request #954 from ezwep/fix/940-project-name-limit** (1948621)
- **Merge origin/main into fix/940-project-name-limit** (513ea9e)
- **fix(terminal): link a path an agent wrapped under a hanging indent** (0f617f6)
- **Merge pull request #926 from ezwep/fix/913-refresh-providers** (e4a05a2)
- **Merge pull request #1076 from eneskirca/fix/pr-832-review** (d5f6c6a)
- **Merge pull request #1082 from FabricioCasali/fix/control-form-cp1252** (1f9e6d9)
- **Merge pull request #1084 from FabricioCasali/fix/send-to-unstarted-node** (485c8f1)
- **Merge pull request #1086 from FabricioCasali/fix/list-agent-state** (37e94a7)
- **fix(renderer): the create dialog reads session protection from the local session** (472ebd7)
- **fix(renderer): a live-link row is judged by its node's project; a closed relay tab is never named** (627bcf5)
- **fix(core): a watcher join does no wrong-machine read and no throwaway capture; seams refuse misuse** (6fffe78)
- **fix(core): a rebuilt index pauses only live links' node-gone, not the mirror's pruning** (0a8cefe)
- **fix(watch-link): say when viewers cannot watch, and what the create dialog promises** (4698f55)
- **fix(watch-link): Stop all reaches other machines' links when it is needed, and says what it reached** (d47149b)
- **fix(watch-link): harden the vendored protocol (chat bidi + code-point caps, sealBox, link format)** (eac2d29)
- **fix(hook-server): build form fields as own properties** (d5c3a26)
- **fix(chat): never send into Claude Code's own dialogs from the ⌘M view** (cc71894)
- **fix(chat): show a finished reply without reopening the view** (6e0b690)
- **fix(chat): show prompts typed while a turn was running** (813a00b)
- **fix(control): name every agent's state in `list`** (bd7d8ef)
- **fix(chat): render single line breaks and quotes as Claude Code does** (63ec77c)
- **fix(messaging): wait for a held node to start, and queue a send to a fresh one** (82a0381)
- **fix(renderer): live-link chip lets keys and drags through; popover isolates itself, says what failed** (f1ef97a)
- **fix(watch-link): hold a digest of each sealed secret, never its text, and say what a seal refusal loses** (b5e419d)
- **fix(workspace): an index that parses but is no index we know also marks the run as rebuilt** (08eb0ce)
- **fix(messaging): queue a send to a node whose launch is still held** (f51f810)
- **fix(watch-link): keep sealed links through a keychain that stops sealing, and tighten the registry** (a327899)
- **fix(workspace): an index rebuilt from nothing is never a complete read of the projects** (e5c6b79)
- **fix(watch-link): no capture sends no keyframe; stop never mints; a join without a size is refused** (0bc99cd)
- **Merge pull request #1083 from eneskirca/fix/chat-system-records-followup** (a1d19b1)
- **fix(chat): a summary-only task-notification reads as finished; README states the allowlist** (8cda1e7)
- **Merge pull request #1079 from eneskirca/fix/chat-system-records** (eb80c6f)
- **fix(chat): content-only task-notification needs a system/unset promptSource (allowlist)** (9460239)
- **fix(chat): review fixes for system-record chips (#1079)** (b0c8b9a)
- **fix(chat): render system-injected user records as tool chips, not user bubbles** (3d7dbe0)
- **fix(hook-server): read a native Windows curl's code-page escapes instead of failing silently** (fa4c436)

### Backend
- **Merge pull request #1074 from eneskirca/dependabot/npm_and_yarn/undici-6.29.0** (2a8ec6b)
- **Merge pull request #810 from igorschlum/feat/terminal-file-url-links** (9706283)
- **Merge origin/main into feat/terminal-file-url-links** (ab939d4)
- **Merge pull request #833 from eneskirca/dependabot/npm_and_yarn/vitest-5.0.1** (a15261e)
- **Merge pull request #694 from Temikus/ci/skip-electron-rebuild** (855dcf7)
- **Merge pull request #971 from ezwep/feat/852-one-way-context-link** (55a4918)
- **Merge pull request #947 from Temikus/test/pty-settings-spawn-gate** (17ee12a)
- **Merge pull request #972 from ezwep/feat/915-terminal-font-zoom** (8e242b7)
- **Merge pull request #932 from igorschlum/feat/kanban-project-header** (aea2bef)
- **Merge pull request #1096 from eneskirca/feat/share-ssh-team** (662a966)
- **Merge remote-tracking branch 'origin/main' into feat/share-ssh-team** (ea7a06a)
- **Merge pull request #1094 from eneskirca/docs/readme-sponsor-stripe** (83488a7)
- **Merge remote-tracking branch 'origin/main' into win-prepare-update** (d8dd50c)
- **Merge pull request #1092 from eneskirca/docs/readme-sponsor** (f9c8922)
- **Merge branch 'win-host-outside-installdir' into win-prepare-update** (a6519c0)
- **Merge pull request #974 from ezwep/feat/289-custom-alert-sounds** (78657eb)
- **Merge pull request #835 from FabricioCasali/feat/sidebar-frame-badges** (e54033e)
- **Merge pull request #965 from ezwep/feat/848-close-project-offer** (07871e7)
- **Merge origin/main into feat/915-terminal-font-zoom** (ab545ff)
- **Merge pull request #1085 from FabricioCasali/feat/offscreen-grouping** (f1bd310)
- **Merge pull request #1087 from eneskirca/feat/live-share-link** (d86b920)
- **Merge origin/main into feat/live-share-link** (f1abce3)
- **Merge pull request #1081 from eneskirca/docs/windows-ssh-phase3** (7dba5a4)
- **Merge pull request #966 from ezwep/feat/757-click-to-focus** (87ae3ac)
- **Merge pull request #1078 from eneskirca/feat/windows-ssh-proxyjump** (9fe11ad)

### Tests
- **test(windows): make the #829 shutdown and preflight tests honest on real Windows** (d8edf0c)
- **test(relay): e2e — bootstrap, pinned owner join, live share and unshare** (b60ef04)
- **test: remove three sources of random CI failures** (9400597)
- **test(watch-link): bidi characters in the live-link renderer tests are written as escapes** (8132f86)
- **test(storedGeometry): pass the grid as a number** (e62801f)

### Docs
- **docs(readme): sell the Founding Sponsor spots through Stripe** (271a391)
- **docs(relay): Share with team — the real SAS-skip rule, the full two-writer gap, --json and bridge precision** (373fe40)
- **docs: Share with team — operator path, desktop flow, invariants, device checklist** (fadad0c)
- **docs(readme): Founding Sponsor section with ten logo spots** (fc98af5)
- **docs(live-links): number the device checklist once (16–18 were used twice)** (8ad03ac)
- **docs(live-links): what changed in the final fix wave, in the reference, the spec and CLAUDE.md** (a92b3f7)
- **docs(control): give the run hint its --project flag** (00d2be5)
- **docs(live-links): the reference, the invariants in CLAUDE.md and CONTRIBUTING.md** (8559807)
- **docs(spec): the Pro-gate feature string is 'Sharing a live link' (the dialog adds the rest)** (bd0051e)
- **docs(claude): note how a send to an unstarted node is queued** (809f82f)
- **docs(spec): live-link entry points — availability before the Pro gate, Stop all confirms, dev-build refusal on Create** (9f4cc9e)
- **docs(spec): node-gone is tri-state; the Server Edition answers unsupported until it has a license layer** (cd5a4e5)
- **docs(ssh): ProxyJump and the Windows ssh-agent rule in the Windows transport section** (d564aa3)

### Chore
- **chore(release): v0.4.1** (6c5a46f)
- **chore(watch-link): carry xterm.js's full MIT permission notice in the copied parser table** (2c83e65)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/eneskirca/nodeterm?utm_source=github-action)._