Skip to content
Open
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
1 change: 1 addition & 0 deletions .claude/dude
44 changes: 44 additions & 0 deletions .claude/skills/cupid0/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
name: cupid0
description: Use when searching, filtering, and evaluating job listings for Mike
---

# cupid0

Job seeker agent. Finds jobs on Indeed, filters rejects, evaluates matches, tailors resume, applies.

## Process

1. **search** — scrape one Indeed page using chrome-devtools MCP (see indeed.md)
2. **filter** — swipe left based on swipe_left.md, run `node filter.js`
3. **report** — show keepers as `company | title | salary`, ask Mike before continuing
4. **next page** — only after Mike gives the go-ahead, repeat steps 1-3
5. **evaluate** — once all pages done, screen each keeper ONE AT A TIME: fetch full description → save to /tmp/descriptions/<company>.md → score 1-100 vs resume → report → wait → next
6. **tailor** — generate tailored resume per keeper using ai_golden.md + og_golden.md
7. **apply** — fill and submit application

## Pace Rules — READ THIS

- **Never parallelize.** Not search, not fetching, not scoring. One thing at a time.
- After each page: report keepers, stop, wait for Mike.
- During evaluate: fetch one description, score it, report it, stop, wait for Mike.
- Natural pauses = natural rate limiting. We have time. Don't rush.
- Going serial also avoids Indeed detection/rate limits.

## Files

- `swipe_left.md` — auto-reject criteria
- `swipe_right.md` — green flags that boost score
- `indeed.md` — Indeed-specific scraping instructions

## Resumes

- `~/dev/self/portfolio/resume/ai_golden.md` — AI/agentic focus
- `~/dev/self/portfolio/resume/og_golden.md` — full classic experience

## State

- `/tmp/suitors.json` — current candidate list
- `/tmp/keepers.json` — keepers across pages
- `/tmp/evals.json` — scores and notes
- `/tmp/descriptions/` — full job descriptions
33 changes: 33 additions & 0 deletions .claude/skills/cupid0/indeed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
name: indeed
description: Use when searching or scraping Indeed job listings for cupid0
---

# Indeed

## What
Scrape Indeed job listings using the chrome-devtools MCP against the user's real logged-in Chrome session.

## How

**Search URL:**
```
https://www.indeed.com/jobs?q=software+engineer&l=Remote&fromage=7&salaryType=%24150%2C000&sc=0kf%3Aattr%28DSQF7%29%3B
```

**Pagination:** append `&start=20` for page 2, `&start=40` for page 3, etc.

**Scrape jobs with evaluate_script:**
```javascript
() => [...document.querySelectorAll('.job_seen_beacon')].map(el => ({
title: el.querySelector('.jobTitle a')?.innerText?.trim(),
company: el.querySelector('[data-testid="company-name"]')?.innerText?.trim(),
url: el.querySelector('.jobTitle a')?.href
})).filter(j => j.title)
```

**Rules:**
- Use chrome-devtools MCP only — Playwright gets detected on page 2+
- Do NOT navigate if already on the right page — read first
- After getting jobs from evaluate_script, use Write tool to save to /tmp/cupid0_jobs.json as {"count": N, "jobs": [...]}
- Run `node filter.js` after each page
25 changes: 25 additions & 0 deletions .claude/skills/cupid0/swipe_left.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# swipe left 🙅

auto-reject any job that matches these. no need to fetch the description.

- government, federal, or public sector
- military, defense, army, dod, or requires security clearance
- religious organizations
- crypto, blockchain, web3, nft, solana
- staffing agencies / body shops (Intone, Wipro, Infosys, TCS, etc.)
- consulting farms that just place you at clients (Accenture, Deloitte, etc.)

## tech i don't do

- crypto / blockchain / web3
- android / mobile
- java
- golang
- devops / sre / platform engineering
- cybersecurity / infosec
- php

## company stage

- pre-revenue startups (no salary, equity-only)
- solo engineer / first engineer at non-tech companies (CPA firms, law firms, etc.)
12 changes: 12 additions & 0 deletions .claude/skills/cupid0/swipe_right.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# swipe right 🙌

auto-bump score for any job mentioning these. rare green flags.

## culture

- XP (Extreme Programming)
- pair programming
- mob programming
- TDD / BDD / ATDD
- Kanban
- DDD (Domain-Driven Design)
5 changes: 0 additions & 5 deletions .formatter.exs

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ erl_crash.dump

# Temporary files, for example, from tests.
/tmp/
/.claude/dude/
/.idea/
8 changes: 8 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"cupid0": {
"command": "npx",
"args": ["chrome-devtools-mcp@latest", "--autoConnect"]
}
}
}
21 changes: 21 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# cupid0

## FULL DESCRIPTIONS ONLY. PERIOD.

When showing a job description, ALWAYS paste the FULL raw text — every word, no summarizing, no bullets, no "here's what it says".
If it's saved in /tmp/descriptions/, cat the whole file.
If it's not saved, fetch and paste everything.
NO EXCEPTIONS. NO SUMMARIES. NO REFORMATTING.

## SHORTCUTS

- desc: paste the entire file content, every word, no summarizing, no reformatting, no bullets

## TAILORING RULES

- Source: og_golden.md for style and impact bullets, ai_golden.md for AI/agentic work
- Keep og's precise impact format — no vibe fluff
- Where og doesn't cover what the job asks, pull from ai_golden but rewrite in og's style
- Only go back far enough in history to fill the role — no need to list everything
- Select and remix the best matching bullets, don't copy-paste everything
- Output is one tight resume that reads like og but speaks the job's language
4 changes: 0 additions & 4 deletions apps/bouncer/.formatter.exs

This file was deleted.

26 changes: 0 additions & 26 deletions apps/bouncer/.gitignore

This file was deleted.

21 changes: 0 additions & 21 deletions apps/bouncer/README.md

This file was deleted.

18 changes: 0 additions & 18 deletions apps/bouncer/lib/bouncer.ex

This file was deleted.

20 changes: 0 additions & 20 deletions apps/bouncer/lib/bouncer/application.ex

This file was deleted.

35 changes: 0 additions & 35 deletions apps/bouncer/mix.exs

This file was deleted.

16 changes: 0 additions & 16 deletions apps/bouncer/test/bouncer_feature_test.exs

This file was deleted.

8 changes: 0 additions & 8 deletions apps/bouncer/test/bouncer_test.exs

This file was deleted.

8 changes: 0 additions & 8 deletions apps/bouncer/test/cabbage_test.exs

This file was deleted.

7 changes: 0 additions & 7 deletions apps/bouncer/test/features/bouncer.feature

This file was deleted.

1 change: 0 additions & 1 deletion apps/bouncer/test/test_helper.exs

This file was deleted.

18 changes: 0 additions & 18 deletions config/config.exs

This file was deleted.

21 changes: 0 additions & 21 deletions mix.exs

This file was deleted.

4 changes: 0 additions & 4 deletions mix.lock

This file was deleted.

Loading