feat: v3.0.0 - intelligent search, GitHub person/project mode, ELI5, 13+ sources
v3 rewrites the search engine from the ground up: - Intelligent pre-research: resolves X handles, GitHub repos, subreddits, TikTok hashtags, and YouTube channels before searching - GitHub person-mode: PR velocity, top repos by stars, release notes - GitHub project-mode: live star counts, README, releases, top issues - ELI5 mode: plain language synthesis, no jargon - 13+ sources: Reddit, X, YouTube, TikTok, Instagram, HN, Polymarket, GitHub, Threads, Pinterest, Perplexity, Bluesky, Web - Free Reddit comments via public JSON (no API key needed) - Fun judge v2: humor scoring baked into narrative - Cookie consent before browser scanning - 10,000 free ScrapeCreators calls - 1,012 tests Thank you to the community contributors whose issues and PRs shaped v3: @uppinote20 (#143), @zerone0x (#134, #136), @thinkun (#116), @thomasmktong (#124), @fanispoulinakisai-boop (#100), @pejmanjohn (#78), @zl190 (#115), @hnshah (#84, #85, #86) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
---
|
||||
name: last30days-3
|
||||
version: "3.0.0-alpha"
|
||||
description: "[V3 DEV] Research any topic from the last 30 days. Side-by-side test version of the v3 pipeline."
|
||||
argument-hint: "last30days-v3 codex vs claude code"
|
||||
allowed-tools: Bash, Read, Write, WebSearch
|
||||
homepage: https://github.com/mvanhorn/last30days-skill
|
||||
repository: https://github.com/mvanhorn/last30days-skill
|
||||
author: mvanhorn
|
||||
license: MIT
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# last30days v3.0.0
|
||||
|
||||
Use `last30days` when the user wants recent, cross-source evidence from the last 30 days.
|
||||
|
||||
The runtime is a single v3 pipeline:
|
||||
|
||||
1. plan the query
|
||||
2. retrieve per `(subquery, source)`
|
||||
3. normalize and dedupe
|
||||
4. extract best snippets
|
||||
5. fuse with weighted RRF
|
||||
6. rerank with one relevance score
|
||||
7. cluster evidence
|
||||
8. render ranked clusters
|
||||
|
||||
## Setup: resolve the skill root
|
||||
|
||||
```bash
|
||||
for dir in \
|
||||
"." \
|
||||
"${CLAUDE_PLUGIN_ROOT:-}" \
|
||||
"${GEMINI_EXTENSION_DIR:-}" \
|
||||
"$HOME/.openclaw/workspace/skills/last30days" \
|
||||
"$HOME/.openclaw/skills/last30days" \
|
||||
"$HOME/.claude/skills/last30days" \
|
||||
"$HOME/.agents/skills/last30days" \
|
||||
"$HOME/.codex/skills/last30days"; do
|
||||
[ -n "$dir" ] && [ -f "$dir/scripts/last30days.py" ] && SKILL_ROOT="$dir" && break
|
||||
done
|
||||
|
||||
if [ -z "${SKILL_ROOT:-}" ]; then
|
||||
echo "ERROR: Could not find scripts/last30days.py" >&2
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
## Default command
|
||||
|
||||
```bash
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --emit=compact
|
||||
```
|
||||
|
||||
## Useful commands
|
||||
|
||||
```bash
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --emit=json
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --quick
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --deep
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --search=reddit,x,grounding
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --store
|
||||
python3 "${SKILL_ROOT}/scripts/last30days.py" --diagnose
|
||||
```
|
||||
|
||||
## Runtime expectations
|
||||
|
||||
- One reasoning provider is required: `GOOGLE_API_KEY` for Gemini, `OPENAI_API_KEY` for OpenAI, or `XAI_API_KEY` for xAI.
|
||||
- `BRAVE_API_KEY` enables Brave web search (recommended). `SERPER_API_KEY` is the web fallback.
|
||||
- `SCRAPECREATORS_API_KEY` enables Reddit, TikTok, and Instagram.
|
||||
- `XAI_API_KEY` enables xAI reasoning and X search.
|
||||
- `AUTH_TOKEN` plus `CT0` enables Bird-backed X search.
|
||||
- `yt-dlp` enables YouTube.
|
||||
- Planning and reranking fall back gracefully: Gemini -> OpenAI -> xAI -> deterministic/local.
|
||||
- Web retrieval stays within Brave/Serper dated results. Undated web hits are dropped.
|
||||
- For OpenClaw-specific watchlist, briefing, and history workflows, use `variants/open/SKILL.md`.
|
||||
|
||||
## Output model
|
||||
|
||||
- `compact` and `md`: cluster-first markdown
|
||||
- `json`: full v3 report
|
||||
- `context`: short synthesis-oriented context
|
||||
|
||||
Important report fields:
|
||||
|
||||
- `provider_runtime`
|
||||
- `query_plan`
|
||||
- `ranked_candidates`
|
||||
- `clusters`
|
||||
- `items_by_source`
|
||||
- `errors_by_source`
|
||||
|
||||
## Usage guidance for agents
|
||||
|
||||
- Prefer `--quick` for fast iteration.
|
||||
- Prefer default mode when the user wants a balanced answer.
|
||||
- Prefer `--deep` only when the user explicitly wants maximum recall or the topic is complex enough to justify extra latency.
|
||||
- Prefer `--emit=json` when downstream code or evaluation will consume the result.
|
||||
- Use `--search=` only when the user explicitly wants source restrictions.
|
||||
|
||||
## X handle resolution
|
||||
|
||||
If the topic could have its own X/Twitter account (people, brands, products, companies), do a quick WebSearch for their handle:
|
||||
```
|
||||
WebSearch("{TOPIC} X twitter handle site:x.com")
|
||||
```
|
||||
If you find a verified handle, pass `--x-handle={handle}` (without @). This searches their posts directly, finding content they posted that doesn't mention their own name. Skip this for generic concepts ("best headphones 2026", "how to use Docker").
|
||||
|
||||
## Synthesis guidance
|
||||
|
||||
### First: synthesize, don't summarize
|
||||
|
||||
Extract key facts from the output first, then synthesize across sources. Lead with patterns that appear across multiple clusters. Present a unified narrative, not a source-by-source summary.
|
||||
|
||||
### Ground in actual research, not pre-existing knowledge
|
||||
|
||||
Use exact product/tool names, specific quotes, and what sources actually say. If research mentions "ClawdBot" and "@clawdbot", that is a different product than "Claude Code" -- read what the research actually says.
|
||||
|
||||
**Anti-pattern to avoid:**
|
||||
- BAD: User asks "best Claude Code skills" and you respond with generic advice: "Skills are powerful. Keep them under 500 lines."
|
||||
- GOOD: You respond with specifics from the research: "Most mentioned: /commit (5 mentions), remotion skill (4x), git-worktree (3x). The Remotion announcement got 16K likes on X per @thedorbrothers."
|
||||
|
||||
### Source weighting (highest to lowest signal)
|
||||
|
||||
1. **Cross-cluster corroboration** -- same evidence across multiple sources is the strongest signal. Lead with it.
|
||||
2. **Reddit top comments** -- often the wittiest, most insightful take. Quote directly when upvotes are high.
|
||||
3. **YouTube transcript highlights** -- pre-extracted key moments. Quote and attribute to channel name.
|
||||
4. **X/Twitter @handles** -- real-time community signal. Quote with engagement context.
|
||||
5. **Polymarket odds** -- real money on outcomes cuts through opinion. Include specific odds AND movement.
|
||||
6. **TikTok/Instagram** -- viral/creator signal. Cite @creators with views/likes.
|
||||
7. **Hacker News** -- technical community perspective. Cite as "per HN."
|
||||
8. **Web (Brave/Serper)** -- cite only when social sources don't cover a fact.
|
||||
|
||||
### Polymarket interpretation
|
||||
|
||||
When Polymarket returns relevant markets:
|
||||
1. Prefer structural/long-term markets over near-term deadlines (championship odds > regular season, IPO > incremental update)
|
||||
2. Call out the specific outcome's odds and movement, not just that a market exists
|
||||
3. Weave odds into the narrative as supporting evidence, don't isolate them
|
||||
4. When multiple relevant markets exist, highlight 3-5 ordered by importance
|
||||
|
||||
Domain importance ranking:
|
||||
- **Sports:** Championship/tournament > conference title > regular season > weekly matchup
|
||||
- **Geopolitics:** Regime change/structural > near-term strike deadlines > sanctions
|
||||
- **Tech/Business:** IPO, major product launch > incremental updates
|
||||
- **Elections:** Presidency > primary > individual state
|
||||
|
||||
### Citation rules
|
||||
|
||||
Cite the single strongest source per point in short format: "per @handle" or "per r/subreddit". Save engagement metrics for the stats section. Use the priority order from source weighting above. The tool's value is surfacing what PEOPLE are saying, not what journalists wrote.
|
||||
|
||||
### Comparison queries
|
||||
|
||||
For "X vs Y" queries, structure output as:
|
||||
|
||||
```
|
||||
## Quick Verdict
|
||||
[1-2 sentences: which one the community prefers and why, with source counts]
|
||||
|
||||
## [Entity A]
|
||||
**Community Sentiment:** [Positive/Mixed/Negative] (N mentions across sources)
|
||||
**Strengths:** [with source attribution]
|
||||
**Weaknesses:** [with source attribution]
|
||||
|
||||
## [Entity B]
|
||||
[Same structure]
|
||||
|
||||
## Head-to-Head
|
||||
| Dimension | Entity A | Entity B |
|
||||
|-----------|----------|----------|
|
||||
| [Key dim] | [position] | [position] |
|
||||
|
||||
## Bottom Line
|
||||
Choose A if... Choose B if... (based on community data)
|
||||
```
|
||||
|
||||
### Recommendation queries
|
||||
|
||||
When users ask "best X" or "top X", extract SPECIFIC NAMES:
|
||||
|
||||
```
|
||||
Most mentioned:
|
||||
[Name] -- Nx mentions
|
||||
Sources: @handle1, r/subreddit, [YouTube channel]
|
||||
|
||||
[Name] -- Nx mentions
|
||||
Sources: @handle2, r/subreddit2
|
||||
|
||||
Notable mentions: [others with 1-2 mentions]
|
||||
```
|
||||
|
||||
### Edge cases
|
||||
|
||||
- **Empty results from a source:** State what is missing. ("No Reddit discussion found for this topic.") Do not fill the gap with training data.
|
||||
- **Sources contradict each other:** Present both sides with attribution. ("Reddit r/fitness is bullish on X, while @DrExpert on X warns about Y.")
|
||||
- **All results are low-engagement or off-topic:** Acknowledge uncertainty. ("Limited recent discussion found -- these findings should be treated as preliminary.")
|
||||
|
||||
### Follow-up conversations
|
||||
|
||||
After research completes, treat yourself as an expert on this topic. Answer follow-ups from the research findings. Cite the specific threads, posts, and channels you found. Only run new research if the user asks about a DIFFERENT topic.
|
||||
|
||||
## Security and permissions
|
||||
|
||||
**What this skill does:**
|
||||
- Sends search queries to ScrapeCreators API for Reddit, TikTok, Instagram search
|
||||
- Sends search queries via xAI API or Bird client for X search
|
||||
- Sends search queries to Algolia HN Search API (free, no auth)
|
||||
- Sends search queries to Polymarket Gamma API (free, no auth)
|
||||
- Runs yt-dlp locally for YouTube search and transcript extraction (no API key)
|
||||
- Sends search queries to Brave Search API or Serper for web search (optional)
|
||||
- Uses Gemini, OpenAI, or xAI for LLM planning and reranking
|
||||
- Stores findings in local SQLite database (--store mode only)
|
||||
|
||||
**What this skill does NOT do:**
|
||||
- Does not post, like, or modify content on any platform
|
||||
- Does not access your personal accounts on any platform
|
||||
- Does not share API keys between providers
|
||||
- Does not log or cache API keys in output files
|
||||
Reference in New Issue
Block a user