flysolid
Install: claude install-skill intentic/intentic
# Fly.io (connected)
Token in `$FLY_API_TOKEN`, organization slug in `$FLY_ORG`. Everything below is the Machines API at
`https://api.machines.dev/v1`; flyctl is not installed here, and a copy you install yourself reads the plain
name, so hand it the token per command: `FLY_API_TOKEN=$FLY_API_TOKEN fly status -a <APP>`. Define this helper
once per shell: `flyapi <METHOD> <path> [-d '<json>']`:
```sh
flyapi() { local m="$1" p="$2"; shift 2; curl -s -X "$m" -H "Authorization: Bearer $FLY_API_TOKEN" \
-H "Content-Type: application/json" "https://api.machines.dev/v1/$p" "$@"; }
```
The machine is the unit: an app is a namespace with its own private network, and scaling means creating or
destroying machines inside one. A failure answers non-2xx with `{"error": "…"}`, so read `.error` rather than
assuming the shape of the result: 404 is definitively gone, 401/403 is a token that never covered this, and an
app-scoped token refuses org-wide calls outright instead of answering an empty list.
## Reading
- What this token is: `flyapi GET tokens/current | jq -c '.tokens[] | {org_slug, apps, user}'`
- Apps: `flyapi GET "apps?org_slug=$FLY_ORG" | jq -c '.apps[] | {name, status, machine_count, volume_count}'`
- Every machine in the org, with the app it belongs to: `flyapi GET "orgs/$FLY_ORG/machines" | jq -c '.machines[] | {app_name, id, name, state, region}'`, page on with `?cursor=<next_cursor>`
- Machines in one app: `flyapi GET apps/<APP>/machines | jq -c '.[] | {id, name, state,