
Research
- 4 installs
- Updated January 23, 2026
- jwynia/teach
Helps with ai & agent building tasks.
About
research is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- research
- AI & Agent Building
- AI-coding skill
Research by the numbers
- 4 all-time installs (skills.sh)
- +1 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #13,372 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/jwynia/teach --skill researchAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4 |
|---|---|
| Last updated | January 23, 2026 |
| Repository | jwynia/teach ↗ |
What it does
Helps with ai & agent building tasks.
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: frameworks/research/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 };