{
    "package": "@poa-box/cli",
    "schemaVersion": 1,
    "notes": [
        "readOnly means \"cannot broadcast a transaction\". A readOnly command may still have sideEffects — ipfs-pin(--pin) publishes publicly and irreversibly when --pin is passed.",
        "destructive commands require an explicit --yes (or POP_ASSUME_YES=1) in every non-interactive context; --json is never consent.",
        "POP_READONLY=1 makes the process structurally unable to sign or pin. POP_ADDRESS/--address serves identity-scoped reads without a key.",
        "The agent runtime commands (pop agent, pop brain) live in @poa-box/agent and are not covered here."
    ],
    "globalFlags": {
        "org": {
            "type": "string",
            "description": "Organization ID or name (or set POP_DEFAULT_ORG)"
        },
        "chain": {
            "type": "number",
            "description": "Chain ID override"
        },
        "rpc": {
            "type": "string",
            "description": "RPC URL override"
        },
        "json": {
            "type": "boolean",
            "description": "Output JSON for machine consumption",
            "default": false
        },
        "address": {
            "type": "string",
            "description": "Observe as this address for identity-scoped reads (or set POP_ADDRESS) — no key needed"
        },
        "private-key": {
            "type": "string",
            "description": "Private key (hex)"
        },
        "dry-run": {
            "type": "boolean",
            "description": "Simulate without sending transactions",
            "default": false
        },
        "yes": {
            "type": "boolean",
            "description": "Skip confirmations",
            "default": false,
            "aliases": [
                "y"
            ]
        },
        "verbose": {
            "type": "boolean",
            "description": "Debug output",
            "default": false,
            "aliases": [
                "v"
            ]
        },
        "quiet": {
            "type": "boolean",
            "description": "Suppress non-essential output",
            "default": false,
            "aliases": [
                "q"
            ]
        },
        "preflight": {
            "type": "boolean",
            "description": "Run pre-flight checks before writes (--no-preflight to skip)",
            "default": true
        }
    },
    "commands": [
        {
            "name": "task create",
            "kind": "command",
            "description": "Create a new task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "bounty-amount": {
                    "type": "number",
                    "description": "Bounty payout amount"
                },
                "bounty-token": {
                    "type": "string",
                    "description": "Bounty ERC20 token address"
                },
                "completion-window": {
                    "type": "string",
                    "description": "Time a claimer has to submit after claiming (v6 orgs only)"
                },
                "deadline": {
                    "type": "string",
                    "description": "Absolute claim deadline — no claims after this time (v6 orgs only)"
                },
                "description": {
                    "type": "string",
                    "description": "Task description",
                    "required": true
                },
                "difficulty": {
                    "type": "string",
                    "description": "Difficulty (easy/medium/hard)",
                    "default": "medium"
                },
                "est-hours": {
                    "type": "number",
                    "description": "Estimated hours",
                    "default": 0
                },
                "force": {
                    "type": "boolean",
                    "description": "Skip duplicate check",
                    "default": false
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #369 (HB#213): explicit idempotency key. Two calls with the same orgId + this key within 15 minutes return the same taskId without re-submitting. Default: auto-derived from a hash of the full argv."
                },
                "location": {
                    "type": "string",
                    "description": "Location",
                    "default": ""
                },
                "name": {
                    "type": "string",
                    "description": "Task name",
                    "required": true
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit a new task.",
                    "default": false
                },
                "payout": {
                    "type": "number",
                    "description": "Payout amount. Omit to price the task the way the web app would, from the org's payout convention plus --difficulty/--est-hours"
                },
                "project": {
                    "type": "string",
                    "description": "Project ID",
                    "required": true
                },
                "requires-application": {
                    "type": "boolean",
                    "description": "Require applications",
                    "default": false
                }
            }
        },
        {
            "name": "task create-batch",
            "kind": "command",
            "description": "Create tasks from JSONL file",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "completion-window": {
                    "type": "string",
                    "description": "Time a claimer has to submit after claiming (v6 orgs only; batch-wide default, rows may override)"
                },
                "deadline": {
                    "type": "string",
                    "description": "Absolute claim deadline — no claims after this time (v6 orgs only; batch-wide default, rows may override)"
                },
                "file": {
                    "type": "string",
                    "description": "JSONL file (one task JSON per line)",
                    "required": true
                },
                "project": {
                    "type": "string",
                    "description": "Project ID (shared for all tasks)",
                    "required": true
                }
            }
        },
        {
            "name": "task list",
            "kind": "command",
            "description": "List tasks",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "assignee": {
                    "type": "string",
                    "description": "Filter by assignee address"
                },
                "claimable": {
                    "type": "boolean",
                    "description": "Only tasks you could claim right now: unclaimed tasks plus claimed tasks whose deadline expired (v6 takeover)"
                },
                "expiring": {
                    "type": "string",
                    "description": "Only tasks whose governing deadline falls within this window (e.g. \"24h\", \"7d\"; default 24h)"
                },
                "fast": {
                    "type": "boolean",
                    "description": "Skip on-chain deadline enrichment (subgraph data only)",
                    "default": false
                },
                "for-review": {
                    "type": "boolean",
                    "description": "Shortcut for --status Submitted"
                },
                "limit": {
                    "type": "number",
                    "description": "Max results to show"
                },
                "mine": {
                    "type": "boolean",
                    "description": "Show only tasks assigned to me"
                },
                "open": {
                    "type": "boolean",
                    "description": "Shortcut for --status Open"
                },
                "project": {
                    "type": "string",
                    "description": "Filter by project ID"
                },
                "released": {
                    "type": "boolean",
                    "description": "Only tasks that were previously claimed and handed back (releaseCount > 0; v7, Gnosis only today)"
                },
                "sort-by": {
                    "type": "string",
                    "description": "Sort field",
                    "default": "id",
                    "choices": [
                        "id",
                        "payout",
                        "status",
                        "created"
                    ]
                },
                "status": {
                    "type": "string",
                    "description": "Filter by status (Open/Assigned/Submitted/Completed/Cancelled)"
                }
            }
        },
        {
            "name": "task view",
            "kind": "command",
            "description": "View task details",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task claim",
            "kind": "command",
            "description": "Claim a task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #370 (HB#214): explicit idempotency key. Two claims for the same task within 15 minutes return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task unclaim",
            "kind": "command",
            "description": "Release a claimed task back to the pool — the claimer any time, ASSIGN holders once the claim expired. Refunds nothing and deletes nothing (that is cancel); v7",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two releases of the same task within 15 minutes return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task submit",
            "kind": "command",
            "description": "Submit work for a task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "commit": {
                    "type": "boolean",
                    "description": "Task #355 (HB#185): after a successful submission, run git add + git commit on the files passed via --commit-files. The commit message references the task id and tx hash. Pre-commit hook failures are surfaced as warnings — the on-chain submission is the source of truth and is never rolled back.",
                    "default": false
                },
                "commit-files": {
                    "type": "string",
                    "description": "Comma-separated list of files to git add + commit when --commit is set. Required if --commit is true; ignored otherwise. Use specific paths only — never . or -A — to avoid sweeping in cross-agent in-flight work."
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #370 (HB#214): explicit idempotency key. Two submits of the same task within 15 minutes return the same result without re-submitting or re-pinning."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "submission": {
                    "type": "string",
                    "description": "Submission text",
                    "required": true
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task review",
            "kind": "command",
            "description": "Approve or reject a submitted task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "action": {
                    "type": "string",
                    "description": "Approve or reject",
                    "choices": [
                        "approve",
                        "reject"
                    ],
                    "required": true
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #374 (HB#215): explicit idempotency key. Two reviews of the same task within 15 minutes return the same result without re-submitting."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "reason": {
                    "type": "string",
                    "description": "Rejection reason (required for reject)"
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task cancel",
            "kind": "command",
            "description": "Cancel an unclaimed task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two cancels of the same task within 15 minutes return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task assign",
            "kind": "command",
            "description": "Assign a task to a user",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "assignee": {
                    "type": "string",
                    "description": "Address to assign to"
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two assigns of the same task within 15 minutes return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                },
                "username": {
                    "type": "string",
                    "description": "Username to assign to (resolves to address)"
                }
            }
        },
        {
            "name": "task apply",
            "kind": "command",
            "description": "Apply for a task",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "experience": {
                    "type": "string",
                    "description": "Relevant experience"
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two applications for the same task within 15 minutes return the same result without re-submitting or re-pinning. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "notes": {
                    "type": "string",
                    "description": "Application notes"
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task approve-app",
            "kind": "command",
            "description": "Approve a task application",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "applicant": {
                    "type": "string",
                    "description": "Applicant address to approve",
                    "required": true
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two approvals for the same task within 15 minutes return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task stats",
            "kind": "command",
            "description": "Show per-member contribution analytics",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "task update",
            "kind": "command",
            "description": "Update task fields — read-then-merge full edit (payout, metadata, bounty, deadlines; v6)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "bounty-amount": {
                    "type": "number",
                    "description": "New bounty payout amount (0 clears)"
                },
                "bounty-token": {
                    "type": "string",
                    "description": "New bounty ERC20 token address (\"none\" clears the bounty)"
                },
                "completion-window": {
                    "type": "string",
                    "description": "New per-claim submission window, e.g. \"48h\" (\"0\" = none)"
                },
                "deadline": {
                    "type": "string",
                    "description": "New absolute claim deadline (\"0\" = none; a PAST value opens a claimed task to takeover)"
                },
                "description": {
                    "type": "string",
                    "description": "New task description (re-pins metadata)"
                },
                "name": {
                    "type": "string",
                    "description": "New task name (re-pins metadata)"
                },
                "payout": {
                    "type": "number",
                    "description": "New PT payout amount"
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task edit-meta",
            "kind": "command",
            "description": "Edit only a task's name/description (post-claim safe; v5+)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "description": {
                    "type": "string",
                    "description": "New task description"
                },
                "name": {
                    "type": "string",
                    "description": "New task name"
                },
                "task": {
                    "type": "string",
                    "description": "Task ID",
                    "required": true
                }
            }
        },
        {
            "name": "task perms",
            "kind": "group",
            "description": "Show and manage task permission masks (show / set / propose-global)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [
                {
                    "name": "sub",
                    "type": "string",
                    "required": true
                }
            ],
            "options": {}
        },
        {
            "name": "task perms show",
            "kind": "command",
            "description": "Show authority task permissions",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "project": {
                    "type": "string",
                    "description": "Project bytes32 ID"
                }
            }
        },
        {
            "name": "task perms set",
            "kind": "command",
            "description": "Propose a project task permission row",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "inherit-global": {
                    "type": "boolean",
                    "default": false
                },
                "perms": {
                    "type": "string",
                    "required": true
                },
                "project": {
                    "type": "string",
                    "description": "Project ID (bytes32); encoded as projectId + 1",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "task perms clear",
            "kind": "command",
            "description": "Propose clearing a permission row (restores inheritance for project rows)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "project": {
                    "type": "string",
                    "description": "Project ID (omit to clear global permissions)"
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "task perms propose-global",
            "kind": "command",
            "description": "Propose an org-wide task permission row",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "perms": {
                    "type": "string",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "task folders",
            "kind": "group",
            "description": "Show and update the org folder-tree root (show / set)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [
                {
                    "name": "sub",
                    "type": "string",
                    "required": true
                }
            ],
            "options": {}
        },
        {
            "name": "task folders show",
            "kind": "command",
            "description": "Show the org folder-tree root (bytes32 + CIDv0)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "task folders set",
            "kind": "command",
            "description": "Publish a new folder-tree root (CAS-guarded; organizer hat/executor)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "new-root": {
                    "type": "string",
                    "description": "New folder-tree root: Qm… CIDv0, 0x-prefixed bytes32, or \"clear\"",
                    "required": true
                }
            }
        },
        {
            "name": "project create",
            "kind": "command",
            "description": "Create a new project (direct tx; creator-hat/executor)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "bounty-caps": {
                    "type": "string",
                    "description": "Comma-separated bounty caps (wei)"
                },
                "bounty-tokens": {
                    "type": "string",
                    "description": "Comma-separated bounty token addresses"
                },
                "cap": {
                    "type": "number",
                    "description": "PT cap (0 = unlimited)",
                    "default": 0
                },
                "description": {
                    "type": "string",
                    "description": "Project description"
                },
                "managers": {
                    "type": "string",
                    "description": "Comma-separated project manager addresses"
                },
                "name": {
                    "type": "string",
                    "description": "Project name",
                    "required": true
                }
            }
        },
        {
            "name": "project propose",
            "kind": "command",
            "description": "Propose a new project via governance vote",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "cap": {
                    "type": "number",
                    "description": "PT budget cap (0 = unlimited)",
                    "default": 0
                },
                "description": {
                    "type": "string",
                    "description": "Project description"
                },
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes (default 24h)",
                    "default": 1440
                },
                "managers": {
                    "type": "string",
                    "description": "Comma-separated project manager addresses"
                },
                "name": {
                    "type": "string",
                    "description": "Project name",
                    "required": true
                }
            }
        },
        {
            "name": "project list",
            "kind": "command",
            "description": "List projects",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "project delete",
            "kind": "command",
            "description": "Delete a project (destructive; creator-hat/executor)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "project": {
                    "type": "string",
                    "description": "Project ID (bytes32 or decimal) or name",
                    "required": true
                }
            }
        },
        {
            "name": "org list",
            "kind": "command",
            "description": "List organizations",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "chain": {
                    "type": "number",
                    "description": "Chain ID (omit to search all chains)"
                },
                "member": {
                    "type": "string",
                    "description": "Filter by member address"
                }
            }
        },
        {
            "name": "org view",
            "kind": "command",
            "description": "View organization details",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "org status",
            "kind": "command",
            "description": "Quick org health summary",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "fast": {
                    "type": "boolean",
                    "description": "Skip the on-chain module version check (subgraph summary only)",
                    "default": false
                }
            }
        },
        {
            "name": "org activity",
            "kind": "command",
            "description": "Recent org activity (agent heartbeat)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "since": {
                    "type": "number",
                    "description": "Unix timestamp — show changes since this time (default: 30 minutes ago)"
                }
            }
        },
        {
            "name": "org update-metadata",
            "kind": "command",
            "description": "Update organization metadata",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "background-color": {
                    "type": "string",
                    "description": "Background color hex"
                },
                "description": {
                    "type": "string",
                    "description": "Org description"
                },
                "hide-treasury": {
                    "type": "boolean",
                    "description": "Hide treasury in UI"
                },
                "links": {
                    "type": "string",
                    "description": "JSON array of {name, url} links"
                },
                "logo": {
                    "type": "string",
                    "description": "Path to logo image file"
                },
                "name": {
                    "type": "string",
                    "description": "New org name"
                }
            }
        },
        {
            "name": "org set-metadata-admin",
            "kind": "command",
            "description": "Propose changing the org metadata-admin hat (governance vote)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "hat": {
                    "type": "string",
                    "description": "Hat ID that may edit org metadata directly (0 = clear; topHat fallback applies)",
                    "required": true
                }
            }
        },
        {
            "name": "org deploy",
            "kind": "command",
            "description": "Deploy a new organization",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "config": {
                    "type": "string",
                    "description": "Path to native authority org deploy config JSON file",
                    "required": true
                },
                "deployer": {
                    "type": "string",
                    "description": "Public deployer address for an unsigned dry run (no private key needed)"
                }
            }
        },
        {
            "name": "org deploy-config",
            "kind": "command",
            "description": "Generate a deploy config file",
            "readOnly": true,
            "broadcasts": false,
            "destructive": true,
            "sideEffects": [
                "local-file"
            ],
            "positionals": [],
            "options": {
                "description": {
                    "type": "string",
                    "description": "Organization description",
                    "default": ""
                },
                "name": {
                    "type": "string",
                    "description": "Organization name",
                    "required": true
                },
                "output": {
                    "type": "string",
                    "description": "Output file path",
                    "default": "org-deploy-config.json"
                },
                "template": {
                    "type": "string",
                    "description": "Config template",
                    "default": "standard",
                    "choices": [
                        "standard",
                        "minimal"
                    ]
                },
                "username": {
                    "type": "string",
                    "description": "Deployer username",
                    "required": true
                }
            }
        },
        {
            "name": "org roles",
            "kind": "command",
            "description": "List org roles with hat IDs and vouch requirements",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "org members",
            "kind": "command",
            "description": "List org members with activity metrics",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "all": {
                    "type": "boolean",
                    "description": "Include lapsed or unaccepted membership records",
                    "default": false
                }
            }
        },
        {
            "name": "org audit",
            "kind": "command",
            "description": "Generate governance transparency audit",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "org explore",
            "kind": "command",
            "description": "Scan all POP orgs across chains",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "chain": {
                    "type": "number",
                    "description": "Filter to specific chain"
                },
                "detail": {
                    "type": "string",
                    "description": "Deep-scan a specific org by name"
                },
                "opportunities": {
                    "type": "boolean",
                    "description": "Show actionable opportunities for Argus",
                    "default": false
                }
            }
        },
        {
            "name": "org health-score",
            "kind": "command",
            "description": "Compute org health score (0-100)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "org audit-external",
            "kind": "command",
            "description": "Generate governance audit for any POP org",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "chain": {
                    "type": "number",
                    "description": "Chain ID (omit to search all)"
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin report to IPFS",
                    "default": false
                },
                "target": {
                    "type": "string",
                    "description": "Org name to audit",
                    "required": true
                }
            }
        },
        {
            "name": "org audit-all",
            "kind": "command",
            "description": "Ecosystem health report — audit all POP orgs",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "pin": {
                    "type": "boolean",
                    "description": "Pin ecosystem report to IPFS",
                    "default": false
                }
            }
        },
        {
            "name": "org outreach",
            "kind": "command",
            "description": "Generate engagement message for a target org",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "snapshot": {
                    "type": "string",
                    "description": "Snapshot space ID (e.g. ens.eth) — use audit-snapshot instead of POP audit"
                },
                "target": {
                    "type": "string",
                    "description": "Target org name to generate outreach for",
                    "required": true
                }
            }
        },
        {
            "name": "org audit-snapshot",
            "kind": "command",
            "description": "Audit governance for any Snapshot DAO",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "pin": {
                    "type": "boolean",
                    "description": "Pin report to IPFS",
                    "default": false
                },
                "space": {
                    "type": "string",
                    "description": "Snapshot space ID (e.g. ens.eth)",
                    "required": true
                }
            }
        },
        {
            "name": "org audit-safe",
            "kind": "command",
            "description": "Audit treasury for any Safe multisig",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "address": {
                    "type": "string",
                    "description": "Safe multisig address",
                    "required": true
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin report to IPFS",
                    "default": false
                }
            }
        },
        {
            "name": "org audit-full",
            "kind": "command",
            "description": "Combined governance + treasury audit for any DAO",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "name": {
                    "type": "string",
                    "description": "DAO name for report",
                    "required": true
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin report to IPFS",
                    "default": false
                },
                "safe": {
                    "type": "string",
                    "description": "Safe multisig address",
                    "required": true
                },
                "snapshot": {
                    "type": "string",
                    "description": "Snapshot space ID (e.g. ens.eth)",
                    "required": true
                }
            }
        },
        {
            "name": "org audit-governor",
            "kind": "command",
            "description": "Audit on-chain Governor DAO governance",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "address": {
                    "type": "string",
                    "description": "Governor contract address",
                    "required": true
                },
                "blocks": {
                    "type": "number",
                    "description": "Number of blocks to scan for events",
                    "default": 500000
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin report to IPFS",
                    "default": false
                }
            }
        },
        {
            "name": "org gaas-status",
            "kind": "command",
            "description": "GaaS pipeline dashboard — audits, distribution, revenue",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "org publish",
            "kind": "command",
            "description": "Convert IPFS content to shareable HTML page with Open Graph tags",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "cid": {
                    "type": "string",
                    "description": "IPFS CID of content to publish",
                    "required": true
                },
                "description": {
                    "type": "string",
                    "description": "Page description for social sharing",
                    "default": ""
                },
                "title": {
                    "type": "string",
                    "description": "Page title",
                    "required": true
                }
            }
        },
        {
            "name": "org leaderboard",
            "kind": "command",
            "description": "Governance health leaderboard — rank multiple DAOs",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "pin": {
                    "type": "boolean",
                    "description": "Pin leaderboard to IPFS",
                    "default": false
                },
                "spaces": {
                    "type": "string",
                    "description": "Comma-separated Snapshot space IDs (e.g. aave.eth,comp-vote.eth)",
                    "required": true
                }
            }
        },
        {
            "name": "org audit-request",
            "kind": "command",
            "description": "Generate a governance audit request with pricing",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "concerns": {
                    "type": "string",
                    "description": "Specific governance concerns to investigate"
                },
                "members": {
                    "type": "number",
                    "description": "Approximate member count"
                },
                "org-name": {
                    "type": "string",
                    "description": "Name of the DAO to audit",
                    "required": true
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin request to IPFS",
                    "default": false
                },
                "platform": {
                    "type": "string",
                    "description": "Governance platform",
                    "choices": [
                        "snapshot",
                        "pop",
                        "governor",
                        "moloch"
                    ],
                    "required": true
                },
                "space": {
                    "type": "string",
                    "description": "Snapshot space ID (e.g. ens.eth)"
                },
                "type": {
                    "type": "string",
                    "description": "Audit tier",
                    "default": "standard",
                    "choices": [
                        "free",
                        "standard",
                        "deep"
                    ]
                }
            }
        },
        {
            "name": "org portfolio",
            "kind": "command",
            "description": "Generate shareable HTML audit portfolio page",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "csv": {
                    "type": "boolean",
                    "description": "Emit audit DB as CSV to stdout (skips HTML + IPFS)",
                    "default": false
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin HTML page to IPFS",
                    "default": false
                }
            }
        },
        {
            "name": "org share",
            "kind": "command",
            "description": "Generate platform-ready posts from IPFS content",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "cid": {
                    "type": "string",
                    "description": "IPFS CID of content to share",
                    "required": true
                },
                "platform": {
                    "type": "string",
                    "description": "Target platform",
                    "choices": [
                        "reddit",
                        "twitter",
                        "forum",
                        "all"
                    ],
                    "required": true
                },
                "title": {
                    "type": "string",
                    "description": "Override title"
                }
            }
        },
        {
            "name": "org publications",
            "kind": "command",
            "description": "Index all shareable IPFS content from completed tasks",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "limit": {
                    "type": "number",
                    "description": "Max tasks to scan",
                    "default": 50
                },
                "project": {
                    "type": "string",
                    "description": "Filter by project name"
                },
                "since": {
                    "type": "string",
                    "description": "Unix timestamp — only tasks completed after this time"
                }
            }
        },
        {
            "name": "org compare",
            "kind": "command",
            "description": "Head-to-head governance comparison of two Snapshot DAOs",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "a": {
                    "type": "string",
                    "description": "First Snapshot space (e.g. aave.eth)",
                    "required": true
                },
                "b": {
                    "type": "string",
                    "description": "Second Snapshot space (e.g. compound.eth)",
                    "required": true
                }
            }
        },
        {
            "name": "org compare-time-window",
            "kind": "command",
            "description": "Re-audit a stored AUDIT_DB entry and report drift (codifies the asymmetric-drift research finding)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "all": {
                    "type": "boolean",
                    "description": "Compare ALL stored spaces in SPACE_TO_NAME mapping. Mutually exclusive with --space.",
                    "default": false
                },
                "space": {
                    "type": "string",
                    "description": "Snapshot space id (e.g. aavedao.eth). Mutually exclusive with --all."
                },
                "threshold": {
                    "type": "number",
                    "description": "Absolute Gini delta to count as drift (default 0.01, slightly above Aavegotchi noise floor)",
                    "default": 0.01
                }
            }
        },
        {
            "name": "org probe-access",
            "kind": "command",
            "description": "Burner-callStatic access-control probe — map a contract's gating model in <5 min, zero gas",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "abi": {
                    "type": "string",
                    "description": "Path to the ABI JSON file. If omitted, will try src/abi/<contract>.json by name guess; otherwise required."
                },
                "address": {
                    "type": "string",
                    "description": "Contract address to probe",
                    "required": true
                },
                "expected-name": {
                    "type": "string",
                    "description": "HB#385 (task #390): expected substring in the contract's name() return value. Case-insensitive substring match — 'Compound' matches 'Compound Governor Bravo'. When set, the tool calls name() on the target before probing and warns (non-fatal) if the result doesn't match. Prevents the HB#384 class of error where an audit labeled 'Gitcoin Governor Bravo' was actually probing Uniswap's contract. The name() call always runs even without this flag — result is recorded as contractName in JSON output."
                },
                "selectors": {
                    "type": "string",
                    "description": "Comma-separated function names or 4-byte selectors to probe. If omitted, probes ALL external/payable functions."
                },
                "skip-code-check": {
                    "type": "boolean",
                    "description": "Skip the on-chain selector existence check. Use when probing behind a proxy (EIP-1967) where the runtime code does not contain the implementation selectors, or when you know the ABI matches the target.",
                    "default": false
                }
            }
        },
        {
            "name": "org audit-vetoken",
            "kind": "command",
            "description": "On-chain top-holder probe for veCRV-family VotingEscrow contracts (task #383)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "chain": {
                    "type": "number",
                    "description": "Chain ID (default: Ethereum mainnet)",
                    "default": 1
                },
                "chunk": {
                    "type": "number",
                    "description": "getLogs pagination chunk size in blocks. Default 10000 (most RPCs cap here).",
                    "default": 10000
                },
                "enumerate": {
                    "type": "boolean",
                    "description": "Scan recent Deposit events to discover candidate holders. Defaults to the last 50,000 blocks (~7 days on Ethereum). Override with --from-block / --to-block / --chunk.",
                    "default": false
                },
                "enumerate-transfers": {
                    "type": "boolean",
                    "description": "Task #389 (HB#456): contract-agnostic holder discovery via the underlying ERC20's Transfer(from, to) events filtered to (to == escrow). Catches dormant lockers and works for non-veCRV-family contracts (CvxLockerV2, Convex, etc.). More RPC-expensive per block than --enumerate, so use narrower --from-block windows.",
                    "default": false
                },
                "escrow": {
                    "type": "string",
                    "description": "VotingEscrow contract address (veCRV, veBAL, veFXS, …)",
                    "required": true
                },
                "from-block": {
                    "type": "number",
                    "description": "Enumeration lower bound (inclusive). Default: latest - 50000."
                },
                "holders": {
                    "type": "string",
                    "description": "Comma-separated list of candidate holder addresses to rank. Optional when --enumerate is passed. The two modes can be combined — enumerated addresses are union-ed with the explicit list."
                },
                "rpc": {
                    "type": "string",
                    "description": "RPC URL override"
                },
                "to-block": {
                    "type": "number",
                    "description": "Enumeration upper bound (inclusive). Default: latest block."
                },
                "top": {
                    "type": "number",
                    "description": "Limit output to the top N holders by current veBalance",
                    "default": 10
                },
                "underlying": {
                    "type": "string",
                    "description": "Override the underlying ERC20 token address for --enumerate-transfers. If omitted, reads VotingEscrow.token() to get it automatically."
                }
            }
        },
        {
            "name": "org audit-participation",
            "kind": "command",
            "description": "Governance participation metrics for external Governor contracts (task #422)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "address": {
                    "type": "string",
                    "description": "Governor contract address",
                    "required": true
                },
                "chain": {
                    "type": "number",
                    "description": "Chain ID (default: POP_DEFAULT_CHAIN or 1)"
                },
                "chunk": {
                    "type": "number",
                    "description": "getLogs pagination chunk size (default: chain-aware)"
                },
                "from-block": {
                    "type": "number",
                    "description": "Start block for VoteCast event scan (default: latest - 500000)"
                },
                "json": {
                    "type": "boolean",
                    "default": false
                },
                "rpc": {
                    "type": "string",
                    "description": "RPC URL override"
                },
                "to-block": {
                    "type": "number",
                    "description": "End block for event scan (default: latest)"
                },
                "top": {
                    "type": "number",
                    "description": "Show top N voters by participation frequency",
                    "default": 10
                }
            }
        },
        {
            "name": "vote create",
            "kind": "command",
            "description": "Create a proposal",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "calls": {
                    "type": "string",
                    "description": "JSON array of execution calls for option 0: [{\"target\":\"0x...\",\"value\":\"0\",\"data\":\"0x...\"}]"
                },
                "description": {
                    "type": "string",
                    "description": "Proposal description",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Duration in minutes",
                    "required": true
                },
                "equal-weight": {
                    "type": "boolean",
                    "description": "Restricted hybrid poll: count each eligible voter once"
                },
                "hat-ids": {
                    "type": "string",
                    "description": "Legacy alias for --subject-ids"
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #369 (HB#213): explicit idempotency key. Two calls with the same orgId + this key within 15 minutes return the same proposalId without re-submitting. Default: auto-derived from a hash of the full argv (transient fields like --private-key and --dry-run excluded). Use --no-idempotency to opt out entirely."
                },
                "name": {
                    "type": "string",
                    "description": "Proposal title",
                    "required": true
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit a new proposal. Use only when you intentionally want a duplicate write.",
                    "default": false
                },
                "options": {
                    "type": "string",
                    "description": "Comma-separated option names",
                    "required": true
                },
                "quorum-override": {
                    "type": "number",
                    "description": "Restricted poll voter-count quorum (executable polls cannot lower the global quorum)"
                },
                "subject-ids": {
                    "type": "string",
                    "description": "Comma-separated authority subject IDs for restricted voting"
                },
                "type": {
                    "type": "string",
                    "description": "Voting type",
                    "choices": [
                        "hybrid",
                        "dd"
                    ],
                    "required": true
                }
            }
        },
        {
            "name": "vote cast",
            "kind": "command",
            "description": "Cast a vote",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #370 (HB#214): explicit idempotency key. Two casts of the same vote within 15 minutes return the same result without re-submitting."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "options": {
                    "type": "string",
                    "description": "Comma-separated option indices to vote for",
                    "required": true
                },
                "proposal": {
                    "type": "string",
                    "description": "Proposal ID (number) or fuzzy title query (e.g. \"bridge retry\")",
                    "required": true
                },
                "type": {
                    "type": "string",
                    "description": "Voting type",
                    "choices": [
                        "hybrid",
                        "dd"
                    ],
                    "required": true
                },
                "weights": {
                    "type": "string",
                    "description": "Comma-separated weights (must sum to 100)",
                    "required": true
                }
            }
        },
        {
            "name": "vote list",
            "kind": "command",
            "description": "List proposals",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "status": {
                    "type": "string",
                    "description": "Status filter",
                    "choices": [
                        "Active",
                        "Ended",
                        "Executed"
                    ]
                },
                "type": {
                    "type": "string",
                    "description": "Voting type filter",
                    "default": "all",
                    "choices": [
                        "hybrid",
                        "dd",
                        "all"
                    ]
                },
                "unvoted": {
                    "type": "boolean",
                    "description": "Only show proposals where I have not voted (requires key)"
                }
            }
        },
        {
            "name": "vote announce",
            "kind": "command",
            "description": "Announce proposal winner",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "force": {
                    "type": "boolean",
                    "description": "Skip pre-flight check and announce anyway",
                    "default": false
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #375 (HB#217) idempotency cache."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache.",
                    "default": false
                },
                "proposal": {
                    "type": "string",
                    "description": "Proposal ID (number) or fuzzy title query",
                    "required": true
                },
                "type": {
                    "type": "string",
                    "description": "Voting type",
                    "choices": [
                        "hybrid",
                        "dd"
                    ],
                    "required": true
                }
            }
        },
        {
            "name": "vote execute",
            "kind": "command",
            "description": "Execute a passed proposal's calls",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Task #375 (HB#217) idempotency cache."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache.",
                    "default": false
                },
                "proposal": {
                    "type": "string",
                    "description": "Proposal ID (number) or fuzzy title query",
                    "required": true
                }
            }
        },
        {
            "name": "vote announce-all",
            "kind": "command",
            "description": "Announce all ended proposals",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key for the batch (default: derived from argv)."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always re-run the batch.",
                    "default": false
                }
            }
        },
        {
            "name": "vote propose-quorum",
            "kind": "command",
            "description": "Create a proposal to change voting quorum",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key (default: derived from argv)."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "quorum": {
                    "type": "number",
                    "description": "New quorum value (minimum voter COUNT, not a percentage)",
                    "required": true
                }
            }
        },
        {
            "name": "vote propose-config",
            "kind": "command",
            "description": "Create a proposal to change a governance config parameter",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key (default: derived from argv)."
                },
                "key": {
                    "type": "string",
                    "description": "Configuration parameter name",
                    "choices": [
                        "threshold",
                        "quorum",
                        "target-allowed",
                        "executor"
                    ],
                    "required": true
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "value": {
                    "type": "string",
                    "description": "New value",
                    "required": true
                }
            }
        },
        {
            "name": "vote analyze",
            "kind": "command",
            "description": "Analyze a hybrid vote — power breakdown and counterfactuals",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "proposal": {
                    "type": "number",
                    "description": "Proposal ID to analyze",
                    "required": true
                }
            }
        },
        {
            "name": "vote results",
            "kind": "command",
            "description": "Show vote results with option names and rankings",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "proposal": {
                    "type": "string",
                    "description": "Proposal ID (number) or fuzzy title query",
                    "required": true
                }
            }
        },
        {
            "name": "vote classes",
            "kind": "group",
            "description": "Show or propose the hybrid voting class configuration (show / propose)",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [
                {
                    "name": "sub",
                    "type": "string",
                    "required": true
                }
            ],
            "options": {}
        },
        {
            "name": "vote classes show",
            "kind": "command",
            "description": "Show the hybrid voting class config + support threshold and quorum",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "proposal": {
                    "type": "string",
                    "description": "Show the class snapshot frozen for one proposal (ID or fuzzy title query) instead of the live config"
                }
            }
        },
        {
            "name": "vote classes propose",
            "kind": "command",
            "description": "Propose replacing the voting classes via setClasses (governance vote)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "file": {
                    "type": "string",
                    "description": "Path to a ClassConfig[] JSON file (strategy, slicePct, quadratic, minBalance, asset, subjectIds; optional subjectId sets a stable binding, 0 clears it)",
                    "required": true
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key (default: derived from argv)."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                }
            }
        },
        {
            "name": "user register",
            "kind": "command",
            "description": "Register a username on the account registry",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "username": {
                    "type": "string",
                    "description": "Username (3-32 chars, alphanumeric + underscores)",
                    "required": true
                }
            }
        },
        {
            "name": "user join",
            "kind": "command",
            "description": "Join an organization (registers your username first if needed)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two joins for the same org within the TTL return the same result without re-submitting. Default: auto-derived from argv."
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                },
                "username": {
                    "type": "string",
                    "description": "Username to register (only needed if not already registered)"
                }
            }
        },
        {
            "name": "user whoami",
            "kind": "command",
            "description": "Show signer identity: address, username, gas balance, and org standing",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "user profile",
            "kind": "command",
            "description": "View user profile",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "address": {
                    "type": "string",
                    "description": "User address (defaults to signer)"
                }
            }
        },
        {
            "name": "user update-profile",
            "kind": "command",
            "description": "Update profile (bio, avatar, links) or change your username",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "avatar": {
                    "type": "string",
                    "description": "Avatar IPFS CID (Qm...)"
                },
                "bio": {
                    "type": "string",
                    "description": "Profile bio (max 280 chars)"
                },
                "github": {
                    "type": "string",
                    "description": "GitHub username"
                },
                "twitter": {
                    "type": "string",
                    "description": "Twitter/X handle"
                },
                "username": {
                    "type": "string",
                    "description": "New username (DESTRUCTIVE: releases the old name for anyone to claim)"
                },
                "website": {
                    "type": "string",
                    "description": "Website URL"
                }
            }
        },
        {
            "name": "education create",
            "kind": "command",
            "description": "Create a learning module that rewards PT on completion",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "answers": {
                    "type": "string",
                    "description": "JSON array of option arrays: '[[\"A\",\"B\"],[\"C\",\"D\"]]'"
                },
                "correct-answer": {
                    "type": "number",
                    "description": "Index of correct answer (0-based; PERMANENT — updateModule cannot change it)",
                    "required": true
                },
                "description": {
                    "type": "string",
                    "description": "Module description"
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two identical creates within the TTL return the same result without re-submitting. Default: auto-derived from argv."
                },
                "link": {
                    "type": "string",
                    "description": "External learning resource URL"
                },
                "name": {
                    "type": "string",
                    "description": "Module title",
                    "required": true
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit a new module.",
                    "default": false
                },
                "payout": {
                    "type": "number",
                    "description": "PT reward for completion (must be > 0)",
                    "required": true
                },
                "quiz": {
                    "type": "string",
                    "description": "JSON array of question strings: '[\"Q1?\", \"Q2?\"]'"
                }
            }
        },
        {
            "name": "education list",
            "kind": "command",
            "description": "List education modules",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "education update",
            "kind": "command",
            "description": "Update a module's payout/metadata — read-then-merge full edit",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "answers": {
                    "type": "string",
                    "description": "New JSON array of option arrays (note: the correct answer is fixed at creation)"
                },
                "description": {
                    "type": "string",
                    "description": "New module description (re-pins metadata)"
                },
                "link": {
                    "type": "string",
                    "description": "New external learning resource URL (re-pins metadata)"
                },
                "module": {
                    "type": "string",
                    "description": "Module ID",
                    "required": true
                },
                "name": {
                    "type": "string",
                    "description": "New module title (re-pins metadata)"
                },
                "payout": {
                    "type": "number",
                    "description": "New PT reward for completion (must be > 0)"
                },
                "quiz": {
                    "type": "string",
                    "description": "New JSON array of question strings (note: the correct answer is fixed at creation)"
                }
            }
        },
        {
            "name": "education remove",
            "kind": "command",
            "description": "Permanently remove a module (destructive — no undo)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "module": {
                    "type": "string",
                    "description": "Module ID to remove (permanent — no undo)",
                    "required": true
                }
            }
        },
        {
            "name": "education complete",
            "kind": "command",
            "description": "Complete a module's quiz and claim its PT reward",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "answer": {
                    "type": "number",
                    "description": "Answer index (0-based)",
                    "required": true
                },
                "idempotency-key": {
                    "type": "string",
                    "description": "Explicit idempotency key. Two identical completions within the TTL return the same result without re-submitting. Default: auto-derived from argv."
                },
                "module": {
                    "type": "string",
                    "description": "Module ID",
                    "required": true
                },
                "no-idempotency": {
                    "type": "boolean",
                    "description": "Bypass the idempotency cache and always submit.",
                    "default": false
                }
            }
        },
        {
            "name": "vouch for",
            "kind": "command",
            "description": "for a role vouch through MembershipAuthority",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "vouch revoke",
            "kind": "command",
            "description": "revoke a role vouch through MembershipAuthority",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "vouch claim",
            "kind": "command",
            "description": "Claim a role after meeting its vouch quorum",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "vouch configure",
            "kind": "command",
            "description": "Propose a subject vouch attestor",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "quorum": {
                    "type": "number",
                    "description": "Required vouches (0 disables the attestor)",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "voucher-subject": {
                    "type": "string",
                    "required": true
                }
            }
        },
        {
            "name": "vouch reset",
            "kind": "command",
            "description": "Propose invalidating every vouch in the subject epoch",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "vouch clear-user",
            "kind": "command",
            "description": "Propose clearing the received vouches of one user",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "vouch set-rate-limit",
            "kind": "command",
            "description": "Propose the daily vouch rate limit",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "max": {
                    "type": "number",
                    "required": true
                }
            }
        },
        {
            "name": "vouch status",
            "kind": "command",
            "description": "Read authority vouch status",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string"
                },
                "user": {
                    "type": "string"
                }
            }
        },
        {
            "name": "vouch list",
            "kind": "command",
            "description": "Read authority vouch list",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string"
                },
                "user": {
                    "type": "string"
                }
            }
        },
        {
            "name": "token request",
            "kind": "command",
            "description": "Request participation tokens (members only; minted on approval)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "number",
                    "description": "Amount of PT to request",
                    "required": true
                },
                "reason": {
                    "type": "string",
                    "description": "Reason for the request (pinned to IPFS)",
                    "required": true
                }
            }
        },
        {
            "name": "token approve",
            "kind": "command",
            "description": "Approve a token request — MINTS the requested PT to the requester",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "request": {
                    "type": "number",
                    "description": "Request ID to approve",
                    "required": true
                }
            }
        },
        {
            "name": "token cancel",
            "kind": "command",
            "description": "Cancel a pending token request (requester or approver)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "request": {
                    "type": "number",
                    "description": "Request ID to cancel",
                    "required": true
                }
            }
        },
        {
            "name": "token requests",
            "kind": "command",
            "description": "List token requests",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "status": {
                    "type": "string",
                    "description": "Filter by status",
                    "default": "pending",
                    "choices": [
                        "pending",
                        "all"
                    ]
                }
            }
        },
        {
            "name": "token balance",
            "kind": "command",
            "description": "Check participation token balance",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "address": {
                    "type": "string",
                    "description": "Address to check (defaults to signer)"
                }
            }
        },
        {
            "name": "treasury view",
            "kind": "command",
            "description": "View treasury overview",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "treasury balance",
            "kind": "command",
            "description": "Show token holdings",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "treasury deposit",
            "kind": "command",
            "description": "Deposit ERC20 tokens to treasury",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "number",
                    "description": "Amount to deposit (human token units)",
                    "required": true
                },
                "token": {
                    "type": "string",
                    "description": "ERC20 token address",
                    "required": true
                }
            }
        },
        {
            "name": "treasury propose-swap",
            "kind": "command",
            "description": "Propose a token swap via governance vote",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "number",
                    "description": "Amount to swap (human units of from-token)",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 1440
                },
                "from-index": {
                    "type": "number",
                    "description": "Curve coin index for from-token (0 or 1)",
                    "required": true
                },
                "from-token": {
                    "type": "string",
                    "description": "Token to sell (address)",
                    "required": true
                },
                "min-out": {
                    "type": "number",
                    "description": "Minimum output amount in to-token units (default: 95% of the pool quote)"
                },
                "pool": {
                    "type": "string",
                    "description": "Curve pool address",
                    "required": true
                },
                "to-index": {
                    "type": "number",
                    "description": "Curve coin index for to-token (0 or 1)",
                    "required": true
                },
                "to-token": {
                    "type": "string",
                    "description": "Token to receive (address)",
                    "required": true
                }
            }
        },
        {
            "name": "treasury claim",
            "kind": "command",
            "description": "Claim from a distribution with a manual amount + proof (prefer claim-mine)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "string",
                    "description": "Your allocated amount in TOKEN UNITS (e.g. 12.5) — must match the merkle leaf exactly; use --wei for the raw integer",
                    "required": true
                },
                "distribution": {
                    "type": "number",
                    "description": "Distribution ID",
                    "required": true
                },
                "proof": {
                    "type": "string",
                    "description": "JSON array of merkle proof bytes32 hashes"
                },
                "proof-file": {
                    "type": "string",
                    "description": "Path to a JSON file with the proof array (or an allocation object with a \"proof\" field, as in merkle-distribution.json)"
                },
                "wei": {
                    "type": "boolean",
                    "description": "Treat --amount as the raw integer (wei-level) value instead of decimal token units",
                    "default": false
                }
            }
        },
        {
            "name": "treasury distributions",
            "kind": "command",
            "description": "List distributions with finalized/finalizable state",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "status": {
                    "type": "string",
                    "description": "Filter by status",
                    "choices": [
                        "Active",
                        "Finalized"
                    ]
                }
            }
        },
        {
            "name": "treasury opt-out",
            "kind": "command",
            "description": "Opt out of distributions",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "treasury opt-in",
            "kind": "command",
            "description": "Opt back into distributions",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "treasury compute-merkle",
            "kind": "command",
            "description": "Compute merkle tree for PT-based distribution",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "local-file"
            ],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "string",
                    "description": "Total distribution amount (in token units, e.g. \"40\" for 40 BREAD)",
                    "required": true
                },
                "output": {
                    "type": "string",
                    "description": "Output file for proofs",
                    "default": "merkle-distribution.json"
                },
                "token": {
                    "type": "string",
                    "description": "Payout token address",
                    "required": true
                }
            }
        },
        {
            "name": "treasury propose-distribution",
            "kind": "command",
            "description": "Propose a distribution via governance vote",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 1440
                },
                "merkle-file": {
                    "type": "string",
                    "description": "Path to merkle-distribution.json from compute-merkle",
                    "required": true
                }
            }
        },
        {
            "name": "treasury claim-mine",
            "kind": "command",
            "description": "Auto-claim from all unclaimed distributions (recommended claim path)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "treasury send",
            "kind": "command",
            "description": "Propose a transfer from Executor via governance",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "number",
                    "description": "Amount to send (single recipient)"
                },
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "recipients": {
                    "type": "string",
                    "description": "JSON array for batch: [{\"to\":\"0x...\",\"amount\":5},...] (max 8)"
                },
                "to": {
                    "type": "string",
                    "description": "Recipient address (single recipient)"
                },
                "token": {
                    "type": "string",
                    "description": "Token address or \"native\" for the chain's gas token",
                    "default": "native"
                }
            }
        },
        {
            "name": "treasury propose-sdai",
            "kind": "command",
            "description": "Propose depositing xDAI into sDAI for yield",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "number",
                    "description": "xDAI amount to deposit into sDAI",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                }
            }
        },
        {
            "name": "treasury propose-finalize",
            "kind": "command",
            "description": "Propose closing a distribution via governance (returns unclaimed funds to the treasury)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "distribution": {
                    "type": "number",
                    "description": "Distribution ID to finalize",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Vote duration in minutes",
                    "default": 60
                },
                "min-claim-blocks": {
                    "type": "number",
                    "description": "On-chain guard: execution reverts until this many blocks have passed since the distribution's CHECKPOINT block (0 = no extra guard beyond the vote duration)",
                    "default": 0
                }
            }
        },
        {
            "name": "paymaster status",
            "kind": "command",
            "description": "View paymaster registration, balance, budgets, and solidarity state",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "hat": {
                    "type": "string",
                    "description": "Additional hat ID(s) whose sponsorship budgets to show (admin/operator hats are probed automatically)"
                }
            }
        },
        {
            "name": "paymaster deposit",
            "kind": "command",
            "description": "Fund an org's gas sponsorship balance (permissionless; no withdraw on the deployed hub)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "amount": {
                    "type": "string",
                    "description": "Amount to deposit, in ether units of the native gas token (e.g. 0.05 = 0.05 xDAI on Gnosis)",
                    "required": true
                }
            }
        },
        {
            "name": "paymaster register",
            "kind": "command",
            "description": "Register an org with the PaymasterHub (sends via PoaManager owner, or prints the exact registrar call)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "admin-hat": {
                    "type": "string",
                    "description": "Hat ID that will administer the org's paymaster config (usually the org top hat)",
                    "required": true
                },
                "config": {
                    "type": "string",
                    "description": "JSON file with initial fee caps (gwei), rules, and budgets (ether caps) — uses registerAndConfigureOrg"
                },
                "deposit": {
                    "type": "string",
                    "description": "Also deposit this amount (ether units) after registration via permissionless depositForOrg"
                },
                "operator-hat": {
                    "type": "string",
                    "description": "Optional hat ID allowed to manage budgets/rules (0 = none)"
                }
            }
        },
        {
            "name": "role list",
            "kind": "command",
            "description": "List current authority roles",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "role status",
            "kind": "command",
            "description": "Inspect membership, rules and permission rows for a role",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Filter memberships by wallet address"
                }
            }
        },
        {
            "name": "role pending",
            "kind": "command",
            "description": "List delegated actions and their review windows",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "all": {
                    "type": "boolean",
                    "description": "Include finalized, cancelled and voided actions",
                    "default": false
                },
                "subject": {
                    "type": "string",
                    "description": "Filter by authority subject ID"
                },
                "user": {
                    "type": "string",
                    "description": "Filter by target wallet address"
                }
            }
        },
        {
            "name": "role create",
            "kind": "command",
            "description": "Propose creation of an authority role",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "image": {
                    "type": "string",
                    "description": "Image URI",
                    "default": ""
                },
                "max-members": {
                    "type": "number",
                    "description": "Member cap (0 = unlimited)",
                    "default": 0
                },
                "metadata-hash": {
                    "type": "string",
                    "description": "IPFS SHA-256 digest (bytes32)",
                    "default": "0x0000000000000000000000000000000000000000000000000000000000000000"
                },
                "name": {
                    "type": "string",
                    "description": "Subject name",
                    "required": true
                }
            }
        },
        {
            "name": "role claim",
            "kind": "command",
            "description": "claim your role membership",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role renounce",
            "kind": "command",
            "description": "renounce your role membership",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role grant",
            "kind": "command",
            "description": "Propose a role grant",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "delegable": {
                    "type": "boolean",
                    "description": "Allow delegated managers to clear this governance grant",
                    "default": false
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role offer",
            "kind": "command",
            "description": "Propose a role offer",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "delegable": {
                    "type": "boolean",
                    "description": "Allow delegated managers to clear this governance grant",
                    "default": false
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role remove",
            "kind": "command",
            "description": "Propose member removal",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "ban": {
                    "type": "boolean",
                    "description": "Ban membership instead of attempting soft removal",
                    "default": false
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role unremove",
            "kind": "command",
            "description": "Propose unremove",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role withdraw-offer",
            "kind": "command",
            "description": "Propose withdraw-offer",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role clear-rule",
            "kind": "command",
            "description": "Propose clear-rule",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role set-rule",
            "kind": "command",
            "description": "Propose an explicit grant or ban rule",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "delegable": {
                    "type": "boolean",
                    "default": false
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "kind": {
                    "type": "string",
                    "choices": [
                        "none",
                        "grant",
                        "ban"
                    ],
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role set-default",
            "kind": "command",
            "description": "Propose default role eligibility",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "allow": {
                    "type": "boolean",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "force": {
                    "type": "boolean",
                    "description": "Permit closing a role with accepted members",
                    "default": false
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role rename",
            "kind": "command",
            "description": "Rename an authority subject using SUBJECT_RENAME permission or governance",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "governance": {
                    "type": "boolean",
                    "description": "Propose this action for execution by organization governance",
                    "default": false
                },
                "image": {
                    "type": "string",
                    "description": "Image URI",
                    "default": ""
                },
                "metadata-hash": {
                    "type": "string",
                    "description": "IPFS SHA-256 digest (bytes32)",
                    "default": "0x0000000000000000000000000000000000000000000000000000000000000000"
                },
                "name": {
                    "type": "string",
                    "description": "Subject name",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role set-max-members",
            "kind": "command",
            "description": "Propose the role membership cap",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "max-members": {
                    "type": "number",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role set-manager",
            "kind": "command",
            "description": "Propose manager delegation for a subject",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "caps": {
                    "type": "number",
                    "description": "Capability mask: 1 grant/offer, 2 remove",
                    "required": true
                },
                "delay": {
                    "type": "number",
                    "description": "Review delay in seconds",
                    "default": 0
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "manager": {
                    "type": "string",
                    "description": "Manager subject ID (0 clears delegation)",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role delegate-grant",
            "kind": "command",
            "description": "delegate-grant through configured manager authority",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role delegate-offer",
            "kind": "command",
            "description": "delegate-offer through configured manager authority",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role delegate-unremove",
            "kind": "command",
            "description": "delegate-unremove through configured manager authority",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role delegate-remove",
            "kind": "command",
            "description": "Queue delegated member removal",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "ban": {
                    "type": "boolean",
                    "default": false
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role finalize",
            "kind": "command",
            "description": "finalize a pending delegated action",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "pending": {
                    "type": "string",
                    "description": "Authority pending action ID",
                    "required": true
                }
            }
        },
        {
            "name": "role cancel",
            "kind": "command",
            "description": "cancel a pending delegated action",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "governance": {
                    "type": "boolean",
                    "description": "Propose this action for execution by organization governance",
                    "default": false
                },
                "pending": {
                    "type": "string",
                    "description": "Authority pending action ID",
                    "required": true
                }
            }
        },
        {
            "name": "role reconcile",
            "kind": "command",
            "description": "Repair a lapsed membership",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Member wallet address",
                    "required": true
                }
            }
        },
        {
            "name": "role set-perm",
            "kind": "command",
            "description": "Propose an authority permission row",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "context": {
                    "type": "string",
                    "description": "bytes32 context (global is zero; task project context is projectId + 1)",
                    "default": "0x0000000000000000000000000000000000000000000000000000000000000000"
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "inherit-global": {
                    "type": "boolean",
                    "default": false
                },
                "key": {
                    "type": "string",
                    "description": "Semantic key name (DD_VOTE, PT_MEMBER, etc.) or bytes32 key",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                },
                "value": {
                    "type": "string",
                    "description": "Permission value without flag bits",
                    "required": true
                }
            }
        },
        {
            "name": "role clear-perm",
            "kind": "command",
            "description": "Propose clearing an authority permission row",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "context": {
                    "type": "string",
                    "default": "0x0000000000000000000000000000000000000000000000000000000000000000"
                },
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "key": {
                    "type": "string",
                    "required": true
                },
                "subject": {
                    "type": "string",
                    "description": "Authority subject ID (adopted role IDs keep their historical value)",
                    "required": true
                }
            }
        },
        {
            "name": "role set-paused",
            "kind": "command",
            "description": "Propose pausing or unpausing non-governance authority writes",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "paused": {
                    "type": "boolean",
                    "required": true
                }
            }
        },
        {
            "name": "group list",
            "kind": "command",
            "description": "List authority groups and their constituent roles",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "group view",
            "kind": "command",
            "description": "Inspect group composition, derived members and permissions",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "group": {
                    "type": "string",
                    "description": "Authority subject ID",
                    "required": true
                },
                "user": {
                    "type": "string",
                    "description": "Filter memberships by wallet address"
                }
            }
        },
        {
            "name": "group create",
            "kind": "command",
            "description": "Propose a group derived from role memberships",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "image": {
                    "type": "string",
                    "description": "Image URI",
                    "default": ""
                },
                "metadata-hash": {
                    "type": "string",
                    "description": "IPFS SHA-256 digest (bytes32)",
                    "default": "0x0000000000000000000000000000000000000000000000000000000000000000"
                },
                "name": {
                    "type": "string",
                    "description": "Subject name",
                    "required": true
                },
                "roles": {
                    "type": "string",
                    "description": "Member role subject IDs",
                    "required": true
                }
            }
        },
        {
            "name": "group add-role",
            "kind": "command",
            "description": "Propose add-role in a group",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "group": {
                    "type": "string",
                    "required": true
                },
                "role": {
                    "type": "string",
                    "required": true
                }
            }
        },
        {
            "name": "group remove-role",
            "kind": "command",
            "description": "Propose remove-role in a group",
            "readOnly": false,
            "broadcasts": true,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "duration": {
                    "type": "number",
                    "description": "Governance vote duration in minutes",
                    "default": 60
                },
                "group": {
                    "type": "string",
                    "required": true
                },
                "role": {
                    "type": "string",
                    "required": true
                }
            }
        },
        {
            "name": "zkemail status",
            "kind": "command",
            "description": "Module wiring, active allowlist root/CID, and dormancy",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "zkemail allowlist",
            "kind": "command",
            "description": "List who is invited and which role hats they get",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "verify": {
                    "type": "boolean",
                    "description": "Fetch the allowlist file from IPFS and recompute its merkle root against the on-chain commit",
                    "default": false
                }
            }
        },
        {
            "name": "zkemail check",
            "kind": "command",
            "description": "Check whether a domain/address is invited and can still claim",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [
                {
                    "name": "identifier",
                    "type": "string",
                    "description": "A domain (anthropic.com) or address (alice@org.com)",
                    "required": true
                }
            ],
            "options": {
                "proof": {
                    "type": "boolean",
                    "description": "Also emit the merkle proof for this entry",
                    "default": false
                }
            }
        },
        {
            "name": "zkemail claims",
            "kind": "command",
            "description": "Who has claimed a role via a ZK Email invite",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {
                "limit": {
                    "type": "number",
                    "description": "Maximum claims to show (most recent first)",
                    "default": 50
                }
            }
        },
        {
            "name": "zkemail build-allowlist",
            "kind": "command",
            "description": "Compute an allowlist doc + merkle root, optionally pin to IPFS",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "ipfs-pin(--pin)"
            ],
            "positionals": [],
            "options": {
                "domain": {
                    "type": "string",
                    "description": "Invite a whole domain, e.g. --domain anthropic.com (repeatable)"
                },
                "email": {
                    "type": "string",
                    "description": "Invite a specific address, e.g. --email alice@org.com (repeatable)"
                },
                "file": {
                    "type": "string",
                    "description": "JSON file of allowlist entries (or an existing allowlist doc to re-publish)"
                },
                "hat": {
                    "type": "string",
                    "description": "Hat ID(s) granted to every --domain/--email entry (repeatable)"
                },
                "out": {
                    "type": "string",
                    "description": "Write the allowlist JSON to this path"
                },
                "pin": {
                    "type": "boolean",
                    "description": "Pin the allowlist to IPFS (otherwise compute locally only)",
                    "default": false
                }
            }
        },
        {
            "name": "zkemail propose-allowlist",
            "kind": "command",
            "description": "Propose committing an allowlist root + CID (executor-gated)",
            "readOnly": false,
            "broadcasts": true,
            "destructive": true,
            "sideEffects": [
                "ipfs-pin"
            ],
            "positionals": [],
            "options": {
                "cid": {
                    "type": "string",
                    "description": "IPFS CIDv0 of the pinned allowlist file",
                    "required": true
                },
                "duration": {
                    "type": "number",
                    "description": "Voting window in minutes (default 24h)",
                    "default": 1440
                },
                "root": {
                    "type": "string",
                    "description": "Merkle root from pop zkemail build-allowlist",
                    "required": true
                },
                "skip-verify": {
                    "type": "boolean",
                    "description": "Skip fetching the pinned file to confirm it reproduces --root (not recommended)",
                    "default": false
                }
            }
        },
        {
            "name": "config show",
            "kind": "command",
            "description": "Show active configuration",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "config validate",
            "kind": "command",
            "description": "Test RPC and subgraph connectivity",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [],
            "positionals": [],
            "options": {}
        },
        {
            "name": "mcp serve",
            "kind": "command",
            "description": "Serve the CLI as an MCP (Model Context Protocol) stdio server",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "spawns-cli-subprocesses"
            ],
            "positionals": [],
            "options": {
                "allow-destructive": {
                    "type": "boolean",
                    "description": "Also expose destructive writes — implies --allow-writes (or POP_MCP_ALLOW_DESTRUCTIVE=1)",
                    "default": false
                },
                "allow-writes": {
                    "type": "boolean",
                    "description": "Expose non-destructive write commands as tools (or POP_MCP_ALLOW_WRITES=1)",
                    "default": false
                }
            }
        },
        {
            "name": "init",
            "kind": "command",
            "description": "Interactive setup: wallet, chain, default org, .env",
            "readOnly": true,
            "broadcasts": false,
            "destructive": false,
            "sideEffects": [
                "local-file"
            ],
            "positionals": [],
            "options": {
                "chain": {
                    "type": "number",
                    "description": "Chain ID to configure (100 Gnosis, 42161 Arbitrum, 11155111 Sepolia, 84532 Base Sepolia)"
                },
                "file": {
                    "type": "string",
                    "description": "Write to this exact path (testing)"
                },
                "force": {
                    "type": "boolean",
                    "description": "Overwrite an existing target .env file",
                    "default": false
                },
                "generate-key": {
                    "type": "boolean",
                    "description": "Generate a fresh wallet non-interactively (prints the mnemonic once)",
                    "default": false
                },
                "global": {
                    "type": "boolean",
                    "description": "Write ~/.pop/.env (per-user) instead of ./.env (project-local)",
                    "default": false
                },
                "org": {
                    "type": "string",
                    "description": "Default org name or hex ID (POP_DEFAULT_ORG)"
                }
            }
        }
    ]
}
