Fix Bird search: strip noise words + fix date parsing
1. Add _extract_core_subject() to strip noise words before X search - X search is literal keyword matching, not semantic - "best open claw usecases" → "open claw" (27 results vs 0) 2. Fix ISO date detection bug - Was: if "T" in created_at (matched "Tue" in "Tue Feb 03...") - Now: if created_at[10] == "T" (proper ISO separator check) - Dates now parse correctly: (2026-02-03) instead of (date unknown) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
+25
-3
@@ -21,6 +21,23 @@ def _log(msg: str):
|
|||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_core_subject(topic: str) -> str:
|
||||||
|
"""Extract core subject from verbose query for X search.
|
||||||
|
|
||||||
|
X search is literal keyword matching, not semantic.
|
||||||
|
Strip noise words to get searchable terms.
|
||||||
|
"""
|
||||||
|
noise = ['best', 'top', 'how to', 'tips for', 'practices', 'features',
|
||||||
|
'killer', 'guide', 'tutorial', 'recommendations', 'advice',
|
||||||
|
'prompting', 'using', 'for', 'with', 'the', 'of', 'in', 'on',
|
||||||
|
'usecases', 'use cases', 'examples', 'what are', 'what is']
|
||||||
|
words = topic.lower().split()
|
||||||
|
result = [w for w in words if w not in noise]
|
||||||
|
# Rejoin compound terms that got split (e.g., "open claw" -> "openclaw")
|
||||||
|
joined = ' '.join(result[:4]) or topic # Keep max 4 words
|
||||||
|
return joined
|
||||||
|
|
||||||
|
|
||||||
def is_bird_installed() -> bool:
|
def is_bird_installed() -> bool:
|
||||||
"""Check if Bird CLI is installed.
|
"""Check if Bird CLI is installed.
|
||||||
|
|
||||||
@@ -127,9 +144,13 @@ def search_x(
|
|||||||
"""
|
"""
|
||||||
count = DEPTH_CONFIG.get(depth, DEPTH_CONFIG["default"])
|
count = DEPTH_CONFIG.get(depth, DEPTH_CONFIG["default"])
|
||||||
|
|
||||||
|
# Extract core subject - X search is literal, not semantic
|
||||||
|
# "best open claw usecases" -> "open claw" (searchable keywords)
|
||||||
|
core_topic = _extract_core_subject(topic)
|
||||||
|
|
||||||
# Build query with date filter using X's search syntax
|
# Build query with date filter using X's search syntax
|
||||||
# Bird doesn't support --since flag, but X search accepts since:YYYY-MM-DD in query
|
# Bird doesn't support --since flag, but X search accepts since:YYYY-MM-DD in query
|
||||||
query = f"{topic} since:{from_date}"
|
query = f"{core_topic} since:{from_date}"
|
||||||
|
|
||||||
# Build command
|
# Build command
|
||||||
cmd = [
|
cmd = [
|
||||||
@@ -212,8 +233,9 @@ def parse_bird_response(response: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|||||||
created_at = tweet.get("createdAt") or tweet.get("created_at", "")
|
created_at = tweet.get("createdAt") or tweet.get("created_at", "")
|
||||||
if created_at:
|
if created_at:
|
||||||
try:
|
try:
|
||||||
# Try ISO format first
|
# Try ISO format first (e.g., "2026-02-03T22:33:32Z")
|
||||||
if "T" in created_at:
|
# Check for ISO date separator, not just "T" (which appears in "Tue")
|
||||||
|
if len(created_at) > 10 and created_at[10] == "T":
|
||||||
dt = datetime.fromisoformat(created_at.replace("Z", "+00:00"))
|
dt = datetime.fromisoformat(created_at.replace("Z", "+00:00"))
|
||||||
else:
|
else:
|
||||||
# Twitter format: "Wed Jan 15 14:30:00 +0000 2026"
|
# Twitter format: "Wed Jan 15 14:30:00 +0000 2026"
|
||||||
|
|||||||
Reference in New Issue
Block a user