|
3 | 3 |
|
4 | 4 | ### Bug Fixes |
5 | 5 |
|
6 | | -* **security:** escape font CDN URL and tighten WS origin check ([5093181](https://github.com/connorads/remobi/commit/5093181ec1f8cece06e4b0e7b0482604493b691d)) |
| 6 | +* **security:** escape font CDN URL and tighten WS origin check ([1c55d5c](https://github.com/connorads/remobi/commit/1c55d5c28d85d14fc42a90813d4e479b531e4243)) |
7 | 7 |
|
8 | 8 | ## [0.2.3](https://github.com/connorads/remobi/compare/v0.2.2...v0.2.3) (2026-03-16) |
9 | 9 |
|
10 | 10 |
|
11 | 11 | ### Bug Fixes |
12 | 12 |
|
13 | | -* **serve:** default remobi serve to localhost ([36eb0ff](https://github.com/connorads/remobi/commit/36eb0ff54b780b1a4bf336051af6d80f00f9f1cf)) |
| 13 | +* **serve:** default remobi serve to localhost ([6b8706e](https://github.com/connorads/remobi/commit/6b8706ec144ff2c92f92538a2c39997534b32e4d)) |
14 | 14 |
|
15 | 15 | ## [0.2.2](https://github.com/connorads/remobi/compare/v0.2.1...v0.2.2) (2026-03-16) |
16 | 16 |
|
17 | 17 | ### Bug Fixes |
18 | 18 |
|
19 | | -* guard process.argv[1] for strict index access ([32eabce](https://github.com/connorads/remobi/commit/32eabce2a86651aa101c4756f5b59935c49e8154)) |
| 19 | +* guard process.argv[1] for strict index access ([fd07a60](https://github.com/connorads/remobi/commit/fd07a6026135caffc189ba40fc0051d5ee9215fa)) |
20 | 20 |
|
21 | 21 | ## [0.2.1](https://github.com/connorads/remobi/compare/v0.2.0...v0.2.1) (2026-03-15) |
22 | 22 |
|
23 | 23 | ### Bug Fixes |
24 | 24 |
|
25 | | -* resolve symlink in entry guard so npx execution works ([4eab06d](https://github.com/connorads/remobi/commit/4eab06dcb2144788a65d2cd5e503b5e3e27b350c)) |
| 25 | +* resolve symlink in entry guard so npx execution works ([f2409e1](https://github.com/connorads/remobi/commit/f2409e1ae63540f5594cc2384b76f6be4a701c2b)) |
26 | 26 |
|
27 | 27 | ## [0.2.0](https://github.com/connorads/remobi/compare/v0.1.0...v0.2.0) (2026-03-15) |
28 | 28 |
|
29 | 29 | ### Bug Fixes |
30 | 30 |
|
31 | | -* **ci:** add npm to mise.toml for OIDC trusted publishing ([44bb745](https://github.com/connorads/remobi/commit/44bb7452d0d9e3496bacc4aaf5a63f2236a8f80f)) |
32 | | -* exclude package.json from Biome formatter ([044183f](https://github.com/connorads/remobi/commit/044183fd636fe56eb17f1cd650338c85be46ce5e)) |
33 | | -* remove leading ./ from bin path for npm 11 compatibility ([33ba38d](https://github.com/connorads/remobi/commit/33ba38daab05224fc6eeb28402bb9860c36873d2)) |
34 | | -* remove redundant checks from prepublishOnly ([efdb742](https://github.com/connorads/remobi/commit/efdb742087842ba131ed704e3e29676aa672ab87)) |
| 31 | +* **ci:** add npm to mise.toml for OIDC trusted publishing ([62bfd3a](https://github.com/connorads/remobi/commit/62bfd3a79864dfe60c0edc0bd6528be0bfbf5e34)) |
| 32 | +* exclude package.json from Biome formatter ([eb88ac5](https://github.com/connorads/remobi/commit/eb88ac525c4acd04afe8b01ae71b80295ebce508)) |
| 33 | +* remove leading ./ from bin path for npm 11 compatibility ([b350ecb](https://github.com/connorads/remobi/commit/b350ecbe8197346c91f78bdb64bc2906b483a047)) |
| 34 | +* remove redundant checks from prepublishOnly ([9f2247c](https://github.com/connorads/remobi/commit/9f2247c6a915578e7c7e1394fd9f562c7faea70c)) |
35 | 35 |
|
36 | 36 | ### Features |
37 | 37 |
|
38 | | -* add pixel R> logo and integrate across project ([44b238a](https://github.com/connorads/remobi/commit/44b238aa7909cec2c408acb5bde32f9f2c645e26)) |
39 | | - |
40 | | -## 0.1.0 β 2026-03-15 |
41 | | - |
42 | | -- Changed: overlay is now pre-built as an IIFE during `build:dist` β faster `remobi serve` startup (no runtime esbuild), smaller install footprint (esbuild moved to devDependencies). Dev mode falls back to esbuild-from-source when `dist/overlay.iife.js` is absent. |
43 | | - |
44 | | -- Breaking: migrated from Bun to Node.js 22+ with pnpm. Runtime is now Node, bundler is esbuild, test runner is vitest, transpiler is tsdown. `remobi serve` uses Hono + @hono/node-ws for HTTP/WS. Package now ships transpiled JS (`dist/`) instead of TypeScript source. |
45 | | - |
46 | | -- Internal: expanded oxlint β `suspicious` + `perf` categories, `import/no-cycle`, `import/no-self-import`, `typescript/no-non-null-asserted-optional-chain`, `unicorn/throw-new-error` (141 rules total). |
47 | | -- Internal: expanded Biome β `noExcessiveCognitiveComplexity` (warn, max 25), `useFilenamingConvention` (kebab-case). |
48 | | -- Internal: added knip for unused export/dependency detection. Removed 11 unused exports, removed redundant `happy-dom` devDep. |
49 | | -- Internal: added publint for npm package validation. Fixed `pkg.repository.url` to `git+https://` convention. |
50 | | -- Internal: added typos spell checker via mise. |
51 | | -- Internal: added hk pre-commit hooks (biome, oxlint, typos). |
52 | | -- Internal: added knip, publint, typos to CI pipeline and prepublishOnly gate. |
53 | | -- Changed: removed `ttyd` from `mise.toml` (unsupported on macOS arm64 via current aqua metadata) and updated ttyd install guidance to be macOS/Linux friendly (`brew` on macOS, distro/source options on Linux). |
54 | | -- Changed: shipped drawer defaults now stick to stock tmux bindings for split/session/window/copy actions and no longer include opinionated `Git`, `Files`, or `Links` buttons. |
55 | | - |
56 | | -- Removed: plugin system (`RemobiPlugin`, `UISlot`, `UIContributionCollector`, plugin manager, UI contributions, build-time resolution, `config.plugins`). Hooks and actions remain as core infrastructure. The plugin API can be reintroduced when there's a concrete second use case. |
57 | | - |
58 | | -- Fixed: visibilitychange listener leak in reconnect dispose path β the anonymous listener was never removed, causing a leak on each dispose/re-init cycle. |
59 | | -- Fixed: reconnect overlay now retries on any overlay tap, keeps the button focused for keyboard `Enter`, and guards against duplicate reload attempts. |
60 | | -- Fixed: unhandled promise rejection when `document.fonts.ready` fails β font loading failure is non-critical, terminal still works. |
61 | | -- Internal: `bun test --coverage` reporting via `test:coverage` script. |
62 | | -- Internal: shared `mockTerminal` test fixture extracted from 9 test files. |
63 | | -- Internal: new tests for `applyTheme`, `haptic`, and `checkLandscapeKeyboard`. |
64 | | - |
65 | | -- Added: reconnect overlay β detects connection loss via WebSocket interception and shows a full-screen "Connection lost" overlay with a Reconnect button. Auto-reconnects when the browser comes back online. Enabled by default (`reconnect: { enabled: true }`), disable with `reconnect: { enabled: false }`. |
66 | | - |
67 | | -- Added: Remotion-based demo video in `demo/` β programmatically rendered, Catppuccin Mocha themed. |
68 | | -- Added: oxlint with `consistent-type-assertions: never` rule to prevent unsafe type assertions. |
69 | | -- Changed: `waitForTerm` now rejects after timeout (default 10s) instead of polling indefinitely. |
70 | | -- Changed: plugin manager validates plugin shape at init β invalid plugins are skipped with a warning. |
71 | | -- Changed: help overlay rewritten to DOM API (no innerHTML), eliminating XSS surface. |
72 | | -- Changed: PWA meta-tag values are now HTML-attribute-escaped. |
73 | | -- Added: unit tests for `buildTtydArgs`, `randomInternalPort`, `waitForTerm`, and plugin validation. |
74 | | -- Added: `bun run build` step in CI workflow. |
75 | | -- Added: `remobi serve --no-sleep` flag β prevents macOS system sleep while serving by wrapping ttyd with `caffeinate -s -w <pid>`. The assertion is held for exactly the lifetime of the server and dropped automatically on shutdown. Gracefully ignored with a warning on non-macOS platforms. |
76 | | -- Added: keep-awake guide (`docs/guides/keep-awake.md`) covering `--no-sleep`, persistent pmset settings, nix-darwin config, and lid-close behaviour. |
77 | | -- Added: mobile-friendly tmux config guide (`docs/guides/mobile-tmux.md`) and optional tmux optimisation step in setup skill. |
78 | | -- Added: agent setup skill (`skills/remobi-setup/SKILL.md`), guide (`docs/guides/agent-setup.md`), and README collapsible prompt for AI-assisted configuration. |
79 | | -- Added: `remobi serve` β single command to run remobi with full PWA support. Builds overlay in memory, manages ttyd lifecycle, serves manifest + icons + WebSocket relay. Replaces the multi-step build + ttyd + proxy workflow. |
80 | | -- Added: PWA support β web app manifest, 192/512px icons, apple-touch-icon, theme-color meta tags for "Add to Home Screen" installability on iOS and Android. |
81 | | -- Added: `pwa` config section (`enabled`, `shortName`, `themeColor`) β controls manifest generation and meta tag injection. `shortName` defaults to `name` when absent. |
82 | | -- Added: top-level `name` config field (default `'remobi'`) β used as document title, PWA manifest name, and apple-mobile-web-app-title. Replaces `pwa.name` and `pwa.shortName` (the latter is now optional and falls back to `name`). |
83 | | -- Added: default toolbar backspace button (`β«`, sends `\x7f`) to provide reliable deletion on mobile keyboards when IME composition behaviour is inconsistent. |
84 | | -- v0.2 extensibility and DX milestone complete: action registry, hook system, plugin manager, UI contributions, declarative button customisation, .local config overrides, plugin guide, Bun-only ADR, e2e scaffolding. Closes #1. |
85 | | -- Added: e2e smoke test scaffold (`tests/e2e/smoke.test.ts`) β checks ttyd availability, skips gracefully when absent, tests HTML serving and `remobi inject` pipe path against a real ttyd process. Closes #9. |
86 | | -- Added: ADR `docs/decisions/001-bun-only.md` β documents the decision to remain Bun-only, the Bun-specific APIs in use, and the conditions under which a Node runtime track would be considered. Closes #11. |
87 | | -- Added: plugin author guide (`docs/guides/plugins.md`) covering hooks, UI contributions, custom actions, and cleanup patterns. Closes #10. |
88 | | -- Added: stable public API surface defined in README β semver policy documents which import paths are public, what constitutes major/minor/patch. Closes #4. |
89 | | -- Added: UI contribution API for plugins β `context.ui.add(slot, button, priority?)` lets plugins contribute buttons to `'toolbar.row1'`, `'toolbar.row2'`, or `'drawer'` slots. Contributions are merged (appended) after config buttons, sorted by priority. Closes #8. |
90 | | -- Added: per-machine config overrides via `.local` config file β place `remobi.config.local.ts` next to your shared `remobi.config.ts` to apply machine-specific overrides (gitignore the `.local` file). Merged on top of the shared config using the same `RemobiConfigOverrides` schema. Closes #12. |
91 | | -- Added: declarative button customisation β toolbar rows and drawer buttons now accept `ButtonArrayInput`: a plain array (replace) or a function `(defaults) => newArray`. Standard JS array methods cover all customisation needs (filter, map, spread, etc.). Closes #13. |
92 | | - |
93 | | -- Breaking: unified toolbar/drawer model to `ControlButton` (`id`, `label`, `description`, `action`) and renamed `drawer.commands` to `drawer.buttons`. |
94 | | -- Changed: touch scrolling defaults to wheel semantics for better behaviour across OpenCode, Claude Code, and plain tmux shells. |
95 | | -- Added: dynamic help overlay rendered from current config (no stale hardcoded sections). |
96 | | -- Fixed: help overlay is now fail-safe and cannot block core overlay init. |
97 | | -- Fixed: viewport/keyboard height handling and document scroll lock to reduce white-gap/rubber-band issues on mobile. |
98 | | -- Added: runtime config validation with path-based errors and unknown-key checks at CLI load boundaries. |
99 | | -- Changed: config validation errors now include received-value previews, and CLI validates merged resolved config before build/inject execution. |
100 | | -- Added: stricter CLI parsing (`-c`/`-o`/`-n`, unknown-flag errors) plus `--dry-run` for `build` and `inject`. Closes #3. |
101 | | -- Changed: toolbar/drawer button handling now runs through a shared action registry abstraction. Closes #5. |
102 | | -- Added: typed hook registry for overlay lifecycle and terminal send pipeline with ordered execution and error isolation. Closes #6. |
103 | | -- Added: plugin manager primitives (`RemobiPlugin`, setup/dispose lifecycle, failure isolation) and plugin-aware `init(..., hooks, plugins)` entry. Closes #7. |
104 | | -- Added: config `plugins` array support in CLI build/inject path with resolved local specifiers. |
105 | | -- Changed: CLI config validation remains strict; legacy config shapes are not auto-normalised. |
106 | | -- Tests: expanded integration/config/height coverage for the new config model and viewport logic. |
107 | | -- Added: `gestures.swipe.left`/`right` (data to send on swipe) and `leftLabel`/`rightLabel` (help overlay text) β defaults match previous hardcoded behaviour (`\x02n`/`\x02p`, next/previous tmux window). |
108 | | -- Added: `mobile.initData` (string | null) β arbitrary data sent to the terminal on mobile init when viewport is below `mobile.widthThreshold` (default 768px). Useful for auto-zooming a tmux pane (`'\x02z'`) or any other mobile-specific setup. |
109 | | -- Added: `floatingButtons` config β always-visible buttons on touch devices using the same `ControlButton` schema as toolbar/drawer. Renders in the help overlay when non-empty. |
110 | | -- Breaking: `floatingButtons` changed from a flat `ControlButton[]` to `FloatingButtonGroup[]`. Each group has a `position` (`'top-left' | 'top-right' | 'top-centre' | 'bottom-left' | 'bottom-right' | 'bottom-centre' | 'centre-left' | 'centre-right'`), optional `direction` (`'row' | 'column'`, default `'row'`), and a `buttons` array. Migrate: `floatingButtons: [btn]` β `floatingButtons: [{ position: 'top-left', buttons: [btn] }]`. |
111 | | -- Changed: Tailscale Serve guide now recommends always rebuilding the overlay before start; removed version-hash cache-key snippet to prevent stale build issues. |
112 | | -- Changed: default toolbar now uses explicit tmux `Prefix` (`C-b`) and `Alt+Enter` buttons for more predictable mobile input. |
113 | | -- Added: new drawer `Combo` action (`combo-picker`) that opens a small combo input modal for explicit Ctrl/Alt key sends. |
114 | | -- Added: default toolbar `q` button (row 2, left) for quitting interactive TUIs. |
| 38 | +* add pixel R> logo and integrate across project ([0235c4b](https://github.com/connorads/remobi/commit/0235c4be3f1d0b503f4531a4c8adc90283eece0f)) |
| 39 | + |
| 40 | +## 0.1.0 (2026-03-15) |
| 41 | + |
| 42 | +### Breaking Changes |
| 43 | + |
| 44 | +* migrated from Bun to Node.js 22+ with pnpm β runtime is now Node, bundler is esbuild, test runner is vitest, transpiler is tsdown; `remobi serve` uses Hono + @hono/node-ws; package ships transpiled JS (`dist/`) instead of TypeScript source |
| 45 | +* unified toolbar/drawer model to `ControlButton` (`id`, `label`, `description`, `action`) and renamed `drawer.commands` to `drawer.buttons` |
| 46 | +* `floatingButtons` changed from flat `ControlButton[]` to `FloatingButtonGroup[]` with `position`, optional `direction`, and `buttons` array |
| 47 | +* removed plugin system (`RemobiPlugin`, `UISlot`, `UIContributionCollector`, plugin manager, UI contributions, build-time resolution, `config.plugins`) β hooks and actions remain as core infrastructure |
| 48 | + |
| 49 | +### Features |
| 50 | + |
| 51 | +* `remobi serve` β single command with full PWA support, overlay build, ttyd lifecycle, manifest + icons + WebSocket relay |
| 52 | +* PWA support β web app manifest, 192/512px icons, apple-touch-icon, theme-color meta tags for "Add to Home Screen" |
| 53 | +* reconnect overlay β detects connection loss via WebSocket interception, auto-reconnects on browser online event |
| 54 | +* `remobi serve --no-sleep` β prevents macOS system sleep via `caffeinate -s -w <pid>` |
| 55 | +* `floatingButtons` config β always-visible buttons on touch devices |
| 56 | +* `gestures.swipe.left`/`right` and `leftLabel`/`rightLabel` for configurable swipe actions |
| 57 | +* `mobile.initData` β arbitrary data sent to terminal on mobile init below width threshold |
| 58 | +* `pwa` config section (`enabled`, `shortName`, `themeColor`) |
| 59 | +* top-level `name` config field β used as document title, PWA manifest name, apple-mobile-web-app-title |
| 60 | +* default toolbar backspace button (`β«`) for reliable mobile deletion |
| 61 | +* new drawer `Combo` action (`combo-picker`) for explicit Ctrl/Alt key sends |
| 62 | +* default toolbar `q` button (row 2) for quitting interactive TUIs |
| 63 | +* explicit tmux `Prefix` (`C-b`) and `Alt+Enter` toolbar buttons |
| 64 | +* dynamic help overlay rendered from current config |
| 65 | +* runtime config validation with path-based errors and unknown-key checks |
| 66 | +* stricter CLI parsing (`-c`/`-o`/`-n`, unknown-flag errors) plus `--dry-run` for `build` and `inject` |
| 67 | +* action registry abstraction for toolbar/drawer button handling |
| 68 | +* typed hook registry for overlay lifecycle and terminal send pipeline |
| 69 | +* declarative button customisation via `ButtonArrayInput` |
| 70 | +* per-machine config overrides via `.local` config file |
| 71 | +* overlay pre-built as IIFE during `build:dist` β faster `remobi serve` startup |
| 72 | + |
| 73 | +### Bug Fixes |
| 74 | + |
| 75 | +* visibilitychange listener leak in reconnect dispose path |
| 76 | +* reconnect overlay retry on any tap, focused button for keyboard `Enter`, duplicate reload guard |
| 77 | +* unhandled promise rejection when `document.fonts.ready` fails |
| 78 | +* help overlay rewritten to DOM API (no innerHTML), eliminating XSS surface |
| 79 | +* PWA meta-tag values HTML-attribute-escaped |
| 80 | +* `waitForTerm` rejects after timeout (default 10s) instead of polling indefinitely |
| 81 | +* help overlay is fail-safe and cannot block core overlay init |
| 82 | +* viewport/keyboard height handling and document scroll lock for mobile |
0 commit comments