research-report — Claude Code skill: research reports
Builds a Markdown report from deep research results, with a table of contents and field details. Use it when results are spread across JSON files.
npx skills add Weizhena/Deep-Research-skills --skill research-report -a claude-codeWhat research-report does
Run the skill with /research-report. It finds */outline.yaml in the working directory, reads the topic and output_dir, then loads the JSON results. Before generation, it asks which short metrics should appear beside each item in the table of contents.
It creates {topic}/generate_report.py and runs it. The script reads fields.yaml, handles both flat and nested JSON, puts extra fields under Other Info, and writes the Markdown file to {topic}/report.md. Every item receives an anchor link in the contents.
Values marked with [uncertain], empty values, and fields named in the uncertain array are omitted. You need python available because the final step runs the generated script directly.
What it helps with
- turn JSON research results into a Markdown report
- create linked contents for every item
- omit fields marked as uncertain
- collect fields missing from
fields.yaml - format nested lists and dictionaries for reading
Example prompts for the agent
/research-report build a report from the results in this directory/research-report include available numeric metrics in the table of contents/research-report create report.md from JSON in output_dir
How to install research-report
1Skills CLI (Vercel)
npx skills add Weizhena/Deep-Research-skills --skill research-report -a claude-code2Manually: put the files in place
~/.claude/skills/research-report/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/research-report/
1Skills CLI (Vercel)
npx skills add Weizhena/Deep-Research-skills --skill research-report -a codex2Manually: put the files in place
.agents/skills/research-report/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Weizhena/Deep-Research-skills --skill research-report -a cursor2Manually: put the files in place
.cursor/skills/research-report/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Weizhena/Deep-Research-skills research-report2Manually: put the files in place
.github/skills/research-report/SKILL.md1Skills CLI (Vercel)
npx skills add Weizhena/Deep-Research-skills --skill research-report -a gemini-cli2Platform CLI
gemini skills install https://github.com/Weizhena/Deep-Research-skills --path skills/research-codex-en/research-reportManually: put the files in place
.devin/skills/research-report/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Weizhena/Deep-Research-skills --skill research-report -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about research-report
How do I install research-report in Claude Code?
Run npx skills add Weizhena/Deep-Research-skills --skill research-report -a claude-code, then run npx skills add Weizhena/Deep-Research-skills --skill research-report -a claude-code again. The skill file is at ~/.claude/skills/research-report/SKILL.md.
What does research-report do?
It turns JSON research results into a Markdown report. The skill creates a linked table of contents, organises values by field, and removes uncertain data.
Which values does research-report leave out?
It skips empty values, values containing [uncertain], and fields listed in the uncertain array.
Source text
SKILL.md · MIT
---
name: research-report
description: Summarize deep research results into markdown report, cover all fields, skip uncertain values.
---
# Research Report - Summary Report
## Trigger
`/research-report`
## Workflow
### Step 1: Locate Results Directory
Find `*/outline.yaml` in current working directory, read topic and output_dir config.
### Step 2: Scan Optional Summary Fields
Read all JSON results, extract fields suitable for TOC display (numeric, short metrics), e.g.:
- github_stars
- google_scholar_cites
- swe_bench_score
- user_scale
- valuation
- release_date
Use request_user_input to ask user:
- Which fields to display in TOC besides item name?
- Provide dynamic options list (based on actual fields in JSON)
### Step 3: Generate Python Conversion Script
Generate `generate_report.py` in `{topic}/` directory, script requirements:
- Read all JSON from output_dir
- Read fields.yaml to get field structure
- Cover all field values from each JSON
- Skip fields with values containing [uncertain]
- Skip fields listed in uncertain array
- Generate markdown report format: Table of contents (with anchor links + user-selected summary fields) + Detailed content (by field category)
- Save to `{topic}/report.md`
**TOC Format Requirements**:
- Must include every item
- Each item displays: number, name (anchor link), user-selected summary fields
- Example: `1. [GitHub Copilot](#github-copilot) - Stars: 10k | Score: 85%`
#### Script Technical Requirements (Must Follow)
**1. JSON Structure Compatibility**
Support two JSON structures:
- Flat structure: Fields directly at top level `{"name": "xxx", "release_date": "xxx"}`
- Nested structure: Fields in category sub-dict `{"basic_info": {"name": "xxx"}, "technical_features": {...}}`
Field lookup order: Top level -> category mapping key -> Traverse all nested dicts
**2. Category Multi-language Mapping**
fields.yaml category names and JSON keys can be any combination (CN-CN, CN-EN, EN-CN, EN-EN). Must establish bidirectional mapping:
```python
CATEGORY_MAPPING = {
"Basic Info": ["basic_info", "Basic Info"],
"Technical Features": ["technical_features", "technical_characteristics", "Technical Features"],
"Performance Metrics": ["performance_metrics", "performance", "Performance Metrics"],
"Milestone Significance": ["milestone_significance", "milestones", "Milestone Significance"],
"Business Info": ["business_info", "commercial_info", "Business Info"],
"Competition & Ecosystem": ["competition_ecosystem", "competition", "Competition & Ecosystem"],
"History": ["history", "History"],
"Market Positioning": ["market_positioning", "market", "Market Positioning"],
}
```
**3. Complex Value Formatting**
- list of dicts (e.g., key_events, funding_history): Format each dict as one line, separate kv with ` | `
- Normal list: Short lists joined with comma, long lists displayed with line breaks
- Nested dict: Recursive formatting, display with semicolon or line breaks
- Long text strings (over 100 chars): Add line breaks `<br>` or use blockquote format for readability
**4. Extra Fields Collection**
Collect fields that exist in JSON but not defined in fields.yaml, put in "Other Info" category. Note to filter:
- Internal fields: `_source_file`, `uncertain`
- Nested structure top-level keys: `basic_info`, `technical_features` etc.
- `uncertain` array: Display each field name on separate line, don't compress into one line
**5. Uncertain Value Skipping**
Skip conditions:
- Field value contains `[uncertain]` string
- Field name is in `uncertain` array
- Field value is None or empty string
### Step 4: Execute Script
Run `python {topic}/generate_report.py`
## Output
- `{topic}/generate_report.py` - Conversion script
- `{topic}/report.md` - Summary report
© Weizhena · MIT · Weizhena/Deep-Research-skills