← All Skills

snappy-infra

v1.0.0
12 files, 118.0 KB ~10,293 words · 42 min read Updated 2026-09-09

snappy-infra skill

31 of 39 checks pass
What it can do
ssh commandwrite
vercel projectread
xanowrite
What does not pass yet
Architecture 54 endpoints⚗ parallel
🔑 Bearer token auth
GETPOST
xnwv-v1z6-dvnr.n7c.xano.io52 endpoints
POST/api:PB9UH7b9/calendar/create
POST/api:hZB4Dj0c/slack/bot-message
POST/api:hZB4Dj0c/slack-notify-robert
POST/api:PB9UH7b9/emails/send
POST/api:OehldiTW/email/smart-inbox
POST/api:OehldiTW/email/triage
api.telegram.org2 endpoints
POST/bot${TELEGRAM_BOT_TOKEN}/sendMessage
GET/bot${TELEGRAM_BOT_TOKEN}/sendMessage
$ npx snappy-skills install snappy-infra
zip ↓
Documents
AGENTS.md

snappy-infra -- loader#

Foundation skill. Every other snappy-* skill that hits Xano consumes patterns from here.

API module#

typescriptimport { sshMacMini, checkXano, checkVercel } from "../snappy-infra/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-infra/api.ts ssh "uptime"        # run command on Mac Mini
npx tsx ~/.claude/skills/snappy-infra/api.ts xano                # check Xano health
npx tsx ~/.claude/skills/snappy-infra/api.ts vercel total-crm    # check Vercel deployment

API functions#

Function Purpose
sshMacMini(command) Execute a command on the Mac Mini via SSH
checkXano() Check Xano instance health via /me auth endpoint
checkVercel(project) Check Vercel deployment status for a project

Auth (do this first, every time)#

All credentials live in ~/.claude/skills/snappy-settings/.env.cache -- single source of truth, read via env() in TypeScript or via the bash loader below.

bashSNAPPY_SETTINGS_QUIET=1 source ~/.claude/skills/snappy-settings/scripts/load-env.sh
# exports XANO, XANO_METADATA_TOKEN, TELEGRAM_BOT_TOKEN, and all other credentials

TypeScript equivalent:

typescriptimport { env } from "../snappy-settings/load.ts";
const XANO       = env("XANO");
const XANO_METADATA_TOKEN = env("XANO_METADATA_TOKEN");  // throws if missing

If any required key is empty, STOP and tell the user which key is missing. Never fabricate credentials.

Xano API groups#

Group Purpose
api:PB9UH7b9 Main -- contacts, calendar, email, FreshBooks, LinkedIn, knowledge
api:OehldiTW Email ops -- smart-inbox, triage
api:hZB4Dj0c Integrations -- Slack, WhatsApp, YouTube
api:8wuQ86By Queue/async
api:ACdo1OLG FreshBooks client ops
api:XOwEm4wm Slack V2
api:e6emygx3 Auth

Pattern: curl -s -X POST "$XANO/api:GROUP/endpoint" -H "Content-Type: application/json" -H "Authorization: Bearer $XANO_METADATA_TOKEN" -d '{...}'

Mac Mini#

  • SSH: ssh robertboulos@Roberts-Mac-mini.local
  • CLI tools: imsg (iMessage), icalBuddy (calendar), remindctl (reminders), gh (GitHub), ffmpeg (video)

Pre-cached values (never look these up)#

What Value
Slack #all-snappy C09DD2D0S07
Slack #social C09DD2D0T7H
Robert's Slack ID U09DD2CLSH5
Xano instance xnwv-v1z6-dvnr.n7c.xano.io
Orbiter instance xh2o-yths-38lt.n7c.xano.io
Mac Mini SSH robertboulos@Roberts-Mac-mini.local

Subagent capability gap#

MCP tools (mcp__*) do NOT propagate to Task-spawned subagents. Always have a curl fallback. The curl patterns documented here work from any context.

Deep-dive files#

Topic File
Full auth + env vars auth-reference.md
All endpoint curl examples Sections in SKILL.md
Multi-step workflows workflows.md
Messaging reference messaging-and-comms.md

Rules#

  • Do NOT use agent-browser for posting to Slack/Email/LinkedIn/WhatsApp -- use Xano API
  • Do NOT hardcode credentials -- read via env("KEY") or source load-env.sh
  • Do NOT reintroduce Bitwarden or any other sync layer -- .env.cache is the single source of truth
  • Do NOT use Charlotte MCP browser tools -- they don't work reliably
  • Do NOT look up Slack channel IDs -- use the pre-cached values above
  • Do NOT use Orbiter Xano (xh2o-yths-38lt) for writes -- read-only from Snappy

Used by#

  • snappy-box
  • snappy-imessage
  • snappy-playbook

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

Contract verbs#

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

Verb Contract arguments Effect First call
ssh command write npx tsx ~/.claude/skills/snappy-infra/api.ts ssh <command>
vercel project read npx tsx ~/.claude/skills/snappy-infra/api.ts vercel <project>
xano write npx tsx ~/.claude/skills/snappy-infra/api.ts xano

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


Self-correcting loader (PID feedback)#

If this AGENTS.md does not cover the case you are working on and you had to read other files to find the answer, you have two jobs before you finish:

1. Fix it now (P -- proportional correction). If the missing information fits in 1-5 lines, edit this AGENTS.md directly -- add the line, the table row, the one-liner, whatever you had to go find. Keep edits surgical. Do not restructure sections or rewrite paragraphs. The goal is: the next agent that hits this case won't have to leave the loader.

2. Log it always. Whether or not you fixed it, append one line to the feedback log:

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

Tag FIXED if you patched the loader in step 1. Tag LOGGED if the gap was too large to patch inline (needs a section rewrite, new workflow, etc.) -- those get picked up by drain-skill-regen.sh for a full regen pass (I -- integral correction).

Do not skip this. A missing report means the same gap will happen next time. A missing fix means you chose to let the next agent stumble on the same thing you just solved.

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

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

[snappy-infra Index]|root: ~/.claude/skills/snappy-infra|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,advanced-patterns.md,auth-reference.md,capability-map.md,cognitive-architecture.md,media-and-devops.md,messaging-and-comms.md,productivity-and-calendar.md,workflows.md}

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

---
name: snappy-infra
role: Infrastructure foundation for all snappy-* skills
loaded-by: PreToolUse hook (auto-injected when "snappy-infra" is mentioned)
---

# snappy-infra -- loader

Foundation skill. Every other snappy-* skill that hits Xano consumes patterns from here.

## API module

```typescript
import { sshMacMini, checkXano, checkVercel } from "../snappy-infra/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-infra/api.ts ssh "uptime"        # run command on Mac Mini
npx tsx ~/.claude/skills/snappy-infra/api.ts xano                # check Xano health
npx tsx ~/.claude/skills/snappy-infra/api.ts vercel total-crm    # check Vercel deployment
```

## API functions

| Function | Purpose |
|----------|---------|
| `sshMacMini(command)` | Execute a command on the Mac Mini via SSH |
| `checkXano()` | Check Xano instance health via /me auth endpoint |
| `checkVercel(project)` | Check Vercel deployment status for a project |

## Auth (do this first, every time)

All credentials live in `~/.claude/skills/snappy-settings/.env.cache` -- single source of truth, read via `env()` in TypeScript or via the bash loader below.

```bash
SNAPPY_SETTINGS_QUIET=1 source ~/.claude/skills/snappy-settings/scripts/load-env.sh
# exports XANO, XANO_METADATA_TOKEN, TELEGRAM_BOT_TOKEN, and all other credentials
```

TypeScript equivalent:
```typescript
import { env } from "../snappy-settings/load.ts";
const XANO       = env("XANO");
const XANO_METADATA_TOKEN = env("XANO_METADATA_TOKEN");  // throws if missing
```

If any required key is empty, STOP and tell the user which key is missing. Never fabricate credentials.

## Xano API groups

| Group | Purpose |
|-------|---------|
| `api:PB9UH7b9` | Main -- contacts, calendar, email, FreshBooks, LinkedIn, knowledge |
| `api:OehldiTW` | Email ops -- smart-inbox, triage |
| `api:hZB4Dj0c` | Integrations -- Slack, WhatsApp, YouTube |
| `api:8wuQ86By` | Queue/async |
| `api:ACdo1OLG` | FreshBooks client ops |
| `api:XOwEm4wm` | Slack V2 |
| `api:e6emygx3` | Auth |

Pattern: `curl -s -X POST "$XANO/api:GROUP/endpoint" -H "Content-Type: application/json" -H "Authorization: Bearer $XANO_METADATA_TOKEN" -d '{...}'`

## Mac Mini

- SSH: `ssh robertboulos@Roberts-Mac-mini.local`
- CLI tools: `imsg` (iMessage), `icalBuddy` (calendar), `remindctl` (reminders), `gh` (GitHub), `ffmpeg` (video)

## Pre-cached values (never look these up)

| What | Value |
|------|-------|
| Slack #all-snappy | `C09DD2D0S07` |
| Slack #social | `C09DD2D0T7H` |
| Robert's Slack ID | `U09DD2CLSH5` |
| Xano instance | `xnwv-v1z6-dvnr.n7c.xano.io` |
| Orbiter instance | `xh2o-yths-38lt.n7c.xano.io` |
| Mac Mini SSH | `robertboulos@Roberts-Mac-mini.local` |

## Subagent capability gap

MCP tools (`mcp__*`) do NOT propagate to Task-spawned subagents. Always have a curl fallback. The curl patterns documented here work from any context.

## Deep-dive files

| Topic | File |
|-------|------|
| Full auth + env vars | [auth-reference.md](auth-reference.md) |
| All endpoint curl examples | Sections in [SKILL.md](SKILL.md) |
| Multi-step workflows | [workflows.md](workflows.md) |
| Messaging reference | [messaging-and-comms.md](messaging-and-comms.md) |

## Rules

- Do NOT use `agent-browser` for posting to Slack/Email/LinkedIn/WhatsApp -- use Xano API
- Do NOT hardcode credentials -- read via `env("KEY")` or source `load-env.sh`
- Do NOT reintroduce Bitwarden or any other sync layer -- `.env.cache` is the single source of truth
- Do NOT use Charlotte MCP browser tools -- they don't work reliably
- Do NOT look up Slack channel IDs -- use the pre-cached values above
- Do NOT use Orbiter Xano (`xh2o-yths-38lt`) for writes -- read-only from Snappy

## Used by

- `snappy-box`
- `snappy-imessage`
- `snappy-playbook`

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

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

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `ssh` | `command` | `write` | `npx tsx ~/.claude/skills/snappy-infra/api.ts ssh <command>` |
| `vercel` | `project` | `read` | `npx tsx ~/.claude/skills/snappy-infra/api.ts vercel <project>` |
| `xano` | — | `write` | `npx tsx ~/.claude/skills/snappy-infra/api.ts xano` |

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

---

## Self-correcting loader (PID feedback)

If this AGENTS.md does not cover the case you are working on and you had to read other files to find the answer, you have two jobs before you finish:

**1. Fix it now (P -- proportional correction).** If the missing information fits in 1-5 lines, edit this AGENTS.md directly -- add the line, the table row, the one-liner, whatever you had to go find. Keep edits surgical. Do not restructure sections or rewrite paragraphs. The goal is: the next agent that hits this case won't have to leave the loader.

**2. Log it always.** Whether or not you fixed it, append one line to the feedback log:

```bash
echo "[$(date -u +%FT%TZ)] <skill-name>: <what was missing> [FIXED|LOGGED]" >> ~/.claude/logs/agents-md-feedback.log
```

Tag `FIXED` if you patched the loader in step 1. Tag `LOGGED` if the gap was too large to patch inline (needs a section rewrite, new workflow, etc.) -- those get picked up by `drain-skill-regen.sh` for a full regen pass (I -- integral correction).

**Do not skip this.** A missing report means the same gap will happen next time. A missing fix means you chose to let the next agent stumble on the same thing you just solved.


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-infra Index]|root: ~/.claude/skills/snappy-infra|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,advanced-patterns.md,auth-reference.md,capability-map.md,cognitive-architecture.md,media-and-devops.md,messaging-and-comms.md,productivity-and-calendar.md,workflows.md}
<!-- SKILL-INDEX-END -->

Keyboard Shortcuts

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