@agentrhq/webcmd 0.1.1 → 0.1.2
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 +317 -24
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +72 -0
- package/dist/src/adapter-shadow.test.d.ts +1 -0
- package/dist/src/adapter-shadow.test.js +49 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +24 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/adapter-source.test.js +29 -0
- package/dist/src/brand.d.ts +9 -0
- package/dist/src/brand.js +9 -0
- package/dist/src/brand.test.d.ts +1 -0
- package/dist/src/brand.test.js +15 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +405 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/analyze.test.js +209 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.e2e.test.js +105 -0
- package/dist/src/browser/article-extract.js +169 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/article-extract.test.js +94 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +217 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.test.js +91 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +1060 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/base-page.test.js +803 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +24 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.test.js +58 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +58 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp-click-fixture.test.js +87 -0
- package/dist/src/browser/cdp.d.ts +46 -0
- package/dist/src/browser/cdp.js +536 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/cdp.test.js +79 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +112 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/compound.test.js +175 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +14 -0
- package/dist/src/browser/daemon-client.d.ts +32 -0
- package/dist/src/browser/daemon-client.js +135 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-client.test.js +326 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +147 -0
- package/dist/src/browser/daemon-transport.d.ts +54 -0
- package/dist/src/browser/daemon-transport.js +68 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +12 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +239 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-helpers.test.js +106 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +894 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/dom-snapshot.test.js +313 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +79 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/errors.test.js +60 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +132 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/extract.test.js +129 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +398 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/find.test.js +180 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +112 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/html-tree.test.js +181 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +12 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +78 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-cache.test.js +75 -0
- package/dist/src/browser/network-interceptor.d.ts +11 -0
- package/dist/src/browser/network-interceptor.js +11 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +66 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/network-key.test.js +49 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +453 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/page.test.js +406 -0
- package/dist/src/browser/profile.d.ts +14 -0
- package/dist/src/browser/profile.js +86 -0
- package/dist/src/browser/protocol.d.ts +63 -0
- package/dist/src/browser/protocol.js +1 -0
- package/dist/src/browser/runtime/local-cloak/actions.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/actions.js +240 -0
- package/dist/src/browser/runtime/local-cloak/downloads.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/downloads.js +28 -0
- package/dist/src/browser/runtime/local-cloak/network.d.ts +28 -0
- package/dist/src/browser/runtime/local-cloak/network.js +120 -0
- package/dist/src/browser/runtime/local-cloak/network.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/network.test.js +124 -0
- package/dist/src/browser/runtime/local-cloak/profiles.d.ts +6 -0
- package/dist/src/browser/runtime/local-cloak/profiles.js +17 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.js +19 -0
- package/dist/src/browser/runtime/local-cloak/provider.d.ts +15 -0
- package/dist/src/browser/runtime/local-cloak/provider.js +27 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.js +244 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +77 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.js +280 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +92 -0
- package/dist/src/browser/runtime/provider.d.ts +9 -0
- package/dist/src/browser/runtime/provider.js +1 -0
- package/dist/src/browser/runtime/provider.test.d.ts +2 -0
- package/dist/src/browser/runtime/provider.test.js +49 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +101 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape-filter.test.js +101 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +95 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/shape.test.js +82 -0
- package/dist/src/browser/stealth.d.ts +11 -0
- package/dist/src/browser/stealth.js +359 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/stealth.test.js +134 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +70 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +45 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-errors.test.js +94 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +570 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.test.js +118 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +64 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/utils.test.js +29 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +318 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.test.js +219 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +108 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/browser.test.js +297 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +363 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/build-manifest.test.js +341 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +56 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/capabilityRouting.test.js +63 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +303 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.test.js +304 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +3350 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/cli.test.js +3041 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +208 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commanderAdapter.test.js +352 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +434 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/auth.test.js +252 -0
- package/dist/src/commands/daemon.d.ts +9 -0
- package/dist/src/commands/daemon.js +91 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/commands/daemon.test.js +293 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +88 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +61 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +68 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/completion.test.js +24 -0
- package/dist/src/constants.d.ts +18 -0
- package/dist/src/constants.js +41 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +553 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/convention-audit.test.js +255 -0
- package/dist/src/daemon/server.d.ts +13 -0
- package/dist/src/daemon/server.js +185 -0
- package/dist/src/daemon/server.test.d.ts +1 -0
- package/dist/src/daemon/server.test.js +132 -0
- package/dist/src/daemon-utils.d.ts +18 -0
- package/dist/src/daemon-utils.js +37 -0
- package/dist/src/daemon.d.ts +1 -0
- package/dist/src/daemon.js +27 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/daemon.test.js +60 -0
- package/dist/src/discovery.d.ts +46 -0
- package/dist/src/discovery.js +341 -0
- package/dist/src/doctor.d.ts +39 -0
- package/dist/src/doctor.js +168 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/doctor.test.js +302 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +305 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/article-download.test.js +235 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +363 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/index.test.js +174 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +127 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/media-download.test.js +112 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +120 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/download/progress.test.js +36 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +91 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/electron-apps.test.js +76 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/engine.test.js +312 -0
- package/dist/src/errors.d.ts +114 -0
- package/dist/src/errors.js +174 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/errors.test.js +109 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +509 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/execution.test.js +645 -0
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +211 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/external.test.js +110 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +556 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/help.test.js +58 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +58 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/hooks.test.js +92 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +183 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/interceptor.test.js +81 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +226 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/launcher.test.js +153 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +49 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +177 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +9 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +174 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/node-network.test.js +55 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +260 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/artifact.test.js +121 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +7 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +27 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/manager.test.js +13 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +81 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/redaction.test.js +32 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +160 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/retention.test.js +118 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +45 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.test.js +22 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +50 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +152 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/output.test.js +53 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-exports.test.js +112 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +41 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +93 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/executor.test.js +182 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +5 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +55 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +86 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +252 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/download.test.js +102 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +122 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.test.js +117 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +50 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +93 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +70 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +344 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/template.test.js +197 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.js +133 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +160 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-manifest.test.js +179 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +143 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.test.js +83 -0
- package/dist/src/plugin.d.ts +146 -0
- package/dist/src/plugin.js +1303 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/plugin.test.js +1363 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +10 -0
- package/dist/src/registry.d.ts +123 -0
- package/dist/src/registry.js +125 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/registry.test.js +209 -0
- package/dist/src/runtime-copy.test.d.ts +1 -0
- package/dist/src/runtime-copy.test.js +29 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +47 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime-detect.test.js +39 -0
- package/dist/src/runtime-identity.test.d.ts +1 -0
- package/dist/src/runtime-identity.test.js +18 -0
- package/dist/src/runtime.d.ts +47 -0
- package/dist/src/runtime.js +54 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +25 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +20 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +48 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +103 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/serialization.test.js +78 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +127 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/skills.test.js +71 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +338 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/snapshotFormatter.test.js +521 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +179 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/tui.test.js +19 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +7 -0
- package/dist/src/update-check.d.ts +66 -0
- package/dist/src/update-check.js +206 -0
- package/dist/src/update-check.test.d.ts +1 -0
- package/dist/src/update-check.test.js +117 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +152 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/utils.test.js +155 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +130 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/validate.test.js +90 -0
- package/dist/src/verify.d.ts +26 -0
- package/dist/src/verify.js +67 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +22 -0
- package/dist/src/weixin-download.test.d.ts +1 -0
- package/dist/src/weixin-download.test.js +45 -0
- package/package.json +4 -3
- package/scripts/check-package-bin.mjs +95 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface ExternalCliInstall {
|
|
2
|
+
mac?: string;
|
|
3
|
+
linux?: string;
|
|
4
|
+
windows?: string;
|
|
5
|
+
default?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ExternalCliConfig {
|
|
8
|
+
/** User-facing Webcmd subcommand and, by default, the executable name. */
|
|
9
|
+
name: string;
|
|
10
|
+
binary: string;
|
|
11
|
+
/**
|
|
12
|
+
* Display alias rendered alongside `name` in help/listing as `name(package)`.
|
|
13
|
+
* Use either the upstream distribution/project name (e.g. `tg-cli`, `discord-cli`)
|
|
14
|
+
* or a human-readable brand label (e.g. `notion`, `企业微信`) when the bare
|
|
15
|
+
* executable name is ambiguous.
|
|
16
|
+
*/
|
|
17
|
+
package?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
homepage?: string;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
install?: ExternalCliInstall;
|
|
22
|
+
}
|
|
23
|
+
export declare function loadExternalClis(): ExternalCliConfig[];
|
|
24
|
+
export declare function isBinaryInstalled(binary: string): boolean;
|
|
25
|
+
export declare function getInstallCmd(installConfig?: ExternalCliInstall): string | null;
|
|
26
|
+
export declare function formatExternalCliLabel(cli: ExternalCliConfig): string;
|
|
27
|
+
/**
|
|
28
|
+
* Safely parses a command string into a binary and argument list.
|
|
29
|
+
* Rejects commands containing shell operators (&&, ||, |, ;, >, <, `) that
|
|
30
|
+
* cannot be safely expressed as execFileSync arguments.
|
|
31
|
+
*
|
|
32
|
+
* Args:
|
|
33
|
+
* cmd: Raw command string from YAML config (e.g. "brew install gh")
|
|
34
|
+
*
|
|
35
|
+
* Returns:
|
|
36
|
+
* Object with `binary` and `args` fields, or throws on unsafe input.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseCommand(cmd: string): {
|
|
39
|
+
binary: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
};
|
|
42
|
+
export declare function installExternalCli(cli: ExternalCliConfig): boolean;
|
|
43
|
+
export declare function executeExternalCli(name: string, args: string[], preloaded?: ExternalCliConfig[]): void;
|
|
44
|
+
export interface RegisterOptions {
|
|
45
|
+
binary?: string;
|
|
46
|
+
install?: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function registerExternalCli(name: string, opts?: RegisterOptions): void;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { spawnSync, execFileSync } from 'node:child_process';
|
|
6
|
+
import yaml from 'js-yaml';
|
|
7
|
+
import { log } from './logger.js';
|
|
8
|
+
import { EXIT_CODES, getErrorMessage } from './errors.js';
|
|
9
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
function getUserRegistryPath() {
|
|
11
|
+
const home = os.homedir();
|
|
12
|
+
return path.join(home, '.webcmd', 'external-clis.yaml');
|
|
13
|
+
}
|
|
14
|
+
let _cachedExternalClis = null;
|
|
15
|
+
export function loadExternalClis() {
|
|
16
|
+
if (_cachedExternalClis)
|
|
17
|
+
return _cachedExternalClis;
|
|
18
|
+
const configs = new Map();
|
|
19
|
+
// 1. Load built-in
|
|
20
|
+
const builtinPath = path.resolve(__dirname, 'external-clis.yaml');
|
|
21
|
+
try {
|
|
22
|
+
if (fs.existsSync(builtinPath)) {
|
|
23
|
+
const raw = fs.readFileSync(builtinPath, 'utf8');
|
|
24
|
+
const parsed = (yaml.load(raw) || []);
|
|
25
|
+
for (const item of parsed)
|
|
26
|
+
configs.set(item.name, item);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
log.warn(`Failed to parse built-in external-clis.yaml: ${getErrorMessage(err)}`);
|
|
31
|
+
}
|
|
32
|
+
// 2. Load user custom
|
|
33
|
+
const userPath = getUserRegistryPath();
|
|
34
|
+
try {
|
|
35
|
+
if (fs.existsSync(userPath)) {
|
|
36
|
+
const raw = fs.readFileSync(userPath, 'utf8');
|
|
37
|
+
const parsed = (yaml.load(raw) || []);
|
|
38
|
+
for (const item of parsed) {
|
|
39
|
+
configs.set(item.name, item); // Overwrite built-in if duplicated
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
log.warn(`Failed to parse user external-clis.yaml: ${getErrorMessage(err)}`);
|
|
45
|
+
}
|
|
46
|
+
_cachedExternalClis = Array.from(configs.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
47
|
+
return _cachedExternalClis;
|
|
48
|
+
}
|
|
49
|
+
export function isBinaryInstalled(binary) {
|
|
50
|
+
try {
|
|
51
|
+
const isWindows = os.platform() === 'win32';
|
|
52
|
+
execFileSync(isWindows ? 'where' : 'which', [binary], { stdio: 'ignore' });
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function getInstallCmd(installConfig) {
|
|
60
|
+
if (!installConfig)
|
|
61
|
+
return null;
|
|
62
|
+
const platform = os.platform();
|
|
63
|
+
if (platform === 'darwin' && installConfig.mac)
|
|
64
|
+
return installConfig.mac;
|
|
65
|
+
if (platform === 'linux' && installConfig.linux)
|
|
66
|
+
return installConfig.linux;
|
|
67
|
+
if (platform === 'win32' && installConfig.windows)
|
|
68
|
+
return installConfig.windows;
|
|
69
|
+
if (installConfig.default)
|
|
70
|
+
return installConfig.default;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
export function formatExternalCliLabel(cli) {
|
|
74
|
+
return cli.package && cli.package !== cli.name ? `${cli.name}(${cli.package})` : cli.name;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Safely parses a command string into a binary and argument list.
|
|
78
|
+
* Rejects commands containing shell operators (&&, ||, |, ;, >, <, `) that
|
|
79
|
+
* cannot be safely expressed as execFileSync arguments.
|
|
80
|
+
*
|
|
81
|
+
* Args:
|
|
82
|
+
* cmd: Raw command string from YAML config (e.g. "brew install gh")
|
|
83
|
+
*
|
|
84
|
+
* Returns:
|
|
85
|
+
* Object with `binary` and `args` fields, or throws on unsafe input.
|
|
86
|
+
*/
|
|
87
|
+
export function parseCommand(cmd) {
|
|
88
|
+
const shellOperators = /&&|\|\|?|;|[><`$#\n\r]|\$\(/;
|
|
89
|
+
if (shellOperators.test(cmd)) {
|
|
90
|
+
throw new Error(`Install command contains unsafe shell operators and cannot be executed securely: "${cmd}". ` +
|
|
91
|
+
`Please install the tool manually.`);
|
|
92
|
+
}
|
|
93
|
+
// Tokenise respecting single- and double-quoted segments (no variable expansion).
|
|
94
|
+
const tokens = [];
|
|
95
|
+
const re = /(?:"([^"]*)")|(?:'([^']*)')|(\S+)/g;
|
|
96
|
+
let match;
|
|
97
|
+
while ((match = re.exec(cmd)) !== null) {
|
|
98
|
+
tokens.push(match[1] ?? match[2] ?? match[3]);
|
|
99
|
+
}
|
|
100
|
+
if (tokens.length === 0) {
|
|
101
|
+
throw new Error(`Install command is empty.`);
|
|
102
|
+
}
|
|
103
|
+
const [binary, ...args] = tokens;
|
|
104
|
+
return { binary, args };
|
|
105
|
+
}
|
|
106
|
+
function shouldRetryWithCmdShim(binary, err) {
|
|
107
|
+
const code = err instanceof Error ? err.code : undefined;
|
|
108
|
+
return os.platform() === 'win32' && !path.extname(binary) && code === 'ENOENT';
|
|
109
|
+
}
|
|
110
|
+
function runInstallCommand(cmd) {
|
|
111
|
+
const { binary, args } = parseCommand(cmd);
|
|
112
|
+
try {
|
|
113
|
+
execFileSync(binary, args, { stdio: 'inherit' });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (shouldRetryWithCmdShim(binary, err)) {
|
|
117
|
+
execFileSync(`${binary}.cmd`, args, { stdio: 'inherit' });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function installExternalCli(cli) {
|
|
124
|
+
if (!cli.install) {
|
|
125
|
+
log.error(`No auto-install command configured for '${cli.name}'.`);
|
|
126
|
+
log.info(`Please install '${cli.binary}' manually.`);
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const cmd = getInstallCmd(cli.install);
|
|
130
|
+
if (!cmd) {
|
|
131
|
+
log.error(`No install command for your platform (${os.platform()}) for '${cli.name}'.`);
|
|
132
|
+
if (cli.homepage)
|
|
133
|
+
log.info(`See: ${cli.homepage}`);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
log.info(`'${cli.name}' is not installed. Auto-installing...`);
|
|
137
|
+
log.verbose(`$ ${cmd}`);
|
|
138
|
+
try {
|
|
139
|
+
runInstallCommand(cmd);
|
|
140
|
+
log.success(`Installed '${cli.name}' successfully.`);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
log.error(`Failed to install '${cli.name}': ${getErrorMessage(err)}`);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export function executeExternalCli(name, args, preloaded) {
|
|
149
|
+
const configs = preloaded ?? loadExternalClis();
|
|
150
|
+
const cli = configs.find((c) => c.name === name);
|
|
151
|
+
if (!cli) {
|
|
152
|
+
throw new Error(`External CLI '${name}' not found in registry.`);
|
|
153
|
+
}
|
|
154
|
+
// 1. Check if installed
|
|
155
|
+
if (!isBinaryInstalled(cli.binary)) {
|
|
156
|
+
// 2. Try to auto install
|
|
157
|
+
const success = installExternalCli(cli);
|
|
158
|
+
if (!success) {
|
|
159
|
+
process.exitCode = EXIT_CODES.SERVICE_UNAVAIL;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 3. Passthrough execution with stdio inherited
|
|
164
|
+
const result = spawnSync(cli.binary, args, { stdio: 'inherit' });
|
|
165
|
+
if (result.error) {
|
|
166
|
+
log.error(`Failed to execute '${cli.binary}': ${result.error.message}`);
|
|
167
|
+
process.exitCode = EXIT_CODES.GENERIC_ERROR;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (result.status !== null) {
|
|
171
|
+
process.exitCode = result.status;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export function registerExternalCli(name, opts) {
|
|
175
|
+
const userPath = getUserRegistryPath();
|
|
176
|
+
const configDir = path.dirname(userPath);
|
|
177
|
+
if (!fs.existsSync(configDir)) {
|
|
178
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
179
|
+
}
|
|
180
|
+
let items = [];
|
|
181
|
+
if (fs.existsSync(userPath)) {
|
|
182
|
+
try {
|
|
183
|
+
const raw = fs.readFileSync(userPath, 'utf8');
|
|
184
|
+
items = (yaml.load(raw) || []);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Ignore
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const existingIndex = items.findIndex((c) => c.name === name);
|
|
191
|
+
const newItem = {
|
|
192
|
+
name,
|
|
193
|
+
binary: opts?.binary || name,
|
|
194
|
+
};
|
|
195
|
+
if (opts?.description)
|
|
196
|
+
newItem.description = opts.description;
|
|
197
|
+
if (opts?.install)
|
|
198
|
+
newItem.install = { default: opts.install };
|
|
199
|
+
if (existingIndex >= 0) {
|
|
200
|
+
items[existingIndex] = { ...items[existingIndex], ...newItem };
|
|
201
|
+
log.success(`Updated '${name}' in user registry.`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
items.push(newItem);
|
|
205
|
+
log.success(`Registered '${name}' in user registry.`);
|
|
206
|
+
}
|
|
207
|
+
const dump = yaml.dump(items, { indent: 2, sortKeys: true });
|
|
208
|
+
fs.writeFileSync(userPath, dump, 'utf8');
|
|
209
|
+
_cachedExternalClis = null; // Invalidate cache so next load reflects the change
|
|
210
|
+
log.verbose(userPath);
|
|
211
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import yaml from 'js-yaml';
|
|
6
|
+
const { mockExecFileSync, mockPlatform } = vi.hoisted(() => ({
|
|
7
|
+
mockExecFileSync: vi.fn(),
|
|
8
|
+
mockPlatform: vi.fn(() => 'darwin'),
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('node:child_process', () => ({
|
|
11
|
+
spawnSync: vi.fn(),
|
|
12
|
+
execFileSync: mockExecFileSync,
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('node:os', async () => {
|
|
15
|
+
const actual = await vi.importActual('node:os');
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
platform: mockPlatform,
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
import { formatExternalCliLabel, installExternalCli, parseCommand } from './external.js';
|
|
22
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
describe('parseCommand', () => {
|
|
24
|
+
it('splits binaries and quoted arguments without invoking a shell', () => {
|
|
25
|
+
expect(parseCommand('npm install -g "@scope/tool name"')).toEqual({
|
|
26
|
+
binary: 'npm',
|
|
27
|
+
args: ['install', '-g', '@scope/tool name'],
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('rejects shell operators', () => {
|
|
31
|
+
expect(() => parseCommand('brew install gh && rm -rf /')).toThrow('Install command contains unsafe shell operators');
|
|
32
|
+
});
|
|
33
|
+
it('rejects command substitution and multiline input', () => {
|
|
34
|
+
expect(() => parseCommand('brew install $(whoami)')).toThrow('Install command contains unsafe shell operators');
|
|
35
|
+
expect(() => parseCommand('brew install gh\nrm -rf /')).toThrow('Install command contains unsafe shell operators');
|
|
36
|
+
});
|
|
37
|
+
it('keeps built-in install commands compatible with the shell-free parser', () => {
|
|
38
|
+
const raw = fs.readFileSync(path.join(__dirname, 'external-clis.yaml'), 'utf8');
|
|
39
|
+
const entries = (yaml.load(raw) || []);
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
for (const command of Object.values(entry.install ?? {})) {
|
|
42
|
+
if (command)
|
|
43
|
+
expect(() => parseCommand(command)).not.toThrow();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('registers Longbridge with safe package-manager installers only', () => {
|
|
48
|
+
const raw = fs.readFileSync(path.join(__dirname, 'external-clis.yaml'), 'utf8');
|
|
49
|
+
const entries = (yaml.load(raw) || []);
|
|
50
|
+
const longbridge = entries.find((entry) => entry.name === 'longbridge');
|
|
51
|
+
expect(longbridge).toMatchObject({
|
|
52
|
+
binary: 'longbridge',
|
|
53
|
+
homepage: 'https://open.longbridge.com/zh-CN/docs/cli/',
|
|
54
|
+
install: {
|
|
55
|
+
mac: 'brew install --cask longbridge/tap/longbridge-terminal',
|
|
56
|
+
windows: 'scoop install https://open.longbridge.com/longbridge/longbridge-terminal/longbridge.json',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
expect(longbridge?.install?.linux).toBeUndefined();
|
|
60
|
+
expect(longbridge?.install?.default).toBeUndefined();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('formatExternalCliLabel', () => {
|
|
64
|
+
it('shows the package name when the executable name differs', () => {
|
|
65
|
+
expect(formatExternalCliLabel({ name: 'wx', binary: 'wx', package: 'wx-cli' })).toBe('wx(wx-cli)');
|
|
66
|
+
});
|
|
67
|
+
it('keeps the label compact when package and name match', () => {
|
|
68
|
+
expect(formatExternalCliLabel({ name: 'docker', binary: 'docker', package: 'docker' })).toBe('docker');
|
|
69
|
+
});
|
|
70
|
+
it('renders a human-readable brand alias for ambiguous executable names', () => {
|
|
71
|
+
expect(formatExternalCliLabel({ name: 'ntn', binary: 'ntn', package: 'notion' })).toBe('ntn(notion)');
|
|
72
|
+
expect(formatExternalCliLabel({ name: 'wecom-cli', binary: 'wecom-cli', package: '企业微信' })).toBe('wecom-cli(企业微信)');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('installExternalCli', () => {
|
|
76
|
+
const cli = {
|
|
77
|
+
name: 'readwise',
|
|
78
|
+
binary: 'readwise',
|
|
79
|
+
install: {
|
|
80
|
+
default: 'npm install -g @readwiseio/readwise-cli',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
mockExecFileSync.mockReset();
|
|
85
|
+
mockPlatform.mockReturnValue('darwin');
|
|
86
|
+
});
|
|
87
|
+
it('retries with .cmd on Windows when the bare binary is unavailable', () => {
|
|
88
|
+
mockPlatform.mockReturnValue('win32');
|
|
89
|
+
mockExecFileSync
|
|
90
|
+
.mockImplementationOnce(() => {
|
|
91
|
+
const err = new Error('not found');
|
|
92
|
+
err.code = 'ENOENT';
|
|
93
|
+
throw err;
|
|
94
|
+
})
|
|
95
|
+
.mockReturnValueOnce(Buffer.from(''));
|
|
96
|
+
expect(installExternalCli(cli)).toBe(true);
|
|
97
|
+
expect(mockExecFileSync).toHaveBeenNthCalledWith(1, 'npm', ['install', '-g', '@readwiseio/readwise-cli'], { stdio: 'inherit' });
|
|
98
|
+
expect(mockExecFileSync).toHaveBeenNthCalledWith(2, 'npm.cmd', ['install', '-g', '@readwiseio/readwise-cli'], { stdio: 'inherit' });
|
|
99
|
+
});
|
|
100
|
+
it('does not mask non-ENOENT failures', () => {
|
|
101
|
+
mockPlatform.mockReturnValue('win32');
|
|
102
|
+
mockExecFileSync.mockImplementationOnce(() => {
|
|
103
|
+
const err = new Error('permission denied');
|
|
104
|
+
err.code = 'EACCES';
|
|
105
|
+
throw err;
|
|
106
|
+
});
|
|
107
|
+
expect(installExternalCli(cli)).toBe(false);
|
|
108
|
+
expect(mockExecFileSync).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { CliCommand } from './registry.js';
|
|
3
|
+
export type StructuredHelpFormat = 'yaml' | 'json';
|
|
4
|
+
export interface ArgSpec {
|
|
5
|
+
name: string;
|
|
6
|
+
required?: true;
|
|
7
|
+
variadic?: true;
|
|
8
|
+
help?: string;
|
|
9
|
+
default?: unknown;
|
|
10
|
+
choices?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface OptionSpec {
|
|
13
|
+
name: string;
|
|
14
|
+
flags: string;
|
|
15
|
+
help?: string;
|
|
16
|
+
takes_value?: 'required' | 'optional';
|
|
17
|
+
required?: true;
|
|
18
|
+
default?: unknown;
|
|
19
|
+
choices?: string[];
|
|
20
|
+
negate?: true;
|
|
21
|
+
}
|
|
22
|
+
export declare function getRequestedHelpFormat(argv?: readonly string[]): StructuredHelpFormat | undefined;
|
|
23
|
+
export declare function renderStructuredHelp(data: unknown, format: StructuredHelpFormat): string;
|
|
24
|
+
export declare function wrapCommaList(items: readonly string[], opts?: {
|
|
25
|
+
width?: number;
|
|
26
|
+
indent?: string;
|
|
27
|
+
}): string;
|
|
28
|
+
/**
|
|
29
|
+
* Adapter category for help-text grouping.
|
|
30
|
+
*
|
|
31
|
+
* - `site`: web site adapter (real DNS-style domain, e.g. `www.bilibili.com`)
|
|
32
|
+
* - `app`: desktop app adapter (Electron/osascript, signaled by `domain: 'localhost'`
|
|
33
|
+
* or other non-DNS/local endpoint string like `'127.0.0.1'` / `'doubao-app'`)
|
|
34
|
+
*
|
|
35
|
+
* Classification is derived from the adapter's `domain` field — no new schema
|
|
36
|
+
* required. Adapters without a `domain` field default to `site` (most are
|
|
37
|
+
* public web scrapers).
|
|
38
|
+
*/
|
|
39
|
+
export type AdapterKind = 'site' | 'app';
|
|
40
|
+
export declare function classifyAdapter(domain: string | undefined): AdapterKind;
|
|
41
|
+
export interface RootAdapterGroups {
|
|
42
|
+
/** Externally-registered CLIs (docker, gh, vercel, ...) — passthrough binaries */
|
|
43
|
+
external: readonly RootExternalCli[];
|
|
44
|
+
/** Desktop-app adapters (chatgpt-app, chatwise, codex, ...) */
|
|
45
|
+
apps: readonly string[];
|
|
46
|
+
/** Web-site adapters (bilibili, dianping, ...) */
|
|
47
|
+
sites: readonly string[];
|
|
48
|
+
}
|
|
49
|
+
export interface RootExternalCli {
|
|
50
|
+
name: string;
|
|
51
|
+
label: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function formatRootAdapterHelpText(groups: RootAdapterGroups): string;
|
|
54
|
+
/**
|
|
55
|
+
* Extracts a positional placeholder that should appear immediately after this
|
|
56
|
+
* command's name in user-facing path strings. Reads the leading positional
|
|
57
|
+
* (e.g. `<session>`) from a `.usage()` override; commands without a positional
|
|
58
|
+
* override return `null` so the path stays as-is.
|
|
59
|
+
*
|
|
60
|
+
* Example: `browser` declares `.usage('<session> <command> [options]')`,
|
|
61
|
+
* so `commanderPath(browserClickCmd)` becomes
|
|
62
|
+
* `['webcmd', 'browser', '<session>', 'click']`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function leadingPositionalFromUsage(command: Command): string | null;
|
|
65
|
+
export declare function commanderNamespaceHelpData(namespaceRoot: Command, opts?: {
|
|
66
|
+
globalCommand?: Command;
|
|
67
|
+
description?: string;
|
|
68
|
+
}): Record<string, unknown>;
|
|
69
|
+
export declare function commanderCommandHelpData(namespaceRoot: Command, command: Command, opts?: {
|
|
70
|
+
globalCommand?: Command;
|
|
71
|
+
}): Record<string, unknown>;
|
|
72
|
+
export declare function commanderGroupHelpData(namespaceRoot: Command, groupCommand: Command, opts?: {
|
|
73
|
+
globalCommand?: Command;
|
|
74
|
+
}): Record<string, unknown>;
|
|
75
|
+
export declare function installCommanderNamespaceStructuredHelp(namespaceRoot: Command, opts?: {
|
|
76
|
+
globalCommand?: Command;
|
|
77
|
+
description?: string;
|
|
78
|
+
}): void;
|
|
79
|
+
export declare function formatCommandListTerm(cmd: CliCommand): string;
|
|
80
|
+
export declare function rootHelpData(program: Command, groups: RootAdapterGroups): Record<string, unknown>;
|
|
81
|
+
export declare function siteHelpData(site: string, commands: readonly CliCommand[]): Record<string, unknown>;
|
|
82
|
+
export declare function commandHelpData(cmd: CliCommand): Record<string, unknown>;
|
|
83
|
+
export declare function formatCommonOptionsHelpText(): string;
|
|
84
|
+
export declare function formatBrowserCommonOptionsHelpText(): string;
|
|
85
|
+
export declare function formatSiteHelpText(site: string, commands: readonly CliCommand[]): string;
|
|
86
|
+
export declare function formatCommandHelpText(cmd: CliCommand): string;
|
|
87
|
+
export declare function installStructuredHelp(command: Command, data: () => unknown, textSuffix?: string | (() => string)): void;
|
|
88
|
+
export declare function formatSiteCommandDescription(cmd: CliCommand): string;
|