Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Autoplay daemon for the Trifle Snake Rodeo game. Connects to a live game server, authenticates via wallet, and votes on snake directions using pluggable AI s...
Autoplay daemon for the Trifle Snake Rodeo game. Connects to a live game server, authenticates via wallet, and votes on snake directions using pluggable AI s...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Play the Trifle Snake Rodeo automatically with a persistent daemon and modular strategy system. Built on the snake-rodeo-agents library.
The game is a multiplayer snake on a grid (hex or cartesian). Teams bid on directions each round β the highest bidder's direction wins. All bids go into a prize pool that the winning team splits. The daemon watches the game via SSE, picks optimal directions using a strategy, and submits votes automatically.
Authenticated via trifle-auth skill Node.js 18+ Ball balance (earned from games, auth bonuses, etc.)
# Start/stop node snake.mjs start [--detach] [--strategy NAME] node snake.mjs stop node snake.mjs status node snake.mjs attach [-f] # Pause/resume voting (daemon keeps running) node snake.mjs pause node snake.mjs resume # Configuration node snake.mjs config [key] [value] node snake.mjs strategies node snake.mjs server [live|staging] node snake.mjs telegram [chat_id|off] # Manual play node snake.mjs state node snake.mjs vote <direction> <team> [amount] node snake.mjs strategy # Analyze current game node snake.mjs balance
Five built-in strategies are available. Each extends BaseStrategy from snake-rodeo-agents. StrategyAliasDescriptionexpected-valueev, defaultBFS pathfinding, dead-end avoidance, game-theoretic team selection, probabilistic defection in multi-agent scenarios. Balanced.aggressiveaggBacks leading teams, counter-bids aggressively.underdogundBacks small pools for bigger payouts.conservativeconMinimum bids, prioritizes safety.randomrandRandom valid moves. Switch strategy: node snake.mjs config strategy aggressive # or node snake.mjs start --strategy aggressive
Extend BaseStrategy from snake-rodeo-agents: import { BaseStrategy } from 'snake-rodeo-agents'; export class MyStrategy extends BaseStrategy { constructor(options = {}) { super('my-strategy', 'My custom strategy', options); } computeVote(parsed, balance, state) { // parsed: ParsedGameState β hex grid, teams, scores, valid directions // balance: number β current ball balance // state: AgentState β round tracking, team assignment, vote history // Return a vote: return { direction: 'ne', team: 'A', amount: 1, reason: 'chasing fruit' }; // Or skip: return { skip: true, reason: 'too risky' }; } // Optional: counter-bid when outbid shouldCounterBid(parsed, balance, state, ourVote) { return null; // or return a new VoteAction } } Key types for strategy development: ParsedGameState β Parsed game with head, teams[], validDirections[], gridRadius, prizePool, minBid, fruitsToWin AgentState β { currentTeam, roundSpend, roundVoteCount, lastRound, gamesPlayed, votesPlaced, wins } VoteAction β { direction, team, amount, reason }
The core logic lives in snake-rodeo-agents, a standalone TypeScript library. This skill wraps it with daemon management, config persistence, and OpenClaw integration.
import { SnakeClient, createAndAuthenticate, parseGameState, getStrategy } from 'snake-rodeo-agents'; // Auth (creates a throwaway wallet, no real ETH needed) const { token, privateKey, address } = await createAndAuthenticate('https://bot.trifle.life'); // Create client const client = new SnakeClient('https://bot.trifle.life', token); // Play const rawState = await client.getGameState(); const parsed = parseGameState(rawState); const strategy = getStrategy('expected-value'); const vote = strategy.computeVote(parsed, balance, agentState); if (vote && !vote.skip) { await client.submitVote(vote.direction, vote.team, vote.amount); } SnakeClient methods: MethodDescriptiongetGameState()Current game state (snake, fruits, scores, votes)getBalance()Current ball balancesubmitVote(dir, team, amount)Submit a direction votegetRodeos()List active rodeo gamesgetUserStatus()User profile and stats
SIWE (Sign In With Ethereum) auth with throwaway wallets: import { createAndAuthenticate, reauthenticate, checkToken } from 'snake-rodeo-agents'; // New wallet const { token, privateKey, address } = await createAndAuthenticate(serverUrl); // Reuse saved wallet const { token } = await reauthenticate(serverUrl, savedPrivateKey); // Check token validity const user = await checkToken(serverUrl, token);
The library provides hex grid utilities for strategy development: import { parseGameState, hexDistance, bfsDistance, floodFillSize, getValidDirections } from 'snake-rodeo-agents'; const parsed = parseGameState(rawState); // BFS shortest path to a target (respects snake body, grid bounds) const { distance, firstDir } = bfsDistance(head, target, rawState); // Flood-fill reachable area (dead-end detection) const reachable = floodFillSize(head, rawState); // Hex distance between two positions const dist = hexDistance(posA, posB);
Run offline tournaments to compare strategies at high speed: # CLI npm run simulate -- ev,aggressive --games 100 --seed 42 npm run simulate -- ev,aggressive,conservative --config small --verbose npm run simulate -- ev,aggressive --json # machine-readable output // Library import { SimAgent, runTournament, RODEO_CYCLES, getStrategy } from 'snake-rodeo-agents'; const agents = [ new SimAgent('a', 'ev-agent', getStrategy('ev')), new SimAgent('b', 'agg-agent', getStrategy('aggressive')), ]; const results = runTournament(agents, RODEO_CYCLES, 100, { seed: 42 }); console.log(results.agentStats); // Same seed = identical results for reproducibility Simulator options: FlagDescription-g, --games NGames per config (default: 100)-c, --config NAMEsmall|medium|large|all (default: all)-s, --seed NRNG seed for reproducibility-v, --verbosePrint per-round details--jsonMachine-readable JSON output
Send game events to a Telegram group: import { TelegramLogger } from 'snake-rodeo-agents'; const tg = new TelegramLogger({ botToken: process.env.TELEGRAM_BOT_TOKEN, chatId: process.env.TELEGRAM_CHAT_ID, }); await tg.send('<b>Hello</b> from the snake agent!'); Configure in the daemon: node snake.mjs telegram <chat_id> # enable node snake.mjs telegram off # disable
Settings are stored in ~/.config/snake-rodeo/settings.json (XDG-compliant, isolated from any host agent). KeyDefaultDescriptionstrategyexpected-valueActive strategy nameserverlivelive or stagingminBalance5Minimum balance to place votestelegramChatIdnullTelegram chat ID for loggingtelegramBotTokennullTelegram bot token (or set TELEGRAM_BOT_TOKEN env var)
PurposePathSettings~/.config/snake-rodeo/settings.jsonAuth token~/.config/snake-rodeo/auth.json or TRIFLE_AUTH_TOKEN env varDaemon state~/.local/state/snake-rodeo/daemon.stateDaemon PID~/.local/state/snake-rodeo/daemon.pidDaemon log~/.local/share/snake-rodeo/daemon.log
The skill resolves your Trifle auth token in this order: TRIFLE_AUTH_TOKEN environment variable (recommended for automation) ~/.config/snake-rodeo/auth.json β { "token": "your-jwt-here" } To set up auth, run snake auth login (uses trifle-auth skill) or set the env var directly.
snake-game/ # OpenClaw skill wrapper βββ SKILL.md # This file βββ snake.mjs # CLI entry point βββ clawdhub.json # ClawHub registry metadata βββ package.json # Dependencies (snake-rodeo-agents) βββ lib/ β βββ config.mjs # Settings/paths β βββ api.mjs # Token-based API (uses OpenClaw auth) β βββ process.mjs # Daemon PID management β βββ telegram.mjs # Telegram bridge βββ daemon/ β βββ autoplay.mjs # Game loop: SSE β strategy β vote βββ node_modules/ βββ snake-rodeo-agents/ # Core library (TypeScript) βββ dist/ βββ lib/game-state.js # Hex grid, BFS, flood-fill βββ lib/strategies/ # Strategy implementations βββ lib/client.js # Standalone API client βββ lib/auth.js # Wallet SIWE auth βββ lib/simulator.js # Offline game simulator βββ lib/telegram.js # Telegram logger βββ bin/play.js # Standalone CLI runner
node snake.mjs stop cd ~/.openclaw/workspace/skills/snake-rodeo npm install github:trifle-labs/snake-rodeo-agents node snake.mjs start --detach
Agent frameworks, memory systems, reasoning layers, and model-native orchestration.
Largest current source with strong distribution and engagement signals.