{
  "commands": {
    "setup-agents:agentforce-deploy": {
      "aliases": [],
      "args": {},
      "description": "Generates Salesforce metadata (BotDefinition, GenAiPlanner, Topics, PromptTemplates) for\na deployable Agentforce agent tailored to the selected profile, then deploys it to the target org.\n\nUse `--dry-run` to generate metadata locally without deploying.",
      "examples": [
        "Deploy an Agentforce agent with developer profile:\n<%= config.bin %> <%= command.id %> --target-org myOrg --profile developer",
        "Generate metadata without deploying (dry run):\n<%= config.bin %> <%= command.id %> --dry-run --profile architect",
        "Deploy with force overwrite:\n<%= config.bin %> <%= command.id %> --target-org myOrg --force"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-org": {
          "description": "The target org where the Agentforce agent metadata will be deployed.\nRequired unless `--dry-run` is used.",
          "name": "target-org",
          "summary": "Salesforce org alias or username to deploy the agent to.",
          "hasDynamicHelp": false,
          "helpValue": "myOrgAlias",
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "description": "Determines which topics, prompt templates, and system instructions the agent will use.\nSee the --profile flag's help value above for the full current list of valid profile ids.",
          "name": "profile",
          "summary": "Role profile to use for agent behavior (default: developer).",
          "default": "developer",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "description": "When set, the command generates all Agentforce metadata files under `force-app/main/default/`\nbut does not execute `sf project deploy start`. Useful for reviewing generated metadata before deploying.",
          "name": "dry-run",
          "summary": "Generate metadata locally without deploying.",
          "allowNo": false,
          "type": "boolean"
        },
        "force": {
          "char": "f",
          "description": "Force overwrite of all generated metadata files, even if they already exist.",
          "name": "force",
          "summary": "Overwrite existing agent metadata files.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:agentforce-deploy",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Generate and deploy an Agentforce agent to a Salesforce org.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "agentforce-deploy.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:agentforce-deploy",
        "agentforce-deploy:setup-agents"
      ]
    },
    "setup-agents:dashboard": {
      "aliases": [],
      "args": {},
      "description": "Reads `.setup-agents/state/tasks.jsonl` and `workflow-runs.jsonl` and produces a standalone HTML dashboard (Chart.js, SLDS colors) or a JSON metrics payload. No org connection required.\n\nDefault output path: `docs/dashboard.html`.",
      "examples": [
        "Generate dashboard at default path:\n<%= config.bin %> <%= command.id %>",
        "Custom output path:\n<%= config.bin %> <%= command.id %> --output reports/delivery.html",
        "Open in browser after generation:\n<%= config.bin %> <%= command.id %> --open",
        "Print raw JSON metrics:\n<%= config.bin %> <%= command.id %> --format json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "output": {
          "char": "p",
          "description": "Path where the HTML file will be written. Defaults to `docs/dashboard.html`.",
          "name": "output",
          "summary": "Output file path for the HTML dashboard.",
          "default": "docs/dashboard.html",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "open": {
          "name": "open",
          "summary": "Open the dashboard in the default browser after generation.",
          "allowNo": false,
          "type": "boolean"
        },
        "format": {
          "char": "f",
          "description": "`html` writes a standalone Chart.js file. `json` prints the metrics payload to stdout and does not write a file.",
          "name": "format",
          "summary": "Output format: html (default) or json.",
          "default": "html",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "html",
            "json"
          ],
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:dashboard",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Generate a delivery dashboard from local workflow state.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "dashboard.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:dashboard",
        "dashboard:setup-agents"
      ]
    },
    "setup-agents:docs": {
      "aliases": [],
      "args": {},
      "description": "Choose exactly one output format: `--pdf` renders a linear PDF document, while `--deck` renders a self-contained interactive HTML presentation. Both formats render embedded Mermaid diagrams and inline local images.",
      "examples": [
        "Create an interactive deck from a markdown file:\n<%= config.bin %> <%= command.id %> --deck --input presentation.md --output presentation.html --review presentation-review.json",
        "Create a PDF document from every markdown file under a directory:\n<%= config.bin %> <%= command.id %> --pdf --input docs --output documentation.pdf --review documentation-review.json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "description": "A directory is walked recursively for `*.md` and `*.markdown` files and sorted. A comma-separated list preserves the given order.",
          "name": "input",
          "required": true,
          "summary": "Directory of markdown files, or a comma-separated list of markdown files.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "output": {
          "description": "When omitted, writes `document-<timestamp>.pdf` or `deck-<timestamp>.html` in the current directory.",
          "name": "output",
          "summary": "Path to write the generated PDF or HTML deck.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "review": {
          "description": "Required for every render. The review must approve the exact ordered input files and SHA-256 source digest, use an independent reviewer, and contain no open blocking findings.",
          "name": "review",
          "required": true,
          "summary": "Path to the approved document quality review JSON.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "deck": {
          "description": "Splits markdown at each top-level heading (`#`) and adds previous/next controls, keyboard navigation, URL slide hashes, and fullscreen mode. Deck output is always self-contained HTML.",
          "exclusive": [
            "pdf"
          ],
          "name": "deck",
          "summary": "Render an interactive Salesforce-branded HTML deck.",
          "allowNo": false,
          "type": "boolean"
        },
        "pdf": {
          "description": "Consolidates the markdown into a Salesforce-branded PDF. Use `--deck` instead for an interactive HTML presentation.",
          "exclusive": [
            "deck"
          ],
          "name": "pdf",
          "summary": "Render a linear PDF document.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:docs",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Render workspace markdown as a PDF document or interactive HTML deck.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "docs.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:docs",
        "docs:setup-agents"
      ]
    },
    "setup-agents:export": {
      "aliases": [],
      "args": {},
      "description": "Reads all orchestration state from `.setup-agents/state/` (tasks, decisions, evidence, handoffs, reviews) plus `config.json` and writes them to a `.setup-agents-export.json` file.\n\nThe exported bundle preserves setup-agents profile ownership on all records and can be imported into another workspace using `setup-agents import`.",
      "examples": [
        "Export workspace state to the default output path:\n<%= config.bin %> <%= command.id %>",
        "Export to a specific file:\n<%= config.bin %> <%= command.id %> --output /tmp/my-workspace.setup-agents-export.json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "output": {
          "description": "Path where the export bundle will be written. Defaults to `<cwd>/setup-agents-export-<timestamp>.json`.",
          "name": "output",
          "summary": "Output file path for the export bundle.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:export",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Export setup-agents workspace state to a portable bundle file.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "export.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:export",
        "export:setup-agents"
      ]
    },
    "setup-agents:import": {
      "aliases": [],
      "args": {},
      "description": "Reads a `.setup-agents-export.json` bundle and appends its records into the current workspace's `.setup-agents/state/` JSONL files.\n\nValidates the bundle format before importing. Existing records with the same id are either skipped or overwritten depending on `--on-conflict`. Use `--dry-run` to preview changes without writing anything.",
      "examples": [
        "Import from a bundle file (default: skip conflicts):\n<%= config.bin %> <%= command.id %> --file ./setup-agents-export-1234567890.json",
        "Import and overwrite conflicting records:\n<%= config.bin %> <%= command.id %> --file ./bundle.setup-agents-export.json --on-conflict overwrite",
        "Preview import without writing:\n<%= config.bin %> <%= command.id %> --file ./bundle.setup-agents-export.json --dry-run"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "file": {
          "description": "Path to a `.setup-agents-export.json` bundle produced by `setup-agents export`.",
          "name": "file",
          "required": true,
          "summary": "Path to the export bundle file.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "on-conflict": {
          "description": "Set to `skip` (default) to leave existing records untouched, or `overwrite` to append the incoming record on top of the existing one.",
          "name": "on-conflict",
          "summary": "How to handle records whose id already exists in the workspace.",
          "default": "skip",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "skip",
            "overwrite"
          ],
          "type": "option"
        },
        "dry-run": {
          "description": "Runs validation and conflict resolution but does not write any JSONL records. Useful for auditing a bundle before committing to the import.",
          "name": "dry-run",
          "summary": "Preview what would be imported without writing any files.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:import",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Import setup-agents workspace state from an export bundle file.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "import.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:import",
        "import:setup-agents"
      ]
    },
    "setup-agents": {
      "aliases": [],
      "args": {},
      "description": "Scans the specified source directory (default: force-app), parses all recognized Salesforce metadata types (Apex classes, triggers, LWC, objects, fields, flows, permission sets, labels), builds a dependency graph, and outputs the index to .setup-agents/sf-metadata-index.json (or .md with --format md).\n\nSupports incremental indexing via git-diff mode (default) which only re-indexes changed files, or --full for a complete rescan.",
      "examples": [
        "Generate a full metadata index:\n<%= config.bin %> <%= command.id %> --full",
        "Generate index in markdown format:\n<%= config.bin %> <%= command.id %> --format md",
        "Index only Apex classes and triggers:\n<%= config.bin %> <%= command.id %> --include ApexClass,ApexTrigger",
        "Index from a custom source directory:\n<%= config.bin %> <%= command.id %> --source-dir src/main"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "full": {
          "description": "By default, the index command uses git-diff mode to only re-index files changed since the last commit. Use --full to scan all files regardless of changes.",
          "name": "full",
          "summary": "Force a full scan instead of incremental git-diff mode.",
          "allowNo": false,
          "type": "boolean"
        },
        "format": {
          "name": "format",
          "summary": "Output format: json (default) or md.",
          "default": "json",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "json",
            "md"
          ],
          "type": "option"
        },
        "include": {
          "description": "Only index the specified types. Valid types: ApexClass, ApexTrigger, LightningComponentBundle, CustomObject, CustomField, Flow, PermissionSet, CustomLabel.",
          "name": "include",
          "summary": "Comma-separated list of metadata types to include (others are excluded).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "exclude": {
          "description": "Exclude the specified types from indexing. Valid types: ApexClass, ApexTrigger, LightningComponentBundle, CustomObject, CustomField, Flow, PermissionSet, CustomLabel.",
          "name": "exclude",
          "summary": "Comma-separated list of metadata types to exclude.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "source-dir": {
          "name": "source-dir",
          "summary": "Source directory to scan (default: force-app).",
          "default": "force-app",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Generate a dependency-aware metadata catalog from a Salesforce source directory.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "index.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents"
      ]
    },
    "setup-agents:init": {
      "aliases": [],
      "args": {},
      "description": "Creates `.setup-agents/config.json` in the current project directory with default setup-agents workspace settings.\n\nThe config stores the plugin version, workspace mode, selected profiles, selected tools, and native orchestration settings.\n\nUse project mode for a normal repository workspace. Use advisory mode for consultative setup defaults outside a project workspace.",
      "examples": [
        "Initialize project workspace config with detected defaults:\n<%= config.bin %> <%= command.id %>",
        "Initialize advisory workspace config:\n<%= config.bin %> <%= command.id %> --mode advisory",
        "Initialize with explicit profiles and tools:\n<%= config.bin %> <%= command.id %> --profile developer,architect --tools codex,claude",
        "Recreate an existing config:\n<%= config.bin %> <%= command.id %> --force",
        "Initialize and add team setup instructions to README.md:\n<%= config.bin %> <%= command.id %> --commit"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "mode": {
          "description": "Set the workspace mode stored in `.setup-agents/config.json`. Valid options are `project` and `advisory`.",
          "name": "mode",
          "summary": "Workspace mode to persist.",
          "default": "project",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "project",
            "advisory"
          ],
          "type": "option"
        },
        "advisory": {
          "description": "Shortcut for `--mode advisory`.",
          "name": "advisory",
          "summary": "Persist advisory mode.",
          "allowNo": false,
          "type": "boolean"
        },
        "profile": {
          "description": "Specify one or more role profiles as a comma-separated list.\n\nWhen omitted, the command runs a short guided onboarding: first a role question, then a clouds/products question, then an optional advanced full-list picker. If no profile is selected, `developer` is used as the default.",
          "name": "profile",
          "summary": "Role profiles to persist (comma-separated).",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "white-label": {
          "description": "When the `fsc` profile is active, selects a single country white-label so only that country's FSC rule and workflows are generated (`mx` = México, `co` = Colombia, `br` = Brasil). When omitted, the `fsc` profile emits its country-neutral output. Inert if the `fsc` profile is not selected.",
          "name": "white-label",
          "summary": "FSC white-label country pack to load (`mx`, `co`, or `br`).",
          "hasDynamicHelp": false,
          "helpValue": "mx|co|br",
          "multiple": false,
          "options": [
            "mx",
            "co",
            "br"
          ],
          "type": "option"
        },
        "tools": {
          "description": "Specify one or more AI coding tools as a comma-separated list. Valid options are `cursor`, `vscode`, `codex`, `claude`, or `agentforce`.\n\nWhen omitted, the command auto-detects tools present in the project; if none are found, all supported tools are stored.",
          "name": "tools",
          "summary": "AI tools to persist (comma-separated).",
          "hasDynamicHelp": false,
          "helpValue": "cursor|vscode|codex|claude|agentforce|windsurf|jetbrains|opencode",
          "multiple": false,
          "type": "option"
        },
        "force": {
          "char": "f",
          "description": "Force overwrite of `.setup-agents/config.json` if it already exists.",
          "name": "force",
          "summary": "Overwrite existing workspace config.",
          "allowNo": false,
          "type": "boolean"
        },
        "commit": {
          "description": "After writing `.setup-agents/config.json`, appends a short \"Team Setup\" section to `README.md` (creates it if missing) instructing teammates to run `sf setup-agents local` after cloning to generate their AI rule files from the committed config.",
          "name": "commit",
          "summary": "Add team setup note to README.md.",
          "allowNo": false,
          "type": "boolean"
        },
        "dry-run": {
          "description": "Show what would be written without modifying any files.",
          "name": "dry-run",
          "summary": "Preview changes without writing.",
          "allowNo": false,
          "type": "boolean"
        },
        "quick": {
          "description": "Skip all interactive prompts. Auto-detects tools from the project directory and profiles from project signals (e.g. sfdx-project.json, force-app/, package.json). Writes config and generates rule files in one step. Equivalent to running init + local with auto-detected defaults.",
          "name": "quick",
          "summary": "Auto-detect everything and generate rules immediately.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:init",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Initialize setup-agents workspace configuration.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "init.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:init",
        "init:setup-agents"
      ]
    },
    "setup-agents:local": {
      "aliases": [],
      "args": {},
      "description": "Sets up agent rule files for AI coding assistants in the current project directory.\n\nSupported tools:\n\n- **cursor** — Creates `.cursor/rules/agent-guidelines.mdc` and per-profile rule files for Cursor AI.\n- **vscode** — Creates `.github/copilot-instructions.md` and `.vscode/extensions.json` for GitHub Copilot.\n- **codex** — Creates `AGENTS.md` for OpenAI Codex CLI.\n- **claude** — Creates `CLAUDE.md` for Anthropic Claude Code.\n- **agentforce** — Creates `.a4drules/` numbered markdown files for Agentforce Vibes Extension.\n\nIf `--rules` is omitted, the command auto-detects installed tools based on existing directories\n(`.cursor`, `.vscode`, `AGENTS.md`, `CLAUDE.md`, `.a4drules`). If none are detected, all tools are configured.\n\nIf `--profile` is omitted, the command auto-detects profiles from the project structure and\npresents a selection prompt. If nothing is selected, the `developer` profile is used by default.\n\nUse `--force` to overwrite existing files (useful when running `sf setup-agents update` under the hood).",
      "examples": [
        "Configure all detected AI tools with interactive profile selection:\n<%= config.bin %> <%= command.id %>",
        "Configure only Cursor rules:\n<%= config.bin %> <%= command.id %> --rules cursor",
        "Configure only GitHub Copilot instructions for VS Code:\n<%= config.bin %> <%= command.id %> --rules vscode",
        "Configure only Codex (AGENTS.md):\n<%= config.bin %> <%= command.id %> --rules codex",
        "Configure Claude Code (CLAUDE.md):\n<%= config.bin %> <%= command.id %> --rules claude",
        "Configure Agentforce Vibes rules:\n<%= config.bin %> <%= command.id %> --rules agentforce",
        "Configure with a specific profile:\n<%= config.bin %> <%= command.id %> --profile developer",
        "Configure with multiple combined profiles:\n<%= config.bin %> <%= command.id %> --profile developer,architect,cgcloud",
        "Configure QA automation profile:\n<%= config.bin %> <%= command.id %> --profile qa",
        "Force overwrite all existing rule files:\n<%= config.bin %> <%= command.id %> --force",
        "Generate optional Open Orchestra integration artifacts:\n<%= config.bin %> <%= command.id %> --open-orchestra",
        "Generate advisory guidance outside a project workspace:\n<%= config.bin %> <%= command.id %> --advisory --profile architect,ba"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "rules": {
          "description": "Specify one or more AI coding assistants as a comma-separated list. Valid values are `cursor`, `vscode`, `codex`,\n`claude`, `agentforce`, `windsurf`, `jetbrains`, and `opencode`.\nWhen omitted, the command auto-detects tools present in the project; if none are found, all tools are configured.",
          "name": "rules",
          "summary": "Target AI tools to configure (comma-separated).",
          "hasDynamicHelp": false,
          "helpValue": "cursor,vscode,codex,claude,agentforce,windsurf,jetbrains,opencode",
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "description": "Specify one or more role profiles as a comma-separated list. Each profile generates a dedicated\nrule file with role-specific agent guidance and adds the relevant VS Code extensions.\n\nSee the --profile flag's help value above for the full current list of valid profile ids.\n\nWhen omitted, the command auto-detects profiles from the project structure and presents an\ninteractive multi-select prompt. If no profile is selected, `developer` is used as the default.",
          "name": "profile",
          "summary": "Role profiles to configure (comma-separated).",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "force": {
          "char": "f",
          "description": "Force overwrite of all generated files, even if they already exist.\nUse this flag after updating your profiles or when the plugin version has changed.",
          "name": "force",
          "summary": "Overwrite existing rule files.",
          "allowNo": false,
          "type": "boolean"
        },
        "open-orchestra": {
          "description": "Create `.setup-agents/open-orchestra/` with profile-to-role mapping and boundary documentation.\nThis does not install Open Orchestra or enable runtime orchestration by default.",
          "name": "open-orchestra",
          "summary": "Generate optional Open Orchestra integration artifacts.",
          "allowNo": false,
          "type": "boolean"
        },
        "quick": {
          "description": "Quick mode generates AI rule files for the selected tools and profiles but does not create `.setup-agents/state/`, playbooks, offline runbook, or documentation sync. Use this for a minimal onboarding experience.",
          "name": "quick",
          "summary": "Generate rules only — skip orchestration state, playbooks, and docs sync.",
          "allowNo": false,
          "type": "boolean"
        },
        "advisory": {
          "description": "Create `.setup-agents/advisory/` with consultative role guidance for sessions outside a project workspace.\nAdvisory mode does not create `AGENTS.md`, `CLAUDE.md`, `.cursor/rules/`, `.codex/`, or `.a4drules/`.",
          "name": "advisory",
          "summary": "Generate advisory role guidance without project-scoped rule files.",
          "allowNo": false,
          "type": "boolean"
        },
        "scope": {
          "description": "Controls where Cursor rule files are written. Use `user` to install rules globally in `~/.cursor/rules` so they apply to every project. Defaults to `project` (writes to `.cursor/rules/` in the current workspace).",
          "name": "scope",
          "summary": "Cursor rule scope: project (default) or user (~/.cursor/rules).",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "project",
            "user"
          ],
          "type": "option"
        },
        "sf-skills": {
          "description": "For Salesforce projects (detected via `sfdx-project.json`), install the official `forcedotcom/sf-skills` Agent Skills into the on-demand `.setup-agents/sf-skills/` directory — a location NOT auto-scanned by Claude Code, so the skills add zero base-context footprint and are referenced by path only when relevant. Best-effort and idempotent: a missing `npx`/`git` or network never breaks setup. Pass `--no-sf-skills` to skip installation entirely.",
          "name": "sf-skills",
          "summary": "Install the official Salesforce Agent Skills for Salesforce projects (default: enabled; use --no-sf-skills to skip).",
          "allowNo": true,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:local",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Configure AI agent rules for the local development environment.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "local.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:local",
        "local:setup-agents"
      ]
    },
    "setup-agents:mcp": {
      "aliases": [],
      "args": {},
      "description": "Sets up Cursor's Micro-Agent Collaboration Protocol (MCP) configuration for one or more\nSalesforce orgs using `@salesforce/mcp`. This allows Cursor AI to interact directly with\nyour Salesforce org metadata, data, users, and testing tools via tool calls.\n\nThe command writes (or merges into) a `.cursor/mcp.json` file with an MCP server entry per\nselected org. Use `--global` to write to the user-level `~/.cursor/mcp.json` instead.\n\nToolsets included by default (based on profile):\n\n- **metadata** — SFDX metadata read/deploy tools.\n- **data** — SOQL and org data inspection tools.\n- **testing** — Apex and project testing tools.\n- **users** — permission set and user management tools.\n\nIf `--target-org` is omitted, all authenticated orgs are listed for interactive selection.",
      "examples": [
        "Configure MCP for all authenticated orgs (interactive):\n<%= config.bin %> <%= command.id %>",
        "Configure MCP for a specific org:\n<%= config.bin %> <%= command.id %> --target-org myOrgAlias",
        "Configure MCP globally (all projects):\n<%= config.bin %> <%= command.id %> --global --target-org myOrgAlias",
        "Configure MCP with toolsets for the developer profile:\n<%= config.bin %> <%= command.id %> --profile developer --target-org myOrgAlias",
        "Configure MCP with all toolsets:\n<%= config.bin %> <%= command.id %> --all-toolsets --target-org myOrgAlias"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-org": {
          "description": "Specify a single org alias or username. An MCP server entry will be added for this org.\nOmit to select from all authenticated orgs interactively.",
          "name": "target-org",
          "summary": "Salesforce org alias or username to configure.",
          "hasDynamicHelp": false,
          "helpValue": "myOrgAlias",
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "description": "Comma-separated list of role profiles. Each profile maps to a subset of MCP toolsets.\nIf omitted, all available MCP toolsets are enabled.",
          "name": "profile",
          "summary": "Role profile(s) used to determine MCP toolsets.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "all-toolsets": {
          "description": "Force-enable all available MCP toolsets for every org configured.",
          "name": "all-toolsets",
          "summary": "Enable all MCP toolsets regardless of profile.",
          "allowNo": false,
          "type": "boolean"
        },
        "global": {
          "char": "g",
          "description": "When set, the MCP server entries are added to `~/.cursor/mcp.json`, making them available\nacross all Cursor projects on this machine.",
          "name": "global",
          "summary": "Write to the global ~/.cursor/mcp.json instead of the project-level .cursor/mcp.json.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:mcp",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Configure Cursor MCP servers for Salesforce orgs.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "mcp.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:mcp",
        "mcp:setup-agents"
      ]
    },
    "setup-agents:serve": {
      "aliases": [],
      "args": {},
      "description": "Starts a lightweight HTTP server that exposes the setup-agents service layer as a REST API. The web app (onboarding wizard and dashboard) connects to this server to read project state and apply configurations.\n\nThe server runs on localhost and provides CORS headers for browser access.",
      "examples": [
        "Start the bridge server on the default port (4195):\n<%= config.bin %> <%= command.id %>",
        "Start on a custom port:\n<%= config.bin %> <%= command.id %> --port 8080",
        "Start and open the browser:\n<%= config.bin %> <%= command.id %> --open",
        "Start and auto-restart when a newer version is installed:\n<%= config.bin %> <%= command.id %> --auto-reload"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "port": {
          "char": "p",
          "name": "port",
          "summary": "Port number for the bridge server.",
          "default": 4195,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "hostname": {
          "char": "H",
          "name": "hostname",
          "summary": "Hostname to bind the server to.",
          "default": "127.0.0.1",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "open": {
          "name": "open",
          "summary": "Open the browser after starting the server.",
          "allowNo": false,
          "type": "boolean"
        },
        "auto-reload": {
          "name": "auto-reload",
          "summary": "Automatically restart the bridge if a newer plugin version is installed while it's running (GH-753). Off by default.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:serve",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Start a local bridge server exposing the setup-agents API for the web UI.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "serve.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:serve",
        "serve:setup-agents"
      ]
    },
    "setup-agents:status": {
      "aliases": [],
      "args": {},
      "description": "Reads `.setup-agents/config.json`, `.setup-agents/state/tasks.jsonl`, reviews, handoffs, and evidence to print a workspace health summary.\n\nUseful for agents and humans to check open tasks, pending reviews, blocked handoffs, and missing evidence before starting work.",
      "examples": [
        "Show workspace status:\n<%= config.bin %> <%= command.id %>",
        "Show status and auto-fix stale rule files:\n<%= config.bin %> <%= command.id %> --fix"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "fix": {
          "name": "fix",
          "summary": "Auto-run update when stale rule files are detected.",
          "allowNo": false,
          "type": "boolean"
        },
        "doctor": {
          "name": "doctor",
          "summary": "Print the read-only task/workflow reconciliation report.",
          "allowNo": false,
          "type": "boolean"
        },
        "reconcile": {
          "name": "reconcile",
          "summary": "Append safe deterministic reconciliation repairs. Never creates or changes approvals.",
          "allowNo": false,
          "type": "boolean"
        },
        "target-dir": {
          "name": "target-dir",
          "summary": "Workspace root to inspect. Defaults to the current directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:status",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Summarize native setup-agents workspace state.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "status.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:status",
        "status:setup-agents"
      ]
    },
    "setup-agents:sync": {
      "aliases": [],
      "args": {},
      "description": "Pushes or pulls .setup-agents/state/ JSONL files to a GitHub Gist.\nRun without --pull to push. Run with --pull to merge remote state into local.",
      "examples": [
        "Push state to a new private Gist:\n<%= config.bin %> <%= command.id %> --remote gist",
        "Push to existing Gist:\n<%= config.bin %> <%= command.id %> --remote gist:abc123",
        "Pull from Gist:\n<%= config.bin %> <%= command.id %> --remote gist:abc123 --pull"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "remote": {
          "name": "remote",
          "required": true,
          "summary": "Remote target. Use 'gist' to create a new private GitHub Gist, or 'gist:<id>' to use existing.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "pull": {
          "name": "pull",
          "summary": "Pull and merge remote state into local instead of pushing.",
          "allowNo": false,
          "type": "boolean"
        },
        "dry-run": {
          "name": "dry-run",
          "summary": "Print what would be pushed or pulled without modifying state.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:sync",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Sync workspace state to or from a shared remote target for team visibility.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "sync.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:sync",
        "sync:setup-agents"
      ]
    },
    "setup-agents:update": {
      "aliases": [],
      "args": {},
      "description": "Scans the current project for rule files generated by `sf setup-agents local` and re-generates any\nfiles whose embedded `pluginVersion` (or `<!-- setup-agents: -->` comment) does not match the\ncurrent plugin version.\n\nDetection logic:\n\n- `.cursor/rules/*.mdc` — checks `pluginVersion:` in frontmatter.\n- `.github/copilot-instructions.md` — checks `<!-- setup-agents: x.y.z -->` comment.\n- `AGENTS.md` — checks `<!-- setup-agents: x.y.z -->` comment.\n- `CLAUDE.md` — checks `<!-- setup-agents: x.y.z -->` comment.\n- `.a4drules/*.md` — checks `<!-- setup-agents: x.y.z -->` comment.\n\nActive profiles are inferred from the filenames in `.cursor/rules/` (e.g. `developer-standards.mdc`\nmaps to the `developer` profile). Use `--dry-run` to preview changes without writing files.\nFiles with setup-agents managed blocks update only the generated block content; user content outside\nthose blocks is preserved.",
      "examples": [
        "Preview which rule files are stale:\n<%= config.bin %> <%= command.id %> --dry-run",
        "Update all stale files with confirmation:\n<%= config.bin %> <%= command.id %>",
        "Update all stale files without prompting (CI mode):\n<%= config.bin %> <%= command.id %> --yes",
        "Regenerate all rule files from saved config without re-selecting profiles:\n<%= config.bin %> <%= command.id %> --force"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "description": "List all stale files that would be updated without actually modifying them.\nUseful to audit what would change before committing to an update.",
          "name": "dry-run",
          "summary": "Preview changes without writing any files.",
          "allowNo": false,
          "type": "boolean"
        },
        "check": {
          "description": "Report stale files and whether each file can be updated through setup-agents managed blocks.\nThis is intended for CI or pre-PR validation.",
          "name": "check",
          "summary": "Check for stale files without writing changes.",
          "allowNo": false,
          "type": "boolean"
        },
        "yes": {
          "char": "y",
          "description": "Automatically confirm the update without interactive prompting.\nUseful in CI/CD pipelines or scripted environments.",
          "name": "yes",
          "summary": "Skip confirmation prompt.",
          "allowNo": false,
          "type": "boolean"
        },
        "doc-reference": {
          "name": "doc-reference",
          "summary": "Regenerate reference doc rule files (salesforce-pdf-registry) for every configured runtime — Cursor (.mdc), Claude and Codex (.md) — from existing config without re-running setup.",
          "allowNo": false,
          "type": "boolean"
        },
        "fetch-refs": {
          "name": "fetch-refs",
          "summary": "Download Salesforce reference PDFs and HTML docs to .setup-agents/references/ for local agent access.",
          "allowNo": false,
          "type": "boolean"
        },
        "force": {
          "char": "f",
          "exclusive": [
            "dry-run",
            "check"
          ],
          "name": "force",
          "summary": "Regenerate all rule files and skills from saved workspace config, regardless of version.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:update",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Update stale AI agent rule files to the current plugin version.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "update.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:update",
        "update:setup-agents"
      ]
    },
    "setup-agents:verify": {
      "aliases": [],
      "args": {},
      "description": "Generates a probe prompt tailored to the active tool and profiles in this workspace.\nPaste it into your AI agent — if the agent responds correctly, the rules are being applied.\n\nDoes not invoke the agent automatically. Prints the probe prompt and instructions.",
      "examples": [
        "Print a probe prompt for the active workspace:\n<%= config.bin %> <%= command.id %>",
        "JSON output for scripting:\n<%= config.bin %> <%= command.id %> --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "rules": {
          "name": "rules",
          "summary": "AI tool to verify.",
          "hasDynamicHelp": false,
          "helpValue": "cursor|vscode|codex|claude|agentforce|windsurf|jetbrains|opencode",
          "multiple": false,
          "options": [
            "cursor",
            "vscode",
            "codex",
            "claude",
            "agentforce",
            "windsurf",
            "jetbrains",
            "opencode"
          ],
          "type": "option"
        },
        "profile": {
          "name": "profile",
          "summary": "Profiles to include in the probe (comma-separated).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:verify",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Verify that your AI agent is reading the generated rule files.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "verify.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:verify",
        "verify:setup-agents"
      ]
    },
    "setup-agents:auth:revoke": {
      "aliases": [],
      "args": {},
      "description": "Removes the local durable authorization for the current workspace. Use --target-dir to revoke another workspace.",
      "examples": [
        "<%= config.bin %> <%= command.id %>",
        "<%= config.bin %> <%= command.id %> --target-dir ../project"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "name": "target-dir",
          "summary": "Workspace whose activation should be revoked.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:auth:revoke",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Revoke setup-agents authorization for a workspace.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "auth",
        "revoke.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:auth:revoke",
        "auth:setup-agents:revoke",
        "auth:revoke:setup-agents",
        "setup-agents:revoke:auth",
        "revoke:setup-agents:auth",
        "revoke:auth:setup-agents"
      ]
    },
    "setup-agents:canvas:clean": {
      "aliases": [],
      "args": {},
      "description": "Finds files in `~/.cursor/projects/<slug>/canvases/` that have no matching source canvas in the repo and removes them. Prompts for confirmation unless `--yes` is supplied or stdout is non-TTY.",
      "examples": [
        "Remove orphans interactively:\n<%= config.bin %> <%= command.id %>",
        "Remove orphans without prompting:\n<%= config.bin %> <%= command.id %> --yes"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "path": {
          "name": "path",
          "summary": "Target repository path (default: git root of current directory).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "yes": {
          "name": "yes",
          "summary": "Skip confirmation prompt and remove orphans immediately.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:canvas:clean",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Remove orphan files from the Cursor canvas cache.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "canvas",
        "clean.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:canvas:clean",
        "canvas:setup-agents:clean",
        "canvas:clean:setup-agents",
        "setup-agents:clean:canvas",
        "clean:setup-agents:canvas",
        "clean:canvas:setup-agents"
      ]
    },
    "setup-agents:canvas:status": {
      "aliases": [],
      "args": {},
      "description": "Lists each source canvas and its state in the Cursor cache: symlink pointing to the correct source (`symlink-ok`), symlink with a wrong target (`symlink-wrong`), a regular (possibly stale) file (`regular`), or absent from the cache (`missing`). Also reports orphan cache files with no repo counterpart.",
      "examples": [
        "Check canvas status for the current repo:\n<%= config.bin %> <%= command.id %>"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "path": {
          "name": "path",
          "summary": "Target repository path (default: git root of current directory).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:canvas:status",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Show the state of Cursor canvas cache entries.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "canvas",
        "status.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:canvas:status",
        "canvas:setup-agents:status",
        "canvas:status:setup-agents",
        "setup-agents:status:canvas",
        "status:setup-agents:canvas",
        "status:canvas:setup-agents"
      ]
    },
    "setup-agents:canvas:sync": {
      "aliases": [],
      "args": {},
      "description": "Replaces each cached `.canvas.tsx` file under `~/.cursor/projects/<slug>/canvases/` with a symlink to the repo source so edits made outside Cursor are reflected immediately on reopen.\n\nSupported canvas locations (first match wins): `docs/canvases`, `canvases`, `src/canvases`.",
      "examples": [
        "Sync canvases for the current repo:\n<%= config.bin %> <%= command.id %>",
        "Preview without making changes:\n<%= config.bin %> <%= command.id %> --dry-run",
        "Initialize cache dir and sync:\n<%= config.bin %> <%= command.id %> --init",
        "Sync and remove orphans:\n<%= config.bin %> <%= command.id %> --clean"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "name": "dry-run",
          "summary": "Preview changes without writing anything.",
          "allowNo": false,
          "type": "boolean"
        },
        "init": {
          "name": "init",
          "summary": "Create the cache directory if it does not exist.",
          "allowNo": false,
          "type": "boolean"
        },
        "clean": {
          "name": "clean",
          "summary": "Remove orphan files in cache after syncing.",
          "allowNo": false,
          "type": "boolean"
        },
        "path": {
          "name": "path",
          "summary": "Target repository path (default: git root of current directory).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:canvas:sync",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Sync Cursor canvas cache with repo source files.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "canvas",
        "sync.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:canvas:sync",
        "canvas:setup-agents:sync",
        "canvas:sync:setup-agents",
        "setup-agents:sync:canvas",
        "sync:setup-agents:canvas",
        "sync:canvas:setup-agents"
      ]
    },
    "setup-agents:background:run": {
      "aliases": [],
      "args": {},
      "description": "Delegates a long-running, side-effecting command (Salesforce metadata retrieve/deploy, package operations, or a project build) to the running setup-agents bridge server, which executes it as a detached process that OUTLIVES the current chat turn.\n\nThis exists so work the agent starts inside a chat turn — `sf project retrieve start`, `sf project deploy start`, `npm run build` — is not killed when the turn ends, when the user hits Stop, when the idle session is reaped, or when the session respawns on the next message.\n\nThe command after `--` must match the background allow-list: `sf project ...`, `sf package ...`, `npm run build`, or `yarn build`. Anything else is rejected. Lifecycle (started/completed/failed) is reported to the web console via the bridge's spawn event stream.\n\nRequires a running bridge (`sf setup-agents serve`). The bridge port is discovered from the `SETUP_AGENTS_BRIDGE_PORT` environment variable, or supplied with `--port`.",
      "examples": [
        "Run a metadata retrieve in the background:\n<%= config.bin %> <%= command.id %> --label \"Retrieve Apex\" -- sf project retrieve start -m ApexClass",
        "Run a project build in the background:\n<%= config.bin %> <%= command.id %> -- npm run build"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "label": {
          "name": "label",
          "summary": "Human-friendly label shown in the chat UI for this background task.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "port": {
          "name": "port",
          "summary": "Bridge server port. Defaults to SETUP_AGENTS_BRIDGE_PORT, then 4195.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "chat-session": {
          "name": "chat-session",
          "summary": "Originating chat session id, used to correlate the background task to the chat panel.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:background:run",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": false,
      "summary": "Launch an allow-listed long-running command in a durable background lane.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "background",
        "run.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:background:run",
        "background:setup-agents:run",
        "background:run:setup-agents",
        "setup-agents:run:background",
        "run:setup-agents:background",
        "run:background:setup-agents"
      ]
    },
    "setup-agents:decision:add": {
      "aliases": [],
      "args": {},
      "description": "Appends a JSON Lines decision entry to `.setup-agents/state/decisions.jsonl`.\n\nDecision records capture selected approaches, rationale, ownership, timestamps, and optional task ids.",
      "examples": [
        "Add an accepted decision for a task:\n<%= config.bin %> <%= command.id %> --task SA-96 --profile architect --summary \"Use native JSONL records\" --rationale \"Keeps setup-agents independent of external engines\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe the decision in one concise sentence.",
          "name": "summary",
          "required": true,
          "summary": "Short decision summary.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Associate the decision with a task id such as `SA-96` or `#96`.",
          "name": "task",
          "summary": "Task or issue id for this decision.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Record the current role or agent owner responsible for the decision.",
          "name": "role",
          "summary": "Owning role for this decision.",
          "default": "developer",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile responsible for the decision.",
          "name": "profile",
          "summary": "Owning setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "rationale": {
          "description": "Add the reason this decision was made.",
          "name": "rationale",
          "summary": "Decision rationale.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "status": {
          "description": "Set whether the decision is proposed, accepted, or superseded.",
          "name": "status",
          "summary": "Decision status.",
          "default": "accepted",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "proposed",
            "accepted",
            "superseded"
          ],
          "type": "option"
        },
        "outcome": {
          "description": "Record the outcome text for the decision. When omitted, the status is used.",
          "name": "outcome",
          "summary": "Decision outcome.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "alternative": {
          "description": "Comma-separated alternatives considered before this decision.",
          "name": "alternative",
          "summary": "Alternatives considered.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids that support this decision.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:decision:add",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Add a setup-agents decision record.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "decision",
        "add.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:decision:add",
        "decision:setup-agents:add",
        "decision:add:setup-agents",
        "setup-agents:add:decision",
        "add:setup-agents:decision",
        "add:decision:setup-agents"
      ]
    },
    "setup-agents:decision:list": {
      "aliases": [],
      "args": {},
      "description": "Reads JSON Lines decision entries from `.setup-agents/state/decisions.jsonl`.",
      "examples": [
        "List recent decisions:\n<%= config.bin %> <%= command.id %>",
        "List accepted decisions for a task:\n<%= config.bin %> <%= command.id %> --task SA-96 --status accepted"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Show only decision records associated with the given task id.",
          "name": "task",
          "summary": "Filter by task or issue id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Show only decision records owned by the given role.",
          "name": "role",
          "summary": "Filter by owning role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Show only decision records owned by the given setup-agents profile.",
          "name": "profile",
          "summary": "Filter by owning setup-agents profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "status": {
          "description": "Show only decisions matching the given status.",
          "name": "status",
          "summary": "Filter by decision status.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "limit": {
          "char": "l",
          "description": "Limit the number of matching records returned from the end of the decision log.",
          "name": "limit",
          "summary": "Maximum records to show.",
          "default": 20,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:decision:list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List setup-agents decision records.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "decision",
        "list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:decision:list",
        "decision:setup-agents:list",
        "decision:list:setup-agents",
        "setup-agents:list:decision",
        "list:setup-agents:decision",
        "list:decision:setup-agents"
      ]
    },
    "setup-agents:decision:render": {
      "aliases": [],
      "args": {},
      "description": "Reads decision records from `.setup-agents/state/decisions.jsonl` and writes human-reviewable Markdown ADRs to `docs/adr/`.\n\nThe JSONL log stays the canonical source; `docs/adr/` is a derived render. Each record is written to `docs/adr/ADR-<id>.md` so the record id is recoverable from the filename. This command never mutates `decisions.jsonl`.",
      "examples": [
        "Render every decision record as an ADR:\n<%= config.bin %> <%= command.id %> --all",
        "Render a single decision record:\n<%= config.bin %> <%= command.id %> --id setup-agents-decision-1700000000000-abc123"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Render only the decision record with this id.",
          "exclusive": [
            "all"
          ],
          "name": "id",
          "summary": "Decision record id to render.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "all": {
          "description": "Render all decision records found in the decision log.",
          "exclusive": [
            "id"
          ],
          "name": "all",
          "summary": "Render every decision record.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:decision:render",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Render decision records as Markdown ADRs.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "decision",
        "render.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:decision:render",
        "decision:setup-agents:render",
        "decision:render:setup-agents",
        "setup-agents:render:decision",
        "render:setup-agents:decision",
        "render:decision:setup-agents"
      ]
    },
    "setup-agents:diagram:import": {
      "aliases": [],
      "args": {},
      "description": "Builds the canonical AgentDiagramData model from a real source — force-app metadata, an existing draw.io file, a Mermaid `.mmd`, or a Markdown file with an embedded `mermaid` block — so `sf setup-agents diagram render` can re-lay-it-out optimally instead of you hand-authoring the JSON. Each source normalizes to the same model: nodes are entities/objects (never fields — an ERD models objects, a field's relationship becomes an edge), edges are relationships, and `group` is inferred per source (namespace for force-app, subgraph/swimlane for drawio/mermaid). Output goes to a file with `--out`, or to stdout when `--out` is omitted; pipe it into `diagram render`.",
      "examples": [
        "`sf setup-agents diagram import --input force-app --from force-app --out model.json`",
        "`sf setup-agents diagram import --input docs/erd.drawio --out model.json`",
        "`sf setup-agents diagram import -i diagram.mmd --out model.json && sf setup-agents diagram render -i model.json -f drawio -o /tmp/erd.drawio`",
        "`sf setup-agents diagram import -i design.md` (extracts the embedded mermaid block, prints the model)"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "name": "input",
          "required": true,
          "summary": "Path to the source: a force-app directory, a .drawio file, a .mmd Mermaid file, or a .md Markdown file.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "from": {
          "char": "f",
          "name": "from",
          "summary": "Source adapter: force-app, drawio, mermaid, md, or auto (infer from the path — directory → force-app, by extension otherwise).",
          "default": "auto",
          "hasDynamicHelp": false,
          "helpValue": "force-app|drawio|mermaid|md|auto",
          "multiple": false,
          "options": [
            "force-app",
            "drawio",
            "mermaid",
            "md",
            "auto"
          ],
          "type": "option"
        },
        "out": {
          "name": "out",
          "summary": "Path to write the AgentDiagramData JSON. When omitted, the model is printed to stdout.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "title": {
          "char": "t",
          "name": "title",
          "summary": "Diagram title. Defaults to the input file/directory name.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:diagram:import",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Import an existing diagram or org metadata into AgentDiagramData JSON.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "diagram",
        "import.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:diagram:import",
        "diagram:setup-agents:import",
        "diagram:import:setup-agents",
        "setup-agents:import:diagram",
        "import:setup-agents:diagram",
        "import:diagram:setup-agents"
      ]
    },
    "setup-agents:diagram:migrate": {
      "aliases": [],
      "args": {},
      "description": "Applies best-practice ERD rendering to an existing drawio file: orthogonal edge style, PK/FK row-level connections, label backgrounds, and optional dagre relayout.",
      "examples": [
        "`sf setup-agents diagram migrate --file docs/architecture/erd.drawio`",
        "`sf setup-agents diagram migrate --file erd.drawio --relayout`"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "file": {
          "char": "f",
          "name": "file",
          "required": true,
          "summary": "Path to the drawio file to migrate.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "relayout": {
          "name": "relayout",
          "summary": "Reposition tables using dagre layout engine.",
          "allowNo": false,
          "type": "boolean"
        },
        "node-sep": {
          "name": "node-sep",
          "summary": "Horizontal separation between nodes (dagre nodesep).",
          "default": 100,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "rank-sep": {
          "name": "rank-sep",
          "summary": "Vertical separation between ranks (dagre ranksep).",
          "default": 180,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:diagram:migrate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Migrate a drawio ERD to use orthogonal routing, row-level connections, and dagre layout.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "diagram",
        "migrate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:diagram:migrate",
        "diagram:setup-agents:migrate",
        "diagram:migrate:setup-agents",
        "setup-agents:migrate:diagram",
        "migrate:setup-agents:diagram",
        "migrate:diagram:setup-agents"
      ]
    },
    "setup-agents:diagram:render": {
      "aliases": [],
      "args": {},
      "description": "Reads an AgentDiagramData JSON document and renders it with the plugin's deterministic diagram renderer. Use this instead of hand-rolling a one-off conversion script. The AgentDiagramData shape is: `{ type, title?, direction?, nodes: [{ id, label, shape?, group?, style? }], edges: [{ from, to, label?, style?, arrowhead? }], participants?, messages? }`. Output goes to a file with `--out`, or to stdout when `--out` is omitted. The `svg` and `pdf` formats emit the same painted diagram the web-console shows (orthogonal edge routing, ER row-level connections, group bands) — not raw mxGraph XML. `pdf` requires `--out` and a local puppeteer install.",
      "examples": [
        "`sf setup-agents diagram render --input data.json --format mermaid`",
        "`sf setup-agents diagram render --input data.json --format drawio --out docs/architecture/diagram.drawio`",
        "`sf setup-agents diagram render -i data.json -f maxgraph-json -o diagram.json`",
        "`sf setup-agents diagram render -i data.json -f svg -o diagram.svg`",
        "`sf setup-agents diagram render -i data.json -f pdf -o diagram.pdf`"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "name": "input",
          "required": true,
          "summary": "Path to an AgentDiagramData JSON file.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "format": {
          "char": "f",
          "name": "format",
          "summary": "Output format: mermaid, drawio, maxgraph-json, svg, or pdf.",
          "default": "mermaid",
          "hasDynamicHelp": false,
          "helpValue": "mermaid|drawio|maxgraph-json|svg|pdf",
          "multiple": false,
          "options": [
            "mermaid",
            "drawio",
            "maxgraph-json",
            "svg",
            "pdf"
          ],
          "type": "option"
        },
        "out": {
          "char": "o",
          "name": "out",
          "summary": "Path to write the rendered output. When omitted, the result is printed to stdout.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:diagram:render",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Render structured AgentDiagramData JSON to Mermaid, draw.io XML, maxGraph JSON, SVG, or PDF.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "diagram",
        "render.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:diagram:render",
        "diagram:setup-agents:render",
        "diagram:render:setup-agents",
        "setup-agents:render:diagram",
        "render:setup-agents:diagram",
        "render:diagram:setup-agents"
      ]
    },
    "setup-agents:docs:sync": {
      "aliases": [],
      "args": {},
      "description": "Downloads documentation from developer.salesforce.com and caches it locally in `.setup-agents/docs/<profile>/` so sub-agents can read it on demand during workflow execution.",
      "examples": [
        "Sync all registered profiles:\n<%= config.bin %> <%= command.id %>",
        "Sync a specific profile:\n<%= config.bin %> <%= command.id %> --profile loyalty",
        "Force re-download even if cached:\n<%= config.bin %> <%= command.id %> --profile fsc --force"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "When omitted, syncs documentation for all profiles that have registered doc sources. Use this to sync a single profile.",
          "name": "profile",
          "summary": "Profile to sync documentation for.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "force": {
          "description": "By default, previously synced documentation is skipped. Use --force to re-download and overwrite.",
          "name": "force",
          "summary": "Re-download even if documentation is already cached.",
          "allowNo": false,
          "type": "boolean"
        },
        "max-pages": {
          "description": "Controls how many sub-pages are fetched from each documentation source. Higher values provide more detail but take longer. Default is 5.",
          "name": "max-pages",
          "summary": "Maximum pages to download per doc source.",
          "default": 5,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:docs:sync",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Sync Salesforce documentation for profiles to local cache.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "docs",
        "sync.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:docs:sync",
        "docs:setup-agents:sync",
        "docs:sync:setup-agents",
        "setup-agents:sync:docs",
        "sync:setup-agents:docs",
        "sync:docs:setup-agents"
      ]
    },
    "setup-agents:extract:html-to-markdown": {
      "aliases": [],
      "args": {},
      "description": "Reads an HTML file and converts it to Markdown, mapping headings, lists, tables, and inline emphasis. Use this to turn a large HTML reference into a greppable `.md` file instead of trying to `Read` the markup whole (which blows the context window). Output goes to a file with `--out`, or to stdout when `--out` is omitted.",
      "examples": [
        "`sf setup-agents extract html-to-markdown --input page.html --out page.md`",
        "`sf setup-agents extract html-to-markdown -i page.html`"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "name": "input",
          "required": true,
          "summary": "Path to an HTML file to extract.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "out": {
          "char": "o",
          "name": "out",
          "summary": "Path to write the Markdown output. When omitted, the result is printed to stdout.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:extract:html-to-markdown",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Extract the content of an HTML file to Markdown.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "extract",
        "html-to-markdown.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:extract:html-to-markdown",
        "extract:setup-agents:html-to-markdown",
        "extract:html-to-markdown:setup-agents",
        "setup-agents:html-to-markdown:extract",
        "html-to-markdown:setup-agents:extract",
        "html-to-markdown:extract:setup-agents"
      ]
    },
    "setup-agents:extract:pdf-to-markdown": {
      "aliases": [],
      "args": {},
      "description": "Reads a PDF file and converts its text content to Markdown, preserving paragraph breaks. Use this to turn a large PDF reference into a greppable `.md` file instead of trying to `Read` the binary whole (which fails and blows the context window). Output goes to a file with `--out`, or to stdout when `--out` is omitted.",
      "examples": [
        "`sf setup-agents extract pdf-to-markdown --input spec.pdf --out spec.md`",
        "`sf setup-agents extract pdf-to-markdown -i spec.pdf`"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "name": "input",
          "required": true,
          "summary": "Path to a PDF file to extract.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "out": {
          "char": "o",
          "name": "out",
          "summary": "Path to write the Markdown output. When omitted, the result is printed to stdout.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:extract:pdf-to-markdown",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Extract the text of a PDF file to Markdown.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "extract",
        "pdf-to-markdown.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:extract:pdf-to-markdown",
        "extract:setup-agents:pdf-to-markdown",
        "extract:pdf-to-markdown:setup-agents",
        "setup-agents:pdf-to-markdown:extract",
        "pdf-to-markdown:setup-agents:extract",
        "pdf-to-markdown:extract:setup-agents"
      ]
    },
    "setup-agents:evidence:add": {
      "aliases": [],
      "args": {},
      "description": "Appends a JSON Lines evidence entry to `.setup-agents/state/evidence.jsonl`.\n\nEvidence records capture validation artifacts such as commands, files, screenshots, traces, reports, or notes.\n\nID format: `setup-agents-evidence-<unix_ms>-<6_random_alnum>` (auto-generated).",
      "examples": [
        "Add command evidence for a task:\n<%= config.bin %> <%= command.id %> --task SA-96 --profile developer --type command --source \"npm run build\" --summary \"Build passed\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe the evidence in one concise sentence.",
          "name": "summary",
          "required": true,
          "summary": "Short evidence summary.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Associate the evidence with a task id such as `SA-96` or `#96`.",
          "name": "task",
          "summary": "Task or issue id for this evidence.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Record the current role or agent owner responsible for the evidence.",
          "name": "role",
          "summary": "Owning role for this evidence.",
          "default": "developer",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile responsible for the evidence.",
          "name": "profile",
          "summary": "Owning setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "type": {
          "description": "Classify the evidence as command, file, screenshot, trace, report, validation, lesson, or other.",
          "name": "type",
          "summary": "Evidence type.",
          "default": "other",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "command",
            "file",
            "screenshot",
            "trace",
            "report",
            "validation",
            "lesson",
            "other"
          ],
          "type": "option"
        },
        "kind": {
          "description": "Alias for `--type`.",
          "name": "kind",
          "summary": "Evidence kind.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "command",
            "file",
            "screenshot",
            "trace",
            "report",
            "validation",
            "lesson",
            "other"
          ],
          "type": "option"
        },
        "source": {
          "description": "Reference a command, file path, URL, report path, trace id, or other source for the evidence.",
          "name": "source",
          "summary": "Evidence source reference.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "command": {
          "description": "Record the command string used to produce command evidence.",
          "name": "command",
          "summary": "Command that produced this evidence.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "path": {
          "description": "Record a file, report, screenshot, or trace path.",
          "name": "path",
          "summary": "Evidence path.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "exit-code": {
          "description": "Record the exit code for command evidence.",
          "name": "exit-code",
          "summary": "Command exit code.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "details": {
          "description": "Add optional supporting details that should be stored with the evidence record.",
          "name": "details",
          "summary": "Additional evidence details.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "minutes": {
          "description": "Minutes a human spent on this work. Use with `--type manual` (hands-on platform execution: Setup config not possible via metadata/tooling API, MIAW, data fixes) or `--type review` (gate approvals, architecture corrections, direction). The effort insights sum these as real human effort (GH-445).",
          "name": "minutes",
          "summary": "Measured human-effort minutes (for `manual` / `review` evidence).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:evidence:add",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Add a setup-agents evidence record.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "evidence",
        "add.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:evidence:add",
        "evidence:setup-agents:add",
        "evidence:add:setup-agents",
        "setup-agents:add:evidence",
        "add:setup-agents:evidence",
        "add:evidence:setup-agents"
      ]
    },
    "setup-agents:evidence:compact": {
      "aliases": [],
      "args": {},
      "description": "Moves evidence records older than the specified threshold into an archive file,\nreducing the size of the active evidence log.",
      "examples": [
        "Compact evidence older than 30 days:\n<%= config.bin %> <%= command.id %>",
        "Preview compaction of 60-day-old records:\n<%= config.bin %> <%= command.id %> --older-than-days 60 --dry-run",
        "Compact evidence for a specific task:\n<%= config.bin %> <%= command.id %> --task SA-96"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "older-than-days": {
          "char": "d",
          "description": "Archive evidence records older than this many days (default: 30).",
          "name": "older-than-days",
          "summary": "Age threshold in days.",
          "default": 30,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "name": "dry-run",
          "summary": "Preview what would be compacted without writing.",
          "allowNo": false,
          "type": "boolean"
        },
        "task": {
          "char": "t",
          "description": "Restrict compaction to evidence records associated with the given task id.",
          "name": "task",
          "summary": "Only compact records for a specific task.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:evidence:compact",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Compact and archive old evidence records.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "evidence",
        "compact.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:evidence:compact",
        "evidence:setup-agents:compact",
        "evidence:compact:setup-agents",
        "setup-agents:compact:evidence",
        "compact:setup-agents:evidence",
        "compact:evidence:setup-agents"
      ]
    },
    "setup-agents:evidence:generate": {
      "aliases": [],
      "args": {},
      "description": "Runs the built-in QA evidence generators and appends the results to `.setup-agents/state/evidence.jsonl` as `report` evidence for the given task.\n\n- `test` runs `npx mocha --reporter json` and records pass/fail/skip counts.\n- `coverage` parses `coverage/lcov.info` and records line/function/branch percentages.\n- `lint` runs ESLint and records error/warning counts.\n- `all` (default) runs the three concurrently and reports an overall status.\n\nUse this instead of hand-rolling a script to collect QA evidence — the generated records feed the workflow QA gate and effort insights.",
      "examples": [
        "Generate test, coverage, and lint evidence for a task:\n<%= config.bin %> <%= command.id %> --task SA-96",
        "Generate only coverage evidence:\n<%= config.bin %> <%= command.id %> --task SA-96 --kind coverage"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Associate the evidence with a task id such as `SA-96` or `#96`.",
          "name": "task",
          "required": true,
          "summary": "Task or issue id for the generated evidence.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "kind": {
          "char": "k",
          "description": "One of `all` (default), `test`, `coverage`, or `lint`.",
          "name": "kind",
          "summary": "Which evidence to generate.",
          "default": "all",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "all",
            "test",
            "coverage",
            "lint"
          ],
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:evidence:generate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Generate QA evidence (test, coverage, lint) and record it.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "evidence",
        "generate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:evidence:generate",
        "evidence:setup-agents:generate",
        "evidence:generate:setup-agents",
        "setup-agents:generate:evidence",
        "generate:setup-agents:evidence",
        "generate:evidence:setup-agents"
      ]
    },
    "setup-agents:evidence:list": {
      "aliases": [],
      "args": {},
      "description": "Reads JSON Lines evidence entries from `.setup-agents/state/evidence.jsonl`.",
      "examples": [
        "List recent evidence:\n<%= config.bin %> <%= command.id %>",
        "List evidence for a task:\n<%= config.bin %> <%= command.id %> --task SA-96"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Show only evidence records associated with the given task id.",
          "name": "task",
          "summary": "Filter by task or issue id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Show only evidence records owned by the given role.",
          "name": "role",
          "summary": "Filter by owning role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Show only evidence records owned by the given setup-agents profile.",
          "name": "profile",
          "summary": "Filter by owning setup-agents profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "limit": {
          "char": "l",
          "description": "Limit the number of matching records returned from the end of the evidence log.",
          "name": "limit",
          "summary": "Maximum records to show.",
          "default": 20,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:evidence:list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List setup-agents evidence records.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "evidence",
        "list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:evidence:list",
        "evidence:setup-agents:list",
        "evidence:list:setup-agents",
        "setup-agents:list:evidence",
        "list:setup-agents:evidence",
        "list:evidence:setup-agents"
      ]
    },
    "setup-agents:evidence:validate": {
      "aliases": [],
      "args": {},
      "description": "Scans `.setup-agents/state/evidence.jsonl` and reports entries with IDs that do not match the canonical format: `setup-agents-evidence-<unix_ms>-<6_random_alnum>`.",
      "examples": [
        "Validate all evidence records:\n<%= config.bin %> <%= command.id %>"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:evidence:validate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Validate evidence record IDs in the state file.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "evidence",
        "validate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:evidence:validate",
        "evidence:setup-agents:validate",
        "evidence:validate:setup-agents",
        "setup-agents:validate:evidence",
        "validate:setup-agents:evidence",
        "validate:evidence:setup-agents"
      ]
    },
    "setup-agents:handoff:create": {
      "aliases": [],
      "args": {},
      "description": "Appends a JSON Lines handoff entry to `.setup-agents/state/handoffs.jsonl`.\n\nHandoff records capture role-to-role transfer summaries, ownership, task ids, changed files, risks, and next actions.",
      "examples": [
        "Create a handoff from developer to QA:\n<%= config.bin %> <%= command.id %> --task SA-96 --from developer --to qa --files \"src/foo.ts,test/foo.test.ts\" --summary \"Commands implemented and ready for verification\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe the handoff in one concise sentence.",
          "name": "summary",
          "required": true,
          "summary": "Short handoff summary.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Associate the handoff with a task id such as `SA-96` or `#96`.",
          "name": "task",
          "summary": "Task or issue id for this handoff.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Record the current role or agent owner responsible for this handoff record.",
          "name": "role",
          "summary": "Owning role for this handoff.",
          "default": "developer",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile responsible for this handoff record.",
          "name": "profile",
          "summary": "Owning setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "from": {
          "description": "Record who is handing off the work.",
          "name": "from",
          "required": true,
          "summary": "Source role or profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "to": {
          "description": "Record who should receive the handoff.",
          "name": "to",
          "required": true,
          "summary": "Target role or profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "files": {
          "description": "Comma-separated list of files relevant to the handoff.",
          "name": "files",
          "summary": "Changed files.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "changed-file": {
          "description": "Alias for `--files`.",
          "name": "changed-file",
          "summary": "Changed file paths.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "risks": {
          "description": "Record known risks, gaps, or review concerns.",
          "name": "risks",
          "summary": "Known risks.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "risk": {
          "description": "Alias for `--risks`.",
          "name": "risk",
          "summary": "Known risks.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "next-actions": {
          "description": "Record concise next actions for the receiving role.",
          "name": "next-actions",
          "summary": "Next actions.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "next-action": {
          "description": "Alias for `--next-actions`.",
          "name": "next-action",
          "summary": "Next actions.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids that support this handoff.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "acceptance": {
          "description": "Quoted, comma-separated acceptance criteria. Text containing commas should be wrapped in quotes, e.g. `\"Given X, when Y\" , \"Then Z\"`.",
          "name": "acceptance",
          "summary": "Acceptance criteria for the receiving role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "capability-signals": {
          "description": "Comma-separated signals the next sub-agent should use to activate runtime capabilities,\nfor example `qa evidence,acceptance criteria coverage,release evidence`.",
          "name": "capability-signals",
          "summary": "Runtime capability signals for the receiving role.",
          "hasDynamicHelp": false,
          "helpValue": "qa evidence,release evidence",
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:handoff:create",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Create a setup-agents handoff record.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "handoff",
        "create.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:handoff:create",
        "handoff:setup-agents:create",
        "handoff:create:setup-agents",
        "setup-agents:create:handoff",
        "create:setup-agents:handoff",
        "create:handoff:setup-agents"
      ]
    },
    "setup-agents:handoff:list": {
      "aliases": [],
      "args": {},
      "description": "Reads JSON Lines handoff entries from `.setup-agents/state/handoffs.jsonl`.",
      "examples": [
        "List recent handoffs:\n<%= config.bin %> <%= command.id %>",
        "List handoffs for a task:\n<%= config.bin %> <%= command.id %> --task SA-96"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Show only handoff records associated with the given task id.",
          "name": "task",
          "summary": "Filter by task or issue id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Show only handoff records owned by the given role.",
          "name": "role",
          "summary": "Filter by owning role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Show only handoff records owned by the given setup-agents profile.",
          "name": "profile",
          "summary": "Filter by owning setup-agents profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "from": {
          "description": "Show only handoffs from the given role or profile.",
          "name": "from",
          "summary": "Filter by source role or profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "to": {
          "description": "Show only handoffs to the given role or profile.",
          "name": "to",
          "summary": "Filter by target role or profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "limit": {
          "char": "l",
          "description": "Limit the number of matching records returned from the end of the handoff log.",
          "name": "limit",
          "summary": "Maximum records to show.",
          "default": 20,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:handoff:list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List setup-agents handoff records.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "handoff",
        "list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:handoff:list",
        "handoff:setup-agents:list",
        "handoff:list:setup-agents",
        "setup-agents:list:handoff",
        "list:setup-agents:handoff",
        "list:handoff:setup-agents"
      ]
    },
    "setup-agents:knowledge:refresh": {
      "aliases": [],
      "args": {},
      "description": "Builds the metadata index, class catalog, documentation index, managed project-knowledge evidence, and knowledge manifest from every configured Salesforce package directory.",
      "examples": [
        "Refresh all configured source roots:\n<%= config.bin %> <%= command.id %> --full",
        "Check freshness without writing files:\n<%= config.bin %> <%= command.id %> --check --json",
        "Refresh explicitly scoped roots with reproducible provenance:\n<%= config.bin %> <%= command.id %> --source-dir force-app --source-dir packages/core --refresh-timestamp 2026-08-07T00:00:00.000Z"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "check": {
          "name": "check",
          "summary": "Check freshness and readiness without writing files.",
          "allowNo": false,
          "type": "boolean"
        },
        "full": {
          "name": "full",
          "summary": "Force a complete deterministic repository scan.",
          "allowNo": false,
          "type": "boolean"
        },
        "source-dir": {
          "name": "source-dir",
          "summary": "Source root to scan; repeat for multiple roots. Defaults to all sfdx packageDirectories.",
          "hasDynamicHelp": false,
          "multiple": true,
          "type": "option"
        },
        "refresh-timestamp": {
          "name": "refresh-timestamp",
          "summary": "Explicit ISO timestamp to include in generated provenance.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:knowledge:refresh",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Refresh repository knowledge artifacts.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "knowledge",
        "refresh.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:knowledge:refresh",
        "knowledge:setup-agents:refresh",
        "knowledge:refresh:setup-agents",
        "setup-agents:refresh:knowledge",
        "refresh:setup-agents:knowledge",
        "refresh:knowledge:setup-agents"
      ]
    },
    "setup-agents:offline:guide": {
      "aliases": [],
      "args": {},
      "description": "Provides step-by-step recovery guidance, relevant references, and suggested commands for the specified task. Works without any LLM or network access.",
      "examples": [
        "Show guide for task TASK-1:\n<%= config.bin %> <%= command.id %> --task TASK-1",
        "Show guide as JSON:\n<%= config.bin %> <%= command.id %> --task TASK-1 --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "name": "task",
          "required": true,
          "summary": "Task ID to generate guide for.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:offline:guide",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Show deterministic offline guide for a specific task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "offline",
        "guide.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:offline:guide",
        "offline:setup-agents:guide",
        "offline:guide:setup-agents",
        "setup-agents:guide:offline",
        "guide:setup-agents:offline",
        "guide:offline:setup-agents"
      ]
    },
    "setup-agents:offline:status": {
      "aliases": [],
      "args": {},
      "description": "Summarizes active task, workflow phase, evidence gaps, local references, configured profiles, runtime executability, and suggested next commands. Local LLM checks use a bounded HTTP models probe; all other diagnostics work without optional runtimes or network access.",
      "examples": [
        "Show offline status:\n<%= config.bin %> <%= command.id %>",
        "Show offline status as JSON:\n<%= config.bin %> <%= command.id %> --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:offline:status",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Show offline recovery status for the current workspace.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "offline",
        "status.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:offline:status",
        "offline:setup-agents:status",
        "offline:status:setup-agents",
        "setup-agents:status:offline",
        "status:setup-agents:offline",
        "status:offline:setup-agents"
      ]
    },
    "setup-agents:profile:audit-api-names": {
      "aliases": [],
      "args": {},
      "description": "Scans generated and hand-authored guidance files (.md, .mdc, .txt) for Automotive, Commerce,\nNonprofit, and Education Cloud API-context object/field examples that are invalid aliases of a\ngoverned standard object or that reference an unrecognized name in a governed context. Also\nreports, per governed product, whether the current-model, legacy-package, or parallel data model\nwas detected from the project's metadata.",
      "examples": [
        "Audit the current directory for invalid or unclassified governed API name examples:\n<%= config.bin %> <%= command.id %>",
        "Audit a specific directory and emit machine-readable JSON:\n<%= config.bin %> <%= command.id %> --target-dir docs --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "name": "target-dir",
          "summary": "Directory to audit. Defaults to the current working directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:profile:audit-api-names",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Audit governed Salesforce API examples in guidance files.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "profile",
        "audit-api-names.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:profile:audit-api-names",
        "profile:setup-agents:audit-api-names",
        "profile:audit-api-names:setup-agents",
        "setup-agents:audit-api-names:profile",
        "audit-api-names:setup-agents:profile",
        "audit-api-names:profile:setup-agents"
      ]
    },
    "setup-agents:release-notes:collect": {
      "aliases": [],
      "args": {},
      "description": "Uses a bounded Playwright browser session to inspect the rendered Salesforce Help table of contents. Optionally observes page-generated Aura responses for authoritative article metadata without replaying or hard-coding dynamic Aura context.",
      "examples": [
        "Collect the Release 264 inventory:\n<%= config.bin %> <%= command.id %> --release 264 --json",
        "Retrieve authoritative metadata for selected articles:\n<%= config.bin %> <%= command.id %> --release 264 --content --article rn_apex_symbol_api --output release-264.json",
        "Compare a refresh with a prior baseline and emit explicit deltas and a review queue:\n<%= config.bin %> <%= command.id %> --release 264 --content --baseline release-264-baseline.json --output release-264-refresh.json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "release": {
          "char": "r",
          "name": "release",
          "required": true,
          "summary": "Three-digit Salesforce release number.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "content": {
          "name": "content",
          "summary": "Retrieve authoritative content metadata and hashes through observed Aura responses.",
          "allowNo": false,
          "type": "boolean"
        },
        "article": {
          "name": "article",
          "summary": "Article ID to retrieve; repeat to select multiple articles. Defaults to all articles with --content.",
          "hasDynamicHelp": false,
          "multiple": true,
          "type": "option"
        },
        "concurrency": {
          "name": "concurrency",
          "summary": "Maximum simultaneous article browser sessions (1-8).",
          "default": 3,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "timeout": {
          "name": "timeout",
          "summary": "Per-page timeout in milliseconds (1000-120000).",
          "default": 45000,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "output": {
          "name": "output",
          "summary": "Write the JSON result to this path.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "baseline": {
          "name": "baseline",
          "summary": "Compare inventory IDs and count, content hashes, and lifecycle classifications against this prior collector JSON. Failed retrievals retain prior high-confidence evidence and enter the review queue.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:release-notes:collect",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Collect a Salesforce release-note inventory.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "release-notes",
        "collect.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:release-notes:collect",
        "release-notes:setup-agents:collect",
        "release-notes:collect:setup-agents",
        "setup-agents:collect:release-notes",
        "collect:setup-agents:release-notes",
        "collect:release-notes:setup-agents"
      ]
    },
    "setup-agents:report:generate": {
      "aliases": [],
      "args": {},
      "description": "Reads an AgentReportData JSON document and renders it with the plugin's deterministic report renderer. Use this instead of hand-rolling a one-off report script. The AgentReportData shape is: `{ title, generatedAt, taskId?, author?, sections: [{ title, findings?, metrics?, recommendations?, prose? }] }`. Output goes to a file with `--out`, or to stdout when `--out` is omitted.",
      "examples": [
        "`sf setup-agents report generate --input data.json --format markdown`",
        "`sf setup-agents report generate --input data.json --format html --out report.html`",
        "`sf setup-agents report generate -i data.json -f html -o docs/report.html`"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "input": {
          "char": "i",
          "name": "input",
          "required": true,
          "summary": "Path to an AgentReportData JSON file.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "format": {
          "char": "f",
          "name": "format",
          "summary": "Output format: html or markdown.",
          "default": "markdown",
          "hasDynamicHelp": false,
          "helpValue": "html|markdown",
          "multiple": false,
          "options": [
            "html",
            "markdown"
          ],
          "type": "option"
        },
        "out": {
          "char": "o",
          "name": "out",
          "summary": "Path to write the rendered output. When omitted, the result is printed to stdout.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:report:generate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Render structured AgentReportData JSON to an HTML or Markdown report.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "report",
        "generate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:report:generate",
        "report:setup-agents:generate",
        "report:generate:setup-agents",
        "setup-agents:generate:report",
        "generate:setup-agents:report",
        "generate:report:setup-agents"
      ]
    },
    "setup-agents:review:complete": {
      "aliases": [],
      "args": {},
      "description": "Appends an updated JSON Lines review entry to `.setup-agents/state/reviews.jsonl` with the final result.\n\nThe result must be `approved`, `blocked`, or `changes`.",
      "examples": [
        "Approve a review:\n<%= config.bin %> <%= command.id %> --id setup-agents-review-1234567-abc123 --result approved --reviewer qa --findings \"All acceptance criteria met\"",
        "Block a review with changes needed:\n<%= config.bin %> <%= command.id %> --id setup-agents-review-1234567-abc123 --result changes --reviewer security --findings \"Missing input validation\" --recommendation \"Add gate check before status update\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "The id of the review record to complete.",
          "name": "id",
          "required": true,
          "summary": "Review record id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "result": {
          "description": "Final result of the review: `approved`, `blocked`, or `changes`.",
          "name": "result",
          "required": true,
          "summary": "Review outcome.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "approved",
            "blocked",
            "changes"
          ],
          "type": "option"
        },
        "reviewer": {
          "description": "The setup-agents profile acting as reviewer, stored as `setup-agents:<profile>`.",
          "name": "reviewer",
          "summary": "Profile completing the review.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "findings": {
          "description": "Summarize what was found during the review.",
          "name": "findings",
          "summary": "Review findings.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "recommendation": {
          "description": "Describe the recommended next action after this review.",
          "name": "recommendation",
          "summary": "Review recommendation.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "return-to": {
          "description": "When the result is `blocked` or `changes`, specify which phase the correction should be routed to. On next `workflow run --resume`, the workflow will return to this phase automatically.",
          "name": "return-to",
          "summary": "Target phase for correction routing.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:review:complete",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Complete a setup-agents review.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "review",
        "complete.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:review:complete",
        "review:setup-agents:complete",
        "review:complete:setup-agents",
        "setup-agents:complete:review",
        "complete:setup-agents:review",
        "complete:review:setup-agents"
      ]
    },
    "setup-agents:review:list": {
      "aliases": [],
      "args": {},
      "description": "Reads JSON Lines review entries from `.setup-agents/state/reviews.jsonl`.",
      "examples": [
        "List pending reviews:\n<%= config.bin %> <%= command.id %> --status pending",
        "List reviews for a task:\n<%= config.bin %> <%= command.id %> --task SA-98"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "status": {
          "description": "Show only reviews with the given status: `pending`, `approved`, `blocked`, or `changes`.",
          "name": "status",
          "summary": "Filter by review status.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pending",
            "approved",
            "blocked",
            "changes"
          ],
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Show only review records associated with the given task id.",
          "name": "task",
          "summary": "Filter by task or issue id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "limit": {
          "char": "l",
          "description": "Limit the number of matching records returned from the end of the review log.",
          "name": "limit",
          "summary": "Maximum records to show.",
          "default": 20,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:review:list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List setup-agents review records.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "review",
        "list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:review:list",
        "review:setup-agents:list",
        "review:list:setup-agents",
        "setup-agents:list:review",
        "list:setup-agents:review",
        "list:review:setup-agents"
      ]
    },
    "setup-agents:review:request": {
      "aliases": [],
      "args": {},
      "description": "Appends a JSON Lines review entry to `.setup-agents/state/reviews.jsonl` with status `pending`.\n\nReview records capture the requester, optional reviewer, gates, task ids, and related evidence ids.",
      "examples": [
        "Request a security review for a task:\n<%= config.bin %> <%= command.id %> --task SA-98 --requester developer --reviewer security --gate readiness --summary \"Review gate: native review commands implementation\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe what is being reviewed in one concise sentence.",
          "name": "summary",
          "required": true,
          "summary": "Short review summary.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Associate the review with a task id such as `SA-98` or `#98`.",
          "name": "task",
          "summary": "Task or issue id for this review.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "requester": {
          "description": "The setup-agents profile that is requesting the review, stored as `setup-agents:<profile>`.",
          "name": "requester",
          "summary": "Profile requesting the review.",
          "default": "developer",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "reviewer": {
          "description": "Optionally assign a specific setup-agents profile as reviewer.",
          "name": "reviewer",
          "summary": "Profile assigned to review.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "gate": {
          "description": "Comma-separated gate names required for this review, such as `readiness,security`.",
          "name": "gate",
          "summary": "Gate or quality check names.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids that support this review.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:review:request",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Request a setup-agents review.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "review",
        "request.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:review:request",
        "review:setup-agents:request",
        "review:request:setup-agents",
        "setup-agents:request:review",
        "request:setup-agents:review",
        "request:review:setup-agents"
      ]
    },
    "setup-agents:rules:inject": {
      "aliases": [],
      "args": {},
      "description": "Reads rules from the neutral registry (`.setup-agents/rules/`), renders them for the specified target runtime, and writes to the correct location. Use `--dry-run` to preview without writing.",
      "examples": [
        "Inject all rules for Claude:\n<%= config.bin %> <%= command.id %> --target claude",
        "Inject rules for a specific profile:\n<%= config.bin %> <%= command.id %> --target cursor --profile developer",
        "Preview injection of a single rule:\n<%= config.bin %> <%= command.id %> --target codex --rule my-rule --dry-run"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target": {
          "char": "t",
          "description": "The target AI coding assistant runtime. Determines output format and destination path.",
          "name": "target",
          "required": true,
          "summary": "Target runtime to inject rules for.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "claude",
            "cursor",
            "codex",
            "vscode",
            "windsurf",
            "opencode"
          ],
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Only inject rules that apply to the specified profile. Omit to inject all rules.",
          "name": "profile",
          "summary": "Filter rules by profile ID.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "rule": {
          "char": "r",
          "description": "Only inject the rule with the given ID. Omit to inject all matching rules.",
          "name": "rule",
          "summary": "Inject a specific rule by ID.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "description": "Show which files would be written and their content, but do not actually write anything.",
          "name": "dry-run",
          "summary": "Preview changes without writing files.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:rules:inject",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Inject neutral rules into runtime-specific locations.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "rules",
        "inject.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:rules:inject",
        "rules:setup-agents:inject",
        "rules:inject:setup-agents",
        "setup-agents:inject:rules",
        "inject:setup-agents:rules",
        "inject:rules:setup-agents"
      ]
    },
    "setup-agents:task:archive": {
      "aliases": [],
      "args": {},
      "description": "Marks a task as archived in `.setup-agents/state/tasks.jsonl`. Archived tasks are hidden from `task list` output unless `--status archived` is specified. Unlike delete, archive preserves the task record for audit purposes.",
      "examples": [
        "Archive a task:\n<%= config.bin %> <%= command.id %> --task SA-97"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:archive",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Archive a setup-agents task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "archive.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:archive",
        "task:setup-agents:archive",
        "task:archive:setup-agents",
        "setup-agents:archive:task",
        "archive:setup-agents:task",
        "archive:task:setup-agents"
      ]
    },
    "setup-agents:task:claim": {
      "aliases": [],
      "args": {},
      "description": "Appends a claimed task state entry to `.setup-agents/state/tasks.jsonl`.",
      "examples": [
        "Claim a task as the developer profile:\n<%= config.bin %> <%= command.id %> --task SA-97 --profile developer"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Alias for a setup-agents profile owner such as `developer`, stored as `setup-agents:developer`.",
          "name": "role",
          "summary": "Claiming role.",
          "default": "developer",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile claiming this task.",
          "name": "profile",
          "summary": "Claiming setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids to attach while claiming.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:claim",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Claim a setup-agents task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "claim.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:claim",
        "task:setup-agents:claim",
        "task:claim:setup-agents",
        "setup-agents:claim:task",
        "claim:setup-agents:task",
        "claim:task:setup-agents"
      ]
    },
    "setup-agents:task:create": {
      "aliases": [],
      "args": {},
      "description": "Appends a JSON Lines task entry to `.setup-agents/state/tasks.jsonl`.\n\nTask records capture id, summary, status, setup-agents profile owner, timestamps, and related evidence ids.",
      "examples": [
        "Create an unclaimed task:\n<%= config.bin %> <%= command.id %> --summary \"Implement task CLI\"",
        "Create a task owned by a profile:\n<%= config.bin %> <%= command.id %> --id SA-97 --profile developer --summary \"Implement task CLI\"",
        "Create an advisory task:\n<%= config.bin %> <%= command.id %> --mode advisory --summary \"Compare implementation options\"",
        "Create a task with required and optional roles:\n<%= config.bin %> <%= command.id %> --summary \"Build login page\" --required-roles \"ux,developer\" --optional-roles \"security\"",
        "Create a task with declared phases:\n<%= config.bin %> <%= command.id %> --summary \"Quick fix\" --declared-phases \"developer,qa\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe the task in one concise sentence.",
          "name": "summary",
          "required": true,
          "summary": "Short task summary.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Alias for a setup-agents profile owner such as `developer`, stored as `setup-agents:developer`.",
          "name": "role",
          "summary": "Owning role for this task.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile responsible for this task.",
          "name": "profile",
          "summary": "Owning setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "mode": {
          "description": "Record whether this task belongs to project or advisory orchestration mode.",
          "name": "mode",
          "summary": "Workspace mode for the task.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "project",
            "advisory"
          ],
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids that support this task.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "required-roles": {
          "description": "Comma-separated profile/phase ids that must participate in the workflow for this task. Determines which phases are included in the phase sequence.",
          "name": "required-roles",
          "summary": "Required roles for this task.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "optional-roles": {
          "description": "Comma-separated profile/phase ids that may participate in the workflow. These phases are included but not strictly required for task completion.",
          "name": "optional-roles",
          "summary": "Optional roles for this task.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "declared-phases": {
          "description": "Comma-separated phase ids to include in the workflow for this task. Phases listed here are added to the plan alongside always-included phases. Use this instead of roles when you want to control the exact phase sequence.",
          "name": "declared-phases",
          "summary": "Phases to include in this task's workflow.",
          "hasDynamicHelp": false,
          "helpValue": "pm|ba|architect|ux|developer|security-review|qa|document-review|release",
          "multiple": false,
          "type": "option"
        },
        "routing-override-rationale": {
          "name": "routing-override-rationale",
          "summary": "Reason for overriding deterministic profile inference.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:create",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Create a setup-agents task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "create.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:create",
        "task:setup-agents:create",
        "task:create:setup-agents",
        "setup-agents:create:task",
        "create:setup-agents:task",
        "create:task:setup-agents"
      ]
    },
    "setup-agents:task:delete": {
      "aliases": [],
      "args": {},
      "description": "Marks a task as deleted in `.setup-agents/state/tasks.jsonl`. Deleted tasks are hidden from `task list` output unless `--status deleted` is specified.",
      "examples": [
        "Delete a task interactively:\n<%= config.bin %> <%= command.id %> --task SA-97",
        "Delete without confirmation:\n<%= config.bin %> <%= command.id %> --task SA-97 --yes"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "yes": {
          "char": "y",
          "description": "Delete without prompting for confirmation (useful in scripts and non-interactive environments).",
          "name": "yes",
          "summary": "Skip confirmation prompt.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:delete",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Delete a setup-agents task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "delete.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:delete",
        "task:setup-agents:delete",
        "task:delete:setup-agents",
        "setup-agents:delete:task",
        "delete:setup-agents:task",
        "delete:task:setup-agents"
      ]
    },
    "setup-agents:task:done": {
      "aliases": [],
      "args": {},
      "description": "Appends a completed task state entry to `.setup-agents/state/tasks.jsonl`.",
      "examples": [
        "Mark a task done with evidence:\n<%= config.bin %> <%= command.id %> --task SA-97 --evidence setup-agents-evidence-1"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Alias for a setup-agents profile owner such as `developer`, stored as `setup-agents:developer`.",
          "name": "role",
          "summary": "Completing role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Record the setup-agents profile completing this task.",
          "name": "profile",
          "summary": "Completing setup-agents profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence record ids to attach while completing the task.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "push-to": {
          "name": "push-to",
          "summary": "Push task completion to GitHub Issue or Jira ticket.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "github",
            "jira"
          ],
          "type": "option"
        },
        "dry-run": {
          "name": "dry-run",
          "summary": "Print the write-back payload without sending.",
          "allowNo": false,
          "type": "boolean"
        },
        "ticket": {
          "name": "ticket",
          "summary": "GitHub issue number or Jira ticket ID to comment on.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "risk-accept": {
          "description": "Explicit rationale for overriding reconciliation blockers. The rationale and finding codes are appended to task history for audit. This does not create gate approvals.",
          "name": "risk-accept",
          "summary": "Accept lifecycle risk and complete the task.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:done",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Mark a setup-agents task done.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "done.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:done",
        "task:setup-agents:done",
        "task:done:setup-agents",
        "setup-agents:done:task",
        "done:setup-agents:task",
        "done:task:setup-agents"
      ]
    },
    "setup-agents:task:list": {
      "aliases": [],
      "args": {},
      "description": "Reads latest task state from `.setup-agents/state/tasks.jsonl`.",
      "examples": [
        "List recent tasks:\n<%= config.bin %> <%= command.id %>",
        "List claimed tasks for a profile:\n<%= config.bin %> <%= command.id %> --status claimed --profile developer",
        "List advisory tasks:\n<%= config.bin %> <%= command.id %> --mode advisory"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "status": {
          "description": "Show only tasks with status `open`, `claimed`, or `done`.",
          "name": "status",
          "summary": "Filter by task status.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "open",
            "claimed",
            "done"
          ],
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Show only tasks owned by the given role, stored as a setup-agents profile owner.",
          "name": "role",
          "summary": "Filter by owning role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Show only tasks owned by the given setup-agents profile.",
          "name": "profile",
          "summary": "Filter by owning setup-agents profile.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "mode": {
          "description": "Show only tasks recorded for project or advisory orchestration mode.",
          "name": "mode",
          "summary": "Filter by workspace mode.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "project",
            "advisory"
          ],
          "type": "option"
        },
        "limit": {
          "char": "l",
          "description": "Limit the number of matching tasks returned from the end of the task list.",
          "name": "limit",
          "summary": "Maximum tasks to show.",
          "default": 20,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List setup-agents tasks.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:list",
        "task:setup-agents:list",
        "task:list:setup-agents",
        "setup-agents:list:task",
        "list:setup-agents:task",
        "list:task:setup-agents"
      ]
    },
    "setup-agents:task:update": {
      "aliases": [],
      "args": {},
      "description": "Patches an existing task record in `.setup-agents/state/tasks.jsonl`. Use `--status` to transition the task to any valid state (open, claimed, done, cancelled, blocked, archived). Without `--status`, only metadata fields are patched.",
      "examples": [
        "Update a task summary:\n<%= config.bin %> <%= command.id %> --task SA-97 --summary \"Revised scope\"",
        "Cancel a task that failed:\n<%= config.bin %> <%= command.id %> --task SA-97 --status cancelled --reason \"Agent crashed with resource_exhausted\"",
        "Block a task pending external input:\n<%= config.bin %> <%= command.id %> --task SA-97 --status blocked --reason \"Waiting on PO acceptance criteria\"",
        "Reassign a task:\n<%= config.bin %> <%= command.id %> --task SA-97 --profile developer",
        "Transition using --id alias:\n<%= config.bin %> <%= command.id %> --id SA-97 --status done"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "status": {
          "description": "Set the task status to open, claimed, done, cancelled, blocked, or archived. Use --reason to provide context for cancelled or blocked transitions.",
          "name": "status",
          "summary": "Transition the task to this status.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "open",
            "claimed",
            "done",
            "cancelled",
            "blocked",
            "archived"
          ],
          "type": "option"
        },
        "reason": {
          "description": "Free-text explanation for why the task was cancelled or blocked. Recorded in the JSONL event.",
          "name": "reason",
          "summary": "Reason for the status transition.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Replace the task summary with this text.",
          "name": "summary",
          "summary": "New summary text.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "role": {
          "char": "r",
          "description": "Alias for a setup-agents profile owner.",
          "name": "role",
          "summary": "New owner role.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profile": {
          "char": "p",
          "description": "Replace the task owner with this setup-agents profile.",
          "name": "profile",
          "summary": "New owner profile.",
          "hasDynamicHelp": false,
          "helpValue": "developer|architect|sa|pm|mulesoft|ux|cgcloud|qa|crma|commerce|data360|sfmc|salescloud|service|cpq|omnistudio|fsl|ai|slack|tableau|experience-cloud|release-manager|fsc|health|manufacturing|communications|automotive|education|netzero|nonprofit|public-sector|media|energy|revenue|maps|loyalty|industries",
          "multiple": false,
          "type": "option"
        },
        "evidence": {
          "description": "Comma-separated evidence ids to attach to the task.",
          "name": "evidence",
          "summary": "Related evidence ids.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:update",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Update a setup-agents task (metadata or status).",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "update.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:update",
        "task:setup-agents:update",
        "task:update:setup-agents",
        "setup-agents:update:task",
        "update:setup-agents:task",
        "update:task:setup-agents"
      ]
    },
    "setup-agents:task:view": {
      "aliases": [],
      "args": {},
      "description": "Reads the latest state for a task from `.setup-agents/state/tasks.jsonl`.",
      "examples": [
        "View a task:\n<%= config.bin %> <%= command.id %> --task SA-97"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "char": "t",
          "description": "Id of the task. Alias: --id.",
          "name": "task",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "id": {
          "description": "Id of the task. Alias: --task.",
          "name": "id",
          "summary": "Task id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:task:view",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "View a setup-agents task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "task",
        "view.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:task:view",
        "task:setup-agents:view",
        "task:view:setup-agents",
        "setup-agents:view:task",
        "view:setup-agents:task",
        "view:task:setup-agents"
      ]
    },
    "setup-agents:workflow:benchmark": {
      "aliases": [],
      "args": {},
      "description": "Joins declared estimates (from `sf setup-agents workflow estimate`) with\ncompleted workflow run records to compute actual cycle time, savings percentage\nvs. solo delivery, and savings percentage vs. unguided AI delivery.\n\nActual cycle time is derived automatically from the run's phase timestamps —\nno manual input required after the estimate is declared.",
      "examples": [
        "Benchmark a single completed story:\n<%= config.bin %> <%= command.id %> --story US-42",
        "Summary table of all stories:\n<%= config.bin %> <%= command.id %> --summary"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "Single story report. Prints sizing, estimates, actual days, savings percentages,\nQA iterations, and evidence count.",
          "name": "story",
          "summary": "Story id to benchmark.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "description": "Prints a sorted table of every story that has a declared estimate, with aggregate\naverages at the bottom. Stories without a completed run show status `pending`.",
          "name": "summary",
          "summary": "Print summary table for all stories with estimates.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:benchmark",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Compute actual delivery time vs. declared estimates for completed workflow runs.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "benchmark.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:benchmark",
        "workflow:setup-agents:benchmark",
        "workflow:benchmark:setup-agents",
        "setup-agents:benchmark:workflow",
        "benchmark:setup-agents:workflow",
        "benchmark:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:clarify-list": {
      "aliases": [],
      "args": {},
      "description": "Reads `.setup-agents/state/clarifications.jsonl` and lists all clarification records for the given run id, showing both open and answered entries.",
      "examples": [
        "List all clarifications for a run:\n<%= config.bin %> <%= command.id %> --run wf-123",
        "List clarifications as JSON:\n<%= config.bin %> <%= command.id %> --run wf-123 --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "run": {
          "description": "The id of the workflow run whose clarifications should be listed.",
          "name": "run",
          "required": true,
          "summary": "Workflow run id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:clarify-list",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List clarifications for a workflow run.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "clarify-list.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:clarify-list",
        "workflow:setup-agents:clarify-list",
        "workflow:clarify-list:setup-agents",
        "setup-agents:clarify-list:workflow",
        "clarify-list:setup-agents:workflow",
        "clarify-list:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:clarify-respond": {
      "aliases": [],
      "args": {},
      "description": "Appends an answered clarification entry to `.setup-agents/state/clarifications.jsonl` and transitions the phase status from `awaiting_clarification` back to `running` in `.setup-agents/state/workflow-runs.jsonl`.\n\nAfter responding, use `setup-agents workflow run --resume <runId>` to continue execution from the suspended phase.",
      "examples": [
        "Respond to an open clarification:\n<%= config.bin %> <%= command.id %> --run wf-123 --clarification sa-clarification-456 --answer \"Use Queueable — it supports chaining and avoids heap limits.\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "run": {
          "description": "The id of the workflow run that contains the suspended phase.",
          "name": "run",
          "required": true,
          "summary": "Workflow run id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "clarification": {
          "description": "The id of the clarification record to answer.",
          "name": "clarification",
          "required": true,
          "summary": "Clarification id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "answer": {
          "description": "The response to the clarification question.",
          "name": "answer",
          "required": true,
          "summary": "Answer text.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:clarify-respond",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Record an answer to an open clarification and resume the suspended phase.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "clarify-respond.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:clarify-respond",
        "workflow:setup-agents:clarify-respond",
        "workflow:clarify-respond:setup-agents",
        "setup-agents:clarify-respond:workflow",
        "clarify-respond:setup-agents:workflow",
        "clarify-respond:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:clarify": {
      "aliases": [],
      "args": {},
      "description": "Suspends the active developer or qa phase with status `awaiting_clarification` and records a clarification question directed to a PO or architect.\n\nAppends a JSON Lines clarification entry to `.setup-agents/state/clarifications.jsonl` and updates the workflow run record in `.setup-agents/state/workflow-runs.jsonl`.\n\nUse `setup-agents workflow clarify-respond` to record the answer and resume the phase.",
      "examples": [
        "Open a clarification from developer to architect:\n<%= config.bin %> <%= command.id %> --run wf-123 --from developer --to architect --question \"Should we use batch or queueable for this async job?\"",
        "Open a clarification from qa to po:\n<%= config.bin %> <%= command.id %> --run wf-123 --from qa --to po --question \"Is field X required in the acceptance criteria?\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "run": {
          "description": "The id of the active workflow run containing the phase to suspend.",
          "name": "run",
          "required": true,
          "summary": "Workflow run id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "from": {
          "description": "The phase role requesting clarification. Must be `developer` or `qa`.",
          "name": "from",
          "required": true,
          "summary": "Role opening the clarification.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "developer",
            "qa"
          ],
          "type": "option"
        },
        "to": {
          "description": "The role that should answer the clarification. Use `po` for Product Owner or `architect` for Architect.",
          "name": "to",
          "required": true,
          "summary": "Role receiving the clarification.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "po",
            "ta"
          ],
          "type": "option"
        },
        "question": {
          "description": "The question to be answered before the phase can continue.",
          "name": "question",
          "required": true,
          "summary": "Clarification question text.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:clarify",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Open a clarification question from a developer or qa phase.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "clarify.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:clarify",
        "workflow:setup-agents:clarify",
        "workflow:clarify:setup-agents",
        "setup-agents:clarify:workflow",
        "clarify:setup-agents:workflow",
        "clarify:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:decompose": {
      "aliases": [],
      "args": {},
      "description": "BA and Architect independently assess whether a task is too large for a single sprint.\nBoth must vote before consensus is reached. If either votes `decompose`, the task is\nescalated to an epic and the workflow pauses for sub-story creation.\n\nConsensus rules:\n\n- Both vote `proceed` → task continues as a story\n- Either votes `decompose` → task becomes an epic, workflow pauses\n\nUse `sf setup-agents task create --parent-id <epic-id>` to create subtasks after decomposition.",
      "examples": [
        "BA votes to decompose a task:\n<%= config.bin %> <%= command.id %> --story sa-241 --voter ba --verdict decompose --reason \"12 acceptance criteria spanning 3 user journeys\" --splits \"User registration flow\" --splits \"Admin approval flow\" --splits \"Notification integration\"",
        "Architect votes to proceed:\n<%= config.bin %> <%= command.id %> --story sa-241 --voter architect --verdict proceed --reason \"Single bounded context, well-isolated from existing modules\"",
        "Architect votes to decompose (escalates to epic):\n<%= config.bin %> <%= command.id %> --story sa-241 --voter architect --verdict decompose --reason \"Requires 3 new integrations and a schema migration\" --splits \"Schema migration\" --splits \"External API integration\" --splits \"UI updates\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "t",
          "description": "The task id that BA and Architect are evaluating for decomposition, e.g. `sa-241`.",
          "name": "story",
          "required": true,
          "summary": "Task or story id to vote on.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "voter": {
          "description": "Must be `ba` (functional complexity) or `architect` (technical complexity). Each role votes once.",
          "name": "voter",
          "required": true,
          "summary": "Role casting the vote.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "ba",
            "ta"
          ],
          "type": "option"
        },
        "verdict": {
          "description": "`proceed` if the task fits in a single sprint, or `decompose` if it should be split into sub-stories.",
          "name": "verdict",
          "required": true,
          "summary": "Decomposition verdict.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "proceed",
            "decompose"
          ],
          "type": "option"
        },
        "reason": {
          "description": "Explain why the task should proceed or be decomposed. BA focuses on functional scope (acceptance criteria count, journey complexity). Architect focuses on technical scope (coupling, unknowns, integration surface).",
          "name": "reason",
          "required": true,
          "summary": "Reason for the verdict.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "splits": {
          "description": "When voting `decompose`, provide suggested sub-story summaries. Repeat the flag for multiple splits.",
          "name": "splits",
          "summary": "Suggested sub-story titles.",
          "hasDynamicHelp": false,
          "multiple": true,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:decompose",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Record a decomposition vote for a task.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "decompose.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:decompose",
        "workflow:setup-agents:decompose",
        "workflow:decompose:setup-agents",
        "setup-agents:decompose:workflow",
        "decompose:setup-agents:workflow",
        "decompose:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:estimate": {
      "aliases": [],
      "args": {},
      "description": "Appends an estimate record to `.setup-agents/state/estimates.jsonl` with the\ndeclared solo, AI-unguided, and sizing baselines. Once the workflow run\ncompletes, `sf setup-agents workflow benchmark` uses these values to compute\nactual vs. baseline delta automatically.",
      "examples": [
        "Record a medium-sized story baseline before starting the workflow:\n<%= config.bin %> <%= command.id %> --story US-42 --sizing m --solo-days 3 --ai-unguided-days 2",
        "Record with explicit confidence and declarer:\n<%= config.bin %> <%= command.id %> --story US-42 --sizing l --solo-days 5 --ai-unguided-days 3 --confidence high --declared-by architect"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "The story id used in `sf setup-agents workflow run --story <id>` (e.g. `US-42`).",
          "name": "story",
          "required": true,
          "summary": "Story or backlog item id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "sizing": {
          "description": "T-shirt size in human-effort days: `xxs` (<4h) `xs` (4-8h) `s` (1-2d) `m` (3-5d) `l` (6-8d) `xl` (9-11d) `xxl` (12+d). `xxl` is a split gate — it cannot be estimated; break the story down first.",
          "name": "sizing",
          "required": true,
          "summary": "Story size label.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "xxs",
            "xs",
            "s",
            "m",
            "l",
            "xl",
            "xxl"
          ],
          "type": "option"
        },
        "solo-days": {
          "description": "Baseline without any AI assistance. Used as the denominator for `vsSoloPct` in\nthe benchmark report.",
          "name": "solo-days",
          "required": true,
          "summary": "Estimated days a developer would take working alone.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "ai-unguided-days": {
          "description": "Baseline with a plain AI assistant but without setup-agents orchestration. Used\nas the denominator for `vsAiUnguidedPct` — the signal that measures the specific\nvalue added by the workflow engine.",
          "name": "ai-unguided-days",
          "required": true,
          "summary": "Estimated days with unguided AI (no orchestration).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "ai-guided-days": {
          "description": "Optional. Predicted delivery time when using setup-agents with profiles and\norchestration. Used as the denominator for `vsAiGuidedPct` — the ROI signal\nthat shows how actual performance compares to the guided estimate. Can be\nprovided at initial declaration or as a backfill on existing estimates by\nre-running this command with only this flag (other flags are re-read from the\nlast record).",
          "name": "ai-guided-days",
          "summary": "Estimated days with setup-agents guided workflow.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "confidence": {
          "description": "How confident you are in the declared baselines. Options: `low` `medium` `high`.\nDefaults to `medium`.",
          "name": "confidence",
          "summary": "Confidence level in these estimates.",
          "default": "medium",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "low",
            "medium",
            "high"
          ],
          "type": "option"
        },
        "declared-by": {
          "description": "The setup-agents profile making the declaration (e.g. `pm`, `architect`).\nDefaults to `pm`.",
          "name": "declared-by",
          "summary": "Profile declaring the estimate.",
          "default": "pm",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "ignore-history": {
          "name": "ignore-history",
          "summary": "Skip historical benchmark data when producing the estimate.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:estimate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Record a delivery baseline estimate for a story before the workflow starts.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "estimate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:estimate",
        "workflow:setup-agents:estimate",
        "workflow:estimate:setup-agents",
        "setup-agents:estimate:workflow",
        "estimate:setup-agents:workflow",
        "estimate:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:execute": {
      "aliases": [],
      "args": {},
      "description": "Delegates each phase of the story workflow to an AI runtime (claude, cursor, or codex).\nUnlike `workflow run`, this command does not manage state records — it simply spawns the\nruntime process and streams its output to the terminal. State tracking is the runtime's\nresponsibility via the sub-agent protocol.\n\nPhase sequence: PM → BA → Architect → Developer → QA → Document Review → Release\n\nThe `--runtime` flag selects which AI CLI to invoke:\n\n- `auto` — detects the first available runtime using `--runtime-preference`, then workspace\n  `orchestration.runtimePreference`, then workspace `tools`, then claude, cursor, codex.\n- `claude` — uses the `claude` CLI with `--system-prompt` and `--print`.\n- `cursor` — uses the `cursor agent --print` CLI (requires `CURSOR_API_KEY`).\n- `codex` — uses the `codex` CLI with `--instructions`.\n\nThe `--from-phase` flag resumes execution from a specific phase, skipping earlier ones.\n\nThe `--gates` flag controls when to pause between phases:\n\n- `none` — run all phases sequentially without pausing.\n- `phase` — pause at BA→Architect and Document Review→Release boundaries (default).\n- `all` — pause at every phase boundary.\n\nUse `--dry-run` to preview the command that would be run for each phase without executing.",
      "examples": [
        "Execute all phases with auto-detected runtime:\n<%= config.bin %> <%= command.id %> --story SA-102",
        "Execute with Claude and no gate pauses:\n<%= config.bin %> <%= command.id %> --story SA-102 --runtime claude --gates none",
        "Prefer Codex when auto-detecting:\n<%= config.bin %> <%= command.id %> --story SA-102 --runtime auto --runtime-preference codex,claude,cursor",
        "Resume from the developer phase after a gate pause:\n<%= config.bin %> <%= command.id %> --story SA-102 --from-phase developer",
        "Preview the execution plan without running anything:\n<%= config.bin %> <%= command.id %> --story SA-102 --dry-run"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "The story id passed to the runtime prompt for each phase, e.g. `SA-102` or `#102`.",
          "name": "story",
          "required": true,
          "summary": "Story or backlog item id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "runtime": {
          "description": "Select which AI CLI to invoke: `auto` (detect), `claude`, `cursor`, or `codex`.\n`auto` checks PATH using `--runtime-preference`, workspace `orchestration.runtimePreference`,\nworkspace `tools`, then the fallback order claude → cursor → codex.",
          "name": "runtime",
          "summary": "AI runtime to use for phase execution.",
          "default": "auto",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "auto",
            "claude",
            "cursor",
            "codex",
            "opencode"
          ],
          "type": "option"
        },
        "from-phase": {
          "description": "Skip all phases before this one and begin execution here.\nUseful when resuming after a gate pause or a failed phase.",
          "name": "from-phase",
          "summary": "Resume execution from this phase.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "dry-run": {
          "description": "Shows the resolved runtime, rule file path, and full command for each phase\nwithout spawning any processes.",
          "name": "dry-run",
          "summary": "Print what would be executed per phase without running.",
          "allowNo": false,
          "type": "boolean"
        },
        "foreground": {
          "description": "By default, when SETUP_AGENTS_BRIDGE_PORT, SETUP_AGENTS_BRIDGE_TOKEN, and\nSETUP_AGENTS_CHAT_SESSION_ID are present in the environment (all three are\nalready set when this command runs from the web console chat's own Bash tool), the\nnext phase is dispatched via the bridge's existing async spawn pipeline (the\nsame one behind the console's own \"Detached subagent\" delegation) and this\ncommand returns immediately instead of waiting for it — only the NEXT phase\nis delegated, not the full remaining sequence; re-run with --from-phase\n<next> once notified the delegated phase completed. --foreground skips that\nand always runs inline, matching the pre-GH-746 behavior. Outside a chat\nsession (CI, manual terminal use) those environment variables are simply\nabsent, so this command already runs inline with or without --foreground.",
          "name": "foreground",
          "summary": "Run the next phase inline and wait for it, even inside a chat session that could dispatch it to the background instead.",
          "allowNo": false,
          "type": "boolean"
        },
        "gates": {
          "description": "Controls where execution pauses for human review: `none` (no pauses),\n`phase` (pause at BA→Architect and Document Review→Release, default), or `all` (every transition).",
          "name": "gates",
          "summary": "Gate approval mode.",
          "default": "phase",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "none",
            "phase",
            "all"
          ],
          "type": "option"
        },
        "max-iterations": {
          "description": "Maximum number of times the QA→Developer loop can repeat before the run is blocked.\nDefaults to 5. Must be at least 1.",
          "name": "max-iterations",
          "summary": "Maximum QA→Developer loop iterations.",
          "default": 5,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "max-phase-minutes": {
          "description": "If a spawned runtime process does not exit within this many minutes, it is sent SIGTERM\nand the phase is marked failed with exit code 124 (timeout). Default: 60. Min: 1.",
          "name": "max-phase-minutes",
          "summary": "Maximum minutes a single phase may run before it is killed.",
          "default": 60,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "max-agents": {
          "description": "Passed to the runtime CLI as --max-turns (claude/cursor) or --max-agents (codex).\nPrevents sub-agent fan-out that can exhaust memory in CI environments. Default: 5. Min: 1.",
          "name": "max-agents",
          "summary": "Maximum number of sub-agents the runtime may spawn per phase.",
          "default": 5,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "capability-signals": {
          "description": "Additional task signals used to activate runtime capabilities for each phase prompt.\nSub-agent handoff records are read automatically; this flag is only an explicit override/addition.\nFor example: `qa evidence,acceptance criteria coverage,release evidence`.",
          "name": "capability-signals",
          "summary": "Additional runtime capability signals.",
          "hasDynamicHelp": false,
          "helpValue": "qa evidence,release evidence",
          "multiple": false,
          "type": "option"
        },
        "runtime-preference": {
          "description": "Comma-separated runtime order used only when `--runtime auto` is selected.\nFor Codex-preferred execution, pass `codex,claude,cursor` or set\n`orchestration.runtimePreference` in `.setup-agents/config.json`.",
          "name": "runtime-preference",
          "summary": "Preferred runtime order for auto detection.",
          "hasDynamicHelp": false,
          "helpValue": "codex,claude,cursor,opencode",
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:execute",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Execute workflow phases by spawning an AI runtime for each phase.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "execute.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:execute",
        "workflow:setup-agents:execute",
        "workflow:execute:setup-agents",
        "setup-agents:execute:workflow",
        "execute:setup-agents:workflow",
        "execute:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:gate": {
      "aliases": [],
      "args": {},
      "description": "Registers a review request mid-phase (e.g. developer requesting sizing validation from architect,\nor QA requesting criteria clarification from the product owner) without requiring a phase\ntransition. The gate is attached to the active phase's `reviewIds` list and persisted in\n`.setup-agents/state/reviews.jsonl`.\n\nUse `sf setup-agents review complete` to resolve the gate, then resume the run with\n`sf setup-agents workflow run --resume`.",
      "examples": [
        "Developer requests sizing validation from architect:\n<%= config.bin %> <%= command.id %> --run wf-123 --phase developer --from developer --to architect --gate \"developer:sizing→architect\" --summary \"Story points ambiguous — is this a 5 or 8?\"",
        "QA requests criteria clarification from product owner:\n<%= config.bin %> <%= command.id %> --run wf-123 --phase qa --from qa --to ba --gate \"qa:criteria→ba\" --summary \"Acceptance criterion 3 is ambiguous for edge case X\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "run": {
          "description": "The run id returned by `sf setup-agents workflow run`. Use `sf setup-agents workflow pending`\nto find active run ids.",
          "name": "run",
          "required": true,
          "summary": "Workflow run id.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "phase": {
          "description": "The currently active phase requesting consultation, e.g. `developer`.",
          "name": "phase",
          "required": true,
          "summary": "Phase that is opening the gate.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "from": {
          "description": "The setup-agents profile that needs the input, e.g. `developer`.",
          "name": "from",
          "required": true,
          "summary": "Profile requesting the consultation.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "to": {
          "description": "The setup-agents profile that will provide input, e.g. `architect`.",
          "name": "to",
          "required": true,
          "summary": "Profile that must respond.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "summary": {
          "char": "s",
          "description": "Describe the question or decision that requires input from the other role.",
          "name": "summary",
          "required": true,
          "summary": "Short description of what is needed.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "gate": {
          "description": "Semantic label for this gate, e.g. `developer:sizing→architect` or `qa:criteria→ba`.\nDefaults to `<from>→<to>`.",
          "name": "gate",
          "summary": "Gate label.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:gate",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Open a mid-phase gate to request input from another role.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "gate.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:gate",
        "workflow:setup-agents:gate",
        "workflow:gate:setup-agents",
        "setup-agents:gate:workflow",
        "gate:setup-agents:workflow",
        "gate:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:lessons": {
      "aliases": [],
      "args": {},
      "description": "Reads the canonical lesson projection and reconciles legacy operational lessons, estimation lessons, and lesson evidence without duplicates.",
      "examples": [
        "List all lessons:\n<%= config.bin %> <%= command.id %>",
        "Search lessons by keyword:\n<%= config.bin %> <%= command.id %> --search \"developer\"",
        "Output as JSON:\n<%= config.bin %> <%= command.id %> --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "search": {
          "description": "When provided, searches every canonical lesson field and source task id.",
          "name": "search",
          "summary": "Filter lessons by keyword.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "migrate": {
          "name": "migrate",
          "summary": "Migrate legacy lesson records into the canonical append-only store.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:lessons",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List canonical delivery, estimation, and operational lessons.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "lessons.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:lessons",
        "workflow:setup-agents:lessons",
        "workflow:lessons:setup-agents",
        "setup-agents:lessons:workflow",
        "lessons:setup-agents:workflow",
        "lessons:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:pending": {
      "aliases": [],
      "args": {},
      "description": "Reads `.setup-agents/state/workflow-runs.jsonl` and shows all runs with\nstatus `paused`, the gate that blocked them, and the exact commands to\napprove the review and resume execution.",
      "examples": [
        "Check what needs your attention:\n<%= config.bin %> <%= command.id %>"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:pending",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List workflow runs waiting for gate approval.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "pending.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:pending",
        "workflow:setup-agents:pending",
        "workflow:pending:setup-agents",
        "setup-agents:pending:workflow",
        "pending:setup-agents:workflow",
        "pending:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:phase-plan": {
      "aliases": [],
      "args": {},
      "description": "Merges the baseline phase registry with workspace profiles, task-declared roles, and phase overrides to produce a concrete execution plan. Useful for previewing which phases will run before starting a workflow.\n\nSources of phase inclusion (in priority order):\n\n1. **Always-included** — developer, qa, release are always present.\n2. **Required roles** — task.roles.required maps to phases.\n3. **Optional roles** — task.roles.optional maps to phases.\n4. **Profile triggers** — workspace config profiles trigger matching phases.\n5. **Override add** — explicit `--add-phase` flags inject additional phases.\n\nPhase overrides (`--skip-phase`, `--add-phase`, `--require-gate`, `--remove-gate`) take final precedence.",
      "examples": [
        "<%= config.bin %> <%= command.id %> --story SA-200",
        "<%= config.bin %> <%= command.id %> --story SA-200 --skip-phase ux --skip-phase pm",
        "<%= config.bin %> <%= command.id %> --story SA-200 --add-phase security-review --require-gate developer"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "The task ID whose declared roles and phase overrides will be used for resolution.",
          "name": "story",
          "required": true,
          "summary": "Story/task ID to resolve the plan for.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "skip-phase": {
          "description": "Remove a phase that would otherwise be included. Can be specified multiple times.",
          "name": "skip-phase",
          "summary": "Skip a phase from the resolved sequence.",
          "hasDynamicHelp": false,
          "multiple": true,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "add-phase": {
          "description": "Force-include a phase regardless of role/profile signals. Can be specified multiple times.",
          "name": "add-phase",
          "summary": "Add a phase to the resolved sequence.",
          "hasDynamicHelp": false,
          "multiple": true,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "require-gate": {
          "description": "Forces a human-approval gate after this phase, even if the default gate configuration would not include one.",
          "name": "require-gate",
          "summary": "Add a gate after the specified phase.",
          "hasDynamicHelp": false,
          "multiple": true,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "remove-gate": {
          "description": "Removes a gate that would otherwise be present, allowing the workflow to continue without pausing.",
          "name": "remove-gate",
          "summary": "Remove the gate after the specified phase.",
          "hasDynamicHelp": false,
          "multiple": true,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "save": {
          "description": "When set, writes the resolved phase overrides back to the task record so future `workflow run` invocations use them automatically.",
          "name": "save",
          "summary": "Persist the overrides to the task record.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:phase-plan",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Resolve and display the phase sequence for a story based on roles, profiles, and overrides.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "phase-plan.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:phase-plan",
        "workflow:setup-agents:phase-plan",
        "workflow:phase-plan:setup-agents",
        "setup-agents:phase-plan:workflow",
        "phase-plan:setup-agents:workflow",
        "phase-plan:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:playbooks": {
      "aliases": [],
      "args": {},
      "description": "Shows which generator playbooks are mapped to each workflow phase and\nwhether each file exists on disk. Missing playbooks are non-blocking —\nthe workflow engine will emit a warning and continue without them.\n\nRun `sf setup-agents local` to generate missing playbooks for the\nprofiles active in this workspace.",
      "examples": [
        "Show playbook mapping for the current workspace:\n<%= config.bin %> <%= command.id %>",
        "Show mapping for a custom instructions directory:\n<%= config.bin %> <%= command.id %> --instructions-dir .cursor/rules/workflows"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "instructions-dir": {
          "description": "Path relative to the workspace root where generator playbooks are stored.\nDefaults to `.a4drules/workflows`. Override for non-cursor/agentforce\ntargets if playbooks are stored elsewhere.",
          "name": "instructions-dir",
          "summary": "Directory to resolve playbooks from.",
          "default": ".setup-agents/playbooks",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "scaffold": {
          "description": "Writes default playbook stubs into the instructions directory for every missing playbook. Existing files are never overwritten.",
          "name": "scaffold",
          "summary": "Generate stub files for missing playbooks.",
          "allowNo": false,
          "type": "boolean"
        },
        "phase": {
          "description": "Limits --scaffold to a single phase (e.g. developer, qa, release).",
          "name": "phase",
          "summary": "Scaffold only the specified phase.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "name": "dry-run",
          "summary": "Preview scaffold output without writing files.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:playbooks",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "List phase-to-playbook mappings for the current workspace.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "playbooks.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:playbooks",
        "workflow:setup-agents:playbooks",
        "workflow:playbooks:setup-agents",
        "setup-agents:playbooks:workflow",
        "playbooks:setup-agents:workflow",
        "playbooks:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:release-check": {
      "aliases": [],
      "args": {},
      "description": "Evaluates the latest workflow run for current substantive evidence, AC mapping,\nresolved phases and reviews, generated setup health, and knowledge freshness. The\nconfigured static-analysis checks are then run as additional required checks:\n\n- **npm-audit** — dependency vulnerability scan (blocking on high/critical CVEs)\n- **knip** — dead-code detection (advisory only)\n- **coverage** — test coverage report (advisory only)\n- **secret-scan** — secret / credential leak detection (blocking)\n\nEach check result is recorded as an evidence artifact in\n`.setup-agents/state/evidence.jsonl`. The command exits non-zero when any\nblocking check fails.\n\nOlder project configs that omit evidence and substance modes migrate to fail-closed\nproject defaults. Advisory mode is explicitly non-release-ready. Explicit `warn` or\n`off` values remain compatible for non-release transitions, but cannot make the\nproduction release predicate pass. Use `--dry-run` only to preview command output;\nit does not create release-ready workflow state.",
      "examples": [
        "Run all release checks for story SA-110:\n<%= config.bin %> <%= command.id %> --task SA-110",
        "Run only the security-related checks:\n<%= config.bin %> <%= command.id %> --task SA-110 --checks npm-audit,secret-scan",
        "Dry run (skip all checks):\n<%= config.bin %> <%= command.id %> --task SA-110 --dry-run",
        "Emit JSON report:\n<%= config.bin %> <%= command.id %> --task SA-110 --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "task": {
          "description": "Evidence artifacts created by each check will reference this task id,\ne.g. `SA-110` or the workflow phase task id.",
          "name": "task",
          "required": true,
          "summary": "Task or story id to associate evidence with.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "dry-run": {
          "description": "When set, no tools are invoked and all checks are reported as skipped.\nUseful when previewing the release phase in a dry-run workflow run.",
          "name": "dry-run",
          "summary": "Skip all checks and exit zero.",
          "allowNo": false,
          "type": "boolean"
        },
        "checks": {
          "description": "Override the default set of checks. Valid values: npm-audit, knip, coverage, secret-scan.\nDefaults to all checks.",
          "name": "checks",
          "summary": "Comma-separated list of checks to run.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:release-check",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Evaluate substantive project release readiness and record required check evidence.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "release-check.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:release-check",
        "workflow:setup-agents:release-check",
        "workflow:release-check:setup-agents",
        "setup-agents:release-check:workflow",
        "release-check:setup-agents:workflow",
        "release-check:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:rollback": {
      "aliases": [],
      "args": {},
      "description": "Resets a workflow run to a prior phase so it can be re-executed from that point.\nAll phase records after the target phase are removed and the run status is set back\nto `running`. The rollback is persisted as an append to `workflow-runs.jsonl`.\n\nUse when a phase produced incorrect output and needs to be redone, or when a gate\nreview determined that an earlier phase must be revisited.\n\nFor an `autonomous-v1` run, rollback preserves the run mode and retained evidence history. To\ndisable autonomous execution, stop new autonomous starts and leave the run paused for manual\nreview; do not reinterpret the persisted run as manual or delete its evidence, corrections, or\napprovals. Rollback does not approve, merge, push, publish, deploy, or release anything.",
      "examples": [
        "Roll back to the developer phase because QA found a regression:\n<%= config.bin %> <%= command.id %> --run wf-123 --phase developer --reason \"QA found a regression in the SOQL bulkification fix\"",
        "Roll back to architect after BA identified a missing acceptance criterion:\n<%= config.bin %> <%= command.id %> --run wf-123 --phase architect --reason \"Missing AC for error state — needs architect re-design\""
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "run": {
          "description": "The run id returned by `sf setup-agents workflow run`. Use `sf setup-agents workflow pending`\nto list active or paused runs.",
          "name": "run",
          "required": true,
          "summary": "Workflow run id to roll back.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "phase": {
          "description": "All phases from this phase onward are reset. The run will re-execute from this phase\nwhen `sf setup-agents workflow run --resume` is invoked.",
          "name": "phase",
          "required": true,
          "summary": "Phase to roll back to (inclusive).",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "reason": {
          "description": "Free-text explanation recorded on the run record. Used for audit and sprint retrospectives.",
          "name": "reason",
          "summary": "Short reason for the rollback.",
          "default": "",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "name": "target-dir",
          "summary": "Workspace containing the workflow run",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:rollback",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Roll back a workflow run to a prior phase.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "rollback.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:rollback",
        "workflow:setup-agents:rollback",
        "workflow:rollback:setup-agents",
        "setup-agents:rollback:workflow",
        "rollback:setup-agents:workflow",
        "rollback:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:run": {
      "aliases": [],
      "args": {},
      "description": "Creates orchestration state for a story lifecycle across phases:\n\nPM → BA/PO → Architect → UX? → Developer ↔ QA (loop) → Document Review → Release\n\nManual mode creates task records, handoffs, and gate pauses. With `--autonomous`, the same\nworkflow controller invokes delegated phases, executes registered verification lanes, returns\nfailures to Developer, and persists criterion-specific assertion evidence. Mandatory human\narchitecture and final release gates remain enforced. Manual mode is the default.\n\nAutonomous verification records every governed lane as selected, excluded, or blocked with a\nreason. A substantive criterion is verified only by a registered verifier contract and evidence\nfrom the same run, iteration, and source digest. Required unavailable lanes block readiness.\nThe loop stops after at most five attempts or two consecutive no-progress iterations.\n\nTo dispatch work to an AI runtime (Claude, Codex, etc.), use:\n\nsf setup-agents workflow execute --runtime claude --story <id>\n\nEach phase creates a native task, claims it, records evidence, and creates a handoff\nto the next role. Gate transitions create a review request and pause until completed\nvia `sf setup-agents review complete`.\n\nThe `--gates` flag controls gate behavior:\n\n- `none` — all transition gates auto-approved in manual mode; invalid with `--autonomous`.\n- `phase` — human approval at BA→Architect and Document Review→Release boundaries (default).\n- `all` — human approval at every phase transition.\n\nRun state is persisted to `.setup-agents/state/workflow-runs.jsonl`.\nResume a paused run after approving the gate review with `--resume <run-id>`.",
      "examples": [
        "Run with default phase gates:\n<%= config.bin %> <%= command.id %> --story SA-102",
        "Opt in to autonomous verification with mandatory human gates:\n<%= config.bin %> <%= command.id %> --story SA-102 --autonomous --gates phase",
        "Supervised run (gate at every transition):\n<%= config.bin %> <%= command.id %> --story SA-102 --gates all --max-iterations 3",
        "Preview without executing:\n<%= config.bin %> <%= command.id %> --story SA-102 --dry-run",
        "Resume after approving a gate review:\n<%= config.bin %> <%= command.id %> --story SA-102 --resume wf-1234567-abc1",
        "Start at developer phase (work already in progress):\n<%= config.bin %> <%= command.id %> --story PHP-313 --from-phase developer",
        "Start at QA phase with immediate pass result:\n<%= config.bin %> <%= command.id %> --story PHP-313 --from-phase qa --qa-result pass",
        "Resume a run but force restart from QA (overrides auto-detected phase):\n<%= config.bin %> <%= command.id %> --story PHP-313 --resume wf-1234567-abc1 --from-phase qa"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "target-dir": {
          "description": "Explicit workspace directory for state writes. When omitted, uses the current working directory.",
          "name": "target-dir",
          "summary": "Workspace root to target (defaults to cwd).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "The id to track throughout the workflow. This is the SAME id you registered with `task create --id <id>` — `workflow run` resolves that task's roles and phase overrides from it. e.g. `SA-102`, `#102`, or a `setup-agents-task-…` id. (Note: this is `--story`, not `--task`; the Orchestra CLI uses `--task` for the equivalent, but `sf setup-agents workflow` uses `--story`.)",
          "name": "story",
          "required": true,
          "summary": "Story/task id — the same id you passed to `task create --id`.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "gates": {
          "description": "Controls where human approval is required: `none` (no transition gates in manual mode),\n`phase` (gate at BA→Architect and Document Review→Release, default), or `all` (every transition).\n`none` applies only to manual orchestration; autonomous-v1 rejects it because its two mandatory\nhuman gates cannot be disabled.",
          "name": "gates",
          "summary": "Gate approval mode.",
          "default": "phase",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "none",
            "phase",
            "all"
          ],
          "type": "option"
        },
        "max-iterations": {
          "description": "Stop the Dev↔QA bug-fix loop after this many QA failures. Default: 5.",
          "name": "max-iterations",
          "summary": "Maximum Dev↔QA loop iterations.",
          "default": 5,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "profiles": {
          "description": "Comma-separated profile ids to activate for this workflow run.\nDefaults to profiles in `.setup-agents/config.json`.",
          "name": "profiles",
          "summary": "Override active profiles for this run.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "resume": {
          "description": "Resume execution of a paused workflow run after a gate review was approved.\nProvide the run id returned by the original invocation.",
          "name": "resume",
          "summary": "Resume a paused workflow run.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "from-phase": {
          "description": "Creates a new run with upstream phases marked as skipped and begins execution at the specified phase. Use this when work is already in progress (e.g. implementation started) to avoid duplicating upstream tasks.",
          "name": "from-phase",
          "summary": "Start the pipeline from a specific phase, skipping all prior phases.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "qa-result": {
          "description": "Report the QA outcome when resuming after a QA phase: `pass` to proceed to\nrelease, `fail` to return to developer for bug fixes. Required when resuming\na manual run that is in the QA phase. Autonomous mode derives the result from\nregistered verification and does not accept caller-supplied QA as evidence.",
          "name": "qa-result",
          "summary": "QA result for this resume.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pass",
            "fail"
          ],
          "type": "option"
        },
        "autonomous": {
          "description": "Opt in to the bounded autonomous-v1 delivery loop. QA derives pass/fail from a run-baseline\nchanged-surface plan and criterion-specific verifier contracts in\n`.setup-agents/autonomous-verifiers.json`; generic lane success cannot verify a criterion.\nThe validated scope/architecture and final release gates remain mandatory. The Web bridge\nexposes equivalent `POST /api/v1/workflows/autonomous/start` and `/resume` requests. Each lane\nis reported as selected, excluded, or blocked, and qualifying evidence is bound to run ID,\niteration, and source digest. Execution stops after no more than five attempts or two consecutive\nno-progress iterations. The deterministic environment seam is test-only; production uses the\nconfigured delegated provider, and an unavailable required provider is a blocking deferral.",
          "name": "autonomous",
          "summary": "Run real verification checks and automatically correct failures.",
          "allowNo": false,
          "type": "boolean"
        },
        "dry-run": {
          "description": "Show which phases will run, which gates will fire, and the handoff chain — without creating any records.",
          "name": "dry-run",
          "summary": "Print the planned phase graph without executing.",
          "allowNo": false,
          "type": "boolean"
        },
        "instructions-dir": {
          "description": "Path relative to the workspace root where playbook files are stored.\nDefaults to `.setup-agents/playbooks` (generated automatically by `sf setup-agents local`).\nOverride to point at a custom directory.",
          "name": "instructions-dir",
          "summary": "Directory to resolve playbooks from.",
          "default": ".setup-agents/playbooks",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "reject-to": {
          "description": "When resuming a paused run, reject the active phase and re-route work to the specified target phase with findings as context. The target phase will be re-initialized with rejection context so the role knows what to fix.\n\nExample: QA rejects back to developer:\nsf setup-agents workflow run --story SA-102 --resume wf-123 --reject-to developer --findings \"Missing null check in handler\"\n\nExample: Architect rejects back to BA:\nsf setup-agents workflow run --story SA-102 --resume wf-123 --reject-to ba --findings \"Acceptance criteria incomplete\"",
          "name": "reject-to",
          "summary": "Reject current phase and return work to a target phase.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "pm",
            "ba",
            "architect",
            "ux",
            "developer",
            "security-review",
            "qa",
            "document-review",
            "release"
          ],
          "type": "option"
        },
        "findings": {
          "description": "Free-text description of why the current phase is rejecting. This text is attached to the re-initialized target phase task so the responsible role has context about what needs to be fixed.",
          "name": "findings",
          "summary": "Rejection findings to pass as context to the target phase.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "push-to": {
          "name": "push-to",
          "summary": "Push phase completion comments to GitHub Issue or Jira ticket.",
          "hasDynamicHelp": false,
          "multiple": false,
          "options": [
            "github",
            "jira"
          ],
          "type": "option"
        },
        "ticket": {
          "name": "ticket",
          "summary": "GitHub issue number or Jira ticket ID to comment on.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:run",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Run a multi-phase story workflow, with optional autonomous delegated execution and verification.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "run.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:run",
        "workflow:setup-agents:run",
        "workflow:run:setup-agents",
        "setup-agents:run:workflow",
        "run:setup-agents:workflow",
        "run:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:telemetry": {
      "aliases": [],
      "args": {},
      "description": "Reads recorded effort-estimate records (written automatically when phases close\nvia `sf setup-agents workflow run`) and reports minutes by autonomy mode:\n\n- `ai_autonomous` — agent completed phase with no gate\n- `ai_supervised` — agent completed phase, gate review was required\n- `ai_calibration_baseline` — estimate declared without active rules (baseline)\n- `human_manual` — human wrote deliverable directly\n- `human_review` — human approved a gate, no AI authorship\n\nUse `--story <id>` to scope the report to a single story, or omit to aggregate\nacross all recorded phases.",
      "examples": [
        "Show effort breakdown for a single story:\n<%= config.bin %> <%= command.id %> --story US-42",
        "Show aggregated effort across all stories:\n<%= config.bin %> <%= command.id %>"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "story": {
          "char": "s",
          "description": "Filter effort records by story id. Omit to aggregate all stories.",
          "name": "story",
          "summary": "Story id to scope the report to.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "recalculate": {
          "description": "Re-reads all effort estimate records and recomputes the summary, including rules_multiplier.",
          "name": "recalculate",
          "summary": "Recompute effort summary from all recorded data.",
          "allowNo": false,
          "type": "boolean"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:telemetry",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Show AI effort classification breakdown for delivered workflow phases.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "telemetry.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:telemetry",
        "workflow:setup-agents:telemetry",
        "workflow:telemetry:setup-agents",
        "setup-agents:telemetry:workflow",
        "telemetry:setup-agents:workflow",
        "telemetry:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:sprint:close": {
      "aliases": [],
      "args": {},
      "description": "Appends a sprint close record to `.setup-agents/state/sprints.jsonl`.\nReads all estimates declared within the sprint window to compute actual points\ndelivered, velocity percentage vs committed, and average savings vs solo / vs\nunguided AI baselines. Also runs bias detection and writes auto-lessons to\n`.setup-agents/state/lessons.jsonl` when a role shows >30% bias in the same\ndirection for 3+ stories.",
      "examples": [
        "Close sprint SP-12 with 8 committed points:\n<%= config.bin %> <%= command.id %> --sprint SP-12 --committed-points 8"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "sprint": {
          "description": "Must match the id used in `sf setup-agents workflow sprint start`.",
          "name": "sprint",
          "required": true,
          "summary": "Sprint identifier to close.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "committed-points": {
          "description": "The number of story points the team committed to deliver in this sprint.\nUsed as the baseline denominator for velocity percentage.",
          "name": "committed-points",
          "required": true,
          "summary": "Story points committed at sprint planning.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:sprint:close",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Close a sprint and compute velocity metrics.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "sprint",
        "close.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:sprint:close",
        "workflow:setup-agents:sprint:close",
        "workflow:sprint:setup-agents:close",
        "workflow:sprint:close:setup-agents",
        "setup-agents:sprint:workflow:close",
        "sprint:setup-agents:workflow:close",
        "sprint:workflow:setup-agents:close",
        "sprint:workflow:close:setup-agents",
        "setup-agents:sprint:close:workflow",
        "sprint:setup-agents:close:workflow",
        "sprint:close:setup-agents:workflow",
        "sprint:close:workflow:setup-agents",
        "setup-agents:workflow:close:sprint",
        "workflow:setup-agents:close:sprint",
        "workflow:close:setup-agents:sprint",
        "workflow:close:sprint:setup-agents",
        "setup-agents:close:workflow:sprint",
        "close:setup-agents:workflow:sprint",
        "close:workflow:setup-agents:sprint",
        "close:workflow:sprint:setup-agents",
        "setup-agents:close:sprint:workflow",
        "close:setup-agents:sprint:workflow",
        "close:sprint:setup-agents:workflow",
        "close:sprint:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:sprint:start": {
      "aliases": [],
      "args": {},
      "description": "Appends a sprint start record to `.setup-agents/state/sprints.jsonl` with the\ndeclared sprint id, date range, and capacity in days. Run this before stories\nare delivered to anchor the sprint window for velocity calculation.",
      "examples": [
        "Start sprint SP-12 with a two-week window and 10 capacity days:\n<%= config.bin %> <%= command.id %> --sprint SP-12 --start-date 2026-05-05 --end-date 2026-05-16 --capacity 10"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "sprint": {
          "description": "Unique id for this sprint (e.g. `SP-12`, `2026-Q2-S1`).",
          "name": "sprint",
          "required": true,
          "summary": "Sprint identifier.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "start-date": {
          "description": "ISO date when the sprint begins. Stories estimated after this date are\nassociated with the sprint in `workflow sprint close`.",
          "name": "start-date",
          "required": true,
          "summary": "Sprint start date (YYYY-MM-DD).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "end-date": {
          "description": "ISO date when the sprint is expected to close.",
          "name": "end-date",
          "required": true,
          "summary": "Sprint end date (YYYY-MM-DD).",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "capacity": {
          "description": "Total available developer-days for this sprint. Used as denominator when\ncomputing velocity percentage.",
          "name": "capacity",
          "required": true,
          "summary": "Team capacity in days.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:sprint:start",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Start a new sprint and record its capacity window.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "sprint",
        "start.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:sprint:start",
        "workflow:setup-agents:sprint:start",
        "workflow:sprint:setup-agents:start",
        "workflow:sprint:start:setup-agents",
        "setup-agents:sprint:workflow:start",
        "sprint:setup-agents:workflow:start",
        "sprint:workflow:setup-agents:start",
        "sprint:workflow:start:setup-agents",
        "setup-agents:sprint:start:workflow",
        "sprint:setup-agents:start:workflow",
        "sprint:start:setup-agents:workflow",
        "sprint:start:workflow:setup-agents",
        "setup-agents:workflow:start:sprint",
        "workflow:setup-agents:start:sprint",
        "workflow:start:setup-agents:sprint",
        "workflow:start:sprint:setup-agents",
        "setup-agents:start:workflow:sprint",
        "start:setup-agents:workflow:sprint",
        "start:workflow:setup-agents:sprint",
        "start:workflow:sprint:setup-agents",
        "setup-agents:start:sprint:workflow",
        "start:setup-agents:sprint:workflow",
        "start:sprint:setup-agents:workflow",
        "start:sprint:workflow:setup-agents"
      ]
    },
    "setup-agents:workflow:sprint:velocity": {
      "aliases": [],
      "args": {},
      "description": "Reads closed sprint records from `.setup-agents/state/sprints.jsonl` and\nprints a table showing Sprint, Committed points, Actual points, Velocity%,\nAvgVsSolo, and AvgVsAI for the last N sprints. Use `--json` to get\nmachine-readable output.",
      "examples": [
        "Show velocity for the last 5 sprints:\n<%= config.bin %> <%= command.id %>",
        "Show last 10 sprints:\n<%= config.bin %> <%= command.id %> --limit 10",
        "Machine-readable output:\n<%= config.bin %> <%= command.id %> --json"
      ],
      "flags": {
        "json": {
          "description": "Format output as json.",
          "helpGroup": "GLOBAL",
          "name": "json",
          "allowNo": false,
          "type": "boolean"
        },
        "flags-dir": {
          "helpGroup": "GLOBAL",
          "name": "flags-dir",
          "summary": "Import flag values from a directory.",
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        },
        "limit": {
          "description": "Limits the output to the N most recent closed sprints. Defaults to 5.",
          "name": "limit",
          "summary": "Number of recent sprints to show.",
          "default": 5,
          "hasDynamicHelp": false,
          "multiple": false,
          "type": "option"
        }
      },
      "hasDynamicHelp": false,
      "hiddenAliases": [],
      "id": "setup-agents:workflow:sprint:velocity",
      "pluginAlias": "@jterrats/setup-agents",
      "pluginName": "@jterrats/setup-agents",
      "pluginType": "core",
      "strict": true,
      "summary": "Print sprint velocity trend table.",
      "enableJsonFlag": true,
      "isESM": true,
      "relativePath": [
        "lib",
        "commands",
        "setup-agents",
        "workflow",
        "sprint",
        "velocity.js"
      ],
      "aliasPermutations": [],
      "permutations": [
        "setup-agents:workflow:sprint:velocity",
        "workflow:setup-agents:sprint:velocity",
        "workflow:sprint:setup-agents:velocity",
        "workflow:sprint:velocity:setup-agents",
        "setup-agents:sprint:workflow:velocity",
        "sprint:setup-agents:workflow:velocity",
        "sprint:workflow:setup-agents:velocity",
        "sprint:workflow:velocity:setup-agents",
        "setup-agents:sprint:velocity:workflow",
        "sprint:setup-agents:velocity:workflow",
        "sprint:velocity:setup-agents:workflow",
        "sprint:velocity:workflow:setup-agents",
        "setup-agents:workflow:velocity:sprint",
        "workflow:setup-agents:velocity:sprint",
        "workflow:velocity:setup-agents:sprint",
        "workflow:velocity:sprint:setup-agents",
        "setup-agents:velocity:workflow:sprint",
        "velocity:setup-agents:workflow:sprint",
        "velocity:workflow:setup-agents:sprint",
        "velocity:workflow:sprint:setup-agents",
        "setup-agents:velocity:sprint:workflow",
        "velocity:setup-agents:sprint:workflow",
        "velocity:sprint:setup-agents:workflow",
        "velocity:sprint:workflow:setup-agents"
      ]
    }
  },
  "version": "3.22.3"
}