@jbaehova/onthego 0.1.3 → 0.3.1
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,212 +1,218 @@
|
|
|
1
|
-
|
|
1
|
+
# ONTHEGO
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<strong>Carry the work. Keep the context.</strong>
|
|
5
|
-
</p>
|
|
3
|
+
Continue your coding-agent conversation on another device, with your unfinished Git workspace intact.
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
<em>Secure, project-scoped AI agent handoffs from your local Git workspace to a Daytona sandbox.</em>
|
|
9
|
-
</p>
|
|
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.
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
<img alt="npm version" src="https://img.shields.io/npm/v/%40jbaehova%2Fonthego?style=flat-square&logo=npm&logoColor=white&color=CB3837">
|
|
13
|
-
<img alt="Node 18+" src="https://img.shields.io/badge/Node-18%2B-43853D?style=flat-square&logo=node.js&logoColor=white">
|
|
14
|
-
<img alt="Go 1.25.4+" src="https://img.shields.io/badge/Go-1.25.4%2B-00ADD8?style=flat-square&logo=go&logoColor=white">
|
|
15
|
-
<img alt="macOS arm64 and Linux x64" src="https://img.shields.io/badge/Platform-macOS_arm64_%7C_Linux_x64-334155?style=flat-square">
|
|
16
|
-
<a href="LICENSE"><img alt="License MIT" src="https://img.shields.io/badge/License-MIT-C5A800?style=flat-square"></a>
|
|
17
|
-
</p>
|
|
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.
|
|
18
8
|
|
|
19
|
-
|
|
20
|
-
<img src="assets/onthego-banner.webp" alt="ONTHEGO carrying secure agent context from a local workspace to a cloud sandbox" width="88%">
|
|
21
|
-
</p>
|
|
9
|
+
## Install
|
|
22
10
|
|
|
23
|
-
|
|
11
|
+
```sh
|
|
12
|
+
npm install -g @jbaehova/onthego@^0.3.1
|
|
13
|
+
```
|
|
14
|
+
|
|
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.
|
|
24
16
|
|
|
25
|
-
|
|
17
|
+
You can also build from source with Go 1.26 or newer (the build selects Go 1.27.2):
|
|
26
18
|
|
|
27
|
-
```
|
|
28
|
-
|
|
19
|
+
```sh
|
|
20
|
+
git clone https://github.com/peerproblem/onthego.git
|
|
21
|
+
cd onthego
|
|
22
|
+
make build
|
|
23
|
+
mkdir -p ~/.local/bin
|
|
24
|
+
install -m 755 dist/onthego ~/.local/bin/onthego
|
|
25
|
+
# Or: go install github.com/peerproblem/onthego/cmd/onthego@latest
|
|
29
26
|
```
|
|
30
27
|
|
|
31
|
-
##
|
|
28
|
+
## Desktop to laptop
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
- Redacts tokens, authorization headers, private keys, and matching secret assignments before transfer.
|
|
35
|
-
- Generates a redacted context envelope and human-readable `HANDOFF.md`.
|
|
36
|
-
- Starts the default `agent-sync` workload in Daytona with one command.
|
|
37
|
-
- Synchronizes run state, redacted logs, and summaries across authenticated devices.
|
|
38
|
-
- Uses GPT-5.6 Luna with high reasoning effort to turn current state into a concise status update.
|
|
39
|
-
- Downloads an artifact only after its hash matches the remote run receipt.
|
|
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.
|
|
40
31
|
|
|
41
|
-
|
|
32
|
+
Inside the project on the desktop:
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
```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
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
# Stop agents and other processes that write project files, then:
|
|
42
|
+
onthego push laptop --verbose
|
|
47
43
|
```
|
|
48
44
|
|
|
49
|
-
|
|
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.
|
|
46
|
+
|
|
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.
|
|
50
48
|
|
|
51
|
-
|
|
52
|
-
DAYTONA_API_KEY=...
|
|
53
|
-
ONTHEGO_CONTROL_PLANE_URL=https://your-control-plane.example.com
|
|
54
|
-
ONTHEGO_CONTROL_PLANE_TLS_SHA256=...
|
|
55
|
-
ONTHEGO_LOGIN_BOOTSTRAP_TOKEN=...
|
|
49
|
+
For the first transfer, choose a destination directory that does not exist. On the laptop:
|
|
56
50
|
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
```sh
|
|
52
|
+
cd /Users/me/projects/my-app
|
|
53
|
+
onthego status
|
|
54
|
+
codex resume <session-id>
|
|
55
|
+
# Or: claude --resume <session-id>
|
|
59
56
|
```
|
|
60
57
|
|
|
61
|
-
|
|
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).
|
|
62
59
|
|
|
63
|
-
|
|
64
|
-
chmod 600 .env
|
|
60
|
+
To bring laptop changes back, run this from the desktop project:
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
onthego
|
|
68
|
-
onthego pass
|
|
69
|
-
onthego status
|
|
70
|
-
onthego pull
|
|
62
|
+
```sh
|
|
63
|
+
onthego pull laptop --verbose
|
|
71
64
|
```
|
|
72
65
|
|
|
73
|
-
|
|
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.
|
|
74
67
|
|
|
75
|
-
|
|
76
|
-
> The current release expects a Daytona account and a deployed ONTHEGO control plane. The control plane server is included in this repository. See [Architecture](docs/architecture.md) and the [Contabo operations guide](docs/contabo.md).
|
|
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.
|
|
77
69
|
|
|
78
|
-
##
|
|
70
|
+
## What moves
|
|
79
71
|
|
|
80
|
-
|
|
|
72
|
+
| Data | Behavior |
|
|
81
73
|
| --- | --- |
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
|
85
|
-
|
|
|
86
|
-
|
|
|
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. |
|
|
83
|
+
|
|
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.
|
|
85
|
+
|
|
86
|
+
## Sessions and conflicts
|
|
87
|
+
|
|
88
|
+
The default selection is sessions active in the last seven days. Choose a narrower or broader set explicitly:
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
onthego push laptop --session <id>
|
|
92
|
+
onthego push laptop --session-days 2
|
|
93
|
+
onthego push laptop --all-sessions
|
|
94
|
+
onthego pull laptop --no-sessions
|
|
95
|
+
onthego pull laptop --session-conflict skip
|
|
96
|
+
```
|
|
87
97
|
|
|
88
|
-
|
|
98
|
+
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. An explicitly requested ID that cannot be found fails before packaging. `--no-sessions` skips session discovery and leaves receiving agent homes untouched.
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
onthego status --json
|
|
92
|
-
onthego pull --output ./handoff-result.md --json
|
|
93
|
-
```
|
|
100
|
+
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. `--session-conflict keep-both`, `--session-conflict theirs`, and `--session-conflict 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. `status` reports pending recovery. Retry the same package or run `onthego sessions recover --session-conflict keep-both` to import only the saved sessions while preserving subsequent workspace edits. JSON reports `sessions.status: "recovery_needed"` until recovery succeeds. The deprecated `--sessions` alias still works and warns; it only chooses a conflict policy.
|
|
94
101
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
C[Hermes] --> E
|
|
102
|
-
D[Claude] --> E
|
|
103
|
-
E --> F[Local redaction]
|
|
104
|
-
F --> G[Context envelope and HANDOFF.md]
|
|
105
|
-
G --> H[Daytona agent-sync]
|
|
106
|
-
H --> I[Redacted logs and run receipt]
|
|
107
|
-
I --> J[ONTHEGO control plane]
|
|
108
|
-
J --> K[Authenticated devices]
|
|
109
|
-
I --> L[SHA-256 verified pull]
|
|
102
|
+
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.
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
onthego backups list
|
|
106
|
+
onthego undo
|
|
107
|
+
onthego backups prune --keep 3
|
|
110
108
|
```
|
|
111
109
|
|
|
112
|
-
|
|
110
|
+
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. Backup listing, pruning and undo remain available even if `.onthego.yaml` is missing or invalid. Use Git to reconcile intentional concurrent development.
|
|
113
111
|
|
|
114
|
-
|
|
112
|
+
## Configuration
|
|
115
113
|
|
|
116
|
-
|
|
114
|
+
Commit the project policy `.onthego.yaml`:
|
|
117
115
|
|
|
118
|
-
|
|
116
|
+
```yaml
|
|
117
|
+
schema_version: 2
|
|
118
|
+
project_id: generated-by-onthego-init
|
|
119
|
+
include:
|
|
120
|
+
- .onthego.yaml
|
|
121
|
+
exclude:
|
|
122
|
+
- .git
|
|
123
|
+
- .onthego.local
|
|
124
|
+
- node_modules
|
|
125
|
+
- vendor
|
|
126
|
+
- dist
|
|
127
|
+
- build
|
|
128
|
+
- .cache
|
|
129
|
+
- __pycache__
|
|
130
|
+
agent: auto
|
|
131
|
+
```
|
|
119
132
|
|
|
120
|
-
|
|
133
|
+
`agent` accepts `auto`, `codex`, `claude`, or `none`. `none` performs workspace-only handoffs.
|
|
121
134
|
|
|
122
|
-
|
|
135
|
+
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.
|
|
123
136
|
|
|
124
|
-
|
|
137
|
+
```sh
|
|
138
|
+
onthego config path
|
|
139
|
+
onthego device list
|
|
140
|
+
onthego identity
|
|
141
|
+
onthego push laptop --include scratch/notes.txt
|
|
142
|
+
onthego push laptop --include-secret .env
|
|
143
|
+
```
|
|
125
144
|
|
|
126
|
-
|
|
145
|
+
Explicitly selected files remain managed across subsequent handoffs, including deletions. Do not opt in credentials that must stay device-local. Adding a managed supplemental file to `exclude` stops future transfer and leaves the receiving copy in place with a warning. Source deletions still propagate. Project exclusions override previously remembered secret selections; explicitly combining an excluded path with `--include-secret` fails.
|
|
127
146
|
|
|
128
|
-
|
|
147
|
+
Credential filenames such as `.npmrc` and `.netrc` are excluded from automatic selection. `--include-secret .npmrc` carries an allowed file in the encrypted supplemental payload, outside Git objects. Names such as `tokenizer.ts`, `docs-secret-santa.md`, and `design.key` are ordinary project files, not secret candidates.
|
|
129
148
|
|
|
130
|
-
|
|
131
|
-
| --- | --- |
|
|
132
|
-
| Project | Session discovery is limited to the current Git repository. |
|
|
133
|
-
| Secrets | The root `.env` must not be accessible by group or other users and is never tracked. |
|
|
134
|
-
| Transfer | Session content is redacted locally before upload. |
|
|
135
|
-
| Control plane | TLS is pinned by certificate SHA-256 fingerprint. |
|
|
136
|
-
| State | Authenticated generation checks reject stale writes. |
|
|
137
|
-
| Results | Remote artifacts are accepted only when their SHA-256 hash matches the receipt. |
|
|
138
|
-
| Snapshots | Portable `.otg` snapshots use age X25519 encryption and Ed25519 signatures. |
|
|
149
|
+
## Portable snapshots
|
|
139
150
|
|
|
140
|
-
|
|
151
|
+
For removable storage or another delivery channel, create an encrypted `.otg` file:
|
|
141
152
|
|
|
142
|
-
|
|
153
|
+
```sh
|
|
154
|
+
onthego snapshot pack --output /tmp/project.otg --recipient age1...
|
|
143
155
|
|
|
144
|
-
|
|
156
|
+
# On the receiving device:
|
|
157
|
+
onthego snapshot restore /tmp/project.otg \
|
|
158
|
+
--output /path/to/project \
|
|
159
|
+
--signing-public <trusted-source-public-key>
|
|
160
|
+
```
|
|
145
161
|
|
|
146
|
-
|
|
162
|
+
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.
|
|
147
163
|
|
|
148
|
-
|
|
149
|
-
workloads:
|
|
150
|
-
agent-sync:
|
|
151
|
-
kind: agent
|
|
152
|
-
image: debian:bookworm-slim
|
|
153
|
-
gpu_count: 0
|
|
154
|
-
argv:
|
|
155
|
-
- /bin/sh
|
|
156
|
-
- -lc
|
|
157
|
-
- cp ../context/HANDOFF.md ./HANDOFF.md
|
|
158
|
-
output_path: HANDOFF.md
|
|
159
|
-
timeout_seconds: 600
|
|
160
|
-
```
|
|
164
|
+
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.
|
|
161
165
|
|
|
162
|
-
|
|
166
|
+
## Commands
|
|
163
167
|
|
|
164
|
-
|
|
168
|
+
| Command | Purpose |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| `init` | Initialize project policy. |
|
|
171
|
+
| `device add/list/remove` | Pair and manage devices. |
|
|
172
|
+
| `remote set` | Manage project paths on those devices. |
|
|
173
|
+
| `push`, `pull` | Hand off a workspace and selected histories. |
|
|
174
|
+
| `status [device]` | Inspect changes and active-device guidance. |
|
|
175
|
+
| `inspect` | Preview file selection and excluded secret candidates. |
|
|
176
|
+
| `doctor [device]` | Check prerequisites, CLI versions, and optional peer access. |
|
|
177
|
+
| `snapshot pack/restore` | Create or receive an offline package. |
|
|
178
|
+
| `sessions recover` | Retry saved native histories without changing the workspace. |
|
|
179
|
+
| `backups list/prune`, `undo` | Inspect, limit, or restore Git backups. |
|
|
180
|
+
| `identity`, `config path`, `version` | Inspect public identity and installation. |
|
|
181
|
+
|
|
182
|
+
Text output escapes control characters in filenames and session IDs. Suggested commands for these unusual names use Bash/Zsh quoting. `--json` emits structured results and errors. `--verbose` reports transfer phases on stderr. Dry-run validates local options and previews files plus selected sessions. Its `not_checked` field lists `peer` and `destination_conflict`.
|
|
183
|
+
|
|
184
|
+
| Exit status | Public error codes |
|
|
185
|
+
| --- | --- |
|
|
186
|
+
| 0 | Success, including delivered workspaces with pending session recovery |
|
|
187
|
+
| 1 | `E_INTERNAL` |
|
|
188
|
+
| 2 | `E_INPUT` |
|
|
189
|
+
| 3 | `E_PRECONDITION`, `E_UNSUPPORTED_GIT`, `E_SECRET_POLICY`, `E_SESSION_FORMAT` |
|
|
190
|
+
| 4 | `E_TARGET_AUTH`, `E_TARGET_UNAVAILABLE` |
|
|
191
|
+
| 5 | `E_PACKAGE_INVALID`, `E_RESTORE_FAILED` |
|
|
192
|
+
| 6 | `E_GENERATION_CONFLICT`, `E_SOURCE_CHANGED` |
|
|
193
|
+
| 130 | `E_CANCELED` |
|
|
165
194
|
|
|
166
|
-
|
|
195
|
+
## Upgrading to 0.3.1
|
|
167
196
|
|
|
168
|
-
|
|
169
|
-
- Linux on x86-64 (`linux-x64`)
|
|
197
|
+
Upgrade both devices together. Snapshot schema 3 adds signed `retained_paths` and `payload_sizes`; 0.3.1 reads schema 2 and 3, while older receivers reject schema 3. Peer transfers require the `snapshot-v3` and `session-scope` capabilities. Project policy and handoff receipt schemas remain 2; session recovery uses a separate state file.
|
|
170
198
|
|
|
171
|
-
|
|
199
|
+
If you transferred an untracked credential file such as `.npmrc` with 0.3.0 or earlier, rotate its tokens. Those bytes can remain in the source and receiving repositories' Git objects through retained WIP history. This update prevents new automatic capture but does not remove existing objects; Git garbage collection alone does not remove referenced history. See the [0.3.1 release notes](docs/releases/0.3.1.md).
|
|
172
200
|
|
|
173
201
|
## Development
|
|
174
202
|
|
|
175
|
-
```
|
|
176
|
-
git clone https://github.com/jbaehova/onthego.git
|
|
177
|
-
cd onthego
|
|
203
|
+
```sh
|
|
178
204
|
make check
|
|
205
|
+
go test -race ./...
|
|
179
206
|
make build
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Useful project commands:
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
make test
|
|
186
207
|
./scripts/demo.sh
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
The release workflow tests and vets the Go code, builds static Linux amd64 and macOS arm64 binaries, scans the npm package for local or secret files, publishes with npm provenance, and attaches checksummed binaries to the GitHub release.
|
|
192
|
-
|
|
193
|
-
## Repository Layout
|
|
194
|
-
|
|
195
|
-
```text
|
|
196
|
-
cmd/ CLI and control plane entry points
|
|
197
|
-
internal/ capture, redaction, transport, state, and verification
|
|
198
|
-
npm/ cross-platform npm launcher and packaged binaries
|
|
199
|
-
deploy/contabo/ hardened systemd service for the control plane
|
|
200
|
-
docs/ architecture, demo, pitch, and progress notes
|
|
201
|
-
scripts/ local demo workflow
|
|
208
|
+
./scripts/ssh-e2e.sh
|
|
209
|
+
make package
|
|
202
210
|
```
|
|
203
211
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
The five-command agent handoff is the supported Phase 1 contract. GPU fine-tuning, GPU model serving, and Hugging Face model and dataset connectors are active backlog items and are not presented as production features yet.
|
|
212
|
+
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).
|
|
207
213
|
|
|
208
|
-
|
|
214
|
+
This is an explicit handoff tool. Continuous synchronization and user-owned asynchronous storage adapters remain future work.
|
|
209
215
|
|
|
210
216
|
## License
|
|
211
217
|
|
|
212
|
-
MIT
|
|
218
|
+
[MIT](LICENSE).
|
package/npm/bin/onthego.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const { spawn } = require("node:child_process");
|
|
4
4
|
const { existsSync } = require("node:fs");
|
|
5
5
|
const path = require("node:path");
|
|
6
6
|
|
|
7
7
|
const supported = new Map([
|
|
8
8
|
["darwin-arm64", "onthego-darwin-arm64"],
|
|
9
|
+
["darwin-x64", "onthego-darwin-amd64"],
|
|
9
10
|
["linux-x64", "onthego-linux-amd64"],
|
|
11
|
+
["linux-arm64", "onthego-linux-arm64"],
|
|
10
12
|
]);
|
|
11
13
|
|
|
12
14
|
const platform = `${process.platform}-${process.arch}`;
|
|
@@ -22,13 +24,39 @@ if (!existsSync(binary)) {
|
|
|
22
24
|
process.exit(1);
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
const
|
|
27
|
+
const child = spawn(binary, process.argv.slice(2), {
|
|
26
28
|
stdio: "inherit",
|
|
27
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,
|
|
28
34
|
});
|
|
29
35
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
+
}
|
|
33
47
|
}
|
|
34
|
-
|
|
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,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbaehova/onthego",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Open-source workspace and coding-agent session handoffs between your own devices",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/
|
|
8
|
+
"url": "git+https://github.com/peerproblem/onthego.git"
|
|
9
9
|
},
|
|
10
|
-
"homepage": "https://github.com/
|
|
10
|
+
"homepage": "https://github.com/peerproblem/onthego#readme",
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/
|
|
12
|
+
"url": "https://github.com/peerproblem/onthego/issues"
|
|
13
13
|
},
|
|
14
14
|
"bin": {
|
|
15
15
|
"onthego": "npm/bin/onthego.js"
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"npm/bin/onthego.js",
|
|
19
19
|
"npm/vendor/onthego-darwin-arm64",
|
|
20
|
+
"npm/vendor/onthego-darwin-amd64",
|
|
21
|
+
"npm/vendor/onthego-linux-arm64",
|
|
20
22
|
"npm/vendor/onthego-linux-amd64",
|
|
21
23
|
"README.md",
|
|
22
24
|
"LICENSE"
|
|
@@ -27,7 +29,10 @@
|
|
|
27
29
|
"scripts": {
|
|
28
30
|
"demo": "./scripts/demo.sh",
|
|
29
31
|
"prepack": "node npm/scripts/verify-package.mjs",
|
|
30
|
-
"test": "go test ./..."
|
|
32
|
+
"test": "go test ./...",
|
|
33
|
+
"test:e2e": "./scripts/ssh-e2e.sh",
|
|
34
|
+
"test:interrupt": "python3 scripts/sigint-e2e.py",
|
|
35
|
+
"benchmark": "python3 scripts/benchmark.py"
|
|
31
36
|
},
|
|
32
37
|
"publishConfig": {
|
|
33
38
|
"access": "public",
|