Skip to content
bucker

The bucker CLI

The bucker command line: releases, deploys, source maps, cron check-ins, issues, config as code, and a local envelope sink for development. One file, no runtime dependencies, Node 22+.

npx @bucker/cli login                  # device code in the browser; stored under ~/.config/bucker
npx @bucker/cli whoami

Every command takes --json: stdout then carries exactly one JSON document and progress goes to stderr, so an agent or a CI step can pipe it.

Context

Each value comes from the first of: a flag, the environment, .bucker/cli.json (nearest ancestor directory).

Flag Environment .bucker/cli.json
--api-url BUCKER_API_URL apiUrl (default https://api.bucker.io)
--token BUCKER_TOKEN never; see below
--org BUCKER_ORG org
--project BUCKER_PROJECT project
--dsn BUCKER_DSN dsn

.bucker/cli.json is meant to be committed: an org slug and a DSN are not secrets. A token is never read from it. A token key is an error, because a file that works with a token in it gets committed with one. bucker login stores its credential in $XDG_CONFIG_HOME/bucker/credentials.json (else ~/.config/bucker/), mode 0600, outside every working tree. The CLI refreshes and rotates that credential before it expires.

login asks for org:read project:read project:write event:read issue:read release:write. This is the most a first-party login can hold (OAUTH_API_CEILING). issues resolve and config apply need scopes outside it. For those, use a personal access token with the scope (Settings → Tokens) as BUCKER_TOKEN. In CI, use an org token (bkr_org_…): it keeps working after the person who set up the pipeline leaves.

Releases and source maps (CI)

bucker releases new "$VERSION" --auto            # --auto: HEAD's sha; Bucker walks the commits
bucker sourcemaps upload dist --release "$VERSION"   # inject debug ids, upload, verify
bucker releases finalize "$VERSION"
bucker deploys new "$VERSION" --env production

sourcemaps inject|upload|verify run the bundler plugin's own code. It is bundled in, not copied, so a tsc, esbuild or webpack build gets the same debug ids the Vite plugin would derive. Injecting is idempotent: a file that already carries a //# debugId= keeps it. upload fails the step unless every shipped id resolves server-side. --no-verify turns that off. Doing so trades a red build for frames that silently stay minified.

The posts are upserts, so re-running a CI step changes nothing it already recorded. Recipes for GitHub Actions, GitLab CI and AWS CodeBuild are in docs/releases.md, under "CI recipes".

Events and cron

bucker send-event -m "nightly import failed" --logfile import.log --tag job:import
bucker monitors run nightly-import --schedule "0 3 * * *" -- ./import.sh

monitors run sends in_progress, runs the command, then sends ok or error with the duration. All three share one check-in id. A --schedule (or --interval) creates the monitor on its first check-in. The CLI exits with the command's own exit code. A check-in that cannot be sent only warns on stderr, so a network blip never fails a successful job.

Issues

bucker issues list --json
bucker issues essence CHECKOUT-42        # the ≤500-token essence, the document MCP issue_essence returns
bucker issues rca CHECKOUT-42 [--run]
bucker issues resolve CHECKOUT-42 --in-release 1.4.0

Config as code

bucker config export > bucker.json       # JSON is valid YAML: this is also a working bucker.yml
bucker config plan                       # bucker.yml / bucker.yaml / bucker.json, or a path, or -
bucker config apply --yes

apply plans again and sends that plan's hash. If the organization changed between the two, the server answers 409 and nothing is applied. --plan-hash <h> pins a hash from an earlier plan, so CI can apply on merge exactly what was reviewed on the pull request. The schema is in docs/config-as-code.md.

bucker dev: local errors, locally

bucker dev                               # http://127.0.0.1:8969
BUCKER_DSN=http://bucker_dev@127.0.0.1:8969/0 node app.js

bucker dev accepts envelopes from any SDK on /api/<id>/envelope/. It also accepts them on Spotlight's sidecar path /stream, so a Sentry SDK with spotlight: true works unchanged. It prints one line per error and serves a list at /, each issue's page at /issues/<id>, and the same as JSON under /api/issues. Data stays in an in-memory ring buffer and is never forwarded anywhere.

Grouping and scrubbing are a local approximation; production grouping happens on Bucker. bucker dev groups by the SDK's fingerprint when one is sent, else by the exception type and its innermost in-app frame (not the line number), else by the message. Before anything is stored, shown or handed to an agent, it replaces credential headers (Authorization, Cookie, X-Api-Key, …), cookies, values under secret-shaped keys (password, api_key, access_token, …) and query parameters of those names inside any string, such as a breadcrumb's URL, with [Filtered]. It does not build the issue essence: that is computed by Bucker's hosted pipeline, which is not part of this package. Two errors that share a local issue may still be separate issues on Bucker, and the other way round.

To give a coding agent the local errors over MCP:

{ "mcpServers": { "bucker-dev": { "command": "npx", "args": ["@bucker/cli", "dev", "--mcp"] } } }

The tools are issues_list and issue_details. issue_details returns the local summary (exception chain, innermost frames, last breadcrumbs, tags, release), labelled as a local approximation, with every string marked as data from the application under test. There is no local issue_essence: a call to it returns an error that names issue_details.

Licence

Apache-2.0, like the SDKs — decided by the owner on 2026-10-17; copyright Atilan LLC (see the package's LICENSE and NOTICE). The published file is the CLI's own code, the bundler plugin's and the public wire protocol (the same envelope and DSN code @bucker/sdk-core ships), plus third-party code. It carries no Bucker server code, and its build refuses to produce a file that does.