CLI Reference
What is Pulse CLI?
Section titled “What is Pulse CLI?”Pulse CLI (pulse) captures AI-agent activity as structured spans and ships it to your Pulse server.
It supports two workflows:
- local managed Pulse: the CLI starts and manages
pulse-serverfor you - remote/shared Pulse: the CLI connects to an already running Pulse instance
Install
Section titled “Install”Recommended (installs both pulse-server and pulse):
curl -fsSL https://raw.githubusercontent.com/EK-LABS-LLC/trace-service/main/scripts/install.sh | bash -s -- pulse-serverCLI-only installer:
curl -fsSL https://raw.githubusercontent.com/EK-LABS-LLC/trace-cli/main/install.sh | shFrom source:
git clone https://github.com/EK-LABS-LLC/trace-clicd pulse-trace-climake installRe-running either installer upgrades in place. It replaces the installed binaries and keeps your existing ~/.pulse config and local data.
Getting started
Section titled “Getting started”Local managed Pulse
Section titled “Local managed Pulse”Use this when Pulse should run on your machine.
pulse uppulse dashboardpulse statusDaily use:
pulse upstartspulse-serverin the backgroundpulse dashboardopens the local dashboard through a one-time local login URLpulse logs --followtails the managed server logpulse downstops the managed server
Remote/shared Pulse
Section titled “Remote/shared Pulse”Use this when a Pulse server already exists at a URL you can reach.
pulse connect \ --api-url https://pulse.example.com \ --api-key pulse_sk_... \ --project-id my-projectThen verify:
pulse statuspulse connect saves a remote config and installs hooks locally. It does not start a server.
Updating
Section titled “Updating”Local managed Pulse
Section titled “Local managed Pulse”Re-run the trace-service installer:
curl -fsSL https://raw.githubusercontent.com/EK-LABS-LLC/trace-service/main/scripts/install.sh | bash -s -- pulse-serverThis updates pulse-server, dashboard assets, and the pulse CLI while preserving ~/.pulse data.
Remote/shared Pulse users
Section titled “Remote/shared Pulse users”If you only use the CLI locally, re-run the CLI installer:
curl -fsSL https://raw.githubusercontent.com/EK-LABS-LLC/trace-cli/main/install.sh | shCommand reference
Section titled “Command reference”| Command | Description |
|---|---|
pulse setup | Manually bootstrap a local or remote Pulse account/project and save config |
pulse up | Start the managed local Pulse server in the background |
pulse down | Stop the managed local Pulse server |
pulse restart | Restart the managed local Pulse server |
pulse logs | Show or follow managed local server logs |
pulse dashboard | Open the current Pulse dashboard URL |
pulse init | Deprecated alias for pulse connect |
pulse connect | Configure a remote Pulse instance and install hooks |
pulse install-hooks | Install Pulse hooks without changing config (requires existing config) |
pulse disconnect | Remove all Pulse hooks from all agents |
pulse status | Show mode, connectivity, server state, and hook status |
pulse emit <type> | Send a span (used by hooks, not by users) |
pulse setup
Section titled “pulse setup”Manual local bootstrap:
pulse setup --localFully non-interactive:
pulse setup \ --api-url http://localhost:3000 \ --name "Your Name" \ --email you@example.com \ --password "change-me" \ --project-name "My Project"Remote account bootstrap against an existing server:
pulse setup --api-url https://pulse.example.com --no-start-serverShow the full API key in setup output:
pulse setup --local --show-api-keyFor normal local use, pulse up can perform first-time bootstrap automatically.
pulse up
Section titled “pulse up”pulse up
# Start and open the dashboardpulse up --openStarts pulse-server in the background, waits for /health, performs first-time local bootstrap when config is missing, and prints the dashboard URL, PID, and log path.
pulse down
Section titled “pulse down”pulse downStops the managed local pulse-server.
pulse restart
Section titled “pulse restart”pulse restart
# Restart and open the dashboardpulse restart --openpulse logs
Section titled “pulse logs”# Show the most recent linespulse logs
# Follow logs continuouslypulse logs --follow
# Tail more lines before followingpulse logs --lines 300 --followpulse dashboard
Section titled “pulse dashboard”# Open the configured dashboardpulse dashboard
# Print the URL without opening a browserpulse dashboard --no-openIn local mode, this creates a one-time local login URL and opens the dashboard served by pulse-server. In remote mode, it opens the configured remote Pulse URL.
pulse init
Section titled “pulse init”# Deprecated alias for `pulse connect`pulse initpulse connect
Section titled “pulse connect”pulse connect \ --api-url https://pulse.example.com \ --api-key pulse_sk_... \ --project-id my-projectInteractive prompts work too:
pulse connectThis:
- saves a remote-mode config to
~/.pulse/config.toml - validates
/healthby default - installs hooks into detected agents unless
--no-hooksis set
pulse install-hooks
Section titled “pulse install-hooks”pulse install-hooksInstalls Pulse hooks into detected agents without modifying your Pulse configuration. Use this when you are already connected to a Pulse server but don’t have hooks installed.
This command:
- validates that
~/.pulse/config.tomlexists with validapi_url,api_key, andproject_id - prompts to run
pulse connectif config is missing or incomplete - installs hooks for all detected tools (Claude Code, OpenCode, OpenClaw)
Use pulse connect when you need to both connect to a server AND install hooks.
pulse disconnect
Section titled “pulse disconnect”pulse disconnectRemoves Pulse-managed hooks and plugins while leaving unrelated agent configuration alone.
pulse status
Section titled “pulse status”pulse statusShows:
- current mode (
localorremote) - configured API URL and project
- local server PID, health, and log path in local mode
- remote connectivity in remote mode
- hook status for each detected agent
pulse emit <event_type>
Section titled “pulse emit <event_type>”Internal command called by integrations. Usually not called directly.
echo '{"session_id":"abc","tool_name":"Bash"}' | pulse emit pre_tool_useHot-path guarantees:
- always exits with code
0 - no stdout or stderr output
- 2-second HTTP timeout
Configuration
Section titled “Configuration”Config file: ~/.pulse/config.toml
Local mode example:
mode = "local"api_url = "http://localhost:3000"project_id = "my-project"Remote mode example:
mode = "remote"api_url = "https://pulse.example.com"api_key = "pulse_sk_..."project_id = "my-project"| Field | Description |
|---|---|
mode | local or remote |
api_url | Base URL of the current Pulse server |
api_key | Project API key used in remote mode |
project_id | Project identifier attached to spans |
Environment variables
Section titled “Environment variables”| Variable | Description |
|---|---|
PULSE_DEBUG | Set 1 to log raw integration payloads |
PULSE_DEBUG_LOG | Override debug log path (~/.pulse/debug.log by default) |
Events and span model
Section titled “Events and span model”Pulse integrations emit these normalized event types:
| Event | Kind | Description |
|---|---|---|
session_start | session | Agent session begins |
session_end | session | Agent session ends |
stop | session | Agent stops execution |
user_prompt_submit | user_prompt | User sends prompt |
assistant_message | llm_response | Assistant response |
pre_tool_use | tool_use | Tool call about to run |
post_tool_use | tool_use | Tool call succeeded |
post_tool_use_failure | tool_use | Tool call failed or was interrupted |
subagent_start | agent_run | Child agent started |
subagent_stop | agent_run | Child agent finished |
notification | notification | Agent notification event |
Example span payload:
{ "span_id": "550e8400-e29b-41d4-a716-446655440000", "session_id": "abc-123", "timestamp": "2026-02-19T14:30:00.000Z", "source": "claude_code", "kind": "tool_use", "event_type": "pre_tool_use", "status": "success", "tool_name": "Bash", "tool_use_id": "tool_abc", "tool_input": { "command": "ls" }, "metadata": { "cli_version": "0.1.0", "project_id": "my-project" }}Additional fields such as tool_response, error, model, agent_name, and cwd are included when available.
Agent integrations at a glance
Section titled “Agent integrations at a glance”| Integration | Detection path | Pulse-managed files |
|---|---|---|
| Claude Code | ~/.claude/settings.json or ~/.claude/settings.local.json | hooks entries in settings.json or settings.local.json |
| Opencode | ~/.config/opencode/ | ~/.config/opencode/plugin/pulse-plugin.ts |
| OpenClaw | ~/.openclaw/ | ~/.openclaw/hooks/pulse-hook/ |
Pulse only modifies Pulse-owned entries and files. Other hooks and plugins are preserved.
Troubleshooting
Section titled “Troubleshooting”Config missing
Section titled “Config missing”For local mode:
pulse upFor remote mode:
pulse connect --api-url https://pulse.example.com --api-key pulse_sk_... --project-id my-projectLocal server not running
Section titled “Local server not running”pulse upThen inspect logs:
pulse logs --followAgent not detected
Section titled “Agent not detected”Pulse detection paths:
- Claude Code:
~/.claude/settings.jsonor~/.claude/settings.local.json(preferred) - Opencode:
~/.config/opencode/ - OpenClaw:
~/.openclaw/
Hooks installed but no spans
Section titled “Hooks installed but no spans”- Run
pulse statusand confirm Pulse is reachable. - Enable debug logs with
PULSE_DEBUG=1. - Check
~/.pulse/debug.logfor incoming payloads. - Verify API URL, API key, and project ID.
Stale integration plugin
Section titled “Stale integration plugin”After CLI upgrades, run:
# If already connected to a server:pulse install-hooks
# If not yet connected:pulse connectArchitecture
Section titled “Architecture”Claude Code hooks / Opencode plugin / OpenClaw hook -> pulse emit <event_type> -> normalize payload into span -> POST /v1/spans/async (2s timeout) -> Pulse serverDesign choices:
- non-blocking hooks
- silent failure mode for integrations (
pulse emitexits0) - idempotent connect and disconnect behavior
- no runtime npm downloads for plugin content
Building from source
Section titled “Building from source”make buildmake releasemake testmake installRunning E2E tests
Section titled “Running E2E tests”Requires Docker or Podman and a reachable Pulse server.
make e2e
# Individual suitesmake e2e-claudemake e2e-claude-toolsmake e2e-opencodemake e2e-opencode-tools