pi-heartbeat
Configure periodic health checks via HEARTBEAT.md and the /heartbeat command.
Generate a full operational status report for the Aivena bot. Checks all subsystems: extensions, webserver, Telegram, chat bridge, heartbeat, cron, database, memory, CRM, calendar, task management, jobs/telemetry, and storage. **Triggers — use this skill when:** - User asks for
$ npx -y skills add espennilsen/pi --skill bot-status --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/bot-statusContext preview
The summary Claude sees to decide when to auto-load this skill.
Generate a full operational status report for the Aivena bot. Checks all subsystems: extensions, webserver, Telegram, chat bridge, heartbeat, cron, database, memory, CRM, calendar, task management, jobs/telemetry, and storage. **Triggers — use this skill when:** - User asks for
name: bot-status description: | Generate a full operational status report for the Aivena bot. Checks all subsystems: extensions, webserver, Telegram, chat bridge, heartbeat, cron, database, memory, CRM, calendar, task management, jobs/telemetry, and storage. **Triggers — use this skill when:** - User asks for "status", "bot status", "system status", "operational status" - User asks "is everything running?", "how's Aivena doing?" - User says "health check", "diagnostics", "systems check" - User asks "what's the state of the bot?"
Generate a comprehensive operational status report for the Aivena bot, covering every subsystem.
Produce all sections in order. Use status icons consistently:
---
Show:
Check both extension directories for installed extensions:
ls -1 .pi/extensions/ 2>/dev/null ls -1 ~/.pi/agent/extensions/ 2>/dev/null
For each extension found, read its `package.json` to get the version:
cat .pi/extensions/<name>/package.json 2>/dev/null | grep '"version"' cat ~/.pi/agent/extensions/<name>/package.json 2>/dev/null | grep '"version"'
Report each extension with its source (workspace or global), version, and whether it's a symlink.
If an extension appears in both locations, note it — workspace takes precedence.
Format as a compact table:
Extensions (16 loaded)
Workspace (.pi/extensions/):
✅ pi-calendar 0.1.0 (symlink)
✅ pi-channels 0.1.0 (symlink)
Global (~/.pi/agent/extensions/):
✅ pi-memory 0.2.1 (symlink)
✅ pi-jobs 0.1.0 (symlink)
...Check if the pi-webserver is responding:
curl -s --connect-timeout 5 --max-time 10 -o /dev/null -w "%{http_code}" http://localhost:4110/ 2>/dev/nullReport:
Format:
Webserver ✅ Responding on port 4110 (HTTP 200) Autostart: enabled
If unreachable:
Webserver ❌ Not responding on port 4110
Read `.pi/settings.json` → `pi-channels` config and report:
Do NOT print the bot token — just confirm it's set (e.g., "Bot token: configured ✅").
Format:
Telegram & Chat Bridge
Telegram adapter: ✅ configured
Bot token: set
Polling: enabled (30s timeout)
Allowed chats: 1 configured
Chat bridge: ✅ enabled
Max queue: 5/sender, timeout: 300s, concurrency: 2
Routes:
ops → telegram → chat 5991...451
cron → telegram → chat 5991...451Read `.pi/settings.json` → `pi-heartbeat` config:
Format:
Heartbeat ✅ Enabled — every 60min, 08:00–22:00 Route: ops Autostart: enabled
Use the `cron` tool (action: list) to show all scheduled jobs:
If no jobs:
Cron Jobs ⚠️ No cron jobs configured
Check the SQLite database (managed by pi-kysely at `.pi/db/aivena.db`):
# Size
du -sh .pi/db/aivena.db
# Tables
sqlite3 -readonly .pi/db/aivena.db "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
# Row counts for key tables (robust against missing tables)
for table in contacts interactions companies reminders; do
count=$(sqlite3 -readonly .pi/db/aivena.db "SELECT CASE WHEN EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND name='$table') THEN (SELECT COUNT(*) FROM $table) ELSE 0 END" 2>/dev/null)
echo "$table: ${count:-0}"
doneIf the database is empty (0 bytes) or has no tables, note it:
Database ⚠️ aivena.db exists but is empty (0 bytes)
If populated:
Database (.pi/db/aivena.db — 156KB) Tables: contacts, interactions, companies, reminders, ... CRM: 12 contacts, 34 interactions, 5 companies, 3 reminders
Check memory health:
# Long-term memory wc -l < MEMORY.md 2>/dev/null wc -c < MEMORY.md 2>/dev/null # Daily logs ls -1 .pi/memory/ 2>/dev/null | wc -l ls -lt .pi/memory/ 2>/dev/null | head -3
Also use `memory_read` (target: long_term) to verify it's readable, and `memory_read` (target: list) to count daily logs.
Format:
Memory ✅ MEMORY.md: 142 lines, 4.2KB 📊 Daily logs: 8 files Latest: 2026-02-12
Use the `crm` tool to check:
Format:
CRM ✅ Operational 📊 15 contacts, 7 companies Upcoming: 2 reminders in next 7 days
Or if empty:
CRM ⚠️ No contacts yet
Use the `calendar` tool:
Format:
Calendar
Today: 2 events
10:00 — Team standup
14:00 — Client call
Next 7 days: 5 eventsOr:
Calendar Today: no events Next 7 days: no events
td next 2>/dev/null td reviewable 2>/dev/null td list --status open 2>/dev/null | head -20 td list --status in_progress 2>/dev/null | head -10 td list --status in_review 2>/dev/null | head -10
Format:
Task Management 📊 Open: 12 issues, In progress: 2, In review:
This repository is my Pi coding agent home directory. I keep it under version control and symlink it to ~/.pi/agent so Pi loads configuration, extensions, skills, and runtime state from here.
Configure periodic health checks via HEARTBEAT.md and the /heartbeat command.
Manage persistent memory across sessions. Use when asked to remember, recall, forget, or review what was stored. Covers long-term…
Track and manage projects with git status via dashboard and tool.
Delegate tasks to specialized subagents for parallel or sequential execution.
Audit, generate, update, and lint AGENTS.md files across all projects. Use when asked to check project context files, scaffold…