Skip to content
Back to skills

Bot Status

ASecurity

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

  • 119 stars
  • 0 votes
  • 0 copies
  • 8 views
  • Added September 12, 2026
databasesbashsqlnodegitapidatabasesecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 12, 2026

npx -y skills add espennilsen/pi --skill bot-status --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bot Status?

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

Security grade badge for Bot Status
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/espennilsen-bot-status/badge)](https://www.skillsdirectory.com/skills/espennilsen-bot-status)

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

# 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

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.