fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt - #469

Open
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance
Open

fix(cli): name hosted-only mode instead of sending artifact to a plugin hunt#469
Agnik47 wants to merge 2 commits into
agentrhq:mainfrom
Agnik47:fix/hosted-only-command-guidance

Conversation

@Agnik47

@Agnik47Agnik47 commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Symptom

In local mode:

$ webcmd artifact download <url> --output ./a.binSite "artifact" is not installed.Search: webcmd plugin search artifactInstall using the installSource returned by search.

There is no artifact plugin, so that search can only waste a turn — the exact failure mode command-suggest.ts was written to end ("telling the caller to search a plugin marketplace for a plugin that cannot exist").

Cause

artifact is a hosted-mode builtin (src/hosted/runner.ts:449, and in the builtinCommands set at :2134). It is never registered locally, so the token falls through unknownRootCommandMessage to missingPluginGuidance.

What points local users at it is docs/cli-reference.mdx: the Top-Level Commands table listed artifact beside doctor, daemon, and web with no mode marker, and the browser run section gives the literal webcmd artifact download <download-url> --output <local-path>.

Hosted mode already names the mirror-image case with LOCAL_ONLY_COMMAND_HELP. Local mode had no equivalent.

Fix

$ webcmd artifact"artifact" is a hosted-mode command and this installation is in local mode.Run `webcmd setup` and choose hosted mode to use hosted-only commands.
  • HOSTED_ONLY_COMMAND_HELP mirrors the existing LOCAL_ONLY_COMMAND_HELP.
  • isHostedOnlyRootCommand is derived — hosted root help minus WEBCMD_ROOT_COMMANDS — so a hosted command added later is covered without editing this file. Today that set is exactly {artifact}.
  • setup is excluded explicitly. Both modes serve it; it sits outside the local registry only because main.ts:76 answers it before Commander parses argv, which would otherwise read as hosted-only.
  • The check runs before the edit-distance suggestions: an exact hosted name is stronger evidence than a fuzzy guess.
  • The reference table marks artifact "Hosted mode only.", the wording the flag table at --workspace already uses.

Unchanged: unknown sites, near misses (adapterswebcmd adapter), the CANONICAL_ROOT intent overrides, the installed-but-failed-to-load path, and the exit code — still 2, per the envelope contract from #424/#427.

Correction to an earlier revision of this description

An earlier version of this PR said shell completion advertises artifact in both modes. That is wrong, and the code comment repeating it has been fixed. HOSTED_CLIENT_ROOT_COMMANDS feeds only getHostedRootHelp, which is called from hosted/runner.ts; webcmd completion bash and webcmd completion zsh emit no artifact entry in local mode. Completion was already correct — the docs table was not.

Tests

src/command-suggest.test.ts:

  • artifact names the mode boundary and mentions neither plugin search nor is not installed;
  • the same answer regardless of typed case;
  • isHostedOnlyRootCommand is false for every member of WEBCMD_ROOT_COMMANDS, and specifically for web, browser, and doctor — commands served in both surfaces, where a hosted-only claim would be a new lie;
  • setup is not reported hosted-only;
  • the existing "genuinely unknown token still reaches plugin search" test is untouched and passing.

Verified against a built CLI: webcmd artifact and webcmd artifact download both print the new message and exit 2; webcmd bogus still prints the plugin guidance.

npx vitest run --project unit — no new failures against main on this machine (25 pre-existing Windows symlink-EPERM failures on both). npm run typecheck and npm run check:typed-error-lint clean.

…ugin hunt
`webcmd artifact` in local mode answered:
Site "artifact" is not installed.
Search: webcmd plugin search artifact
There is no such plugin. `artifact` is a hosted-mode builtin (hosted/runner.ts),
and shell completion offers it in both modes (completion-shared.ts), so a local
user following either signal was sent after something that cannot be installed.
Hosted mode already names the reverse case with LOCAL_ONLY_COMMAND_HELP. Add the
mirror, and answer an unknown root token that hosted mode serves with the mode
boundary and the way across it.
The hosted-only set is derived — hosted root help minus the local root registry —
so a hosted command added later is covered without editing this file. `setup` is
excluded explicitly: both modes serve it, and it is outside the local registry
only because main.ts answers it before Commander parses argv.
The exact hosted name is settled ahead of the edit-distance suggestions, since a
name that matches exactly is stronger evidence than a fuzzy guess. Unknown sites,
near misses, and the intent overrides are untouched, and the usage exit code
stays 2.
@github-actions

github-actionsBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🟢 No documentation gap found — medium confidence

The automated review found no documentation gap in the supplied changes.

This review is advisory and does not block merging.

The Top-Level Commands table listed `artifact` beside `doctor`, `daemon`, and
`web` with no mode marker, so a local reader saw it as a peer of commands local
mode serves. Use the "Hosted mode only." wording the flag table already uses.
Also corrects the comment added with this fix: shell completion does not offer
`artifact` in local mode. `HOSTED_CLIENT_ROOT_COMMANDS` feeds only
getHostedRootHelp, which is called from hosted/runner.ts, and `webcmd completion
bash|zsh` emits no `artifact` entry locally. The reference table is what pointed
local users at the command.
@Agnik47
Agnik47force-pushed the fix/hosted-only-command-guidance branch from bbb3963 to 1247e90CompareAugust 28, 2026 22:57
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Agnik47