@shardflux/cli 0.28.0 → 0.28.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 (46) hide show
  1. package/CHANGELOG.md +54 -17
  2. package/README.md +91 -12
  3. package/dist/account-commands.d.ts +2 -4
  4. package/dist/account-commands.js +2 -6
  5. package/dist/agent-git-commands.d.ts +1 -2
  6. package/dist/agent-git-commands.js +2 -21
  7. package/dist/agent-setup.d.ts +4 -2
  8. package/dist/agent-setup.js +6 -4
  9. package/dist/agent-shell.d.ts +2 -0
  10. package/dist/agent-shell.js +5 -0
  11. package/dist/args.d.ts +1 -1
  12. package/dist/args.js +5 -1
  13. package/dist/board-args.js +7 -0
  14. package/dist/board-commands.d.ts +1 -1
  15. package/dist/board-commands.js +46 -6
  16. package/dist/cli-proxy.d.ts +1 -13
  17. package/dist/cli-proxy.js +2 -27
  18. package/dist/codex-cloud.js +3 -1
  19. package/dist/commands.d.ts +12 -0
  20. package/dist/commands.js +121 -4
  21. package/dist/conversations.d.ts +2 -0
  22. package/dist/conversations.js +1 -1
  23. package/dist/device-bridge.d.ts +4 -1
  24. package/dist/device-bridge.js +9 -2
  25. package/dist/device-folders.d.ts +2 -1
  26. package/dist/device-folders.js +3 -3
  27. package/dist/format.js +3 -0
  28. package/dist/forwarder-refresh.d.ts +15 -0
  29. package/dist/forwarder-refresh.js +32 -0
  30. package/dist/handler-loader.d.ts +3 -0
  31. package/dist/handler-loader.js +43 -0
  32. package/dist/land.d.ts +1 -1
  33. package/dist/land.js +6 -5
  34. package/dist/linux-helper.js +1 -2
  35. package/dist/machine-setup-guard.d.ts +9 -0
  36. package/dist/machine-setup-guard.js +22 -0
  37. package/dist/machine-setup.d.ts +1 -8
  38. package/dist/machine-setup.js +2 -22
  39. package/dist/main.js +17 -16
  40. package/dist/orchestrator-commands.js +1 -3
  41. package/dist/startup-housekeeping.d.ts +5 -0
  42. package/dist/startup-housekeeping.js +30 -0
  43. package/dist/t3-provider.js +4 -2
  44. package/dist/worktree-twin-engine.d.ts +1 -1
  45. package/dist/worktree-twin-engine.js +9 -6
  46. package/package.json +12 -7
package/CHANGELOG.md CHANGED
@@ -2,6 +2,43 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ - The Shardflux app 0.9.3 (0.28.2+): `shard` installs and updates `@shardflux/desktop-darwin-arm64` / `-x64` and
6
+ `@shardflux/desktop-linux-x64` / `-arm64` 0.9.3 (files open beside your work, pictures and videos picture in picture,
7
+ ⌘2 shows the agents your orchestrator starts, needs-you questions read whole).
8
+
9
+ - Agent credentials (0.28.2+, SDK 0.30.2): environment credential questions can be answered with `shard needs-you answer acred_ID --credential --ask` (or stdin / `--from-file`), with scope chosen before the write. Scope flags preserve organization and thread identity; workspace-only permission flags are rejected for agent credentials.
10
+
11
+ - Agent credential scopes (0.28.2+): `shard secrets create NAME --scope agents --org ORG --ask` adds a credential for all your agents; use `--scope project --project PROJECT` or `--scope conversation --conversation CONVERSATION` for a local override. Import, list, get, update, rotate, versions, access-log and delete accept the same scope. Values use the secure page, stdin, or `--from-file` and never command arguments.
12
+ - Conversation origin (0.28.2+, SDK 0.30.2): conversation starts stay compatible with older APIs: send launching-conversation provenance only after `/v1/meta` advertises `capabilities.conversation_origin: true`; no create fallback retry.
13
+
14
+ - Question explanations (0.28.2+, SDK 0.30.2): needs-you output prints each question and its optional `option_details` in full, including what each choice does and what follows it.
15
+
16
+ - Launch attribution (0.28.2+, SDK 0.30.2): preserve the requesting orchestrator thread when `project_link` starts work in a laptop folder. API and guest title sources strip pasted-content/image transport markers, so `shard agents list` shows the request text. Tasks delete their workers and spawned descendants along with their computers.
17
+
18
+ - The Shardflux app 0.9.2 (0.28.1+): `shard` installs and updates `@shardflux/desktop-darwin-arm64` / `-x64` and
19
+ `@shardflux/desktop-linux-x64` / `-arm64` 0.9.2 (Stop in ⌘1, organization choice at the first sign-in, Sign in after
20
+ signing out).
21
+
22
+ - Return the coding-agent setup guide without loading the account command handlers.
23
+
24
+ - Manual landing uses the result’s own ready computer or the persistent project reader, so deleting an unrelated thread does not interrupt it.
25
+
26
+ - Check T3 presence directly during startup, avoiding unrelated desktop-app probes before every command.
27
+
28
+ - Orchestrator inputs preserve long pastes, including their final instruction, without an application character cap. `shard orchestrator say` sends the full text to the API.
29
+
30
+ - Land a finished conversation in its own repository's linked folder when a project holds several repositories.
31
+ Preserve the hub's default branch when it belongs to another repository.
32
+
33
+ - Load only the selected command and skip optional setup modules when their local state is absent.
34
+
35
+
36
+ - Load interactive command surfaces on demand, keeping help/version and simple commands fast while preserving command parsing, saved-work housekeeping, setup guards and install registration.
37
+
38
+ - Codex Cloud admission (0.28.1+, SDK 0.30.1): a stopped startup/open reports its stored reason and recovery instruction immediately (`codex_admission_stopped`), instead of calling it pending or pointing only at connector status.
39
+
40
+ - Stored-file recovery (0.28.1+): workspace views show when files are saved for recovery; resume restarts the workspace from those files.
41
+
5
42
  - `shard orchestrator say` (0.28.0+, SDK 0.30.0): every input waits its turn in order,
6
43
  however many wait (no more 429), and one of your orchestrator's threads hears each input at once, all in parallel: a
7
44
  follow-up reaches the thread of the request it is about (the input reads merged), the row you point at reaches the
@@ -17,22 +54,22 @@
17
54
  - Restore an orchestrator input (0.28.0+, SDK 0.30.0): `shard orchestrator restore <input-id>` brings an input you
18
55
  dismissed back into `shard orchestrator list` on every device and prints `Restored: <your words>` (`--json`:
19
56
  `{input}`). Restoring an input that is not dismissed changes nothing.
20
- - Orchestrator answer media (0.27.0+, SDK 0.29.0): `shard orchestrator say --wait` prints a line for each picture,
57
+ - Orchestrator answer media (0.28.0+, SDK 0.29.0): `shard orchestrator say --wait` prints a line for each picture,
21
58
  video or file the answer shows, after its points: ` media: loss-curve.png (image, 1200×800, 84.0 KB)` (the size in
22
59
  pixels once measured). `--json` adds the answer's `media`; `shard drive get <file.path> --sha256 <file.sha256>` reads
23
60
  one.
24
61
 
25
- - Orchestrator report cards (0.27.0+, SDK 0.29.0): `shard orchestrator say --wait` prints an answer the orchestrator
62
+ - Orchestrator report cards (0.28.0+, SDK 0.29.0): `shard orchestrator say --wait` prints an answer the orchestrator
26
63
  wrote as a report as its verdict, then its points under their group headings, one line each:
27
64
  `- Loss is down to 1.84: from 2.31 at step 5,000 (14:02)`, the time short and in this computer's local time; a point
28
65
  written without a lead prints its words. Every point, source and follow-up prints whole, however long. An answer
29
66
  written as facts prints its facts as before. `--json` adds the answer's `points`.
30
67
 
31
- - Board content at any length (0.27.0+, SDK 0.29.0): `shard task show` prints a task's title, its plan steps and each
68
+ - Board content at any length (0.28.0+, SDK 0.29.0): `shard task show` prints a task's title, its plan steps and each
32
69
  report's title and outcome whole, however long the agent wrote them (the terminal wraps them); `shard task edit
33
70
  --title` takes a title of any length.
34
71
 
35
- - Your brain (0.27.0+, SDK 0.29.0): `shard brain ls [prefix]` lists your brain's files (size, saved time, type and
72
+ - Your brain (0.28.0+, SDK 0.29.0): `shard brain ls [prefix]` lists your brain's files (size, saved time, type and
36
73
  path; `--all`, `--limit`, `--cursor`; `--json` adds `next_cursor` and the brain's `version`) and `shard brain get
37
74
  <path>` writes a file's bytes to standard output, to a file with `-o`, or as `--json` (`--sha256` reads exactly that
38
75
  version). Your brain is your archive in an organization, kept by your orchestrator: its published answers as
@@ -58,18 +95,18 @@
58
95
  the one that branch holds, or two of its workers were), with what to do instead; nothing moves on the project hub or
59
96
  in your folder. It was a Git error ("refusing to merge unrelated histories") that read as if trying again could help.
60
97
 
61
- - Auto land switch (0.27.0+): `shard settings --auto-land on|off` turns automatic landing on or off for every project
98
+ - Auto land switch (0.28.0+): `shard settings --auto-land on|off` turns automatic landing on or off for every project
62
99
  on this computer (on by default). Off, the live twin lands no conversation and new conversations start from your
63
100
  HEAD; `shard task land` and `shard conversations land` still land on request. `shard settings` shows it and `--json`
64
101
  adds `auto_land`. The Shardflux app reads the same switch to land finished board tasks with no click.
65
102
 
66
- - Message delivery (0.27.0+, SDK 0.29.0): `shard conversations send` reaches a working agent in its running turn
103
+ - Message delivery (0.28.0+, SDK 0.29.0): `shard conversations send` reaches a working agent in its running turn
67
104
  (Claude Code, Codex and Codex Cloud) and starts an idle one's next turn; its help says so instead of "next turn".
68
105
  `--wait` waits up to 60 s and prints what happened: `Steered into the running turn.`, `Started the next turn.` or
69
106
  `Not delivered yet.` (`Delivery not confirmed yet: …` when Codex Cloud has not confirmed it); `--json` adds
70
107
  `delivery`. Without `--wait` the output stays `Message sent (<seq>).`
71
108
 
72
- - One Shardflux app (0.27.0+): `shard` installs and updates the one desktop app (menu bar or tray, onboarding,
109
+ - One Shardflux app (0.28.0+): `shard` installs and updates the one desktop app (menu bar or tray, onboarding,
73
110
  launcher, conversations with their computers, device approvals, one Settings window) from
74
111
  `@shardflux/desktop-darwin-arm64` / `-x64` 0.9.0 on macOS (replacing `@shardflux/menubar-darwin`) and from
75
112
  `@shardflux/desktop-linux-x64` / `-arm64` 0.9.0 on Linux (replacing the GTK tray app), at the same places as before
@@ -84,31 +121,31 @@
84
121
  executable behind the app's launcher and names each library the computer is missing.
85
122
  - 0.27.0 includes the changes prepared as 0.26.0 (not released on its own): the entries marked 0.27.0 below.
86
123
 
87
- - Device registration (0.27.0+): isolate each project, back off transient failures and stop after eight attempts with
124
+ - Device registration (0.28.0+): isolate each project, back off transient failures and stop after eight attempts with
88
125
  an actionable needs-attention message. A device id another sign-in registered (the API key `shard setup` replaced,
89
126
  or another account) is replaced by a new one (at most once every 10 minutes), with one line in the helper's log, and every project
90
127
  registers again at once, so your agents reach this computer without a restart. The old id is kept in
91
128
  `device-id-history.json`.
92
- - Your agents on this computer (0.27.0+): `shard device approvals auto|read|ask` chooses how this computer answers
129
+ - Your agents on this computer (0.28.0+): `shard device approvals auto|read|ask` chooses how this computer answers
93
130
  your own agents: `auto` runs everything they ask without asking, `read` runs folder listings and files copied to a
94
131
  conversation and asks before anything else (commands, files saved here, ports, linking a folder), `ask` asks every
95
132
  time. The first request asks for the choice (the Shardflux app's prompt; without the app, `shard` prints the two
96
133
  commands once) and runs under the mode chosen. A teammate's request always asks. What ran without asking is listed
97
134
  by `shard device approvals` (`--json`: `recent`) and the app's Settings. Approvals carry `choose_mode: true` while
98
135
  nothing is chosen.
99
- - First prompts (0.27.0+): a Codex Cloud start queues its initial prompt while the executor prepares. Resuming an accepted start uses the same prompt key; an unconfirmed send keeps its created conversation.
136
+ - First prompts (0.28.0+): a Codex Cloud start queues its initial prompt while the executor prepares. Resuming an accepted start uses the same prompt key; an unconfirmed send keeps its created conversation.
100
137
 
101
- - Device helper (0.27.0+): a command your orchestrator asks your computer to run (a home conversation, so no folder of
138
+ - Device helper (0.28.0+): a command your orchestrator asks your computer to run (a home conversation, so no folder of
102
139
  it on this computer) asks you once with the exact command and folder ("Run on your Mac: sh -c tail -n 5 train.log ·
103
140
  in ~/code/lm-train"), Allow once or Deny, and runs in your home folder or the ~/ folder it names. A request whose
104
141
  conversation has no folder on this computer is refused with the reason instead of staying pending.
105
- - Filesystem recovery (0.27.0+): resume JSON/timing keeps `cold_boot_reason: guest_filesystem`; the existing note reports restarted processes. Ships with SDK 0.29.0.
142
+ - Filesystem recovery (0.28.0+): resume JSON/timing keeps `cold_boot_reason: guest_filesystem`; the existing note reports restarted processes. Ships with SDK 0.29.0.
106
143
 
107
- - Admission queue waits (0.27.0+, SDK 0.29.0): workspace opens retry `429 admission_queued` within the admission timeout with the same body/key, honor full `Retry-After`, and display `queued for admission; retrying in 2 s` while waiting.
144
+ - Admission queue waits (0.28.0+, SDK 0.29.0): workspace opens retry `429 admission_queued` within the admission timeout with the same body/key, honor full `Retry-After`, and display `queued for admission; retrying in 2 s` while waiting.
108
145
  - 0.27.0: workspace disk caps report the admitted and acknowledged size. Completed disk grows refresh the disk grant; resize results retain the original request.
109
146
 
110
147
 
111
- - `shard orchestrator` (0.27.0+, SDK 0.29.0): your orchestrator agent from a terminal. `shard orchestrator say <words>`
148
+ - `shard orchestrator` (0.28.0+, SDK 0.29.0): your orchestrator agent from a terminal. `shard orchestrator say <words>`
112
149
  sends your exact words (`--task`, `--report`, `--needs-you`, `--input`, `--conversation` point at a row) and prints
113
150
  the input id and its place in line; every input is handled in parallel by its own thread. `--wait` follows it until
114
151
  it is done, merged, failed or waiting and prints its curated result: the answer's headline and facts with their
@@ -118,13 +155,13 @@
118
155
  <input-id>` sends a failed one again and `shard orchestrator dismiss <input-id>` takes one out of the list. Signed in
119
156
  they reach your orchestrator; with `SHARDFLUX_API_KEY`, the orchestrator of the person who created the key. `--json`
120
157
  prints `{input}` / `{inputs, cursor}`.
121
- - `shard needs-you` (0.27.0+, SDK 0.29.0) lists your orchestrator's questions (`oq_…`, answered with `--text`) and what
158
+ - `shard needs-you` (0.28.0+, SDK 0.29.0) lists your orchestrator's questions (`oq_…`, answered with `--text`) and what
122
159
  it asked your computer while it was offline (`dev_…`, "Waiting for your computer: list ~/code"; `shard needs-you
123
160
  answer dev_… cancel` drops it).
124
161
  - Deprecated (0.27.0): `shard route` (POST /v1/router) and `shard ask` (POST /v1/questions); use the orchestrator
125
162
  instead (`shard orchestrator say`). Each prints a one-line notice on stderr.
126
163
 
127
- - `shard agents models` (0.27.0+): the models each active account can use, as Claude and ChatGPT list them for that
164
+ - `shard agents models` (0.28.0+): the models each active account can use, as Claude and ChatGPT list them for that
128
165
  account (asked server side the way Claude Code and Codex fill their pickers; never starts a computer): effort levels
129
166
  with the default starred, the default model, and unavailable models with the provider's reason. `--account <ref>`,
130
167
  `--provider`, `--all`, `--refresh`; `--json` prints the API answer. `--model` on `shard agents new` (and `shard ./`)
@@ -140,7 +177,7 @@
140
177
  - `shard transcribe <file>` (0.25.0+, SDK 0.28.0) prints what a recording says (WebM/Opus or PCM WAV from the file;
141
178
  raw PCM with `--format pcm16 --sample-rate`); `--words` adds each word's start and end, `--json` prints the
142
179
  transcript. Where cloud transcription is not on for the organization it says so in one line
143
- (`cloud_transcription_off`) and exits 1 (0.27.0+, SDK 0.29.0).
180
+ (`cloud_transcription_off`) and exits 1 (0.28.0+, SDK 0.29.0).
144
181
  - Faster conversation starts (0.24.1): the project's dependency fingerprint is read from Git's own file list instead of walking the whole folder, so ignored and untracked trees beside the project (agent worktrees, build output) no longer hold a start on **Getting your project…**. A folder with 1.2 million such files took 32 s per start; it now takes 0.3 s, with the same fingerprint.
145
182
  - A folder without Git that `shard` makes a repository of (a first chat, `shard projects link`) starts with its files as
146
183
  the first commit (0.25.0+; `.gitignore` respected, large media stay untracked), so a conversation starts from the
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @shardflux/cli: `shard`
2
2
 
3
+ Use `shard --help` or `shard <command> --help` to explore commands before signing in.
4
+
3
5
  For error codes, retry timing, and plan recovery, see the [error reference](https://docs.shardflux.dev/reference/errors).
4
6
 
5
7
  Historical template file lists: reads queue checksum-verified reconstruction when a cold list is absent from the SQL cache. TypeScript SDK 0.27.0+ / Python 0.23.0+ wait full Retry-After for retryable API 409 file_list_indexing on GET/HEAD within the admission timeout. Template objects and version history stay available.
@@ -32,6 +34,12 @@ an explicit selection keeps the default credentials and target status. An approv
32
34
 
33
35
  Filesystem recovery timing (0.28.0+): cold resume output identifies `guest_filesystem` in JSON and the restart notice. See the [workspace lifecycle](https://docs.shardflux.dev/concepts/lifecycle) for retained files and process restart semantics.
34
36
 
37
+ ## Agent credentials (0.28.2+)
38
+
39
+ Answer a credential question with `shard needs-you answer acred_ID --credential --ask --scope project`. The value goes to the write-only answer field and the asking agent receives an availability message.
40
+
41
+ `shard secrets create NAME --scope agents --org ORG --ask` adds a credential for all your agents; use `--scope project --project PROJECT` or `--scope conversation --conversation CONVERSATION` for a local override. Import, list, get, update, rotate, versions, access-log and delete accept the same scope. Values use the secure page, stdin, or `--from-file` and never command arguments.
42
+
35
43
  ## Support and bug reports
36
44
 
37
45
  [Report a bug](https://github.com/shardfluxdev/community/issues/new?template=bug_report.yml) or
@@ -127,8 +135,8 @@ Model choices come from your cloud agent's session and use the same coding tools
127
135
  Project files synchronize before each message and before its completion (0.22.0+): review remote edits in T3’s
128
136
  Changes panel and checkpoints, and send local edits to the next turn. Conflicting versions are retained with
129
137
  a `.shard-conflict-<agent>` suffix. Sync runs between turns; an idle T3 thread needs no file watcher.
130
- The provider is registered automatically when T3 Code is installed, on macOS and on Linux from its .deb or AppImage
131
- (0.17.0+). Choose **Sign in** on its card in T3's provider settings: T3 runs `shard acp --login` in its own terminal,
138
+ At command startup, Shardflux checks for T3 Code and registers the provider automatically on macOS and on Linux
139
+ from its .deb or AppImage (0.17.0+). Choose **Sign in** on its card in T3's provider settings: T3 runs `shard acp --login` in its own terminal,
132
140
  which creates or signs in to your account (with this computer's Codex login, or your email) and connects Claude Code
133
141
  and Codex, skipping every step that is already done (0.15.0+). Editors that launch agents from the ACP registry
134
142
  run the same sign-in as `shard --login` (0.22.0+).
@@ -305,6 +313,11 @@ shard conversations landing # auto (default), pr or off for this proj
305
313
  shard conversations landing backups # then: shard conversations landing restore <backup>
306
314
  ```
307
315
 
316
+ To land a finished conversation manually, run `shard conversations land <id> merge`. In a project with several
317
+ repositories it chooses a linked folder of that conversation's repository; the hub's default branch for another
318
+ repository stays where it is. `--path <folder>` chooses the destination explicitly. From 0.28.1, manual landing
319
+ uses the result’s own ready computer or the project reader, so deleting an unrelated thread does not interrupt it.
320
+
308
321
  For application workspace commands, `shard signup` creates an account and saves a project key, or set
309
322
  `SHARDFLUX_API_KEY` to a key from the console and run `shard login`. `shard --help` lists every command.
310
323
 
@@ -735,8 +748,10 @@ shows the status; `shard version --check` asks now (`--json`: `{"cli", "sdk", "u
735
748
  | `version [--check]` | Print the CLI and SDK versions and the update status (`--check` asks the API now). |
736
749
  | `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+). |
737
750
  | `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). |
738
- | `orchestrator say [--wait [--timeout D]] [--task ID\|--report ID\|--needs-you ID\|--input ID\|--conversation ID] <words...>`, `orchestrator list [--all]`, `orchestrator retry\|dismiss <input-id>` | Your orchestrator (0.28.0+): say something and every input is handled at once by its own thread; `--wait` prints its curated result. See [Your orchestrator](#your-orchestrator-0270). |
751
+ | `orchestrator say [--wait [--timeout D]] [--task ID\|--report ID\|--needs-you ID\|--input ID\|--conversation ID] <words...>`, `orchestrator list [--all]`, `orchestrator retry\|dismiss\|restore <input-id>` | Your orchestrator (0.28.0+): say something and every input is handled at once by its own thread; `--wait` prints its curated result. See [Your orchestrator](#your-orchestrator-0280). |
752
+ | `brain ls [prefix] [--org O] [--all] [--limit N] [--cursor C]`, `brain get <path> [--org O] [--sha256 HEX] [-o FILE]` | Your brain (0.28.0+): your orchestrator's answers, reports and notes, read from any device. See [Your brain](#your-brain-0280). |
739
753
  | `route [--task ID] [--org O] [--project P] <text...>`, `ask [--task ID] [--org O] [--project P] <question...>` | Deprecated; use `shard orchestrator say`. The board's input bar (0.25.0+): where a line of input goes, and a quick question about your work. |
754
+ | `conversations archive\|unarchive\|seen <id...>` (`c archive`) | Your inbox, the same on every device (0.28.0+): archive conversations, bring them back, or mark them seen. `--json` prints `{data, skipped}`. See [Conversations](#conversations). |
740
755
  | `conversations delete <id> --yes` (`c delete`) | Delete a conversation everywhere at once (0.25.0+): its agent stops, its computer is deleted, and its messages, transcript and branch go with it. `--json` prints `{id, deleted, deleted_at, operation}`. See [Conversations](#conversations). |
741
756
  | `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). |
742
757
  | `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+). |
@@ -1626,6 +1641,8 @@ hour), and `--json` prints the API's answer. Pass an id to `shard agents new --m
1626
1641
 
1627
1642
  ## Conversations
1628
1643
 
1644
+ When an orchestrator starts work through a device project link (0.28.2+), the new conversation carries its requesting thread through to the API. `shard agents list --json` retains the orchestrator conversation and known input IDs.
1645
+
1629
1646
  From 0.14.0, `shard conversations list|get|send|wait|land|move` manages project conversations. `shard c` is the short form. Conversations retain their branch and transcript as their VM binding changes.
1630
1647
 
1631
1648
  Watch an agent work: `shard conversations watch <id>` shows the conversation's terminal live, read-only. It starts
@@ -1671,6 +1688,24 @@ Conversation JSON includes `join_mode` and the worktree used by reviewers and wo
1671
1688
 
1672
1689
  `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.
1673
1690
 
1691
+ Your inbox is the same on every device (0.28.0+): `shard conversations archive <id...>` archives conversations from
1692
+ your own inbox, `shard conversations unarchive <id...>` brings them back, and `shard conversations seen <id...>` records
1693
+ that you opened them now, so a result that finished before then is no longer new to you in the Shardflux app or any
1694
+ other client. Name one conversation or many in one command. Only your view changes: the conversations, their agents
1695
+ and computers carry on, and everyone else keeps their own inbox. `--json` prints the API's answer, `{data, skipped}`:
1696
+ the conversations with your `seen_at` and `dismissed_at`, and the ids not found. `shard c get --json` and
1697
+ `shard c list --json` carry the same two fields.
1698
+
1699
+ ```sh
1700
+ shard c archive conv_k3m5q7s2u4w6y3b5d7f2h4j6ln conv_a7k2m4q6s3t5v7x2z4b6d3f5h7
1701
+ # Archived conv_k3m5q7s2u4w6y3b5d7f2h4j6ln Fix login
1702
+ # Archived conv_a7k2m4q6s3t5v7x2z4b6d3f5h7 Upgrade the test runner
1703
+ shard c unarchive conv_a7k2m4q6s3t5v7x2z4b6d3f5h7
1704
+ # Unarchived conv_a7k2m4q6s3t5v7x2z4b6d3f5h7 Upgrade the test runner
1705
+ shard c seen conv_k3m5q7s2u4w6y3b5d7f2h4j6ln
1706
+ # Marked seen conv_k3m5q7s2u4w6y3b5d7f2h4j6ln Fix login
1707
+ ```
1708
+
1674
1709
  `shard conversations delete <id> --yes` (0.25.0+) deletes a conversation everywhere at once: its agent stops, its
1675
1710
  computer is deleted (a computer other conversations share stays for them), and its messages, transcript and branch go
1676
1711
  with it, on every device. From then on it leaves every list and reads not found; `shard c feed` shows it once as
@@ -1684,6 +1719,8 @@ shard c delete conv_k3m5q7s2u4w6y3b5d7f2h4j6ln --yes
1684
1719
 
1685
1720
  ### Your orchestrator (0.28.0+)
1686
1721
 
1722
+ `shard orchestrator say` passes your words to the API as one input, without cutting the final instruction.
1723
+
1687
1724
  Your orchestrator is your own agent on top of every project, on its own Shardflux computer and the same on every
1688
1725
  device. `shard orchestrator say` sends it your exact words and answers at once with the input and its place in line;
1689
1726
  every input is handled in parallel by its own thread, which answers it, puts tasks on the board, asks you something or
@@ -1691,25 +1728,33 @@ adds it to an input in flight. `--wait` follows it and prints what it became:
1691
1728
 
1692
1729
  ```sh
1693
1730
  shard orchestrator say --wait Lets check on our language model training progress
1694
- # Training is 73% done, step 7,300 of 10,000
1695
- # - Loss 1.84, down from 2.31 at step 5,000
1696
- # - About 2 h 10 min left at this pace
1697
- # - Last checkpoint at step 7,000
1731
+ # Training is 73% done, on pace to finish at 16:40
1732
+ # Moved
1733
+ # - Loss is down to 1.84: from 2.31 at step 5,000 (14:02)
1734
+ # - Checkpoint saved: at step 7,000
1735
+ # Still open
1736
+ # - Eval has not run: it starts after the last checkpoint
1737
+ # media: loss-curve.png (image, 1200×800, 84.0 KB)
1698
1738
  # Sources: train.log (~/code/lm-train/train.log), wandb.ai (https://wandb.ai/acme/lm)
1699
1739
  # Follow-ups: Check again in an hour
1700
1740
  shard orchestrator say --task task_h7g4d7tqyv2pz3a2npyo4rpgzq use postgres instead
1701
1741
  # in_q3vd5k2xbnwjm7e4rtyhcu6aio queued (1 in line)
1702
1742
  shard orchestrator list
1703
1743
  # in_q3vd5k2xbnwjm7e4rtyhcu6aio working use postgres instead
1704
- # in_7wcx227ovjpei4u6i47llu7w4i done Lets check on our language model training progress Training is 73% done, step 7,300 of 10,000
1744
+ # in_7wcx227ovjpei4u6i47llu7w4i done Lets check on our language model training progress Training is 73% done, on pace to finish at 16:40
1705
1745
  ```
1706
1746
 
1707
- `--task`, `--report`, `--needs-you`, `--input` and `--conversation` point at the row your words are about. `--wait`
1708
- stops when the input is done (its answer card and the tasks it created), merged (the input it was added to), waiting
1747
+ The answer card is the verdict, then its points under the headings the orchestrator chose (a point's time in your
1748
+ local time; an answer written as plain facts prints its facts), then a media line for each picture, video or file it
1749
+ shows (an image with its width×height once measured). Each is a file on the project drive: `--json` has its
1750
+ `file.path` and `file.sha256`, and `shard drive get <path> --sha256 <sha256> -o <file>` saves it. `--task`, `--report`, `--needs-you`, `--input`
1751
+ and `--conversation` point at the row your words are about. `--wait` stops when the input is done (its answer card and
1752
+ the tasks it created), merged (the input it was added to), waiting
1709
1753
  (the line it waits on; a question names the `shard needs-you answer oq_… --text <answer>` that answers it) or failed
1710
1754
  (exit 6; `shard orchestrator retry <input-id>` sends it again); `--timeout` (default 10m) stops following with exit 5
1711
1755
  while the input goes on. `shard orchestrator list` shows your recent inputs newest first (`--all` adds the ones you
1712
- dismissed with `shard orchestrator dismiss`). Signed in, they reach your orchestrator (`--org <id|slug>` when you belong
1756
+ dismissed with `shard orchestrator dismiss`); `shard orchestrator restore <input-id>` (0.28.0+) brings one back on every
1757
+ device. Signed in, they reach your orchestrator (`--org <id|slug>` when you belong
1713
1758
  to several); with `SHARDFLUX_API_KEY` set, the orchestrator of the person who created that key. `--json` prints the
1714
1759
  API's objects (`{input}`, `{inputs, cursor}`).
1715
1760
 
@@ -1870,7 +1915,7 @@ shard board --follow # each change as it happens,
1870
1915
  changes the words (`--text`, and the task's master hears it), the title (`--title`), the bucket (`--now`, `--next`,
1871
1916
  `--later`) and the order (`--first`, `--after`), keeps an agent's suggestion as your own (`--keep`) or clears the task
1872
1917
  (`--clear`; `--no-clear` brings it back). `shard task steer <id> <words...>` sends steering words to the task's master,
1873
- `shard task rm <id>` deletes the task, and `shard task clear-done` clears every finished one. `shard task show <id>`
1918
+ `shard task rm <id>` deletes the task, every nested follow-up, and their owned conversation trees and computers; masters shared by other tasks stay. `shard task clear-done` clears every finished one. `shard task show <id>`
1874
1919
  prints the task, its plan and each report: milestone, outcome and evidence (`tests 12/12 (pnpm test)`).
1875
1920
  `shard task land <id>` lands a finished task: its result (the branch `shard/<task id>`, where its master merged its
1876
1921
  workers' branches) goes into the project's default branch and into your folder on this computer the way finished
@@ -1977,6 +2022,32 @@ shard drive rm tasks/t_ab12/notes.md
1977
2022
  - The drive is the API key's project, or `--project <id>`. Signed in (`shard auth login`), `--project` takes any of
1978
2023
  your projects by id or slug, and without an API key the drive is your default project's.
1979
2024
 
2025
+ ## Your brain (0.28.0+)
2026
+
2027
+ `shard brain` reads your brain: your archive in an organization, kept by your orchestrator. Every answer it publishes is
2028
+ filed as `reports/<YYYY-MM-DD>/<folder>/report.md` with the answer's media next to it (image thumbnails under
2029
+ `.thumbs/`), with its own notes and files and an `index.md` of everything, newest first. Your orchestrator writes it;
2030
+ you read it from any device, with every computer asleep. Paths are relative to the brain's root, the names `~/brain`
2031
+ shows on your orchestrator's computer.
2032
+
2033
+ ```sh
2034
+ shard brain get index.md
2035
+ shard brain ls reports/2026-10-17/
2036
+ # SIZE SAVED TYPE PATH
2037
+ # 195.3 KB 2026-10-17 09:12:40Z image/png reports/2026-10-17/training-progress-ab12cd34/loss.png
2038
+ # 1.2 KB 2026-10-17 09:12:41Z text/markdown reports/2026-10-17/training-progress-ab12cd34/report.md
2039
+ shard brain get reports/2026-10-17/training-progress-ab12cd34/report.md
2040
+ shard brain get reports/2026-10-17/training-progress-ab12cd34/loss.png -o loss.png
2041
+ ```
2042
+
2043
+ - `ls [prefix]` lists the current files by path, 200 to a page (`--limit` up to 1000, `--cursor`, `--all`); `--json`
2044
+ returns `data` (each file with its `sha256`), `next_cursor` and the brain's `version`, which moves whenever anything
2045
+ in it changes.
2046
+ - `get` writes the bytes to standard output, or to a file with `-o`, once they match their SHA-256; `--sha256` reads
2047
+ exactly that version, and `--json` returns `content_base64` with `sha256`, `size` and `content_type`.
2048
+ - Signed in, it is your brain in your saved organization (`shard orgs use`), else your only one, or `--org <id|slug>`;
2049
+ with `SHARDFLUX_API_KEY` set, the brain of the person who created that key.
2050
+
1980
2051
  ## Model template (0.25.0+)
1981
2052
 
1982
2053
  `shard models` shows which harness, model and effort each role of a task runs with, from the Claude and Codex accounts
@@ -2021,3 +2092,11 @@ shard volumes detach --machine datasets
2021
2092
  ```
2022
2093
 
2023
2094
  Defaults mount in new and running conversations. Removal waits for current work to finish and preserves manual attachments. Add `--json` to read propagation results.
2095
+
2096
+ Bare `shard` in a coding-agent shell or without a TTY returns its setup guide using locally saved sign-in and API-key state.
2097
+
2098
+ ### Question explanations (0.28.2+)
2099
+
2100
+ Needs-you output prints each question and its optional `option_details` in full, including what each choice does and what follows it. The first suggested answer is the agent’s recommendation. Secret values go through the project’s secure setup, never a question or its ordinary answer.
2101
+
2102
+ Conversation creation (0.28.2+) includes the optional launching conversation only when `/v1/meta` advertises `capabilities.conversation_origin: true`. Older APIs receive the existing create body; no rejected create is replayed with different fields.
@@ -1,5 +1,5 @@
1
- import { setupGuide } from './agent-setup.js';
2
- import type { Ctx, Handler } from './commands.js';
1
+ export { agentSetupGuide } from './agent-setup.js';
2
+ import type { Handler } from './commands.js';
3
3
  export declare const DEFAULT_API_URL = "https://api.shardflux.dev";
4
4
  /** What `shard setup` gave a key before 0.15.1: every tool but `computer`. Such a saved key is replaced with a full one. */
5
5
  export declare function outdatedDefaultKey(permissions: readonly string[]): boolean;
@@ -18,6 +18,4 @@ export declare function exportLine(shell: ShellKind, name: string, value: string
18
18
  export declare function parseTime(text: string, option: string, now?: number): string;
19
19
  /** A spend cap in dollars ("9", "9.5", "9.50", "$9") as minor units (cents); at most two decimals. */
20
20
  export declare function dollarsToMinor(text: string, what: string): number;
21
- /** The setup guide for this computer: whether a session and an API key are saved (no network call). */
22
- export declare function agentSetupGuide(ctx: Ctx): ReturnType<typeof setupGuide>;
23
21
  export declare const ACCOUNT_HANDLERS: Record<string, Handler>;
@@ -21,7 +21,8 @@ import { API_KEY_TOOL_PERMISSIONS, CheckoutTimeoutError, Shardflux, ShardfluxAcc
21
21
  import { CLI_VERSION, UUID, parseDuration, parsePositiveInt } from "./args.js";
22
22
  import { openUrl } from "./browser.js";
23
23
  import { defaultClientName, startDeviceAuthorization, waitForDeviceSession } from "./browser-login.js";
24
- import { setupGuide, setupGuideText } from "./agent-setup.js";
24
+ import { agentSetupGuide, setupGuideText } from "./agent-setup.js";
25
+ export { agentSetupGuide } from "./agent-setup.js";
25
26
  import { allOrgs, allProjects, byRef, choices, findOrg, gone, keyOrganizationWarning, keyScope, resolveOrg, resolveProject, staleDefaultOrg } from "./account-scope.js";
26
27
  import { readFileSync, rmSync } from 'node:fs';
27
28
  import { join } from 'node:path';
@@ -768,11 +769,6 @@ function wantsBrowser(ctx, values) {
768
769
  return true;
769
770
  return ctx.input.interactive && !ctx.json;
770
771
  }
771
- /** The setup guide for this computer: whether a session and an API key are saved (no network call). */
772
- export function agentSetupGuide(ctx) {
773
- const profile = ctx.store.profile(ctx.apiUrl);
774
- return setupGuide({ signedIn: ctx.sessionSource() !== null, email: profile.session?.user?.email ?? null, apiKey: profile.api_key !== undefined || Boolean(ctx.io.env.SHARDFLUX_API_KEY?.trim()) });
775
- }
776
772
  /**
777
773
  * After `orgs use` / `projects use` (0.20.2+): the defaults moved, but workspace, agent and usage commands use the API
778
774
  * key, which may act in another organization. Says so; on a terminal offers to make a key for the new default (a
@@ -6,5 +6,4 @@ export declare function rememberGitAgent(ctx: Ctx, ws: Workspace, folder: string
6
6
  export declare const AGENT_GIT_HANDLERS: Record<string, Handler>;
7
7
  /** No Git or network work when no records are due. Active passes are bounded and never infer deletion from an error. */
8
8
  export declare function housekeeping(ctx: HousekeepingCtx, now?: () => number, budgetMs?: number): Promise<void>;
9
- /** Help/version starts also clean saved work, without requiring credentials when nothing is due. */
10
- export declare function startupHousekeeping(ctx: Pick<Ctx, 'io' | 'store' | 'signal'>): Promise<void>;
9
+ export { startupHousekeeping } from './startup-housekeeping.js';
@@ -1,9 +1,8 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import { promisify } from 'node:util';
3
- import { Shardflux, ShardfluxApiError } from '@shardflux/sdk';
3
+ import { ShardfluxApiError } from '@shardflux/sdk';
4
4
  import { out, resolveWorkspace, str } from "./commands.js";
5
5
  import { AgentStateStore } from "./agent-state.js";
6
- import { resolveApiUrl } from "./args.js";
7
6
  import { AgentGit, agentName } from "./agent-git.js";
8
7
  import { shardRemote } from "./git-remote.js";
9
8
  import { projectIdentity } from "./project-identity.js";
@@ -274,22 +273,4 @@ export async function housekeeping(ctx, now = Date.now, budgetMs = 1500) {
274
273
  clearTimeout(timer);
275
274
  }
276
275
  }
277
- /** Help/version starts also clean saved work, without requiring credentials when nothing is due. */
278
- export async function startupHousekeeping(ctx) {
279
- try {
280
- const state = new AgentStateStore(ctx.store.dir).read();
281
- if (!state.git_repositories || !Object.keys(state.git_repositories).length)
282
- return;
283
- const apiUrl = resolveApiUrl(undefined, ctx.io.env.SHARDFLUX_API_URL ?? ctx.io.env.SHARDFLUX_BASE_URL);
284
- let cloud;
285
- await housekeeping({ ...ctx, apiUrl, cloud: () => {
286
- const key = ctx.io.env.SHARDFLUX_API_KEY?.trim() || ctx.store.profile(apiUrl).api_key?.token;
287
- if (!key)
288
- throw new UsageError('saved agents need a project key for housekeeping; run shard setup');
289
- return cloud ??= new Shardflux({ apiKey: key, baseUrl: apiUrl, versionCheck: false });
290
- } });
291
- }
292
- catch (error) {
293
- ctx.io.stderr.write(`shard housekeeping: ${error instanceof Error ? error.message : String(error)}\n`);
294
- }
295
- }
276
+ export { startupHousekeeping } from "./startup-housekeeping.js";
@@ -1,10 +1,10 @@
1
+ import type { Ctx } from './commands.js';
1
2
  /**
2
3
  * Set in a coding agent's shell: Claude Code (CLAUDECODE), Codex (CODEX_SANDBOX, CODEX_THREAD_ID), Cursor's agent
3
4
  * (CURSOR_AGENT) and Gemini CLI (GEMINI_CLI). Such a shell may have a terminal (Cursor and Codex can run commands in a
4
5
  * PTY), but nobody types into it: a full-screen view or a prompt there waits forever.
5
6
  */
6
- export declare const AGENT_SHELL_VARIABLES: readonly ["CLAUDECODE", "CODEX_SANDBOX", "CODEX_THREAD_ID", "CURSOR_AGENT", "GEMINI_CLI"];
7
- export declare function codingAgentShell(env: Record<string, string | undefined>): boolean;
7
+ export { AGENT_SHELL_VARIABLES, codingAgentShell } from './agent-shell.js';
8
8
  /**
9
9
  * How the agent runs the setup (0.20.1+): it does the work, the person only decides. Onboarding testers (2026-10-12)
10
10
  * found agents handing them commands, links and codes, writing paragraphs and asking open questions.
@@ -46,4 +46,6 @@ export interface GuideState {
46
46
  apiKey: boolean;
47
47
  }
48
48
  export declare function setupGuide(state: GuideState): SetupGuide;
49
+ /** The setup guide for this computer: whether a session and an API key are saved (no network call). */
50
+ export declare function agentSetupGuide(ctx: Ctx): ReturnType<typeof setupGuide>;
49
51
  export declare function setupGuideText(g: SetupGuide): string;
@@ -18,10 +18,7 @@ import { legalFields } from "./legal.js";
18
18
  * (CURSOR_AGENT) and Gemini CLI (GEMINI_CLI). Such a shell may have a terminal (Cursor and Codex can run commands in a
19
19
  * PTY), but nobody types into it: a full-screen view or a prompt there waits forever.
20
20
  */
21
- export const AGENT_SHELL_VARIABLES = ['CLAUDECODE', 'CODEX_SANDBOX', 'CODEX_THREAD_ID', 'CURSOR_AGENT', 'GEMINI_CLI'];
22
- export function codingAgentShell(env) {
23
- return AGENT_SHELL_VARIABLES.some((name) => (env[name]?.trim() ?? '') !== '');
24
- }
21
+ export { AGENT_SHELL_VARIABLES, codingAgentShell } from "./agent-shell.js";
25
22
  /**
26
23
  * How the agent runs the setup (0.20.1+): it does the work, the person only decides. Onboarding testers (2026-10-12)
27
24
  * found agents handing them commands, links and codes, writing paragraphs and asking open questions.
@@ -137,6 +134,11 @@ function stepText(n, s) {
137
134
  ...(s.note ? [` ${wrap(s.note, ' ', 96)}`] : []),
138
135
  ].join('\n');
139
136
  }
137
+ /** The setup guide for this computer: whether a session and an API key are saved (no network call). */
138
+ export function agentSetupGuide(ctx) {
139
+ const profile = ctx.store.profile(ctx.apiUrl);
140
+ return setupGuide({ signedIn: ctx.sessionSource() !== null, email: profile.session?.user?.email ?? null, apiKey: profile.api_key !== undefined || Boolean(ctx.io.env.SHARDFLUX_API_KEY?.trim()) });
141
+ }
140
142
  export function setupGuideText(g) {
141
143
  return [
142
144
  'Set up Shardflux for your user. How:',
@@ -0,0 +1,2 @@
1
+ export declare const AGENT_SHELL_VARIABLES: readonly ["CLAUDECODE", "CODEX_SANDBOX", "CODEX_THREAD_ID", "CURSOR_AGENT", "GEMINI_CLI"];
2
+ export declare function codingAgentShell(env: Record<string, string | undefined>): boolean;
@@ -0,0 +1,5 @@
1
+ // Identify an agent shell before loading onboarding or command handlers.
2
+ export const AGENT_SHELL_VARIABLES = ['CLAUDECODE', 'CODEX_SANDBOX', 'CODEX_THREAD_ID', 'CURSOR_AGENT', 'GEMINI_CLI'];
3
+ export function codingAgentShell(env) {
4
+ return AGENT_SHELL_VARIABLES.some((name) => (env[name]?.trim() ?? '') !== '');
5
+ }
package/dist/args.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const CLI_VERSION = "0.28.0";
1
+ export declare const CLI_VERSION = "0.28.2";
2
2
  export interface OptionSpec {
3
3
  type: 'string' | 'boolean';
4
4
  short?: string;
package/dist/args.js CHANGED
@@ -15,7 +15,7 @@ import { BOARD_COMMANDS } from "./board-args.js";
15
15
  import { ORCHESTRATOR_COMMANDS } from "./orchestrator-args.js";
16
16
  import { UsageError } from "./errors.js";
17
17
  import { DEFAULT_CHOICE, MODEL_CHOICES } from "./agent-models.js";
18
- export const CLI_VERSION = '0.28.0';
18
+ export const CLI_VERSION = '0.28.2';
19
19
  export const GLOBAL_OPTIONS = {
20
20
  'api-url': { type: 'string', value: '<url>', description: 'API base URL (default $SHARDFLUX_API_URL, else https://api.shardflux.dev).' },
21
21
  json: { type: 'boolean', description: 'Print machine-readable JSON on stdout (errors as JSON on stderr).' },
@@ -127,6 +127,9 @@ const LIFETIME_FILTER = {
127
127
  };
128
128
  const SECRET_REF = { name: 'id|name', required: true };
129
129
  const SECRET_SCOPE = {
130
+ scope: { type: 'string', value: '<agents|project|conversation>', description: 'Agent credential scope: all your agents, this project, or one thread. Omit for workspace-bound secrets.' },
131
+ project: { type: 'string', value: '<project-id>', description: 'Project for a local agent credential (default: the key’s project).' },
132
+ conversation: { type: 'string', value: '<conversation-id>', description: 'Thread for --scope conversation.' },
130
133
  org: { type: 'string', value: '<organization-id>', description: 'Organization-wide secrets of this organization (owners/admins; project API keys get 403). Default: the API key’s project.' },
131
134
  };
132
135
  const SECRET_VALUE = {
@@ -993,6 +996,7 @@ const KEY_COMMANDS = [
993
996
  summary: 'Import named items from your vault as encrypted project secrets',
994
997
  positionals: [{ name: 'name', required: true, variadic: true }],
995
998
  options: {
999
+ ...SECRET_SCOPE,
996
1000
  from: { type: 'string', value: '<hsec|1password|bitwarden|keychain>', description: 'Vault to read; values go straight into the encrypted secrets request.' },
997
1001
  as: { type: 'string', value: '<secret-name>', description: 'Secret name for a single imported item.' },
998
1002
  keychain: { type: 'string', value: '<path>', description: 'Read from this Keychain (keychain source only).' },
@@ -123,6 +123,12 @@ export const BOARD_COMMANDS = [
123
123
  summary: 'Answer something that waits on you (0.25.0+)',
124
124
  positionals: [{ name: 'id', required: true }, { name: 'decision' }],
125
125
  options: {
126
+ credential: { type: 'boolean', description: 'Provide an environment credential through the secure value input; never through --text.' },
127
+ scope: { type: 'string', value: '<agents|project|conversation>', description: 'Credential storage scope (default: what the request suggests).' },
128
+ org: { type: 'string', value: '<organization-id>', description: 'The organization for a signed-in credential answer.' },
129
+ ask: { type: 'boolean', description: 'Open the secure page for the credential value.' },
130
+ 'from-file': { type: 'string', value: '<file>', description: 'Read the credential value from this file; never from an argument.' },
131
+ timeout: { type: 'string', value: '<duration>', description: 'How long the secure page waits (default 10m).' },
126
132
  everywhere: { type: 'boolean', description: 'With always: the rule covers every project.' },
127
133
  text: { type: 'string', value: '<answer>', description: 'Your answer to an agent’s question.' },
128
134
  pick: { type: 'string', multiple: true, value: '<option|question=option>', description: 'The option you pick for an agent’s question in a permission request (repeatable for a multi-select question; "<question>=<option>" when it asks several).' },
@@ -136,6 +142,7 @@ export const BOARD_COMMANDS = [
136
142
  ' ask_… --text <answer>: the task’s master gets it',
137
143
  ' oq_… --text <answer>: the orchestrator thread that asked gets it (0.27.0+)',
138
144
  ' cred_… deny (the value goes through the credential request, sealed for its computer)',
145
+ ' acred_… --credential --ask: provide an environment value securely, or deny to decline it',
139
146
  ' land_… land (as shard task land: the result into your folder and the default branch), keep (the',
140
147
  ' branch stays) or discard',
141
148
  ' prune_… --keep <task-id> for each task to keep, keep for all of them, or discard to clear them',
@@ -44,7 +44,7 @@ export declare function feedJson(u: BoardUpdate): Record<string, unknown>;
44
44
  /** `shard task show`: the task, its plan and conversations, then every report oldest first with its evidence. Every
45
45
  * title, step and outcome prints whole (0.27.0+), however long the agent wrote it; the terminal wraps it. */
46
46
  export declare function taskDetailText(d: TaskDetail): string;
47
- /** An item's kind from its id (perm_, cq_, ask_, oq_, cred_, land_, prune_, dev_); undefined for another id. */
47
+ /** An item's kind from its id (perm_, cq_, ask_, oq_, cred_, acred_, land_, prune_, dev_); undefined for another id. */
48
48
  export declare function itemKind(id: string): NeedsYouItem['kind'] | undefined;
49
49
  export interface AnswerInput {
50
50
  word?: string | undefined;