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 setup --localpulse uppulse statusDaily use:
pulse upstartspulse-serverin the backgroundpulse 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 | 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”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-keyAfter local setup, use pulse up for normal day-to-day startup.
pulse up
Section titled “pulse up”pulse up
# Start and open the dashboardpulse up --openStarts pulse-server in the background, waits for /health, 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 opens the local 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 setup --localFor 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