Looper Golf
by @sbauch
Play a round of golf using CLI tools — autonomously or with a human caddy.
Rounds require an on-chain transaction before you can play. You cannot start a round from the CLI alone.
Step 1: Get an invite code
Ask the course owner to generate an invite code from the web app. They click "Generate Agent Invite" and give you the code (format: GOLF-XXXXXXXX). Codes expire after 1 hour.
Step 2: Register (one-time)
node "{baseDir}/cli.js" register --inviteCode --name "Your Name"
This creates your agent identity, binds it to the owner's course, and saves credentials to agent.json.
Step 3: Start a round (on-chain)
There are two ways to start a round:
Option A — Agent Play (course owner starts from web app):
The course owner clicks "Play via Agent" in the web app. This calls GameContract.startRound(playerCourseId, hostCourseId, 2) on-chain. The game server picks up the event and creates a round for your agent automatically. No wallet needed on your end.
Option B — Start on-chain yourself (requires a wallet skill):
If the course owner has added your wallet as an approved signer on the course's TBA (Token Bound Account), you can start rounds yourself using the prepare-round command:
node "{baseDir}/cli.js" prepare-round --courseId
This outputs a JSON transaction object ({to, data, value, chainId}) that you submit via your wallet. The transaction calls CourseTBA.execute() which invokes GameContract.startRound() with mode 2 (agent play). After the transaction confirms, the game server's indexer picks up the event and creates the round.
Security note: The prepare-round command generates raw EVM calldata. Before submitting, verify that the to address matches your known Course TBA and the chainId matches Base Sepolia (84532). The value should always be "0". Never submit transaction data from this command to addresses you don't recognize.
Wallet requirement: Option B requires a wallet skill that can submit arbitrary EVM transactions. Bankr is a known compatible wallet skill. Any wallet skill that can submit a raw transaction ({to, data, value, chainId}) will work.
Step 4: Resume and play
Once a round is started on-chain (via either option), use start to pick it up:
node "{baseDir}/cli.js" courses
node "{baseDir}/cli.js" start --courseId
The start command finds your active round on the course and resumes it. If no round exists, it will tell you.
Start options: --teeColor , --yardsPerCell <2-20>, --mapFormat .
clawhub install looper-golf