feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82
, '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

feat: add adapter_hints to browser analyze, wire it up as a real command - #236

Open
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints
Open

feat: add adapter_hints to browser analyze, wire it up as a real command#236
ayushsingh82 wants to merge 1 commit into
agentrhq:mainfrom
ayushsingh82:fix/226-adapter-hints

Conversation

@ayushsingh82

Copy link
Copy Markdown
Contributor

Summary

Per the issue: browser recon runs on the Playwright-style browser run sandbox while adapters stay on the stable IPage/registry API, and nothing bridged the two — an agent doing recon had to manually re-derive strategy choice and adapter shape from raw evidence, with only a prose reminder ("do not paste Playwright code into an adapter") standing between the two contracts.

analyze.ts already computed most of what's needed for this (pattern classification, anti-bot detection, scored network evidence, nearest adapter) via analyzeSite(), but per #217 the CLI wrapper that used to drive it was removed during the browser-run migration, leaving the whole module unreachable from any command.

What this PR does:

  • Adds buildAdapterHints() / AdapterHints to analyze.ts: a recommended discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/INTERCEPT), the adapter-compatible path it maps to (browser:false -> func(args) vs browser:true -> func(page,args)), flagged state hazards (anti-bot, auth failures, missing cookies when a cookie strategy is recommended), a pointer to the snapshot tool for selector evidence (not something PageSignals captures), and a fixed do-not-copy-Playwright notice. Wired into AnalyzeReport as adapter_hints.
  • Re-registers webcmd browser analyze --stdin|--file as a pure JSON-in/JSON-out command — no live session, no daemon/CDP integration, just scores PageSignals an agent already captured via browser run and prints the AnalyzeReport (including adapter_hints). This deliberately avoids resurrecting the exact bug webcmd-adapter-author skill: browser analyze example is missing the required <session> argument #217 reported (a required <session> arg with no documented example) by not taking a session at all — recon evidence capture stays entirely in the existing browser run sandbox.
  • Updates site-recon.md with an optional PageSignals-shaped recon script piped into the new command, and SKILL.md's Step 3 to mention it as an alternative to manually reading the pattern table.
  • IPage is untouched, per the issue's explicit constraint to only extend it when evals prove a missing capability.

Fixes#226

Test plan

  • Unit: buildAdapterHints across Pattern A (with/without anti-bot), B, C, D, E — strategy recommendation, adapter-compatible path, and hazard flags (src/browser/analyze.test.ts)
  • Integration: browser analyze end-to-end via --file and --stdin, plus validation errors (neither/both flags, invalid JSON, missing required field) (src/cli.test.ts)
  • Updated the two tests asserting the exact registered browser subcommand list/count to include analyze
  • Manually exercised the built CLI: --file, --stdin, and all four error paths, confirmed exit codes and messages
  • npm run typecheck clean, npm run build clean, generated artifacts (cli-manifest.json, hosted-contract.json, webcmd-plugin.json) show no diff
  • npm test — 385 test files / 4629 passed, 1 skipped

Browser recon now runs on the Playwright-style `browser run` sandbox
while adapters stay on the stable IPage/registry API. Nothing bridged
the two: an agent doing recon had to manually re-derive strategy choice
and adapter shape from raw evidence, with only a prose reminder ("do
not paste Playwright code into an adapter") standing between the two
contracts.
analyze.ts already computed most of what's needed (pattern
classification, anti-bot detection, scored network evidence, nearest
adapter) via analyzeSite(), but per agentrhq#217 the CLI wrapper that used to
drive it was removed in the browser-run migration, leaving it
unreachable from any command.
- Add buildAdapterHints()/AdapterHints to analyze.ts: a recommended
discovery-time strategy (PUBLIC_API/COOKIE_API/UI_SELECTOR/DOM_STATE/
INTERCEPT), the adapter-compatible path it maps to (browser:false ->
func(args) vs browser:true -> func(page,args)), flagged state hazards
(anti-bot, auth failures, missing cookies when a cookie strategy is
recommended), a pointer to the snapshot tool for selector evidence
(not captured by PageSignals), and a fixed do-not-copy-Playwright
notice. Wired into AnalyzeReport as `adapter_hints`.
- Re-register `webcmd browser analyze --stdin|--file` as a pure JSON-in/
JSON-out command: no live session, no daemon/CDP integration, just
scores PageSignals an agent already captured via `browser run` and
prints the AnalyzeReport (including adapter_hints). This intentionally
avoids the exact bug agentrhq#217 reported (a required <session> arg with no
documented example) by not taking a session at all.
- Update site-recon.md with an optional PageSignals-shaped recon script
piped into the new command, and SKILL.md's Step 3 to mention it.
- IPage is untouched, per the issue's explicit constraint to only extend
it when evals prove a missing capability.
Fixesagentrhq#226
@ayushsingh82

Copy link
Copy Markdown
ContributorAuthor

@beubax Fixed — this PR adds a structured adapter_hints object to the recon/analyze output (recommended strategy, adapter-compatible func signature, network/selector evidence, state hazards, and a fixed do-not-copy-Playwright notice), and re-wires webcmd browser analyze as a pure JSON-in/JSON-out command over PageSignals an agent already captured via browser run — no live session, no IPage changes, per your proposal. Closes #226.

@github-actions

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

The automated review could not reach a fully supported conclusion.

Limitations

  • Some automated findings could not be verified against the pull request diff.

This review is advisory and does not block merging.

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.

[Feature]: Keep adapter API stable; add recon-to-adapter translation hints

1 participant

@ayushsingh82