Uh oh!
There was an error while loading. Please reload this page.
fix(cli)!: remove browser fork, add adapter override to hosted mode - #361
Merged
Conversation
`webcmd browser fork` was an undocumented alias bound to the same handler as `webcmd adapter override`. It leaked the alias immediately: $ webcmd browser fork hackernews Error: Usage: webcmd adapter override <site>/<command> (got "hackernews") The error names a command the caller did not run, and nothing in docs/, skills/, README, or CHANGELOG ever referenced `browser fork`. It also sat in the browser namespace behind a `require-existing` session policy for what is a local file copy. Remove the local registration and the hosted catalog entry, so `adapter override` is the single fork path in both modes. `browser <retired>` now reports the replacement instead of a bare unknown command, and unknown browser subcommands exit 2 (USAGE_ERROR) rather than 1: $ webcmd browser fork hackernews error: 'webcmd browser fork' was removed. Use: webcmd adapter override <site>/<command> `fork` stays in BROWSER_SUBCOMMAND_NAMES: the preprocessor reads an unreserved token after `browser` as a retired positional session id, so dropping it would answer with "Browser sessions are root selectors" instead. The comment there now says retired names are kept on purpose — the set was already a superset of the declared subcommands. Also corrects the usage string in the adapter-shadow hint, which showed `adapter override <site> <command>` for a command that takes one `<site>/<command>` positional. BREAKING CHANGE: `webcmd browser fork` is removed. Use `webcmd adapter override <site>/<command>`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
🟠 Maintainer review suggested — low confidenceThe automated review could not reach a fully supported conclusion. Limitations
This review is advisory and does not block merging. |
Removing `browser fork` in the previous commit took away hosted mode's only way to fork an adapter: `adapter override` was never routed in hosted mode (runner.ts matched only `source`, `path`, and help), and cloud exposes no override route — `forkSystemAdapterCommand` had exactly one caller, the `fork` browser action. Route `adapter override <site>/<command>` in hosted mode to the new `POST /v1/adapters/override`, so the command means the same thing in both modes: fork an installed upstream command into a private copy you can edit, refusing commands that are not installed upstream and commands already forked. Storage differs, so the output does. Local prints the file it wrote and its `.base` copy; hosted prints the private package id and the source file, and points at `adapter source get|put` as the editing path — the hosted analogue of editing the file at `adapter path`. Requires the matching webcmd-cloud change; without it the route 404s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 19, 2026
Agnik47 added a commit
to Agnik47/webcmd
that referenced
this pull request
Aug 20, 2026
…q#361agentrhq#361 landed on main after this branch was opened and already removed `browser fork` for good (retirement redirect to `adapter override`). Rebasing reintroduced this PR's now-stale fork re-registration, which duplicated that removal and broke the retirement tests. Drop it and update the grouping/tests/docs to match the current adapter authoring surface (init, verify).
Agnik47 added a commit
to Agnik47/webcmd
that referenced
this pull request
Aug 20, 2026
…q#361agentrhq#361 landed on main after this branch was opened and already removed `browser fork` for good (retirement redirect to `adapter override`). Rebasing reintroduced this PR's now-stale fork re-registration, which duplicated that removal and broke the retirement tests. Drop it and update the grouping/tests/docs to match the current adapter authoring surface (init, verify).
Agnik47 added a commit
to Agnik47/webcmd
that referenced
this pull request
Aug 28, 2026
…gentrhq#317) `browser --help` listed its session commands and its adapter-authoring commands in one flat block, so the two unrelated surfaces read as one. Group them from the shared catalog: `tabs`, `bind`, `run`, `snapshot`, and `close` under "Browser session commands", `init` and `verify` under "Adapter authoring commands". Local and hosted help draw from the same catalog, so they stay aligned. `browser fork` is also removed here. It ran the same action as the adapter command and only existed as a hidden re-registration, which agentrhq#361 superseded; `adapter override` gains a `fork` alias so the local spelling survives. Rebased onto 0.7.10. Three upstream changes landed in the same lines and are kept: the structured-help imports from agentrhq#425/agentrhq#428, `BROWSER_RUN_HELP_TEXT`, and the `adapter override` description and hosted artifact-download paragraph. The alias is additive to that description rather than replacing it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
webcmd browser forkwas an undocumented alias bound to the same handler aswebcmd adapter override, and it leaked the alias in its own error message:The caller is told the usage of a command they did not run.
browser forkappears nowhere indocs/,skills/,README.md, orCHANGELOG.md— it was only ever reachable by guessing. It also sat in the browser namespace behind arequire-existingsession policy for what is a local file copy.This removes it from the local CLI and from the hosted browser catalog.
adapter overridein hosted mode (second commit)browser forkturned out to be hosted's only fork path.adapter overridewas never routed in hosted mode —src/hosted/runner.tsmatched onlysource,path, and help — and cloud'sforkSystemAdapterCommandhad exactly one caller: theforkbrowser action. Removingbrowser forkalone would have taken hosted's fork capability away with no replacement.So the second commit routes
adapter override <site>/<command>in hosted mode to a newPOST /v1/adapters/override. After both commits the command means the same thing in either mode: fork an installed upstream command into a private copy you can edit, refusing commands that are not installed upstream and commands already forked.Storage differs, so the output does:
~/.webcmd/clis/<site>/<cmd>.js+.basecopyyours:/base:pathspackage:id +source:fileadapter pathadapter source get|putHOSTED_ADAPTER_FORK_SOURCE_INVALIDHOSTED_ADAPTER_FORK_ALREADY_EXISTSBehaviour after
Unknown browser subcommands now exit
2(USAGE_ERROR) instead of1.Why
forkstays inBROWSER_SUBCOMMAND_NAMESrejectPositionalBrowserSessionArgvreads any unreserved token afterbrowseras the retired positional-session grammar. Droppingforkfrom that set would answerwebcmd browser fork hackernewswith:— worse than what we started with. Retired names stay listed so commander can report them properly. The set was already a superset of the declared subcommands (~40 names, 7 real); the comment now says that is deliberate instead of asking the next person to "keep in sync".
Also
Corrects the usage string in the adapter-shadow hint, which advertised
adapter override <site> <command>(two positionals) for a command that takes one<site>/<command>.Hosted impact
The cloud side is agentrhq/webcmd-cloud#50, which serves
POST /v1/adapters/override, drops theforkaction, and re-pins the parity digests. Without it the hostedadapter overridehere 404s.Order: merge this → bump
PINNED_WEBCMD_SHAin cloud → merge webcmd-cloud#50.Verification
npm run typecheck— cleannpm test— 5682 passed, 1 failed:src/doctor.test.ts:218(profile alias rendering), pre-existing onmain, unrelated to this changenpm run check:hosted-contract— passes; regeneratedhosted-contract.jsonnow lists 7 browser commandsnpm run check:codex-plugin— passesCross-repo, per §7 of
.github/hosted-impact-review.md: packed this branch, installed it into webcmd-cloud, ran cloud's full suite against it — 1189 passed, 0 failed.Follow-ups from the same audit (not in this PR)
runCli()has no error handler, soadapter path,adapter source get|put,site fixture get, andsession close <bad-id>dump raw Node stack traceswebcmd adapter path <site>/<cmd>fails for every command that is not already a local override — the documented private-fork workflow-f json--help -f yamlis missing onsite,skills,session,external🤖 Generated with Claude Code