opendevbrowser 0.0.30 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{chunk-RCZZGGJS.js → chunk-2I3YS3DV.js} +2 -2
- package/dist/{chunk-J47N77VG.js → chunk-6B5WAQV7.js} +3 -3
- package/dist/chunk-6B5WAQV7.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/index.js +7 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/{help-EKKKEDL5.js → help-U7KBQME6.js} +4 -4
- package/dist/help-U7KBQME6.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/opendevbrowser.js +1 -1
- package/dist/public-surface/generated-manifest.d.ts +1 -1
- package/dist/public-surface/source.d.ts +1 -1
- package/dist/{update-SMXPYGXS.js → update-FZGSXB74.js} +6 -2
- package/dist/update-FZGSXB74.js.map +1 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/dist/chunk-J47N77VG.js.map +0 -1
- package/dist/help-EKKKEDL5.js.map +0 -1
- package/dist/update-SMXPYGXS.js.map +0 -1
- /package/dist/{chunk-RCZZGGJS.js.map → chunk-2I3YS3DV.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/public-surface/generated-manifest.ts"],"sourcesContent":["/**\n * Generated by scripts/generate-public-surface-manifest.mjs.\n * Do not edit manually.\n */\n\nimport type {\n CommandHelpDetail,\n PublicSurfaceCliCommandGroupDefinition,\n PublicSurfaceCliCommandName,\n PublicSurfaceFlagName,\n PublicSurfaceManifest,\n ToolSurfaceEntry\n} from \"./source\";\n\nexport const PUBLIC_SURFACE_MANIFEST_SCHEMA_VERSION = \"2026-04-04\" as const;\nexport const PUBLIC_SURFACE_MANIFEST_GENERATED_AT = \"2026-05-11T13:02:13.972Z\" as const;\n\nexport const PUBLIC_SURFACE_MANIFEST = {\n \"schemaVersion\": \"2026-04-04\",\n \"generatedAt\": \"2026-05-11T13:02:13.972Z\",\n \"cli\": {\n \"groups\": [\n {\n \"id\": \"install_lifecycle\",\n \"title\": \"Install & Lifecycle\",\n \"summary\": \"Install, remove, and inspect CLI basics.\",\n \"commands\": [\n \"install\",\n \"update\",\n \"uninstall\",\n \"help\",\n \"version\"\n ]\n },\n {\n \"id\": \"daemon_runtime\",\n \"title\": \"Daemon & Runtime\",\n \"summary\": \"Run daemon services and single-process scripts.\",\n \"commands\": [\n \"serve\",\n \"daemon\",\n \"native\",\n \"run\"\n ]\n },\n {\n \"id\": \"session_lifecycle\",\n \"title\": \"Session Lifecycle\",\n \"summary\": \"Launch, connect, and manage browser session state.\",\n \"commands\": [\n \"launch\",\n \"connect\",\n \"disconnect\",\n \"status\",\n \"status-capabilities\",\n \"cookie-import\",\n \"cookie-list\"\n ]\n },\n {\n \"id\": \"provider_workflows\",\n \"title\": \"Provider Workflows\",\n \"summary\": \"Run research, shopping, media, and artifact workflows.\",\n \"commands\": [\n \"research\",\n \"shopping\",\n \"product-video\",\n \"inspiredesign\",\n \"artifacts\",\n \"macro-resolve\"\n ]\n },\n {\n \"id\": \"design_canvas\",\n \"title\": \"Design Canvas\",\n \"summary\": \"Execute typed /canvas commands for session, document, preview, and code-sync flows.\",\n \"commands\": [\n \"canvas\"\n ]\n },\n {\n \"id\": \"navigation\",\n \"title\": \"Navigation\",\n \"summary\": \"Move through pages and capture fresh refs.\",\n \"commands\": [\n \"goto\",\n \"wait\",\n \"snapshot\",\n \"review\",\n \"review-desktop\"\n ]\n },\n {\n \"id\": \"interaction\",\n \"title\": \"Interaction\",\n \"summary\": \"Perform ref-based interactions in the active page.\",\n \"commands\": [\n \"click\",\n \"hover\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"type\",\n \"select\",\n \"scroll\",\n \"scroll-into-view\",\n \"upload\",\n \"pointer-move\",\n \"pointer-down\",\n \"pointer-up\",\n \"pointer-drag\"\n ]\n },\n {\n \"id\": \"targets_pages\",\n \"title\": \"Targets & Pages\",\n \"summary\": \"Manage tabs, targets, and named pages.\",\n \"commands\": [\n \"targets-list\",\n \"target-use\",\n \"target-new\",\n \"target-close\",\n \"page\",\n \"pages\",\n \"page-close\"\n ]\n },\n {\n \"id\": \"dom_export\",\n \"title\": \"DOM & Export\",\n \"summary\": \"Read DOM state and export page or component code.\",\n \"commands\": [\n \"dom-html\",\n \"dom-text\",\n \"dom-attr\",\n \"dom-value\",\n \"dom-visible\",\n \"dom-enabled\",\n \"dom-checked\",\n \"clone-page\",\n \"clone-component\"\n ]\n },\n {\n \"id\": \"diagnostics_annotation\",\n \"title\": \"Diagnostics & Annotation\",\n \"summary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\",\n \"commands\": [\n \"session-inspector\",\n \"session-inspector-plan\",\n \"session-inspector-audit\",\n \"perf\",\n \"screenshot\",\n \"dialog\",\n \"console-poll\",\n \"network-poll\",\n \"debug-trace-snapshot\",\n \"annotate\"\n ]\n },\n {\n \"id\": \"browser_replay\",\n \"title\": \"Browser Replay\",\n \"summary\": \"Capture temporal replay artifacts through the public browser replay lane for a browser target.\",\n \"commands\": [\n \"screencast-start\",\n \"screencast-stop\"\n ]\n },\n {\n \"id\": \"desktop_observation\",\n \"title\": \"Desktop Observation\",\n \"summary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\",\n \"commands\": [\n \"desktop-status\",\n \"desktop-windows\",\n \"desktop-active-window\",\n \"desktop-capture-desktop\",\n \"desktop-capture-window\",\n \"desktop-accessibility-snapshot\"\n ]\n },\n {\n \"id\": \"power\",\n \"title\": \"Power\",\n \"summary\": \"Unsafe internal daemon passthrough.\",\n \"commands\": [\n \"rpc\"\n ]\n }\n ],\n \"commands\": [\n {\n \"name\": \"install\",\n \"description\": \"Install the plugin and sync bundled skill packs\",\n \"usage\": \"npx opendevbrowser [--global|--local] [--with-config] [--full] [--skills-global|--skills-local|--no-skills] [--no-prompt] [--quiet]\",\n \"flags\": [\n \"--global\",\n \"--local\",\n \"--with-config\",\n \"--full\",\n \"--skills-global\",\n \"--skills-local\",\n \"--no-skills\",\n \"--no-prompt\",\n \"--quiet\"\n ],\n \"examples\": [\n \"npx opendevbrowser install --local --with-config --skills-local\"\n ],\n \"notes\": [],\n \"groupId\": \"install_lifecycle\",\n \"groupTitle\": \"Install & Lifecycle\",\n \"groupSummary\": \"Install, remove, and inspect CLI basics.\"\n },\n {\n \"name\": \"update\",\n \"description\": \"Repair cached plugin pins and refresh managed skill packs\",\n \"usage\": \"npx opendevbrowser update [--global|--local] [--skills-global|--skills-local|--no-skills]\",\n \"flags\": [\n \"--global\",\n \"--local\",\n \"--skills-global\",\n \"--skills-local\",\n \"--no-skills\"\n ],\n \"examples\": [\n \"npx opendevbrowser update --local --skills-local\"\n ],\n \"notes\": [],\n \"groupId\": \"install_lifecycle\",\n \"groupTitle\": \"Install & Lifecycle\",\n \"groupSummary\": \"Install, remove, and inspect CLI basics.\"\n },\n {\n \"name\": \"uninstall\",\n \"description\": \"Remove plugin from config and clean managed skill packs\",\n \"usage\": \"npx opendevbrowser uninstall [--global|--local] [--no-skills] [--no-prompt] [--quiet]\",\n \"flags\": [\n \"--global\",\n \"--local\",\n \"--no-skills\",\n \"--no-prompt\",\n \"--quiet\"\n ],\n \"examples\": [\n \"npx opendevbrowser uninstall --local --no-skills --no-prompt\"\n ],\n \"notes\": [],\n \"groupId\": \"install_lifecycle\",\n \"groupTitle\": \"Install & Lifecycle\",\n \"groupSummary\": \"Install, remove, and inspect CLI basics.\"\n },\n {\n \"name\": \"help\",\n \"description\": \"Show help\",\n \"usage\": \"npx opendevbrowser --help | npx opendevbrowser help\",\n \"flags\": [\n \"--help\"\n ],\n \"examples\": [\n \"npx opendevbrowser --help\"\n ],\n \"notes\": [\n \"Generated help is the canonical first-contact discovery surface and should stay source-owned.\"\n ],\n \"groupId\": \"install_lifecycle\",\n \"groupTitle\": \"Install & Lifecycle\",\n \"groupSummary\": \"Install, remove, and inspect CLI basics.\"\n },\n {\n \"name\": \"version\",\n \"description\": \"Show version\",\n \"usage\": \"npx opendevbrowser --version | npx opendevbrowser version\",\n \"flags\": [\n \"--version\"\n ],\n \"examples\": [\n \"npx opendevbrowser --version\"\n ],\n \"notes\": [],\n \"groupId\": \"install_lifecycle\",\n \"groupTitle\": \"Install & Lifecycle\",\n \"groupSummary\": \"Install, remove, and inspect CLI basics.\"\n },\n {\n \"name\": \"serve\",\n \"description\": \"Start or stop the local daemon\",\n \"usage\": \"npx opendevbrowser serve [--port <port>] [--token <token>] [--stop]\",\n \"flags\": [\n \"--port\",\n \"--token\",\n \"--stop\"\n ],\n \"examples\": [\n \"npx opendevbrowser serve --port 8788 --token local-dev-token\"\n ],\n \"notes\": [],\n \"groupId\": \"daemon_runtime\",\n \"groupTitle\": \"Daemon & Runtime\",\n \"groupSummary\": \"Run daemon services and single-process scripts.\"\n },\n {\n \"name\": \"daemon\",\n \"description\": \"Install/uninstall/status daemon auto-start\",\n \"usage\": \"npx opendevbrowser daemon <install|uninstall|status>\",\n \"flags\": [\n \"--output-format\"\n ],\n \"examples\": [\n \"npx opendevbrowser daemon status --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"daemon_runtime\",\n \"groupTitle\": \"Daemon & Runtime\",\n \"groupSummary\": \"Run daemon services and single-process scripts.\"\n },\n {\n \"name\": \"native\",\n \"description\": \"Install/uninstall/status native messaging host\",\n \"usage\": \"npx opendevbrowser native <install|uninstall|status> [extension-id]\",\n \"flags\": [\n \"--output-format\"\n ],\n \"examples\": [\n \"npx opendevbrowser native status --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"daemon_runtime\",\n \"groupTitle\": \"Daemon & Runtime\",\n \"groupSummary\": \"Run daemon services and single-process scripts.\"\n },\n {\n \"name\": \"run\",\n \"description\": \"Execute a JSON script in a single process\",\n \"usage\": \"npx opendevbrowser run --script <path> [--headless] [--profile <name>] [--persist-profile <bool>] [--chrome-path <path>] [--start-url <url>] [--flag <chrome-arg>]\",\n \"flags\": [\n \"--script\",\n \"--headless\",\n \"--profile\",\n \"--persist-profile\",\n \"--chrome-path\",\n \"--start-url\",\n \"--flag\"\n ],\n \"examples\": [\n \"npx opendevbrowser run --script ./workflow.json --headless --output-format json\"\n ],\n \"notes\": [\n \"One-shot run uses a temporary profile unless --persist-profile is explicitly enabled.\"\n ],\n \"groupId\": \"daemon_runtime\",\n \"groupTitle\": \"Daemon & Runtime\",\n \"groupSummary\": \"Run daemon services and single-process scripts.\"\n },\n {\n \"name\": \"launch\",\n \"description\": \"Launch a managed browser session via daemon\",\n \"usage\": \"npx opendevbrowser launch [--headless] [--profile <name>] [--persist-profile <bool>] [--chrome-path <path>] [--start-url <url>] [--flag <chrome-arg>] [--no-extension|--extension-only] [--extension-legacy] [--wait-for-extension] [--wait-timeout-ms <ms>]\",\n \"flags\": [\n \"--headless\",\n \"--profile\",\n \"--persist-profile\",\n \"--chrome-path\",\n \"--start-url\",\n \"--flag\",\n \"--no-extension\",\n \"--extension-only\",\n \"--extension-legacy\",\n \"--wait-for-extension\",\n \"--wait-timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json\"\n ],\n \"notes\": [\n \"Use --wait-for-extension when you need a clean daemon-extension handshake before the next step.\"\n ],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"connect\",\n \"description\": \"Connect to an existing browser via daemon\",\n \"usage\": \"npx opendevbrowser connect (--ws-endpoint <url> | --host <host> --cdp-port <port>) [--start-url <url>] [--extension-legacy]\",\n \"flags\": [\n \"--ws-endpoint\",\n \"--host\",\n \"--cdp-port\",\n \"--start-url\",\n \"--extension-legacy\"\n ],\n \"examples\": [\n \"npx opendevbrowser connect --host 127.0.0.1 --cdp-port 9222 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"disconnect\",\n \"description\": \"Disconnect a daemon session\",\n \"usage\": \"npx opendevbrowser disconnect --session-id <id> [--close-browser]\",\n \"flags\": [\n \"--session-id\",\n \"--close-browser\"\n ],\n \"examples\": [\n \"npx opendevbrowser disconnect --session-id s1 --close-browser --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"status\",\n \"description\": \"Get daemon or session status\",\n \"usage\": \"npx opendevbrowser status [--session-id <id> | --daemon] [--transport <relay|native>]\",\n \"flags\": [\n \"--session-id\",\n \"--daemon\",\n \"--transport\"\n ],\n \"examples\": [\n \"npx opendevbrowser status --daemon --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"status-capabilities\",\n \"description\": \"Inspect runtime capability discovery for the host and an optional session\",\n \"usage\": \"npx opendevbrowser status-capabilities [--session-id <id>] [--target-id <id>] [--challenge-automation-mode <mode>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--challenge-automation-mode\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --timeout-ms 30000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"cookie-import\",\n \"description\": \"Import validated cookies into a session\",\n \"usage\": \"npx opendevbrowser cookie-import --session-id <id> (--cookies <json> | --cookies-file <path>) [--strict <bool>]\",\n \"flags\": [\n \"--session-id\",\n \"--cookies\",\n \"--cookies-file\",\n \"--strict\"\n ],\n \"examples\": [\n \"npx opendevbrowser cookie-import --session-id s1 --cookies-file ./cookies.json --strict true --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"cookie-list\",\n \"description\": \"List cookies for a session (optionally filtered by URL)\",\n \"usage\": \"npx opendevbrowser cookie-list --session-id <id> [--url <url>]\",\n \"flags\": [\n \"--session-id\",\n \"--url\"\n ],\n \"examples\": [\n \"npx opendevbrowser cookie-list --session-id s1 --url https://example.com --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"session_lifecycle\",\n \"groupTitle\": \"Session Lifecycle\",\n \"groupSummary\": \"Launch, connect, and manage browser session state.\"\n },\n {\n \"name\": \"research\",\n \"description\": \"Run research workflows\",\n \"usage\": \"npx opendevbrowser research run --topic <text> [--days <n>|--from <date> --to <date>] [--source-selection <family>] [--sources <csv>] [--include-engagement] [--limit-per-source <n>] [--browser-mode <mode>] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]\",\n \"flags\": [\n \"--topic\",\n \"--days\",\n \"--from\",\n \"--to\",\n \"--source-selection\",\n \"--sources\",\n \"--include-engagement\",\n \"--limit-per-source\",\n \"--browser-mode\",\n \"--mode\",\n \"--timeout-ms\",\n \"--output-dir\",\n \"--ttl-hours\",\n \"--use-cookies\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\"\n ],\n \"examples\": [\n \"npx opendevbrowser research run --topic \\\"Chrome extension debugging workflows\\\" --days 30 --sources web,community --browser-mode managed --mode json --output-format json\"\n ],\n \"notes\": [\n \"Load opendevbrowser-research first, use explicit source families such as --sources web,community, and inspect artifacts before final claims.\"\n ],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"shopping\",\n \"description\": \"Run shopping workflows\",\n \"usage\": \"npx opendevbrowser shopping run --query <text> [--providers <csv>] [--budget <amount>] [--region <region>] [--browser-mode <mode>] [--sort <mode>] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]\",\n \"flags\": [\n \"--query\",\n \"--providers\",\n \"--budget\",\n \"--region\",\n \"--browser-mode\",\n \"--sort\",\n \"--mode\",\n \"--timeout-ms\",\n \"--output-dir\",\n \"--ttl-hours\",\n \"--use-cookies\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\"\n ],\n \"examples\": [\n \"npx opendevbrowser shopping run --query \\\"wireless ergonomic mouse\\\" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json\"\n ],\n \"notes\": [\n \"Treat --region as advisory unless the workflow output reports region_authoritative=true.\"\n ],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"product-video\",\n \"description\": \"Run product presentation asset workflows\",\n \"usage\": \"npx opendevbrowser product-video run (--product-url <url> | --product-name <name>) [--provider-hint <provider>] [--include-screenshots[=<bool>]] [--include-all-images[=<bool>]] [--include-copy[=<bool>]] [--timeout-ms <ms>] [--browser-mode <mode>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>] [--output-dir <path>] [--ttl-hours <n>]\",\n \"flags\": [\n \"--product-url\",\n \"--product-name\",\n \"--provider-hint\",\n \"--include-screenshots\",\n \"--include-all-images\",\n \"--include-copy\",\n \"--timeout-ms\",\n \"--browser-mode\",\n \"--use-cookies\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\",\n \"--output-dir\",\n \"--ttl-hours\"\n ],\n \"examples\": [\n \"npx opendevbrowser product-video run --product-url \\\"https://example.com/p/1\\\" --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-screenshots --output-format json\"\n ],\n \"notes\": [\n \"Confirm whether the returned pack is visual-ready or metadata-first before briefing production.\"\n ],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"inspiredesign\",\n \"description\": \"Run inspiredesign workflows\",\n \"usage\": \"npx opendevbrowser inspiredesign run --brief <text> [--url <url>]... [--capture-mode <mode>] [--include-prototype-guidance[=<bool>]] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--browser-mode <mode>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]\",\n \"flags\": [\n \"--brief\",\n \"--url\",\n \"--capture-mode\",\n \"--include-prototype-guidance\",\n \"--mode\",\n \"--timeout-ms\",\n \"--output-dir\",\n \"--ttl-hours\",\n \"--browser-mode\",\n \"--use-cookies\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\"\n ],\n \"examples\": [\n \"npx opendevbrowser inspiredesign run --brief \\\"Extract a reusable dashboard design contract from live references\\\" --url https://linear.app --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json\"\n ],\n \"notes\": [\n \"Any inspiredesign --url forces deep capture for DOM/layout evidence; without URLs, --capture-mode defaults to off.\",\n \"Repeat --url for multiple references. There is no --urls alias.\"\n ],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"artifacts\",\n \"description\": \"Manage workflow artifact lifecycle\",\n \"usage\": \"npx opendevbrowser artifacts cleanup [--expired-only] [--output-dir <path>]\",\n \"flags\": [\n \"--expired-only\",\n \"--output-dir\"\n ],\n \"examples\": [\n \"npx opendevbrowser artifacts cleanup --expired-only --output-dir /tmp/opendevbrowser --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"macro-resolve\",\n \"description\": \"Resolve or execute a macro expression via provider actions\",\n \"usage\": \"npx opendevbrowser macro-resolve --expression <macro> [--default-provider <provider>] [--include-catalog] [--execute [--timeout-ms <ms>] [--browser-mode <mode>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]]\",\n \"flags\": [\n \"--expression\",\n \"--default-provider\",\n \"--include-catalog\",\n \"--execute\",\n \"--timeout-ms\",\n \"--browser-mode\",\n \"--use-cookies\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\"\n ],\n \"examples\": [\n \"npx opendevbrowser macro-resolve --expression '@community.search(\\\"browser automation failures\\\", 4)' --execute --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --output-format json\"\n ],\n \"notes\": [\n \"Use --browser-mode and --challenge-automation-mode only with --execute.\",\n \"Use --browser-mode extension --use-cookies --cookie-policy required when provider macros must reuse relay-backed browser state and verify that provider cookies are observable.\",\n \"When --execute is enabled, inspect execution.meta.blocker before trusting a blocked result as complete.\"\n ],\n \"groupId\": \"provider_workflows\",\n \"groupTitle\": \"Provider Workflows\",\n \"groupSummary\": \"Run research, shopping, media, and artifact workflows.\"\n },\n {\n \"name\": \"canvas\",\n \"description\": \"Execute a design-canvas command\",\n \"usage\": \"npx opendevbrowser canvas --command <canvas.command> [--params <json> | --params-file <path>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--command\",\n \"--params\",\n \"--params-file\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser canvas --command canvas.session.open --params '{\\\"label\\\":\\\"design review\\\"}' --timeout-ms 120000 --output-format json\"\n ],\n \"notes\": [\n \"Use --params-file for strict request envelopes such as canvas.plan.set or governance handoff payloads.\"\n ],\n \"groupId\": \"design_canvas\",\n \"groupTitle\": \"Design Canvas\",\n \"groupSummary\": \"Execute typed /canvas commands for session, document, preview, and code-sync flows.\"\n },\n {\n \"name\": \"goto\",\n \"description\": \"Navigate current session to a URL\",\n \"usage\": \"npx opendevbrowser goto --session-id <id> --url <url> [--wait-until <state>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--url\",\n \"--wait-until\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser goto --session-id s1 --url https://example.com --wait-until networkidle --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"navigation\",\n \"groupTitle\": \"Navigation\",\n \"groupSummary\": \"Move through pages and capture fresh refs.\"\n },\n {\n \"name\": \"wait\",\n \"description\": \"Wait for load or a ref to appear\",\n \"usage\": \"npx opendevbrowser wait --session-id <id> [--ref <ref>] [--state <state>|--until <condition>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--state\",\n \"--until\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser wait --session-id s1 --state networkidle --timeout-ms 30000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"navigation\",\n \"groupTitle\": \"Navigation\",\n \"groupSummary\": \"Move through pages and capture fresh refs.\"\n },\n {\n \"name\": \"snapshot\",\n \"description\": \"Capture a snapshot of the active page\",\n \"usage\": \"npx opendevbrowser snapshot --session-id <id> [--mode <mode>] [--max-chars <n>] [--cursor <cursor>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--mode\",\n \"--max-chars\",\n \"--cursor\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser snapshot --session-id s1 --mode actionables --max-chars 4000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"navigation\",\n \"groupTitle\": \"Navigation\",\n \"groupSummary\": \"Move through pages and capture fresh refs.\"\n },\n {\n \"name\": \"review\",\n \"description\": \"Capture a first-class review payload for the active page\",\n \"usage\": \"npx opendevbrowser review --session-id <id> [--target-id <id>] [--max-chars <n>] [--cursor <cursor>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--max-chars\",\n \"--cursor\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser review --session-id s1 --target-id page-1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"navigation\",\n \"groupTitle\": \"Navigation\",\n \"groupSummary\": \"Move through pages and capture fresh refs.\"\n },\n {\n \"name\": \"review-desktop\",\n \"description\": \"Capture desktop-assisted browser review with read-only desktop evidence\",\n \"usage\": \"npx opendevbrowser review-desktop --session-id <id> [--target-id <id>] [--reason <text>] [--max-chars <n>] [--cursor <cursor>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--reason\",\n \"--max-chars\",\n \"--cursor\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser review-desktop --session-id s1 --reason \\\"trace challenge state\\\" --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"navigation\",\n \"groupTitle\": \"Navigation\",\n \"groupSummary\": \"Move through pages and capture fresh refs.\"\n },\n {\n \"name\": \"click\",\n \"description\": \"Click an element by ref\",\n \"usage\": \"npx opendevbrowser click --session-id <id> --ref <ref> [--target-id <id>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--target-id\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser click --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"hover\",\n \"description\": \"Hover an element by ref\",\n \"usage\": \"npx opendevbrowser hover --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser hover --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"press\",\n \"description\": \"Press a keyboard key\",\n \"usage\": \"npx opendevbrowser press --session-id <id> --key <key> [--ref <ref>]\",\n \"flags\": [\n \"--session-id\",\n \"--key\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser press --session-id s1 --key Enter --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"check\",\n \"description\": \"Check a checkbox by ref\",\n \"usage\": \"npx opendevbrowser check --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser check --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"uncheck\",\n \"description\": \"Uncheck a checkbox by ref\",\n \"usage\": \"npx opendevbrowser uncheck --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser uncheck --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"type\",\n \"description\": \"Type into an element by ref\",\n \"usage\": \"npx opendevbrowser type --session-id <id> --ref <ref> --text <text> [--clear] [--submit]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--text\",\n \"--clear\",\n \"--submit\"\n ],\n \"examples\": [\n \"npx opendevbrowser type --session-id s1 --ref r12 --text \\\"agent@example.com\\\" --clear --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"select\",\n \"description\": \"Select values in a select by ref\",\n \"usage\": \"npx opendevbrowser select --session-id <id> --ref <ref> --values <csv>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--values\"\n ],\n \"examples\": [\n \"npx opendevbrowser select --session-id s1 --ref r12 --values us,ca --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Scroll the page or element by ref\",\n \"usage\": \"npx opendevbrowser scroll --session-id <id> --dy <pixels> [--ref <ref>]\",\n \"flags\": [\n \"--session-id\",\n \"--dy\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser scroll --session-id s1 --dy 1000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"scroll-into-view\",\n \"description\": \"Scroll an element into view by ref\",\n \"usage\": \"npx opendevbrowser scroll-into-view --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser scroll-into-view --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"upload\",\n \"description\": \"Upload files to a file input or chooser by ref\",\n \"usage\": \"npx opendevbrowser upload --session-id <id> --ref <ref> --files <csv> [--target-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--files\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser upload --session-id s1 --ref r12 --files ./draft.pdf,./hero.png --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"pointer-move\",\n \"description\": \"Move the pointer to viewport coordinates\",\n \"usage\": \"npx opendevbrowser pointer-move --session-id <id> --x <n> --y <n> [--steps <n>] [--target-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--x\",\n \"--y\",\n \"--steps\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser pointer-move --session-id s1 --x 320 --y 240 --steps 12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"pointer-down\",\n \"description\": \"Press a mouse button at viewport coordinates\",\n \"usage\": \"npx opendevbrowser pointer-down --session-id <id> --x <n> --y <n> [--button <left|middle|right>] [--click-count <n>] [--target-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--x\",\n \"--y\",\n \"--button\",\n \"--click-count\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser pointer-down --session-id s1 --x 320 --y 240 --button left --click-count 1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"pointer-up\",\n \"description\": \"Release a mouse button at viewport coordinates\",\n \"usage\": \"npx opendevbrowser pointer-up --session-id <id> --x <n> --y <n> [--button <left|middle|right>] [--click-count <n>] [--target-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--x\",\n \"--y\",\n \"--button\",\n \"--click-count\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser pointer-up --session-id s1 --x 320 --y 240 --button left --click-count 1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"pointer-drag\",\n \"description\": \"Drag the pointer between two viewport coordinates\",\n \"usage\": \"npx opendevbrowser pointer-drag --session-id <id> --from-x <n> --from-y <n> --to-x <n> --to-y <n> [--steps <n>] [--target-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--from-x\",\n \"--from-y\",\n \"--to-x\",\n \"--to-y\",\n \"--steps\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser pointer-drag --session-id s1 --from-x 320 --from-y 240 --to-x 640 --to-y 240 --steps 18 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"interaction\",\n \"groupTitle\": \"Interaction\",\n \"groupSummary\": \"Perform ref-based interactions in the active page.\"\n },\n {\n \"name\": \"targets-list\",\n \"description\": \"List page targets\",\n \"usage\": \"npx opendevbrowser targets-list --session-id <id> [--include-urls]\",\n \"flags\": [\n \"--session-id\",\n \"--include-urls\"\n ],\n \"examples\": [\n \"npx opendevbrowser targets-list --session-id s1 --include-urls --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"target-use\",\n \"description\": \"Focus a target by id\",\n \"usage\": \"npx opendevbrowser target-use --session-id <id> --target-id <id>\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser target-use --session-id s1 --target-id page-2 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"target-new\",\n \"description\": \"Open a new target\",\n \"usage\": \"npx opendevbrowser target-new --session-id <id> [--url <url>]\",\n \"flags\": [\n \"--session-id\",\n \"--url\"\n ],\n \"examples\": [\n \"npx opendevbrowser target-new --session-id s1 --url https://example.com/docs --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"target-close\",\n \"description\": \"Close a target by id\",\n \"usage\": \"npx opendevbrowser target-close --session-id <id> --target-id <id>\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser target-close --session-id s1 --target-id page-2 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Open or focus a named page\",\n \"usage\": \"npx opendevbrowser page --session-id <id> --name <page> [--url <url>]\",\n \"flags\": [\n \"--session-id\",\n \"--name\",\n \"--url\"\n ],\n \"examples\": [\n \"npx opendevbrowser page --session-id s1 --name settings --url https://example.com/settings --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"pages\",\n \"description\": \"List named pages\",\n \"usage\": \"npx opendevbrowser pages --session-id <id>\",\n \"flags\": [\n \"--session-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser pages --session-id s1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"page-close\",\n \"description\": \"Close a named page\",\n \"usage\": \"npx opendevbrowser page-close --session-id <id> --name <page>\",\n \"flags\": [\n \"--session-id\",\n \"--name\"\n ],\n \"examples\": [\n \"npx opendevbrowser page-close --session-id s1 --name settings --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"targets_pages\",\n \"groupTitle\": \"Targets & Pages\",\n \"groupSummary\": \"Manage tabs, targets, and named pages.\"\n },\n {\n \"name\": \"dom-html\",\n \"description\": \"Capture HTML for a ref\",\n \"usage\": \"npx opendevbrowser dom-html --session-id <id> [--ref <ref>] [--max-chars <n>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--max-chars\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-html --session-id s1 --ref r12 --max-chars 2000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-text\",\n \"description\": \"Capture text for a ref\",\n \"usage\": \"npx opendevbrowser dom-text --session-id <id> [--ref <ref>] [--max-chars <n>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--max-chars\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-text --session-id s1 --ref r12 --max-chars 500 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-attr\",\n \"description\": \"Capture attribute value for a ref\",\n \"usage\": \"npx opendevbrowser dom-attr --session-id <id> --ref <ref> --attr <name>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--attr\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-attr --session-id s1 --ref r12 --attr aria-label --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-value\",\n \"description\": \"Capture input value for a ref\",\n \"usage\": \"npx opendevbrowser dom-value --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-value --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-visible\",\n \"description\": \"Check visibility for a ref\",\n \"usage\": \"npx opendevbrowser dom-visible --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-visible --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-enabled\",\n \"description\": \"Check enabled state for a ref\",\n \"usage\": \"npx opendevbrowser dom-enabled --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-enabled --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"dom-checked\",\n \"description\": \"Check checked state for a ref\",\n \"usage\": \"npx opendevbrowser dom-checked --session-id <id> --ref <ref>\",\n \"flags\": [\n \"--session-id\",\n \"--ref\"\n ],\n \"examples\": [\n \"npx opendevbrowser dom-checked --session-id s1 --ref r12 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"clone-page\",\n \"description\": \"Clone the active page to React\",\n \"usage\": \"npx opendevbrowser clone-page --session-id <id> [--target-id <id>] [--path <file>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--path\"\n ],\n \"examples\": [\n \"npx opendevbrowser clone-page --session-id s1 --target-id page-1 --path ./exports/page.tsx --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"clone-component\",\n \"description\": \"Clone a component by ref\",\n \"usage\": \"npx opendevbrowser clone-component --session-id <id> --ref <ref> [--target-id <id>] [--path <file>]\",\n \"flags\": [\n \"--session-id\",\n \"--ref\",\n \"--target-id\",\n \"--path\"\n ],\n \"examples\": [\n \"npx opendevbrowser clone-component --session-id s1 --ref r12 --path ./exports/component.tsx --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"dom_export\",\n \"groupTitle\": \"DOM & Export\",\n \"groupSummary\": \"Read DOM state and export page or component code.\"\n },\n {\n \"name\": \"session-inspector\",\n \"description\": \"Capture a session-first diagnostic summary with relay health and trace proof\",\n \"usage\": \"npx opendevbrowser session-inspector --session-id <id> [--include-urls] [--since-console-seq <n>] [--since-network-seq <n>] [--since-exception-seq <n>] [--max <n>] [--request-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--include-urls\",\n \"--since-console-seq\",\n \"--since-network-seq\",\n \"--since-exception-seq\",\n \"--max\",\n \"--request-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser session-inspector --session-id s1 --include-urls --max 20 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"session-inspector-plan\",\n \"description\": \"Inspect browser-scoped computer-use policy and safe suggested steps\",\n \"usage\": \"npx opendevbrowser session-inspector-plan --session-id <id> [--target-id <id>] [--challenge-automation-mode <mode>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--challenge-automation-mode\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --output-format json\"\n ],\n \"notes\": [\n \"Inspect browser-scoped challenge automation before enabling browser_with_helper on a live rerun.\"\n ],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"session-inspector-audit\",\n \"description\": \"Capture a correlated audit bundle across desktop evidence, browser review, and policy state\",\n \"usage\": \"npx opendevbrowser session-inspector-audit --session-id <id> [--target-id <id>] [--reason <text>] [--max-chars <n>] [--cursor <cursor>] [--include-urls] [--since-console-seq <n>] [--since-network-seq <n>] [--since-exception-seq <n>] [--max <n>] [--request-id <id>] [--challenge-automation-mode <mode>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--reason\",\n \"--max-chars\",\n \"--cursor\",\n \"--include-urls\",\n \"--since-console-seq\",\n \"--since-network-seq\",\n \"--since-exception-seq\",\n \"--max\",\n \"--request-id\",\n \"--challenge-automation-mode\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser session-inspector-audit --session-id s1 --target-id page-1 --reason \\\"trace challenge state\\\" --include-urls --request-id req-session-audit-001 --challenge-automation-mode browser_with_helper --output-format json\"\n ],\n \"notes\": [\n \"Audit mode is the quickest correlated proof lane when you need desktop evidence plus browser trace state.\"\n ],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"perf\",\n \"description\": \"Capture performance metrics\",\n \"usage\": \"npx opendevbrowser perf --session-id <id>\",\n \"flags\": [\n \"--session-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser perf --session-id s1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"screenshot\",\n \"description\": \"Capture a screenshot\",\n \"usage\": \"npx opendevbrowser screenshot --session-id <id> [--target-id <id>] [--path <file>] [--ref <ref> | --full-page] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--path\",\n \"--ref\",\n \"--full-page\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser screenshot --session-id s1 --path ./artifacts/page.png --full-page --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"dialog\",\n \"description\": \"Inspect or handle a JavaScript dialog\",\n \"usage\": \"npx opendevbrowser dialog --session-id <id> [--target-id <id>] [--action <status|accept|dismiss>] [--prompt-text <text>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--action\",\n \"--prompt-text\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser dialog --session-id s1 --action status --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"console-poll\",\n \"description\": \"Poll console events\",\n \"usage\": \"npx opendevbrowser console-poll --session-id <id> [--since-seq <n>] [--max <n>]\",\n \"flags\": [\n \"--session-id\",\n \"--since-seq\",\n \"--max\"\n ],\n \"examples\": [\n \"npx opendevbrowser console-poll --session-id s1 --max 50 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"network-poll\",\n \"description\": \"Poll network events\",\n \"usage\": \"npx opendevbrowser network-poll --session-id <id> [--since-seq <n>] [--max <n>]\",\n \"flags\": [\n \"--session-id\",\n \"--since-seq\",\n \"--max\"\n ],\n \"examples\": [\n \"npx opendevbrowser network-poll --session-id s1 --max 50 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"debug-trace-snapshot\",\n \"description\": \"Capture page + console + network + exception diagnostics\",\n \"usage\": \"npx opendevbrowser debug-trace-snapshot --session-id <id> [--since-console-seq <n>] [--since-network-seq <n>] [--since-exception-seq <n>] [--max <n>] [--request-id <id>]\",\n \"flags\": [\n \"--session-id\",\n \"--since-console-seq\",\n \"--since-network-seq\",\n \"--since-exception-seq\",\n \"--max\",\n \"--request-id\"\n ],\n \"examples\": [\n \"npx opendevbrowser debug-trace-snapshot --session-id s1 --max 50 --request-id req-trace-001 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"annotate\",\n \"description\": \"Request interactive annotations via direct or relay transport\",\n \"usage\": \"npx opendevbrowser annotate --session-id <id> [--url <url>] [--transport <auto|direct|relay>] [--target-id <id>] [--tab-id <tab>] [--screenshot-mode <visible|full|none>] [--context <text>] [--debug] [--stored] [--include-screenshots <bool>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--url\",\n \"--transport\",\n \"--target-id\",\n \"--tab-id\",\n \"--screenshot-mode\",\n \"--context\",\n \"--debug\",\n \"--stored\",\n \"--include-screenshots\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser annotate --session-id s1 --transport auto --context \\\"review call to action spacing\\\" --include-screenshots true --output-format json\"\n ],\n \"notes\": [\n \"Use --stored when you want the last delivered annotation payload without starting a new capture.\"\n ],\n \"groupId\": \"diagnostics_annotation\",\n \"groupTitle\": \"Diagnostics & Annotation\",\n \"groupSummary\": \"Collect session-centric diagnostics, trace proof, and annotation payloads.\"\n },\n {\n \"name\": \"screencast-start\",\n \"description\": \"Start a browser replay screencast capture\",\n \"usage\": \"npx opendevbrowser screencast-start --session-id <id> [--target-id <id>] [--output-dir <path>] [--interval-ms <ms>] [--max-frames <n>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--target-id\",\n \"--output-dir\",\n \"--interval-ms\",\n \"--max-frames\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser screencast-start --session-id s1 --output-dir ./artifacts/replay --interval-ms 750 --max-frames 40 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"browser_replay\",\n \"groupTitle\": \"Browser Replay\",\n \"groupSummary\": \"Capture temporal replay artifacts through the public browser replay lane for a browser target.\"\n },\n {\n \"name\": \"screencast-stop\",\n \"description\": \"Stop a browser replay screencast capture\",\n \"usage\": \"npx opendevbrowser screencast-stop --session-id <id> --screencast-id <id> [--timeout-ms <ms>]\",\n \"flags\": [\n \"--session-id\",\n \"--screencast-id\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser screencast-stop --session-id s1 --screencast-id cast-1 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"browser_replay\",\n \"groupTitle\": \"Browser Replay\",\n \"groupSummary\": \"Capture temporal replay artifacts through the public browser replay lane for a browser target.\"\n },\n {\n \"name\": \"desktop-status\",\n \"description\": \"Inspect public read-only desktop observation availability\",\n \"usage\": \"npx opendevbrowser desktop-status [--timeout-ms <ms>]\",\n \"flags\": [\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-status --timeout-ms 5000 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"desktop-windows\",\n \"description\": \"List windows exposed by the public read-only desktop observation plane\",\n \"usage\": \"npx opendevbrowser desktop-windows [--reason <text>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--reason\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-windows --reason \\\"inventory browser-adjacent windows\\\" --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"desktop-active-window\",\n \"description\": \"Inspect the active window through the public read-only desktop observation plane\",\n \"usage\": \"npx opendevbrowser desktop-active-window [--reason <text>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--reason\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-active-window --reason \\\"capture active browser context\\\" --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"desktop-capture-desktop\",\n \"description\": \"Capture the current desktop surface through the public read-only desktop observation plane\",\n \"usage\": \"npx opendevbrowser desktop-capture-desktop --reason <text> [--timeout-ms <ms>]\",\n \"flags\": [\n \"--reason\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-capture-desktop --reason \\\"capture login checkpoint state\\\" --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"desktop-capture-window\",\n \"description\": \"Capture a specific window through the public read-only desktop observation plane\",\n \"usage\": \"npx opendevbrowser desktop-capture-window --window-id <id> --reason <text> [--timeout-ms <ms>]\",\n \"flags\": [\n \"--window-id\",\n \"--reason\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-capture-window --window-id 101 --reason \\\"capture browser window\\\" --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"desktop-accessibility-snapshot\",\n \"description\": \"Capture desktop accessibility state through the public read-only desktop observation plane\",\n \"usage\": \"npx opendevbrowser desktop-accessibility-snapshot --reason <text> [--window-id <id>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--reason\",\n \"--window-id\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser desktop-accessibility-snapshot --reason \\\"inspect current browser-adjacent labels\\\" --window-id 101 --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"desktop_observation\",\n \"groupTitle\": \"Desktop Observation\",\n \"groupSummary\": \"Inspect the public read-only sibling desktop observation plane on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\"\n },\n {\n \"name\": \"rpc\",\n \"description\": \"Execute an internal daemon RPC command (power-user)\",\n \"usage\": \"npx opendevbrowser rpc --unsafe-internal --name <daemon.command> [--params <json> | --params-file <path>] [--timeout-ms <ms>]\",\n \"flags\": [\n \"--unsafe-internal\",\n \"--name\",\n \"--params\",\n \"--params-file\",\n \"--timeout-ms\"\n ],\n \"examples\": [\n \"npx opendevbrowser rpc --unsafe-internal --name browser.status --params-file ./rpc-params.json --output-format json\"\n ],\n \"notes\": [],\n \"groupId\": \"power\",\n \"groupTitle\": \"Power\",\n \"groupSummary\": \"Unsafe internal daemon passthrough.\"\n }\n ],\n \"flags\": [\n {\n \"name\": \"--global\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--local\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--update\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--uninstall\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--help\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--version\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--with-config\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--no-prompt\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--no-interactive\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--quiet\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--output-format\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--full\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--port\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--token\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--stop\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--script\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--headless\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--profile\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--persist-profile\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--chrome-path\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--start-url\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--flag\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--session-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--close-browser\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--ws-endpoint\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--host\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--cdp-port\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--url\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--wait-until\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--timeout-ms\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--ref\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--state\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--until\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--mode\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--max-chars\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--cursor\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--text\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--clear\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--submit\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--values\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--files\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--dy\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--key\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--attr\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--x\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--y\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--from-x\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--from-y\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--to-x\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--to-y\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--steps\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--button\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--click-count\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--name\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--target-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--window-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--tab-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-urls\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--path\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--screencast-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--reason\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--full-page\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--action\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--prompt-text\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--since-seq\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--max\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--interval-ms\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--max-frames\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--since-console-seq\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--since-network-seq\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--since-exception-seq\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--request-id\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--cookies\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--cookies-file\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--strict\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--expression\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--default-provider\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-catalog\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--command\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--execute\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--params\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--params-file\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--unsafe-internal\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--daemon\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--transport\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--no-extension\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--extension-only\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--extension-legacy\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--wait-for-extension\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--wait-timeout-ms\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--skills-global\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--skills-local\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--no-skills\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--screenshot-mode\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--debug\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--context\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--stored\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--topic\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--days\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--from\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--to\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--source-selection\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--sources\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-engagement\",\n \"kind\": \"boolean\"\n },\n {\n \"name\": \"--limit-per-source\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--query\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--providers\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--budget\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--region\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--browser-mode\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--sort\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--brief\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--capture-mode\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-prototype-guidance\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--product-url\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--product-name\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--provider-hint\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-screenshots\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-all-images\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--include-copy\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--use-cookies\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--challenge-automation-mode\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--cookie-policy-override\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--cookie-policy\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--output-dir\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--ttl-hours\",\n \"kind\": \"value\"\n },\n {\n \"name\": \"--expired-only\",\n \"kind\": \"boolean\"\n }\n ],\n \"equalsFlags\": [\n \"--output-format\",\n \"--transport\",\n \"--session-id\",\n \"--url\",\n \"--screenshot-mode\",\n \"--context\",\n \"--timeout-ms\",\n \"--since-seq\",\n \"--since-console-seq\",\n \"--since-network-seq\",\n \"--since-exception-seq\",\n \"--max\",\n \"--dy\",\n \"--target-id\",\n \"--window-id\",\n \"--tab-id\",\n \"--name\",\n \"--cookies\",\n \"--cookies-file\",\n \"--persist-profile\",\n \"--expression\",\n \"--default-provider\",\n \"--command\",\n \"--request-id\",\n \"--strict\",\n \"--params\",\n \"--params-file\",\n \"--topic\",\n \"--days\",\n \"--from\",\n \"--to\",\n \"--source-selection\",\n \"--sources\",\n \"--mode\",\n \"--ref\",\n \"--path\",\n \"--screencast-id\",\n \"--reason\",\n \"--interval-ms\",\n \"--max-frames\",\n \"--max-chars\",\n \"--cursor\",\n \"--files\",\n \"--action\",\n \"--prompt-text\",\n \"--limit-per-source\",\n \"--query\",\n \"--providers\",\n \"--budget\",\n \"--region\",\n \"--sort\",\n \"--brief\",\n \"--capture-mode\",\n \"--product-url\",\n \"--product-name\",\n \"--provider-hint\",\n \"--include-prototype-guidance\",\n \"--x\",\n \"--y\",\n \"--from-x\",\n \"--from-y\",\n \"--to-x\",\n \"--to-y\",\n \"--steps\",\n \"--button\",\n \"--click-count\",\n \"--include-screenshots\",\n \"--include-all-images\",\n \"--include-copy\",\n \"--use-cookies\",\n \"--browser-mode\",\n \"--challenge-automation-mode\",\n \"--cookie-policy-override\",\n \"--cookie-policy\",\n \"--output-dir\",\n \"--ttl-hours\"\n ]\n },\n \"tools\": {\n \"entries\": [\n {\n \"name\": \"opendevbrowser_launch\",\n \"description\": \"Launch a managed browser session.\",\n \"cliEquivalent\": \"launch\",\n \"example\": \"npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_connect\",\n \"description\": \"Connect to an existing browser session.\",\n \"cliEquivalent\": \"connect\",\n \"example\": \"npx opendevbrowser connect --host 127.0.0.1 --cdp-port 9222 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_disconnect\",\n \"description\": \"Disconnect a managed or connected session.\",\n \"cliEquivalent\": \"disconnect\",\n \"example\": \"npx opendevbrowser disconnect --session-id s1 --close-browser --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_status\",\n \"description\": \"Inspect session and relay status.\",\n \"cliEquivalent\": \"status\",\n \"example\": \"npx opendevbrowser status --daemon --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_status_capabilities\",\n \"description\": \"Inspect runtime capability discovery for the host and an optional session.\",\n \"cliEquivalent\": \"status-capabilities\",\n \"example\": \"npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --timeout-ms 30000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_session_inspector\",\n \"description\": \"Capture a session-first diagnostic bundle with relay health, trace proof, and a suggested next action.\",\n \"cliEquivalent\": \"session-inspector\",\n \"example\": \"npx opendevbrowser session-inspector --session-id s1 --include-urls --max 20 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_session_inspector_plan\",\n \"description\": \"Inspect browser-scoped computer-use policy, eligibility, and safe suggested steps.\",\n \"cliEquivalent\": \"session-inspector-plan\",\n \"example\": \"npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_session_inspector_audit\",\n \"description\": \"Capture a correlated audit bundle across desktop evidence, browser review, and policy state.\",\n \"cliEquivalent\": \"session-inspector-audit\",\n \"example\": \"npx opendevbrowser session-inspector-audit --session-id s1 --target-id page-1 --reason \\\"trace challenge state\\\" --include-urls --request-id req-session-audit-001 --challenge-automation-mode browser_with_helper --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_targets_list\",\n \"description\": \"List available page targets/tabs.\",\n \"cliEquivalent\": \"targets-list\",\n \"example\": \"npx opendevbrowser targets-list --session-id s1 --include-urls --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_target_use\",\n \"description\": \"Switch the active target by id.\",\n \"cliEquivalent\": \"target-use\",\n \"example\": \"npx opendevbrowser target-use --session-id s1 --target-id page-2 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_target_new\",\n \"description\": \"Create a new target or tab.\",\n \"cliEquivalent\": \"target-new\",\n \"example\": \"npx opendevbrowser target-new --session-id s1 --url https://example.com/docs --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_target_close\",\n \"description\": \"Close a target or tab by id.\",\n \"cliEquivalent\": \"target-close\",\n \"example\": \"npx opendevbrowser target-close --session-id s1 --target-id page-2 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_page\",\n \"description\": \"Open or focus a named page.\",\n \"cliEquivalent\": \"page\",\n \"example\": \"npx opendevbrowser page --session-id s1 --name settings --url https://example.com/settings --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_list\",\n \"description\": \"List named pages in the session.\",\n \"cliEquivalent\": \"pages\",\n \"example\": \"npx opendevbrowser pages --session-id s1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_close\",\n \"description\": \"Close a named page.\",\n \"cliEquivalent\": \"page-close\",\n \"example\": \"npx opendevbrowser page-close --session-id s1 --name settings --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_goto\",\n \"description\": \"Navigate to a URL.\",\n \"cliEquivalent\": \"goto\",\n \"example\": \"npx opendevbrowser goto --session-id s1 --url https://example.com --wait-until networkidle --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_wait\",\n \"description\": \"Wait for load, ref, or state conditions.\",\n \"cliEquivalent\": \"wait\",\n \"example\": \"npx opendevbrowser wait --session-id s1 --state networkidle --timeout-ms 30000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_snapshot\",\n \"description\": \"Capture AX-tree refs for actions.\",\n \"cliEquivalent\": \"snapshot\",\n \"example\": \"npx opendevbrowser snapshot --session-id s1 --mode actionables --max-chars 4000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_review\",\n \"description\": \"Capture a first-class review payload with status and actionables.\",\n \"cliEquivalent\": \"review\",\n \"example\": \"npx opendevbrowser review --session-id s1 --target-id page-1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_review_desktop\",\n \"description\": \"Capture desktop-assisted browser review with read-only desktop evidence and browser-owned verification.\",\n \"cliEquivalent\": \"review-desktop\",\n \"example\": \"npx opendevbrowser review-desktop --session-id s1 --reason \\\"trace challenge state\\\" --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_click\",\n \"description\": \"Click an element by ref.\",\n \"cliEquivalent\": \"click\",\n \"example\": \"npx opendevbrowser click --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_hover\",\n \"description\": \"Hover an element by ref.\",\n \"cliEquivalent\": \"hover\",\n \"example\": \"npx opendevbrowser hover --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_press\",\n \"description\": \"Send a keyboard key.\",\n \"cliEquivalent\": \"press\",\n \"example\": \"npx opendevbrowser press --session-id s1 --key Enter --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_check\",\n \"description\": \"Check a checkbox or radio by ref.\",\n \"cliEquivalent\": \"check\",\n \"example\": \"npx opendevbrowser check --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_uncheck\",\n \"description\": \"Uncheck a checkbox or radio by ref.\",\n \"cliEquivalent\": \"uncheck\",\n \"example\": \"npx opendevbrowser uncheck --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_type\",\n \"description\": \"Type text into an input by ref.\",\n \"cliEquivalent\": \"type\",\n \"example\": \"npx opendevbrowser type --session-id s1 --ref r12 --text \\\"agent@example.com\\\" --clear --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_select\",\n \"description\": \"Set select values by ref.\",\n \"cliEquivalent\": \"select\",\n \"example\": \"npx opendevbrowser select --session-id s1 --ref r12 --values us,ca --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_scroll\",\n \"description\": \"Scroll a page or element.\",\n \"cliEquivalent\": \"scroll\",\n \"example\": \"npx opendevbrowser scroll --session-id s1 --dy 1000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_scroll_into_view\",\n \"description\": \"Scroll a target element into view.\",\n \"cliEquivalent\": \"scroll-into-view\",\n \"example\": \"npx opendevbrowser scroll-into-view --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_upload\",\n \"description\": \"Upload files to a file input or chooser by ref.\",\n \"cliEquivalent\": \"upload\",\n \"example\": \"npx opendevbrowser upload --session-id s1 --ref r12 --files ./draft.pdf,./hero.png --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_pointer_move\",\n \"description\": \"Move the pointer to viewport coordinates.\",\n \"cliEquivalent\": \"pointer-move\",\n \"example\": \"npx opendevbrowser pointer-move --session-id s1 --x 320 --y 240 --steps 12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_pointer_down\",\n \"description\": \"Press a mouse button at viewport coordinates.\",\n \"cliEquivalent\": \"pointer-down\",\n \"example\": \"npx opendevbrowser pointer-down --session-id s1 --x 320 --y 240 --button left --click-count 1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_pointer_up\",\n \"description\": \"Release a mouse button at viewport coordinates.\",\n \"cliEquivalent\": \"pointer-up\",\n \"example\": \"npx opendevbrowser pointer-up --session-id s1 --x 320 --y 240 --button left --click-count 1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_pointer_drag\",\n \"description\": \"Drag the pointer between viewport coordinates.\",\n \"cliEquivalent\": \"pointer-drag\",\n \"example\": \"npx opendevbrowser pointer-drag --session-id s1 --from-x 320 --from-y 240 --to-x 640 --to-y 240 --steps 18 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_dom_get_html\",\n \"description\": \"Get HTML for a page or ref.\",\n \"cliEquivalent\": \"dom-html\",\n \"example\": \"npx opendevbrowser dom-html --session-id s1 --ref r12 --max-chars 2000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_dom_get_text\",\n \"description\": \"Get text for a page or ref.\",\n \"cliEquivalent\": \"dom-text\",\n \"example\": \"npx opendevbrowser dom-text --session-id s1 --ref r12 --max-chars 500 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_get_attr\",\n \"description\": \"Read a DOM attribute by ref.\",\n \"cliEquivalent\": \"dom-attr\",\n \"example\": \"npx opendevbrowser dom-attr --session-id s1 --ref r12 --attr aria-label --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_get_value\",\n \"description\": \"Read a form or control value by ref.\",\n \"cliEquivalent\": \"dom-value\",\n \"example\": \"npx opendevbrowser dom-value --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_is_visible\",\n \"description\": \"Check ref visibility.\",\n \"cliEquivalent\": \"dom-visible\",\n \"example\": \"npx opendevbrowser dom-visible --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_is_enabled\",\n \"description\": \"Check ref enabled state.\",\n \"cliEquivalent\": \"dom-enabled\",\n \"example\": \"npx opendevbrowser dom-enabled --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_is_checked\",\n \"description\": \"Check ref checked state.\",\n \"cliEquivalent\": \"dom-checked\",\n \"example\": \"npx opendevbrowser dom-checked --session-id s1 --ref r12 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_run\",\n \"description\": \"Execute multi-action automation scripts.\",\n \"cliEquivalent\": \"run\",\n \"example\": \"npx opendevbrowser run --script ./workflow.json --headless --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_prompting_guide\",\n \"description\": \"Start here for first-contact OpenDevBrowser guidance and the bundled best-practices quick start.\",\n \"example\": \"{\\\"topic\\\":\\\"quick start\\\"}\",\n \"notes\": [\n \"Tool-only helper. Use it before low-level browser commands when an agent needs the canonical quick start.\"\n ]\n },\n {\n \"name\": \"opendevbrowser_console_poll\",\n \"description\": \"Poll redacted console events.\",\n \"cliEquivalent\": \"console-poll\",\n \"example\": \"npx opendevbrowser console-poll --session-id s1 --max 50 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_network_poll\",\n \"description\": \"Poll redacted network events.\",\n \"cliEquivalent\": \"network-poll\",\n \"example\": \"npx opendevbrowser network-poll --session-id s1 --max 50 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_debug_trace_snapshot\",\n \"description\": \"Capture page, console, and network diagnostics.\",\n \"cliEquivalent\": \"debug-trace-snapshot\",\n \"example\": \"npx opendevbrowser debug-trace-snapshot --session-id s1 --max 50 --request-id req-trace-001 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_cookie_import\",\n \"description\": \"Import validated cookies into a session.\",\n \"cliEquivalent\": \"cookie-import\",\n \"example\": \"npx opendevbrowser cookie-import --session-id s1 --cookies-file ./cookies.json --strict true --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_cookie_list\",\n \"description\": \"List cookies in a session with optional URL filters.\",\n \"cliEquivalent\": \"cookie-list\",\n \"example\": \"npx opendevbrowser cookie-list --session-id s1 --url https://example.com --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_macro_resolve\",\n \"description\": \"Resolve or execute provider macro expressions.\",\n \"cliEquivalent\": \"macro-resolve\",\n \"example\": \"npx opendevbrowser macro-resolve --expression '@community.search(\\\"browser automation failures\\\", 4)' --execute --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_research_run\",\n \"description\": \"Run the research workflow directly.\",\n \"cliEquivalent\": \"research\",\n \"example\": \"npx opendevbrowser research run --topic \\\"Chrome extension debugging workflows\\\" --days 30 --sources web,community --browser-mode managed --mode json --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_shopping_run\",\n \"description\": \"Run the shopping workflow directly.\",\n \"cliEquivalent\": \"shopping\",\n \"example\": \"npx opendevbrowser shopping run --query \\\"wireless ergonomic mouse\\\" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_product_video_run\",\n \"description\": \"Run the product-video asset workflow directly.\",\n \"cliEquivalent\": \"product-video\",\n \"example\": \"npx opendevbrowser product-video run --product-url \\\"https://example.com/p/1\\\" --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-screenshots --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_inspiredesign_run\",\n \"description\": \"Run the inspiredesign workflow directly.\",\n \"cliEquivalent\": \"inspiredesign\",\n \"example\": \"npx opendevbrowser inspiredesign run --brief \\\"Extract a reusable dashboard design contract from live references\\\" --url https://linear.app --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_canvas\",\n \"description\": \"Execute a typed design-canvas command surface call.\",\n \"cliEquivalent\": \"canvas\",\n \"example\": \"npx opendevbrowser canvas --command canvas.session.open --params '{\\\"label\\\":\\\"design review\\\"}' --timeout-ms 120000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_clone_page\",\n \"description\": \"Export the active page into React code.\",\n \"cliEquivalent\": \"clone-page\",\n \"example\": \"npx opendevbrowser clone-page --session-id s1 --target-id page-1 --path ./exports/page.tsx --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_clone_component\",\n \"description\": \"Export a component by ref into React code.\",\n \"cliEquivalent\": \"clone-component\",\n \"example\": \"npx opendevbrowser clone-component --session-id s1 --ref r12 --path ./exports/component.tsx --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_perf\",\n \"description\": \"Collect browser performance metrics.\",\n \"cliEquivalent\": \"perf\",\n \"example\": \"npx opendevbrowser perf --session-id s1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_screenshot\",\n \"description\": \"Capture a page screenshot.\",\n \"cliEquivalent\": \"screenshot\",\n \"example\": \"npx opendevbrowser screenshot --session-id s1 --path ./artifacts/page.png --full-page --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_screencast_start\",\n \"description\": \"Start a browser replay screencast capture.\",\n \"cliEquivalent\": \"screencast-start\",\n \"example\": \"npx opendevbrowser screencast-start --session-id s1 --output-dir ./artifacts/replay --interval-ms 750 --max-frames 40 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_screencast_stop\",\n \"description\": \"Stop a browser replay screencast capture.\",\n \"cliEquivalent\": \"screencast-stop\",\n \"example\": \"npx opendevbrowser screencast-stop --session-id s1 --screencast-id cast-1 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_dialog\",\n \"description\": \"Inspect or handle a JavaScript dialog.\",\n \"cliEquivalent\": \"dialog\",\n \"example\": \"npx opendevbrowser dialog --session-id s1 --action status --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_status\",\n \"description\": \"Inspect public read-only desktop observation availability.\",\n \"cliEquivalent\": \"desktop-status\",\n \"example\": \"npx opendevbrowser desktop-status --timeout-ms 5000 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_windows\",\n \"description\": \"List windows exposed by the public read-only desktop observation plane.\",\n \"cliEquivalent\": \"desktop-windows\",\n \"example\": \"npx opendevbrowser desktop-windows --reason \\\"inventory browser-adjacent windows\\\" --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_active_window\",\n \"description\": \"Inspect the active window through the public read-only desktop observation plane.\",\n \"cliEquivalent\": \"desktop-active-window\",\n \"example\": \"npx opendevbrowser desktop-active-window --reason \\\"capture active browser context\\\" --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_capture_desktop\",\n \"description\": \"Capture the current desktop surface through the public read-only desktop observation plane.\",\n \"cliEquivalent\": \"desktop-capture-desktop\",\n \"example\": \"npx opendevbrowser desktop-capture-desktop --reason \\\"capture login checkpoint state\\\" --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_capture_window\",\n \"description\": \"Capture a specific window through the public read-only desktop observation plane.\",\n \"cliEquivalent\": \"desktop-capture-window\",\n \"example\": \"npx opendevbrowser desktop-capture-window --window-id 101 --reason \\\"capture browser window\\\" --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_desktop_accessibility_snapshot\",\n \"description\": \"Capture desktop accessibility state through the public read-only desktop observation plane.\",\n \"cliEquivalent\": \"desktop-accessibility-snapshot\",\n \"example\": \"npx opendevbrowser desktop-accessibility-snapshot --reason \\\"inspect current browser-adjacent labels\\\" --window-id 101 --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_annotate\",\n \"description\": \"Capture interactive annotations.\",\n \"cliEquivalent\": \"annotate\",\n \"example\": \"npx opendevbrowser annotate --session-id s1 --transport auto --context \\\"review call to action spacing\\\" --include-screenshots true --output-format json\"\n },\n {\n \"name\": \"opendevbrowser_skill_list\",\n \"description\": \"List bundled and discovered skill packs before choosing a local onboarding or workflow lane.\",\n \"example\": \"{}\",\n \"notes\": [\n \"Tool-only helper. Use it to inspect local workflow lanes before loading a pack.\"\n ]\n },\n {\n \"name\": \"opendevbrowser_skill_load\",\n \"description\": \"Load a specific skill pack locally, especially the bundled best-practices quick start.\",\n \"example\": \"{\\\"name\\\":\\\"opendevbrowser-best-practices\\\",\\\"topic\\\":\\\"quick start\\\"}\",\n \"notes\": [\n \"Tool-only helper. Use it to load opendevbrowser-best-practices or design-agent guidance directly into the current agent context.\"\n ]\n }\n ],\n \"cliToolPairs\": [\n {\n \"cliCommand\": \"launch\",\n \"toolName\": \"opendevbrowser_launch\"\n },\n {\n \"cliCommand\": \"connect\",\n \"toolName\": \"opendevbrowser_connect\"\n },\n {\n \"cliCommand\": \"disconnect\",\n \"toolName\": \"opendevbrowser_disconnect\"\n },\n {\n \"cliCommand\": \"status\",\n \"toolName\": \"opendevbrowser_status\"\n },\n {\n \"cliCommand\": \"status-capabilities\",\n \"toolName\": \"opendevbrowser_status_capabilities\"\n },\n {\n \"cliCommand\": \"session-inspector\",\n \"toolName\": \"opendevbrowser_session_inspector\"\n },\n {\n \"cliCommand\": \"session-inspector-plan\",\n \"toolName\": \"opendevbrowser_session_inspector_plan\"\n },\n {\n \"cliCommand\": \"session-inspector-audit\",\n \"toolName\": \"opendevbrowser_session_inspector_audit\"\n },\n {\n \"cliCommand\": \"targets-list\",\n \"toolName\": \"opendevbrowser_targets_list\"\n },\n {\n \"cliCommand\": \"target-use\",\n \"toolName\": \"opendevbrowser_target_use\"\n },\n {\n \"cliCommand\": \"target-new\",\n \"toolName\": \"opendevbrowser_target_new\"\n },\n {\n \"cliCommand\": \"target-close\",\n \"toolName\": \"opendevbrowser_target_close\"\n },\n {\n \"cliCommand\": \"page\",\n \"toolName\": \"opendevbrowser_page\"\n },\n {\n \"cliCommand\": \"pages\",\n \"toolName\": \"opendevbrowser_list\"\n },\n {\n \"cliCommand\": \"page-close\",\n \"toolName\": \"opendevbrowser_close\"\n },\n {\n \"cliCommand\": \"goto\",\n \"toolName\": \"opendevbrowser_goto\"\n },\n {\n \"cliCommand\": \"wait\",\n \"toolName\": \"opendevbrowser_wait\"\n },\n {\n \"cliCommand\": \"snapshot\",\n \"toolName\": \"opendevbrowser_snapshot\"\n },\n {\n \"cliCommand\": \"review\",\n \"toolName\": \"opendevbrowser_review\"\n },\n {\n \"cliCommand\": \"review-desktop\",\n \"toolName\": \"opendevbrowser_review_desktop\"\n },\n {\n \"cliCommand\": \"click\",\n \"toolName\": \"opendevbrowser_click\"\n },\n {\n \"cliCommand\": \"hover\",\n \"toolName\": \"opendevbrowser_hover\"\n },\n {\n \"cliCommand\": \"press\",\n \"toolName\": \"opendevbrowser_press\"\n },\n {\n \"cliCommand\": \"check\",\n \"toolName\": \"opendevbrowser_check\"\n },\n {\n \"cliCommand\": \"uncheck\",\n \"toolName\": \"opendevbrowser_uncheck\"\n },\n {\n \"cliCommand\": \"type\",\n \"toolName\": \"opendevbrowser_type\"\n },\n {\n \"cliCommand\": \"select\",\n \"toolName\": \"opendevbrowser_select\"\n },\n {\n \"cliCommand\": \"scroll\",\n \"toolName\": \"opendevbrowser_scroll\"\n },\n {\n \"cliCommand\": \"scroll-into-view\",\n \"toolName\": \"opendevbrowser_scroll_into_view\"\n },\n {\n \"cliCommand\": \"upload\",\n \"toolName\": \"opendevbrowser_upload\"\n },\n {\n \"cliCommand\": \"pointer-move\",\n \"toolName\": \"opendevbrowser_pointer_move\"\n },\n {\n \"cliCommand\": \"pointer-down\",\n \"toolName\": \"opendevbrowser_pointer_down\"\n },\n {\n \"cliCommand\": \"pointer-up\",\n \"toolName\": \"opendevbrowser_pointer_up\"\n },\n {\n \"cliCommand\": \"pointer-drag\",\n \"toolName\": \"opendevbrowser_pointer_drag\"\n },\n {\n \"cliCommand\": \"dom-html\",\n \"toolName\": \"opendevbrowser_dom_get_html\"\n },\n {\n \"cliCommand\": \"dom-text\",\n \"toolName\": \"opendevbrowser_dom_get_text\"\n },\n {\n \"cliCommand\": \"dom-attr\",\n \"toolName\": \"opendevbrowser_get_attr\"\n },\n {\n \"cliCommand\": \"dom-value\",\n \"toolName\": \"opendevbrowser_get_value\"\n },\n {\n \"cliCommand\": \"dom-visible\",\n \"toolName\": \"opendevbrowser_is_visible\"\n },\n {\n \"cliCommand\": \"dom-enabled\",\n \"toolName\": \"opendevbrowser_is_enabled\"\n },\n {\n \"cliCommand\": \"dom-checked\",\n \"toolName\": \"opendevbrowser_is_checked\"\n },\n {\n \"cliCommand\": \"run\",\n \"toolName\": \"opendevbrowser_run\"\n },\n {\n \"cliCommand\": \"console-poll\",\n \"toolName\": \"opendevbrowser_console_poll\"\n },\n {\n \"cliCommand\": \"network-poll\",\n \"toolName\": \"opendevbrowser_network_poll\"\n },\n {\n \"cliCommand\": \"debug-trace-snapshot\",\n \"toolName\": \"opendevbrowser_debug_trace_snapshot\"\n },\n {\n \"cliCommand\": \"cookie-import\",\n \"toolName\": \"opendevbrowser_cookie_import\"\n },\n {\n \"cliCommand\": \"cookie-list\",\n \"toolName\": \"opendevbrowser_cookie_list\"\n },\n {\n \"cliCommand\": \"macro-resolve\",\n \"toolName\": \"opendevbrowser_macro_resolve\"\n },\n {\n \"cliCommand\": \"research\",\n \"toolName\": \"opendevbrowser_research_run\"\n },\n {\n \"cliCommand\": \"shopping\",\n \"toolName\": \"opendevbrowser_shopping_run\"\n },\n {\n \"cliCommand\": \"product-video\",\n \"toolName\": \"opendevbrowser_product_video_run\"\n },\n {\n \"cliCommand\": \"inspiredesign\",\n \"toolName\": \"opendevbrowser_inspiredesign_run\"\n },\n {\n \"cliCommand\": \"canvas\",\n \"toolName\": \"opendevbrowser_canvas\"\n },\n {\n \"cliCommand\": \"clone-page\",\n \"toolName\": \"opendevbrowser_clone_page\"\n },\n {\n \"cliCommand\": \"clone-component\",\n \"toolName\": \"opendevbrowser_clone_component\"\n },\n {\n \"cliCommand\": \"perf\",\n \"toolName\": \"opendevbrowser_perf\"\n },\n {\n \"cliCommand\": \"screenshot\",\n \"toolName\": \"opendevbrowser_screenshot\"\n },\n {\n \"cliCommand\": \"screencast-start\",\n \"toolName\": \"opendevbrowser_screencast_start\"\n },\n {\n \"cliCommand\": \"screencast-stop\",\n \"toolName\": \"opendevbrowser_screencast_stop\"\n },\n {\n \"cliCommand\": \"dialog\",\n \"toolName\": \"opendevbrowser_dialog\"\n },\n {\n \"cliCommand\": \"desktop-status\",\n \"toolName\": \"opendevbrowser_desktop_status\"\n },\n {\n \"cliCommand\": \"desktop-windows\",\n \"toolName\": \"opendevbrowser_desktop_windows\"\n },\n {\n \"cliCommand\": \"desktop-active-window\",\n \"toolName\": \"opendevbrowser_desktop_active_window\"\n },\n {\n \"cliCommand\": \"desktop-capture-desktop\",\n \"toolName\": \"opendevbrowser_desktop_capture_desktop\"\n },\n {\n \"cliCommand\": \"desktop-capture-window\",\n \"toolName\": \"opendevbrowser_desktop_capture_window\"\n },\n {\n \"cliCommand\": \"desktop-accessibility-snapshot\",\n \"toolName\": \"opendevbrowser_desktop_accessibility_snapshot\"\n },\n {\n \"cliCommand\": \"annotate\",\n \"toolName\": \"opendevbrowser_annotate\"\n }\n ]\n },\n \"counts\": {\n \"commandCount\": 77,\n \"toolCount\": 70,\n \"cliToolPairCount\": 67\n }\n} satisfies PublicSurfaceManifest;\n\nexport const VALID_FLAGS = PUBLIC_SURFACE_MANIFEST.cli.flags.map((flag) => flag.name) as PublicSurfaceFlagName[];\nexport const VALID_EQUALS_FLAGS = [...PUBLIC_SURFACE_MANIFEST.cli.equalsFlags] as PublicSurfaceFlagName[];\nexport const CLI_COMMANDS = PUBLIC_SURFACE_MANIFEST.cli.commands.map((command) => command.name) as PublicSurfaceCliCommandName[];\n\nexport const CLI_COMMAND_HELP_DETAILS = Object.fromEntries(\n PUBLIC_SURFACE_MANIFEST.cli.commands.map((command) => [\n command.name,\n {\n description: command.description,\n usage: command.usage,\n flags: [...command.flags],\n examples: [...command.examples],\n notes: [...command.notes]\n } satisfies CommandHelpDetail\n ] as const)\n) as unknown as Record<PublicSurfaceCliCommandName, CommandHelpDetail>;\n\nconst COMMANDS_BY_GROUP = Object.fromEntries(\n PUBLIC_SURFACE_MANIFEST.cli.groups.map((group) => [\n group.id,\n PUBLIC_SURFACE_MANIFEST.cli.commands\n .filter((command) => command.groupId === group.id)\n .map((command) => ({\n name: command.name,\n description: command.description,\n usage: command.usage,\n flags: [...command.flags],\n examples: [...command.examples],\n notes: [...command.notes]\n }))\n ] as const)\n) as Record<string, PublicSurfaceCliCommandGroupDefinition['commands']>;\n\nexport const PUBLIC_CLI_COMMAND_GROUPS = PUBLIC_SURFACE_MANIFEST.cli.groups.map((group) => ({\n id: group.id,\n title: group.title,\n summary: group.summary,\n commands: COMMANDS_BY_GROUP[group.id]\n})) as readonly PublicSurfaceCliCommandGroupDefinition[];\n\nexport const TOOL_SURFACE_ENTRIES = PUBLIC_SURFACE_MANIFEST.tools.entries.map((entry) => ({\n name: entry.name,\n description: entry.description,\n ...(entry.cliEquivalent ? { cliEquivalent: entry.cliEquivalent } : {}),\n example: entry.example,\n ...(entry.notes ? { notes: [...entry.notes] } : {})\n})) as readonly ToolSurfaceEntry[];\n"],"mappings":"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ACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,M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c;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAA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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/help.ts"],"sourcesContent":["import onboardingMetadata from \"./onboarding-metadata.json\";\nimport {\n INSPIREDESIGN_HANDOFF_COMMANDS,\n INSPIREDESIGN_HANDOFF_GUIDANCE\n} from \"../inspiredesign/handoff\";\nimport type { CliCommand } from \"./args\";\nimport { CLI_COMMANDS, VALID_FLAGS } from \"./args\";\nimport {\n CLI_COMMAND_HELP_DETAILS,\n PUBLIC_CLI_COMMAND_GROUPS,\n TOOL_SURFACE_ENTRIES\n} from \"../public-surface/generated-manifest\";\n\ntype HelpFlag = (typeof VALID_FLAGS)[number];\n\ninterface CommandGroup {\n title: string;\n summary: string;\n commands: readonly CliCommand[];\n}\n\nexport type CommandHelpDetail = typeof CLI_COMMAND_HELP_DETAILS[CliCommand];\n\ninterface FlagEntry {\n flag: HelpFlag;\n alias?: string;\n description: string;\n example?: string;\n}\n\ninterface FlagGroup {\n title: string;\n summary: string;\n flags: readonly FlagEntry[];\n}\n\ninterface ReferenceEntry {\n label: string;\n description: string;\n}\n\ninterface DetailRow {\n label: string;\n value: string;\n}\n\ninterface FormattableRow {\n label: string;\n description: string;\n details?: readonly DetailRow[];\n}\n\nconst LABEL_WIDTH = 42;\nconst DETAIL_LABEL_WIDTH = 9;\nconst COMMAND_SET = new Set<string>(CLI_COMMANDS);\nconst FLAG_SET = new Set<string>(VALID_FLAGS);\nconst TOOL_COUNT = TOOL_SURFACE_ENTRIES.length;\nconst CLI_EQUIVALENT_SET = new Set(\n TOOL_SURFACE_ENTRIES.flatMap((entry) => (entry.cliEquivalent ? [entry.cliEquivalent] : []))\n);\n\nconst formatFlags = (flags: readonly HelpFlag[]): string => (flags.length > 0 ? flags.join(\", \") : \"none\");\n\nexport const getCliOnlyCommands = (): CliCommand[] => (\n CLI_COMMANDS.filter((command) => !CLI_EQUIVALENT_SET.has(command))\n);\n\nexport const getToolOnlyHelperNames = (): string[] => (\n TOOL_SURFACE_ENTRIES\n .filter((entry) => !entry.cliEquivalent)\n .map((entry) => entry.name)\n);\n\nexport const HELP_COMMAND_GROUPS: readonly CommandGroup[] = PUBLIC_CLI_COMMAND_GROUPS.map((group) => ({\n title: group.title,\n summary: group.summary,\n commands: group.commands.map((command) => command.name) as CliCommand[]\n}));\n\nexport const COMMAND_HELP_DETAILS: Record<CliCommand, CommandHelpDetail> = CLI_COMMAND_HELP_DETAILS as Record<CliCommand, CommandHelpDetail>;\n\nexport const HELP_FLAG_GROUPS: readonly FlagGroup[] = [\n {\n title: \"Install / Global Flags\",\n summary: \"Control install scope, prompting, and bundled skill setup.\",\n flags: [\n { flag: \"--global\", alias: \"-g\", description: \"Install into ~/.config/opencode/opencode.json.\", example: \"npx opendevbrowser --global --with-config\" },\n { flag: \"--local\", alias: \"-l\", description: \"Install into ./opencode.json for this project.\", example: \"npx opendevbrowser --local --skills-local\" },\n { flag: \"--update\", alias: \"-u\", description: \"Alias for the update command.\" },\n { flag: \"--uninstall\", description: \"Alias for the uninstall command.\" },\n { flag: \"--with-config\", description: \"Also create opendevbrowser.jsonc defaults.\", example: \"npx opendevbrowser --global --with-config\" },\n { flag: \"--full\", alias: \"-f\", description: \"Install config and pre-extract extension assets.\", example: \"npx opendevbrowser --full\" },\n { flag: \"--no-prompt\", description: \"Run non-interactively using defaults.\" },\n { flag: \"--no-interactive\", description: \"Alias of --no-prompt.\" },\n { flag: \"--quiet\", description: \"Suppress non-error text output.\" },\n { flag: \"--skills-global\", description: \"Install bundled skills into global agent directories.\" },\n { flag: \"--skills-local\", description: \"Install bundled skills into local project agent directories.\" },\n { flag: \"--no-skills\", description: \"Skip bundled skill installation.\" }\n ]\n },\n {\n title: \"Help / Output Flags\",\n summary: \"Inspect help or version and control output transport.\",\n flags: [\n { flag: \"--help\", alias: \"-h\", description: \"Show CLI help output.\", example: \"npx opendevbrowser --help\" },\n { flag: \"--version\", alias: \"-v\", description: \"Show CLI version.\", example: \"npx opendevbrowser --version\" },\n { flag: \"--output-format\", description: \"Output mode: text, json, or stream-json.\", example: \"opendevbrowser status --daemon --output-format json\" },\n { flag: \"--transport\", description: \"Transport selector for transport-aware commands. `status` uses relay/native; `annotate` uses auto/direct/relay.\", example: \"opendevbrowser status --session-id s1 --transport native\" }\n ]\n },\n {\n title: \"Daemon / Session / Launch Flags\",\n summary: \"Control daemon binding, browser connect, and launch behavior. If ext=on but handshake=off, reopen the extension popup and click Connect again to re-establish a clean daemon-extension handshake.\",\n flags: [\n { flag: \"--port\", description: \"Daemon or relay port override.\", example: \"opendevbrowser serve --port 8788\" },\n { flag: \"--token\", description: \"Relay or daemon auth token override.\", example: \"opendevbrowser serve --token local-dev-token\" },\n { flag: \"--stop\", description: \"Stop a running daemon.\", example: \"opendevbrowser serve --stop\" },\n { flag: \"--daemon\", description: \"Target daemon status mode where supported.\", example: \"opendevbrowser status --daemon --output-format json\" },\n { flag: \"--script\", description: \"Path to a run-script JSON file.\", example: \"opendevbrowser run --script ./workflow.json\" },\n { flag: \"--session-id\", description: \"Target an existing browser or daemon session.\", example: \"opendevbrowser snapshot --session-id s1\" },\n { flag: \"--close-browser\", description: \"Close the managed browser on disconnect.\" },\n { flag: \"--ws-endpoint\", description: \"Connect using an explicit CDP WebSocket endpoint.\", example: \"opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/...\" },\n { flag: \"--host\", description: \"CDP host for host/port connect mode.\", example: \"opendevbrowser connect --host 127.0.0.1 --cdp-port 9222\" },\n { flag: \"--cdp-port\", description: \"CDP port for host/port connect mode.\" },\n { flag: \"--headless\", description: \"Launch a managed browser in headless mode.\", example: \"opendevbrowser launch --no-extension --headless\" },\n { flag: \"--profile\", description: \"Use a named browser profile directory.\" },\n { flag: \"--persist-profile\", description: \"Keep the generated profile directory after exit. `run` uses a temporary profile by default unless this flag is enabled.\" },\n { flag: \"--chrome-path\", description: \"Use a specific Chrome, Chromium, or CfT binary.\" },\n { flag: \"--start-url\", description: \"Open this URL immediately after launch or connect.\" },\n { flag: \"--flag\", description: \"Pass one or more extra Chrome CLI flags.\" },\n { flag: \"--no-extension\", description: \"Force managed mode without extension relay.\" },\n { flag: \"--extension-only\", description: \"Fail unless the extension relay websocket is connected and the daemon-extension handshake is complete.\" },\n { flag: \"--extension-legacy\", description: \"Use the legacy /cdp relay mode instead of /ops.\" },\n { flag: \"--wait-for-extension\", description: \"Wait for a clean daemon-extension handshake before returning.\" },\n { flag: \"--wait-timeout-ms\", description: \"Handshake wait timeout in milliseconds.\" }\n ]\n },\n {\n title: \"Navigation / Interaction / Diagnostics Flags\",\n summary: \"Command-specific flags for page actions, reads, and diagnostics.\",\n flags: [\n { flag: \"--url\", description: \"Target URL for navigation, connect, or workflow commands; repeat for multi-reference inspiredesign runs.\", example: \"opendevbrowser goto --session-id s1 --url https://example.com\" },\n { flag: \"--wait-until\", description: \"Navigation wait strategy such as load or domcontentloaded.\" },\n { flag: \"--timeout-ms\", description: \"Operation timeout in milliseconds.\", example: \"opendevbrowser canvas --timeout-ms 120000 --command canvas.session.open ...\" },\n { flag: \"--ref\", description: \"Snapshot ref id for element-targeted commands.\", example: \"opendevbrowser click --session-id s1 --ref r12\" },\n { flag: \"--state\", description: \"Wait state selector for wait-style commands.\" },\n { flag: \"--until\", description: \"Wait condition selector for wait-style commands.\" },\n { flag: \"--mode\", description: \"Mode selector for commands that accept variants.\" },\n { flag: \"--max-chars\", description: \"Maximum text characters to return for DOM reads.\" },\n { flag: \"--cursor\", description: \"Cursor token for paginated list commands.\" },\n { flag: \"--text\", description: \"Text payload for type and related commands.\" },\n { flag: \"--clear\", description: \"Clear the existing input value before typing.\" },\n { flag: \"--submit\", description: \"Submit the form or input after typing.\" },\n { flag: \"--values\", description: \"CSV values for select commands.\" },\n { flag: \"--files\", description: \"CSV file paths for upload commands.\" },\n { flag: \"--dy\", description: \"Vertical scroll delta for scroll commands.\" },\n { flag: \"--key\", description: \"Keyboard key for the press command.\" },\n { flag: \"--attr\", description: \"DOM attribute name for dom-attr.\" },\n { flag: \"--x\", description: \"Viewport x coordinate for pointer commands.\" },\n { flag: \"--y\", description: \"Viewport y coordinate for pointer commands.\" },\n { flag: \"--from-x\", description: \"Pointer drag start x coordinate.\" },\n { flag: \"--from-y\", description: \"Pointer drag start y coordinate.\" },\n { flag: \"--to-x\", description: \"Pointer drag end x coordinate.\" },\n { flag: \"--to-y\", description: \"Pointer drag end y coordinate.\" },\n { flag: \"--steps\", description: \"Interpolation step count for pointer move or drag commands.\" },\n { flag: \"--button\", description: \"Pointer button selector for pointer down or up.\" },\n { flag: \"--click-count\", description: \"Associated click count for pointer down or up.\" },\n { flag: \"--name\", description: \"Named page identifier for page commands.\" },\n { flag: \"--target-id\", description: \"Browser target id for target commands.\", example: \"opendevbrowser target-use --session-id s1 --target-id page-2\" },\n { flag: \"--window-id\", description: \"Desktop window id for direct window capture commands.\" },\n { flag: \"--tab-id\", description: \"Browser tab id override for extension and annotation commands.\" },\n { flag: \"--include-urls\", description: \"Include page URLs in list output where supported.\" },\n { flag: \"--path\", description: \"Filesystem path for command output or artifacts.\", example: \"opendevbrowser screenshot --session-id s1 --path ./shot.png\" },\n { flag: \"--screencast-id\", description: \"Recorded screencast id returned by screencast-start for the same session.\" },\n { flag: \"--reason\", description: \"Audit reason for desktop observation commands.\" },\n { flag: \"--full-page\", description: \"Capture the full scrollable page instead of the current viewport.\" },\n { flag: \"--action\", description: \"Dialog action: status, accept, or dismiss.\" },\n { flag: \"--prompt-text\", description: \"Prompt text to submit when accepting a prompt dialog.\" },\n { flag: \"--since-seq\", description: \"Poll from a sequence id across diagnostics streams.\" },\n { flag: \"--max\", description: \"Maximum number of records or items to return.\" },\n { flag: \"--interval-ms\", description: \"Frame capture interval for screencast recording.\" },\n { flag: \"--max-frames\", description: \"Maximum screencast frame count before auto-stop.\" },\n { flag: \"--since-console-seq\", description: \"Console sequence cursor for debug-trace snapshots.\" },\n { flag: \"--since-network-seq\", description: \"Network sequence cursor for debug-trace snapshots.\" },\n { flag: \"--since-exception-seq\", description: \"Exception sequence cursor for debug-trace snapshots.\" },\n { flag: \"--request-id\", description: \"Attach or lookup a request id for correlated output.\" },\n { flag: \"--cookies\", description: \"Inline cookie payload for cookie-import.\" },\n { flag: \"--cookies-file\", description: \"File path containing cookies for cookie-import.\" },\n { flag: \"--strict\", description: \"Fail cookie import on invalid entries.\" },\n { flag: \"--screenshot-mode\", description: \"Annotation screenshot mode: visible, full, or none.\" },\n { flag: \"--debug\", description: \"Enable debug-level annotation capture extras.\" },\n { flag: \"--context\", description: \"Free-form annotation context for reviewers or agents.\" },\n { flag: \"--stored\", description: \"Return the last stored annotation payload instead of starting a new capture.\" }\n ]\n },\n {\n title: \"Macro / Provider / Power Flags\",\n summary: \"Workflow filters, provider selectors, and unsafe RPC or /canvas options.\",\n flags: [\n { flag: \"--expression\", description: \"Macro expression to resolve or execute.\", example: \"opendevbrowser macro-resolve --expression '@web.search(\\\"openai\\\")'\" },\n { flag: \"--default-provider\", description: \"Provider fallback for shorthand macro expressions.\" },\n { flag: \"--include-catalog\", description: \"Include macro catalog metadata in the response.\" },\n { flag: \"--command\", description: \"Canvas command name for the canvas CLI command.\", example: \"opendevbrowser canvas --command canvas.session.open --params '{...}'\" },\n { flag: \"--execute\", description: \"Execute a resolved macro action after planning.\" },\n { flag: \"--params\", description: \"Inline JSON params for canvas or rpc commands.\" },\n { flag: \"--params-file\", description: \"Path to a JSON params file for canvas or rpc commands.\", example: \"opendevbrowser canvas --command canvas.plan.set --params-file ./plan.json\" },\n { flag: \"--unsafe-internal\", description: \"Required safety gate for the rpc command.\" },\n { flag: \"--topic\", description: \"Research topic input.\" },\n { flag: \"--days\", description: \"Lookback window in days for research commands.\" },\n { flag: \"--from\", description: \"Start date boundary for research commands.\" },\n { flag: \"--to\", description: \"End date boundary for research commands.\" },\n { flag: \"--source-selection\", description: \"Research source-family selector: auto, web, community, social, shopping, or all. This selects families only and is not a reliability guarantee.\" },\n { flag: \"--sources\", description: \"Explicit source-family selectors such as web,community. Use shopping only when commercial intent is explicit.\" },\n { flag: \"--include-engagement\", description: \"Include engagement metrics in research output.\" },\n { flag: \"--limit-per-source\", description: \"Per-source result cap for research runs.\" },\n { flag: \"--query\", description: \"Shopping query input.\" },\n { flag: \"--providers\", description: \"Comma-separated provider ids for shopping or artifact commands.\" },\n { flag: \"--budget\", description: \"Budget filter for shopping workflows.\" },\n { flag: \"--region\", description: \"Region or country hint for provider selection. Treat it as advisory unless output metadata reports `region_authoritative=true`.\" },\n { flag: \"--sort\", description: \"Sort mode for shopping results.\" },\n { flag: \"--brief\", description: \"Inspiredesign brief describing the target design direction.\" },\n { flag: \"--capture-mode\", description: \"Inspiredesign capture mode: off or deep. Any --url forces deep.\" },\n { flag: \"--include-prototype-guidance\", description: \"Include inspiredesign prototype guidance in workflow output.\" },\n { flag: \"--product-url\", description: \"Target product URL for product-video workflows.\" },\n { flag: \"--product-name\", description: \"Product name override for product-video workflows.\" },\n { flag: \"--provider-hint\", description: \"Provider hint override for product workflows.\" },\n { flag: \"--include-screenshots\", description: \"Include screenshots in product presentation output, or prefer screenshots when fetching stored annotations.\" },\n { flag: \"--include-all-images\", description: \"Include all discovered product images.\" },\n { flag: \"--include-copy\", description: \"Include product marketing copy metadata.\" },\n { flag: \"--use-cookies\", description: \"Enable or disable provider cookie injection for workflow runs and macro-resolve execute; a bare flag means true.\", example: \"opendevbrowser macro-resolve --expression '@media.search(\\\"browser automation x\\\", \\\"x\\\", 5)' --execute --browser-mode extension --use-cookies\" },\n { flag: \"--browser-mode\", description: \"Provider browser transport mode: auto, extension, or managed. extension reuses relay-backed browser state; managed runs a deterministic managed browser.\", example: \"opendevbrowser research run --topic 'browser automation on X' --source-selection social --browser-mode extension --use-cookies --challenge-automation-mode browser_with_helper\" },\n { flag: \"--challenge-automation-mode\", description: \"Per-run challenge automation mode for workflow runs and macro-resolve execute: off, browser, or browser_with_helper. Precedence is run > session > config, and the helper remains browser-scoped only.\", example: \"opendevbrowser macro-resolve --expression '@community.search(\\\"openai\\\")' --execute --challenge-automation-mode browser_with_helper\" },\n { flag: \"--cookie-policy-override\", description: \"Per-run workflow and macro-resolve execute cookie policy override: off, auto, or required.\", example: \"opendevbrowser macro-resolve --expression '@community.search(\\\"browser automation failures\\\", 4)' --execute --browser-mode extension --use-cookies --cookie-policy required\" },\n { flag: \"--cookie-policy\", description: \"Alias of --cookie-policy-override.\" },\n { flag: \"--output-dir\", description: \"Directory where generated artifacts are written, including screencast replay output.\" },\n { flag: \"--ttl-hours\", description: \"Artifact cache time-to-live in hours.\" },\n { flag: \"--expired-only\", description: \"List only expired artifacts in artifacts commands.\" }\n ]\n }\n];\n\nexport const HELP_TOOL_ENTRIES = TOOL_SURFACE_ENTRIES;\n\nexport const HELP_CAPABILITY_ENTRIES: readonly FormattableRow[] = [\n {\n label: \"screencast / browser replay\",\n description: \"Use the public browser replay lane when you need temporal browser evidence before or after a fragile flow.\",\n details: [\n { label: \"cli:\", value: \"screencast-start, screencast-stop\" },\n { label: \"example:\", value: \"npx opendevbrowser screencast-start --session-id <id> --output-dir ./artifacts/replay\" }\n ]\n },\n {\n label: \"desktop observation\",\n description: \"Use the public read-only desktop observation plane for sibling desktop evidence on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\",\n details: [\n {\n label: \"cli:\",\n value: \"desktop-status, desktop-windows, desktop-active-window, desktop-capture-desktop, desktop-capture-window, desktop-accessibility-snapshot\"\n },\n { label: \"example:\", value: \"npx opendevbrowser desktop-status --output-format json\" }\n ]\n },\n {\n label: \"computer use / browser-scoped computer use\",\n description: \"Control the bounded browser-scoped computer-use challenge lane with --challenge-automation-mode; the optional helper is not a desktop agent.\",\n details: [\n { label: \"flag:\", value: \"--challenge-automation-mode off|browser|browser_with_helper\" },\n { label: \"works:\", value: \"research run, shopping run, product-video run, inspiredesign run, macro-resolve --execute\" },\n { label: \"entry:\", value: onboardingMetadata.quickStartCommands.computerUseEntry },\n { label: \"proof:\", value: \"review, session-inspector, workflow fallback metadata\" }\n ]\n }\n];\n\nexport const HELP_ONBOARDING_ENTRIES: readonly FormattableRow[] = [\n {\n label: \"prompting_guide\",\n description: \"Load local best-practice guidance before low-level browser commands.\",\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.promptingGuide }]\n },\n {\n label: \"skill_load\",\n description: `Load ${onboardingMetadata.skillName} ${onboardingMetadata.skillTopic} directly when you want the canonical quick-start section.`,\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.skillLoad }]\n },\n {\n label: \"validated_lanes\",\n description: `Load ${onboardingMetadata.skillName} ${onboardingMetadata.validatedSkillTopic} when you need the current proven transcript, evidence-gated research, and shopping runbook.`,\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.validatedLanes }]\n },\n {\n label: \"skill_list\",\n description: \"Inspect bundled and discovered skill packs when you need a different local lane.\",\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.skillList }]\n },\n {\n label: \"research_evidence_gated\",\n description: \"Load opendevbrowser-research first, run explicit source-family research, and inspect artifacts before final claims.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.validatedResearch }]\n },\n {\n label: \"shopping_reliable\",\n description: \"Start deal hunting with explicit providers in managed mode and only trust regional comparisons when the result reports `region_authoritative=true`.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.validatedShopping }]\n },\n {\n label: \"inspiredesign_followthrough\",\n description: \"After inspiredesign finishes, read advanced-brief.md first, then continue in Canvas with the emitted request template and load the canvas-contract design-agent lane before patching.\",\n details: [\n { label: \"quick:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.loadBestPractices },\n { label: \"design:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.loadDesignAgent },\n { label: \"brief:\", value: INSPIREDESIGN_HANDOFF_GUIDANCE.reviewAdvancedBrief },\n { label: \"prep:\", value: INSPIREDESIGN_HANDOFF_GUIDANCE.prepareCanvasPlanRequest },\n { label: \"run:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.continueInCanvas }\n ]\n },\n {\n label: \"computer_use_entry\",\n description: \"Enter browser-scoped computer use from a workflow run, not from a separate desktop command family.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.computerUseEntry }]\n },\n {\n label: \"happy_path\",\n description: \"After guidance, verify a minimal managed happy path before widening into multi-step automation.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.happyPath }]\n },\n {\n label: \"surface_split\",\n description: \"Use the existing public-surface split when a workflow or helper only exists on one side of the CLI or tool surface.\",\n details: [\n { label: \"cli-only:\", value: getCliOnlyCommands().join(\", \") },\n { label: \"tool-only:\", value: getToolOnlyHelperNames().join(\", \") }\n ]\n },\n {\n label: \"docs\",\n description: \"Use the first-run checklist and canonical skill runbook for proof and deeper operating details.\",\n details: [{\n label: \"paths:\",\n value: `${onboardingMetadata.referencePaths.onboardingDoc}, ${onboardingMetadata.referencePaths.skillDoc}`\n }]\n }\n];\n\nexport const HELP_REFERENCE_ENTRIES: readonly ReferenceEntry[] = [\n { label: \"src/cli/onboarding-metadata.json\", description: \"Canonical first-contact onboarding metadata shared by help, nudges, and proof lanes.\" },\n { label: \"src/providers/workflow-handoff.ts\", description: \"Central next-step advisory builders for workflow follow-through.\" },\n { label: \"src/inspiredesign/handoff.ts\", description: \"Shared inspiredesign follow-through commands, artifact names, and Canvas continuation guidance.\" },\n { label: \"src/public-surface/source.ts\", description: \"Authoritative command, usage, flag, and tool surface metadata.\" },\n { label: \"src/public-surface/generated-manifest.ts\", description: \"Checked-in generated public-surface snapshot consumed by help and parity tests.\" },\n { label: \"src/public-surface/generated-manifest.json\", description: \"Checked-in generated public-surface snapshot consumed by inventory scripts.\" },\n { label: \"src/cli/args.ts\", description: \"CLI argument parsing backed by the public-surface source.\" },\n { label: \"src/cli/help.ts\", description: \"Human-facing CLI formatting layered on the public-surface source, including the first-contact Find It Fast lookup block.\" },\n { label: \"src/tools/index.ts\", description: \"Code-level tool registry.\" },\n { label: \"docs/CLI.md\", description: \"Detailed CLI guide and release-gate runbooks.\" },\n { label: onboardingMetadata.referencePaths.onboardingDoc, description: \"First-run checklist for help-led onboarding and happy-path proof.\" },\n { label: onboardingMetadata.referencePaths.skillDoc, description: \"Canonical bundled best-practices runbook and quick-start guidance.\" },\n { label: \"docs/WORKFLOW_SURFACE_MAP.md\", description: \"Code-derived workflow and validation inventory, including CLI-only and tool-only surface splits.\" },\n { label: \"docs/SURFACE_REFERENCE.md\", description: \"Canonical CLI, tool, and relay channel inventory.\" },\n { label: \"opendevbrowser --help\", description: \"Primary full help invocation for quick discovery.\" },\n { label: \"opendevbrowser help\", description: \"Alias that prints the same full help inventory.\" }\n];\n\nfunction formatRows(rows: readonly FormattableRow[]): string {\n return rows\n .map((row) => {\n const lines = [` ${row.label.padEnd(LABEL_WIDTH)} ${row.description}`];\n for (const detail of row.details ?? []) {\n lines.push(` ${detail.label.padEnd(DETAIL_LABEL_WIDTH)} ${detail.value}`);\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nfunction assertCommandCoverage(): void {\n const seen = new Set<string>();\n\n for (const group of HELP_COMMAND_GROUPS) {\n for (const command of group.commands) {\n const detail = COMMAND_HELP_DETAILS[command];\n if (!COMMAND_SET.has(command)) {\n throw new Error(`Help references unknown CLI command: ${command}`);\n }\n if (seen.has(command)) {\n throw new Error(`Help command appears multiple times: ${command}`);\n }\n if (!detail || !detail.description.trim() || !detail.usage.trim()) {\n throw new Error(`Missing command help metadata: ${command}`);\n }\n if (detail.examples.length === 0) {\n throw new Error(`Missing command example metadata: ${command}`);\n }\n for (const flag of detail.flags) {\n if (!FLAG_SET.has(flag)) {\n throw new Error(`Command help metadata references unknown flag ${flag} for ${command}`);\n }\n }\n seen.add(command);\n }\n }\n\n if (seen.size !== CLI_COMMANDS.length) {\n const missing = CLI_COMMANDS.filter((command) => !seen.has(command));\n throw new Error(`Help command coverage mismatch; missing: ${missing.join(\", \")}`);\n }\n}\n\nfunction assertFlagCoverage(): void {\n const seen = new Set<string>();\n\n for (const group of HELP_FLAG_GROUPS) {\n for (const entry of group.flags) {\n if (!FLAG_SET.has(entry.flag)) {\n throw new Error(`Help references unknown CLI flag: ${entry.flag}`);\n }\n if (seen.has(entry.flag)) {\n throw new Error(`Help flag appears multiple times: ${entry.flag}`);\n }\n seen.add(entry.flag);\n }\n }\n\n if (seen.size !== VALID_FLAGS.length) {\n const missing = VALID_FLAGS.filter((flag) => !seen.has(flag));\n throw new Error(`Help flag coverage mismatch; missing: ${missing.join(\", \")}`);\n }\n}\n\nfunction assertToolCoverage(): void {\n const seen = new Set<string>();\n\n for (const entry of HELP_TOOL_ENTRIES) {\n if (!entry.name.startsWith(\"opendevbrowser_\")) {\n throw new Error(`Invalid tool name in help inventory: ${entry.name}`);\n }\n if (!entry.description.trim()) {\n throw new Error(`Help tool is missing a description: ${entry.name}`);\n }\n if (!entry.example?.trim()) {\n throw new Error(`Help tool is missing an example: ${entry.name}`);\n }\n if (seen.has(entry.name)) {\n throw new Error(`Help tool appears multiple times: ${entry.name}`);\n }\n if (entry.cliEquivalent && !COMMAND_SET.has(entry.cliEquivalent)) {\n throw new Error(`Tool metadata references unknown CLI command: ${entry.cliEquivalent}`);\n }\n seen.add(entry.name);\n }\n\n if (HELP_TOOL_ENTRIES.length !== TOOL_COUNT) {\n throw new Error(`Help tool inventory must list ${TOOL_COUNT} tools; got ${HELP_TOOL_ENTRIES.length}`);\n }\n}\n\nfunction formatCommandGroups(): string {\n return HELP_COMMAND_GROUPS\n .map((group) => {\n const rows: FormattableRow[] = group.commands.map((command) => {\n const detail = COMMAND_HELP_DETAILS[command];\n return {\n label: command,\n description: detail.description,\n details: [\n { label: \"usage:\", value: detail.usage },\n { label: \"flags:\", value: formatFlags(detail.flags) },\n ...detail.examples.map((example) => ({ label: \"example:\", value: example })),\n ...detail.notes.map((note) => ({ label: \"note:\", value: note }))\n ]\n };\n });\n return `${group.title}: ${group.summary}\\n${formatRows(rows)}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatFlagGroups(): string {\n return HELP_FLAG_GROUPS\n .map((group) => {\n const rows: FormattableRow[] = group.flags.map((entry) => ({\n label: entry.alias ? `${entry.flag} (${entry.alias})` : entry.flag,\n description: entry.description,\n details: entry.example ? [{ label: \"example:\", value: entry.example }] : []\n }));\n return `${group.title}: ${group.summary}\\n${formatRows(rows)}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatToolEntries(): string {\n return formatRows(HELP_TOOL_ENTRIES.map((entry) => ({\n label: entry.name,\n description: entry.description,\n details: [\n ...(entry.cliEquivalent\n ? [{ label: \"cli:\", value: entry.cliEquivalent }]\n : [{ label: \"scope:\", value: \"tool-only\" }]),\n ...(entry.example ? [{ label: \"example:\", value: entry.example }] : []),\n ...((entry.notes ?? []).map((note) => ({ label: \"note:\", value: note })))\n ]\n })));\n}\n\nfunction formatOnboardingEntries(): string {\n return formatRows(HELP_ONBOARDING_ENTRIES);\n}\n\nfunction formatCapabilityEntries(): string {\n return formatRows(HELP_CAPABILITY_ENTRIES);\n}\n\nfunction formatReferenceEntries(): string {\n return formatRows(HELP_REFERENCE_ENTRIES.map((entry) => ({\n label: entry.label,\n description: entry.description\n })));\n}\n\nexport function getHelpText(): string {\n assertCommandCoverage();\n assertFlagCoverage();\n assertToolCoverage();\n\n return [\n \"OpenDevBrowser CLI\",\n \"\",\n \"Usage:\",\n \" npx opendevbrowser <command> [options]\",\n \"\",\n \"Find It Fast:\",\n \" Use these exact lookup terms when you need replay, desktop evidence, or browser-scoped computer use.\",\n formatCapabilityEntries(),\n \"\",\n `${onboardingMetadata.sectionTitle}:`,\n ` ${onboardingMetadata.sectionSummary}`,\n formatOnboardingEntries(),\n \"\",\n `Command Inventory (all ${CLI_COMMANDS.length} commands):`,\n formatCommandGroups(),\n \"\",\n \"Flag Inventory (all supported flags):\",\n formatFlagGroups(),\n \"\",\n `Tool Inventory (all ${TOOL_COUNT} opendevbrowser_* tools):`,\n formatToolEntries(),\n \"\",\n \"Reference Pointers:\",\n formatReferenceEntries()\n ].join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/update.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { randomUUID } from \"crypto\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst CACHE_MANIFEST = \"package.json\";\nconst CACHE_LOCKFILE = \"package-lock.json\";\nconst CACHE_UPDATE_LOCK = \".opendevbrowser-update.lock\";\nconst CACHE_LOCK_STALE_MS = 30 * 60 * 1000;\nconst DEPENDENCY_SECTIONS = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\"\n] as const;\n\ntype DependencySection = typeof DEPENDENCY_SECTIONS[number];\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\ntype JsonObject = { [key: string]: JsonValue };\ntype CacheMutationLock = {\n pid: number;\n createdAt: number;\n token?: string;\n};\ntype HeldCacheMutationLock = {\n fd: number;\n token: string;\n};\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n cleared: boolean;\n}\n\nfunction getCacheDir(): string {\n return process.env.OPENCODE_CACHE_DIR\n || path.join(os.homedir(), \".cache\", \"opencode\");\n}\n\nfunction assertCacheChild(targetPath: string, cacheDir: string): void {\n const resolvedCache = path.resolve(cacheDir);\n const resolvedPath = path.resolve(targetPath);\n const relativePath = path.relative(resolvedCache, resolvedPath);\n\n if (!relativePath || relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n throw new Error(`Security: refusing to modify path outside cache directory: ${targetPath}`);\n }\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isExistingPathError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n\nfunction assertNoSymlinkCachePath(targetPath: string, cacheDir: string): void {\n assertCacheChild(targetPath, cacheDir);\n const resolvedCache = path.resolve(cacheDir);\n const relativeSegments = path.relative(resolvedCache, path.resolve(targetPath)).split(path.sep).filter(Boolean);\n for (const candidate of [resolvedCache, ...relativeSegments.map((_, index) => path.join(resolvedCache, ...relativeSegments.slice(0, index + 1)))]) {\n try {\n if (fs.lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache path: ${candidate}`);\n }\n } catch (error) {\n if (isMissingPathError(error)) {\n continue;\n }\n throw error;\n }\n }\n}\n\nfunction cacheDirectoryExists(cacheDir: string): boolean {\n try {\n const stat = fs.lstatSync(cacheDir);\n if (stat.isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache path: ${cacheDir}`);\n }\n if (!stat.isDirectory()) {\n throw new Error(`${cacheDir} must be a directory`);\n }\n return true;\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction removePathIfExists(targetPath: string, cacheDir: string): boolean {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n if (!fs.existsSync(targetPath)) {\n return false;\n }\n\n fs.rmSync(targetPath, { recursive: true, force: true });\n return true;\n}\n\nfunction cacheFileExists(targetPath: string, cacheDir: string): boolean {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n try {\n const stat = fs.lstatSync(targetPath);\n if (stat.isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache manifest: ${targetPath}`);\n }\n return stat.isFile();\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction writeManifestAtomic(manifestPath: string, cacheDir: string, manifest: JsonObject): void {\n const tempPath = `${manifestPath}.${process.pid}.tmp`;\n assertNoSymlinkCachePath(tempPath, cacheDir);\n let fd: number | null = null;\n try {\n fd = fs.openSync(tempPath, \"wx\");\n fs.writeFileSync(fd, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n fs.closeSync(fd);\n fd = null;\n fs.renameSync(tempPath, manifestPath);\n } catch (error) {\n if (fd !== null) {\n fs.closeSync(fd);\n }\n fs.rmSync(tempPath, { force: true });\n throw error;\n }\n}\n\nfunction withCacheMutationLock<T>(cacheDir: string, action: () => T): T {\n const lockPath = path.join(cacheDir, CACHE_UPDATE_LOCK);\n assertNoSymlinkCachePath(lockPath, cacheDir);\n let lock: HeldCacheMutationLock | null = null;\n try {\n lock = openCacheMutationLock(lockPath);\n return action();\n } catch (error) {\n if (isExistingPathError(error)) {\n throw new Error(\"another update is already running for this OpenCode cache\");\n }\n throw error;\n } finally {\n if (lock !== null) {\n fs.closeSync(lock.fd);\n removeOwnedCacheMutationLock(lockPath, lock.token);\n }\n }\n}\n\nfunction openCacheMutationLock(lockPath: string): HeldCacheMutationLock {\n try {\n return writeCacheMutationLock(lockPath);\n } catch (error) {\n if (!isExistingPathError(error) || !isStaleCacheMutationLock(lockPath)) {\n throw error;\n }\n removeStaleCacheMutationLock(lockPath);\n return writeCacheMutationLock(lockPath);\n }\n}\n\nfunction writeCacheMutationLock(lockPath: string): HeldCacheMutationLock {\n const fd = fs.openSync(lockPath, \"wx\");\n const token = randomUUID();\n try {\n const lock: CacheMutationLock = { pid: process.pid, createdAt: Date.now(), token };\n fs.writeFileSync(fd, `${JSON.stringify(lock)}\\n`, \"utf8\");\n return { fd, token };\n } catch (error) {\n fs.closeSync(fd);\n fs.rmSync(lockPath, { force: true });\n throw error;\n }\n}\n\nfunction isStaleCacheMutationLock(lockPath: string): boolean {\n const lock = readCacheMutationLock(lockPath);\n if (!lock) {\n return isLegacyCacheMutationLockStale(lockPath);\n }\n if (Date.now() - lock.createdAt < CACHE_LOCK_STALE_MS) {\n return false;\n }\n return !isProcessRunning(lock.pid);\n}\n\nfunction isLegacyCacheMutationLockStale(lockPath: string): boolean {\n try {\n const pid = readLegacyCacheMutationLockPid(lockPath);\n if (pid !== null && isProcessRunning(pid)) {\n return false;\n }\n return Date.now() - fs.statSync(lockPath).mtimeMs >= CACHE_LOCK_STALE_MS;\n } catch {\n return false;\n }\n}\n\nfunction readLegacyCacheMutationLockPid(lockPath: string): number | null {\n const raw = fs.readFileSync(lockPath, \"utf8\").trim();\n if (!/^\\d+$/.test(raw)) {\n return null;\n }\n const pid = Number(raw);\n return Number.isSafeInteger(pid) && pid > 0 ? pid : null;\n}\n\nfunction readCacheMutationLock(lockPath: string): CacheMutationLock | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(lockPath, \"utf8\")) as Partial<CacheMutationLock>;\n const { pid, createdAt, token } = parsed;\n const hasToken = token === undefined || (typeof token === \"string\" && token.length > 0);\n if (typeof pid === \"number\" && typeof createdAt === \"number\" && hasToken\n && Number.isInteger(pid) && Number.isFinite(createdAt)) {\n return token === undefined ? { pid, createdAt } : { pid, createdAt, token };\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && \"code\" in error && error.code === \"EPERM\";\n }\n}\n\nfunction createExistingLockError(): NodeJS.ErrnoException {\n const error = new Error(\"cache update lock changed before stale cleanup\") as NodeJS.ErrnoException;\n error.code = \"EEXIST\";\n return error;\n}\n\nfunction removeStaleCacheMutationLock(lockPath: string): void {\n const content = fs.readFileSync(lockPath, \"utf8\");\n if (!isStaleCacheMutationLock(lockPath) || fs.readFileSync(lockPath, \"utf8\") !== content) {\n throw createExistingLockError();\n }\n fs.rmSync(lockPath, { force: true });\n}\n\nfunction removeOwnedCacheMutationLock(lockPath: string, token: string): void {\n const lock = readCacheMutationLock(lockPath);\n if (lock?.token === token) {\n fs.rmSync(lockPath, { force: true });\n }\n}\n\nfunction preflightCacheMutationPaths(cacheDir: string, paths: readonly string[]): void {\n for (const targetPath of paths) {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n }\n}\n\nfunction isJsonObject(value: JsonValue | undefined): value is JsonObject {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction removeDependencyPin(manifest: JsonObject, section: DependencySection): boolean {\n const dependencies = manifest[section];\n if (!isJsonObject(dependencies) || !(PLUGIN_NAME in dependencies)) {\n return false;\n }\n\n delete dependencies[PLUGIN_NAME];\n if (Object.keys(dependencies).length === 0) {\n delete manifest[section];\n }\n return true;\n}\n\nfunction removeManifestPin(cacheDir: string): boolean {\n const manifestPath = path.join(cacheDir, CACHE_MANIFEST);\n if (!cacheFileExists(manifestPath, cacheDir)) {\n return false;\n }\n\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as JsonValue;\n if (!isJsonObject(manifest)) {\n throw new Error(`${CACHE_MANIFEST} must contain a JSON object`);\n }\n\n const removed = DEPENDENCY_SECTIONS\n .map((section) => removeDependencyPin(manifest, section))\n .some(Boolean);\n if (removed) {\n writeManifestAtomic(manifestPath, cacheDir, manifest);\n }\n return removed;\n}\n\nexport function runUpdate(): UpdateResult {\n const cacheDir = getCacheDir();\n const nodeModulesDir = path.join(cacheDir, \"node_modules\");\n const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);\n const lockfilePath = path.join(cacheDir, CACHE_LOCKFILE);\n\n try {\n if (!cacheDirectoryExists(cacheDir)) {\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n preflightCacheMutationPaths(cacheDir, [\n path.join(cacheDir, CACHE_MANIFEST),\n pluginCacheDir,\n lockfilePath,\n path.join(cacheDir, CACHE_UPDATE_LOCK)\n ]);\n const cleared = withCacheMutationLock(cacheDir, () => {\n const manifestPinRemoved = removeManifestPin(cacheDir);\n const packageRemoved = removePathIfExists(pluginCacheDir, cacheDir);\n const lockfileRemoved = removePathIfExists(lockfilePath, cacheDir);\n return packageRemoved || manifestPinRemoved || lockfileRemoved;\n });\n\n if (!cleared) {\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n return {\n success: true,\n message: \"Cache repaired. OpenCode will install the latest version on next run.\",\n cleared: true\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to clear cache: ${message}`,\n cleared: false\n };\n }\n}\n"],"mappings":"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","names":[]}
|