Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions scripts/list-prs.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#!/usr/bin/env bash
# Enumerate open, non-draft PRs the agent should consider reviewing.
#
# Two buckets, deduped:
# 1. PRs authored by @me across all repos (self-review).
# Three buckets, deduped:
# 1. PRs authored by @me across all repos (self-review) — includes those
# requiring review (e.g., compliance fixes). CI validation happens
# per-PR in review-one-pr.sh as a second layer of defence.
# 2. PRs where @me is a requested reviewer across all repos.
#
Comment on lines +4 to 9

Copilot AI Apr 25, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header says “Three buckets, deduped” but only two buckets are described/implemented (authored and review_requested). Either add the third bucket or update the comment to match the actual behavior.

Copilot uses AI. Check for mistakes.
# Filters:
Expand All @@ -16,15 +18,16 @@

set -euo pipefail

# PRs authored by @me (no --checks filter to include those awaiting review)
authored=$(gh search prs \
--state open \
--author "@me" \
--draft=false \
--checks success \
--limit 100 \
--json url \
--jq '.[].url')

# PRs where @me is requested as reviewer (require passing checks)
review_requested=$(gh search prs \
--state open \
--review-requested "@me" \
Expand Down
48 changes: 29 additions & 19 deletions skills/car-hunt/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,27 +217,33 @@ This tells the user exactly where to look without fabricating listings.

### Craigslist

Craigslist search pages use simple HTML and are reliably WebFetchable. Individual listing pages also work. However, **listings expire quickly** — always use the exact URL returned by search, never construct or guess a listing URL.
Craigslist search pages are **not reliably WebFetchable** — they often return empty or JS-gated results. Use the WebSearch fallback as the primary approach:

**Search URL pattern:**
**Primary approach — WebSearch:**
```
https://huntsville.craigslist.org/search/cta?query={make}+{model}&max_price={MAX_PRICE}&auto_miles_max={MAX_MILES}
site:craigslist.org "{make} {model}" "{year_min}" OR "{year_max}" "{city}" cars for sale
Comment on lines +220 to +224

Copilot AI Apr 25, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR title/description focus on PR enumeration (scripts/list-prs.sh), but this PR also changes the car-hunt skill’s Craigslist/WebSearch guidance and output schema. If intentional, please mention it in the PR description; otherwise consider splitting into a separate PR to keep scope focused.

Copilot uses AI. Check for mistakes.
```
Comment on lines 223 to 225

Copilot AI Apr 25, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generic WebSearch query template only ORs "{year_min}" and "{year_max}", which will miss intermediate years when the range spans more than 2 years (e.g., 2015–2017 would skip 2016). Consider generating an OR list for all years in-range (like the examples below) or adjusting the template to avoid implying a full range search when it’s only endpoints.

Copilot uses AI. Check for mistakes.

Regional Craigslist sites covering the 35243 area (use all of these):
- `https://bham.craigslist.org/search/cta` — Birmingham (primary)
- `https://huntsville.craigslist.org/search/cta` — Huntsville
- `https://chattanooga.craigslist.org/search/cta` — Chattanooga
- `https://atlanta.craigslist.org/search/cta` — Atlanta
Examples:
```
site:craigslist.org "honda civic" "2015" OR "2016" OR "2017" "birmingham" cars for sale
site:craigslist.org "toyota camry" "2013" OR "2014" OR "2015" alabama cars for sale
```

Full example URL:
WebSearch returns indexed Craigslist listing URLs. WebFetch those individual listing pages (e.g., `bham.craigslist.org/cto/d/{slug}/{id}.html`) — individual pages are plain HTML and parse well.

**Fallback — direct search URL (try if WebSearch returns too few results):**
```
https://bham.craigslist.org/search/cta?query=toyota+camry&max_price=6000&auto_miles_max=100000&sort=priceasc
https://bham.craigslist.org/search/cta?query={make}+{model}&max_price={MAX_PRICE}&auto_miles_max={MAX_ODOMETER}&sort=priceasc
```

WebFetch the search results page — Craigslist HTML is parseable and returns real listing data including title, price, mileage (when listed), and the direct listing URL (`/cto/d/...`). Extract individual listing URLs and WebFetch those for full details.
Regional sites covering the 35243 area:
- `https://bham.craigslist.org/search/cta` — Birmingham (primary)
- `https://huntsville.craigslist.org/search/cta` — Huntsville
- `https://chattanooga.craigslist.org/search/cta` — Chattanooga
- `https://atlanta.craigslist.org/search/cta` — Atlanta

**Link rule:** Use the exact `bham.craigslist.org/cto/d/{slug}/{id}.html` URL from the page. Never use `craigslist.org` without the full listing path.
**Link rule:** Use only the exact `bham.craigslist.org/cto/d/{slug}/{id}.html` URL scraped from the page. Never construct or guess a listing URL — Craigslist IDs are not predictable and a wrong ID is a 404.

### WebSearch Fallback (any source)

Expand All @@ -255,6 +261,7 @@ Then WebFetch individual listing URLs surfaced by the search results.

For each listing found, extract:
- `date_found` — today's date
- `date_posted` — the date the listing was originally posted (shown on the listing page as "posted" or "listed on")
- `make`, `model`, `year`, `trim`
- `miles` — current odometer
- `price` — asking price in USD
Expand All @@ -265,6 +272,8 @@ For each listing found, extract:

If a field is not found, note it as "—" — it can be filled during deep-dive.

**Staleness filter:** If `date_posted` is more than 21 days before today, **skip the listing entirely** — it has almost certainly sold or the seller is unresponsive. If `date_posted` cannot be determined, include the listing but note "Post date unknown" in Notes.

### Parallel Search Strategy

Launch all make/model × source searches simultaneously. Aim for **25+ listings per run**. If results are sparse, widen radius or drop year floor by 1–2 years.
Expand Down Expand Up @@ -312,11 +321,11 @@ Present reliability cards first, then the ranked table:

─── RANKED LISTINGS (by CPM) ───────────────────────────────────

| # | Make/Model | Year | Trim | Miles | Price | CPM | Life% | Source | Location | Dealer | Flags | Link |
|---|-----------|------|------|-------|-------|-----|-------|--------|----------|--------|-------|------|
| 1 | Honda Civic | 2021 | EX-L | 42,000 | $21,500 | $0.103 | 17% | AutoTrader | Birmingham, AL | Dealer | — | [link] |
| 2 | Toyota Camry | 2019 | XLE | 68,000 | $21,000 | $0.091 | 23% | CarGurus | Atlanta, GA | CarMax | — | [link] |
| 3 | Honda Accord | 2018 | Sport | 89,000 | $19,500 | $0.121 | 36% | FB Mkt | Hoover, AL | Private 🏠 | ⚠️ CAUTION YEAR | [link] |
| # | Make/Model | Year | Trim | Miles | Price | CPM | Life% | Posted | Source | Location | Dealer | Flags | Link |
|---|-----------|------|------|-------|-------|-----|-------|--------|--------|----------|--------|-------|------|
| 1 | Honda Civic | 2021 | EX-L | 42,000 | $21,500 | $0.103 | 17% | Apr 20 | AutoTrader | Birmingham, AL | Dealer | — | [link] |
| 2 | Toyota Camry | 2019 | XLE | 68,000 | $21,000 | $0.091 | 23% | Apr 18 | CarGurus | Atlanta, GA | CarMax | — | [link] |
| 3 | Honda Accord | 2018 | Sport | 89,000 | $19,500 | $0.121 | 36% | Apr 10 | FB Mkt | Hoover, AL | Private 🏠 | ⚠️ CAUTION YEAR | [link] |
...

⚠️ FLAGS:
Expand Down Expand Up @@ -435,10 +444,11 @@ When confirmed, create a new Google Sheet via the Drive MCP using CSV→Sheets a
### Column Order (match original template exactly)

```
Date | Make | Model | Year | Package | Miles | Cost | CPM | Life | Location | Dealer | Link | Notes
Date | Make | Model | Year | Package | Miles | Cost | CPM | Life | Posted | Location | Dealer | Link | Notes
```

- **Date** — `DD Mon YYYY` format (e.g., `25 Apr 2026`)
- **Date** — `DD Mon YYYY` format (e.g., `25 Apr 2026`) — date the skill ran, not the listing date
- **Posted** — date the listing was first posted (e.g., `Apr 20`) — omit year if current year; use `Unknown` if not found
- **Miles** — numeric, no commas (e.g., `53000`)
- **Cost** — formatted as `$4750`
- **CPM** — formatted as `$0.019` (3 decimal places)
Expand Down
Loading