/SKILL.md
# Ape Church Game SDK — SKILL.md This file contains instructions for AI agents building games using the Ape Church game template. Read this file in full before writing any code or modifying any files. --- ## 1. Files You May Edit Only touch files in these locations: ``` components/my-game/ ← all game components go here public/my-game/ ← all game assets go here metadata.json ← fill out before submitting ``` Rename `my-game` to your game's name in kebab-c
npx skillsauth add asenvox/ape-gow ape-gowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This file contains instructions for AI agents building games using the Ape Church game template. Read this file in full before writing any code or modifying any files.
Only touch files in these locations:
components/my-game/ ← all game components go here
public/my-game/ ← all game assets go here
metadata.json ← fill out before submitting
Rename my-game to your game's name in kebab-case throughout (e.g. chicken-crossing, slot-machine). This rename must be consistent across components/, public/, and metadata.json.
Do not modify any of the following:
app/page.tsx
app/globals.css
app/layout.tsx
components/shared/ ← all files and subfolders
public/shared/ ← all files and subfolders
next.config.ts
tsconfig.json
package.json
package-lock.json
postcss.config.mjs
eslint.config.mjs
components.json
These are platform-managed files. Editing them will cause integration failures.
Your components/my-game/ folder must contain at minimum:
| File | Purpose |
|---|---|
| MyGame.tsx | Root game component. Owns all state and exposes all lifecycle functions. |
| MyGameWindow.tsx | Game window wrapper. Child of GameWindow from shared. |
| MyGameSetupCard.tsx | Bet configuration UI shown in setup view. |
Optional files you may add:
myGameConfig.ts — configuration constants (multipliers, speeds, thresholds, etc.)my-game.styles.css — game-scoped stylessvg/ subfolder for SVG componentsMyGame.tsx must implement all of the following. These are the contract between your game and the platform. Do not rename them.
playGame()console.log as a mock during development)currentView to 1 (ongoing)handleReset()currentView to 0 (setup)handlePlayAgain()handleReset()playGame() with new on-chain identifiershandleRewatch()handleReset()handleStateAdvance() if applicablehandleStateAdvance() (implement if applicable)Use currentView to track which view is active:
const [currentView, setCurrentView] = useState<0 | 1 | 2>(0)
// 0 = setup view
// 1 = ongoing view
// 2 = game over view
Keep all game state consolidated in as few useState calls as possible. This makes handleReset() reliable. Scattered state is the most common source of reset bugs.
// ✅ Correct
const [gameState, setGameState] = useState<GameState>(initialState)
const handleReset = () => setGameState(initialState)
// ❌ Wrong — easy to forget to reset individual values
const [score, setScore] = useState(0)
const [multiplier, setMultiplier] = useState(1)
const [isAnimating, setIsAnimating] = useState(false)
Import shared components using absolute paths. Do not copy them into your game folder.
import GameWindow from '@/components/shared/GameWindow'
import GameResultsModal from '@/components/shared/GameResultsModal'
import BetAmountInput from '@/components/shared/BetAmountInput'
import CustomSlider from '@/components/shared/CustomSlider'
import ChipSelection from '@/components/shared/ChipSelection'
Never use relative paths to reference shared components:
// ❌ Wrong
import GameWindow from '../shared/GameWindow'
import GameWindow from '../../components/shared/GameWindow'
Location — all assets must live in public/my-game/. Do not place assets anywhere else.
Required assets:
card.png — 1:1 aspect ratio, minimum 512x512px, used in the game gallerybanner.png — 2:1 aspect ratio, minimum 1024x512px, used on the game detail pageFormat rules:
Referencing assets in code — always use absolute paths from public/:
// ✅ Correct
<img src="/my-game/background.png" />
<audio src="/my-game/audio/soundtrack.mp3" />
// ❌ Wrong
<img src="./assets/background.png" />
<img src="../public/my-game/background.png" />
myGameConfig.ts or at the top of MyGame.tsx.any. Use unknown and narrow the type, or define a proper interface.any.setTimeout, setInterval, and animation frame references in handleReset().console.log statements in final submission except inside playGame() as a mock transaction placeholder.Fill out metadata.json at the repo root. This file is required for submission. All fields are required unless marked optional.
{
"team": "your-team-name",
"gameName": "your-game-name",
"displayTitle": "Your Game Title",
"description": "A short description of your game. Three sentences max.",
"authors": [
{
"name": "Your Name",
"email": "[email protected]"
}
],
"status": "pending",
"category": "arcade",
"tags": ["arcade", "example"],
"thumbnail": "/your-game-name/card.png",
"banner": "/your-game-name/banner.png",
"mainComponent": "YourGame.tsx",
"windowComponent": "YourGameWindow.tsx",
"setupComponent": "YourGameSetupCard.tsx",
"configFile": "yourGameConfig.ts",
"version": "1.0.0"
}
Rules:
team and gameName must be kebab-case and match your folder names exactlythumbnail must be /your-game-name/card.pngbanner must be /your-game-name/banner.pngstatus must be "pending" — do not change this valuecategory must be one of: arcade, card, puzzle, strategy, otherconfigFile is optional — only include if your game has a config fileVerify every item before considering the build complete. Do not submit until all are true.
Functionality
playGame() initializes game and transitions to currentView = 1handleReset() returns game to exact first-load state with currentView = 0handlePlayAgain() successfully starts a new game after completionhandleRewatch() replays the previous result without any new transactionhandleStateAdvance() works correctly if the game uses multi-step progressionCode quality
components/my-game/, public/my-game/, and metadata.jsonnpx tsc --noEmit to confirm@/components/shared/.../your-game-name/... absolute formatAssets
card.png present at 1:1 ratiobanner.png present at 2:1 ratiometadata.json
gameName matches folder name exactlythumbnail and banner paths are correctstatus is "pending"development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.