@bli-cockpit/cli 0.1.33 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,251 +1,168 @@
1
1
  # Cockpit CLI
2
2
 
3
- Public BLI Cockpit command-line interface for approved operators and interns.
3
+ Cockpit watches how you and your AI agents work so Edward can coach from evidence instead of screenshots and status pings.
4
4
 
5
- The npm package is public; the Cockpit backend and admin tooling are not. The
6
- CLI pairs a local laptop with the private Cockpit dashboard, records safe
7
- work context, uploads consented raw Codex/Claude/diff evidence and explicit
8
- images attached into agent sessions to durable private storage, and uploads
9
- metadata refs after dashboard-approved
10
- device pairing.
5
+ ## 90-second speedrun
11
6
 
12
- ## One-paste install
13
-
14
- Run this in a terminal. If you are inside `~/BLI`, Cockpit suggests that
15
- workspace root; otherwise it looks for likely roots such as `~/BLI` and asks
16
- before collecting. Later reruns remember the approved roots:
7
+ Run these three commands on the Mac that should be collected:
17
8
 
18
9
  ```bash
19
- npm install -g @bli-cockpit/cli@latest
20
- cockpit onboard
10
+ $ npm install -g @bli-cockpit/cli@latest
11
+ added <packages> in <seconds>s
21
12
  ```
22
13
 
23
- Interactive onboarding prompts for the dashboard email. Enter the approved
24
- intern/operator email. For reused laptops, VMs, or headless/agent-run setup,
25
- pass the email and root explicitly:
26
-
27
14
  ```bash
28
- cockpit onboard --email <APPROVED_EMAIL> --workspace ~/BLI
15
+ $ cockpit onboard
16
+ Cockpit harvest onboarding
17
+ Dashboard: https://bli-cockpit-dashboard.vercel.app
18
+ Ticket: general ambient
19
+ What's your @buildlaunchiterate.ca email? (press enter to skip): ian@buildlaunchiterate.ca
20
+ Signing in as ian@buildlaunchiterate.ca.
21
+ Code sent; valid 1h, resend in 60s by rerunning this command.
22
+ Email code needed:
23
+ Check your latest Cockpit email for a 6- to 10-digit code.
24
+ What you can do:
25
+ 1) Paste the code here.
26
+ 2) No code yet: wait for the resend window, then rerun this command.
27
+ 3) Can't use email: rerun with --no-auth for manual approval.
28
+ Code: 482913
29
+ Signed in as ian@buildlaunchiterate.ca.
30
+ 2/5 Device paired.
31
+ PASS: Cockpit collector is ready for harvest.
32
+ You're live.
33
+ Dashboard: https://bli-cockpit-dashboard.vercel.app/my-work
34
+ Next: cockpit status
29
35
  ```
30
36
 
31
- If a work folder contains multiple repos, confirm the parent folder as the
32
- collection root. In a headless setup, pass it explicitly:
33
-
34
37
  ```bash
35
- npm install -g @bli-cockpit/cli@latest
36
- cockpit onboard --email <APPROVED_EMAIL> --workspace ~/BLI
38
+ $ cockpit status
39
+ Install: ready
40
+ Auth: paired
41
+ Upload state: ready
37
42
  ```
38
43
 
39
- For multiple unrelated collection roots, repeat `--workspace`:
44
+ The OTP proves you own an approved BLI mailbox. The JWT is used once to register this device and is never saved; the durable local credential remains the existing Cockpit device token.
45
+
46
+ ## Every command, what it does, and why it's called that
47
+
48
+ You only need three commands (`onboard`, `status`, and `backfill` once). The rest exist for
49
+ recovery and maintenance.
50
+
51
+ | Command | What it does | Why it exists / why this name |
52
+ |---|---|---|
53
+ | `cockpit onboard` | The everything-command: signs you in (email code), registers this Mac, starts capture, uploads once, installs the 15-min background sync, and prints proof you're live. | You are boarding the crew. Run it once per machine; rerunning is always safe. |
54
+ | `cockpit status` | Prints install / sign-in / capture / upload health in one screen. | The "is it working?" command. Run it whenever you're unsure. |
55
+ | `cockpit backfill --all` | Uploads your HISTORICAL Codex + Claude sessions (from before Cockpit existed on this Mac). | One-time catch-up so your past work counts too. "Backfill" = fill in the back-catalog. |
56
+ | `cockpit sync` | Captures and uploads once, right now. This is what the background agent runs every 15 min — you almost never type it yourself. | Named for what it does: synchronize local session files up to the dashboard. |
57
+ | `cockpit start --ticket <id>` | Tags your CURRENT work with a Linear ticket so sessions attribute to it. `--clear-ticket` returns to general capture. | "Start (working on) X." Agents usually run this for you per the agent rules. |
58
+ | `cockpit login` / `cockpit pair` | Just the sign-in + device-registration step, standalone (onboard already includes it). Two names, one command: `login` is what humans guess, `pair` is what the dashboard's device screen calls it. | Recovery path when a session expires or you switch accounts. |
59
+ | `cockpit logout` | Deletes this machine's session. | The undo of login. |
60
+ | `cockpit update` / `cockpit upgrade` | Updates the CLI itself from npm, then reruns onboard. Two names, one command — aliases because half of people guess each. | Self-update; run when Edward announces a new version. |
61
+ | `cockpit install` | Writes local config only (step 1 of onboard, standalone). | Plumbing; exists so onboard's pieces are individually runnable. You'll likely never type it. |
62
+ | `cockpit sessions` | Read-only: lists your observed sessions and how each attributed. | Debugging "why isn't my session showing up?" without uploading anything. |
63
+ | `cockpit autostart install\|uninstall\|status` | Manages the macOS launchd agent behind the 15-min background sync. | Direct control of the background piece when you need to stop/inspect it. |
64
+ | `cockpit agent-rules install\|uninstall\|status` | Manages the Cockpit ticket-binding text block inside `~/.codex/AGENTS.md` / `~/.claude/CLAUDE.md`. | It's literally "the rules your agents read." Passive markdown — never an executable hook. |
65
+ | `cockpit serve` | Runs a tiny local HTTP status server. | Niche: lets other tools ask the collector how it's doing. |
66
+ | `cockpit logout`, `cockpit release`, `cockpit admin *` | `release` publishes the CLI (maintainer, repo-gated); `admin` (bootstrap/invite) is absent from the public build entirely. | Maintainer surface — interns never touch these. |
67
+
68
+ Honest naming notes: `update`/`upgrade` and `login`/`pair` are deliberate synonym-aliases (cheap
69
+ forgiveness beats a "command not found"); `install` is a misleading name for "write config" but
70
+ is kept for onboard-step symmetry.
71
+
72
+ ## Flags
73
+
74
+ Normal setup needs no flags. Use flags only when the default guess is wrong:
40
75
 
41
76
  ```bash
42
- cockpit onboard --email <APPROVED_EMAIL> --workspace ~/BLI --workspace ~/side-projects
77
+ cockpit onboard --email <you@buildlaunchiterate.ca> --workspace ~/BLI
78
+ cockpit onboard --workspace ~/BLI --workspace ~/side-projects
79
+ cockpit onboard --device-name "Ian MacBook"
80
+ cockpit onboard --no-auth
43
81
  ```
44
82
 
45
- The CLI defaults to the production dashboard. Normal intern/operator setup,
46
- updates, and syncs omit `--dashboard-url`. Pass `--dashboard-url` only for
47
- staging, a custom dashboard, or deliberately forcing a different dashboard
48
- pairing. Already-onboarded users update with `cockpit update` from anywhere. It
49
- installs the latest public CLI from npm, then reruns onboarding checks to
50
- refresh pairing, agent rules, autostart, and an initial sync against saved
51
- roots. `cockpit upgrade` is a compatibility alias. `--repo <path>` remains
52
- supported for older prompts and the agent ticket-binding guardrail.
53
- When onboarding reports archived local sessions without a completed backfill,
54
- follow [`docs/runbooks/cockpit-backfill.md`](../../docs/runbooks/cockpit-backfill.md):
55
- run `cockpit update`, then run `cockpit backfill --all` as a separate command.
56
-
57
- On machines where Codex or Claude agents will do ticketed work, `cockpit
58
- onboard` refreshes `~/.codex/AGENTS.md` and `~/.claude/CLAUDE.md` after harvest
59
- proof. The managed Cockpit ticket-binding block is replaced in place rather
60
- than duplicated and is scoped to the confirmed root set, so agents should ignore
61
- it in private chats or unrelated repos.
62
-
63
- For intern machines, `cockpit onboard` refreshes the launchd autostart agent so
64
- Cockpit syncs confirmed roots at login and every 15 minutes. For a manual
65
- repair path, run `cockpit autostart install --workspace <root>` later.
83
+ - `--email` skips the email prompt.
84
+ - `--workspace` pins one collection root; repeat it for multiple unrelated roots.
85
+ - `--allow-home-root` deliberately collects your whole home folder. Use it only on a company machine where that is intended.
86
+ - `--device-name` changes only the human label shown in Cockpit.
87
+ - `--dashboard-url` is for staging/custom dashboards only. Production is the default.
88
+ - `--no-auth` forces the old manual approval queue.
89
+ - `--repo` still works as a legacy alias for `--workspace`.
90
+
91
+ `cockpit update` installs the latest public CLI and reruns onboarding checks against saved roots. `cockpit upgrade` is the same command.
92
+
93
+ ## Parent Mode
94
+
95
+ Use a parent folder such as `~/BLI` when it contains multiple repos. Cockpit scans child git repos/worktrees, creates one stable work context per worktree, and rolls them up under repo rows in the dashboard.
96
+
97
+ Defaults: 3 folder levels deep, up to 50 repos. Tune with `--max-depth` and `--max-repos`.
98
+
99
+ ## Pairing Recovery
100
+
101
+ The v2 happy path auto-approves pairing after the email OTP. Manual approval still exists for recovery:
66
102
 
67
103
  ```bash
68
- # Repair/manual path.
69
- cockpit agent-rules install --workspace <root>
104
+ cockpit onboard --no-auth --email <you@buildlaunchiterate.ca> --workspace ~/BLI
70
105
  ```
71
106
 
72
- The direct command updates `~/.codex/AGENTS.md` and `~/.claude/CLAUDE.md` with
73
- the Cockpit rule to bind known Linear tickets before edits, or ask once when
74
- the ticket ID is missing inside that workspace. That binding starts attributing
75
- the session's work to the specific ticket in Cockpit. It checks for managed or
76
- equivalent guidance first, so current files are left unchanged and stale Cockpit
77
- ticket-binding sections are replaced.
78
-
79
- Parent mode scans child git repos/worktrees (3 folder levels deep, up to 50
80
- repos by default — tune with `--max-depth` / `--max-repos`; a warning prints
81
- if the repo cap truncates discovery), creates one stable work context per
82
- worktree, and the dashboard rolls them up under one repo row with worktree
83
- drilldown. Repos cloned later are picked up automatically: `cockpit sync`
84
- starts a general ambient work context for newly discovered repos on its own. Device approval is still one time per laptop/dashboard/email. Codex
85
- JSONL transcripts are attributed to a repo/worktree deterministically (session
86
- cwd, workspace roots, git origin/branch/commit signals) and upload only into
87
- that repo's evidence lane; transcripts that cannot be attributed to exactly one
88
- worktree are reported as ambiguous/unattributed with reason labels instead of
89
- being duplicated across repos or dropped.
90
-
91
- What happens:
92
-
93
- 1. npm installs or updates the public `@bli-cockpit/cli` package.
94
- 2. `cockpit onboard` writes local user config.
95
- 3. Cockpit prints a dashboard pairing URL and code.
96
- 4. Admin approves the persistent email access request from Ambient -> Collector
97
- approvals. Pair codes still expire, but the access request remains. If the
98
- terminal is still polling, approval pairs it immediately; if not, the intern
99
- reruns `cockpit onboard --email <APPROVED_EMAIL> --workspace ~/BLI` or
100
- simply `cockpit onboard` after roots are saved, and the stored approval
101
- auto-pairs without another Admin action. Admin can still paste the printed
102
- code there as a rescue path. The signed-in intern can still use the printed
103
- URL. If the claimed email is not an app user yet, a super admin approval
104
- creates the user, adds team membership, and sends the Supabase invite flow
105
- automatically.
106
- 5. The CLI starts general ambient capture, uploads private raw evidence objects
107
- when present (chunked and resumable, with identical content acknowledged
108
- instead of re-uploaded), then uploads one safe metadata/ref envelope. Text
109
- evidence with secret-shaped values is sanitized before storage and marked as
110
- partial evidence with redaction metadata; env files are still never read.
111
- 6. The CLI prints `PASS: Cockpit collector is ready for harvest.` and a final
112
- `You're live.` block with collection roots, pairing state, background sync
113
- state, dashboard link, and `cockpit status` as the next command.
114
-
115
- `--device-name` is optional and only a readable label in Cockpit. Pass it only
116
- when you want a specific label such as `"Savina MacBook"` or `"Box VM 42"`.
117
- On reused laptops or VMs, keep `--email <APPROVED_EMAIL>` in the command.
118
- `cockpit onboard` skips pairing only when the existing valid session belongs to
119
- that same email and dashboard URL (the production default unless overridden); a
120
- different email or dashboard forces a new approval.
121
-
122
- Before the command runs, an Admin does not need to open Supabase or pre-create
123
- ordinary interns in Settings -> Team. Approval of the claimed email in Ambient
124
- creates the missing app user and stores the durable access approval. Settings
125
- -> Team remains available for manual pre-provisioning, including
126
- temporary-password launch. For temporary-password accounts, the intern signs in
127
- directly; there is no separate invite acceptance step.
128
-
129
- When ticket work starts later:
107
+ Use that when the mailbox is unavailable, auth routes are down, or Edward has added an exact non-domain email exception. Cockpit prints a URL and code; Admin approves from Ambient -> Collector approvals. If the code expires, rerun `cockpit onboard` after approval and the durable access row will auto-pair.
130
108
 
131
- ```bash
132
- cockpit start \
133
- --ticket <ticket-id> \
134
- --workspace "$PWD"
109
+ If this is a reused laptop or VM, keep `--email` set. Cockpit reuses an existing session only when it belongs to that same email and dashboard URL.
135
110
 
136
- cockpit sync \
137
- --workspace "$PWD" \
138
- --json
139
- ```
111
+ ## Ticket Semantics
112
+
113
+ Setup is general ambient capture. Do not invent a ticket for onboarding.
140
114
 
141
- No ticket is required for setup, chatting, planning, or general ambient capture.
142
- Only pass `--ticket` when the work really belongs to a visible ticket.
143
- Omitting `--ticket` preserves any existing ticket binding; run
144
- `cockpit start --clear-ticket --workspace "$PWD"` when you intentionally want
145
- to return a previously bound work context to general ambient capture.
115
+ When real ticket work starts:
146
116
 
147
- When the work is important but ticketless, label it explicitly before syncing so
148
- later analysis does not have to guess the topic:
117
+ ```bash
118
+ cockpit start --ticket <ticket-id> --workspace "$PWD"
119
+ cockpit sync --workspace "$PWD" --json
120
+ ```
121
+
122
+ For important ticketless work:
149
123
 
150
124
  ```bash
151
125
  cockpit start \
152
126
  --workspace "$PWD" \
153
- --topic "lead ingestion rewrite planning" \
127
+ --topic "lead ingestion planning" \
154
128
  --intent planning \
155
129
  --phase discovery \
156
130
  --intent-confidence 0.9
157
-
158
- cockpit sync \
159
- --workspace "$PWD" \
160
- --json
161
131
  ```
162
132
 
163
- Supported `--intent` values are `implementation`, `bug_fix`,
164
- `root_cause_analysis`, `planning`, `discovery`, `review`, `testing`,
165
- `documentation`, `release`, `learning`, `coordination`, `maintenance`,
166
- `analysis`, `unknown`, and `other`. Supported `--phase` values are `planning`,
167
- `discovery`, `implementation`, `debugging`, `review`, `testing`,
168
- `documentation`, `release`, `handoff`, `analysis`, `unknown`, and `other`.
169
- Use `--topic-summary` only for short redacted summaries, not transcript text.
133
+ `cockpit onboard` also refreshes managed ticket-binding guidance in `~/.codex/AGENTS.md` and `~/.claude/CLAUDE.md` so agents bind visible Linear tickets before edits inside the confirmed workspace.
170
134
 
171
- ## What gets saved
135
+ ## Storage Layout
172
136
 
173
137
  Local files:
174
138
 
175
- - `~/.config/bli-cockpit/config.json`: dashboard URL (production default unless
176
- overridden) and local install config.
177
- - `~/.config/bli-cockpit/session.json`: normal paired device session.
178
- - `~/.local/state/bli-cockpit/spool/`: safe retry records when upload fails.
179
- - `~/.local/state/bli-cockpit/cursors/raw-evidence.json`: hashes and labels of
180
- already-durable evidence so repeated syncs skip re-uploading the same
181
- content (no raw content is stored in the cursor).
182
- - `~/.local/state/bli-cockpit/cursors/backfill.json`: high-water progress for
183
- the explicit `cockpit backfill` command.
184
- - `.codex-autorunner/contextspace/active_context.md` in the work repo when a
185
- work context is active.
186
-
187
- Remote dashboard:
188
-
189
- - approved user and device identity;
190
- - repo/worktree fingerprints, branch, head SHA, optional ticket, source
191
- availability, risk flags, and upload timestamps;
192
- - raw evidence refs accepted by `/api/ambient/ingest`;
193
- - durable private Storage objects accepted by the chunked
194
- `/api/ambient/evidence/upload/begin|chunk|commit` endpoints, tracked in a
195
- durable per-object upload ledger. When deterministic sanitization was
196
- applied, the evidence ref stores the redaction metadata and sanitized object
197
- hash/size;
198
- - attached image artifact metadata accepted by `/api/ambient/agent-artifacts`
199
- for screenshots/images explicitly attached into Codex or Claude sessions;
200
- - Codex session attribution records (session id, file hash, attribution state
201
- and reason labels, scores) accepted by `/api/ambient/codex-sessions`.
202
- The local collector scans both active `~/.codex/sessions` files and archived
203
- `~/.codex/archived_sessions` files, using only `session_meta` and
204
- `turn_context` metadata for attribution. Transcript bytes are sanitized or
205
- blocked later by raw evidence collection before upload.
206
-
207
- New raw evidence object keys are readable from the Storage browser:
208
-
209
- ```text
210
- operators/<operator-slug>-<operator-short>/repos/<repo-slug>/worktrees/<worktree-slug>/tickets/<ticket-id-or-unbound>/dates/<YYYY-MM-DD>/sessions/<session-slug>/ids/<operator_user_id>/<work_context_id>/<source>/<source-path>
211
- ```
139
+ - `~/.config/bli-cockpit/config.json`: dashboard URL, device label, collection roots.
140
+ - `~/.config/bli-cockpit/session.json`: paired device token and owner metadata.
141
+ - `~/.local/state/bli-cockpit/spool/`: safe retry records.
142
+ - `~/.local/state/bli-cockpit/cursors/`: upload/backfill cursors, no raw content.
143
+ - `.codex-autorunner/contextspace/active_context.md`: current work context inside a repo.
212
144
 
213
- The readable folders are for humans. The canonical join still lives in
214
- `ambient_evidence_refs.raw_evidence_pointer_id`, `storage_bucket`, and
215
- `object_key`. For SQL recipes that reconstruct a day of work by operator, date,
216
- repo, ticket, and raw JSONL object, see
217
- [`docs/runbooks/cockpit-data-traceability.md`](../../docs/runbooks/cockpit-data-traceability.md).
145
+ Remote data:
218
146
 
219
- ## Read or debug captured data
147
+ - approved user/device identity;
148
+ - repo/worktree fingerprints, branch, head SHA, optional ticket, source counts;
149
+ - private raw evidence objects and `ambient_evidence_refs` pointers;
150
+ - Codex/Claude session attribution metadata.
220
151
 
221
- Local attribution preview:
152
+ Never provide service-role keys, raw DB URLs, cookies, root env files, or deployment tokens to this CLI. The collector never reads env files and does not collect random desktop screenshots or screen recordings.
153
+
154
+ ## Debug
222
155
 
223
156
  ```bash
224
157
  cockpit sessions --workspace "$PWD" --json
158
+ cockpit status --workspace "$PWD" --json
159
+ cockpit sync --workspace "$PWD" --json
225
160
  ```
226
161
 
227
- This preview includes both active and archived Codex sessions in the bounded
228
- scan window, plus Claude Code sessions when Claude collection is enabled. Use
229
- `--since-days N` or `--all` when debugging older local history.
230
-
231
- Remote metadata path:
162
+ If `cockpit update` fails with npm `EACCES`, fix Homebrew global-package ownership once:
232
163
 
233
- 1. Query `ambient_evidence_refs` by `operator_user_id`, `received_at`, and
234
- optional `ticket_id`.
235
- 2. Join `ambient_work_sessions` only for current labels such as repo, worktree,
236
- branch, and collector version.
237
- 3. Open the `ambient-raw-evidence` object only after SQL identifies the exact
238
- row and `object_key`.
239
-
240
- Never provide Supabase service-role keys, raw DB URLs, root env files, cookies,
241
- or deployment tokens to this CLI. The collector must never read env files and
242
- does not collect random desktop screenshots or screen recordings.
243
-
244
- ## Public package boundary
164
+ ```bash
165
+ sudo chown -R $(whoami) /opt/homebrew/lib/node_modules/@bli-cockpit /opt/homebrew/bin/cockpit
166
+ ```
245
167
 
246
- This public package intentionally excludes Cockpit admin bootstrap commands,
247
- service-role credential handling, source maps, tests, and internal runbooks.
248
- Clean `npm pack` and `npm publish` run the public CLI build before packaging so
249
- `dist/cli.js` is present in emergency releases.
250
- When collector changes depend on new telemetry-core exports, publish
251
- `@bli-cockpit/telemetry-core` first, then publish `@bli-cockpit/cli`.
168
+ Do not use `sudo npm i -g`; it recreates the ownership problem.
@@ -56,10 +56,12 @@ function parseOnboardLikeArgs(args, command) {
56
56
  "--ticket",
57
57
  "--branch",
58
58
  "--json",
59
+ "--no-auth",
59
60
  "--poll-interval-ms",
60
61
  "--timeout-ms",
61
62
  "--max-depth",
62
63
  "--max-repos",
64
+ "--allow-home-root",
63
65
  ],
64
66
  valueFlags: [
65
67
  "--home",
@@ -87,11 +89,13 @@ function parseOnboardLikeArgs(args, command) {
87
89
  deviceName: optionalNonEmpty(values.flags.get("--device-name")),
88
90
  activeTicketId: optionalNonEmpty(values.flags.get("--ticket")),
89
91
  branch: optionalNonEmpty(values.flags.get("--branch")),
92
+ noAuth: values.booleans.has("--no-auth"),
90
93
  json: values.booleans.has("--json"),
91
94
  pollIntervalMs: optionalPositiveInteger(values.flags.get("--poll-interval-ms"), "--poll-interval-ms"),
92
95
  timeoutMs: optionalPositiveInteger(values.flags.get("--timeout-ms"), "--timeout-ms"),
93
96
  maxDepth: optionalPositiveInteger(values.flags.get("--max-depth"), "--max-depth"),
94
97
  maxRepos: optionalPositiveInteger(values.flags.get("--max-repos"), "--max-repos"),
98
+ allowHomeRoot: values.booleans.has("--allow-home-root"),
95
99
  };
96
100
  }
97
101
  function parseOnboardArgs(args) {
@@ -113,6 +117,7 @@ function parseInstallArgs(args) {
113
117
  "--dashboard-url",
114
118
  "--supabase-url",
115
119
  "--json",
120
+ "--allow-home-root",
116
121
  ],
117
122
  valueFlags: [
118
123
  "--home",
@@ -130,6 +135,7 @@ function parseInstallArgs(args) {
130
135
  dashboardUrl: normalizeUrl(values.flags.get("--dashboard-url") ?? DEFAULT_DASHBOARD_URL),
131
136
  supabaseUrl: optionalNonEmpty(values.flags.get("--supabase-url")),
132
137
  json: values.booleans.has("--json"),
138
+ allowHomeRoot: values.booleans.has("--allow-home-root"),
133
139
  };
134
140
  }
135
141
  function parseReleaseArgs(args) {
@@ -164,6 +170,7 @@ function parseLoginArgs(args) {
164
170
  "--email",
165
171
  "--device-name",
166
172
  "--json",
173
+ "--no-auth",
167
174
  "--poll-interval-ms",
168
175
  "--timeout-ms",
169
176
  ],
@@ -184,6 +191,7 @@ function parseLoginArgs(args) {
184
191
  claimedOwnerEmail: optionalEmail(values.flags.get("--email")),
185
192
  deviceName: optionalNonEmpty(values.flags.get("--device-name")),
186
193
  json: values.booleans.has("--json"),
194
+ noAuth: values.booleans.has("--no-auth"),
187
195
  pollIntervalMs: optionalPositiveInteger(values.flags.get("--poll-interval-ms"), "--poll-interval-ms"),
188
196
  timeoutMs: optionalPositiveInteger(values.flags.get("--timeout-ms"), "--timeout-ms"),
189
197
  };