{"success":true,"commands":{"docs.read":{"summary":"Read the product docs in the right order.","goal":"Give a human or AI-agent the shortest safe path through the documentation.","docs":["WELCOME_REPLACEMENT.md","SPLIT_PAYMENTS_PRODUCT.md","FUNCTION_CATALOG.md","API.md"],"steps":["Start with product context.","Use the function catalog as the map.","Use API.md only when implementing endpoint calls."],"checks":["You can explain game, marketplace and generic split flows."]},"game.integrate":{"summary":"Connect a standalone browser game.","goal":"Make a standalone game use config, payments, sessions, scores and leaderboards.","docs":["STANDALONE_GAME_INTEGRATION.md","API.md","FUNCTION_CATALOG.md"],"steps":["Register game config.","Add NoderunnersArcadeClient.","Fetch config and leaderboard.","Create payment for paid games.","Start session.","Submit score."],"checks":["Free game can submit score.","Paid game rejects unpaid payment_id.","Leaderboard updates."]},"marketplace.integrate":{"summary":"Connect a third-party marketplace.","goal":"Create buyer invoices and split payouts to sellers and platform.","docs":["THIRD_PARTY_MARKETPLACE_INTEGRATION.md","API.md","SPLIT_PAYMENTS_PRODUCT.md"],"steps":["Add server-side HMAC client.","Validate payout destinations.","Create marketplace invoice.","Use seller_splits for carts.","Poll or verify webhooks."],"checks":["Unsigned requests fail.","Invoice returns BOLT11.","Paid order updates payout status."]},"split.design":{"summary":"Design a split-payment rule.","goal":"Define who gets sats, when, and how errors are handled.","docs":["SPLIT_PAYMENTS_PRODUCT.md","FUNCTION_CATALOG.md"],"steps":["Define gross source.","Define platform fee.","Define destinations.","Ensure amounts fit gross.","Define retry behavior."],"checks":["Every split has role, rule, destination and status."]},"destination.check":{"summary":"Validate a Lightning payout destination.","goal":"Confirm wallet alias, Lightning Address or LNURL-pay can receive sats.","docs":["THIRD_PARTY_MARKETPLACE_INTEGRATION.md","API.md"],"steps":["Ask partner for destination.","Validate destination.","Store type and limits.","Reject invalid limits."],"checks":["Valid destination returns valid=true and type."]},"fee.enable":{"summary":"Enable Noderunners product fees.","goal":"Turn on the product fee for paid game credits and/or tournaments.","docs":["API.md","SPLIT_PAYMENTS_PRODUCT.md"],"steps":["Set destination.","Set percent or fixed sats.","Enable game/tournament fee.","Run a low-value paid flow."],"checks":["Game still unlocks.","Fee metadata is stored."]},"nostr.publish":{"summary":"Publish official leaderboard snapshots.","goal":"Post game-signed leaderboards to Nostr without player Nostr login.","docs":["API.md","FUNCTION_CATALOG.md"],"steps":["Confirm Nostr config.","Run dry-run.","Publish target game.","Use --no-notes for state-only updates."],"checks":["Command shows event ids and relay results."]},"deploy.check":{"summary":"Check upload and live health.","goal":"Avoid broken FTP deploys.","docs":["FUNCTION_CATALOG.md","API.md"],"steps":["Upload changed files.","Check /.","Check /api/games.","Check one leaderboard."],"checks":["GET / is 200.","GET /api/games is 200."]},"partner.plan":{"summary":"Plan a future partner integration.","goal":"Turn a partner use case into a scoped implementation plan.","docs":["SPLIT_PAYMENTS_PRODUCT.md","FUNCTION_CATALOG.md"],"steps":["Choose use case.","Choose custodial split first.","Define destinations.","Define webhooks.","Map missing functions."],"checks":["Flow has payment source, split rule, destination and status model."]}}}