# Bot Status

> 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?"

- Skill: `espennilsen/bot-status` (Agent Skill)
- Install (CLI): `npx skillmds@latest add espennilsen/bot-status`
- Raw SKILL.md: https://api.skillmd.com/api/skills/espennilsen/bot-status/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: espennilsen (https://skillmd.com/u/espennilsen)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/espennilsen/bot-status

---


# Bot Status Skill

Generate a comprehensive operational status report for the Aivena bot, covering every subsystem.

## Report Structure

Produce all sections in order. Use status icons consistently:
- ✅ healthy / running / OK
- ⚠️ degraded / warning
- ❌ down / error / missing
- ⏳ unknown / checking
- 📊 informational metric

---

### 1. Overview

Show:
- Bot name, version (from package.json if available)
- Current branch and git status (clean/dirty, uncommitted count)
- Uptime context: when the current pi session started (from jobs tool if available)
- Current date/time

### 2. Extensions

Check both extension directories for installed extensions:

- **Workspace extensions:** `.pi/extensions/`
- **Global extensions:** `~/.pi/agent/extensions/`

```bash
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:

```bash
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)
    ...
```

### 3. Webserver

Check if the pi-webserver is responding:

```bash
curl -s --connect-timeout 5 --max-time 10 -o /dev/null -w "%{http_code}" http://localhost:4110/ 2>/dev/null
```

Report:
- HTTP status code
- Port (from `.pi/settings.json` → `pi-webserver.port`)
- Whether autostart is enabled

Format:
```
Webserver
  ✅ Responding on port 4110 (HTTP 200)
  Autostart: enabled
```

If unreachable:
```
Webserver
  ❌ Not responding on port 4110
```

### 4. Telegram & Chat Bridge

Read `.pi/settings.json` → `pi-channels` config and report:

- **Telegram adapter**: configured ✅/❌, polling enabled, allowed chat IDs
- **Chat bridge**: enabled ✅/❌, max queue, timeout, max concurrent
- **Routes**: list all configured routes (name → adapter → recipient)

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...451
```

### 5. Heartbeat

Read `.pi/settings.json` → `pi-heartbeat` config:
- Enabled/disabled
- Interval
- Active hours
- Route

Format:
```
Heartbeat
  ✅ Enabled — every 60min, 08:00–22:00
  Route: ops
  Autostart: enabled
```

### 6. Cron Jobs

Use the `cron` tool (action: list) to show all scheduled jobs:
- Job name, schedule, enabled/disabled, last run

If no jobs:
```
Cron Jobs
  ⚠️ No cron jobs configured
```

### 7. Database

Check the SQLite database (managed by pi-kysely at `.pi/db/aivena.db`):

```bash
# 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}"
done
```

If 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
```

### 8. Memory System

Check memory health:

```bash
# 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
```

### 9. CRM

Use the `crm` tool to check:
- `crm search` with a broad query to count contacts
- `crm upcoming` to show upcoming reminders
- `crm list_companies` to count companies

Format:
```
CRM
  ✅ Operational
  📊 15 contacts, 7 companies
  Upcoming: 2 reminders in next 7 days
```

Or if empty:
```
CRM
  ⚠️ No contacts yet
```

### 10. Calendar

Use the `calendar` tool:
- `calendar today` — today's events
- `calendar upcoming` — next 7 days

Format:
```
Calendar
  Today: 2 events
    10:00 — Team standup
    14:00 — Client call
  Next 7 days: 5 events
```

Or:
```
Calendar
  Today: no events
  Next 7 days: no events
```

### 11. Task Management (td)

```bash
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: 3
  Next up: td-abc123 "Some important task" (P1)
  Reviewable: td-def456, td-ghi789
```

### 12. Jobs & Telemetry

Use the `jobs` tool:
- `jobs stats` — overall statistics
- `jobs recent` (limit: 5) — recent runs

Format:
```
Jobs & Telemetry
  📊 Total runs: 245, Errors: 3 (1.2%)
  Avg duration: 28.4s
  Total cost: $1.23
  Recent:
    12:05 — tui — 34s — success
    11:42 — cron — 12s — success
    11:00 — heartbeat — 45s — success
```

### 13. Storage

```bash
du -sh .pi/db/aivena.db
du -sh .pi/memory/
du -sh log/
du -sh .todos/
du -sh .pi/extensions/
# Total workspace size (excluding node_modules, .git)
du -sh --exclude=node_modules --exclude=.git . 2>/dev/null || du -sh . 2>/dev/null
```

Format:
```
Storage
  aivena.db:     156KB
  Memory:        12KB
  Logs:          48KB
  Tasks (.todos): 8KB
  Extensions:    2.1MB
  Workspace:     3.4MB
```

### 14. Configuration Validation

Cross-check `.pi/settings.json` for:
- All referenced adapters exist in the config
- Routes reference valid adapters
- Required fields are present (bot token set, ports defined)
- No obvious misconfigurations

```
Config Validation
  ✅ All routes reference valid adapters
  ✅ Webserver port configured
  ✅ Bot token present
  ⚠️ pi-cron in settings but extension not found
```

### 15. Summary & Health Score

Aggregate all checks into a health score:

```
Health Score: 12/14 checks passing

Summary:
  Aivena is operational with 13 extensions loaded. Telegram bridge and
  webserver are responding. No cron jobs configured — consider adding
  scheduled tasks. Database is empty — CRM not yet populated.

Action Items:
  1. ⚠️ Configure cron jobs for recurring tasks
  2. ⚠️ Populate CRM with initial contacts
  3. ✅ All core systems operational
```

---

## Formatting Guidelines

- **NEVER** wrap output in triple-backtick code fences — use plain text with Unicode
- Use em-dash (—) for inline descriptions
- Keep compact but comprehensive
- Mask sensitive data (tokens, keys) — show only "configured ✅" or first/last 4 chars
- Status icons: ✅ ⚠️ ❌ 📊
- Section headers in bold

## Execution Order

Run all independent checks in parallel where possible (e.g., curl + sqlite + td can all run concurrently). Group tool calls that don't depend on each other.

## Security

- Never print full bot tokens, API keys, or secrets
- Use `-readonly` flag for SQLite queries
- Don't modify any state — this is a read-only diagnostic

