shop-research — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited shop-research (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
_On startup, use Read to load ~/.claude/skills/shop-research/preferences.md. If missing, treat as first-run (see First-time detection below)._
Defaults when no preferences exist:
output-root: ~/Desktop/shop-research/ (confirmed on first run)default-sites: amazon, google-shoppingmax-candidates: 5currency: USDtone: friendly-cli (terse, direct, warm — not corporate)open-report: true (auto-open the HTML report when done)_Also load ~/.claude/skills/shop-research/feedback-journal.md if present — it contains thumbs-up/down on past recommendations. Summarize its signal (e.g., "prefers minimal aesthetic", "avoids fast-fashion brands") and carry that into ranking._
_On startup, use Bash to detect: today's date (date +%Y-%m-%d), and whether ~/Desktop/shop-research/ exists (ls or absence)._
Check $ARGUMENTS:
help → show help, stopconfig → run config flow, stopreset → delete preferences + feedback journal, confirm, stopfeedback → collect thumbs-up/down on the most recent research (see Feedback section), stophistory → list recent research folders with titles and dates, stopsetup or preflight → run the Chrome extension setup/onboarding flow (see Setup section), stopshop-research — Product research across Amazon, Google & specialty sites with a 2026 HTML report
Usage:
/shop-research [what to find] Interactive research
/shop-research [...] --for <recipient> Who is this for? (e.g., "mom, loves gardening")
/shop-research [...] --budget <range> e.g., "under $50", "$100-200"
/shop-research [...] --sites <list> Override default sites (amazon,google,etsy,rei,...)
/shop-research [...] --max-candidates <N> How many finalists to include (default 5)
/shop-research [...] --notes <text> Extra criteria, preferences, exclusions
/shop-research config Set preferences
/shop-research reset Clear preferences + feedback journal
/shop-research feedback Rate the last research (teaches the skill)
/shop-research history List past research folders
/shop-research setup Walk through Chrome extension setup
/shop-research help This help
Examples:
/shop-research "birthday gift for my dad — loves woodworking, under $75"
/shop-research "standing desk" --budget "$300-600" --notes "manual crank ok, no glass tops"
/shop-research "running shoes" --for "me, neutral arch, marathon training" --sites amazon,rei
Output:
{output-root}/{YYYY-MM-DD}-{kebab-title}/
├── report.html ← modern 2026 single-file report (open in browser)
├── data.json ← structured data (products, reviews, scores)
├── candidates/
│ ├── {slug-1}/
│ │ ├── hero.png ← product image
│ │ ├── page.png ← screenshot of listing
│ │ └── notes.md
│ └── ...
└── sources.md ← all URLs visited + reasoning trail
Current preferences:
(loaded from preferences.md)Use AskUserQuestion to collect:
~/Desktop/shop-research/)Save to ~/.claude/skills/shop-research/preferences.md in the format:
# /shop-research preferences
Updated: {date}
## Defaults
- output-root: {path}
- default-sites: {comma-list}
- max-candidates: {N}
- currency: {USD|EUR|...}
- amazon-tld: {com|co.uk|...}
- tone: {friendly-cli|detailed|minimal}
- exclusions: {free text}
## Profile (optional — the user can edit)
- Favored brands:
- Avoided brands:
- Aesthetic: (minimal, maximalist, vintage, etc.)
- Sustainability: (important / nice-to-have / not a factor)
- Gift-giving style: (practical / sentimental / experiential)
## Learned
- (auto-appended as patterns emerge)After saving, confirm with a warm one-liner: "Saved. I'll remember these for next time — and I'll keep learning as you give feedback."
Delete both ~/.claude/skills/shop-research/preferences.md and ~/.claude/skills/shop-research/feedback-journal.md. Confirm: "All cleared. I'll start fresh on the next research."
If no preferences file exists, show a warm onboarding (not a blocker):
First time running /shop-research — quick intro:
I search Amazon, Google Shopping, and specialty sites in a real Chrome
window you control. For each research I create a folder on your Desktop
with screenshots, a data.json, and a single-file HTML report you can open
anywhere.
I get smarter over time. After each research you can run `/shop-research
feedback` to tell me what worked — I save that and factor it into future picks.
To browse the web, I need the Claude in Chrome extension. If you haven't
set it up yet, run: /shop-research setup
Otherwise, continue and I'll auto-check the connection.Then proceed to Step 0 (preflight). After the first successful research, ask inline if they want to save any quick prefs (budget style, aesthetic, sustainability priority) — don't force the full config flow.
When invoked as /shop-research setup (or when Step 0 preflight fails and the user asks for help), walk through the Chrome extension setup. Reference: the official docs at https://code.claude.com/docs/en/chrome.
Before we go:
1. Browser Google Chrome or Microsoft Edge
(Brave, Arc, other Chromium browsers: not yet supported)
Windows WSL: not supported
2. Plan A direct Anthropic plan — Pro, Max, Team, or Enterprise
(Free tier and third-party providers like Bedrock/Vertex
don't have Chrome integration)
3. Claude Code Version 2.0.73 or higher
Check: claude --version
4. Extension "Claude" by Anthropic, version 1.0.36 or higher
Install:
https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn
After install, pin it via the puzzle-piece icon.Use Bash to run claude --version and surface the result so the user knows where they stand.
Tell the user exactly what to type (they run these themselves — you can't run slash commands for them):
Next:
A. Inside Claude Code, type: /chrome
Select "Enable" — or "Enabled by default" to auto-enable every session.
B. To verify, type: /mcp
Look for "claude-in-chrome" in the list.
C. Site permissions are managed inside the Chrome extension itself
(click the extension icon → settings). At minimum, allow:
amazon.com, google.com, shopping.google.com
Plus any specialty sites you plan to search (etsy.com, rei.com, etc.)If the user reports trouble, walk through in this order (from the official docs):
| Symptom | Fix |
|---|---|
| "Extension not detected" | Open chrome://extensions, confirm it's installed and enabled. Update if version < 1.0.36. |
| "Browser extension is not connected" | Restart Chrome and Claude Code, then run /chrome → "Reconnect extension". |
| Works once, then dies after a pause | Extension service worker went idle. Run /chrome → "Reconnect extension". |
| "Receiving end does not exist" | Same as above — reconnect. |
| "No tab available" | Ask Claude to create a new tab, then retry. |
| First-time connection fails | Restart Chrome — the native messaging host config is picked up on Chrome startup. |
Native messaging host config (only relevant if deeper troubleshooting needed):
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json~/Library/Application Support/Microsoft Edge/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.jsonOnce the user says they're set up, run the preflight (Step 0 below). If it passes, say:
Connection good. You're ready — try:
/shop-research "birthday gift for my dad — loves woodworking, under $75"Before anything else, verify the Claude-in-Chrome extension is connected. Without it, the research can't run.
mcp__claude-in-chrome__tabs_context_mcp.Hmm — the Claude-in-Chrome extension isn't responding.
Common causes:
• Extension not installed → https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn
• Chrome integration not enabled in this session → run /chrome and select "Enable"
• Extension idle → run /chrome → "Reconnect extension"
• First time ever → restart Chrome once after enabling, then retry
Need the full walkthrough? Run: /shop-research setupThen stop. Don't attempt the research without a working extension — it will only produce an empty folder.
One retry allowed: after showing the message, if the user replies "retry" or "try again", call tabs_context_mcp once more. If it still fails, route them to /shop-research setup.
Parse $ARGUMENTS for:
--flag (e.g., "birthday gift for my dad — woodworking")--for <recipient> — who it's for (include context about them)--budget <range> — budget constraint--sites <list> — override default sites--max-candidates <N> — override default candidate count--notes <text> — additional criteria or exclusionsIf what is missing or vague, ask ONE concise AskUserQuestion with 2-4 clarifying options (recipient, vibe, budget). Don't interrogate — pick the one clarification that most shapes the search.
If you have feedback-journal.md, mention in one line which past signal is shaping this: e.g., "Biasing toward [X] based on past thumbs-up."
Before opening the browser, draft a plan and show it:
Plan:
├── Query strategies: [2-3 search phrasings]
├── Sites: {default-sites or --sites override}
├── Shortlist target: {max-candidates} candidates
└── Scoring criteria: [3-5 factors derived from the ask]
Reply 'go' to start, or tweak any of the above.Wait for confirmation (or a tweak). This is the only hard gate — keep it fast.
Generate a slug from the ask: {YYYY-MM-DD}-{kebab-summary-max-60chars}. Examples:
2026-04-18-dad-birthday-woodworking-under-752026-04-18-standing-desk-300-600mkdir -p {output-root}/{slug}/candidatesClear policy: only the per-research folder is created fresh. Never delete sibling folders or anything outside {output-root}/{slug}/.
tabs_context_mcp first to see what tabs exist — never reuse a prior session's tab IDs.tabs_create_mcp as needed (Amazon search URL + Google Shopping URL to start).resize_window to a predictable viewport (e.g., 1440x900) for consistent screenshots.For each site in the plan:
https://www.amazon.com/s?k=<url-encoded-query>).javascript_tool: return an array of {title, url, price, rating, reviewCount, imageUrl} from the top results. Prefer structured extraction over raw get_page_text.javascript_tool to extract the main image URL, then curl -L -o {candidates}/{slug}/hero.png "<url>".javascript_tool to capture the visible viewport as PNG (via html2canvas loaded dynamically, or serialize as data-URL and decode with Bash). Save as {candidates}/{slug}/page.png. If capture fails, log and continue — the hero image alone is sufficient.Cross-source reviews (optional, adds depth): for each finalist, run one WebSearch for "<product name>" review to surface independent reviews (Wirecutter, Reddit, YouTube summaries). Quote 1-2 excerpts in the report.
Graceful degradation: if a site blocks extraction, log the issue in sources.md and skip — don't abort the whole research.
Compute a composite score per candidate (0-100) from the scoring criteria. Produce:
Write data.json with the full structured data: candidates, scores, picks, sources, query metadata.
Generate a single self-contained report.html (no external JS dependencies — inline everything). Aesthetic targets:
prefers-color-scheme — CSS variables onlyStructure:
~/.claude/skills/shop-research/icon.svg at ~32px next to the H1 with color: var(--accent) so it themes with light/dark mode. The icon is the grid-pick mark — a 3×3 dot grid with one cell haloed, signaling "N candidates → one pick" which matches this skill's behavior./shop-research feedbackReference ~/.claude/skills/shop-research/reference/report-template.html if it exists (load on demand; otherwise generate from scratch following the aesthetic above).
sources.md — every URL visited + one-line rationale per decision.Done — {N} candidates researched in {duration}
Top pick: {title} → ${price}
Runner-up: {title}
Budget pick: {title}
Folder: {output-root}/{slug}/
Report: {output-root}/{slug}/report.html
Open it? (y/N) — or rate with: /shop-research feedbackIf open-report: true, run open {output-root}/{slug}/report.html.
End with a soft prompt (not a blocker):
When you've had a look, run /shop-research feedback and tell me what worked. I'll keep getting sharper at your taste.When invoked as /shop-research feedback:
{output-root}/.~/.claude/skills/shop-research/feedback-journal.md:## {research slug} — {date}
- Verdict: {yes/caveats/no}
- Weight more: {factors}
- Avoid: {free text}
- Signal extracted: {one-line generalization, e.g., "prefers quieter/minimal aesthetic over bold"}## Learned section of preferences.md. Mention the promotion: "Noticed you consistently avoid X — saving that as a standing preference."The journal is human-editable. Respect whatever the user writes there directly.
{YYYY-MM-DD}-{kebab-summary} — 60 chars max in the summary half{kebab-product-short-name} — 40 chars max, derived from product title (not a counter)-2, -3 — if two candidates would collide, differentiate by brand or model numbertabs_context_mcp first; always create a new tab with tabs_create_mcp rather than reusing one from a prior sessionjavascript_tool returning clean JSON over dumping get_page_text. Smaller context, higher accuracy~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.