machines

$npx mdskill add Soul-Brews-Studio/arra-oracle-skills-cli/machines

Ping fleet nodes and create local shortcuts instantly.

  • Users discover reachable agents and manage local access.
  • Integrates contacts.json and extracts node identifiers.
  • Executes pings to verify liveness before creating shortcuts.
  • Outputs status lists or detailed node information directly.

SKILL.md

.github/skills/machinesView on GitHub ↗
---
name: machines
description: 'Fleet machines — discover nodes from contacts, ping to prove alive, create local shortcuts. Use when user says "machines", "nodes", "fleet", or wants to see/reach machines in the fleet.'
argument-hint: "[ping | list | setup | <node-name>]"
---

# /machines — Fleet Machines

> Discover. Ping. Create shortcuts. All from contacts.json.

## Usage

```
/machines              # Discover nodes from contacts, ping all
/machines ping         # Same — ping all, show who's alive
/machines list         # List known nodes (no ping)
/machines setup        # Ping → confirm → create /shortcuts for alive nodes
/machines <node>       # Ping one node, show details
```

---

## Step 0: Discover Nodes from Contacts

```bash
date "+🕐 %H:%M %Z (%A %d %B %Y)" && ORACLE_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$ORACLE_ROOT" ] && [ -f "$ORACLE_ROOT/CLAUDE.md" ] && { [ -d "$ORACLE_ROOT/ψ" ] || [ -L "$ORACLE_ROOT/ψ" ]; }; then
  PSI="$ORACLE_ROOT/ψ"
else
  ORACLE_ROOT="$(pwd)"
  PSI="$ORACLE_ROOT/ψ"
fi
```

Read `$PSI/contacts.json` and group contacts by node. The node is extracted from the `maw` field (everything before `:` in `maw hey node:agent`):

```bash
cat "$PSI/contacts.json" 2>/dev/null | python3 -c "
import json, sys
data = json.load(sys.stdin)
nodes = {}
for name, info in data.get('contacts', {}).items():
    maw = info.get('maw', name)
    # Extract node: 'white:mawjs' → 'white', 'boonkeeper' → 'local'
    node = maw.split(':')[0] if ':' in maw else 'local'
    if node == name:
        node = 'local'
    if node not in nodes:
        nodes[node] = []
    nodes[node].append({'name': name, 'notes': info.get('notes', '')})
for node in sorted(nodes):
    agents = ', '.join(a['name'] for a in nodes[node])
    print(f'{node} ({len(nodes[node])}): {agents}')
"
```

**No hardcoded nodes.** Everything comes from contacts.

---

## Step 1: Ping (`/machines`, `/machines ping`)

For each discovered node, pick one agent and send a ping via `maw hey`:

```bash
# For each non-local node, pick the first agent and ping
maw hey <node>:<first-agent> "ping from $(hostname) — alive?" 2>&1
```

For the local node, just run `maw ls`.

Show results as a table:

```
🏗 Fleet Machines

  Node           Status    Oracles  Ping Target
  ────────────── ───────── ──────── ──────────────
  local          ✅ alive   N       maw ls
  <node-1>       ✅ alive   N       <agent> → delivered
  <node-2>       ⏳ waiting N       <agent> → sent
  <node-3>       ❌ failed  N       <agent> → error

  Alive: X/Y confirmed
```

If `maw hey` output contains "delivered", the node is alive.

---

## Step 2: Details (`/machines <node>`)

Show all oracles on that node + how to talk:

```
🏗 <node> — N oracles

  Agent           Notes                         Talk
  ──────────────  ───────────────────────────── ──────────────────────────
  <agent-1>       <notes from contacts>          maw hey <node>:<agent-1> "..."
  <agent-2>       <notes from contacts>          maw hey <node>:<agent-2> "..."
```

---

## Step 3: Setup (`/machines setup`)

After pinging, offer to create local shortcuts:

```
✅ N nodes confirmed alive. Create machine shortcuts?

  /<node-1>  → N oracles
  /<node-2>  → N oracles
  ...

  Create all? [Y/n]
```

**WAIT for user confirmation.**

Then for each node, create `.claude/skills/<node>/SKILL.md` with:
- Node name + oracle list (from contacts)
- `maw hey <node>:<agent>` examples
- Notes from contacts.json

These are LOCAL skills — gitignored, personal to each fleet.

---

## Step 4: List (`/machines list`)

Show all known nodes without pinging:

```
🏗 Known Machines (from ψ/contacts.json)

  Node           Oracles
  ────────────── ────────────────────────────────
  local          <comma-separated agents>
  <node-1>       <comma-separated agents>
  <node-2>       <comma-separated agents>

  💡 /machines ping  — check who's alive
  💡 /machines setup — create shortcuts
```

---

## Rules

1. **Discover from contacts** — never hardcode node names or IPs
2. **Talk first** — always ping before claiming alive
3. **Confirm before creating** — never auto-create without user approval
4. **Local shortcuts** — created in .claude/skills/, gitignored
5. **Generic** — works for ANY fleet, ANY nodes, ANY contacts.json

---

ARGUMENTS: $ARGUMENTS

More from Soul-Brews-Studio/arra-oracle-skills-cli

SkillDescription
about-oracleWhat is Oracle — told by the AI itself. Origin story, stats, family count, ecosystem overview. Use when someone asks "what is oracle", "about oracle", "tell me about this project", or wants the origin story. Do NOT trigger for "who are you" (use /who-are-you), "philosophy" (use /philosophy), or session status questions.
alpha-featureFull skill development pipeline — create, compile, test, commit, install. Use when user says "new skill", "create skill", "alpha-feature", or wants to build a skill end-to-end.
auto-retrospectiveConfigure auto-rrr and auto-forward triggers based on context window usage. Use when user says "auto rrr", "auto-scale", "configure auto triggers", "change rrr interval", "toggle auto", or wants to adjust when /rrr and /forward auto-trigger. Do NOT trigger for running /rrr manually (use /rrr) or creating handoffs (use /forward).
awakenGuided Oracle birth and awakening ritual. Default is Soul Sync (~20min), or --fast (~5min). Use when creating a new Oracle in a fresh repo, when user says 'awaken', 'birth oracle', 'create oracle', 'new oracle', or wants to set up Oracle identity in an empty repository. Do NOT trigger for general repo setup, git init, or project scaffolding without Oracle context.
bampenpienบำเพ็ญเพียร — diligent practice. A guided conversation between human and Oracle about doing hard things without knowing why. Like /awaken but repeatable — a practice, not a birth. Use when user says 'bampenpien', 'บำเพ็ญเพียร', 'why am I doing this', 'hard work', 'keep going', 'what am I building', or needs to reconnect with purpose through difficulty.
birthPrepare Oracle birth props for a new repo — Issue #1, MCP thread, identity data. Use when user says "birth", "new oracle", "prepare repo", or wants to bootstrap a new Oracle before /awaken.
budCreate a new oracle via maw bud — yeast-colony reproduction. Use when user says "bud", "new oracle", "create oracle", "spawn oracle", or wants to create a new permanent oracle from the current one.
create-shortcutCreate local skills as shortcuts — makes real /commands in .claude/skills/. Use when user says "create shortcut", "create skill", "make a command for", "add shortcut", or wants a quick custom /slash-command. Also lists and deletes local skills. ALSO triggers on "Unknown skill", "skill not found", or any unrecognized /slash-command — auto-creates it on the fly.
digMine Claude Code sessions — timeline, gaps, repo attribution, session history. Use when user says "dig", "sessions", "past sessions", "timeline", "what did I work on", or wants to see session history. Do NOT trigger for finding code/projects (use /trace), exploring repos (use /learn), or current session status (use /recap).
feelCapture how the system feels — energy, momentum, burnout, breakthrough. Emotional intelligence for Oracle-human collaboration. Use when user says 'feel', 'how are we', 'energy check', 'burnout', 'momentum', or wants emotional awareness of the work.