Merge PR #48: feat: add Xiaohongshu source + Reddit public fallback
- Xiaohongshu search via local MCP service (opt-in, zero impact if service not running) - Reddit public JSON fallback (works with zero API keys) - Reddit priority: ScrapeCreators -> OpenAI -> public fallback - Updated env.py: Reddit always available via public fallback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
---
|
||||
title: "chore: open PR triage - build or close decision for all 5 open PRs"
|
||||
type: chore
|
||||
status: active
|
||||
date: 2026-03-02
|
||||
---
|
||||
|
||||
# Open PR Triage
|
||||
|
||||
Decision record for each of the 5 open PRs on `mvanhorn/last30days-skill`.
|
||||
For each: build/merge, cherry-pick, or close with explanation.
|
||||
|
||||
---
|
||||
|
||||
## PR #26 - Add HN, YouTube, and Product Hunt sources + --search flag
|
||||
**Author:** wkbaran | **Size:** +3402/-49 | **Date:** 2026-02-15
|
||||
|
||||
### What it adds
|
||||
- Hacker News source (Algolia API, no auth)
|
||||
- YouTube source (YouTube Data API v3, optional key)
|
||||
- Product Hunt source (GraphQL API, optional key)
|
||||
- `--search=SOURCES` flag (e.g. `--search=reddit,hn,yt`)
|
||||
- 58 new tests
|
||||
|
||||
### What's already on main
|
||||
- **HN:** ✅ already merged (`scripts/lib/hackernews.py`)
|
||||
- **YouTube:** ✅ already merged (`scripts/lib/youtube_yt.py`)
|
||||
- **Product Hunt:** ❌ NOT on main
|
||||
- **`--search` flag:** ❌ NOT on main
|
||||
|
||||
### Decision: CHERRY-PICK (`--search` flag only, skip Product Hunt)
|
||||
|
||||
The HN and YouTube modules in this PR are earlier versions than what's on
|
||||
main. We should NOT take those. Product Hunt is not a priority source.
|
||||
The one missing piece worth landing:
|
||||
|
||||
**`--search=SOURCES` flag** - lets callers (including agent mode) specify
|
||||
which sources to run. Useful for `--search=hn,polymarket` or
|
||||
`--search=reddit,x` focus runs.
|
||||
|
||||
### Plan
|
||||
- Cherry-pick just `tests/test_search_flag.py` and the `--search` argument
|
||||
wiring in `scripts/last30days.py`
|
||||
- Skip `scripts/lib/producthunt.py` and all PH-related code entirely
|
||||
- Do NOT take their `hackernews.py`, `youtube.py`, `render.py`, `normalize.py`,
|
||||
`schema.py` - our versions are newer
|
||||
- Update SKILL.md to document `--search` flag
|
||||
- Comment on PR thanking wkbaran - his HN/YouTube work was an inspiration
|
||||
for the sources we ended up building. Acknowledge that specifically.
|
||||
|
||||
### Acceptance Criteria
|
||||
- [ ] `python3 scripts/last30days.py "AI coding tools" --search=hn,reddit` runs only HN + Reddit
|
||||
- [ ] `python3 scripts/last30days.py "test" --search=x,web` skips Reddit
|
||||
- [ ] `test_search_flag.py` passes (adapt to our test patterns, no PH references)
|
||||
- [ ] SKILL.md updated with `--search` flag docs
|
||||
- [ ] Sync via `bash scripts/sync.sh`
|
||||
|
||||
---
|
||||
|
||||
## PR #24 - Adding Codex compatibility
|
||||
**Author:** el-analista | **Size:** +228/-29 | **Date:** 2026-02-11
|
||||
|
||||
### What it adds
|
||||
- `agents/openai.yaml` Codex discovery metadata
|
||||
- Portable script path resolution in SKILL.md (multi-install-path loop)
|
||||
- Platform-neutral UI text (`assistant` instead of Claude-specific wording)
|
||||
- `LAST30DAYS_CACHE_DIR` env override in `scripts/lib/cache.py`
|
||||
- `LAST30DAYS_OUTPUT_DIR` env override in `scripts/lib/render.py`
|
||||
- X/Bird query noise stripping + last-chance retry in `scripts/lib/bird_x.py`
|
||||
- New tests: `test_bird_x.py`, `test_cache.py`, `test_render.py`
|
||||
|
||||
### What's already on main
|
||||
- **Codex auth:** ✅ already merged (via PR #38)
|
||||
- **Multi-path script resolution:** ✅ already in SKILL.md (the `for dir in` loop)
|
||||
- **Platform-neutral wording:** ❌ NOT systematically applied
|
||||
- **Cache/output dir overrides:** ❌ NOT on main
|
||||
- **Bird X improvements:** ✅ partially (we have other bird_x fixes but may be missing noise stripping + retry)
|
||||
|
||||
### Decision: REVIEW AND PARTIAL CHERRY-PICK
|
||||
|
||||
The env var overrides (`LAST30DAYS_CACHE_DIR`, `LAST30DAYS_OUTPUT_DIR`) are
|
||||
genuinely useful for sandboxed/containerized Codex environments. The bird_x
|
||||
noise stripping and last-chance retry may improve X search quality and are
|
||||
low-risk additions.
|
||||
|
||||
The platform-neutral wording change ("assistant" instead of Claude references)
|
||||
should be skipped — SKILL.md is Claude-specific by design.
|
||||
|
||||
### Plan
|
||||
- Read the diff carefully against our current `cache.py`, `render.py`, `bird_x.py`
|
||||
- Cherry-pick the `LAST30DAYS_CACHE_DIR` and `LAST30DAYS_OUTPUT_DIR` env overrides
|
||||
- Cherry-pick the bird_x noise stripping + retry logic if it doesn't conflict
|
||||
with our existing bird_x changes
|
||||
- Skip `agents/openai.yaml` — we have our own multi-path resolution
|
||||
- Skip platform-neutral wording changes
|
||||
- Comment on PR thanking contributor and explaining what landed
|
||||
|
||||
### Acceptance Criteria
|
||||
- [ ] `LAST30DAYS_CACHE_DIR=/tmp/test python3 scripts/last30days.py "test" --mock` writes cache to /tmp/test
|
||||
- [ ] `LAST30DAYS_OUTPUT_DIR=/tmp/out python3 scripts/last30days.py "test" --mock` writes output to /tmp/out
|
||||
- [ ] Existing tests pass after cherry-pick
|
||||
- [ ] `test_cache.py` and `test_render.py` adapted and passing
|
||||
|
||||
---
|
||||
|
||||
## PR #14 - Simplify to WebSearch-first, make API keys optional
|
||||
**Author:** thangman1 | **Size:** +97/-168 | **Date:** 2026-02-01
|
||||
|
||||
### What it does
|
||||
Removes the Reddit/X Python search engine as the primary data source.
|
||||
Repositions Claude Code's built-in WebSearch as the "default" mode.
|
||||
Strips engagement metrics (upvotes, likes, repost counts) from output.
|
||||
Removes mode detection logic (Full Mode / Partial Mode / Web-Only Mode).
|
||||
|
||||
### Decision: CLOSE - do not merge
|
||||
|
||||
This PR inverts the core value proposition of last30days. The skill's
|
||||
differentiation is **real engagement data** from Reddit threads and X posts —
|
||||
upvotes, likes, reposts — that WebSearch cannot provide. Stripping that out
|
||||
produces a worse tool than just asking Claude to search the web, which anyone
|
||||
can already do.
|
||||
|
||||
The author's intent (lower barrier to entry, no API key required) is valid,
|
||||
but the right solution is making HN + Polymarket work without any API key
|
||||
(they already do), and making OPENAI_API_KEY easier to obtain — not removing
|
||||
the Reddit/X engine.
|
||||
|
||||
### Action
|
||||
- Comment on PR explaining why we're closing it
|
||||
- Acknowledge the valid friction point (API key setup) and point to HN +
|
||||
Polymarket as the zero-config sources
|
||||
- Close PR
|
||||
|
||||
---
|
||||
|
||||
## PR #10 - OpenRouter API integration
|
||||
**Author:** thetechreviewer | **Size:** +1029/-16 | **Date:** 2026-01-28
|
||||
|
||||
### What it adds
|
||||
OpenRouter as an alternative to OpenAI for the Reddit discovery search.
|
||||
Allows using any model available on OpenRouter instead of just OpenAI models.
|
||||
|
||||
### What's already on main
|
||||
- **`scripts/lib/openrouter_search.py`:** ✅ ALREADY ON MAIN
|
||||
- **Wired into `scripts/last30days.py`:** ✅ ALREADY ON MAIN (the `backend == "openrouter"` path)
|
||||
|
||||
### Decision: CLOSE - already merged
|
||||
|
||||
The OpenRouter integration that this PR introduced is already on main. It
|
||||
arrived via internal work that post-dated this PR. The PR is stale.
|
||||
|
||||
### Action
|
||||
- Comment on PR: "Thanks for this — OpenRouter support is already on main
|
||||
(landed via internal work). Closing as incorporated."
|
||||
- Close PR
|
||||
|
||||
---
|
||||
|
||||
## PR #5 - Add support for Codex auth with OpenAI Responses API
|
||||
**Author:** jblwilliams | **Size:** +358/-66 | **Date:** 2026-01-27
|
||||
|
||||
### What it adds
|
||||
- JWT-based Codex auth with `chatgpt_account_id`
|
||||
- Codex endpoint routing (`https://chatgpt.com/backend-api/codex/responses`)
|
||||
- SSE handling for streaming Codex responses
|
||||
- Typed auth status/source dataclass
|
||||
- Codex fallback model chain
|
||||
|
||||
### What's already on main
|
||||
**All of this is already on main.** The Codex auth system landed via PR #37
|
||||
(iliaal:codex-auth-merged), which in turn came in with PR #38. This PR (#5)
|
||||
predates that work and covers the same ground.
|
||||
|
||||
### Decision: CLOSE - already incorporated
|
||||
|
||||
### Action
|
||||
- Comment on PR: "Thanks for this early work on Codex auth! The same feature
|
||||
landed on main via PR #37 (from a separate contributor who built on similar
|
||||
ideas). The JWT decode, Codex endpoint routing, SSE parsing, and typed auth
|
||||
dataclass are all live. Closing as incorporated."
|
||||
- Close PR
|
||||
|
||||
---
|
||||
|
||||
## Summary Table
|
||||
|
||||
| PR | Author | Decision | Reason |
|
||||
|----|--------|----------|--------|
|
||||
| #26 | wkbaran | **Cherry-pick** | `--search` flag not on main; HN/YouTube already there; skip Product Hunt |
|
||||
| #24 | el-analista | **Cherry-pick** | Cache dir overrides + bird_x improvements worth landing; Codex auth already there |
|
||||
| #14 | thangman1 | **Close** | Removes engagement data, inverts core value proposition |
|
||||
| #10 | thetechreviewer | **Close** | OpenRouter already on main |
|
||||
| #5 | jblwilliams | **Close** | Codex auth already on main via PR #37/38 |
|
||||
|
||||
## Implementation Order (if proceeding)
|
||||
|
||||
1. Close PR #5, #10, #14 with comments (no code changes needed)
|
||||
2. Cherry-pick PR #24 pieces (bird_x + cache/render env overrides)
|
||||
3. Cherry-pick PR #26 pieces (Product Hunt + `--search` flag)
|
||||
4. Sync and test
|
||||
5. Push to upstream
|
||||
Reference in New Issue
Block a user