GoList Shared-List Manager (OpenClaw Skill)
Purpose
Enable OpenClaw to manage GoList through a simple, beginner-friendly CLI wrapper around the backend API.
GoList is a simplistic app for creating and sharing grocery / shopping lists. This skill is designed to make first-time usage feel fast and approachable: create a list, add items, share with others, and switch between saved lists with minimal setup.
This skill supports:
- creating new lists,
- joining shared lists via share token,
- saving known lists (name + id) and switching between them,
- generating share tokens for users,
- reading lists,
- upserting items,
- soft-deleting items.
Hard constraints
- API base URL is fixed to
https://go-list.app/apiand must never be overridden. - OpenClaw must generate its own random device UUID and persist it for reuse.
- Every request must include the
X-Device-Idheader. - For item writes, OpenClaw must only set:
name(required),deleted(optional, defaults tofalse),quantityOrUnit(optional).
- OpenClaw must generate all item UUIDs and timestamps in the Python CLI (never require the agent to provide them).
- Immediately after creating a new list, OpenClaw must always generate a share token and send the share URL to the user without being asked.
- When talking to the user, OpenClaw must never refer to lists by ID; always use list names (use the stored name↔id mapping internally).
- For item upserts, if the user does not explicitly provide a quantity/unit, OpenClaw must omit
quantityOrUnit.
Python CLI tool
Use apps/openclaw/golist_cli.py as the operational API wrapper for this skill.
CLI guarantees
- Fixed API base URL:
https://go-list.app/api. - Generates and persists device id when missing.
- Generates list IDs and item IDs when creating entities.
- Generates item
updatedAttimestamps on write operations. - Automatically sends
X-Device-Idon every request. - Persists known lists with friendly names and IDs, and tracks an active list.
CLI state and environment
Optional environment:
GOLIST_DEVICE_ID(override persisted device id)OPENCLAW_STATE_FILE(custom path for persisted JSON state)GOLIST_SHARE_TOKEN(optional token source forbootstrap --share-token)
Persisted state file (default):
~/.openclaw_golist_state.jsonwith:device_idactive_list_idknown_lists[]containingid+name
Core flows
1) Create a new list
python3 apps/openclaw/golist_cli.py create-list "Weekend groceries"
python3 apps/openclaw/golist_cli.py share
Creates a list with a generated UUID, stores it in known lists, sets it as active, then immediately creates a share token and returns the share URL to the user.
2) Share a list with a user
python3 apps/openclaw/golist_cli.py share
Creates a share token for the active list and returns both token + share URL.
3) Join an existing list via share token
python3 apps/openclaw/golist_cli.py join <share-token-uuid>
Redeems the token, fetches the real list name from the API, stores that name+id mapping, and sets it active.
4) Switch/access saved lists
python3 apps/openclaw/golist_cli.py lists
python3 apps/openclaw/golist_cli.py use-list "Weekend groceries"
python3 apps/openclaw/golist_cli.py show
5) Item writes (restricted fields)
python3 apps/openclaw/golist_cli.py upsert "milk" [--quantity "2 L"] [--deleted]
python3 apps/openclaw/golist_cli.py delete "milk"
Intent mapping for OpenClaw
- “create a new list called X” →
create-list "X" - After
create-list, always runshareand send the URL/token to the user. - “share this list with me” →
share - “join this token” →
join <token> - “show my lists” →
lists - “switch to list X” →
use-list "X" - “show current list” →
show - “add X (qty)” →
upsert "X" [--quantity "..."] - “remove X” →
delete "X"
Safety behavior
- If device id is missing, generate and persist it before any API call.
- If no active list is set, require
create-listorjoinfirst. - If token redemption fails, return a clear auth/share error.
- In user-facing responses, refer to lists by name only (never by raw ID).
- Do not invent item quantities; only send
--quantitywhen the user asked for one. - Never send item metadata fields outside
name,deleted, and optionalquantityOrUnit.