@leftoff/cli 0.0.0-stage → 0.6.2
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/.claude-plugin/marketplace.json +14 -0
- package/CHANGELOG.md +553 -0
- package/LICENSE.md +9 -0
- package/README.md +28 -2
- package/assets/sample-transcript.jsonl +12 -0
- package/bin/checkpoints.js +7 -0
- package/bin/leftoff.js +585 -0
- package/hooks/README.md +22 -0
- package/hooks/settings-hooks.example.json +82 -0
- package/mod/.claude-plugin/plugin.json +15 -0
- package/mod/hooks/core.js +1397 -0
- package/mod/hooks/hooks.json +4 -0
- package/mod/hooks/register.js +1006 -0
- package/package.json +45 -4
- package/templates/agent-feed-worker/README.md +45 -0
- package/templates/agent-feed-worker/src/index.js +69 -0
- package/templates/agent-feed-worker/wrangler.toml +20 -0
- package/ui/app.css +1264 -0
- package/ui/app.js +2979 -0
- package/ui/apple-touch-icon.png +0 -0
- package/ui/changelog-md.js +64 -0
- package/ui/favicon-32.png +0 -0
- package/ui/favicon-badge-32.png +0 -0
- package/ui/favicon-badge.svg +1 -0
- package/ui/favicon.ico +0 -0
- package/ui/favicon.svg +1 -0
- package/ui/go.js +68 -0
- package/ui/icon-192.png +0 -0
- package/ui/icon-512.png +0 -0
- package/ui/icon-maskable-512.png +0 -0
- package/ui/icons.js +41 -0
- package/ui/index.html +55 -0
- package/ui/manifest.webmanifest +37 -0
- package/ui/needs.js +197 -0
- package/ui/offline.css +11 -0
- package/ui/offline.html +24 -0
- package/ui/pair.html +31 -0
- package/ui/picker.js +294 -0
- package/ui/relay-client.js +187 -0
- package/ui/relay-crypto.js +155 -0
- package/ui/relay-pair.js +48 -0
- package/ui/repos.js +167 -0
- package/ui/settings-nav.js +23 -0
- package/ui/summary-examples.js +66 -0
- package/ui/sw.js +34 -0
- package/ui/theme.js +41 -0
- package/ui/vendor/LUCIDE-LICENSE.txt +45 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Copyright (c) 2026 OneSillyApp. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Leftoff is proprietary software for now. You may install and use this package
|
|
4
|
+
as published on npm. Copying, modifying, redistributing or reverse engineering
|
|
5
|
+
it is not permitted without written permission.
|
|
6
|
+
|
|
7
|
+
A source-available license is planned for a later release.
|
|
8
|
+
|
|
9
|
+
Questions: hello@leftoff.dev
|
package/README.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Leftoff
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**WTF was I working on?** Leftoff watches your Claude Code sessions, writes a
|
|
4
|
+
3-line checkpoint when one goes quiet, and gives you a morning digest and a
|
|
5
|
+
board of everything you had open, on every Mac you use.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm i -g @leftoff/cli
|
|
9
|
+
leftoff setup
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
(`pnpm add -g @leftoff/cli` works too; the command is `leftoff`.) Setup takes about two minutes: it installs
|
|
13
|
+
the Claude Code plugin, picks a summarizer and starts a small local daemon with
|
|
14
|
+
a web board at http://127.0.0.1:7429.
|
|
15
|
+
|
|
16
|
+
Want your board on your phone? Claim your own address:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
leftoff relay signup yourname
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- What it is: https://leftoff.dev
|
|
23
|
+
- How it works: https://leftoff.dev/how-it-works
|
|
24
|
+
- Update: `leftoff upgrade`
|
|
25
|
+
|
|
26
|
+
Everything Leftoff writes is plain Markdown in a folder you choose. The hosted
|
|
27
|
+
board is end-to-end encrypted between your phone and your Macs.
|
|
28
|
+
|
|
29
|
+
Proprietary for now (see LICENSE.md); a source-available license is planned.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{"type": "summary", "summary": "Larry sync retry", "leafUuid": "x"}
|
|
2
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u2", "timestamp": "2026-10-09T13:02:00.000Z", "type": "user", "message": {"role": "user", "content": "The Larry sync worker retries forever when the API is down. Add exponential backoff with jitter and cap it at 5 attempts."}}
|
|
3
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u3", "timestamp": "2026-10-09T13:03:00.000Z", "type": "assistant", "message": {"id": "msg_1", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "text", "text": "Reading the worker and the retry helper first."}]}}
|
|
4
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u4", "timestamp": "2026-10-09T13:04:00.000Z", "type": "assistant", "message": {"id": "msg_1", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "tool_use", "id": "tu1", "name": "Read", "input": {"file_path": "/Users/joel/code/larry/src/sync/worker.ts"}}]}}
|
|
5
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u5", "timestamp": "2026-10-09T13:05:00.000Z", "type": "assistant", "message": {"id": "msg_1", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "tool_use", "id": "tu2", "name": "Read", "input": {"file_path": "/Users/joel/code/larry/src/sync/retry.ts"}}]}}
|
|
6
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u6", "timestamp": "2026-10-09T13:06:00.000Z", "type": "user", "message": {"role": "user", "content": [{"type": "tool_result", "tool_use_id": "tu1", "content": "export async function syncWorker() {...}"}, {"type": "tool_result", "tool_use_id": "tu2", "content": "export function retry() {...}"}]}}
|
|
7
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u7", "timestamp": "2026-10-09T13:07:00.000Z", "type": "assistant", "message": {"id": "msg_2", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "text", "text": "Rewriting retry() with exponential backoff and full jitter, capped at 5 attempts."}, {"type": "tool_use", "id": "tu3", "name": "Edit", "input": {"file_path": "/Users/joel/code/larry/src/sync/retry.ts", "old_string": "a", "new_string": "b"}}, {"type": "tool_use", "id": "tu4", "name": "Edit", "input": {"file_path": "/Users/joel/code/larry/src/sync/worker.ts", "old_string": "a", "new_string": "b"}}]}}
|
|
8
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u8", "timestamp": "2026-10-09T13:08:00.000Z", "type": "user", "message": {"role": "user", "content": [{"type": "tool_result", "tool_use_id": "tu3", "content": "ok"}, {"type": "tool_result", "tool_use_id": "tu4", "content": "ok"}]}}
|
|
9
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u9", "timestamp": "2026-10-09T13:09:00.000Z", "type": "assistant", "message": {"id": "msg_3", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "tool_use", "id": "tu5", "name": "Bash", "input": {"command": "npm test -- sync"}}]}}
|
|
10
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u10", "timestamp": "2026-10-09T13:10:00.000Z", "type": "user", "message": {"role": "user", "content": [{"type": "tool_result", "tool_use_id": "tu5", "content": "PASS test/sync.unit.test.ts\nFAIL test/sync.int.test.ts\n staging request timed out after 30000 ms", "is_error": true}]}}
|
|
11
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u11", "timestamp": "2026-10-09T13:11:00.000Z", "type": "user", "message": {"role": "user", "content": "<local-command-stdout>Set model to opus</local-command-stdout>"}}
|
|
12
|
+
{"parentUuid": null, "isSidechain": false, "userType": "external", "cwd": "/Users/joel/code/larry", "sessionId": "00893aaf-19fa-41d2-8238-13269b9b3ca0", "version": "2.1.290", "gitBranch": "fix/sync-retry", "uuid": "u12", "timestamp": "2026-10-09T13:12:00.000Z", "type": "assistant", "message": {"id": "msg_4", "role": "assistant", "model": "claude-opus-5", "content": [{"type": "text", "text": "Unit tests pass with the new backoff. The integration test against staging still times out after 30s because the staging endpoint is slow. Do you want me to bump the integration timeout to 90s, or mock the slow endpoint?"}]}}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// `checkpoints` is the old name of `leftoff` (v0.4.5). It stays as an alias that
|
|
3
|
+
// does exactly the same thing, so 0.4.4 settings hooks, launch agents and
|
|
4
|
+
// `checkpoints upgrade` keep working. The only difference: `checkpoints --help`
|
|
5
|
+
// mentions the new name.
|
|
6
|
+
globalThis.LEFTOFF_INVOKED_AS = 'checkpoints'
|
|
7
|
+
await import('./leftoff.js')
|