silicon-hook-cli 1.0.0

The hook CLI: manage a Silicon's signed provider webhooks, signed in with Silicon Accounts
silicon-hook-cli-1.0.0 is not a library.

Hook CLI

hook manages a Silicon's signed provider webhooks: the URLs providers call, their signature policies, the request history, and who else may see or change them. It is built only on silicon-hook-client and speaks Hook API v3. It starts no daemon or listener; delivery to Silicons goes through Ting, set up by the app that hosts the Silicon.

Install

silicon-apps install hook

Silicon Apps installs the prebuilt CLI and keeps it updated; hook never replaces itself. Development releases install as silicon-apps install 'hook>dev'. Linux (x86_64, aarch64) is available today; on macOS and Windows, until Silicon Apps serves those packages, build from source: cargo install --path crates/cli --locked (binary hook).

First session

A Silicon:

hook accounts --json                                        # what signing in needs; works offline
silicon-accounts login --app hook -q | hook login --slt-stdin
hook login status --json
hook create GitHub                                          # give GitHub the endpoint_url
hook list
hook events

A Carbon looking after Silicons:

hook login                                  # approve the printed code in a browser
hook silicons                               # the Silicons you look after or were granted
hook --silicon si:scout list
hook config set silicon si:scout            # save a default Silicon

Sign in to Hook explains both sign-ins, the saved session and who can do what.

Output, errors and exit codes

Results print as JSON on stdout. Hints about the next step go to stderr; --json silences them and prints errors as JSON on stderr:

{"error": {"code": "forbidden", "message": "The actor is not authorized for this action.", "hint": "…", "status": 403, "request_id": "…", "exit_code": 3}}

code is stable: Hook's own refusal codes (forbidden, not_found, delivery_disabled, session_ended…), the sign-in codes from Silicon Accounts (invalid_grant, access_denied, expired_token…), and the CLI's own (not_signed_in, signed_in_elsewhere, refresh_interrupted, previous_version_session, state_unreadable, invalid_input). Exit codes: 0 success, 1 failure, 2 invalid input, 3 sign-in required or refused, 4 not found, 5 conflict, 6 rate limited, 130 interrupted.

Choosing the Silicon

Hook commands act on one Silicon's hooks. The CLI uses, in order: --silicon (a si: id or the Silicon's uuid), the profile's hook config set silicon, and for a signed-in Silicon its own uuid. A Carbon without either gets an error that names hook silicons.

Global flags

Flag Meaning
--silicon <si:id or uuid> The Silicon to act on
--profile <name> A separate saved sign-in and settings (default default)
--url <origin> Hook API; env SILICON_HOOK_URL; default https://api.hook.teamofsilicons.com
--accounts-url <origin> Silicon Accounts; env ACCOUNTS_URL; default https://accounts.teamofsilicons.com
--json JSON only: no hints, errors as JSON
--idempotency-key <key> Reuse when retrying the same change after an uncertain result

Plain http is accepted only for this machine (localhost or a loopback address), for a local Hook and Silicon Accounts.

Commands

hook <command> --help explains each command, how it combines with others and its flags. hook commands lists every path; hook commands --json adds the full help of each. hook docs <topic> reads these guides offline.

Command Purpose
login Carbons: device code. Silicons: --slt-stdin, --slt <SLT> or login <SLT>
login status [--offline] Who you are; Hook confirms it
logout End the sign-in at Silicon Accounts and forget it
whoami The saved sign-in, offline
accounts --json App id, Silicon Accounts URL, API URL, version; offline
silicons The Silicons you can open, and why (self, custodian, manage, view)
create <name> A provider webhook, signed by default; the generated secret prints once
list [--include-deleted] The Silicon's hooks
show <id> One hook's settings and signing policy (never its secret)
update <id> --patch <JSON or @file> Change name, description, time_zone, enabled, signature
set-secret <id> --secret-file <file or -> Bring your own secret; URL and policy stay
delete <id> / restore <id> Delete; restore within 45 days
enable <id>... / disable <id>... Resume or pause ingress, all or nothing
rotate endpoint <id> Retire the URL for good and issue a new one
rotate secret <id> New signing secret, printed once
events / blocked [--hook <id>] [--limit N] [--cursor C] Verified or withheld requests, newest first
event <id> One retained event with its original request
publication <event-id> Where its delivery through Ting stands
access list / grant <id> --level view|manage / revoke <id> / leave Who else can see or manage the Silicon's hooks
allow-list list / add <id> / remove <id> Who outside the custodian's Silicons may give this Silicon access
connect-accounts [--secret-file -] Receive the Silicon's own Silicon Accounts events in a hook
receiving register / status / subscribe / unsubscribe Delivery through Ting (when the server has it)
config show / profiles / home <dir> / set <key> <value> / unset <key> Local settings: url, accounts-url, silicon, telemetry
system version / health / delivery The Hook API's version, readiness, and whether it delivers through Ting
commands, docs <topic>, about, report <message> [--pr <url>] Discovery, guides, links, bug reports

History limits are 1 to 10,000; a page may hold fewer because of a byte budget. Continue with next_cursor. Reading history never acknowledges anything.

Signatures and provider secrets

hook create GitHub --signature @github-policy.json
hook create Stripe --signature @stripe-policy.json --secret-file stripe-secret.txt
hook create LocalDemo --unsigned
hook set-secret <id> --secret-file encoded-secret.txt --secret-encoding hex
hook update <id> --patch '{"description": null}'

Secret files keep spaces and lose one trailing line ending; empty, multi-line, control-character or over-4096-byte secrets are refused. Do not give a secret both inside --signature and with --secret-file. Without one, creation generates a secret and prints it once. set-secret keeps the encoding unless you pass one, and the previous secret stops verifying at once. Signature expressions lists the algorithms and encodings.

A Silicon's own Silicon Accounts events

Silicon Accounts can tell a Silicon when it is signed out, renamed or given a new custodian, by calling a webhook. Point it at a Hook hook:

hook connect-accounts                         # prints the hook URL and the command to run
silicon-accounts webhook set <url>            # as the Silicon; prints a whsec_ secret once
silicon-accounts silicon webhook set si:scout <url>   # or as its custodian
hook connect-accounts --secret-file -         # paste the whsec_ secret

Until the secret is stored, Silicon Accounts deliveries are withheld as unverified (hook blocked shows them).

Delivery through Ting

When the Hook server delivers through Ting, each verified request reaches the Silicon as a compact reference that its app hydrates with the receiving SDK. receiving register enrols you with Ting; a Carbon with access can receiving subscribe to a Silicon's future events. When the server has no Ting, Hook still receives and stores every event, these commands answer delivery_disabled, and publication says delivery_disabled: read events with hook events.

State, settings and telemetry

State lives in ${SILICON_HOME:-~}/.silicon-hook/profiles.json (0600, directory 0700). SILICON_HOOK_HOME names the exact directory; hook config home <dir> moves the base to an existing directory. Writes are atomic and serialized by a lock file.

Telemetry is on by default and carries no payloads or credentials: one event per command (name, outcome, duration), sent to Hook only while signed in. Turn it off with hook config set telemetry off or SILICON_HOOK_TELEMETRY=off. See telemetry.

Upgrading from Hook before 1.0

  • Sign in again: hook login (Carbons) or the Silicon command above. The old state.json is left untouched and never read for credentials; its URL, default Silicon and telemetry choice carry over.
  • Hooks belong to Silicons: choose one with --silicon. Flags and commands of earlier versions that no longer apply (test environments, publisher setup, separate Ting approval) are gone; the old global flags fail with an explanation of what replaced them.
  • New: hook login without arguments (device flow), --slt-stdin, accounts --json, silicons, access, allow-list, connect-accounts.

hook report "what happened" --pr https://github.com/teamofsilicons/silicon-hook/pull/123 files a bug through your authenticated GitHub CLI. Only your text, the optional pull request and the version are sent.