@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.
Files changed (47) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/CHANGELOG.md +553 -0
  3. package/LICENSE.md +9 -0
  4. package/README.md +28 -2
  5. package/assets/sample-transcript.jsonl +12 -0
  6. package/bin/checkpoints.js +7 -0
  7. package/bin/leftoff.js +585 -0
  8. package/hooks/README.md +22 -0
  9. package/hooks/settings-hooks.example.json +82 -0
  10. package/mod/.claude-plugin/plugin.json +15 -0
  11. package/mod/hooks/core.js +1397 -0
  12. package/mod/hooks/hooks.json +4 -0
  13. package/mod/hooks/register.js +1006 -0
  14. package/package.json +45 -4
  15. package/templates/agent-feed-worker/README.md +45 -0
  16. package/templates/agent-feed-worker/src/index.js +69 -0
  17. package/templates/agent-feed-worker/wrangler.toml +20 -0
  18. package/ui/app.css +1264 -0
  19. package/ui/app.js +2979 -0
  20. package/ui/apple-touch-icon.png +0 -0
  21. package/ui/changelog-md.js +64 -0
  22. package/ui/favicon-32.png +0 -0
  23. package/ui/favicon-badge-32.png +0 -0
  24. package/ui/favicon-badge.svg +1 -0
  25. package/ui/favicon.ico +0 -0
  26. package/ui/favicon.svg +1 -0
  27. package/ui/go.js +68 -0
  28. package/ui/icon-192.png +0 -0
  29. package/ui/icon-512.png +0 -0
  30. package/ui/icon-maskable-512.png +0 -0
  31. package/ui/icons.js +41 -0
  32. package/ui/index.html +55 -0
  33. package/ui/manifest.webmanifest +37 -0
  34. package/ui/needs.js +197 -0
  35. package/ui/offline.css +11 -0
  36. package/ui/offline.html +24 -0
  37. package/ui/pair.html +31 -0
  38. package/ui/picker.js +294 -0
  39. package/ui/relay-client.js +187 -0
  40. package/ui/relay-crypto.js +155 -0
  41. package/ui/relay-pair.js +48 -0
  42. package/ui/repos.js +167 -0
  43. package/ui/settings-nav.js +23 -0
  44. package/ui/summary-examples.js +66 -0
  45. package/ui/sw.js +34 -0
  46. package/ui/theme.js +41 -0
  47. 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
- # Temporary Holding Version
1
+ # Leftoff
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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')