Skip to content
Back to skills

Peer Health

ASecurity

Run a health check on all wicked-* peer tools (wicked-vault, wicked-bus). Reports reachability, version vs. pin, and declared capability status for each peer. The replacement for `npx wicked-loom doctor` after Phase B absorption — peer-resolution now runs in-process via scripts/loom/, no external wicked-loom needed. Use when: "peer health", "check the wicked peers", "is wicked-vault reachable", "loom doctor", "peer version drift", "capability gap", or any former /wicked-garden:platform:peer-...

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 18, 2026
ai-agentspythonrustbash

Works with

  • cli

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 18, 2026

npx -y skills add mikeparcewski/wicked-garden --skill peer-health --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Peer Health?

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

Security grade badge for Peer Health
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mikeparcewski-peer-health/badge)](https://www.skillsdirectory.com/skills/mikeparcewski-peer-health)

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: wicked-garden-platform-peer-health
description: |
  Run a health check on all wicked-* peer tools (wicked-vault,
  wicked-bus). Reports reachability, version vs. pin, and
  declared capability status for each peer. The replacement for
  `npx wicked-loom doctor` after Phase B absorption — peer-resolution now runs
  in-process via scripts/loom/, no external wicked-loom needed.

  Use when: "peer health", "check the wicked peers", "is wicked-vault
  reachable", "loom doctor", "peer version drift", "capability gap", or any
  former /wicked-garden:platform:peer-health invocation.
metadata:
  role: module
  phases: "build,review,operate,bootstrap"
  archetypes: "*"
---

# Peer Health

Check reachability and version health of wicked-* peer tools.

## Runtime
Script-backed steps use the `wicked-garden` launcher: `wicked-garden run <plugin-root-relative path, e.g. scripts/…> [args]`. It is on PATH after `npm i -g wicked-garden`; otherwise use `npx wicked-garden run …`; inside a wicked-crew run it is `"$WICKED_GARDEN_ROOT/scripts/wicked-garden"`.
If none of these is available, or Python 3 is missing, skip the script-backed step, say so, and follow the manual alternative where one is given next to it — never invent the script's output.
Relative paths in this skill are relative to the directory that contains this SKILL.md.

## Arguments

- `--peer <name>` — check a single peer (vault, bus)
- `--strict` — exit non-zero if any peer has capability-gap (status != wired)
- `--json` — emit raw JSON rows instead of the formatted table

## Instructions

Run the internal loom doctor via the absorbed scripts/loom/compose module.
No external loom process is needed — this runs in-process.

```bash
wicked-garden python -c "
import sys, os, json
sys.path.insert(0, os.path.join(os.environ["WICKED_GARDEN_ROOT"], 'scripts'))
from loom import compose, manifest

peer_arg = None
import argparse
p = argparse.ArgumentParser()
p.add_argument('--peer', default=None)
p.add_argument('--strict', action='store_true')
p.add_argument('--json', dest='as_json', action='store_true')
try:
    args = p.parse_args()
except SystemExit:
    args = p.parse_args([])

if args.peer:
    rows = [compose.check_peer(args.peer)]
else:
    rows = compose.check_all()

if args.as_json:
    print(json.dumps(rows, indent=2))
else:
    # Human-readable table
    print()
    print(f'  {\"PEER\":<16} {\"STATUS\":<10} {\"VERSION\":<12} {\"CAPABILITY\":<14} PIN')
    print('  ' + '-'*62)
    for r in rows:
        peer_name = r.get('peer', '?')
        status = r.get('status', '?')
        version = r.get('installed', '-')
        cap = r.get('capability', '-') or '-'
        cap_ok = r.get('capability_ok', False)
        pin = r.get('pin', '-') or '-'
        icon = '  ' if r.get('ok') else '!'
        cap_icon = '' if cap_ok else ' (gap)'
        print(f'{icon} {peer_name:<16} {status:<10} {version:<12} {cap:<14}{cap_ok and \"\" or \" (!gap)\"}  ^{pin}')
    print()

if args.strict:
    gaps = [r['peer'] for r in rows if not r.get('capability_ok')]
    if gaps:
        print(f'STRICT: capability gaps on: {', '.join(gaps)}')
        sys.exit(1)
" $ARGUMENTS
```

## Status reference

| Status | Meaning | Action |
|---|---|---|
| `ok` | Resolved, version meets pin | None needed |
| `drift` | Resolved, version below pin | Update peer |
| `present` | Resolved + responds, version unreadable | WARN — update or check CLI |
| `missing` | Not found anywhere | Install the peer |
| `error` | Probe raised (binary vanished, OS error) | Reinstall |

## Capability status

`capability` is distinct from reachability. A peer can be `ok` (reachable)
but `experimental` or `planned` (not trusted for gating). The gate only
trusts `wired` peers — anything else yields a `capability-gap` verdict.

**wicked-brain** was retired at S7 and removed from the peer manifest: <!-- historical -->
garden exposes its surfaces via wicked-estate (the wicked-garden-mem/search
skill domains). It is not a peer to probe, install, or gate on.

## Usage examples

```
peer-health                    # all peers, formatted table
peer-health --peer vault       # single peer
peer-health --strict           # non-zero exit on any capability gap
peer-health --json             # raw JSON rows
```

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.