{"id":"ac39118b-3734-4750-b42a-a69426766522","slug":"server-discovery","kind":"skill","name":"server-discovery","summary":"Agent skill: read-only discovery of servers over ssh, host cards, fleet index and network map for a devops harness","owner":"EvilFreelancer","repoUrl":"https://github.com/EvilFreelancer/server-discovery","license":"MIT","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-10-17T18:46:48.000Z","addedAt":"2026-10-22T02:02:08.602Z","logoUrl":"https://avatars.githubusercontent.com/u/9089568?u=a8b7660a8dd3450fd8bcc56682fba1102a879a83&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":[],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T09:55:25.464Z","sample":false,"url":"https://conduits.dev/tools/server-discovery","language":"Python","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# server-discovery\n\nAn agent skill that reads servers read-only over ssh and keeps their **host cards** in a\nfleet harness repository up to date. It owns the scripts the whole set of fleet skills\nruns on: the probes, the card writer, the validator, the host index and the network map.\n\nIt is one of four skills of a universal devops harness, a git repository that mirrors a\nfleet of servers as code:\n\n| Skill | Does |\n|---|---|\n| **server-discovery** | read a box, compare with its card, refresh the card, validate the fleet, regenerate the index and the map |\n| [server-onboarding](https://github.com/EvilFreelancer/server-onboarding) | add a new box: placement, card, README, mirrored configs, Topology, GPU hand-off |\n| [server-healthcheck](https://github.com/EvilFreelancer/server-healthcheck) | is a box or a namespace actually healthy, read-only |\n| [gpu-server-setup](https://github.com/EvilFreelancer/gpu-server-setup) | NVIDIA or Intel Arc driver, Docker GPU access, serving stacks, power caps |\n\n## The harness it expects\n\n```\nfleet.yaml                       optional settings: password policy, mirror layout, extra tags, map\nREADME.md                        generated list of every namespace between <!-- hosts:start/end -->\n<namespace>/README.md            namespace card (frontmatter), ## Topology (Mermaid), host list\n<namespace>/<host>/README.md     host card (frontmatter) + narrative\n<namespace>/<host>/...           configs mirrored from the box\n.agents/skills/<skill>/          the skills\n```\n\nThe card schema, the namespace card, the Topology notation and `fleet.yaml` are\ndocumented in [`references/`](references/):\n[host-card.md](references/host-card.md),\n[namespace-card.md](references/namespace-card.md),\n[harness.md](references/harness.md).\n\n## What it does\n\n- **`scripts/discover.sh`** - a POSIX probe that prints `### section` blocks: identity,\n  OS, kernel, CPU, memory, disks, sudo, sshd auth, Docker and its runtimes, `nvidia-smi`,\n  NVIDIA cards on the PCI bus from sysfs, Intel discrete GPUs (Arc, Battlemage) from\n  sysfs and debugfs. Runs on Debian, Ubuntu, busybox (OpenWrt) and Synology DSM.\n- **`scripts/discover.py`** - sends the probe over ssh in batch mode (or parses a saved\n  run) and prints the card facts as JSON, plus probe keys that flag an incomplete NVIDIA\n  stack (cards on the bus without a driver, Docker without the `nvidia` runtime);\n  `--apply` writes the facts into a card and leaves the hand-written keys and the body\n  alone.\n- **`scripts/discover-net.sh`** - the network counterpart: addresses, routes, listening\n  ports, Docker publish ports and compose projects, wireguard, OpenVPN, `/etc/hosts`,\n  `~/.ssh/config`, DNAT rules (`iptables`, `nft`, OpenWrt `uci`).\n- **`scripts/render_index.py`** - validates `fleet.yaml` and every card and rewrites the\n  generated host lists; `--check` is the commit gate.\n- **`scripts/render_map.py`** - when `fleet.yaml` turns it on, one self-contained HTML\n  page that draws the fleet as a graph from the cards and the Topology diagrams, fonts\n  inlined, no network needed.\n\nThe skill compares before it writes: a read that lost a GPU, a disk or a known value\nblocks the apply, and another hostname answering on the card's ssh command is reported,\nnot written.\n\n## Install\n\nThe skill is distributed through the [rpa-skills](https://github.com/EvilFreelancer/rpa-skills)\ncatalog together with the other fleet skills.\n\n**Claude Code**: add the catalog once, then install the set from it:\n\n```text\n/plugin marketplace add EvilFreelancer/rpa-skills\n/plugin install server-discovery@rpa-skills\n/plugin install server-onboarding@rpa-skills\n/plugin install server-healthcheck@rpa-skills\n```\n\n**Codex**: `codex plugin marketplace add EvilFreelancer/rpa-skills`, then install from `/plugins`.\n\n**Coddy**: the catalog is built in, `coddy skills sync` installs and updates the whole set.\n\nInside a harness repository, as a git submodule next to the other fleet skills:\n\n```bash\ngit submodule add https://github.com/EvilFreelancer/server-discovery.git .agents/skills/server-discovery\nln -s ../../.agents/skills/server-discovery .claude/skills/server-discovery   # Claude Code\n```\n\nAs a plain skill folder, copy or symlink this repository into a skill root (its\n`SKILL.md` lives at the repo root); the directory name must match the `name` field:\n\n| Tool          | Path |\n|---------------|------|\n| Coddy         | `~/.coddy/skills/server-discovery/` |\n| Claude Code   | `~/.claude/skills/server-discovery/` |\n| Cursor        | `~/.cursor/skills/server-discovery/` |\n| OpenAI Codex  | `~/.codex/skills/server-discovery/` |\n\nThe commands in the skills assume the project-level install `.agents/skills/`; with\nanother location the agent uses that prefix.\n\nRequirements on the machine the agent runs on: Python 3.10+, PyYAML, OpenSSH. On the\nboxes: a POSIX `sh`.\n\n## Usage\n\n- \"Re-scan node1, the driver was upgraded.\"\n- \"Which kernel and GPUs does every box in the lab namespace have now?\"\n- \"Validate the cards and regenerate the index.\"\n- \"Draw the network map of the fleet.\"\n\n```bash\npython3 scripts/discover.py --ssh \"ssh node1\"                      # JSON, writes nothing\npython3 scripts/discover.py --input node1.txt --apply lab/node1/README.md\npython3 scripts/render_index.py --check\npython3 -m unittest discover -s tests -v\n```\n\n## License\n\nMIT © Pavel Rykov. The bundled Inter and JetBrains Mono fonts are under the SIL Open\nFont License 1.1, see `templates/fonts/`.\n"}