@jbaehova/onthego 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,116 +1,176 @@
1
1
  # ONTHEGO
2
2
 
3
- Continue your coding-agent conversation on another device, with your unfinished Git workspace intact.
3
+ Move your unfinished work and your coding-agent conversations between your desktop, laptop, and VPS with one command.
4
4
 
5
- ONTHEGO is an MIT-licensed CLI for explicit handoffs between your own computers. It carries staged and unstaged work together with project-scoped Codex CLI and Claude Code histories. Each destination keeps its Git settings, hooks, local dependencies, and editor directory intact.
5
+ ```sh
6
+ onthego sync laptop
7
+ ```
8
+
9
+ ONTHEGO carries a Git project exactly as you left it: staged, unstaged, and untracked work, plus the project's Codex CLI and Claude Code sessions, so you can `codex resume` or `claude --resume` on the other device and keep going. Each device keeps its own Git settings, hooks, `node_modules`, caches, and agent logins.
6
10
 
7
- No ONTHEGO account or central server is needed. SSH connects your devices. Install and authenticate the coding agent separately on each device. This project targets individual CLI users.
11
+ It is a small open-source CLI (MIT). There is no account, no hosted service, and no AI feature. Your devices talk to each other directly over SSH, optionally through [Tailscale](#anywhere-with-tailscale).
8
12
 
9
13
  ## Install
10
14
 
11
15
  ```sh
12
- npm install -g @jbaehova/onthego@^0.3.0
16
+ npm install -g @jbaehova/onthego
13
17
  ```
14
18
 
15
- The npm package includes binaries for macOS arm64/amd64 and Linux arm64/amd64. Git and OpenSSH are required. Node.js is needed only for the npm launcher. Install the same ONTHEGO version on both devices.
19
+ The npm package ships native binaries for macOS and Linux (arm64 and amd64). Git and OpenSSH are required; Node.js is only needed for npm itself.
16
20
 
17
- You can also build from source with Go 1.25.4 or newer:
21
+ On a server without Node.js:
22
+
23
+ ```sh
24
+ curl -fsSL https://raw.githubusercontent.com/peerproblem/onthego/main/install.sh | sh
25
+ ```
26
+
27
+ The script downloads the release binary for the machine, verifies its SHA-256 checksum, and installs it to `~/.local/bin`. Pass `-s -- --version 0.4.0` for a specific version.
28
+
29
+ You usually do not need to install it on the other devices by hand: `onthego device add <name> --install` copies the exact same version over SSH.
30
+
31
+ <details>
32
+ <summary>Build from source</summary>
18
33
 
19
34
  ```sh
20
35
  git clone https://github.com/peerproblem/onthego.git
21
36
  cd onthego
22
- make build
23
- mkdir -p ~/.local/bin
37
+ make build # Go 1.26 or newer
24
38
  install -m 755 dist/onthego ~/.local/bin/onthego
25
- # Or: go install github.com/peerproblem/onthego/cmd/onthego@latest
26
39
  ```
27
40
 
28
- ## Desktop to laptop
41
+ </details>
42
+
43
+ ## Quick start
44
+
45
+ On your desktop, inside a Git project:
29
46
 
30
- Enable SSH on the destination and establish a trusted SSH connection first. An existing SSH alias can use a LAN address or your own VPS. Tailscale and other VPNs are optional ways to provide reachability. Both devices must be reachable during a direct transfer.
47
+ ```sh
48
+ onthego init # once per project; commit .onthego.yaml
49
+ onthego device add laptop --host me@laptop.local --install
50
+ onthego sync laptop
51
+ ```
31
52
 
32
- Inside the project on the desktop:
53
+ Then on the laptop:
33
54
 
34
55
  ```sh
35
- onthego init
36
- onthego device add laptop --host me@my-laptop
37
- onthego remote set laptop /Users/me/projects/my-app
38
- onthego doctor laptop
39
- onthego push laptop --dry-run
40
-
41
- # Stop agents and other processes that write project files, then:
42
- onthego push laptop --verbose
56
+ cd ~/projects/my-app # the same home-relative path by default
57
+ codex resume <session-id> # or: claude --resume <session-id>
43
58
  ```
44
59
 
45
- `device add` pairs both public identities through your trusted SSH connection. It discovers the remote executable using a login shell. Use `--binary /absolute/path/onthego` when needed. `--port` and `--identity-file` select an existing SSH connection; private SSH keys are never copied.
60
+ The handoff prints the exact `cd` and resume commands. When you are back at the desktop, run `onthego sync laptop` again: the desktop knows it handed the work off, so it pulls the laptop's changes back.
61
+
62
+ `sync` picks the direction for you:
63
+
64
+ | Situation | What `sync` does |
65
+ | --- | --- |
66
+ | The project is not on the other device yet | push |
67
+ | Only this device changed since the last handoff | push |
68
+ | Only the other device changed | pull |
69
+ | You handed the work off and have not touched it since | pull (take it back) |
70
+ | Nothing changed | nothing |
71
+ | Both sides changed | stops, and tells you to choose `push --replace` or `pull --replace` |
72
+
73
+ Nothing is ever merged silently. Whenever a handoff replaces work, the replaced state is kept as a Git backup that `onthego undo` restores. Use `onthego sync laptop --dry-run` to see the decision first, or `push` and `pull` to choose the direction yourself.
74
+
75
+ ## Connecting your devices
76
+
77
+ ONTHEGO uses your normal SSH setup (`~/.ssh/config`, keys, `known_hosts`). The only requirement is that one device can `ssh` into the other without a password prompt. **Run every command from the device that can reach the other one.** A laptop that can reach a VPS can both push to it and pull from it, so the VPS never needs to reach the laptop.
78
+
79
+ `onthego doctor laptop` checks the whole chain: SSH, the remote onthego version, and the pinned identity.
80
+
81
+ ### Same network
82
+
83
+ 1. Enable SSH on the receiving device.
84
+ - macOS: System Settings > General > Sharing > Remote Login.
85
+ - Linux: `sudo systemctl enable --now ssh`
86
+ 2. From the device you type on, install your key and accept the host key once:
46
87
 
47
- Devices store hosts and identities once. Project paths are separate mappings under `~/.onthego/projects/<id>/peers.yaml`. Without a mapping, the path relative to your home directory is used under the remote home. `device add ... --path ...` remains a shortcut for the current project's mapping.
88
+ ```sh
89
+ ssh-copy-id me@laptop.local
90
+ ssh me@laptop.local true
91
+ ```
48
92
 
49
- For the first transfer, choose a destination directory that does not exist. On the laptop:
93
+ 3. Pair it: `onthego device add laptop --host me@laptop.local --install`
94
+
95
+ An alias from `~/.ssh/config` works as the host too (`--host laptop`). `--port` and `--identity-file` are available; private keys are never copied.
96
+
97
+ ### Anywhere with Tailscale
98
+
99
+ Use Tailscale when your devices are not on the same network, for example a laptop on the road and a desktop at home. Tailscale gives every device a stable name; ONTHEGO looks it up for you.
100
+
101
+ 1. Install Tailscale on each device and sign in with the same account ([download](https://tailscale.com/download); on Linux: `curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up`).
102
+ 2. Enable SSH on each device you pair to, as above. On Linux you can instead turn on Tailscale SSH with `sudo tailscale set --ssh`.
103
+ 3. List your tailnet and pair by name:
104
+
105
+ ```sh
106
+ onthego tailscale
107
+ onthego device add laptop --tailscale me@laptop --install
108
+ ```
109
+
110
+ `onthego tailscale` shows which devices are online, which are already paired, and what is missing. ONTHEGO only reads `tailscale status`; it never changes Tailscale settings. See the [Tailscale guide](docs/tailscale.md) for MagicDNS, Tailscale SSH "check" mode, and troubleshooting.
111
+
112
+ ### A VPS
50
113
 
51
114
  ```sh
52
- cd /Users/me/projects/my-app
53
- onthego status
54
- codex resume <session-id>
55
- # Or: claude --resume <session-id>
115
+ onthego device add vps --host me@vps.example.com --install
116
+ onthego sync vps
56
117
  ```
57
118
 
58
- Use the session ID printed by the handoff. These commands resume a native history, not a running process. See the exact tested CLI versions and validation boundaries in [agent compatibility](docs/agent-compatibility.md).
119
+ `--install` detects the server's OS and CPU and copies the matching binary to `~/.local/bin/onthego` there. No Node.js or internet access is needed on the server. After you upgrade onthego locally, run `onthego device install vps` to upgrade the server to the same version.
120
+
121
+ Work on the VPS over SSH or in a terminal multiplexer as usual. When you come back, run `onthego sync vps` from your laptop or desktop.
122
+
123
+ ### Where the project lives on each device
59
124
 
60
- To bring laptop changes back, run this from the desktop project:
125
+ By default the project goes to the same path relative to the home directory (`~/projects/my-app` on macOS becomes `/home/me/projects/my-app` on Linux). Agent session paths are remapped to match. To choose another location:
61
126
 
62
127
  ```sh
63
- onthego pull laptop --verbose
128
+ onthego device path laptop /Users/me/code/my-app
129
+ onthego device list # shows each device and this project's path there
64
130
  ```
65
131
 
66
- The destination is updated in place. Existing shells, editor watchers, and local dependency directories continue to refer to the same project directory. Stop writers during the transfer so they cannot race with capture or application.
67
-
68
- After a successful push, `status` warns that the project and sessions were handed to the other device. Pull before editing or resuming them on the original device.
132
+ For the first transfer, the destination directory should not exist yet. To adopt an existing copy, use `push --replace` once (a Git backup of the destination is kept).
69
133
 
70
134
  ## What moves
71
135
 
72
136
  | Data | Behavior |
73
137
  | --- | --- |
74
- | Git history | Missing objects travel in a negotiated bundle. GitHub is optional. |
75
- | Staged and unstaged work | Temporary Git trees preserve their distinction, binary content, and executable bits. |
76
- | Untracked project files | Included subject to project exclusions and the secret policy. |
77
- | Ignored files | Include explicitly with `--include` or project policy. |
78
- | Secret candidates such as `.env` | Excluded and reported; eligible files require `--include-secret`. |
79
- | Codex and Claude histories | Recent project sessions by default; path values are remapped without rewriting conversation content. |
80
- | Destination Git configuration and hooks | Preserved in place, together with remotes, reflogs, and existing stashes. |
81
- | Destination caches and local dependencies | Left in place when they are outside the managed file set. |
82
- | Agent logins, global databases, and running processes | Not transferred. Authenticate and run the agent separately on each device. |
138
+ | Git history | Only missing objects travel, in an incremental bundle. No Git hosting needed. |
139
+ | Staged and unstaged work | Preserved separately, including binary files and executable bits. |
140
+ | Untracked files | Included, subject to `exclude` rules and the secret policy. |
141
+ | Ignored files | Only when you add them with `--include` or project policy. |
142
+ | Secret candidates such as `.env`, `.npmrc` | Excluded and reported. `--include-secret` carries a file encrypted, outside Git objects. |
143
+ | Codex and Claude sessions | Sessions for this project active in the last 7 days. Paths are remapped; conversation content is not rewritten. |
144
+ | Destination Git config, hooks, remotes, stashes | Left as they are. |
145
+ | `node_modules`, caches, build output | Left as they are on each device. |
146
+ | Agent logins, global databases, running processes | Never transferred. Sign in to the agent on each device. |
83
147
 
84
- Native transcripts may contain sensitive prompts or tool output. ONTHEGO preserves them inside an encrypted package for resumability. All tracked Git content and history also travel as recorded, including anything previously committed. Supplemental secret-file rules cannot remove secrets from Git history.
148
+ Everything travels in one package that is encrypted for the receiving device (age) and signed by the sender (Ed25519). Pairing pins both identities, so a device that changes keys is rejected.
85
149
 
86
- ## Sessions and conflicts
150
+ Stop agents and other processes that write to the project before a handoff, so they cannot race with it. Agent transcripts can contain sensitive prompts or tool output; they are encrypted in transit and stored as the agent would store them. Anything already committed to Git travels as recorded, including secrets in history.
87
151
 
88
- The default selection is sessions active in the last seven days. Choose a narrower or broader set explicitly:
152
+ ## Day to day
89
153
 
90
154
  ```sh
91
- onthego push laptop --session <id>
155
+ onthego status # did anything change since the last handoff? who has the work?
156
+ onthego status laptop # the same, for the laptop's copy
157
+ onthego push laptop --dry-run # preview files and sessions without sending
92
158
  onthego push laptop --session-days 2
93
- onthego push laptop --all-sessions
94
- onthego pull laptop --sessions skip
159
+ onthego push laptop --session <id> # or --all-sessions, --no-sessions
160
+ onthego push laptop --include scratch/notes.txt --include-secret .env
95
161
  ```
96
162
 
97
- Malformed completed JSONL lines exclude that session with a warning. An incomplete final line is discarded with a warning. These histories do not stop the workspace handoff.
163
+ After a push, `status` on the sending device reminds you that the work was handed to the other device. Pull (or `sync`) before editing there again.
98
164
 
99
- Identical sessions are skipped. Incoming extensions update an older destination, while a newer destination is kept. Divergent sessions keep the destination and save the incoming history in private `~/.onthego/conflicts/` storage by default. `--sessions keep-both`, `--sessions theirs`, and `--sessions skip` make the policy explicit. Conflict copies remain until you review and remove them. Plaintext staging copies are removed after import. If an adapter cannot write its destination, the workspace still arrives and its authenticated inbound histories are retained in a private `session-recovery-*` directory under ONTHEGO state. The warning prints its location.
165
+ ### Conflicts and recovery
100
166
 
101
- Concurrent workspace edits require a deliberate decision. ONTHEGO checks Git handoff ancestry and the destination's captured workspace state. `--replace` applies incoming managed files after retaining a Git backup; a different project ID is always rejected.
102
-
103
- ```sh
104
- onthego backups list
105
- onthego undo
106
- onthego backups prune --keep 3
107
- ```
108
-
109
- The newest five Git backups are retained automatically. Explicitly included supplemental secrets stay outside Git objects; their backup contents are encrypted under the private ONTHEGO state directory. Unmanaged `node_modules`, caches, and local environment files are not copied into backups. Undo restores the backed-up managed state and clears the delivery baseline, since restoring old work does not prove that another device has received it. Use Git to reconcile intentional concurrent development.
167
+ - **Workspace.** When both devices changed, `sync`, `push`, and `pull` stop with exit code 6. `--replace` overwrites the other side after saving a Git backup there. `onthego backups list` shows backups, `onthego undo` restores the latest one, and `onthego backups prune --keep 3` trims them. The newest five are kept automatically.
168
+ - **Agent sessions.** Identical sessions are skipped and a longer incoming history updates an older one. A diverged session keeps the destination's copy and saves the incoming one under `~/.onthego/conflicts/`. Change this with `--session-conflict keep-both|theirs|skip`.
169
+ - **Partial delivery.** If the workspace arrives but an agent home cannot be written, the sessions are kept privately and `status` says so. Run `onthego sessions recover` once the problem is fixed; later workspace edits are preserved.
110
170
 
111
171
  ## Configuration
112
172
 
113
- Commit the project policy `.onthego.yaml`:
173
+ `onthego init` writes `.onthego.yaml`. Commit it so every device uses the same project ID:
114
174
 
115
175
  ```yaml
116
176
  schema_version: 2
@@ -126,72 +186,74 @@ exclude:
126
186
  - build
127
187
  - .cache
128
188
  - __pycache__
129
- agent: auto
189
+ agent: auto # auto, codex, claude, or none (workspace only)
130
190
  ```
131
191
 
132
- `agent` accepts `auto`, `codex`, `claude`, or `none`. `none` performs workspace-only handoffs.
192
+ Paths passed with `--include` or `--include-secret` stay managed in later handoffs, including deletions. Adding a managed file to `exclude` stops sending it and leaves the receiving copy in place with a warning.
133
193
 
134
- Personal configuration and pinned identities live in `~/.onthego/config.yaml`. Private ONTHEGO keys live in `~/.onthego/identity/keys.json`. Private directories use mode `0700` and files use `0600`. `ONTHEGO_HOME` optionally selects a different state directory. ONTHEGO never automatically loads `.env` files.
194
+ Private state lives in `~/.onthego` (or `$ONTHEGO_HOME`), with `0700` directories and `0600` files: paired devices in `config.yaml`, keys in `identity/`, and per-project paths under `projects/`. ONTHEGO never loads `.env` files.
195
+
196
+ Shell completion, including device names:
135
197
 
136
198
  ```sh
137
- onthego config path
138
- onthego device list
139
- onthego identity
140
- onthego push laptop --include scratch/notes.txt
141
- onthego push laptop --include-secret .env
199
+ onthego completion zsh > "${fpath[1]}/_onthego" # also: bash, fish
142
200
  ```
143
201
 
144
- Explicitly selected files remain managed across subsequent handoffs, including deletions. Do not opt in credentials that must stay device-local. Names such as `tokenizer.ts`, `docs-secret-santa.md`, and `design.key` are ordinary project files, not secret candidates.
145
-
146
- ## Portable snapshots
202
+ ## Offline handoff
147
203
 
148
- For removable storage or another delivery channel, create an encrypted `.otg` file:
204
+ Without a network path, hand off through an encrypted file on a USB drive or any other channel:
149
205
 
150
206
  ```sh
151
- onthego snapshot pack --output /tmp/project.otg --recipient age1...
207
+ onthego identity # on the receiving device: prints its public keys
208
+ onthego snapshot pack --output /tmp/my-app.otg --recipient age1...
152
209
 
153
210
  # On the receiving device:
154
- onthego snapshot restore /tmp/project.otg \
155
- --output /path/to/project \
156
- --signing-public <trusted-source-public-key>
211
+ onthego snapshot restore /tmp/my-app.otg --output ~/projects/my-app --signing-public <sender-signing-key>
157
212
  ```
158
213
 
159
- Use the recipient and signing public keys printed by `onthego identity`. Without `--recipient`, packing targets the local device. SSH handoffs resolve both identities from pairing; offline restores require you to authenticate the source signing key.
160
-
161
- Offline exports retain pending receipts for up to 30 days, bounded to 64 per workspace. A returning descendant can acknowledge this lineage without `--replace`. Retrying an already applied snapshot succeeds without overwriting later local edits.
162
-
163
214
  ## Commands
164
215
 
165
216
  | Command | Purpose |
166
217
  | --- | --- |
167
- | `init` | Initialize project policy. |
168
- | `device add/list/remove` | Pair and manage devices. |
169
- | `remote set` | Manage project paths on those devices. |
170
- | `push`, `pull` | Hand off a workspace and selected histories. |
171
- | `status [device]` | Inspect changes and active-device guidance. |
172
- | `inspect` | Preview file selection and excluded secret candidates. |
173
- | `doctor [device]` | Check prerequisites, CLI versions, and optional peer access. |
174
- | `snapshot pack/restore` | Create or receive an offline package. |
175
- | `backups list/prune`, `undo` | Inspect, limit, or restore Git backups. |
176
- | `identity`, `config path`, `version` | Inspect public identity and installation. |
218
+ | `sync <device>` | Push or pull, whichever brings both devices up to date. |
219
+ | `push <device>`, `pull <device>` | Hand off in an explicit direction. |
220
+ | `status [device]` | Show changes since the last handoff and who has the work. |
221
+ | `inspect` | Preview selected files, excluded secrets, and sessions. |
222
+ | `init` | Set up the current Git project. |
223
+ | `device add/list/path/install/remove` | Pair devices, map project paths, install or upgrade onthego on them. |
224
+ | `tailscale` | Check Tailscale and list tailnet devices to pair. |
225
+ | `doctor [device]` | Check Git, SSH, Tailscale, agents, and a device connection. |
226
+ | `undo`, `backups list/prune` | Restore or manage workspace backups. |
227
+ | `sessions recover` | Retry an agent session import after a partial handoff. |
228
+ | `snapshot pack/restore` | Offline handoff through an encrypted file. |
229
+ | `identity`, `config path`, `completion`, `version` | Keys, settings location, shell completion, build info. |
230
+
231
+ `--json` prints structured results and errors, `--verbose` prints transfer phases on stderr.
232
+
233
+ | Exit status | Meaning |
234
+ | --- | --- |
235
+ | 0 | Success (including a delivered workspace with pending session recovery) |
236
+ | 1 | `E_INTERNAL` |
237
+ | 2 | `E_INPUT` |
238
+ | 3 | `E_PRECONDITION`, `E_UNSUPPORTED_GIT`, `E_SECRET_POLICY`, `E_SESSION_FORMAT` |
239
+ | 4 | `E_TARGET_AUTH`, `E_TARGET_UNAVAILABLE` (SSH login, host key, or reachability) |
240
+ | 5 | `E_PACKAGE_INVALID`, `E_RESTORE_FAILED` |
241
+ | 6 | `E_GENERATION_CONFLICT`, `E_SOURCE_CHANGED` |
242
+ | 130 | `E_CANCELED` |
177
243
 
178
- `--json` emits structured results and errors. `--verbose` reports transfer phases on stderr.
244
+ ## Upgrading
179
245
 
180
- ## Development
246
+ 0.4 keeps the 0.3.1 wire protocol and file formats, so a 0.4 device can hand off with a 0.3.1 device. Keeping every device on the same version is still the simplest: after `npm update -g @jbaehova/onthego`, run `onthego device install <name>` for each SSH device. `onthego remote set` still works but is replaced by `onthego device path`. See the [release notes](docs/releases/0.4.0.md) and [migration notes](docs/migration.md).
181
247
 
182
- ```sh
183
- make check
184
- go test -race ./...
185
- make build
186
- ./scripts/demo.sh
187
- ./scripts/ssh-e2e.sh
188
- make package
189
- ```
248
+ ## More
190
249
 
191
- The tests and demos isolate project and agent homes. The SSH script uses a real temporary OpenSSH server. See [validation and feedback coverage](docs/progress.md), [architecture](docs/architecture.md), and [migration](docs/migration.md).
250
+ - [Tailscale guide](docs/tailscale.md)
251
+ - [Agent compatibility](docs/agent-compatibility.md): tested Codex and Claude Code versions and how resume is verified.
252
+ - [Architecture](docs/architecture.md): how capture, encryption, in-place application, and receipts work.
253
+ - [Development](docs/development.md): tests, demos, end-to-end checks, and benchmarks.
192
254
 
193
- This is an explicit handoff tool. Continuous synchronization and user-owned asynchronous storage adapters remain future work.
255
+ Continuous background synchronization is intentionally out of scope: handoffs are explicit, so you always know which device has the work.
194
256
 
195
257
  ## License
196
258
 
197
- [MIT](LICENSE).
259
+ [MIT](LICENSE)
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { spawnSync } = require("node:child_process");
3
+ const { spawn } = require("node:child_process");
4
4
  const { existsSync } = require("node:fs");
5
5
  const path = require("node:path");
6
6
 
@@ -24,13 +24,39 @@ if (!existsSync(binary)) {
24
24
  process.exit(1);
25
25
  }
26
26
 
27
- const result = spawnSync(binary, process.argv.slice(2), {
27
+ const child = spawn(binary, process.argv.slice(2), {
28
28
  stdio: "inherit",
29
29
  env: process.env,
30
+ // Supported platforms are POSIX. A separate group prevents a terminal or
31
+ // group signal from reaching the child both directly and via forwarding.
32
+ // Keep the child referenced so this launcher always waits for cleanup.
33
+ detached: true,
30
34
  });
31
35
 
32
- if (result.error) {
33
- process.stderr.write(`${result.error.message}\n`);
34
- process.exit(1);
36
+ const handlers = new Map();
37
+ for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
38
+ const forward = () => child.kill(signal);
39
+ handlers.set(signal, forward);
40
+ process.on(signal, forward);
41
+ }
42
+
43
+ function removeHandlers() {
44
+ for (const [signal, handler] of handlers) {
45
+ process.removeListener(signal, handler);
46
+ }
35
47
  }
36
- process.exit(result.status ?? 1);
48
+
49
+ child.once("error", (error) => {
50
+ removeHandlers();
51
+ process.stderr.write(`${error.message}\n`);
52
+ process.exit(1);
53
+ });
54
+
55
+ child.once("exit", (code, signal) => {
56
+ removeHandlers();
57
+ if (signal) {
58
+ process.kill(process.pid, signal);
59
+ return;
60
+ }
61
+ process.exit(code ?? 1);
62
+ });
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbaehova/onthego",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Open-source workspace and coding-agent session handoffs between your own devices",
5
5
  "license": "MIT",
6
6
  "repository": {