@shardflux/cli 0.20.0 → 0.22.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +214 -1
  2. package/README.md +215 -75
  3. package/dist/account-args.js +7 -2
  4. package/dist/account-commands.js +56 -106
  5. package/dist/account-pool.d.ts +19 -15
  6. package/dist/account-pool.js +47 -96
  7. package/dist/account-scope.d.ts +65 -0
  8. package/dist/account-scope.js +246 -0
  9. package/dist/acp-login.d.ts +4 -3
  10. package/dist/acp-login.js +7 -5
  11. package/dist/acp-models.js +20 -15
  12. package/dist/acp.js +66 -13
  13. package/dist/agent-commands.d.ts +4 -1
  14. package/dist/agent-commands.js +86 -32
  15. package/dist/agent-config-return.d.ts +46 -2
  16. package/dist/agent-config-return.js +110 -4
  17. package/dist/agent-credentials.js +7 -3
  18. package/dist/agent-repository.d.ts +16 -3
  19. package/dist/agent-repository.js +149 -74
  20. package/dist/agent-setup.d.ts +14 -3
  21. package/dist/agent-setup.js +78 -36
  22. package/dist/agent-target-commands.js +24 -13
  23. package/dist/args.d.ts +1 -1
  24. package/dist/args.js +94 -54
  25. package/dist/bin.js +5 -1
  26. package/dist/browser.d.ts +13 -2
  27. package/dist/browser.js +30 -14
  28. package/dist/claude-cloud-login.d.ts +24 -2
  29. package/dist/claude-cloud-login.js +151 -11
  30. package/dist/cli-proxy-forward.d.ts +2 -0
  31. package/dist/cli-proxy-forward.js +9 -2
  32. package/dist/cli-proxy-hub.d.ts +69 -25
  33. package/dist/cli-proxy-hub.js +231 -54
  34. package/dist/cli-proxy.d.ts +70 -1
  35. package/dist/cli-proxy.js +298 -32
  36. package/dist/client-settings.d.ts +39 -0
  37. package/dist/client-settings.js +91 -0
  38. package/dist/codex-cloud.d.ts +5 -0
  39. package/dist/codex-cloud.js +88 -17
  40. package/dist/command-center-actions.js +5 -1
  41. package/dist/commands.js +171 -22
  42. package/dist/conversation-commands.d.ts +5 -0
  43. package/dist/conversation-commands.js +8 -5
  44. package/dist/conversation-terminal.d.ts +10 -2
  45. package/dist/conversation-terminal.js +77 -13
  46. package/dist/conversations.d.ts +73 -1
  47. package/dist/conversations.js +257 -23
  48. package/dist/device-bridge.d.ts +1 -1
  49. package/dist/device-bridge.js +6 -4
  50. package/dist/device-helper.js +43 -22
  51. package/dist/errors.d.ts +27 -1
  52. package/dist/errors.js +45 -5
  53. package/dist/filesystem-commands.d.ts +16 -9
  54. package/dist/filesystem-commands.js +108 -54
  55. package/dist/format.d.ts +2 -1
  56. package/dist/format.js +10 -1
  57. package/dist/handlers.js +3 -1
  58. package/dist/initial-prompt.d.ts +8 -0
  59. package/dist/initial-prompt.js +43 -1
  60. package/dist/large-media.d.ts +14 -0
  61. package/dist/large-media.js +100 -0
  62. package/dist/linux-terminal.d.ts +5 -3
  63. package/dist/linux-terminal.js +6 -20
  64. package/dist/local-sessions.d.ts +26 -2
  65. package/dist/local-sessions.js +113 -24
  66. package/dist/machine-setup.d.ts +11 -1
  67. package/dist/machine-setup.js +69 -22
  68. package/dist/machine-status.d.ts +67 -0
  69. package/dist/machine-status.js +140 -0
  70. package/dist/main.js +11 -13
  71. package/dist/move-worktrees-restore.py +144 -0
  72. package/dist/move-worktrees.d.ts +63 -0
  73. package/dist/move-worktrees.js +201 -0
  74. package/dist/move.d.ts +10 -1
  75. package/dist/move.js +116 -16
  76. package/dist/onboarding.d.ts +11 -7
  77. package/dist/onboarding.js +59 -27
  78. package/dist/prepared-repository.d.ts +202 -0
  79. package/dist/prepared-repository.js +860 -0
  80. package/dist/prepared-repository.py +1306 -0
  81. package/dist/project-preparation.d.ts +48 -0
  82. package/dist/project-preparation.js +304 -0
  83. package/dist/project-sync-manifest.d.ts +4 -0
  84. package/dist/project-sync-manifest.js +5 -1
  85. package/dist/project-sync-transfer.js +1 -1
  86. package/dist/project-sync.d.ts +19 -4
  87. package/dist/project-sync.js +31 -8
  88. package/dist/project-template-setup.d.ts +33 -1
  89. package/dist/project-template-setup.js +59 -2
  90. package/dist/secret-ask.d.ts +72 -0
  91. package/dist/secret-ask.js +351 -0
  92. package/dist/seed-phases.d.ts +8 -1
  93. package/dist/seed-phases.js +17 -2
  94. package/dist/setup-cache.d.ts +7 -0
  95. package/dist/setup-cache.js +32 -0
  96. package/dist/t3-launch.js +1 -4
  97. package/dist/t3-mode.d.ts +8 -2
  98. package/dist/t3-mode.js +19 -4
  99. package/dist/t3-phone.d.ts +4 -2
  100. package/dist/t3-phone.js +12 -4
  101. package/dist/terminal-apps.d.ts +157 -0
  102. package/dist/terminal-apps.js +561 -0
  103. package/dist/terminal-onboarding.js +6 -1
  104. package/dist/this-computer.d.ts +11 -0
  105. package/dist/this-computer.js +36 -0
  106. package/dist/thread-on-computer.js +4 -1
  107. package/dist/update.js +11 -3
  108. package/dist/worktree-twin.d.ts +10 -2
  109. package/dist/worktree-twin.js +27 -9
  110. package/package.json +5 -5
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @shardflux/cli: `shard`
2
2
 
3
+ Suspension controls arrive in 0.22.0 (next coordinated release). `shard operations progress <operation-id>` reads the actual phase, host deadline, cancellation window and safe next action. `shard operations cancel <operation-id>` requests cancellation; `--wait --timeout 5m` waits for confirmed `suspend_canceled` recovery of the original workspace. Asynchronous acceptance is labeled separately. The owning host refuses cancellation outside validated preparation; after capture, wait for the outcome and resume if it succeeded. These commands never reset, replace or launch a provider turn. `--json` preserves the reported values; unavailable progress is explicit.
4
+
3
5
  The command line for [Shardflux](https://shardflux.dev): serverless VMs for AI agents. Open a
4
6
  persistent workspace by key, run commands in it, move files in and out, and suspend, resume, fork
5
7
  or delete it. From 0.5.0 it also does everything the web app does: create an account, sign in
@@ -13,6 +15,11 @@ idempotency keys, operation polling and tool-token handling.
13
15
 
14
16
  Requires Node.js 24 or later.
15
17
 
18
+ T3 Connect (0.22.0+): `shard setup --inspect --t3-connect --org <id|slug>` signs in for that organization;
19
+ `--project <id|slug>` selects its project. Without flags it uses the API key's project, then the saved default
20
+ project. Status and Connect use the same person and organization, including a saved session without an API key;
21
+ an explicit selection keeps the default credentials and target status. An approved T3 sign-in is reused.
22
+
16
23
  ## Support and bug reports
17
24
 
18
25
  [Report a bug](https://github.com/shardfluxdev/community/issues/new?template=bug_report.yml) or
@@ -41,8 +48,8 @@ shard ws tunnel customer-42/main --remote 8081 --to localhost:8081
41
48
  ```
42
49
 
43
50
  Commands in the workspace can then call `http://127.0.0.1:8081`. The target is dialed on the machine running
44
- `shard`. Half-close and resets pass through: a reset on either side reaches the other as `ECONNRESET` (0.14.5+). Ctrl-C closes the sockets and guest process. `--bind 0.0.0.0` selects all guest interfaces; loopback is the
45
- default. An open tunnel keeps the workspace awake, and persistent workspaces preserve it across explicit suspend/resume.
51
+ `shard`. Half-close and resets pass through: a reset on either side reaches the other as `ECONNRESET` (0.14.5+). Ctrl-C closes the sockets and guest process. `--bind 0.0.0.0` selects all guest interfaces; loopback (`127.0.0.1`
52
+ and `::1`, 0.22.0+) is the default. An open tunnel keeps the workspace awake, and persistent workspaces preserve it across explicit suspend/resume.
46
53
 
47
54
  The tunnel selects a streaming transport automatically when `pty` permission is granted. Choose `transport: 'pty'` or `transport: 'exec'` in the SDK, or `--transport pty|exec` in the CLI, to select it explicitly. The handle reports `transport`.
48
55
 
@@ -78,6 +85,8 @@ shard --help
78
85
  The [`shardflux`](https://www.npmjs.com/package/shardflux) package installs the `shard` command.
79
86
  Use `shard` for your projects, machine, templates and account.
80
87
 
88
+ If npm reports `EACCES` or `EPERM`, install only Shardflux in your user directory: `npm install --global --prefix "$HOME/.local" shardflux@latest`. Run `"$HOME/.local/bin/shard"` (including `"$HOME/.local/bin/shard" update` for updates), or use `shard` if `command -v shard` points there. Keep npm config, PATH and other global packages unchanged; do not use sudo or chmod. [Installation help](https://docs.shardflux.dev/reference/cli#npm-permission-errors).
89
+
81
90
  ## Quick start
82
91
 
83
92
  Start a conversation on a local project (0.14.0+):
@@ -95,12 +104,20 @@ time `shard` runs, with launch at login enabled; `shard menubar stop` turns it o
95
104
 
96
105
  T3 Code uses one **Shardflux** provider; choose a Claude Code or Codex model to start that agent in the cloud.
97
106
  Model choices come from your cloud agent's session and use the same coding tools and settings as its terminal.
107
+ Project files synchronize before each message and before its completion (0.22.0+): review remote edits in T3’s
108
+ Changes panel and checkpoints, and send local edits to the next turn. Conflicting versions are retained with
109
+ a `.shard-conflict-<agent>` suffix. Sync runs between turns; an idle T3 thread needs no file watcher.
98
110
  The provider is registered automatically when T3 Code is installed, on macOS and on Linux from its .deb or AppImage
99
111
  (0.17.0+). Choose **Sign in** on its card in T3's provider settings: T3 runs `shard acp --login` in its own terminal,
100
112
  which creates or signs in to your account (with this computer's Codex login, or your email) and connects Claude Code
101
- and Codex, skipping every step that is already done (0.15.0+).
113
+ and Codex, skipping every step that is already done (0.15.0+). Editors that launch agents from the ACP registry
114
+ run the same sign-in as `shard --login` (0.22.0+).
102
115
  With T3 Code 0.0.45, `shard agents new --in t3` adds the project as an SSH environment instead.
103
116
 
117
+ In CLI 0.22.0+, `shard setup --inspect` shows a stopped T3 Connect workspace link and its remedy without restarting
118
+ the link or replacing your approved sign-in. A full T3 environment allowance needs a free slot: remove an unused
119
+ environment in T3 Connect, then run `shard agents open t3 <workspace>` to request another link.
120
+
104
121
  Start another thread on a computer that is already set up (0.16.0+): it shares that conversation's installed
105
122
  packages, caches, running services, ports and files, and works on its own branch and worktree.
106
123
 
@@ -138,11 +155,26 @@ shard move --list # the project's sessions, and where moved one
138
155
  shard move --session 3d085e35-aa66-4866-9a53-f09719d6767c --detach --json
139
156
  ```
140
157
 
158
+ CLI 0.22.0+ detects registered worktrees before migration. Inspect the exact paths and file bytes with
159
+ `shard move --last --plan --json`, then choose `--preserve-all-worktrees` to include every registered worktree,
160
+ all local refs, indices and ignored files, or `--this-worktree-only` to leave the others here explicitly.
161
+ Preserve-all includes ignored dependency/build caches; tar headers add to the displayed file bytes and the VM
162
+ and project space need free disk for the copies. It never follows symlinks into unrelated sibling folders.
163
+ The source checkout stays untouched. Cloud worktrees keep their staged/unstaged state; the selected tree runs on
164
+ the conversation's branch while its original branch and HEAD remain in the recovery archive. Git location
165
+ pointers are repaired for the VM. The result's `preserved.snapshot` names an immutable migration-time snapshot
166
+ in the project space. Its `restore.py manifest.json <empty-folder>` command restores the original repository
167
+ state into a new folder and refuses to overwrite continued work. It is a recovery snapshot, not an ongoing
168
+ backup of later edits in other worktrees. Missing registrations, external object alternates, nested repositories
169
+ and special files need resolution before preserve-all can upload.
170
+
141
171
  A running turn finishes here first. Uncommitted edits come along, and your working tree, index and branch stay as
142
172
  they are. The cloud work comes back to your checkout by itself, and typing in the local Claude Code copy shows one line
143
173
  that it continues in the cloud. Sessions from Claude Desktop's Code tab and the Codex app move the same way; in the
144
174
  macOS menu bar, a project's recent sessions have **Move to cloud** in their ⋯ menu, and with the Shardflux MCP server
145
- you can ask the agent itself to continue in the cloud.
175
+ you can ask the agent itself to continue in the cloud. A session is listed under every repository it worked in, also
176
+ one that began in another folder such as Claude Desktop's scratch folder, and `--path <repository>` moves it from
177
+ anywhere (0.22.0+).
146
178
 
147
179
  Start a thread in T3 Code from the command line (0.17.0+):
148
180
 
@@ -153,8 +185,25 @@ shard agents targets --open-in claude=t3,codex=t3 # shard ./ starts new conver
153
185
 
154
186
  The first message becomes a T3 thread and T3 comes to the front. With the Shardflux provider the thread runs in its own
155
187
  cloud VM; with T3 Code 0.0.45 it runs on the T3 server in the project's VM, or with `--on` on that computer's.
156
- `--image` attaches images. `shard agents targets --json` shows T3 Code's mode and where each app's new conversations
157
- open; `shard agents open t3 <conversation>` brings its thread back.
188
+ `--image` attaches images. `shard agents targets --json` shows T3 Code's mode, where each app's new conversations
189
+ open, and every place each app can open (`open_in_targets`, 0.22.0+); `shard agents open t3 <conversation>` brings its
190
+ thread back. Codex opens in a terminal app on macOS too (0.22.0+): `shard agents targets --open-in codex=terminal`.
191
+
192
+ `shard settings --title-prefix <text|none|default>` (0.22.0+) sets the marker your Claude conversations' titles start
193
+ with in claude.ai and the Claude app (default `☁`: "☁ Fix login bug · todo-app"); `shard settings` shows it with where
194
+ conversations open.
195
+
196
+ Terminal conversations open in the terminal you choose (0.22.0+):
197
+
198
+ ```sh
199
+ shard agents targets --terminal ghostty # a new tab in Ghostty's front window (Ghostty 1.3+); :window for a window
200
+ shard agents targets --json # terminals on this computer, the one shard runs in, the saved choice
201
+ shard agents open acme/main --in terminal # opens it there, in the project folder
202
+ ```
203
+
204
+ iTerm2, WezTerm, kitty and Warp open a tab too; Terminal and Alacritty a window. When the chosen app can't be driven
205
+ (for example Automation not allowed) the next one opens and the line says what to allow. `shard ./` run by a coding
206
+ agent opens the new conversation there.
158
207
 
159
208
  Git fetch and push use the coding guest’s platform transport when available, preserving Git’s binary packets (0.14.0+). Older guests retain their existing transport.
160
209
 
@@ -193,27 +242,17 @@ shard conversations landing backups # then: shard conversations landing resto
193
242
  For application workspace commands, `shard signup` creates an account and saves a project key, or set
194
243
  `SHARDFLUX_API_KEY` to a key from the console and run `shard login`. `shard --help` lists every command.
195
244
 
196
- ## Feedback: agents, use this while you work
245
+ ## Feedback: preview and user approval
197
246
 
198
- **(0.5.0+)** `shard feedback` sends a message straight to the Shardflux team, who read every one. If you are a
199
- coding agent (Claude Code, Codex, Cursor, ...) driving `shard`, use it actively while you work, not once at the end.
200
- Send a short message the moment:
247
+ **(0.22.0+)** `shard feedback` previews the exact message, category and context without sending. Add `--yes` only after reviewing that preview and obtaining explicit user authorization. Earlier CLI versions send immediately.
201
248
 
202
- - something fails unexpectedly (`--category bug`),
203
- - an error, doc, name or output is confusing (`--category confusing`),
204
- - a capability, option or template you need is missing (`--category missing`),
205
- - you needed a workaround,
206
- - your user asks for a capability, an option or a smoother workflow: paraphrase it, with what they were trying to do,
207
- - your user has an idea for how Shardflux could fit their work better.
249
+ Coding agents: report only when your user asks to send feedback. Show the exact message and context first, then obtain explicit authorization. A failure or request for a feature is not consent. Leave out private data, secrets and code the user did not mean to share; paraphrase, never paste transcripts. Tell the user what was sent.
208
250
 
209
- Short and frequent beats polished: what you ran, what happened, what you expected. No need to ask first, but tell your
210
- user you sent it. Leave out private data about the user and secrets or code they did not mean to share; paraphrase,
211
- never paste transcripts. Pass the request id and error code from the error so the team can find the logs. A failed
212
- `shard` command ends with a ready-made line to fill in:
251
+ Keep the request id and error code from the failure. The suggested command previews a report; it never includes `--yes`:
213
252
 
214
253
  ```text
215
254
  error: Operation not found. [code=not_found status=404 request_id=req-2b9d4f6a8c0e4a1b3d5f7e90]
216
- feedback: shard feedback --category bug --request-id req-2b9d4f6a8c0e4a1b3d5f7e90 --error-code not_found "<what you expected>"
255
+ feedback: shard feedback --category bug --request-id req-2b9d4f6a8c0e4a1b3d5f7e90 --error-code not_found "<what you expected>" # preview only; show the message and context, then use --yes only after explicit user authorization
217
256
  ```
218
257
 
219
258
  ```sh
@@ -225,13 +264,17 @@ shard feedback --category praise forking a workspace with its dev server still r
225
264
  npm test 2>&1 | tail -n 60 | shard feedback --category bug --workspace acme/demo --from-file -
226
265
  ```
227
266
 
267
+ The commands above only preview. After the user approves the exact message and context, repeat the chosen command with `--yes` to submit. Re-preview file or piped input if its contents changed.
268
+
269
+
228
270
  - The message is the remaining arguments joined with spaces. Quote it, or put it after `--`, when it contains shell
229
271
  characters or words starting with `-`. `--from-file <file|->` reads it from a file or standard input instead. 1-8000
230
272
  characters.
231
273
  - Options: `--category bug|confusing|missing|idea|praise|other` (default `other`), `--workspace <id|key>`,
232
274
  `--request-id <id>`, `--error-code <code>`, `--command <text>` (what you ran). Name the reporting agent with
233
275
  `--agent-label` or `SHARDFLUX_AGENT_LABEL` (e.g. `claude-code`); `shard` adds its own version as the client.
234
- - Output: one line with the feedback id. `Already received` means the same message was sent from this key in the last
276
+ - Preview output includes `sent: false`, `authorization_required: true`, `preview` and `note` with `--json`.
277
+ - Approved submission output: one line with the feedback id. `Already received` means the same message was sent from this key in the last
235
278
  24 hours; it is not emailed again. With `--json`: `{"id", "received_at", "duplicate"}`.
236
279
  - It sends with the project API key (any key; no tool permission), or, when no key is configured yet, with your
237
280
  signed-in session (`shard auth login`), so it works while you are still setting up. It is rate limited per key or
@@ -244,52 +287,69 @@ npm test 2>&1 | tail -n 60 | shard feedback --category bug --workspace acme/demo
244
287
  or the shell is a coding agent's (Claude Code, Codex, Cursor, Gemini CLI; 0.17.1+), `--json` on every command, secrets
245
288
  only on standard input, and documented exit codes.
246
289
 
247
- **Ask your user one question first:** is Shardflux for a **SaaS platform** (their product runs VMs for its own
248
- customers through the API, SDK or MCP) or for their **personal setup** (their own cloud coding agents: each Claude or
249
- Codex conversation gets its own VM)? `shard setup --guide` prints both paths with every command, `--json` as a list
250
- (0.17.1+); so does `shard` in a shell without a terminal. The full walk-through:
251
- [Set up Shardflux with your coding agent](https://docs.shardflux.dev/guides/agent-setup).
252
-
253
- 1. **Account, for both.** Show your user the [Terms of Service](https://shardflux.dev/terms) and the
254
- [Privacy Policy](https://shardflux.dev/privacy); once they agree, `shard signup --accept-terms --json`. With the
255
- Codex CLI signed in with ChatGPT on the machine it signs up (or signs in) with that login and runs `shard setup`:
256
- an organization, a project and an API key, saved. Without a Codex login, or for an account they already have:
257
- `shard auth login --browser --no-wait --json` prints the link and the code for your user and returns (0.17.1+);
258
- `shard auth login --browser --json` then waits for that same request (run it again if your tool's time limit cuts
259
- it off), and `shard setup --json` saves the key. With two-factor authentication a password sign-in exits 4 with
260
- `mfa_required`: ask for the code, then `shard auth mfa --code <code>`.
261
-
262
- **SaaS platform** (no agent sign-ins, menu bar or machine):
290
+ **You run permitted steps; your user decides** (0.22.0+): ask one multiple-choice question at a time with the
291
+ recommended answer first, keep each message to a sentence or two, and never ask for a secret or sign-in code in
292
+ the chat. They answer your questions, agree to the Terms, approve sign-ins in the browser tabs
293
+ shard opens and type secrets into the page shard opens. `shard setup --guide` prints the whole order with every
294
+ command, `--json` as a list with each step's `choices` (0.17.1+); so does `shard` in a shell without a terminal. The
295
+ full walk-through: [Set up Shardflux with your coding agent](https://docs.shardflux.dev/guides/agent-setup).
296
+
297
+ If a permission system or auto-mode classifier refuses an action, stop that action. Explain the reason and hand
298
+ your user the exact refused command to run in their own terminal; ask only for its non-secret result, then resume
299
+ permitted steps. Do not change permission settings, wrap the action in a script or use another tool to bypass the
300
+ refusal. A plugin install needs confirmation that the plugin is installed; machine opening needs the workspace
301
+ key. If setup output or a status check is refused, have your user run `shard setup --guide --json` and confirm
302
+ `guide.signed_in.email` and `guide.api_key_saved`. This local check never prints the credentials and does not prove
303
+ that the key works. Never read redirected logs or credential files instead. An exit code alone does not prove
304
+ onboarding; keep blocked or unobserved behavior unverified.
305
+
306
+ First ask what it is for: their own cloud coding agents (each Claude or Codex conversation gets its own VM; the usual
307
+ answer) or their product (it runs VMs for its customers through the API, SDK or MCP).
308
+
309
+ 1. **Account, for both.** Ask whether they agree to the [Terms of Service](https://shardflux.dev/terms) and the
310
+ [Privacy Policy](https://shardflux.dev/privacy) (Yes / No); then `shard signup --accept-terms --json`. With the
311
+ Codex CLI signed in with ChatGPT on the machine it signs up (or signs in) with that login and runs `shard setup`: an
312
+ organization, a project and an API key, saved. Without a Codex login, or for an existing account, `shard auth login
313
+ --browser --json` opens the sign-in page and waits until they approve it (run it again if your tool's time limit cuts
314
+ it off: it waits for the same request), then `shard setup --json`.
315
+
316
+ **Their own cloud coding agents:**
317
+
318
+ 2. **Connect Claude and Codex.** Ask which they use (Claude Code and Codex / Claude Code / Codex). `shard agents
319
+ credentials login claude --json` opens the claude.ai sign-in and a page for its code in their browser (0.22.0+);
320
+ Codex uses this computer's login (`codex login`). `shard setup --inspect --connect --json --apps claude,codex`
321
+ (0.15.0+) checks both live, copies the Codex login and starts the account's Codex remote device.
322
+ 3. **Set up the machine** every conversation starts from: ask "Set up your cloud machine from this computer?" (Yes /
323
+ Not now), then `shard machine setup --from-this-computer --json` (0.20.0+): this computer's Claude Code or Codex
324
+ recreates its tools, runtimes, shell, git identity and dotfiles there and saves it. Anything more they want: `shard
325
+ machine open --json`, `shard ws exec <key> -- bash -lc '...'`, `shard files write <key> <path> --ask` for a secret
326
+ file they type in the page (0.22.0+), and `shard machine save --wait --json`.
327
+ 4. **Choose where conversations open** (0.22.0+): `shard agents targets --json` lists the apps on this computer;
328
+ offer them (the terminal shard runs in first: Ghostty, iTerm2, WezTerm, kitty, Warp, Terminal; or the Claude app,
329
+ the Codex app, T3 Code) and save the answer with `shard agents targets --open-in <target> --terminal <app>`.
330
+ 5. **Set up the project.** Ask whether it needs secrets (No / type them in a secure page / from their vault): `shard
331
+ secrets create NAME --ask --json` opens a page where they type the value, `shard secrets import --from
332
+ <hsec|1password|bitwarden|keychain> NAME` reads a vault item. Then, in its folder, `shard ./ --json --prompt "Set up
333
+ this project and run its tests"` starts a conversation in its own VM (`shard ./ codex --json ...` for Codex); setup
334
+ installs the dependencies and saves the project template. `shard conversations wait <conversation-id> --timeout 90`
335
+ follows it (run it again while it says Still working).
336
+ 6. **Open the first conversation:** `shard ./` opens it in the app they chose. Claude conversations continue on
337
+ claude.ai and in the Claude app; Codex threads in the Codex app, on the web and on the phone.
338
+
339
+ Commands that wait for your user in the browser (sign-ins, `--ask`) take up to 10 minutes: run them with a long timeout
340
+ or in the background.
341
+
342
+ **Their product** (no agent sign-ins, menu bar or machine):
263
343
 
264
344
  2. `eval "$(shard env)"` exports `SHARDFLUX_API_KEY` for the SDKs, the MCP server and your product's server. Keep it in
265
345
  server-side secrets.
266
- 3. Integrate with `@shardflux/sdk`, the Python SDK `shardflux`, the HTTP API or the MCP server. Your customers'
267
- workspaces start from a template: `shard templates build template.yaml`. `shard exec <key> --template default --
268
- <cmd>` tries a workspace from here (0.10.0+).
346
+ 3. Ask how the product calls Shardflux (TypeScript SDK / Python SDK / HTTP API / MCP server) and integrate with
347
+ `@shardflux/sdk`, the Python SDK `shardflux`, the HTTP API or the MCP server. Your customers' workspaces start from
348
+ a template: `shard templates build template.yaml`. `shard exec <key> --template default -- <cmd>` tries a workspace
349
+ from here (0.10.0+).
269
350
  4. A paid plan: `shard billing upgrade <plan> --json` prints the Stripe Checkout URL; give it to your user, then
270
351
  `shard billing upgrade <plan> --wait` (or `shard billing status`) until it is active.
271
352
 
272
- **Personal setup** (their own cloud coding agents):
273
-
274
- 2. **Connect Claude and Codex.** Claude: your user runs `shard agents credentials login claude` in their own terminal,
275
- once (a claude.ai link and a code). Codex: `codex login` on this computer. Then
276
- `shard setup --inspect --connect --json --apps claude,codex` (0.15.0+) checks both live, copies the Codex login and
277
- starts the account's Codex remote device.
278
- 3. **Build the machine** every conversation starts from. `shard machine setup --from-this-computer --json` (0.20.0+)
279
- has this computer's Claude Code or Codex recreate its tools, runtimes, shell, git identity and dotfiles there and
280
- saves it. For the rest, ask your user what it should carry: languages and runtimes,
281
- CLIs and tools, dotfiles and shell, secrets and credentials, editor and agent config. Then
282
- `shard machine open --json` (0.17.1+) prints the machine VM's key; install with
283
- `shard ws exec <key> -- bash -lc '...'`, write dotfiles and secret files with
284
- `shard files write <key> <path> --from -` (contents on standard input), and `shard machine save --wait --json`.
285
- 4. **Set up the project.** In its folder, `shard ./ --json --prompt "Set up this project and run its tests"` starts a
286
- conversation in its own VM (`shard ./ codex --json ...` for Codex); setup installs the dependencies and saves the
287
- project template. `shard conversations wait <conversation-id> --timeout 90` follows it (run it again while it says
288
- Still working), and `shard template --json` shows the saved version. Project secrets:
289
- `shard secrets import --from <hsec|1password|bitwarden|keychain> NAME`.
290
- 5. **Hand over.** Your user runs `shard ./` in their own terminal. Claude conversations continue on claude.ai and in the
291
- Claude app; Codex threads in the Codex app, on the web and on the phone.
292
-
293
353
  Any time: `shard setup --json` is idempotent, and sensitive actions (exports, deletions, two-factor and email changes)
294
354
  need a recent step-up: `printf '%s\n' "$PASSWORD" | shard auth step-up` (without a terminal the command fails with
295
355
  `step_up_required`, exit 4, and the hint names this command). Send `shard feedback` as you work, the moment something
@@ -384,8 +444,9 @@ shard auth totp recovery-codes
384
444
  3. an API key with every workspace tool, `computer` included (0.15.1+; `--tool` repeatable to narrow it), named
385
445
  `shard-cli <hostname>` (`--key-name`), saved in the credentials file and checked against the API.
386
446
 
387
- `shard setup --guide` (0.17.1+) prints how to set Shardflux up with a coding agent: the question to ask first (a SaaS
388
- platform, or the user's own cloud coding agents) and the ordered steps of both; `--json` gives them as a list.
447
+ `shard setup --guide` (0.17.1+) prints how to set Shardflux up with a coding agent: how to run it (the agent does
448
+ permitted steps and hands off actual policy refusals, the user answers multiple-choice questions; 0.22.0+), the
449
+ question to ask first and the ordered steps of both answers; `--json` gives them as a list with each step's `choices`.
389
450
 
390
451
  It is idempotent: a saved key that still works is kept (`--new-key` makes a new one). A saved key from an earlier
391
452
  `shard setup` (every tool but `computer`) is replaced with one that has every tool (0.15.1+); the old key keeps working
@@ -412,6 +473,7 @@ shard orgs workspaces [org] [--project P] [--state S] [--all] # every project'
412
473
  shard orgs deletion [org] # what deleting would do, and what blocks it
413
474
  shard orgs delete <org> --confirm <slug> --yes # irreversible (step-up)
414
475
  shard projects list | create <name> [--slug] [--use] | get <project> | use <project>
476
+ shard projects sync add | pause | remove <path> | list # projects kept ready for new conversations (0.22.0+)
415
477
  shard api-keys list | create <name> [--tool T]... [--read-only] [--expires 30d|90d|365d|never] [--save] | revoke <id|key_id> --yes
416
478
  shard members list | set-role <user|email> <owner|admin|member|billing> | remove <user|email> --yes
417
479
  shard invitations list | create <email> --role <role> | revoke <id|email> | accept '<link>' [--use]
@@ -422,6 +484,23 @@ shard templates publish <slug>@<version> | archive <slug>@<version>
422
484
  what it is on stderr; `--json` includes it as `secret`; `--save` stores it in the credentials file for
423
485
  the workspace commands instead of printing it. Revoking the saved key also removes it from the file.
424
486
 
487
+ In more than one organization (0.22.0+): workspace, agent and usage commands act where the API key belongs, account
488
+ commands where the default is. `orgs use` and `projects use` say when the key belongs to another organization and
489
+ name the command that makes one for the new default (`shard setup --org <org> --new-key`; in a terminal they offer to
490
+ run it). With a signed-in session, `whoami` distinguishes a saved default or key from an organization you left from
491
+ a key in another organization you still belong to. Warnings name `shard orgs use <org>` for a stale default and
492
+ `shard setup --org <org> --new-key` for the key. The switches preserve the key unless you accept the replacement
493
+ prompt. `SHARDFLUX_API_KEY` wins over the saved key: recovery saves the replacement, then you must unset the
494
+ environment variable to use it. `--json` carries the same `warnings` (`code`, `message`, `fix`); `setup --json`
495
+ also warns when the environment key still overrides its saved key. `shard usage --org <org>` reads any of your
496
+ organizations with your signed-in session.
497
+
498
+ For organization usage (0.22.0+), the summary, estimate and series keep using your project key in its own
499
+ organization. An explicit `--org <id|slug>` for another organization uses your session only when you are a member.
500
+ Without a session, sign in with `shard auth login`; to save a project key for that organization, then run
501
+ `shard setup --org <org> --new-key`. If `SHARDFLUX_API_KEY` is set, unset it after saving the new key so the saved
502
+ key takes effect. Workspace usage keeps the project key's authorization, and API errors stay errors.
503
+
425
504
  ## Billing (0.5.0+)
426
505
 
427
506
  ```sh
@@ -586,7 +665,7 @@ shows the status; `shard version --check` asks now (`--json`: `{"cli", "sdk", "u
586
665
  | `login`, `whoami` | Show the principal behind the project key (`SHARDFLUX_API_KEY`, else the saved one). |
587
666
  | `version [--check]` | Print the CLI and SDK versions and the update status (`--check` asks the API now). |
588
667
  | `usage [--org <id>] [--estimate \| --series \| --workspace <id\|key>] [--from T] [--to T] [--granularity hour\|day] [--meter M]` | Usage summary for the current period: plan, meters and allowances. `--estimate`: the bill so far and projected allowance use; `--series`: usage over time; `--workspace`: one workspace's usage over time (0.5.0+). The summary includes the [overage](#usage-and-overage) block (0.5.1+). |
589
- | `feedback [--category C] [--workspace W] [--request-id ID] [--error-code CODE] [--command TEXT] [--from-file F\|-] <message...>` | Send feedback straight to the Shardflux team (0.5.0+). See [Feedback](#feedback-agents-use-this-while-you-work). |
668
+ | `feedback [--yes] [--category C] [--workspace W] [--request-id ID] [--error-code CODE] [--command TEXT] [--from-file F\|-] <message...>` | Preview feedback; `--yes` sends after explicit user authorization (0.22.0+). See [Feedback](#feedback-preview-and-user-approval). |
590
669
  | `workspaces open <key> --template <slug> [--secret NAME]... [--input NAME=value]... [--input-file F] [--lifetime persistent\|session] [--mode processful\|file-first] [--cpu-millis N --memory-mib N --disk-gib N] [--allocation-mode fixed\|elastic] [--memory-held N] [--no-wait] [--timeout 5m] [--timing]` | Open by key. Creates the workspace on first use and reconnects or resumes it afterwards, never resetting it. Waits until it is ready (the template's start commands and services included) unless you pass `--no-wait`. `--secret` binds secret names (replacing the binding of an existing workspace). `--input` (0.4.0+) passes the template's text inputs (replacing those of an existing workspace); `--input-file` reads `NAME=value` lines or a JSON object. `--lifetime session`: the workspace is discarded when the session ends (`workspaces close` or the idle timeout), and the key then opens a new workspace. `--mode file-first` (0.5.0+) opens a [file-first workspace](#file-first-workspaces); the default is processful for a new key and the stored mode for an existing one. `--allocation-mode elastic` (0.8.0+): [elastic memory](#elastic-memory-080). |
591
670
  | `workspaces list [--state S] [--prefix P] [--lifetime persistent\|session\|any] [--purpose standard\|template_draft\|template_test\|any] [--include-deleted] [--all] [--limit N] [--cursor C]` | One page, or every page with `--all`. The next cursor is printed on stderr. By default only persistent standard workspaces are listed. A file-first workspace's state reads `running (file-first)` (0.5.0+). |
592
671
  | `workspaces get <id\|key>` | One workspace (deleted ones included), with the startup of its template's start commands and services (0.4.0+): a failed step shows its exit code, reason and output tail. Its mode, and a file-first workspace's tree revision (0.5.0+). Its memory (0.8.0+): `fixed 4096 MiB`, or `elastic: promised …, held …, plugged +… MiB`. The template version whose [immutable paths](#immutable-paths-080) it has mounted (0.8.0+): `immutable paths v3 (mounted read-only)`. |
@@ -1122,6 +1201,7 @@ For live progress events, use the SDK's `onProgress`.
1122
1201
  ```sh
1123
1202
  printf %s "$OPENAI_API_KEY" | shard secrets create OPENAI_API_KEY # value from standard input
1124
1203
  shard secrets create DATABASE_URL --from-file ./database-url.txt # or from a file
1204
+ shard secrets create GITHUB_TOKEN --ask # or typed in a page shard opens (0.22.0+)
1125
1205
  shard ws open acme/demo --template python-node-browser --secret OPENAI_API_KEY --secret DATABASE_URL
1126
1206
  shard ws exec acme/demo -- python3 agent.py # sees both as environment variables
1127
1207
  shard ws secrets acme/demo # names and status, never values
@@ -1149,7 +1229,9 @@ printf %s "$NEW_KEY" | shard secrets rotate OPENAI_API_KEY
1149
1229
  - **`--json`:** stdout carries the API's own objects:
1150
1230
  - `workspaces open`/`get` print the workspace view; `list` prints `{data, next_cursor}`.
1151
1231
  - Lifecycle commands print the operation; `fork` prints `{operation, workspace}`.
1152
- - `login`/`whoami` print `{api_url, organization_id, project_id, api_key:{id,key_id}, tool_permissions}`.
1232
+ - `login`/`whoami` print `{api_url, organization_id, project_id, api_key:{id,key_id}, tool_permissions}`; `whoami`
1233
+ adds `warnings` (`code`, `message`, `fix`) for a departed organization or a key in another accessible default
1234
+ organization (0.22.0+). Without a signed-in session, membership and default warnings are unavailable.
1153
1235
  - `exec` prints `{session_id, exit_code, term_signal, timed_out, canceled, stdout, stderr, truncated, reconnects}`.
1154
1236
  On a file-first workspace (0.5.0+), `exec` and `executions get` print the execution (see
1155
1237
  [File-first workspaces](#file-first-workspaces)).
@@ -1345,17 +1427,39 @@ Run `shard ./` in your project to start Claude Code or Codex, usable immediately
1345
1427
 
1346
1428
  New project folders are ready to use: `shard ./` and `shard agents new` initialize Git on `main` when needed and create an empty initial commit (CLI 0.14.2+). Existing files and staged work stay yours; the initial commit contains no files. Repositories without commits keep their current branch. If Git identity is missing, that one commit uses `Shardflux <noreply@shardflux.dev>` without changing your Git configuration.
1347
1429
 
1430
+ Machine saves require a machine source VM (`labels.shard_layer = "machine"`). On your computer, run
1431
+ `shard machine open --json`, make changes in that VM, then `shard machine save --wait`. The computer's CLI
1432
+ selects the machine VM; inside a VM, save uses that VM. A conversation or unmarked fork returns
1433
+ `filesystem_source_mismatch`: copy the intended files or repeat the install in the machine VM and save there.
1434
+ Project keys stay in their own project; a VM's native token cannot select another workspace.
1435
+
1348
1436
  Your **machine** carries credentials, tools, dotfiles, logins and agent config; the project's **template** carries
1349
1437
  toolchains, dependencies, services and project secrets. Both are private filesystem templates and include secrets
1350
1438
  as ordinary files. Browser logins and Claude/Codex config belong to the machine. Set up tools and secrets normally inside the VM;
1351
- your agent uses the same save/rollback commands there. An agent working from your computer builds the machine with
1439
+ your agent uses the matching machine or project save/rollback commands in its source VM. An agent working from your computer builds the machine with
1352
1440
  `shard machine open` (0.17.1+): it creates or resumes the machine VM without attaching and prints its key for
1353
1441
  `shard ws exec` and `shard files write`. `shard machine setup --from-this-computer` (0.20.0+) does it for you: your own
1354
1442
  Claude Code (`claude -p`, else Codex) recreates this computer's CLIs and tools, language runtimes, shell config and
1355
1443
  aliases, git identity and dotfiles on the machine, on your subscription, then saves it. On this computer it only reads;
1356
1444
  `~/.ssh`, keychains, `.env`, token and credential files are never read. The apps and the first run start it once,
1357
- right after you connect your agents. Every agent starts from both. Save or roll back with `shard machine save|rollback` and
1445
+ right after you connect your agents. `shard machine setup --status` shows the machine as your account has it, in the
1446
+ same line the apps show: ready, saving (with its place in the queue), or the one command to run next (0.22.0+); `shard
1447
+ setup --inspect --json` carries it as `onboarding.machine`. `connections_ready` (and the legacy `ready` field) means
1448
+ your account and an agent are connected; it does not mean tools from this computer carry over. `machine_ready`
1449
+ requires a ready saved version. The row names the version in use, a failed build's full error and recovery, or no
1450
+ saved version. An older API reports `unavailable`; a failed check reports `unknown`, with `version: null` when it
1451
+ could not be read. Conversations can start while the machine is not ready (0.22.0+).
1452
+ Setup checks the granted disk limit and available space before installing;
1453
+ tools that do not fit are reported as skipped. A failed agent-config copy, an explicit Claude tool permission refusal, an agent that
1454
+ never reaches the VM, or an absent setup report stops before saving (0.22.0+). A permission refusal is not retried
1455
+ through another agent. Setup never changes your plan or disk caps. Run the command
1456
+ again after resolving the reported refusal or limit.
1457
+ Every agent starts from the saved machine and project template when available. Save or roll back with `shard machine save|rollback` and
1358
1458
  `shard template save|rollback`; changed files reach running agents live, software at the next start.
1459
+ `shard template delete` (0.22.0+) starts a project over from your machine: its saved versions go, new conversations
1460
+ start from your machine until setup saves a new one, and VMs running on it keep their files. In a terminal it asks
1461
+ first; scripts and agents pass `--yes`. `shard template` says when a template nobody used for 30 days follows your
1462
+ machine on its next use (0.20.0+).
1359
1463
 
1360
1464
  Skills, commands, agents, output styles, memories and `CLAUDE.md` / `AGENTS.md` lines that Claude or Codex saves in a
1361
1465
  cloud conversation come back to this computer by themselves, seconds after the turn ends, and into your saved
@@ -1363,6 +1467,9 @@ machine too (0.20.0+). A file you changed here at the same time keeps your versi
1363
1467
  (`CLAUDE.cloud.md`); a deleted one goes to the Trash. Project memory follows the project both ways. The menu bar says
1364
1468
  what arrived in one line, and `agent-config-return.jsonl` in the config directory lists every change.
1365
1469
  `shard machine save --wait` and `shard template save --wait` return once the new version is ready (0.13.3+).
1470
+ A version larger than the plan's workspace disk names its size and the disk, with `retryable: false` and a hint: delete
1471
+ what the VM does not need, then save again, or move to a plan with a larger disk (`shard billing plans`); `--json`
1472
+ `details` carry `error_code`, `limit`, `value` and `actual` (0.22.0+).
1366
1473
  Software installed under the home goes into the saved image, linked back at the same path; the save line names those
1367
1474
  folders, and `--json` carries `moved_to_image` (0.18.0+).
1368
1475
  `shard ./ codex` (or `claude`; `--codex` and `--claude` also work, 0.14.4+) starts that agent directly; `shard agents targets <project>/<agent>` lists each
@@ -1402,22 +1509,30 @@ Volume lists and details (0.14.0+) show `kind`. Project spaces show their measur
1402
1509
 
1403
1510
  ### Claude and ChatGPT/Codex accounts (0.18.0+)
1404
1511
 
1405
- `shard agents accounts` lists your Claude and ChatGPT/Codex accounts with their plan, status, the account threads use
1406
- and how much of each usage window is left:
1512
+ `shard agents accounts` lists your Claude and ChatGPT/Codex accounts with their plan, status, which one is active
1513
+ (0.22.0+) and how much of each usage window is left:
1407
1514
 
1408
1515
  ```
1409
1516
  Claude
1410
- claude:1 marc@example.com (Max, in use) · Signed in
1517
+ claude:1 marc@example.com (Max, active) · Signed in
1411
1518
  5-hour 43% (resets in 2h 10m) · Weekly 18% (resets in 4d 8h)
1519
+ claude:2 ops@example.com (Team) · Signed in
1520
+ 5-hour 12% (resets in 4h 5m) · Weekly 9% (resets in 6d 2h)
1412
1521
  ChatGPT / Codex
1413
- codex:1 marc@example.com (Pro, in use) · Signed in
1522
+ codex:1 marc@example.com (Pro, active) · Signed in
1414
1523
  5-hour 12% (resets in 3h 30m) · Weekly 35% (resets in 4d 23h)
1524
+ Switch Claude: shard agents accounts use claude:<n>
1415
1525
  ```
1416
1526
 
1527
+ Each provider has one active account (0.22.0+). Its login is the one your conversations use: new conversations start
1528
+ with it and running ones switch to it. `shard agents accounts use claude:2` makes another account active; running
1529
+ Claude conversations continue on it and Remote Control turns back on by itself, and Codex Cloud moves to the active
1530
+ ChatGPT account. Organization owners and admins choose the active account: a team account, or their own personal one.
1531
+ Another member's personal account can be made active only by that member.
1532
+
1417
1533
  `shard agents accounts usage` shows every window as a bar. `shard agents accounts add claude` (or `codex`) signs in
1418
- another account in a cloud VM; `pbpaste | shard agents accounts add claude --api-key-stdin` adds an API key.
1419
- `shard agents accounts move claude:2 up` changes an account's place and `shard agents accounts remove claude:2`
1420
- removes it. `--json` prints the API's account list.
1534
+ another account in a cloud VM and `shard agents accounts remove claude:2` removes one. To remove someone else's active
1535
+ account, make another one active first; your own you can always remove. `--json` prints the API's account list.
1421
1536
 
1422
1537
  ## Conversations
1423
1538
 
@@ -1432,6 +1547,27 @@ Conversation JSON includes `join_mode` and the worktree used by reviewers and wo
1432
1547
 
1433
1548
  `shard conversations resume <id>` continues a saved conversation in a fresh VM under the same identity (0.14.0+). `shard ./ --resume` uses this same path. `shard conversations reader <project-id>` opens a small read-only workspace for saved branches and transcripts; the Mac transcript mirror opens it automatically when no project VM is live. Adaptive idle reclaims the reader.
1434
1549
 
1550
+ ### Starting from your working state (0.22.0+)
1551
+
1552
+ A new conversation starts from your worktree as it is: committed history, uncommitted edits, untracked files and your
1553
+ `.env` files. Its VM gets them from a project cache that every VM of the project shares, so a start sends only what the
1554
+ cache lacks: a second conversation on the same state sends nothing, and a one-file edit sends its delta. Parts travel
1555
+ in parallel and resume where they stopped. Large untracked images, audio and video land as files the conversation's
1556
+ Git ignores, as yours does, and large ones keep arriving after the agent has your prompt.
1557
+
1558
+ ### Prepared projects (0.22.0+)
1559
+
1560
+ ```sh
1561
+ shard projects sync add ~/code/web # keep this project ready for new conversations
1562
+ shard projects sync list # selected projects and their state
1563
+ shard projects sync pause ~/code/web # stop preparing it (remove: forget it)
1564
+ ```
1565
+
1566
+ The device helper (started by the menu bar or the Linux app) prepares each selected project in a short-lived VM: it
1567
+ puts the project's current state in the project cache, and when its dependency files change, installs them and saves
1568
+ the project template. Conversations then start without sending the project, with dependencies installed. Only the
1569
+ projects you add are prepared; onboarding and Settings → Projects in both desktop apps choose them too.
1570
+
1435
1571
  ### Menu bar conversation shortcut (0.15.0+)
1436
1572
 
1437
1573
  The macOS menu bar's **New conversation** action (menu bar 0.3.0+) opens the same launcher as **Option-Shift-Space**. It requires a task and project, remembers Claude/Codex, and invokes the commands below. Configure the hotkey in the macOS Settings window (⌘,), with conflict detection and a fallback.
@@ -1456,3 +1592,7 @@ New Codex conversations use `shard agents new --app codex --path <directory>` or
1456
1592
  `shard setup` uses your existing Codex ChatGPT login to register one executor for the account. Its small connector workspace stays resident and is billed as ordinary workspace memory/CPU usage, including while conversations wait. Use `--no-codex` to skip setup, `shard agents codex status` to inspect it, or `shard agents codex disable` to remove the executor and release its residency. Conversation VMs wake for tools and follow the normal adaptive idle policy afterwards.
1457
1593
 
1458
1594
  Explicit `agents new --in terminal`, `--in t3`, and `--like` launches keep their existing VM routes. Local Git is prepared and validated before Cloud enrollment. This branch's Cloud feature is awaiting release. Existing local-mode conversations keep their original route. Cloud uses OpenAI's model/configuration capabilities; local app-server plugins and settings are not automatically transferred.
1595
+
1596
+ Save progress (0.22.0+): Machine and template saves show source size and an estimated duration, then queued/build state and phase updates immediately. With `--json`, progress events go to stderr and the final stdout document includes `preflight` and `phases`. Failure and timeout output retain the latest counters and `details.last_progress`, with the build id and recovery action. If an older API cannot expose the build, JSON stderr emits `save_started` with the version/build id and leaves the phase unknown. Missing final host reports preserve the last observed progress.
1597
+
1598
+ Desktop launch cards (0.22.0+): the bundled desktop apps clear and close the launcher on submission, then show each pending start in a layered card stack near the top of the display. **Show all launches** expands individual statuses and recovery.
@@ -206,8 +206,8 @@ export const ACCOUNT_COMMANDS = [
206
206
  activity: { type: 'boolean', description: 'With --inspect: the current commands, listening ports, sudo installs and browser window of --workspace, without waking it.' },
207
207
  workspace: { type: 'string', value: '<key|conv_id>', description: 'The workspace or conversation to inspect for live onboarding activity.' },
208
208
  inspect: { type: 'boolean', description: 'Report the onboarding steps and verify every connection live (account, Claude, Codex) without changing anything.' },
209
- apps: { type: 'string', multiple: true, value: '<claude,codex>', description: 'The apps to verify (default: the ones found on this Mac). Repeatable or comma separated.' },
210
- connect: { type: 'boolean', description: 'With --inspect: also copy this Mac’s Codex login and enable the account’s Codex remote device when Codex is picked.' },
209
+ apps: { type: 'string', multiple: true, value: '<claude,codex>', description: 'The apps to verify (default: the ones found on this computer). Repeatable or comma separated.' },
210
+ connect: { type: 'boolean', description: 'With --inspect: also copy this computer’s Codex login and enable the account’s Codex remote device when Codex is picked.' },
211
211
  'retry-codex': { type: 'boolean', description: 'With --inspect --connect: start a Codex remote device that failed or is stuck starting again, once.' },
212
212
  't3-connect': { type: 'boolean', description: 'With --inspect: start your T3 Connect sign-in for T3 Code (0.0.45, over SSH); the t3 row carries its page and code (t3_link). After it, your projects appear in T3 Code and the T3 app (0.19.0+).' },
213
213
  'org-name': { type: 'string', value: '<name>', description: 'Name of the organization to create when you have none.' },
@@ -269,6 +269,11 @@ export const ACCOUNT_COMMANDS = [
269
269
  options: { confirm: { type: 'string', value: '<slug>', description: 'The organization’s slug, typed out (required).' }, ...YES('the deletion') },
270
270
  },
271
271
  { path: ['projects', 'list'], summary: 'List the organization’s projects (* marks the default)', positionals: [], options: { ...ORG } },
272
+ { path: ['projects', 'sync', 'list'], summary: 'Show selected local projects and their preparation state', positionals: [], options: {} },
273
+ { path: ['projects', 'sync', 'add'], summary: 'Prepare and keep this selected local project synced', positionals: [{ name: 'path', required: true }], options: { wait: { type: 'boolean', description: 'Prepare now and wait for its published environment; otherwise the device helper prepares it in the background.' } } },
274
+ { path: ['projects', 'sync', 'pause'], summary: 'Pause background preparation of this local project', positionals: [{ name: 'path', required: true }], options: {} },
275
+ { path: ['projects', 'sync', 'remove'], summary: 'Remove this local project from background preparation', positionals: [{ name: 'path', required: true }], options: {} },
276
+ { path: ['projects', 'sync', 'run'], summary: 'Run selected-project preparation in the background', positionals: [], options: {}, hidden: true },
272
277
  {
273
278
  path: ['projects', 'create'],
274
279
  summary: 'Create a project (owners and admins)',