From tech-research
Comprehensive technical research by combining multiple intelligence sources — Grok (X/Twitter developer discussions via browser automation), DeepWiki (AI-powered GitHub repository analysis), and WebSearch. Dispatches parallel subagents for each source and synthesizes findings into a unified report. This skill should be used when evaluating technologies, comparing libraries/frameworks, researching GitHub repos, gauging developer sentiment, or investigating technical architecture decisions. Trigger phrases include "tech research", "research this technology", "技术调研", "调研一下", "compare libraries", "evaluate framework", "investigate repo".
npx claudepluginhub psylch/tech-research-skill --plugin tech-researchThis skill uses the workspace's default tool permissions.
Orchestrate multi-source technical research by dispatching parallel subagents to gather intelligence from X/Twitter (via Grok), GitHub repositories (via DeepWiki), and the web (via WebSearch). Synthesize all findings into a single actionable report.
Conducts deep research with cross-verification and source tiering for investigating technologies, comparing tools, fact-checking claims, and evaluating architectures.
Orchestrates multi-agent research across web, codebase, and community sources for broad, mixed, or ambiguous analyze/investigate requests needing evidence synthesis.
Collects diverse opinions on technical topics from developer communities. Aggregates Reddit, HN, Dev.to, Lobsters, ProductHunt, X, Threads. Use for developer reactions and community opinions.
Share bugs, ideas, or general feedback.
Orchestrate multi-source technical research by dispatching parallel subagents to gather intelligence from X/Twitter (via Grok), GitHub repositories (via DeepWiki), and the web (via WebSearch). Synthesize all findings into a single actionable report.
Architecture: The main agent orchestrates research using one of two modes — lightweight (Task Subagents) or heavyweight (Agent Teammates) — chosen based on research complexity.
Match user's language: Respond in the same language the user uses. If the user writes in Chinese, the entire research report should be in Chinese. If in English, report in English.
Before dispatching any agents, determine the appropriate mode:
| Signal | → Mode |
|---|---|
| Single topic, multiple data sources (Grok + DeepWiki + WebSearch) | Light → Task Subagents |
| Multiple independent topics/competitors needing cross-comparison | Heavy → Agent Teammates |
| Research may produce follow-up questions requiring dynamic re-scoping | Heavy → Agent Teammates |
| Agent count ≥ 4 | Heavy → Agent Teammates |
Dispatch up to 3 Task Subagents (Task with subagent_type: "general-purpose"). Each handles one data source independently. The main agent synthesizes results after all return.
Use TeamCreate to create a research team → TaskCreate for each research task → spawn Agent Teammates (via Task with team_name and name parameters) → coordinate via SendMessage. Teammates can:
| Source | What It Provides | Best For |
|---|---|---|
| Grok (X/Twitter) | Real developer opinions, @handles, post URLs | Sentiment, expert discovery, niche recommendations |
| DeepWiki (GitHub) | AI-powered repo analysis, architecture, API docs | Understanding codebases, comparing repo internals. Only use ask_question — never read_wiki_structure or read_wiki_contents (they return massive dumps that easily exceed context limits) |
| WebSearch | Official docs, blog posts, benchmarks, tutorials | Facts, performance data, official announcements |
Not every source will be available every time. Follow this degradation strategy:
| Source | If unavailable | Fallback |
|---|---|---|
| Grok | No browser backend or not logged in | Skip. Note in report: "Grok source skipped — [reason]." |
| DeepWiki | No owner/repo known, or API error | Skip. Note in report: "DeepWiki skipped — [reason]." |
| WebSearch | Tool unavailable (rare) | Skip. Note in report. |
Minimum viable research: At least one source must return results. If all sources fail, report the failures and suggest the user check their environment setup.
Grok requires browser automation with login state. Multiple backends are supported, detected in priority order:
| Priority | Backend | Detection | Pros | Cons |
|---|---|---|---|---|
| 0 | better-agent-browser (agent-browser CLI) | command -v agent-browser succeeds | Headless by default, persistent ~/.chrome-debug-profile, lock-based parallel safety, no MCP dependency | One-time Chrome setup on port 9333 |
| 1 | browser-use (browser-use CLI) | command -v browser-use succeeds AND priority 0 failed | Alternate CLI driver, LLM-guided element selection | Distinct tool, less integrated with this skill's recipes |
| 2 | Claude-in-Chrome | mcp__claude-in-chrome__* tools visible at runtime AND priorities 0–1 failed | Zero setup, uses user's Chrome login state | Occupies user's visible Chrome window |
| 3 | Playwright-Grok | playwright-grok MCP in ~/.claude.json AND priorities 0–2 failed | Dedicated profile, login persists, doesn't block default Playwright | One-time setup required |
| 4 | Playwright (default) | playwright MCP in ~/.claude.json AND priorities 0–3 failed | Already configured for most users | No login persistence, may not be logged in |
Detection is strict first-match, top-down. As soon as a priority's detector returns true, set backend to that row and stop. Do NOT check lower priorities. CLI backends (0 and 1) skip grok_setup.sh check entirely — it only tracks MCP config state, not CLI presence.
IMPORTANT: Do NOT modify the user's default playwright MCP to add --user-data-dir. This would force ALL browser operations through a single profile, breaking parallel agent usage. Instead, use a separate playwright-grok instance.
Before dispatching a Grok subagent, walk the priority table top-down. Run each detector; on first match, set backend and stop. Paths are mutually exclusive — never evaluate a lower priority after a higher one has matched.
Priority 0 — better-agent-browser (CLI):
command -v agent-browser >/dev/null && echo "MATCH: backend=better-agent-browser"
If matched: set backend=better-agent-browser. The Grok subagent loads the better-agent-browser skill and follows its Layer 0b recipe (headless, dedicated ~/.chrome-debug-profile on port 9333). Stop. Do not check lower priorities.
Priority 1 — browser-use (CLI):
command -v browser-use >/dev/null && echo "MATCH: backend=browser-use"
Only evaluated if priority 0 did NOT match. If matched: set backend=browser-use. The Grok subagent drives browser-use directly per its own docs. Stop.
Priorities 0 and 1 do NOT depend on ~/.claude.json or MCP runtime availability. Do NOT run grok_setup.sh check on these paths.
Priority 2 — claude-in-chrome (runtime MCP):
Only evaluated if priorities 0 and 1 did NOT match. Check whether mcp__claude-in-chrome__* tools are visible in your current session. If yes: set backend=chrome. The chrome extension is injected at runtime and never appears in ~/.claude.json, so the shell script cannot detect it. Skip the preflight script entirely. Stop.
Priority 3–4 — Playwright fallback (script-based detection): Only evaluated if priorities 0–2 did NOT match. Run the preflight script to detect playwright backends:
bash ${SKILL_PATH}/scripts/grok_setup.sh check
The script outputs preflight JSON: {"ready": true, "backend": "playwright-grok", "login_status": "logged_in", "hint": "..."}.
Key fields: ready (boolean), backend (playwright-grok/playwright/none), login_status (logged_in/logged_out/unknown), hint (human-readable summary).
Live validation note: Preflight checks MCP server presence in ~/.claude.json (existence check) but cannot live-test browser MCP connectivity from shell — MCP servers are runtime-managed by Claude Code and only accessible during agent execution. The skill compensates with optimistic dispatch: assume the backend works, then update the login status cache based on actual browser interaction results (see Login Status Cache below).
| Exit Code | Meaning | Action |
|---|---|---|
0 READY | Backend available | Pass backend value to Grok subagent. If login_status is logged_out, skip Grok and note in report. Otherwise dispatch subagent (optimistic). |
1 NEEDS_SETUP | Has playwright, no playwright-grok | Setup-first gate: Run grok_setup.sh setup immediately (before any research). Setup backs up ~/.claude.json before modifying it (backup path is in the output JSON). If setup succeeds, inform user they need to restart Claude Code for playwright-grok to activate, then proceed with research using backend=playwright as a degraded fallback for this session only. Do NOT start research and discover the setup need mid-way. |
2 NOT_AVAILABLE | No browser MCP at all | Skip Grok source entirely. Note in report. |
Config safety: The setup command always creates a timestamped backup of ~/.claude.json before writing. If the new config causes issues, restore with the rollback command in the setup output (e.g., cp ~/.claude.json.backup.<timestamp> ~/.claude.json).
Login state is cached at ~/.claude/tech-research/.grok-status.json. Cache semantics: logged_in persists until a subagent observes logout; logged_out auto-expires after 2 hours (or clear with grok_setup.sh reset); unknown/missing = optimistic, try Grok.
Subagent responsibility: After interacting with Grok, update login status:
bash ${SKILL_PATH}/scripts/grok_setup.sh status logged_in <backend>bash ${SKILL_PATH}/scripts/grok_setup.sh status logged_out <backend>Cache corruption recovery: If the status file is corrupted (invalid JSON, permission errors), delete it (rm ~/.claude/tech-research/.grok-status.json) and proceed in optimistic mode. See references/troubleshooting.md for the full decision tree.
This skill is a two-layer contract:
references/subagent_templates.md — per-role contracts (Grok / DeepWiki / WebSearch). Each template is complete and self-contained — a dispatched role-agent does NOT need to read SKILL.md. The orchestrator points the role-agent to the right section by path and passes minimal parameters.Before starting, determine how this skill was invoked:
| Context | Task tool available? | Mode |
|---|---|---|
| Top-level agent (user invoked tech-research directly) | Yes | Light / Heavy Mode. Dispatch role-agents via Task, each pointed at references/subagent_templates.md §<role>. |
| Inside an existing subagent (another skill or agent dispatched you) | No — subagents cannot spawn further subagents | Inline Mode. Read references/subagent_templates.md yourself and execute each role's contract directly in your own tool loop. Skip all Task / TeamCreate calls. |
How to detect: if Task is not in your available tools (or ToolSearch select:Task returns no match), you're in Inline Mode.
Either way, the per-role behavior (login check, query rules, report format, deferred-tool loading) lives in the template file, not here. Both modes converge on the same reference contract.
Progress:
grok_setup.sh check, complete any setup BEFORE researchRun preflight before doing anything else. This determines which sources are available and whether one-time setup is needed.
Walk priorities top-down; stop on first match.
command -v agent-browser succeeds → backend=better-agent-browser. Stop, go to Step 2 of workflow.command -v browser-use succeeds → backend=browser-use. Stop, go to Step 2 of workflow.mcp__claude-in-chrome__* tools visible in session → backend=chrome. Stop, go to Step 2 of workflow.bash ${SKILL_PATH}/scripts/grok_setup.sh check to probe for playwright MCP backends. Only reach this branch if none of the above matched — if you matched priority 0/1/2, you already stopped.Exit code 0 (READY) → Note the backend and login_status, proceed to Step 2.
Exit code 1 (NEEDS_SETUP) → Run `grok_setup.sh setup` NOW.
If setup succeeds, tell the user:
"playwright-grok has been configured. Restart Claude Code
to activate it. For this session, Grok will use the
default playwright backend as a fallback."
Then proceed to Step 2 with backend=playwright.
Exit code 2 (NOT_AVAILABLE) → Grok is unavailable. Proceed to Step 2 without Grok.
Key principle: Setup completes before research begins. Never discover setup needs mid-research.
Break the user's question into sub-queries for each source:
owner/repo)Not every research task needs all 3 sources. Select sources based on the question:
| Research Type | Grok | DeepWiki | WebSearch |
|---|---|---|---|
| "Should we use library X?" | Yes | Yes (if OSS) | Yes |
| "What are devs saying about X?" | Yes | No | Maybe |
| "How does repo X work internally?" | No | Yes | Maybe |
| "Compare X vs Y performance" | Maybe | Yes (both repos) | Yes |
| "What's new in framework X?" | Yes | No | Yes |
Choose the dispatch method based on the research mode and execution context.
Browser is a singleton — enforce it in the prompts. Only the Grok role touches a browser. The DeepWiki and WebSearch role prompts MUST forbid loading any browser skill (better-agent-browser, playwright, claude-in-chrome) — they are restricted to DeepWiki MCP, WebSearch, and WebFetch only. Otherwise parallel roles race for the same Chrome user-data-dir / CDP port and collide.
If you genuinely need multiple parallel browser roles (rare), switch to Heavy Mode and coordinate all of them through one shared Layer-2 CDP proxy — see better-agent-browser Layer 2.
Each role-agent is pointed at its contract by path. Do NOT inline the template body into the Task prompt — the subagent reads the file directly. This keeps the dispatch prompt small and guarantees the subagent sees the canonical, up-to-date contract.
Grok role:
Task(
subagent_type: "general-purpose",
description: "Grok research [topic]",
prompt: """
Read ${SKILL_PATH}/references/subagent_templates.md § Grok Subagent Template.
That file is your complete contract — do NOT read SKILL.md.
Parameters:
- RESEARCH_QUESTION: [question]
- BACKEND: [backend from preflight]
- GROK_QUERY: [X/Twitter-scoped query per the template's rules]
Execute literally and return findings in the format the template specifies.
"""
)
DeepWiki role:
Task(
subagent_type: "general-purpose",
description: "DeepWiki research [repo]",
prompt: """
Read ${SKILL_PATH}/references/subagent_templates.md § DeepWiki Subagent Template.
That file is your complete contract — do NOT read SKILL.md.
Do NOT load any browser skill.
Parameters:
- RESEARCH_QUESTION: [question]
- REPO_LIST: [owner/repo, ...]
- CUSTOM_QUESTIONS: [topic-specific questions]
Execute literally and return findings in the format the template specifies.
"""
)
WebSearch role:
Task(
subagent_type: "general-purpose",
description: "Web research [topic]",
prompt: """
Read ${SKILL_PATH}/references/subagent_templates.md § WebSearch Subagent Template.
That file is your complete contract — do NOT read SKILL.md.
Do NOT load any browser skill.
Parameters:
- RESEARCH_QUESTION: [question]
- TOPIC: [topic keywords]
- CURRENT_YEAR: [year]
Execute literally and return findings in the format the template specifies.
"""
)
You cannot spawn further subagents. Instead, read references/subagent_templates.md yourself and execute each role's contract in your own tool loop:
1. TeamCreate(team_name: "research-[topic]")
2. TaskCreate(subject: "Research [Project A]", description: "...", activeForm: "Researching [Project A]")
3. TaskCreate(subject: "Research [Project B]", description: "...", activeForm: "Researching [Project B]")
4. Task(subagent_type: "general-purpose", team_name: "research-[topic]", name: "researcher-a", prompt: "...")
5. Task(subagent_type: "general-purpose", team_name: "research-[topic]", name: "researcher-b", prompt: "...")
6. Coordinate via SendMessage — share findings, adjust scope, avoid duplication
7. Synthesize after all teammates report back
8. Shutdown teammates and TeamDelete when done
Each teammate should use all relevant data sources (Grok, DeepWiki, WebSearch) for their assigned topic, rather than splitting by data source.
After all subagents return, merge findings into a unified report with these sections:
See references/grok_query_overview.md for strategy selection table and references/query_strategies.md for full prompt templates.
See references/troubleshooting.md for the full decision tree and common scenarios.