# robopark

Production architecture, device locks, verified stages, and incident memory
are recorded in [`../../docs/ROBOPARK_PRODUCTION_MEMORY.md`](../../docs/ROBOPARK_PRODUCTION_MEMORY.md).

The **RoboPark fleet control CLI** — set up, watch, and drive a room full of
talking robots from one command. `robopark` is the operator front-end; it rides
the [`infinicode`](https://www.npmjs.com/package/infinicode) device mesh, which
it installs as a dependency. You install and think in one name — everything else
is plumbing.

## Install

```sh
npm install -g robopark
```

## The whole setup — two commands

Operators think in **scheduler / robot / laptop**; the mesh underneath thinks in
hub / satellite / peer. `robopark` translates, and each role turns on the right
defaults automatically.

```sh
# On the on-site hub (LiveKit Server 1) — LAN + Tailscale + dashboard on:
robopark setup --scheduler --gateway ws://<infinibot-gateway>:18789 --start

# On each robot Pi — accept-only, LAN-discovered:
robopark setup --robot --name robopanda --start

# From anywhere — a live table of the whole fleet:
robopark fleet --watch
```

Run `robopark setup` with no role for a guided wizard.

## Commands

| Command | Does |
|---|---|
| `robopark setup` | Configure this device's role + site and (with `--start`) launch its node. |
| `robopark fleet [--watch]` | Live table of every node the mesh can see. |
| `robopark run <node> <cmd>` | Run a command on one node (use `.` for the local node). |
| `robopark apply` | Publish this hub's providers / keys / policy to every satellite. |
| `robopark dashboard [--open]` | Open the web control panel served by the hub. |

## How it fits together

```
you ── robopark ──▶ infinicode nodes (the mesh) ──▶ InfiniBot (watch)
                          └──▶ web dashboard :47913 (watch / drive)
```

- **robopark** — the remote control. A CLI, no daemon. Writes config and calls
  each node's HTTP API.
- **infinicode** — the runtime. `infinicode serve` runs on every device, forms
  the mesh, runs agents, streams telemetry, and serves the dashboard.
- **InfiniBot** — the cockpit. Each node pushes its status *up* to InfiniBot;
  you watch there (or in the built-in dashboard).

`robopark` never talks to InfiniBot directly — it drives infinicode nodes, and
those surface in InfiniBot.

## License

MIT
