Skip to content
Back to skills

Pulse

ASecurity

Start, stop, or check the anvil-pulse dashboard — a live local web page showing active anvil claims (actor, phase, elapsed, lease countdown), the event feed, and stuck-state detection (healthy / quiet / possibly wedged / lease expired) for long autonomous runs. Use when the user asks to "watch this run", "open the anvil dashboard", "is the agent stuck?", "monitor the claims", "start/stop pulse", or wants a heartbeat view of an anvil project. Also installs an optional Claude Code statusline se...

  • 4 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 6, 2026
ai-agentspythonshellbashnodegitapi

Works with

  • claude code
  • terminal
  • cli
  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 6, 2026

npx -y skills add fakoli/fakoli-plugins --skill pulse --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pulse?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pulse
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/fakoli-pulse/badge)](https://www.skillsdirectory.com/skills/fakoli-pulse)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pulse
description: Start, stop, or check the anvil-pulse dashboard — a live local web page showing active anvil claims (actor, phase, elapsed, lease countdown), the event feed, and stuck-state detection (healthy / quiet / possibly wedged / lease expired) for long autonomous runs. Use when the user asks to "watch this run", "open the anvil dashboard", "is the agent stuck?", "monitor the claims", "start/stop pulse", or wants a heartbeat view of an anvil project. Also installs an optional Claude Code statusline segment on request. Read-only over anvil state; sends nothing externally.
---

# anvil pulse

A local operator dashboard for anvil projects. It polls `anvil status --json`
and tails the append-only `events.jsonl`, then serves a single self-contained
web page. It never writes anvil state.

Resolve `PLUGIN_ROOT` from this installed skill (`../..`), not from the target project or an assumed shell variable. Keep the project path explicit.

## Toolkit (bundled)

```
$PLUGIN_ROOT/scripts/start-server.sh   # start (prints {"event":"server-started","url":...})
$PLUGIN_ROOT/scripts/stop-server.sh    # stop
$PLUGIN_ROOT/scripts/check-server.sh   # is it running?
$PLUGIN_ROOT/scripts/statusline-segment.sh  # optional Claude Code statusline segment
```

All scripts take `--project-dir <path>` (default: cwd). Requires `node` and the
`anvil` CLI on PATH.

## Start the dashboard

1. Confirm the target project is anvil-initialized: `anvil status --json --cwd <project>`
   exits 0. If not, tell the user and stop — the dashboard has nothing to show.
2. Run:
   ```bash
   bash "$PLUGIN_ROOT/scripts/start-server.sh" --project-dir <project>
   ```
3. Parse the JSON line and give the user the `url`. Suggest opening it in a
   browser; it live-updates every ~2.5s.
4. On Windows/Git Bash and environments setting `CODEX_CI`, the script auto-runs in the foreground
   (detached processes get reaped there). In that case start it with the shell
   tool's background/run-in-background mode so it survives the turn, or tell
   the user to run it in a separate terminal:
   `bash .../start-server.sh --project-dir <project> --foreground`

Options worth knowing: `--port <n>` for a stable URL, `--state-dir <dir>` if
anvil state lives in a non-default workspace dir (auto-discovery checks
`<project>/.anvil`, `<project>/bin/.anvil`, then the exact path-hashed workspace under
`~/.anvil/workspaces/`. A same-named checkout is never selected as a fallback;
use an explicit `--state-dir` for legacy or custom layouts).

Suggest adding `.anvil-pulse/` to the project's `.gitignore` (pid/log files
live there).

## Stop / check

```bash
bash "$PLUGIN_ROOT/scripts/stop-server.sh"  --project-dir <project>
bash "$PLUGIN_ROOT/scripts/check-server.sh" --project-dir <project>
```

## Reading the board

- Each active claim card shows task, actor, latest `progress.noted` phase,
  elapsed time, live lease countdown, and time since last observed event.
- Staleness classification (server defaults via `PULSE_QUIET_SECONDS` /
  `PULSE_WEDGED_SECONDS` = 300/900; retune live per request with
  `/api/pulse?quiet_seconds=600&wedged_seconds=1800` — no restart needed):
  - **healthy** — activity within the quiet threshold
  - **quiet** — no activity for 5-15 min; often a long tool call or model wait
  - **possibly wedged** — silent beyond 15 min with a live lease; worth a look
  - **lease expired** — the claim's lease ran out; the run may have died
- When the user asks "is it stuck?", read `/api/pulse` yourself and answer from
  `claims[].staleness` + `last_activity_seconds` instead of guessing:
  `curl --fail --silent --show-error --max-time 10 http://localhost:<port>/api/pulse`

## Optional: Claude Code statusline segment

Only on explicit request — this edits the user's own statusline script.
Requires `python3` or `python` on PATH (the segment parses anvil's JSON;
on Windows, `python3` is often a broken WindowsApps stub, so the script tries
both — but at least one must actually work).

1. Read `~/.claude/settings.json` -> `statusLine.command` to find the script
   (commonly `~/.claude/statusline-command.sh`). If no statusline is configured,
   explain how to set one up instead of creating files unasked.
2. IDEMPOTENCY CHECK: grep the script for `# anvil-pulse segment` first. If
   present, the segment is already installed — update the existing block in
   place if the path changed; NEVER append a second copy (it would render
   twice).
3. For a requested installation, append this snippet to the END of
   their script after inspecting its existing structure (it prints nothing outside anvil projects):
   ```bash
   # anvil-pulse segment
   pulse_seg="$(bash "<absolute-plugin-path>/scripts/statusline-segment.sh" "$workspace_dir" 2>/dev/null)"
   [[ -n "$pulse_seg" ]] && printf ' | %s' "$pulse_seg"
   ```
   Replace `<absolute-plugin-path>` with the resolved installed plugin root
   and `$workspace_dir` with however their script names the current workspace
   variable (read the script first; do not assume).
4. The segment caches `anvil status` for 10s (`ANVIL_PULSE_STATUSLINE_TTL`)
   under `~/.cache/anvil-pulse/`; on a transient anvil failure it serves the
   previous cached segment instead of blanking.

## Other harnesses

- **Codex**: start the server in a persistent terminal and open its browser page.
  This plugin supplies a dashboard skill; it does not configure recurring
  automation or notifications merely by starting the dashboard.
- **OpenClaw**: see `$PLUGIN_ROOT/docs/openclaw.md` for the zero-code
  Gateway cron recipe (`anvil notify-digest --announce`) and the planned
  control-ui embed.

Files in this skill

  • SKILL.md5.5 KB
  • agents/openai.yaml196 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.