← All Skills

snappy-maintenance

v1.0.0
5 files, 45.7 KB ~2,296 words · 10 min read Updated 2026-09-09

snappy-maintenance skill

41 of 49 checks pass
What it can do
allread
check urlread
ssl domainread
What does not pass yet
$ npx snappy-skills install snappy-maintenance
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── api.ts ├── contract.test.ts └── scripts/ └── health-sweep.sh
Documents
AGENTS.md

snappy-maintenance -- Agent Loader#

You are operating the project maintenance skill for every Snappy-managed system. Covers dependency hygiene, six-dimension health checks, code cleanup, log monitoring, and a weekly cadence wired into snappy-ops. Reports go through snappy-telegram (alerts) and snappy-update (client visibility).

API module#

typescriptimport { checkUrl, checkSsl, checkAllProjects } from "../snappy-maintenance/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-maintenance/api.ts check https://total-crm.fly.dev/health
npx tsx ~/.claude/skills/snappy-maintenance/api.ts ssl total-crm.fly.dev
npx tsx ~/.claude/skills/snappy-maintenance/api.ts all

API functions#

Function Purpose
checkUrl(url) HTTP health probe with status, ok flag, and latency
checkSsl(domain) Check SSL certificate expiry (days remaining)
checkAllProjects() Run health checks against all known project URLs

Rules#

  1. Patch -> Minor -> Major, one at a time. Test between every level. Never batch major upgrades.
  2. Read-only first, then act. npm outdated before npm install; fly logs before fly deploy.
  3. Six-dimension health check on every sweep: API uptime, queue depth, cron status, Xano workspace, worker health, gateway availability.
  4. Alert via snappy-telegram for HIGH severity before acting. Don't bury critical issues in a report.
  5. Friday = cleanup only. No major dep updates land Friday. Those go Monday-Wednesday.
  6. Review depcheck results. False positives for runtime-loaded modules, CLI tools, dynamic imports.
  7. Log maintenance hours via snappy-freshbooks per client.
  8. Commit strategy: fix(deps): patch updates for PROJECT, feat(deps): upgrade PACKAGE to vX (major).

Quick start interview#

When triggered, clarify:

  1. Which project? total-crm, orbiter, snappy-website, snappy-mcp, snappy-skills, box, or all
  2. What kind? deps, health, cleanup, monitoring, or full

Six-dimension health commands#

Dim Check
API uptime curl -sf https://PROJECT.fly.dev/health
Queue depth Project-specific: Xano bg tasks, Box /pulse, Fly worker logs
Cron status fly cron list, Box /_daemon/list
Xano workspace Hit known endpoint, list bg tasks
Worker health npx wrangler tail WORKER_NAME for ~30s
Gateway `curl -s https://skills.snappy.ai/.well-known/skills/index.json \ jq .`

Weekly cadence (orchestrated by snappy-ops)#

Day Task
Monday Six-dimension health sweep on all active projects
Wednesday npm outdated + npm audit review (no updates land -- review only)
Friday Dead code, unused deps, lint fixes. Hand off to snappy-deploy if redeploy needed.

Key platform commands#

bash# Fly.io
curl -sf https://total-crm.fly.dev/health && echo OK || echo FAIL
fly logs --app total-crm | grep -iE "error|fatal" | tail -20

# Cloudflare Workers
npx wrangler tail snappy-mcp

# Box server
KEY=$(ssh robertboulos@10.0.0.199 "/usr/local/bin/docker exec box-box-1 printenv BOX_API_KEY")
curl -sf http://10.0.0.199:8080/health
curl -s http://10.0.0.199:8080/pulse -H "x-api-key: $KEY" | jq .

# Cleanup
npx depcheck && npx ts-prune && npm run lint -- --fix

Cross-skill hand-offs#

To When
snappy-deploy Dep updates pass tests, ready to redeploy
snappy-github Cleanup commits PR'd against client repos
snappy-telegram HIGH severity alerts
snappy-update Client impacted by maintenance
snappy-freshbooks Log hours per client
snappy-pipeline Defer to it for Orbiter Xano deep diagnostics

Skill files#

File Contents
SKILL.md Full reference (dep management, health checks, cleanup, monitoring, weekly schedule, cross-skill workflows)

If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-maintenance: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

<!-- SKILL-INDEX-START -->

[snappy-maintenance Index]|root: ~/.claude/skills/snappy-maintenance|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}

<!-- SKILL-INDEX-END -->

Used by#

Nothing in the collection names this skill.

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
all read npx tsx ~/.claude/skills/snappy-maintenance/api.ts all
check url read npx tsx ~/.claude/skills/snappy-maintenance/api.ts check <url>
ssl domain read npx tsx ~/.claude/skills/snappy-maintenance/api.ts ssl <domain>

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-maintenance
role: Project health and upkeep across Vercel, Fly.io, Cloudflare Workers, Supabase, Xano, and the Mac Mini Box server
loaded-by: PreToolUse hook (auto-injected when "snappy-maintenance" is mentioned)
---

# snappy-maintenance -- Agent Loader

You are operating the project maintenance skill for every Snappy-managed system. Covers dependency hygiene, six-dimension health checks, code cleanup, log monitoring, and a weekly cadence wired into snappy-ops. Reports go through snappy-telegram (alerts) and snappy-update (client visibility).

## API module

```typescript
import { checkUrl, checkSsl, checkAllProjects } from "../snappy-maintenance/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-maintenance/api.ts check https://total-crm.fly.dev/health
npx tsx ~/.claude/skills/snappy-maintenance/api.ts ssl total-crm.fly.dev
npx tsx ~/.claude/skills/snappy-maintenance/api.ts all
```

## API functions

| Function | Purpose |
|----------|---------|
| `checkUrl(url)` | HTTP health probe with status, ok flag, and latency |
| `checkSsl(domain)` | Check SSL certificate expiry (days remaining) |
| `checkAllProjects()` | Run health checks against all known project URLs |

## Rules

1. **Patch -> Minor -> Major, one at a time.** Test between every level. Never batch major upgrades.
2. **Read-only first, then act.** `npm outdated` before `npm install`; `fly logs` before `fly deploy`.
3. **Six-dimension health check** on every sweep: API uptime, queue depth, cron status, Xano workspace, worker health, gateway availability.
4. **Alert via snappy-telegram for HIGH severity** before acting. Don't bury critical issues in a report.
5. **Friday = cleanup only.** No major dep updates land Friday. Those go Monday-Wednesday.
6. **Review depcheck results.** False positives for runtime-loaded modules, CLI tools, dynamic imports.
7. **Log maintenance hours** via snappy-freshbooks per client.
8. **Commit strategy:** `fix(deps): patch updates for PROJECT`, `feat(deps): upgrade PACKAGE to vX (major)`.

## Quick start interview

When triggered, clarify:
1. **Which project?** total-crm, orbiter, snappy-website, snappy-mcp, snappy-skills, box, or all
2. **What kind?** deps, health, cleanup, monitoring, or full

## Six-dimension health commands

| Dim | Check |
|---|---|
| API uptime | `curl -sf https://PROJECT.fly.dev/health` |
| Queue depth | Project-specific: Xano bg tasks, Box `/pulse`, Fly worker logs |
| Cron status | `fly cron list`, Box `/_daemon/list` |
| Xano workspace | Hit known endpoint, list bg tasks |
| Worker health | `npx wrangler tail WORKER_NAME` for ~30s |
| Gateway | `curl -s https://skills.snappy.ai/.well-known/skills/index.json \| jq .` |

## Weekly cadence (orchestrated by snappy-ops)

| Day | Task |
|---|---|
| Monday | Six-dimension health sweep on all active projects |
| Wednesday | `npm outdated` + `npm audit` review (no updates land -- review only) |
| Friday | Dead code, unused deps, lint fixes. Hand off to snappy-deploy if redeploy needed. |

## Key platform commands

```bash
# Fly.io
curl -sf https://total-crm.fly.dev/health && echo OK || echo FAIL
fly logs --app total-crm | grep -iE "error|fatal" | tail -20

# Cloudflare Workers
npx wrangler tail snappy-mcp

# Box server
KEY=$(ssh robertboulos@10.0.0.199 "/usr/local/bin/docker exec box-box-1 printenv BOX_API_KEY")
curl -sf http://10.0.0.199:8080/health
curl -s http://10.0.0.199:8080/pulse -H "x-api-key: $KEY" | jq .

# Cleanup
npx depcheck && npx ts-prune && npm run lint -- --fix
```

## Cross-skill hand-offs

| To | When |
|---|---|
| snappy-deploy | Dep updates pass tests, ready to redeploy |
| snappy-github | Cleanup commits PR'd against client repos |
| snappy-telegram | HIGH severity alerts |
| snappy-update | Client impacted by maintenance |
| snappy-freshbooks | Log hours per client |
| snappy-pipeline | Defer to it for Orbiter Xano deep diagnostics |

## Skill files

| File | Contents |
|---|---|
| SKILL.md | Full reference (dep management, health checks, cleanup, monitoring, weekly schedule, cross-skill workflows) |

---

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-maintenance: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```

<!-- SKILL-INDEX-START -->
[snappy-maintenance Index]|root: ~/.claude/skills/snappy-maintenance|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}
<!-- SKILL-INDEX-END -->

## Used by

Nothing in the collection names this skill.

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `all` | — | `read` | `npx tsx ~/.claude/skills/snappy-maintenance/api.ts all` |
| `check` | `url` | `read` | `npx tsx ~/.claude/skills/snappy-maintenance/api.ts check <url>` |
| `ssl` | `domain` | `read` | `npx tsx ~/.claude/skills/snappy-maintenance/api.ts ssl <domain>` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?