- Add .claude-plugin/marketplace.json and plugin.json manifests
- Use ${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/skills/last30days} for script path
- Plugin install: uses CLAUDE_PLUGIN_ROOT when set
- Manual install: falls back to ~/.claude/skills/last30days (no breakage)
- SKILL.md stays at root, plugin.json points skills to "./"
Users can now install via:
claude plugin marketplace add mvanhorn/last30days-skill
claude plugin install last30days@last30days
Inspired by PR #1 (galligan) — lighter approach without repo restructure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
User preferred V1's "I'll research X across Reddit, X, and the web..."
with explicit Parsed intent block over V2's emoji format.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Feature audit found 11 things v2 dropped from v1. Restored the 7 that affect
output quality: quality checklist for prompts, anti-pattern examples, self-check
instruction, "don't re-search" context memory, prompt format anti-pattern,
multi-prompt guidance, and emoji footer with engagement counts.
Also adds visible query parsing display (🔍 **{TOPIC}** · {QUERY_TYPE}) and
the full v1-vs-v2 comparison test plan with all 17 test queries from README.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The old v1 skill worked because context: fork was SILENTLY IGNORED
due to Claude Code bug #17283. The skill ran inline in the main
conversation. Claude Code 2.1+ fixed the bug and now properly
honors fork mode, creating an isolated subagent that ignores all
instruction ordering (text output, bash-first, etc.).
Fix: remove context: fork so the skill runs inline again, matching
the behavior the user knows works. Also restored v1-style
instruction flow: parse intent first, then run script, then WebSearch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The agent in fork mode ignores text output instructions and jumps
straight to WebSearch. Reverted to the original "YOUR FIRST ACTION:
Run this command. EXECUTE." pattern that actually worked. Embedded
progress display as echo statements inside the bash command so they
can't be skipped. The agent was not running the Python script at all
when the first instruction was about text output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The agent was skipping the progress text because it was buried after
parsing logic at line 41. Restructured so the FIRST section is
"YOUR FIRST OUTPUT" with the progress block, BEFORE any tool call
instructions. Added explicit "DO NOT skip this" enforcement.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ui.py spinner/color output goes to stderr which Claude Code
buffers invisibly. Instead, have the agent output a visible progress
block with emoji showing Reddit/X/Web agents deploying.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add back the brief topic acknowledgment ("Researching X — searching
Reddit for upvotes...") and descriptive intro that the v1 skill had.
The v2 version was jumping straight into script execution with no
user-facing feedback about what was being researched.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Stats: replace BAD/GOOD examples with strict fill-in-the-blank template
- Reddit: add subreddit-targeted fallback search, soften scoring penalties
(engagement -10→-3, date confidence -10→-5), add minimum result guarantee
- Citations: limit to 1 per insight, short format, no engagement metrics
- Summary: add bold topic headers template for structured paragraphs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reverted description to original public repo copy
- Restored H1 heading, moved imperative instruction to bold paragraph
- Added BAD/GOOD examples enforcing emoji tree stats format
- Required @handle and r/subreddit citation in ALL summary types
- Removed agent:Explore and disable-model-invocation from frontmatter
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Explore agent was treating SKILL.md as documentation to summarize
instead of instructions to follow. Removed agent:Explore from frontmatter
and restructured opening to immediately command script execution.
Also adds release plan for Bird CLI v2.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap value in single quotes to properly escape nested double quotes.
This fixes skills CLI installation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update skill name and description (remove TEST markers)
- Update script path to ~/.claude/skills/last30days/
- Clean up header, keep Bird CLI features prominent
Ready for local testing as the main skill.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove over-prescriptive format requirements
- Let Claude choose table vs stacked naturally based on content
- Keep critical requirement: Sources line with @handles
- Claude Code's renderer handles the responsive wrapping
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace ASCII table with stacked card format
- Each card: Tool/Mentions/Use Case/Sources on separate lines
- Cards separated by horizontal rule (────)
- Doesn't break when terminal window is narrow
- Still includes @handles in Sources line
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed from numbered list to ASCII box-drawing table format
- Added "Key Sources" column that MUST include @handles from X posts
- Added explicit instructions to parse and display highest-engagement handles
- Matches the output quality of the original xAI version
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude was summarizing qualitatively ('mostly casual conversation')
instead of summing actual engagement numbers from the output.
Added CRITICAL note to:
- Parse [Xlikes, Yrt] from each X post
- Sum totals for the stats display
- Show top voices with engagement (e.g., @handle (15K likes))
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Now reads from ~/.config/last30days/.env like the regular skill.
Bird CLI + API keys both work together.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add LAST30DAYS_CONFIG_DIR env var to override config location
- Set LAST30DAYS_CONFIG_DIR="" in test skill for clean mode
- Test skill now ignores existing API keys to show Bird install prompt
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix invalid YAML in SKILL.md argument-hint (closes#8)
Wrapped value in single quotes to properly escape double quotes
- Add automatic model fallback for GPT-5 access errors (closes#9)
When OpenAI returns 400 for unverified orgs, retry with gpt-4o
- Add tests for model fallback logic
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Skill now works without any API keys using WebSearch fallback
- Shows promo banner marketing Reddit/X data when keys are missing
- Partial mode (one key) shows shorter tip for the missing source
- Updated SKILL.md to document three modes: Full, Partial, Web-Only
- Added get_missing_keys() to env.py for promo logic
- Added show_promo(), start_web_only(), show_web_only_complete() to ui.py
- Updated render_compact() to include inline promo for web-only mode
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Shows multi-panel consistency for photorealistic people:
- JSON structure with face preservation
- Same person at ages 10, 20, 40, 80
- Heterochromia + freckles maintained across panels
- Real generated result
Also added to SKILL.md intro examples.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Stats were showing twice - once in Judge section, once at end.
Now Judge section just synthesizes internally, stats only appear
at the end right before invitation.
Order: What I learned -> Stats -> Share your vision
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New order:
1. What I learned / KEY PATTERNS (or Most mentioned)
2. Stats (All agents reported back!)
3. Share your vision (last)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Prompting is the primary use case, so it should be first:
1. Prompting - "Midjourney prompts", "ChatGPT image generation"
2. Recommendations - "best Claude Code skills", "top AI tools"
3. News - "what's happening with OpenAI"
4. General - any topic
Also renamed HOW-TO query type to PROMPTING for clarity.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude was "helpfully" adding DALL-E, GPT-4o to searches when user
asked about "ChatGPT image prompting". This uses outdated knowledge.
Now explicitly instructs: use the user's exact terminology, don't
substitute or add tech names. Trust the user knows what they're
asking about.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated research banner:
- Added Judge Agent: "Standing by to synthesize..."
- Better emoji descriptions: "Scanning for gold", "Catching latest takes"
Updated completion display:
- "All agents reported back!"
- "Judge Agent: Weighing the evidence..."
- Emojis on the Judge's evaluation criteria
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
After research is complete, Claude is an expert. Follow-up questions
should be answered from the research findings, not trigger new
WebSearches. Only do new research for a different topic.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Since script runs in background, users don't see its live output.
Now Claude displays the fancy emoji banner immediately before
starting the background script.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added QUERY_TYPE detection:
- RECOMMENDATIONS ("best X") → searches for lists, extracts specific names
- NEWS → searches for current events
- HOW-TO → searches for tutorials
- GENERAL → broad topic research
For RECOMMENDATIONS queries, synthesis now extracts specific entity names
with mention counts instead of generic patterns.
Example: "best Claude Code skills" now returns:
"Most mentioned: /commit (5x), remotion (4x), git-worktree (3x)"
Instead of:
"Skills are good. Keep them under 500 lines."
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Start the script first with run_in_background:true, then do WebSearch.
Both run in parallel so users see the script's progress display while
WebSearch also fetches results.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Suppress "Sources:" output from WebSearch (redundant noise)
- Reorder: Research Complete stats → What I learned → Share your vision
- Simplified KEY PATTERNS to 3 items
- Clean ending users see while waiting for their input
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Users now see the script's progress display as the "working state"
while waiting, rather than the WebSearch tool call.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
WebSearch shows as visible tool calls, so announcing it in the
banner was redundant. Now only Reddit and X agents are shown
in the initial display.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Deploy 3 agents in parallel: Reddit+X, WebSearch, Backup WebSearch
- Add visual progress indicators (🟠🔵🌐)
- Add Judge Agent to synthesize all sources
- Include web authors in top voices (e.g., "John on Medium")
- Weight Reddit/X higher than WebSearch (engagement signals)
Makes the research feel magical with parallel execution.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add WebSearch to allowed-tools
- Add --include-web flag to script invocation
- Add WebSearch Execution section with instructions
- Update summary format to include web sources
The skill now instructs Claude to use WebSearch after the
Python script runs, when the WEBSEARCH REQUIRED marker appears.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
If research says "use JSON prompts", the generated prompt MUST be JSON.
Previously the skill would learn about JSON format then ignore it and
write plain prose - defeating the purpose of the research.
- Add PROMPT FORMAT as required field to capture during research
- Add explicit anti-pattern warning about ignoring format
- Update quality checklist to verify format matches research
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Output order: What I learned → TARGET TOOL → KEY PATTERNS → Research Complete → Share vision
2. Fixed Reddit returning empty results - OpenAI was finding URLs but not extracting content
- Updated prompt to explicitly require extraction from search results
- Added "MUST include threads" instruction to prevent empty items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously asked "What tool?" before running research, which was
backwards for exploratory queries like "iOS design mockups".
Now:
- If tool is specified in query, use it
- If tool NOT specified, run research first
- Ask about target tool AFTER showing results (with smarter options based on what research found)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The skill was finding correct sources (e.g., ClawdBot content) but Claude
was synthesizing based on its pre-existing knowledge (Claude Code skills)
instead of what the research actually said.
Added strong grounding instructions:
- CRITICAL warning to base synthesis on actual research, not pre-existing knowledge
- Anti-pattern example: don't conflate "clawdbot skills" with "Claude Code skills"
- Self-check reminder before displaying summary
- Updated "What I learned" template to emphasize traceability to sources
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SKILL.md: Move "What I learned" BEFORE "Research Complete" stats
- Add error tracking to Report schema (reddit_error, x_error fields)
- Wrap OpenAI API calls in try/catch with clear error messages
- Show explicit error or "no results" messages in compact output
- Fix false positive error detection for null error fields
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Show proof of work first:
1. Research stats (upvotes, likes, sources)
2. Key patterns discovered (5 bullet points)
3. "I'm now an expert in X"
4. "Share your vision..."
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- quick: 8-12 sources each, faster response
- default: 20-30 sources each (unchanged behavior)
- deep: 50-70 Reddit, 40-60 X for comprehensive research
Adjusts API timeouts based on depth. Cache keys include depth
so different depths are cached separately.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- After stats summary, invite user to share what they want to create
- Wait for their response instead of auto-dumping generic prompts
- Write ONE tailored prompt based on their specific vision
- Only provide multiple options if they ask for more
- Stay in expert mode for follow-up requests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>