@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 +119 -202
- package/dist/commands/local-args.js +8 -0
- package/dist/commands/local.js +429 -34
- package/dist/local-state.js +6 -3
- package/dist/onboarding-roots.js +183 -18
- package/dist/raw-evidence-gc.js +122 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,251 +1,168 @@
|
|
|
1
1
|
# Cockpit CLI
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
36
|
-
|
|
38
|
+
$ cockpit status
|
|
39
|
+
Install: ready
|
|
40
|
+
Auth: paired
|
|
41
|
+
Upload state: ready
|
|
37
42
|
```
|
|
38
43
|
|
|
39
|
-
|
|
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 <
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
cockpit agent-rules install --workspace <root>
|
|
104
|
+
cockpit onboard --no-auth --email <you@buildlaunchiterate.ca> --workspace ~/BLI
|
|
70
105
|
```
|
|
71
106
|
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```
|
|
111
|
+
## Ticket Semantics
|
|
112
|
+
|
|
113
|
+
Setup is general ambient capture. Do not invent a ticket for onboarding.
|
|
140
114
|
|
|
141
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
135
|
+
## Storage Layout
|
|
172
136
|
|
|
173
137
|
Local files:
|
|
174
138
|
|
|
175
|
-
- `~/.config/bli-cockpit/config.json`: dashboard URL
|
|
176
|
-
|
|
177
|
-
- `~/.
|
|
178
|
-
- `~/.local/state/bli-cockpit/
|
|
179
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
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
|
};
|