
Research
- 361 installs
- 133 repo stars
- Updated February 24, 2026
- jwynia/agent-skills
research is an agent skill that runs structured information gathering with sources, comparisons, summaries, and citations for developers exploring markets, technologies, or problem spaces before building.
About
research is an agent skill for structured information gathering when exploring markets, technologies, or problem spaces before committing to a build plan. It produces sourced comparisons, concise summaries, and citable references rather than jumping straight into code. Developers reach for research when they need disciplined discovery—competitive landscape, technology options, or domain context—before validation or implementation work begins. The skill emphasizes traceable sources and decision-ready summaries over open-ended brainstorming.
- source-driven inquiry
- comparative synthesis
- citation-aware summaries
- hypothesis exploration
- early decision support
Research by the numbers
- 361 all-time installs (skills.sh)
- +3 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #2,111 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/jwynia/agent-skills --skill researchAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 361 |
|---|---|
| repo stars | ★ 133 |
| Last updated | February 24, 2026 |
| Repository | jwynia/agent-skills ↗ |
How do agents gather sourced research before building?
Run structured information gathering—sources, comparisons, summaries, and citations—when exploring markets, technologies, or problem spaces before committing to a build plan.
Who is it for?
Developers and agents in early discovery who need cited comparisons and summaries before scoping a feature or architecture.
Skip if: Teams ready to implement who need scaffolding, tests, or deployment automation instead of exploratory research.
When should I use this skill?
User wants market research, technology comparisons, sourced summaries, or exploration before committing to a build plan.
What you get
Sourced comparison notes, structured summaries, and citation-backed research briefs.
Files
Research Skill
Tool-assisted research with Tavily integration. Transforms basic questions into comprehensive search strategies using AI-optimized web search.
Setup
This skill includes a bundled Tavily CLI script at scripts/tavily-cli.ts.
Requirements
1. Deno - Install from https://deno.land 2. Tavily API Key - Get one at https://tavily.com (free tier available)
Configuration
Set your API key:
export TAVILY_API_KEY="your-key-here"Create an alias for convenience (add to your shell profile):
# Adjust path to where this skill is installed
alias tavily='deno run --allow-net --allow-env /path/to/skills/research/scripts/tavily-cli.ts'Or run directly:
deno run --allow-net --allow-env ./scripts/tavily-cli.ts "your query"Commands below use tavily assuming the alias is configured.
---
Quick Reference
Common Commands
# Basic search
tavily "your query"
# With AI answer summary
tavily "your query" --answer
# Deep search with more results
tavily "your query" --depth advanced --results 10 --answer
# News/recent content
tavily "your query" --topic news --time week
# Exclude familiar sources to find new perspectives
tavily "your query" --exclude wikipedia.org,reddit.comPhase Summary
| Phase | Type | Purpose |
|---|---|---|
| 0 | Manual | Analyze topic, set scope |
| 1 | Tavily | Discover expert terminology |
| 2 | Tavily | Foundational search |
| 3 | Tavily | Counter-perspectives |
| 4 | Manual | Synthesize findings |
Scope → Tavily Depth
| Decision Stakes | Tavily Settings |
|---|---|
| Low, reversible | --depth basic --results 3 |
| Moderate | --depth basic --results 5 --answer |
| High, irreversible | --depth advanced --results 10 --answer |
---
Phase 0: Analysis
Goal: Structure topic before searching. Prevents unfocused searches and scope mismatch.
Scope Calibration
Before searching, assess stakes:
| Decision Type | Confidence Needed | Research Depth |
|---|---|---|
| Reversible, low-stakes | 60-70% | Quick scan (minutes) |
| Reversible, moderate | 75-85% | Working knowledge |
| Irreversible, moderate | 85-90% | Solid grounding |
| Irreversible, high | 90-95% | Deep expertise |
Analysis Template
# Research Analysis: [Topic]
## Core Concepts
- **Primary terms:** [Key terms requiring definition]
- **Terminology variants:** [Synonyms, jargon, historical terms]
- **Ambiguous terms:** [Terms with multiple meanings]
## Stakeholders
- **Primary actors:** [Who is directly involved?]
- **Affected groups:** [Who bears consequences?]
- **Opposing interests:** [Who benefits from different outcomes?]
## Temporal Scope
- **Historical origins:** [When did this begin?]
- **Key transitions:** [What changed and when?]
- **Current state:** [What's happening now?]
## Domains
- **Primary field:** [Main discipline]
- **Adjacent fields:** [Related disciplines]
## Controversies
- **Active debates:** [What's contested?]
- **Competing frameworks:** [Different ways of understanding]Phase 0 Checklist
- [ ] Identified primary terms
- [ ] Listed potential stakeholders
- [ ] Assessed decision stakes
- [ ] Determined appropriate research depth
---
Phase 1: Vocabulary Discovery
Goal: Discover expert terminology to unlock deeper search results.
Why Vocabulary Matters
- Outsider terms → introductory material
- Expert terms → research, nuanced analysis
- Cross-domain terms → bridge bodies of work
Tavily Commands for Vocabulary Discovery
| Discovery Need | Command |
|---|---|
| Expert terminology | tavily "[topic] terminology experts" --answer |
| Academic terms | tavily "[topic] academic research terminology" --answer |
| Cross-domain synonyms | tavily "[topic] also known as called" --answer |
| Historical terms | tavily "[topic] history original term" --answer |
Vocabulary Discovery Process
1. Run initial terminology search:
tavily "[topic] terminology" --answer --results 52. From results, note:
- Expert terms (technical vocabulary)
- Outsider terms (popular/introductory language)
- Cross-domain equivalents
3. Update vocabulary map (template below)
4. Re-run searches with expert terms:
tavily "[expert-term]" --answer5. Compare result quality - expert terms should surface deeper content
Vocabulary Map Template
## Core Terms
| Term | Domain | Depth Level |
|------|--------|-------------|
| [expert term] | [field] | Expert |
| [outsider term] | General | Introductory |
## Cross-Domain Synonyms
| Concept | Terms by Domain |
|---------|-----------------|
| [concept] | Field A: [term], Field B: [term] |
## Depth Indicators
| Level | Terms | What They Surface |
|-------|-------|-------------------|
| Introductory | [terms] | Overviews, explainers |
| Expert | [terms] | Research, nuanced analysis |Phase 1 Checklist
- [ ] Ran terminology discovery search
- [ ] Identified expert vs. outsider terms
- [ ] Mapped cross-domain synonyms
- [ ] Created vocabulary map
---
Phase 2: Foundational Search
Goal: Build foundational understanding with authoritative sources.
Question Pattern → Tavily Command
| Question Pattern | Strategy | Command |
|---|---|---|
| "What is X?" | Consensus from authorities | tavily "[expert-term] definition" --answer --depth advanced |
| "Should I X?" | Pros/cons, alternatives | tavily "[expert-term] pros cons comparison" --answer |
| "Is X true?" | Evidence, counter-evidence | tavily "[claim] evidence research" --answer --depth advanced |
| "How do I X?" | Step-by-step, pitfalls | tavily "[expert-term] guide tutorial" --answer |
| Historical context | Origins and evolution | tavily "[topic] history origins development" --answer |
Source Type Selection
| Source Type | Best For | Tavily Approach |
|---|---|---|
| Academic/Research | Mechanism, causation | --depth advanced --results 10 |
| Practitioner content | How things work, edge cases | --topic general --answer |
| News/Current | Recent developments | --topic news --time week |
| Official docs | Technical specs, policy | --include [official-domain] |
Foundational Search Process
1. Start with expert terminology from Phase 1
2. Run foundational queries:
# Definition/overview
tavily "[expert-term] comprehensive overview" --answer --depth advanced
# Key perspectives
tavily "[expert-term] major approaches" --answer --results 73. For each major perspective found, get 2-3 authoritative sources:
tavily "[perspective-name] [expert-term]" --answer --results 54. Track sources in research notes
Phase 2 Checklist
- [ ] Used expert terminology from Phase 1
- [ ] Searched for foundational overview
- [ ] Identified 2-3 major perspectives
- [ ] Found authoritative sources per perspective
- [ ] Tracked sources
---
Phase 3: Counter-Perspective Search
Goal: Explicitly find opposing viewpoints to avoid confirmation bias.
Why Counter-Perspectives Matter
Single-perspective research:
- All sources support one viewpoint
- Missing counterarguments
- Echo chamber risk
Tavily Commands for Counter-Perspectives
| Need | Command |
|---|---|
| General criticism | tavily "[topic] criticism problems" --answer |
| Opposing viewpoint | tavily "[topic] skeptics critique" --answer |
| Alternative approaches | tavily "[topic] alternatives instead of" --answer |
| Failure cases | tavily "[topic] failures when wrong" --answer |
| Avoid echo chamber | tavily "[topic] debate" --exclude [familiar-sources] |
Counter-Perspective Process
1. Identify your current understanding/lean
2. Search for strongest counterargument:
tavily "[topic] strongest argument against" --answer --depth advanced3. Exclude sources you've already seen:
tavily "[topic]" --exclude [domains-already-searched]4. Search for failure modes:
tavily "[topic] when fails problems limitations" --answer5. Document opposing perspectives in research notes
Phase 3 Checklist
- [ ] Identified current understanding/position
- [ ] Searched for strongest counterargument
- [ ] Used --exclude to find new sources
- [ ] Searched for limitations/failure cases
- [ ] Documented opposing perspectives
---
Phase 4: Synthesis
Goal: Synthesize findings with explicit confidence markers.
Completion Criteria
Minimum Viable (Quick Decisions)
- [ ] Can define core concepts in own words
- [ ] Know 2-3 major perspectives
- [ ] Found authoritative source per perspective
- [ ] Identified known unknowns
Working Knowledge (Most Decisions)
- [ ] Can explain historical context
- [ ] Understand stakeholder positions
- [ ] Encountered counterarguments
- [ ] Checked multiple domains
Deep Expertise (High-Stakes)
- [ ] Traced claims to primary sources
- [ ] Can evaluate competing evidence
- [ ] Understand knowledge limitations
Diminishing Returns Signals
Stop when:
- New sources cite same foundational works (circular)
- New searches return familiar content (repetitive)
- Each hour adds less than previous (marginal)
- Can make decision or take action (sufficient)
Confidence Markers
| Level | Phrases to Use |
|---|---|
| Established | "X is...", "X works by..." |
| Strong evidence | "Evidence strongly suggests..." |
| Moderate evidence | "Most sources report..." |
| Limited evidence | "One study found..." |
| Unknown | "No reliable information found..." |
Synthesis Template
## Summary
[Direct answer to question]
## Confidence Level
[High/Medium/Low] - [Justification]
## Key Findings
1. [Finding with source type]
## Perspectives
| Perspective | Key Argument | Source Quality |
|-------------|--------------|----------------|
| [view] | [argument] | [assessment] |
## Counter-Evidence
- [What argues against the main conclusion]
## Caveats
- [What wasn't consulted]
- [What assumptions were made]
## For Deeper Investigation
[What would increase confidence]Phase 4 Checklist
- [ ] Met completion criteria for stakes level
- [ ] Checked diminishing returns signals
- [ ] Applied confidence markers
- [ ] Completed synthesis template
- [ ] Stored findings for future reference
---
Tavily Command Reference
Basic Usage
tavily "search query" [options]Options
| Option | Description | Values |
|---|---|---|
--answer | Include AI-generated answer summary | flag |
--depth | Search depth | basic (default), advanced |
--results | Number of results | 1-20 (default: 5) |
--topic | Topic category | general (default), news, finance |
--time | Time filter | day, week, month, year |
--include | Only include domains | comma-separated |
--exclude | Exclude domains | comma-separated |
--raw | Include raw page content | flag |
--json | Output as JSON | flag |
Scenario → Command Mapping
| Research Scenario | Command |
|---|---|
| Quick overview | tavily "query" --answer |
| Deep dive | tavily "query" --depth advanced --results 10 --answer |
| Recent news | tavily "query" --topic news --time week |
| Academic focus | tavily "query" --depth advanced --include scholar.google.com,arxiv.org |
| Avoid Wikipedia | tavily "query" --exclude wikipedia.org |
| Fresh perspectives | tavily "query" --exclude [already-seen-domains] |
| Financial data | tavily "query" --topic finance --answer |
| Raw content for analysis | tavily "query" --raw --json |
---
Diagnostic States
Use these to identify where research is stuck and which phase to revisit.
| State | Symptom | Phase to Revisit |
|---|---|---|
| R0: No Analysis | Searching without structuring topic | Phase 0 |
| R1: No Vocabulary | Using outsider terms, finding only surface content | Phase 1 |
| R2: Single-Perspective | All sources support one view | Phase 3 |
| R3: Domain Blindness | Searching only in familiar field | Phase 1 (cross-domain terms) |
| R4: Recency Bias | Only recent sources | Phase 2 (historical queries) |
| R5: Breadth Without Depth | Many tabs, no synthesis | Phase 4 |
| R6: Completion Uncertainty | Unsure when to stop | Phase 4 (completion criteria) |
| R7: Complete | Can explain, identify uncertainties, act | Done |
Quick Diagnostic
1. Can you explain the topic in expert terminology? → If no, Phase 1 2. Have you found opposing viewpoints? → If no, Phase 3 3. Can you state your confidence level with justification? → If no, Phase 4 4. Is your research depth proportional to stakes? → If no, Phase 0
---
Anti-Patterns
| Pattern | Symptom | Fix |
|---|---|---|
| Confirmation Trap | Searching to confirm, not learn | Phase 3: Search for strongest counterargument |
| Authority Fallacy | Accepting claims by source prestige | Evaluate evidence, not source |
| Recency Trap | Only recent sources | Phase 2: Historical context queries |
| Breadth Trap | 50 tabs, none read | Phase 4: 3-source rule, synthesize before continuing |
| Single-Source | One source as final answer | Require 3 independent sources |
| Jargon Blind Spot | Missing other fields' terminology | Phase 1: Cross-domain vocabulary |
| Infinite Rabbit Hole | Lost original purpose | Phase 0: Return to scope/stakes |
| Echo Chamber | Same sources repeatedly | Phase 3: Use --exclude flag |
---
Output Persistence
Output Discovery
Before doing any other work:
1. Check for context/output-config.md in the project 2. If found, look for this skill's entry 3. If not found or no entry for this skill, ask the user first:
- "Where should I save output from this research session?"
- Suggest:
explorations/research/or a sensible location for this project
4. Store the user's preference
What to Store
| Layer | Contents |
|---|---|
| Vocabulary Map | Terms, domains, depth levels |
| Sources | URLs, relevance scores, quality notes |
| Synthesis | Summary, confidence, findings, caveats |
| Query Log | Tavily commands that worked/failed |
| Gaps | What remains unknown |
File Naming
Pattern: {topic}-research-{date}.md Example: competency-frameworks-research-2025-01-15.md
---
Integration Points
| Skill | Connection |
|---|---|
| doppelganger | Research informs decisions; apply /truth-check to findings |
| context-networks | Store research findings in appropriate network node |
| boundary-critique | Apply to advice and recommendations encountered |
---
Health Check Questions
During research, ask:
1. Am I searching to learn or to confirm? 2. What's the strongest argument against my current view? 3. Have I looked outside my familiar domains? 4. Am I using expert or outsider vocabulary? 5. Is my depth proportional to the stakes? 6. Have I stored what I've learned for future use?
---
Source Framework
Derived from: references/research-framework.md
/**
* Tavily Search CLI
*
* A standalone CLI script for searching the web using Tavily's AI-optimized search API.
* Provides high-quality results optimized for LLM consumption.
*
* Usage:
* deno run --allow-net --allow-env tavily-cli.ts "your search query"
* deno run --allow-net --allow-env tavily-cli.ts "your search query" --answer
* deno run --allow-net --allow-env tavily-cli.ts "your search query" --depth advanced
*
* Requires: TAVILY_API_KEY environment variable
*/
interface TavilyResult {
title: string;
url: string;
content: string;
score?: number;
published_date?: string;
raw_content?: string;
}
interface TavilyResponse {
results: TavilyResult[];
answer?: string;
query: string;
response_time?: number;
}
interface SearchOptions {
query: string;
maxResults?: number;
topic?: "general" | "news" | "finance";
includeAnswer?: boolean;
includeRawContent?: boolean;
searchDepth?: "basic" | "advanced";
timeRange?: "day" | "week" | "month" | "year";
days?: number;
includeDomains?: string[];
excludeDomains?: string[];
}
async function tavilySearch(options: SearchOptions): Promise<TavilyResponse> {
const apiKey = Deno.env.get("TAVILY_API_KEY");
if (!apiKey) {
throw new Error("TAVILY_API_KEY environment variable is not set");
}
const requestBody: Record<string, unknown> = {
query: options.query,
max_results: options.maxResults ?? 5,
topic: options.topic ?? "general",
include_answer: options.includeAnswer ?? false,
include_raw_content: options.includeRawContent ?? false,
search_depth: options.searchDepth ?? "basic",
};
if (options.timeRange) {
requestBody.time_range = options.timeRange;
}
if (options.topic === "news" && options.days !== undefined) {
requestBody.days = options.days;
}
if (options.includeDomains && options.includeDomains.length > 0) {
requestBody.include_domains = options.includeDomains;
}
if (options.excludeDomains && options.excludeDomains.length > 0) {
requestBody.exclude_domains = options.excludeDomains;
}
const startTime = Date.now();
const response = await fetch("https://api.tavily.com/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
api_key: apiKey,
...requestBody,
}),
});
if (!response.ok) {
const errorText = await response.text();
if (response.status === 401) {
throw new Error("Invalid Tavily API key");
} else if (response.status === 429) {
throw new Error("Tavily API rate limit exceeded");
} else if (response.status === 400) {
throw new Error(`Bad request: ${errorText}`);
}
throw new Error(`Tavily API error (${response.status}): ${errorText}`);
}
const data = await response.json();
const endTime = Date.now();
return {
results: data.results?.map((r: TavilyResult) => ({
title: r.title || "",
url: r.url || "",
content: r.content || "",
score: r.score,
published_date: r.published_date,
raw_content: r.raw_content,
})) || [],
answer: data.answer,
query: data.query || options.query,
response_time: endTime - startTime,
};
}
function printHelp() {
console.log(`
Tavily Search CLI - AI-optimized web search
Usage:
deno run --allow-net --allow-env tavily-cli.ts "search query" [options]
Options:
--answer Include AI-generated answer summary
--depth <level> Search depth: basic (default) or advanced
--results <n> Number of results (default: 5)
--topic <type> Topic: general (default), news, or finance
--time <range> Time filter: day, week, month, or year
--include <domain> Only include these domains (comma-separated)
--exclude <domain> Exclude these domains (comma-separated)
--raw Include raw page content
--json Output as JSON
--help Show this help
Examples:
deno run --allow-net --allow-env tavily-cli.ts "Hono framework Deno setup"
deno run --allow-net --allow-env tavily-cli.ts "latest AI news" --topic news --time week
deno run --allow-net --allow-env tavily-cli.ts "React best practices" --answer --depth advanced
Environment:
TAVILY_API_KEY Required. Get one at https://tavily.com
`);
}
// Main CLI
if (import.meta.main) {
const args = Deno.args;
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
printHelp();
Deno.exit(0);
}
// Parse arguments
const options: SearchOptions = {
query: "",
maxResults: 5,
topic: "general",
includeAnswer: false,
includeRawContent: false,
searchDepth: "basic",
};
let outputJson = false;
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === "--answer") {
options.includeAnswer = true;
} else if (arg === "--raw") {
options.includeRawContent = true;
} else if (arg === "--json") {
outputJson = true;
} else if (arg === "--depth" && args[i + 1]) {
options.searchDepth = args[++i] as "basic" | "advanced";
} else if (arg === "--results" && args[i + 1]) {
options.maxResults = parseInt(args[++i], 10);
} else if (arg === "--topic" && args[i + 1]) {
options.topic = args[++i] as "general" | "news" | "finance";
} else if (arg === "--time" && args[i + 1]) {
options.timeRange = args[++i] as "day" | "week" | "month" | "year";
} else if (arg === "--include" && args[i + 1]) {
options.includeDomains = args[++i].split(",");
} else if (arg === "--exclude" && args[i + 1]) {
options.excludeDomains = args[++i].split(",");
} else if (!arg.startsWith("--")) {
options.query = arg;
}
}
if (!options.query) {
console.error("Error: No search query provided");
printHelp();
Deno.exit(1);
}
try {
const result = await tavilySearch(options);
if (outputJson) {
console.log(JSON.stringify(result, null, 2));
} else {
console.log(`\n🔍 Search: "${result.query}"\n`);
console.log(`Found ${result.results.length} results in ${result.response_time}ms\n`);
if (result.answer) {
console.log("📝 AI Answer:");
console.log("─".repeat(60));
console.log(result.answer);
console.log("─".repeat(60));
console.log();
}
for (const [i, r] of result.results.entries()) {
console.log(`${i + 1}. ${r.title}`);
console.log(` ${r.url}`);
console.log(` ${r.content.slice(0, 200)}${r.content.length > 200 ? "..." : ""}`);
if (r.score) {
console.log(` Score: ${r.score.toFixed(3)}`);
}
console.log();
}
}
} catch (error) {
console.error("Error:", error instanceof Error ? error.message : error);
Deno.exit(1);
}
}
export { tavilySearch, type SearchOptions, type TavilyResponse, type TavilyResult };
Related skills
FAQ
What does the research skill output?
The research skill outputs sourced comparisons, structured summaries, and citations gathered while exploring markets, technologies, or problem spaces before a build plan is committed.
When should agents invoke research?
Agents should invoke research during early exploration when developers need cited comparisons and summaries before validation, prototyping, or implementation work.