@skrr-ai/cli 0.1.94 → 0.1.96
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 +175 -165
- package/bin/run.js +32 -0
- package/bin/update-npm-runner.cjs +33 -0
- package/bin/update-session.cjs +194 -0
- package/bin/update-worker.cjs +208 -0
- package/dist/base-command.js +0 -15
- package/dist/commands/agent/message/send.d.ts +2 -0
- package/dist/commands/agent/message/send.js +75 -5
- package/dist/commands/agents/chat.js +1 -1
- package/dist/commands/agents/create.d.ts +0 -3
- package/dist/commands/agents/create.js +0 -26
- package/dist/commands/agents/egress.d.ts +17 -0
- package/dist/commands/agents/egress.js +84 -0
- package/dist/commands/agents/mailbox/messages.d.ts +14 -0
- package/dist/commands/agents/mailbox/messages.js +52 -0
- package/dist/commands/agents/mailbox/show.d.ts +13 -0
- package/dist/commands/agents/mailbox/show.js +52 -0
- package/dist/commands/agents/operating-plan.js +8 -0
- package/dist/commands/agents/roles/capture.d.ts +16 -0
- package/dist/commands/agents/roles/capture.js +53 -0
- package/dist/commands/agents/roles/install.d.ts +1 -0
- package/dist/commands/agents/roles/install.js +8 -1
- package/dist/commands/agents/roles/preview.d.ts +2 -0
- package/dist/commands/agents/roles/preview.js +27 -3
- package/dist/commands/agents/update.d.ts +0 -3
- package/dist/commands/agents/update.js +1 -31
- package/dist/commands/agents/usage-cap.d.ts +4 -1
- package/dist/commands/agents/usage-cap.js +49 -10
- package/dist/commands/code/doctor.d.ts +1 -0
- package/dist/commands/code/doctor.js +6 -0
- package/dist/commands/code/index.js +4 -0
- package/dist/commands/code/install.d.ts +5 -62
- package/dist/commands/code/install.js +86 -279
- package/dist/commands/code/jobs/show.js +12 -0
- package/dist/commands/code/rollback.d.ts +8 -0
- package/dist/commands/code/rollback.js +20 -0
- package/dist/commands/code/update.d.ts +8 -37
- package/dist/commands/code/update.js +134 -213
- package/dist/commands/commitments/action-proposals/decide.d.ts +2 -0
- package/dist/commands/commitments/action-proposals/decide.js +12 -0
- package/dist/commands/commitments/action-proposals.js +7 -0
- package/dist/commands/commitments/create.d.ts +1 -0
- package/dist/commands/commitments/create.js +17 -1
- package/dist/commands/commitments/delivery.d.ts +1 -0
- package/dist/commands/commitments/delivery.js +11 -1
- package/dist/commands/commitments/doctor.js +4 -0
- package/dist/commands/commitments/effective-policy.js +26 -0
- package/dist/commands/commitments/endpoints/create.js +5 -2
- package/dist/commands/commitments/observations.d.ts +10 -0
- package/dist/commands/commitments/observations.js +88 -0
- package/dist/commands/commitments/pause.d.ts +1 -1
- package/dist/commands/commitments/pause.js +4 -3
- package/dist/commands/commitments/preflight.js +2 -1
- package/dist/commands/commitments/reports.d.ts +2 -0
- package/dist/commands/commitments/reports.js +22 -4
- package/dist/commands/commitments/update.d.ts +1 -0
- package/dist/commands/commitments/update.js +35 -5
- package/dist/commands/daemon/install.js +4 -0
- package/dist/commands/generate-recovery-code.d.ts +13 -1
- package/dist/commands/generate-recovery-code.js +146 -13
- package/dist/commands/grants/create.d.ts +1 -0
- package/dist/commands/grants/create.js +8 -0
- package/dist/commands/grants/rotate.d.ts +5 -0
- package/dist/commands/grants/rotate.js +13 -1
- package/dist/commands/grants/update.d.ts +12 -0
- package/dist/commands/grants/update.js +27 -0
- package/dist/commands/instructions/guide.d.ts +20 -0
- package/dist/commands/instructions/guide.js +84 -0
- package/dist/commands/instructions/install.js +57 -33
- package/dist/commands/instructions/setup.d.ts +14 -0
- package/dist/commands/instructions/setup.js +72 -0
- package/dist/commands/integrations/execute.js +1 -1
- package/dist/commands/login.d.ts +5 -6
- package/dist/commands/login.js +27 -11
- package/dist/commands/logout.js +7 -7
- package/dist/commands/machines/hosted/start.js +7 -1
- package/dist/commands/machines/list.js +4 -4
- package/dist/commands/measures/confirm.d.ts +1 -7
- package/dist/commands/measures/confirm.js +15 -14
- package/dist/commands/measures/list.d.ts +1 -7
- package/dist/commands/measures/list.js +1 -7
- package/dist/commands/measures/record.js +4 -4
- package/dist/commands/measures/show.d.ts +11 -0
- package/dist/commands/measures/show.js +26 -0
- package/dist/commands/northstars/governance/configure.d.ts +1 -0
- package/dist/commands/northstars/governance/configure.js +8 -1
- package/dist/commands/proposals/discard.d.ts +5 -0
- package/dist/commands/proposals/discard.js +8 -0
- package/dist/commands/proposals/keep.d.ts +5 -0
- package/dist/commands/proposals/keep.js +8 -0
- package/dist/commands/proposals/list.d.ts +15 -0
- package/dist/commands/proposals/list.js +74 -0
- package/dist/commands/proposals/show.d.ts +12 -0
- package/dist/commands/proposals/show.js +27 -0
- package/dist/commands/proposals/snooze.d.ts +5 -0
- package/dist/commands/proposals/snooze.js +8 -0
- package/dist/commands/security/overview.d.ts +11 -0
- package/dist/commands/security/overview.js +158 -0
- package/dist/commands/signals/monitors/create.d.ts +9 -0
- package/dist/commands/signals/monitors/create.js +29 -0
- package/dist/commands/signals/monitors/list.d.ts +8 -0
- package/dist/commands/signals/monitors/list.js +16 -0
- package/dist/commands/signals/monitors/pause.d.ts +11 -0
- package/dist/commands/signals/monitors/pause.js +17 -0
- package/dist/commands/signals/monitors/resume.d.ts +11 -0
- package/dist/commands/signals/monitors/resume.js +17 -0
- package/dist/commands/signals/monitors/revise.d.ts +12 -0
- package/dist/commands/signals/monitors/revise.js +25 -0
- package/dist/commands/signals/monitors/show.d.ts +11 -0
- package/dist/commands/signals/monitors/show.js +17 -0
- package/dist/commands/signals/monitors/test.d.ts +12 -0
- package/dist/commands/signals/monitors/test.js +25 -0
- package/dist/commands/signals/monitors/transitions.d.ts +11 -0
- package/dist/commands/signals/monitors/transitions.js +17 -0
- package/dist/commands/signals/monitors/validate.d.ts +9 -0
- package/dist/commands/signals/monitors/validate.js +24 -0
- package/dist/commands/signals/schemas/list.d.ts +8 -0
- package/dist/commands/signals/schemas/list.js +16 -0
- package/dist/commands/signals/schemas/show.d.ts +11 -0
- package/dist/commands/signals/schemas/show.js +17 -0
- package/dist/commands/signals/sources/list.d.ts +8 -0
- package/dist/commands/signals/sources/list.js +16 -0
- package/dist/commands/signals/sources/receipts.d.ts +11 -0
- package/dist/commands/signals/sources/receipts.js +17 -0
- package/dist/commands/signals/sources/show.d.ts +11 -0
- package/dist/commands/signals/sources/show.js +17 -0
- package/dist/commands/spaces/claim.d.ts +12 -0
- package/dist/commands/spaces/claim.js +42 -0
- package/dist/commands/spaces/ownership.d.ts +12 -0
- package/dist/commands/spaces/ownership.js +46 -0
- package/dist/commands/spaces/usage.d.ts +12 -0
- package/dist/commands/spaces/usage.js +28 -0
- package/dist/commands/spaces/workflows/run.js +3 -0
- package/dist/commands/spaces/workflows/runs.js +2 -1
- package/dist/commands/spaces/workflows/update.d.ts +6 -1
- package/dist/commands/spaces/workflows/update.js +34 -2
- package/dist/commands/tasks/cancel-cascade.js +1 -1
- package/dist/commands/tasks/cascade-status.d.ts +2 -0
- package/dist/commands/tasks/cascade-status.js +27 -1
- package/dist/commands/tasks/create-tree.d.ts +5 -1
- package/dist/commands/tasks/create-tree.js +35 -7
- package/dist/commands/tasks/create.d.ts +4 -0
- package/dist/commands/tasks/create.js +16 -0
- package/dist/commands/tasks/deliverable/add.js +12 -3
- package/dist/commands/tasks/economics-compare.d.ts +15 -0
- package/dist/commands/tasks/economics-compare.js +60 -0
- package/dist/commands/tasks/expectations/evaluate.d.ts +13 -0
- package/dist/commands/tasks/expectations/evaluate.js +43 -0
- package/dist/commands/tasks/interrupt.js +2 -2
- package/dist/commands/tasks/list.d.ts +1 -0
- package/dist/commands/tasks/list.js +44 -1
- package/dist/commands/tasks/pause-schedule.js +1 -1
- package/dist/commands/tasks/show.d.ts +5 -0
- package/dist/commands/tasks/show.js +17 -0
- package/dist/commands/tasks/update.d.ts +4 -0
- package/dist/commands/tasks/update.js +9 -0
- package/dist/commands/tasks/workflow-findings.js +2 -2
- package/dist/commands/token/list.d.ts +3 -5
- package/dist/commands/token/list.js +99 -57
- package/dist/commands/triggers/create.d.ts +2 -0
- package/dist/commands/triggers/create.js +15 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.js +61 -0
- package/dist/commands/workspaces/grants.d.ts +12 -0
- package/dist/commands/workspaces/grants.js +31 -0
- package/dist/commands/workspaces/stewardship.d.ts +13 -0
- package/dist/commands/workspaces/stewardship.js +34 -0
- package/dist/generated/managed-instruction-guides.json +9 -0
- package/dist/hooks/init.d.ts +5 -0
- package/dist/hooks/init.js +27 -0
- package/dist/lib/agent-config.d.ts +0 -12
- package/dist/lib/agent-config.js +1 -27
- package/dist/lib/agent-mailbox.d.ts +35 -0
- package/dist/lib/agent-mailbox.js +55 -0
- package/dist/lib/commitment-endpoints.d.ts +2 -1
- package/dist/lib/commitment-endpoints.js +2 -5
- package/dist/lib/commitment-product.d.ts +3 -1
- package/dist/lib/commitment-product.js +10 -0
- package/dist/lib/commitment-terms.js +1 -1
- package/dist/lib/commitments.d.ts +17 -15
- package/dist/lib/commitments.js +173 -137
- package/dist/lib/compasses.d.ts +14 -0
- package/dist/lib/compasses.js +25 -11
- package/dist/lib/daemon-installer.d.ts +2 -0
- package/dist/lib/daemon-installer.js +100 -24
- package/dist/lib/first-party-harness-doctor.js +31 -1
- package/dist/lib/first-party-harness-remote-install.d.ts +71 -0
- package/dist/lib/first-party-harness-remote-install.js +310 -0
- package/dist/lib/first-party-harness-remote-update.d.ts +46 -0
- package/dist/lib/first-party-harness-remote-update.js +242 -0
- package/dist/lib/first-party-harness-startup-update.d.ts +26 -0
- package/dist/lib/first-party-harness-startup-update.js +166 -0
- package/dist/lib/first-party-harness-update.d.ts +46 -0
- package/dist/lib/first-party-harness-update.js +289 -0
- package/dist/lib/first-party-harness.js +7 -4
- package/dist/lib/grants.d.ts +5 -1
- package/dist/lib/grants.js +9 -1
- package/dist/lib/hosted-machines.d.ts +7 -0
- package/dist/lib/mailbox-human-command.d.ts +11 -0
- package/dist/lib/mailbox-human-command.js +41 -0
- package/dist/lib/managed-instruction-local.d.ts +12 -0
- package/dist/lib/managed-instruction-local.js +58 -0
- package/dist/lib/managed-instruction-setup.d.ts +35 -0
- package/dist/lib/managed-instruction-setup.js +306 -0
- package/dist/lib/measures.d.ts +28 -2
- package/dist/lib/measures.js +38 -14
- package/dist/lib/memory-sync.d.ts +1 -0
- package/dist/lib/memory-sync.js +279 -68
- package/dist/lib/message-intent.d.ts +6 -2
- package/dist/lib/message-intent.js +1 -0
- package/dist/lib/northstars.js +2 -1
- package/dist/lib/platform-update-local.d.ts +2 -0
- package/dist/lib/platform-update-local.js +113 -0
- package/dist/lib/platform-update.d.ts +39 -0
- package/dist/lib/platform-update.js +84 -0
- package/dist/lib/profile-machine-identity-guard.d.ts +2 -0
- package/dist/lib/profile-machine-identity-guard.js +13 -0
- package/dist/lib/prompt.d.ts +1 -0
- package/dist/lib/prompt.js +4 -3
- package/dist/lib/proposal-decision-command.d.ts +19 -0
- package/dist/lib/proposal-decision-command.js +64 -0
- package/dist/lib/proposals.d.ts +8 -0
- package/dist/lib/proposals.js +22 -0
- package/dist/lib/roles.d.ts +141 -6
- package/dist/lib/roles.js +8 -2
- package/dist/lib/signals.d.ts +20 -0
- package/dist/lib/signals.js +24 -0
- package/dist/lib/space-usage.d.ts +3 -0
- package/dist/lib/space-usage.js +17 -0
- package/dist/lib/stewardship-output.d.ts +4 -0
- package/dist/lib/stewardship-output.js +82 -0
- package/dist/lib/task-asset-upload.d.ts +3 -1
- package/dist/lib/task-asset-upload.js +1 -0
- package/dist/lib/task-batch.d.ts +9 -0
- package/dist/lib/task-batch.js +94 -17
- package/dist/lib/task-economics.d.ts +16 -0
- package/dist/lib/task-economics.js +22 -0
- package/dist/lib/task-instruction-offer.d.ts +1 -4
- package/dist/lib/task-instruction-offer.js +3 -129
- package/dist/lib/triggers.d.ts +11 -3
- package/dist/lib/triggers.js +58 -1
- package/dist/lib/update-check.d.ts +61 -53
- package/dist/lib/update-check.js +453 -314
- package/dist/lib/usage-discovery.d.ts +10 -0
- package/dist/lib/usage-discovery.js +24 -3
- package/dist/lib/workflow-run-budget.d.ts +12 -0
- package/dist/lib/workflow-run-budget.js +37 -0
- package/dist/lib/workspaces.d.ts +48 -0
- package/dist/lib/workspaces.js +8 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/cliHandoffWire.d.ts +4 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/cliHandoffWire.js +14 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessChannels.d.ts +3 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessChannels.js +3 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessReleaseKeys.d.ts +82 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessReleaseKeys.js +105 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessUpdater.d.ts +110 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessUpdater.js +945 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/githubPushRefusal.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/githubPushRefusal.js +49 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/harnessPermissionControls.d.ts +32 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/harnessPermissionControls.js +62 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +4 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.js +35 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releasePolicy.d.ts +63 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releasePolicy.js +169 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseVersions.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseVersions.js +44 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/cliHandoffWire.d.ts +4 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/cliHandoffWire.js +12 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessChannels.d.ts +3 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessChannels.js +3 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessReleaseKeys.d.ts +82 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessReleaseKeys.js +102 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessUpdater.d.ts +110 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessUpdater.js +923 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/githubPushRefusal.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/githubPushRefusal.js +44 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/harnessPermissionControls.d.ts +32 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/harnessPermissionControls.js +59 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.js +35 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releasePolicy.d.ts +63 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releasePolicy.js +163 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseVersions.d.ts +2 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseVersions.js +41 -0
- package/dist/node_modules/@skrr-ai/auth-core/package.json +41 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +8069 -7121
- package/docs/v1/README.md +28 -0
- package/docs/v1/api.md +55 -0
- package/docs/v1/changelog.md +16 -0
- package/docs/v1/check-examples.mjs +178 -0
- package/docs/v1/examples/api-readonly.mjs +144 -0
- package/docs/v1/operations.md +87 -0
- package/docs/v1/quickstart.md +71 -0
- package/oclif.manifest.json +49424 -46174
- package/package.json +34 -11
package/README.md
CHANGED
|
@@ -2,6 +2,105 @@
|
|
|
2
2
|
|
|
3
3
|
Command-line interface for OverSky, wrapping the `@skrr-ai/data-provider` client.
|
|
4
4
|
|
|
5
|
+
|
|
6
|
+
## Start here
|
|
7
|
+
|
|
8
|
+
The supported executable is `skrr`. These [versioned developer guides](docs/v1/README.md) are included with the npm package; they do not require access to the private source repository. This guide set was checked against CLI **0.1.95** source on **2026-10-10**. Run `skrr --version` to identify your installed artifact; source availability is not evidence of a published release.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install -g @skrr-ai/cli
|
|
12
|
+
skrr --version
|
|
13
|
+
skrr login --base-url https://skrr.ai
|
|
14
|
+
skrr whoami
|
|
15
|
+
skrr spaces list --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The CLI is the user-facing command; `skrr daemon install` downloads and verifies
|
|
19
|
+
the background runtime when needed. Installing `skrrd` alone does not install
|
|
20
|
+
the CLI. For a user-owned installation without administrator access on macOS
|
|
21
|
+
or Linux, use `npm install -g --prefix "$HOME/.local" @skrr-ai/cli` and add
|
|
22
|
+
`$HOME/.local/bin` to your shell PATH. Verify with `command -v skrr` and
|
|
23
|
+
`skrr --version` in a new terminal.
|
|
24
|
+
|
|
25
|
+
The desktop app includes the CLI and installs its `skrr` wrapper on launch,
|
|
26
|
+
using its bundled interpreter so no separate Node.js installation is needed.
|
|
27
|
+
If your terminal cannot find it, choose **Help > Set Up skrr Command…**.
|
|
28
|
+
This verifies your shell, offers Unix PATH setup, and can copy the full command.
|
|
29
|
+
Existing commands owned by npm or another installer are preserved. Desktop
|
|
30
|
+
updates maintain the bundled wrapper; npm maintains npm installations.
|
|
31
|
+
|
|
32
|
+
The script installer sets up both `skrr` and the signed `skrrd` runtime by
|
|
33
|
+
default and requires Node.js 20+ with npm. To repair a machine that already has
|
|
34
|
+
the runtime, run `bash scripts/install-daemon.sh --cli-only` from this checkout.
|
|
35
|
+
Use `--daemon-only` for runtime images without npm. On Windows the equivalent
|
|
36
|
+
runtime-only switch is `$env:SKRR_INSTALL_DAEMON_ONLY='1'` before running
|
|
37
|
+
`install-daemon.ps1`. These installers use a user-owned npm prefix and leave
|
|
38
|
+
the system/global npm configuration unchanged.
|
|
39
|
+
|
|
40
|
+
`login` first tries a signed-in local daemon, then browser PKCE, then a device code when the callback cannot run. With SSH or no local browser, use `skrr login --device-code`; approve it in a browser on another device. Password, MFA, passkey and configured federation challenges remain on the web sign-in page. The CLI has no password flag.
|
|
41
|
+
|
|
42
|
+
To create your first Task in an existing Space, copy its ID from `spaces list` and run:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
skrr tasks create --space <space-id> --title "My first CLI task" --execution-mode human --external-key onboarding/first-task --json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This creates a Task; it does not start an agent run. Use a Space whose automation is disabled if you are exploring. See the [quickstart](docs/v1/quickstart.md) for scope selection and safe retries, the [public API guide](docs/v1/api.md) for a read-only first API call, and [operations and recovery](docs/v1/operations.md) for credentials, errors, request IDs, quotas and upgrades. `skrr code` runs a coding agent in the current repository and can incur model/compute usage; run it only after choosing that execution context.
|
|
49
|
+
|
|
50
|
+
After installing the CLI, run `skrr login`. On an interactive sign-in, skrr can help set up
|
|
51
|
+
removable managed instructions for the coding agents on your computer. You select each
|
|
52
|
+
provider and choose automatic updates or a fixed current version; installing the CLI alone
|
|
53
|
+
does not change agent instruction files.
|
|
54
|
+
|
|
55
|
+
Run `skrr instructions setup` at any time to revisit provider choices. The setup verifies
|
|
56
|
+
the local daemon's account, server and profile, then previews the real file paths and checks
|
|
57
|
+
whether the agent can read them. Use `--provider codex --review` to inspect the exact content
|
|
58
|
+
without installing. To choose a different machine explicitly, pass `--daemon <id>`.
|
|
59
|
+
|
|
60
|
+
Automation never prompts. For an explicit installation, use
|
|
61
|
+
`skrr instructions setup --provider codex --update-policy latest --yes --json`.
|
|
62
|
+
Use `--update-policy pinned` to keep the current version, or `--review --json` to get a
|
|
63
|
+
read-only preflight. `skrr instructions status` confirms application by the daemon.
|
|
64
|
+
`skrr instructions guide task-management` loads the detailed workflow on demand.
|
|
65
|
+
It works offline and without sign-in, using a canonical guide generated into the CLI release.
|
|
66
|
+
|
|
67
|
+
## Local updates
|
|
68
|
+
|
|
69
|
+
These commands work without a cloud login or connected daemon:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
skrr update --check # CLI, Code and daemon offered versions
|
|
73
|
+
skrr update --status --json # local versions and recorded results; no network
|
|
74
|
+
skrr update # update installed components through their owners
|
|
75
|
+
skrr update --component daemon --restart
|
|
76
|
+
skrr code install # install the signed local Code engine
|
|
77
|
+
skrr code update # update it; existing sessions keep their release
|
|
78
|
+
skrr code update --check
|
|
79
|
+
skrr code rollback # restore the previous verified release
|
|
80
|
+
skrr code update --startup-checks off
|
|
81
|
+
skrr code update --startup-checks on
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Interactive `skrr code` sessions offer **Update and start**, **Skip once**,
|
|
85
|
+
**Skip this version** and **Disable startup checks** when a newer signed release is available. ACP, scripts,
|
|
86
|
+
JSON output, help and noninteractive launches do not display that prompt.
|
|
87
|
+
`SKRR_CODE_UPDATE_CHECK=0` disables startup checks; explicit update commands remain
|
|
88
|
+
available. Use `--daemon <id>` with `code install` or `code update` to target a
|
|
89
|
+
remote machine instead; that path uses account authentication.
|
|
90
|
+
|
|
91
|
+
The CLI automatically queues updates for private, writable, user-owned npm global
|
|
92
|
+
installations and waits for active CLI invocations to finish. Set
|
|
93
|
+
`OVERSKY_CLI_AUTO_UPDATE=0` to keep discovery while disabling automatic application.
|
|
94
|
+
Shared prefixes, Windows npm installations, project dependencies, source checkouts,
|
|
95
|
+
app bundles and runtime images show their owner's update command. Daemon automatic
|
|
96
|
+
updates require an eligible supervised installation with its update monitor enabled;
|
|
97
|
+
the unified status reports the live daemon's recorded posture.
|
|
98
|
+
|
|
99
|
+
Code and daemon rollback obey retained signed minimum versions. Unsigned or tampered
|
|
100
|
+
rollback artifacts cannot be used as verified releases. See the
|
|
101
|
+
[update lifecycle design](../docs/architecture/component-update-lifecycle-2026-10-10.md)
|
|
102
|
+
and the [release runbook](../docs/runbooks/cli-daemon-release.md) for storage and rollout.
|
|
103
|
+
|
|
5
104
|
## Status
|
|
6
105
|
|
|
7
106
|
**Comprehensive CRUD + workflow surface across the OverSky public API.**
|
|
@@ -38,7 +137,7 @@ observability), and shared links.
|
|
|
38
137
|
| **spaces widgets** | `list`, `add`, `remove` |
|
|
39
138
|
| **spaces skills** | `list`, `add`, `remove`, `pin` |
|
|
40
139
|
| **spaces labels** | `list`, `add`, `remove` (attach/detach; filter with `spaces list --label`) |
|
|
41
|
-
| **labels** | `list`, `palette`, `create`, `update`, `archive`, `restore`, `delete`, `reorder` (unified labels across `user` and `workspace` scopes)
|
|
140
|
+
| **labels** | `list`, `palette`, `create`, `update`, `archive`, `restore`, `delete`, `reorder` (unified labels across `user` and `workspace` scopes) |
|
|
42
141
|
| **chats triggers** | `show`, `set` |
|
|
43
142
|
| **dm** | `list`, `show`, `messages`, `threads`, `thread show/messages/follow/mute/share`, `send` (agent 1:1 main chat and Slack-style Thread controls) |
|
|
44
143
|
| **diagnostics** | `context`, `doctor`, `usage`, `commands` (agent-friendly runtime identity, readiness, progressive token-budgeted discovery, and complete machine-readable schemas) |
|
|
@@ -53,7 +152,7 @@ observability), and shared links.
|
|
|
53
152
|
| **tasks result** | `submit`, `show` (immutable Result versions and exact Review state) |
|
|
54
153
|
| **tasks resource** | `add`, `list` (versioned inputs, references, evidence, attachments, and Deliverables) |
|
|
55
154
|
| **tasks deliverable** | `add`, `list`, `confirm` (the user-facing produced-Resource workflow) |
|
|
56
|
-
| **tasks labels** | `list`, `create`, `delete`, `attach`, `detach`, `suggest` (label vocabulary + per-task attachment; `suggest` asks the model to pick from the declared vocabulary, advisory only)
|
|
155
|
+
| **tasks labels** | `list`, `create`, `delete`, `attach`, `detach`, `suggest` (label vocabulary + per-task attachment; `suggest` asks the model to pick from the declared vocabulary, advisory only) |
|
|
57
156
|
| **tasks approvals** | `list`, `create`, `delete`, `resolve` |
|
|
58
157
|
| **tasks attachments** | `list`, `delete`, `upload`, `download` |
|
|
59
158
|
| **integrations** | `toolkits`, `search`, `execute`, `tools list`, `tools allow`, `connections connect`, `connections list`, `connections finalize`, `connections disconnect`, `connections reconnect` |
|
|
@@ -66,27 +165,27 @@ observability), and shared links.
|
|
|
66
165
|
Recent conversations, optionally scoped to one agent, then the transcript:
|
|
67
166
|
|
|
68
167
|
```bash
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
168
|
+
skrr convos list --limit 10 # id, title, agent, updated
|
|
169
|
+
skrr convos list --agent <agent-id> # server-side agent scope
|
|
170
|
+
skrr convos list --search "login bug" --json # Meilisearch-backed
|
|
171
|
+
skrr messages list -c <convo-id> --limit 20 # newest 20 (default: whole transcript)
|
|
172
|
+
skrr messages show <convo-id> <message-id> # one message, full body
|
|
74
173
|
```
|
|
75
174
|
|
|
76
175
|
Tasks, and what the agent actually produced:
|
|
77
176
|
|
|
78
177
|
```bash
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
178
|
+
skrr tasks list --assignee-agent <agent-id> # what this agent is working on
|
|
179
|
+
skrr tasks show <task-id> # includes the Convo: pointer
|
|
180
|
+
skrr tasks result show <task-id> # current Result + exact Review
|
|
181
|
+
skrr tasks transcript <task-id> --assistant-only # full agent transcript, no prompt
|
|
182
|
+
skrr tasks comments list <task-id> # raw comment thread
|
|
84
183
|
```
|
|
85
184
|
|
|
86
185
|
One agent's recent work across all three surfaces:
|
|
87
186
|
|
|
88
187
|
```bash
|
|
89
|
-
|
|
188
|
+
skrr agents activity <agent-id> --limit 10 # merged DM + conversations + tasks feed
|
|
90
189
|
```
|
|
91
190
|
|
|
92
191
|
`--agent` / `agents activity` need a server that implements `?agentId=` on
|
|
@@ -96,7 +195,7 @@ conversations, and `agents activity` filters locally with a printed caveat.
|
|
|
96
195
|
|
|
97
196
|
### Production CLI Contract
|
|
98
197
|
|
|
99
|
-
|
|
198
|
+
skrr CLI is designed for both humans and daemon agents. New commands should
|
|
100
199
|
preserve these contracts:
|
|
101
200
|
|
|
102
201
|
- Positional args never read from stdin implicitly. Every `Args.string` must
|
|
@@ -107,21 +206,21 @@ preserve these contracts:
|
|
|
107
206
|
in JSON mode.
|
|
108
207
|
- Commands that accept `--from-json` also expose `--json`; typed flags override
|
|
109
208
|
JSON fields on conflict.
|
|
110
|
-
- Agent runtime scripts start with `
|
|
209
|
+
- Agent runtime scripts start with `skrr context --json`, then `skrr usage --json`.
|
|
111
210
|
It is the recommended command-discovery bootstrap: the overview is generated
|
|
112
211
|
from the oclif manifest and stays within a small token budget. Read exactly
|
|
113
|
-
the relevant reference next with `
|
|
114
|
-
`
|
|
212
|
+
the relevant reference next with `skrr usage tasks --json` (or the convenient
|
|
213
|
+
`skrr tasks usage --json` form), then use `skrr commands --schema "tasks list"`
|
|
115
214
|
only when the selected command needs its complete flag contract. Use
|
|
116
|
-
`
|
|
215
|
+
`skrr doctor --json` for auth/build readiness and `skrr commands --audit --json`
|
|
117
216
|
for command-surface hygiene.
|
|
118
217
|
- Side-effecting commands use explicit idempotency keys only when the caller
|
|
119
218
|
owns retry coordination. Daemon session commands derive stable defaults when
|
|
120
|
-
possible, such as `
|
|
219
|
+
possible, such as `skrr agent message send --text "..."`.
|
|
121
220
|
|
|
122
221
|
### Agent-initiated app voice calls
|
|
123
222
|
|
|
124
|
-
`
|
|
223
|
+
`skrr agent call` is a session-only consent flow, not a phone dialer. It reads
|
|
125
224
|
the Agent identity and owner target from `OVERSKY_SESSION_TOKEN`,
|
|
126
225
|
`OVERSKY_SESSION_ID`, and `OVERSKY_SESSION_AGENT_ID`; no flag or JSON field can
|
|
127
226
|
select another person. The user receives an in-app/push invitation and must
|
|
@@ -129,14 +228,14 @@ accept it before the normal LiveKit call is created.
|
|
|
129
228
|
|
|
130
229
|
```bash
|
|
131
230
|
# From an autonomous daemon session
|
|
132
|
-
|
|
231
|
+
skrr agent call request \
|
|
133
232
|
--reason "The production rollback decision needs you." \
|
|
134
233
|
--conversation <conversation-id> \
|
|
135
234
|
--expires-in 120 \
|
|
136
235
|
--json
|
|
137
236
|
|
|
138
|
-
|
|
139
|
-
|
|
237
|
+
skrr agent call show <call-id> --json
|
|
238
|
+
skrr agent call cancel <call-id> --json
|
|
140
239
|
```
|
|
141
240
|
|
|
142
241
|
The request is idempotent. With no explicit `--idempotency-key`, Sky derives a
|
|
@@ -152,12 +251,12 @@ default Sky CLI capability.
|
|
|
152
251
|
Run the hygiene audit before publishing CLI changes:
|
|
153
252
|
|
|
154
253
|
```bash
|
|
155
|
-
|
|
254
|
+
skrr commands --audit --json
|
|
156
255
|
```
|
|
157
256
|
|
|
158
257
|
### PSTN phone calls (Phase 2)
|
|
159
258
|
|
|
160
|
-
`
|
|
259
|
+
`skrr agent phone-call request --purpose "…"` is an explicit, autonomous-
|
|
161
260
|
session-only command. It does not accept a phone number, carrier setting,
|
|
162
261
|
caller ID, or recording option; the server derives the owner and agent and
|
|
163
262
|
uses only that owner's verified endpoint plus active, renewable consent.
|
|
@@ -179,9 +278,8 @@ or intentionally not exposed as request/response APIs:
|
|
|
179
278
|
has no SSE/WebSocket adapter — the node-adapter is pure request/response.
|
|
180
279
|
Chat streaming would need a separate client layer (Socket.io client + event
|
|
181
280
|
plumbing). This does not include persistent main-chat DM sends; use
|
|
182
|
-
`
|
|
183
|
-
- **
|
|
184
|
-
`twoFAPending`. The server supports these; the CLI does not.
|
|
281
|
+
`skrr agent message send --text "..." --json` for that agent-facing path.
|
|
282
|
+
- **Authentication**: browser/device-code sign-in delegates configured MFA, passkey and federation to the web sign-in page. There is no CLI password flow. See [authentication and revocation](docs/v1/operations.md#authentication-and-revocation).
|
|
185
283
|
- **Message delete**: `DELETE /api/messages/:convoId/:messageId` — server
|
|
186
284
|
only.
|
|
187
285
|
- **Tests**: the CLI has focused Jest coverage, but broader command/API
|
|
@@ -193,13 +291,15 @@ or intentionally not exposed as request/response APIs:
|
|
|
193
291
|
## Prerequisites
|
|
194
292
|
|
|
195
293
|
- Node.js 20+
|
|
196
|
-
-
|
|
294
|
+
- An account on your deployment (default: `https://skrr.ai`; `--env local` selects the configured local API)
|
|
197
295
|
- `@skrr-ai/data-provider` must be built — it's a workspace dep and the CLI
|
|
198
296
|
imports from its `dist/`
|
|
199
297
|
|
|
200
298
|
## Install
|
|
201
299
|
|
|
202
|
-
|
|
300
|
+
For end users: `npm install -g @skrr-ai/cli`. The package vendors its private workspace dependencies.
|
|
301
|
+
|
|
302
|
+
For contributors with a checkout, build from the repository root:
|
|
203
303
|
|
|
204
304
|
```bash
|
|
205
305
|
# 1. Install workspace deps (picks up cli/ because it was added to the root
|
|
@@ -228,8 +328,8 @@ From `cli/`:
|
|
|
228
328
|
Or globally, after `npm link` from `cli/`:
|
|
229
329
|
|
|
230
330
|
```bash
|
|
231
|
-
|
|
232
|
-
|
|
331
|
+
skrr login
|
|
332
|
+
skrr convos list --json
|
|
233
333
|
```
|
|
234
334
|
|
|
235
335
|
## GitHub tools from local runtimes
|
|
@@ -348,142 +448,48 @@ to `dist/` and the next invocation picks up the change.
|
|
|
348
448
|
|
|
349
449
|
## Commands
|
|
350
450
|
|
|
351
|
-
### `
|
|
352
|
-
|
|
353
|
-
Sign in to an OverSky instance.
|
|
451
|
+
### `skrr login`
|
|
354
452
|
|
|
355
|
-
|
|
356
|
-
daemon is authenticated, every `sky` command silently auto-brokers a
|
|
357
|
-
sibling cli-scope token on first use — no `sky login`, no browser, no
|
|
358
|
-
device code, no user interaction whatsoever. See
|
|
359
|
-
[Auto-broker on first use](#auto-broker-on-first-use) below.
|
|
360
|
-
|
|
361
|
-
**When `sky login` is still useful:**
|
|
362
|
-
|
|
363
|
-
- You want to log in to a DIFFERENT account than the daemon
|
|
364
|
-
- You want to log in to a DIFFERENT server (`--base-url <url>`)
|
|
365
|
-
- The daemon isn't installed / isn't running, and you want sky alone
|
|
366
|
-
- You want to force a re-authentication (e.g. revoked refresh family)
|
|
367
|
-
|
|
368
|
-
**Behavior when invoked explicitly:**
|
|
369
|
-
|
|
370
|
-
- If the daemon is authed for the same server, `sky login` brokers the
|
|
371
|
-
handoff (still no browser).
|
|
372
|
-
- If the daemon is not running or not authed, the CLI runs its own
|
|
373
|
-
PKCE-localhost OAuth flow (popping your browser); device-code is the
|
|
374
|
-
secondary fallback (SSH, port-bind failure, `--device-code`).
|
|
453
|
+
Sign in to a deployment and profile. The order is a local daemon broker, browser PKCE with a localhost callback, then device code when the browser callback cannot run. `--device-code` skips both the broker and callback. A declined sign-in is not automatically retried through a different flow.
|
|
375
454
|
|
|
376
455
|
```bash
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
456
|
+
skrr login --base-url https://skrr.ai
|
|
457
|
+
skrr login --device-code
|
|
458
|
+
skrr login --profile reviewer --env dev
|
|
380
459
|
```
|
|
381
460
|
|
|
382
|
-
|
|
383
|
-
`~/.sky/config.json` and reused until you override it again.
|
|
384
|
-
|
|
385
|
-
Flags:
|
|
386
|
-
|
|
387
|
-
- `-u, --base-url <url>` — API base URL to save and use
|
|
388
|
-
- `--device-code` — force the device-code flow (also skips the
|
|
389
|
-
daemon broker pre-flight)
|
|
390
|
-
- `--port <n>` — pin the localhost callback port (PKCE flow)
|
|
391
|
-
- `--scope <cli|daemon>` — token scope (default `cli`)
|
|
392
|
-
- `--recovery-code <code>` — non-interactive sign-in with a printable
|
|
393
|
-
recovery code
|
|
394
|
-
|
|
395
|
-
Env overrides:
|
|
461
|
+
Configuration lives in `~/.skrr/cli-config.json`, or `~/.skrr/profiles/<name>/cli-config.json`. `SKRR_CONFIG_DIR` / `OVERSKY_CONFIG_DIR` can set a different root. Credentials live in the macOS Keychain or `cli-auth.json` (0600), not the legacy `~/.sky/config.json`; that path is read only for migration. Sessions are bound to their issuing server.
|
|
396
462
|
|
|
397
|
-
- `
|
|
398
|
-
- `OVERSKY_FORCE_DEVICE_CODE=1` — same as `--device-code`
|
|
399
|
-
- `OVERSKY_REFRESH_TOKEN=...` + `OVERSKY_CLI_ID=...` — non-interactive
|
|
400
|
-
restore from a backed-up refresh token
|
|
463
|
+
The web sign-in page handles password, two-factor, passkey and configured federation. The CLI never receives the password. `--recovery-code` redeems a printable recovery code; it can still require a confirmation step and is not an unattended CI credential. For a saved refresh family use `OVERSKY_REFRESH_TOKEN` with its matching `OVERSKY_CLI_ID`; a successful restore rotates the token, so do not reuse a bundle across machines or jobs.
|
|
401
464
|
|
|
402
|
-
|
|
403
|
-
PKCE / device-code flows. (The recovery-code path is unaffected.)
|
|
465
|
+
`OVERSKY_SKIP_DAEMON_BROKER=1` skips the broker. `SKRR_SKIP_DAEMON_HANDOFF=1` skips the optional post-login daemon setup. They control different steps. Login does not require installing the daemon for workspace/API management.
|
|
404
466
|
|
|
405
467
|
### Auto-broker on first use
|
|
406
468
|
|
|
407
|
-
|
|
408
|
-
`generate-recovery-code`) runs the daemon-broker handoff transparently
|
|
409
|
-
when no token is in the keychain. So:
|
|
469
|
+
A human command with no stored session may adopt a durable CLI family through a signed-in daemon on the same deployment. It is stored and renews independently, so a daemon restart does not sign out the CLI. Revoking that daemon also revokes the families delegated through it. If durable adoption is unavailable, the command can borrow a short-lived token for that invocation.
|
|
410
470
|
|
|
411
|
-
|
|
412
|
-
oversky login # authenticate the daemon, once
|
|
413
|
-
sky tasks list # silently auto-brokers, persists, runs
|
|
414
|
-
sky tasks list --json # uses the persisted token, no broker call
|
|
415
|
-
sky whoami # confirms identity from the persisted token
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
There is no opt-in flag. The mechanism is the long-term default.
|
|
419
|
-
|
|
420
|
-
**Skip rules** — auto-broker does NOT fire when any of these hold:
|
|
471
|
+
`--bare`, injected `OVERSKY_TOKEN` / `SKRR_TOKEN` / `OVERSKY_REFRESH_TOKEN`, and `OVERSKY_SKIP_DAEMON_BROKER=1` disable automatic brokering. `SKRR_NO_CLI_SESSION_ADOPTION=1` disables durable adoption. Agent/tool children only borrow and never read or persist the person's session. Their login/logout commands are refused.
|
|
421
472
|
|
|
422
|
-
|
|
423
|
-
- `OVERSKY_TOKEN` or `OVERSKY_REFRESH_TOKEN` env vars are set (operator
|
|
424
|
-
controls auth out-of-band — CI runners, ephemeral containers)
|
|
425
|
-
- `OVERSKY_SKIP_DAEMON_BROKER=1` (explicit escape hatch for debugging
|
|
426
|
-
or testing the PKCE flow itself)
|
|
427
|
-
- The command is one of `login`, `logout`,
|
|
428
|
-
`generate-recovery-code` — these manage their own auth lifecycle
|
|
473
|
+
After `skrr logout`, durable adoption remains off until explicit login, although the daemon can still lend a short-lived token. On a Dedicated Runtime, the platform-managed hand-off can continue providing access after the person's own local credential is cleared.
|
|
429
474
|
|
|
430
|
-
|
|
431
|
-
its bootstrap file, or the daemon isn't authenticated, the auto-broker
|
|
432
|
-
fails quietly and the command's normal `requireAuth()` produces the
|
|
433
|
-
familiar "Not signed in. Run `sky login` first." error. The one case
|
|
434
|
-
that gets a louder hint is baseURL mismatch, since the fix is precise:
|
|
435
|
-
|
|
436
|
-
```
|
|
437
|
-
[sky] Local oversky daemon is logged in to http://localhost:3080, but sky
|
|
438
|
-
is configured for https://oversky.ai. Run `sky login --base-url http://localhost:3080`
|
|
439
|
-
to use the daemon.
|
|
440
|
-
Not signed in. Run `sky login` first.
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
### Daemon-as-broker handoff
|
|
444
|
-
|
|
445
|
-
Mechanism for "logged-in daemon implies logged-in sky":
|
|
446
|
-
|
|
447
|
-
1. `sky login` reads the daemon's bootstrap file:
|
|
448
|
-
- macOS: `~/Library/Application Support/OverSky/daemon-island.<profile>.json`
|
|
449
|
-
- Linux/Windows: `~/.oversky/profiles/<profile>/daemon-island.json`
|
|
450
|
-
(pre-Phase-K fallback: `~/.oversky/daemon-island.json`)
|
|
451
|
-
2. CLI POSTs to `http://127.0.0.1:<port>/v1/auth/cli-handoff` with the
|
|
452
|
-
bootstrap secret as `Authorization: Bearer ...` and the requested
|
|
453
|
-
cliId in the body.
|
|
454
|
-
3. Daemon's loopback handler (`daemon/src/auth/cliHandoff.ts`) forwards
|
|
455
|
-
to the server's `POST /api/daemons/cli-handoff` using the daemon's
|
|
456
|
-
own bearer as proof of "this user is already authenticated here".
|
|
457
|
-
4. Server mints a **fresh cli-scope refresh family** (independent
|
|
458
|
-
rotation, distinct revocation, blast-radius isolated from the
|
|
459
|
-
daemon) bound to the supplied cliId.
|
|
460
|
-
5. CLI persists via the canonical `writeToBackend()` — Keychain on
|
|
461
|
-
macOS, `cli-auth.json` elsewhere.
|
|
462
|
-
|
|
463
|
-
Trust model is the same same-UID loopback fence the Socket.IO server
|
|
464
|
-
uses: any attacker who can read the 0600 bootstrap file can already
|
|
465
|
-
read the daemon's keychain. CI tokens are refused at the server
|
|
466
|
-
(daemon bootstrapped from `osk_ci_*` cannot auto-elevate to CLI).
|
|
467
|
-
|
|
468
|
-
### `sky logout`
|
|
469
|
-
|
|
470
|
-
Sign out and clear the saved token. The `baseURL` is preserved so the next
|
|
471
|
-
`sky login` defaults to the same host.
|
|
475
|
+
### `skrr logout`
|
|
472
476
|
|
|
473
477
|
```bash
|
|
474
|
-
|
|
478
|
+
skrr logout
|
|
479
|
+
skrr logout --all-devices
|
|
475
480
|
```
|
|
476
481
|
|
|
477
|
-
The
|
|
478
|
-
|
|
482
|
+
The first command revokes this CLI refresh family best-effort and clears its local Keychain/file credential. It keeps the server, CLI identity and daemon's separate sign-in. The second also enumerates and revokes registered daemon resources, including their delegated CLI families. Independent CLI families created by browser/device code on other machines, and personal access tokens, require their own session/token revocation controls; this flag does not promise account-wide revocation of every credential type. If remote revocation fails, local cleanup still runs and the CLI reports the incomplete sweep.
|
|
483
|
+
|
|
484
|
+
For CI, use expiring `osk_pat_*` personal access tokens through `SKRR_TOKEN`. `osk_ci_*` tokens only bootstrap a daemon. Space-scoped `osk_live_*` / `osk_test_*` keys authenticate the public `/v1` API, a different API from the workspace CLI's `/api` routes. See [operations and recovery](docs/v1/operations.md).
|
|
479
485
|
|
|
480
|
-
### `
|
|
486
|
+
### `skrr whoami`
|
|
481
487
|
|
|
482
488
|
Show the currently signed-in user.
|
|
483
489
|
|
|
484
490
|
```bash
|
|
485
|
-
|
|
486
|
-
|
|
491
|
+
skrr whoami
|
|
492
|
+
skrr whoami --json
|
|
487
493
|
```
|
|
488
494
|
|
|
489
495
|
### `sky convos list`
|
|
@@ -892,6 +898,17 @@ sky spaces unarchive <space-id>
|
|
|
892
898
|
sky spaces archive <space-id> --json
|
|
893
899
|
```
|
|
894
900
|
|
|
901
|
+
### `sky spaces claim <id>`
|
|
902
|
+
|
|
903
|
+
An eligible editor can claim an ownerless Space. The longest-standing editor
|
|
904
|
+
can claim immediately; any editor can claim after seven days. The server
|
|
905
|
+
enforces eligibility at claim time.
|
|
906
|
+
|
|
907
|
+
```bash
|
|
908
|
+
sky spaces claim <space-id>
|
|
909
|
+
sky spaces claim OSK-S-12 --json
|
|
910
|
+
```
|
|
911
|
+
|
|
895
912
|
### `sky spaces` — subspaces (parent / child hierarchy)
|
|
896
913
|
|
|
897
914
|
Spaces form a tree. Each space tracks `parentSpaceId`, the materialized
|
|
@@ -1908,25 +1925,20 @@ delete commands refuse to prompt and exit with code 7 unless `--yes` is
|
|
|
1908
1925
|
passed. This prevents the CLI from hanging forever waiting on input that
|
|
1909
1926
|
will never arrive.
|
|
1910
1927
|
|
|
1911
|
-
##
|
|
1928
|
+
## Configuration and credentials
|
|
1912
1929
|
|
|
1913
|
-
|
|
1914
|
-
created with mode `0700` and the file with mode `0600`, so it's readable only
|
|
1915
|
-
by your user account.
|
|
1930
|
+
The active config root is `~/.skrr`, with `cli-config.json` for the default profile and `profiles/<name>/cli-config.json` for a named profile. `SKRR_CONFIG_DIR` (preferred) / `OVERSKY_CONFIG_DIR` can override it. The legacy `~/.sky/config.json` is read only as a migration input.
|
|
1916
1931
|
|
|
1917
|
-
| Field
|
|
1918
|
-
|
|
|
1919
|
-
| `baseURL`
|
|
1920
|
-
| `
|
|
1921
|
-
| `
|
|
1922
|
-
| `
|
|
1923
|
-
| `email` | Signed-in user email, cached for display |
|
|
1932
|
+
| Field | Description |
|
|
1933
|
+
| --- | --- |
|
|
1934
|
+
| `baseURL` | Issuing deployment, e.g. `https://skrr.ai` |
|
|
1935
|
+
| `cliId` / `profileCliId` | Machine/profile identity used to bind refresh sessions |
|
|
1936
|
+
| `credentials.store` | Credential backend posture, such as automatic Keychain/file or env-only |
|
|
1937
|
+
| `adoptDaemonSession` | Whether human commands may durably adopt a session through the daemon |
|
|
1924
1938
|
|
|
1925
|
-
|
|
1939
|
+
Session secrets live in the macOS Keychain or profile-local `cli-auth.json` (0600), not normal config fields. Environment/flag/helper credentials outrank stored sessions and do not refresh. Agent children never read the person's stored session. Use `skrr whoami` to inspect the actual source.
|
|
1926
1940
|
|
|
1927
|
-
|
|
1928
|
-
rm ~/.sky/config.json
|
|
1929
|
-
```
|
|
1941
|
+
Use `skrr logout` to revoke and clear the local CLI session, and explicit session/token management for broader revocation. Deleting a legacy config file does not clear Keychain credentials, revoke a remote family, or stop daemon-provided access. See [authentication and revocation](docs/v1/operations.md#authentication-and-revocation).
|
|
1930
1942
|
|
|
1931
1943
|
## Architecture notes
|
|
1932
1944
|
|
|
@@ -1935,11 +1947,9 @@ code is a Node-native HttpAdapter that satisfies the `HttpAdapter` interface
|
|
|
1935
1947
|
the data-provider exposes for non-browser consumers.
|
|
1936
1948
|
|
|
1937
1949
|
- **`src/base-command.ts`** — every command extends `BaseCommand`, which in
|
|
1938
|
-
`init()` loads
|
|
1939
|
-
`setHttpAdapter()` on the data-provider, and exposes `requireAuth()` and
|
|
1940
|
-
`handleApiError()` for subclasses.
|
|
1950
|
+
`init()` loads profile configuration, resolves the effective credential, calls `setBaseURL()` and `setHttpAdapter()` on the data-provider, and exposes `requireAuth()` and `handleApiError()` for subclasses.
|
|
1941
1951
|
- **`src/lib/node-adapter.ts`** — implements `HttpAdapter` using Node 20's
|
|
1942
|
-
global `fetch`. Injects the
|
|
1952
|
+
global `fetch`. Injects the resolved credential on every request,
|
|
1943
1953
|
transparently handles 401 → refresh → retry (mirroring the browser
|
|
1944
1954
|
interceptor minus the `window.location` redirect), and surfaces server
|
|
1945
1955
|
errors as `Error` instances with `status` and `body` properties.
|
package/bin/run.js
CHANGED
|
@@ -13,6 +13,38 @@ try {
|
|
|
13
13
|
|
|
14
14
|
const path = require('node:path');
|
|
15
15
|
const { spawnSync } = require('node:child_process');
|
|
16
|
+
|
|
17
|
+
// Enter the installation's session gate before loading any package modules.
|
|
18
|
+
// The copy outside node_modules remains available while npm replaces files.
|
|
19
|
+
// npm still owns the executable itself; its one-time initial migration and
|
|
20
|
+
// clients from older releases cannot participate in this cooperative gate.
|
|
21
|
+
try {
|
|
22
|
+
const fs = require('node:fs');
|
|
23
|
+
const os = require('node:os');
|
|
24
|
+
const crypto = require('node:crypto');
|
|
25
|
+
const packageRoot = path.resolve(__dirname, '..');
|
|
26
|
+
const key = crypto.createHash('sha256').update(packageRoot).digest('hex').slice(0, 24);
|
|
27
|
+
const runtimeDirectory = path.join(os.homedir(), '.skrr', 'cli-update-runtime', key);
|
|
28
|
+
const bootstrap = path.join(runtimeDirectory, 'bootstrap-v1.cjs');
|
|
29
|
+
if (!fs.existsSync(bootstrap)) {
|
|
30
|
+
fs.mkdirSync(runtimeDirectory, { recursive: true, mode: 0o700 });
|
|
31
|
+
const temporary = `${bootstrap}.${process.pid}.tmp`;
|
|
32
|
+
fs.copyFileSync(path.join(__dirname, 'update-session.cjs'), temporary);
|
|
33
|
+
fs.chmodSync(temporary, 0o600);
|
|
34
|
+
fs.renameSync(temporary, bootstrap);
|
|
35
|
+
}
|
|
36
|
+
require(bootstrap).registerSession(packageRoot);
|
|
37
|
+
process.env.SKRR_CLI_UPDATE_SESSION_REGISTERED = String(process.pid);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
if (error && error.code === 'CLI_UPDATE_BUSY') {
|
|
40
|
+
console.error(`[skrr] ${error.message}`);
|
|
41
|
+
process.exit(75);
|
|
42
|
+
}
|
|
43
|
+
// Failure to record a session disables the automatic updater in this
|
|
44
|
+
// invocation. A read-only home must not break ordinary CLI commands.
|
|
45
|
+
process.env.SKRR_CLI_UPDATE_SESSION_UNAVAILABLE = '1';
|
|
46
|
+
}
|
|
47
|
+
|
|
16
48
|
const { findAlternateCli, missingLocalCommandBuild } = require('./dev-fallback');
|
|
17
49
|
|
|
18
50
|
/**
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Park before npm executes. The parent publishes this process group's durable
|
|
4
|
+
// mutation ownership before authorizing execution, closing its crash window.
|
|
5
|
+
const fs = require('node:fs');
|
|
6
|
+
const { spawn } = require('node:child_process');
|
|
7
|
+
const requestFile = process.argv[2];
|
|
8
|
+
const request = JSON.parse(fs.readFileSync(requestFile, 'utf8'));
|
|
9
|
+
const deadline = Date.now() + 30000;
|
|
10
|
+
const timer = setInterval(() => {
|
|
11
|
+
let authorization;
|
|
12
|
+
try {
|
|
13
|
+
authorization = JSON.parse(fs.readFileSync(`${requestFile}.go`, 'utf8'));
|
|
14
|
+
} catch {
|
|
15
|
+
/* still parked */
|
|
16
|
+
}
|
|
17
|
+
if (authorization?.pid === process.pid && authorization?.token === request.token) {
|
|
18
|
+
clearInterval(timer);
|
|
19
|
+
const child = spawn(request.npmPath, ['install', '-g', `@skrr-ai/cli@${request.version}`], {
|
|
20
|
+
stdio: 'inherit',
|
|
21
|
+
shell: process.platform === 'win32',
|
|
22
|
+
});
|
|
23
|
+
child.once('error', () => {
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
});
|
|
26
|
+
child.once('exit', (code) => {
|
|
27
|
+
process.exitCode = code ?? 1;
|
|
28
|
+
});
|
|
29
|
+
} else if (Date.now() >= deadline) {
|
|
30
|
+
clearInterval(timer);
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
}
|
|
33
|
+
}, 20);
|