applyagent 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. applyagent-0.3.0/.env.example +14 -0
  2. applyagent-0.3.0/.github/workflows/ci.yml +29 -0
  3. applyagent-0.3.0/.github/workflows/publish.yml +31 -0
  4. applyagent-0.3.0/.gitignore +41 -0
  5. applyagent-0.3.0/PKG-INFO +202 -0
  6. applyagent-0.3.0/README.md +171 -0
  7. applyagent-0.3.0/profile.example.json +61 -0
  8. applyagent-0.3.0/pyproject.toml +54 -0
  9. applyagent-0.3.0/src/applyagent/__init__.py +3 -0
  10. applyagent-0.3.0/src/applyagent/__main__.py +5 -0
  11. applyagent-0.3.0/src/applyagent/apply/__init__.py +1 -0
  12. applyagent-0.3.0/src/applyagent/apply/chrome.py +321 -0
  13. applyagent-0.3.0/src/applyagent/apply/dashboard.py +203 -0
  14. applyagent-0.3.0/src/applyagent/apply/launcher.py +794 -0
  15. applyagent-0.3.0/src/applyagent/apply/prompt.py +624 -0
  16. applyagent-0.3.0/src/applyagent/cli.py +457 -0
  17. applyagent-0.3.0/src/applyagent/config/employers.yaml +305 -0
  18. applyagent-0.3.0/src/applyagent/config/searches.example.yaml +112 -0
  19. applyagent-0.3.0/src/applyagent/config/sites.yaml +181 -0
  20. applyagent-0.3.0/src/applyagent/config.py +260 -0
  21. applyagent-0.3.0/src/applyagent/database.py +424 -0
  22. applyagent-0.3.0/src/applyagent/discovery/__init__.py +0 -0
  23. applyagent-0.3.0/src/applyagent/discovery/jobspy.py +478 -0
  24. applyagent-0.3.0/src/applyagent/discovery/smartextract.py +1118 -0
  25. applyagent-0.3.0/src/applyagent/discovery/workday.py +543 -0
  26. applyagent-0.3.0/src/applyagent/enrichment/__init__.py +0 -0
  27. applyagent-0.3.0/src/applyagent/enrichment/detail.py +894 -0
  28. applyagent-0.3.0/src/applyagent/llm.py +297 -0
  29. applyagent-0.3.0/src/applyagent/pipeline.py +540 -0
  30. applyagent-0.3.0/src/applyagent/scoring/__init__.py +1 -0
  31. applyagent-0.3.0/src/applyagent/scoring/cover_letter.py +305 -0
  32. applyagent-0.3.0/src/applyagent/scoring/pdf.py +440 -0
  33. applyagent-0.3.0/src/applyagent/scoring/scorer.py +180 -0
  34. applyagent-0.3.0/src/applyagent/scoring/tailor.py +590 -0
  35. applyagent-0.3.0/src/applyagent/scoring/validator.py +345 -0
  36. applyagent-0.3.0/src/applyagent/view.py +406 -0
  37. applyagent-0.3.0/src/applyagent/wizard/__init__.py +0 -0
  38. applyagent-0.3.0/src/applyagent/wizard/init.py +393 -0
@@ -0,0 +1,14 @@
1
+ # ApplyAgent Environment Configuration
2
+ # Copy to ~/.applyagent/.env and fill in your values.
3
+
4
+ # LLM Provider (pick one)
5
+ GEMINI_API_KEY= # Gemini 2.0 Flash (recommended, cheapest)
6
+ # OPENAI_API_KEY= # OpenAI (GPT-4o-mini)
7
+ # LLM_URL=http://127.0.0.1:8080/v1 # Local LLM (llama.cpp, Ollama)
8
+ # LLM_MODEL= # Override model name
9
+
10
+ # Auto-Apply (optional)
11
+ CAPSOLVER_API_KEY= # For CAPTCHA solving during auto-apply
12
+
13
+ # Proxy (optional, for scraping)
14
+ # PROXY=host:port:user:pass
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ workflow_dispatch: # manual trigger only
5
+
6
+ jobs:
7
+ test:
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ matrix:
11
+ python-version: ["3.11", "3.12", "3.13"]
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Set up Python ${{ matrix.python-version }}
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+
22
+ - name: Install dependencies
23
+ run: pip install -e ".[dev]"
24
+
25
+ - name: Lint
26
+ run: ruff check src/
27
+
28
+ - name: Test
29
+ run: pytest tests/ -v
@@ -0,0 +1,31 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ environment: pypi
12
+ permissions:
13
+ id-token: write # required for OIDC trusted publishing
14
+
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install build tools
25
+ run: pip install build
26
+
27
+ - name: Build package
28
+ run: python -m build
29
+
30
+ - name: Publish to PyPI
31
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,41 @@
1
+ # User data (NEVER commit)
2
+ profile.json
3
+ resume.txt
4
+ resume.pdf
5
+ *.env
6
+ .env.*
7
+ !.env.example
8
+
9
+ # Runtime artifacts
10
+ *.db
11
+ tailored_resumes/
12
+ cover_letters/
13
+ chrome-workers/
14
+ apply-workers/
15
+ apply_logs/
16
+ logs/
17
+
18
+ # MCP configs (per-machine)
19
+ .mcp*.json
20
+
21
+ # Python
22
+ __pycache__/
23
+ *.py[cod]
24
+ *$py.class
25
+ *.egg-info/
26
+ dist/
27
+ build/
28
+ *.egg
29
+
30
+ # IDE
31
+ .vscode/
32
+ .idea/
33
+ *.swp
34
+ *.swo
35
+
36
+ # OS
37
+ .DS_Store
38
+ Thumbs.db
39
+
40
+ # Claude Code
41
+ .claude/
@@ -0,0 +1,202 @@
1
+ Metadata-Version: 2.4
2
+ Name: applyagent
3
+ Version: 0.3.0
4
+ Summary: AI-powered end-to-end job application pipeline
5
+ Project-URL: Homepage, https://github.com/Pickle-Pixel/ApplyAgent
6
+ Project-URL: Repository, https://github.com/Pickle-Pixel/ApplyAgent
7
+ Project-URL: Issues, https://github.com/Pickle-Pixel/ApplyAgent/issues
8
+ Author: Pickle-Pixel
9
+ License-Expression: AGPL-3.0-only
10
+ Keywords: ai,apply,automation,job-application,job-search,resume
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Office/Business
18
+ Requires-Python: >=3.11
19
+ Requires-Dist: beautifulsoup4>=4.12
20
+ Requires-Dist: httpx>=0.24
21
+ Requires-Dist: pandas>=2.0
22
+ Requires-Dist: playwright>=1.40
23
+ Requires-Dist: python-dotenv>=1.0
24
+ Requires-Dist: pyyaml>=6.0
25
+ Requires-Dist: rich>=13.0
26
+ Requires-Dist: typer>=0.9.0
27
+ Provides-Extra: dev
28
+ Requires-Dist: pytest>=7.0; extra == 'dev'
29
+ Requires-Dist: ruff>=0.1; extra == 'dev'
30
+ Description-Content-Type: text/markdown
31
+
32
+ <!-- logo here -->
33
+
34
+ # ApplyAgent
35
+
36
+ **Applied to 1,000 jobs in 2 days. Fully autonomous. Open source.**
37
+
38
+ [![PyPI version](https://img.shields.io/pypi/v/ApplyAgent?color=blue)](https://pypi.org/project/ApplyAgent/)
39
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
40
+
41
+
42
+ ---
43
+
44
+ ## What It Does
45
+
46
+ ApplyAgent is a 6-stage autonomous job application pipeline. It discovers jobs across 5+ boards, scores them against your resume with AI, tailors your resume per job, writes cover letters, and **submits applications for you**. It navigates forms, uploads documents, answers screening questions, all hands-free.
47
+
48
+ Three commands. That's it.
49
+
50
+ ```bash
51
+ pip install ApplyAgent
52
+ pip install --no-deps python-jobspy && pip install pydantic tls-client requests markdownify regex
53
+ ApplyAgent init # one-time setup: resume, profile, preferences, API keys
54
+ ApplyAgent doctor # verify your setup — shows what's installed and what's missing
55
+ ApplyAgent run # discover > enrich > score > tailor > cover letters
56
+ ApplyAgent run -w 4 # same but parallel (4 threads for discovery/enrichment)
57
+ ApplyAgent apply # autonomous browser-driven submission
58
+ ApplyAgent apply -w 3 # parallel apply (3 Chrome instances)
59
+ ApplyAgent apply --dry-run # fill forms without submitting
60
+ ```
61
+
62
+ > **Why two install commands?** `python-jobspy` pins an exact numpy version in its metadata that conflicts with pip's resolver, but works fine at runtime with any modern numpy. The `--no-deps` flag bypasses the resolver; the second command installs jobspy's actual runtime dependencies. Everything except `python-jobspy` installs normally.
63
+
64
+ ---
65
+
66
+ ## Two Paths
67
+
68
+ ### Full Pipeline (recommended)
69
+ **Requires:** Python 3.11+, Node.js (for npx), Gemini API key (free), Claude Code CLI, Chrome
70
+
71
+ Runs all 6 stages, from job discovery to autonomous application submission. This is the full power of ApplyAgent.
72
+
73
+ ### Discovery + Tailoring Only
74
+ **Requires:** Python 3.11+, Gemini API key (free)
75
+
76
+ Runs stages 1-5: discovers jobs, scores them, tailors your resume, generates cover letters. You submit applications manually with the AI-prepared materials.
77
+
78
+ ---
79
+
80
+ ## The Pipeline
81
+
82
+ | Stage | What Happens |
83
+ |-------|-------------|
84
+ | **1. Discover** | Scrapes 5 job boards (Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs) + 48 Workday employer portals + 30 direct career sites |
85
+ | **2. Enrich** | Fetches full job descriptions via JSON-LD, CSS selectors, or AI-powered extraction |
86
+ | **3. Score** | AI rates every job 1-10 based on your resume and preferences. Only high-fit jobs proceed |
87
+ | **4. Tailor** | AI rewrites your resume per job: reorganizes, emphasizes relevant experience, adds keywords. Never fabricates |
88
+ | **5. Cover Letter** | AI generates a targeted cover letter per job |
89
+ | **6. Auto-Apply** | Claude Code navigates application forms, fills fields, uploads documents, answers questions, and submits |
90
+
91
+ Each stage is independent. Run them all or pick what you need.
92
+
93
+ ---
94
+
95
+ ## ApplyAgent vs The Alternatives
96
+
97
+ | Feature | ApplyAgent | AIHawk | Manual |
98
+ |---------|-----------|--------|--------|
99
+ | Job discovery | 5 boards + Workday + direct sites | LinkedIn only | One board at a time |
100
+ | AI scoring | 1-10 fit score per job | Basic filtering | Your gut feeling |
101
+ | Resume tailoring | Per-job AI rewrite | Template-based | Hours per application |
102
+ | Auto-apply | Full form navigation + submission | LinkedIn Easy Apply only | Click, type, repeat |
103
+ | Supported sites | Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs, 46 Workday portals, 28 direct sites | LinkedIn | Whatever you open |
104
+ | License | AGPL-3.0 | MIT | N/A |
105
+
106
+ ---
107
+
108
+ ## Requirements
109
+
110
+ | Component | Required For | Details |
111
+ |-----------|-------------|---------|
112
+ | Python 3.11+ | Everything | Core runtime |
113
+ | Node.js 18+ | Auto-apply | Needed for `npx` to run Playwright MCP server |
114
+ | Gemini API key | Scoring, tailoring, cover letters | Free tier (15 RPM / 1M tokens/day) is enough |
115
+ | Chrome/Chromium | Auto-apply | Auto-detected on most systems |
116
+ | Claude Code CLI | Auto-apply | Install from [claude.ai/code](https://claude.ai/code) |
117
+
118
+ **Gemini API key is free.** Get one at [aistudio.google.com](https://aistudio.google.com). OpenAI and local models (Ollama/llama.cpp) are also supported.
119
+
120
+ ### Optional
121
+
122
+ | Component | What It Does |
123
+ |-----------|-------------|
124
+ | CapSolver API key | Solves CAPTCHAs during auto-apply (hCaptcha, reCAPTCHA, Turnstile, FunCaptcha). Without it, CAPTCHA-blocked applications just fail gracefully |
125
+
126
+ > **Note:** python-jobspy is installed separately with `--no-deps` because it pins an exact numpy version in its metadata that conflicts with pip's resolver. It works fine with modern numpy at runtime.
127
+
128
+ ---
129
+
130
+ ## Configuration
131
+
132
+ All generated by `ApplyAgent init`:
133
+
134
+ ### `profile.json`
135
+ Your personal data in one structured file: contact info, work authorization, compensation, experience, skills, resume facts (preserved during tailoring), and EEO defaults. Powers scoring, tailoring, and form auto-fill.
136
+
137
+ ### `searches.yaml`
138
+ Job search queries, target titles, locations, boards. Run multiple searches with different parameters.
139
+
140
+ ### `.env`
141
+ API keys and runtime config: `GEMINI_API_KEY`, `LLM_MODEL`, `CAPSOLVER_API_KEY` (optional).
142
+
143
+ ### Package configs (shipped with ApplyAgent)
144
+ - `config/employers.yaml` - Workday employer registry (48 preconfigured)
145
+ - `config/sites.yaml` - Direct career sites (30+), blocked sites, base URLs, manual ATS domains
146
+ - `config/searches.example.yaml` - Example search configuration
147
+
148
+ ---
149
+
150
+ ## How Stages Work
151
+
152
+ ### Discover
153
+ Queries Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs via JobSpy. Scrapes 48 Workday employer portals (configurable in `employers.yaml`). Hits 30 direct career sites with custom extractors. Deduplicates by URL.
154
+
155
+ ### Enrich
156
+ Visits each job URL and extracts the full description. 3-tier cascade: JSON-LD structured data, then CSS selector patterns, then AI-powered extraction for unknown layouts.
157
+
158
+ ### Score
159
+ AI scores every job 1-10 against your profile. 9-10 = strong match, 7-8 = good, 5-6 = moderate, 1-4 = skip. Only jobs above your threshold proceed to tailoring.
160
+
161
+ ### Tailor
162
+ Generates a custom resume per job: reorders experience, emphasizes relevant skills, incorporates keywords from the job description. Your `resume_facts` (companies, projects, metrics) are preserved exactly. The AI reorganizes but never fabricates.
163
+
164
+ ### Cover Letter
165
+ Writes a targeted cover letter per job referencing the specific company, role, and how your experience maps to their requirements.
166
+
167
+ ### Auto-Apply
168
+ Claude Code launches a Chrome instance, navigates to each application page, detects the form type, fills personal information and work history, uploads the tailored resume and cover letter, answers screening questions with AI, and submits. A live dashboard shows progress in real-time.
169
+
170
+ The Playwright MCP server is configured automatically at runtime per worker. No manual MCP setup needed.
171
+
172
+ ```bash
173
+ # Utility modes (no Chrome/Claude needed)
174
+ ApplyAgent apply --mark-applied URL # manually mark a job as applied
175
+ ApplyAgent apply --mark-failed URL # manually mark a job as failed
176
+ ApplyAgent apply --reset-failed # reset all failed jobs for retry
177
+ ApplyAgent apply --gen --url URL # generate prompt file for manual debugging
178
+ ```
179
+
180
+ ---
181
+
182
+ ## CLI Reference
183
+
184
+ ```
185
+ ApplyAgent init # First-time setup wizard
186
+ ApplyAgent doctor # Verify setup, diagnose missing requirements
187
+ ApplyAgent run [stages...] # Run pipeline stages (or 'all')
188
+ ApplyAgent run --workers 4 # Parallel discovery/enrichment
189
+ ApplyAgent run --stream # Concurrent stages (streaming mode)
190
+ ApplyAgent run --min-score 8 # Override score threshold
191
+ ApplyAgent run --dry-run # Preview without executing
192
+ ApplyAgent run --validation lenient # Relax validation (recommended for Gemini free tier)
193
+ ApplyAgent run --validation strict # Strictest validation (retries on any banned word)
194
+ ApplyAgent apply # Launch auto-apply
195
+ ApplyAgent apply --workers 3 # Parallel browser workers
196
+ ApplyAgent apply --dry-run # Fill forms without submitting
197
+ ApplyAgent apply --continuous # Run forever, polling for new jobs
198
+ ApplyAgent apply --headless # Headless browser mode
199
+ ApplyAgent apply --url URL # Apply to a specific job
200
+ ApplyAgent status # Pipeline statistics
201
+ ApplyAgent dashboard # Open HTML results dashboard
202
+ ```
@@ -0,0 +1,171 @@
1
+ <!-- logo here -->
2
+
3
+ # ApplyAgent
4
+
5
+ **Applied to 1,000 jobs in 2 days. Fully autonomous. Open source.**
6
+
7
+ [![PyPI version](https://img.shields.io/pypi/v/ApplyAgent?color=blue)](https://pypi.org/project/ApplyAgent/)
8
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
9
+
10
+
11
+ ---
12
+
13
+ ## What It Does
14
+
15
+ ApplyAgent is a 6-stage autonomous job application pipeline. It discovers jobs across 5+ boards, scores them against your resume with AI, tailors your resume per job, writes cover letters, and **submits applications for you**. It navigates forms, uploads documents, answers screening questions, all hands-free.
16
+
17
+ Three commands. That's it.
18
+
19
+ ```bash
20
+ pip install ApplyAgent
21
+ pip install --no-deps python-jobspy && pip install pydantic tls-client requests markdownify regex
22
+ ApplyAgent init # one-time setup: resume, profile, preferences, API keys
23
+ ApplyAgent doctor # verify your setup — shows what's installed and what's missing
24
+ ApplyAgent run # discover > enrich > score > tailor > cover letters
25
+ ApplyAgent run -w 4 # same but parallel (4 threads for discovery/enrichment)
26
+ ApplyAgent apply # autonomous browser-driven submission
27
+ ApplyAgent apply -w 3 # parallel apply (3 Chrome instances)
28
+ ApplyAgent apply --dry-run # fill forms without submitting
29
+ ```
30
+
31
+ > **Why two install commands?** `python-jobspy` pins an exact numpy version in its metadata that conflicts with pip's resolver, but works fine at runtime with any modern numpy. The `--no-deps` flag bypasses the resolver; the second command installs jobspy's actual runtime dependencies. Everything except `python-jobspy` installs normally.
32
+
33
+ ---
34
+
35
+ ## Two Paths
36
+
37
+ ### Full Pipeline (recommended)
38
+ **Requires:** Python 3.11+, Node.js (for npx), Gemini API key (free), Claude Code CLI, Chrome
39
+
40
+ Runs all 6 stages, from job discovery to autonomous application submission. This is the full power of ApplyAgent.
41
+
42
+ ### Discovery + Tailoring Only
43
+ **Requires:** Python 3.11+, Gemini API key (free)
44
+
45
+ Runs stages 1-5: discovers jobs, scores them, tailors your resume, generates cover letters. You submit applications manually with the AI-prepared materials.
46
+
47
+ ---
48
+
49
+ ## The Pipeline
50
+
51
+ | Stage | What Happens |
52
+ |-------|-------------|
53
+ | **1. Discover** | Scrapes 5 job boards (Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs) + 48 Workday employer portals + 30 direct career sites |
54
+ | **2. Enrich** | Fetches full job descriptions via JSON-LD, CSS selectors, or AI-powered extraction |
55
+ | **3. Score** | AI rates every job 1-10 based on your resume and preferences. Only high-fit jobs proceed |
56
+ | **4. Tailor** | AI rewrites your resume per job: reorganizes, emphasizes relevant experience, adds keywords. Never fabricates |
57
+ | **5. Cover Letter** | AI generates a targeted cover letter per job |
58
+ | **6. Auto-Apply** | Claude Code navigates application forms, fills fields, uploads documents, answers questions, and submits |
59
+
60
+ Each stage is independent. Run them all or pick what you need.
61
+
62
+ ---
63
+
64
+ ## ApplyAgent vs The Alternatives
65
+
66
+ | Feature | ApplyAgent | AIHawk | Manual |
67
+ |---------|-----------|--------|--------|
68
+ | Job discovery | 5 boards + Workday + direct sites | LinkedIn only | One board at a time |
69
+ | AI scoring | 1-10 fit score per job | Basic filtering | Your gut feeling |
70
+ | Resume tailoring | Per-job AI rewrite | Template-based | Hours per application |
71
+ | Auto-apply | Full form navigation + submission | LinkedIn Easy Apply only | Click, type, repeat |
72
+ | Supported sites | Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs, 46 Workday portals, 28 direct sites | LinkedIn | Whatever you open |
73
+ | License | AGPL-3.0 | MIT | N/A |
74
+
75
+ ---
76
+
77
+ ## Requirements
78
+
79
+ | Component | Required For | Details |
80
+ |-----------|-------------|---------|
81
+ | Python 3.11+ | Everything | Core runtime |
82
+ | Node.js 18+ | Auto-apply | Needed for `npx` to run Playwright MCP server |
83
+ | Gemini API key | Scoring, tailoring, cover letters | Free tier (15 RPM / 1M tokens/day) is enough |
84
+ | Chrome/Chromium | Auto-apply | Auto-detected on most systems |
85
+ | Claude Code CLI | Auto-apply | Install from [claude.ai/code](https://claude.ai/code) |
86
+
87
+ **Gemini API key is free.** Get one at [aistudio.google.com](https://aistudio.google.com). OpenAI and local models (Ollama/llama.cpp) are also supported.
88
+
89
+ ### Optional
90
+
91
+ | Component | What It Does |
92
+ |-----------|-------------|
93
+ | CapSolver API key | Solves CAPTCHAs during auto-apply (hCaptcha, reCAPTCHA, Turnstile, FunCaptcha). Without it, CAPTCHA-blocked applications just fail gracefully |
94
+
95
+ > **Note:** python-jobspy is installed separately with `--no-deps` because it pins an exact numpy version in its metadata that conflicts with pip's resolver. It works fine with modern numpy at runtime.
96
+
97
+ ---
98
+
99
+ ## Configuration
100
+
101
+ All generated by `ApplyAgent init`:
102
+
103
+ ### `profile.json`
104
+ Your personal data in one structured file: contact info, work authorization, compensation, experience, skills, resume facts (preserved during tailoring), and EEO defaults. Powers scoring, tailoring, and form auto-fill.
105
+
106
+ ### `searches.yaml`
107
+ Job search queries, target titles, locations, boards. Run multiple searches with different parameters.
108
+
109
+ ### `.env`
110
+ API keys and runtime config: `GEMINI_API_KEY`, `LLM_MODEL`, `CAPSOLVER_API_KEY` (optional).
111
+
112
+ ### Package configs (shipped with ApplyAgent)
113
+ - `config/employers.yaml` - Workday employer registry (48 preconfigured)
114
+ - `config/sites.yaml` - Direct career sites (30+), blocked sites, base URLs, manual ATS domains
115
+ - `config/searches.example.yaml` - Example search configuration
116
+
117
+ ---
118
+
119
+ ## How Stages Work
120
+
121
+ ### Discover
122
+ Queries Indeed, LinkedIn, Glassdoor, ZipRecruiter, Google Jobs via JobSpy. Scrapes 48 Workday employer portals (configurable in `employers.yaml`). Hits 30 direct career sites with custom extractors. Deduplicates by URL.
123
+
124
+ ### Enrich
125
+ Visits each job URL and extracts the full description. 3-tier cascade: JSON-LD structured data, then CSS selector patterns, then AI-powered extraction for unknown layouts.
126
+
127
+ ### Score
128
+ AI scores every job 1-10 against your profile. 9-10 = strong match, 7-8 = good, 5-6 = moderate, 1-4 = skip. Only jobs above your threshold proceed to tailoring.
129
+
130
+ ### Tailor
131
+ Generates a custom resume per job: reorders experience, emphasizes relevant skills, incorporates keywords from the job description. Your `resume_facts` (companies, projects, metrics) are preserved exactly. The AI reorganizes but never fabricates.
132
+
133
+ ### Cover Letter
134
+ Writes a targeted cover letter per job referencing the specific company, role, and how your experience maps to their requirements.
135
+
136
+ ### Auto-Apply
137
+ Claude Code launches a Chrome instance, navigates to each application page, detects the form type, fills personal information and work history, uploads the tailored resume and cover letter, answers screening questions with AI, and submits. A live dashboard shows progress in real-time.
138
+
139
+ The Playwright MCP server is configured automatically at runtime per worker. No manual MCP setup needed.
140
+
141
+ ```bash
142
+ # Utility modes (no Chrome/Claude needed)
143
+ ApplyAgent apply --mark-applied URL # manually mark a job as applied
144
+ ApplyAgent apply --mark-failed URL # manually mark a job as failed
145
+ ApplyAgent apply --reset-failed # reset all failed jobs for retry
146
+ ApplyAgent apply --gen --url URL # generate prompt file for manual debugging
147
+ ```
148
+
149
+ ---
150
+
151
+ ## CLI Reference
152
+
153
+ ```
154
+ ApplyAgent init # First-time setup wizard
155
+ ApplyAgent doctor # Verify setup, diagnose missing requirements
156
+ ApplyAgent run [stages...] # Run pipeline stages (or 'all')
157
+ ApplyAgent run --workers 4 # Parallel discovery/enrichment
158
+ ApplyAgent run --stream # Concurrent stages (streaming mode)
159
+ ApplyAgent run --min-score 8 # Override score threshold
160
+ ApplyAgent run --dry-run # Preview without executing
161
+ ApplyAgent run --validation lenient # Relax validation (recommended for Gemini free tier)
162
+ ApplyAgent run --validation strict # Strictest validation (retries on any banned word)
163
+ ApplyAgent apply # Launch auto-apply
164
+ ApplyAgent apply --workers 3 # Parallel browser workers
165
+ ApplyAgent apply --dry-run # Fill forms without submitting
166
+ ApplyAgent apply --continuous # Run forever, polling for new jobs
167
+ ApplyAgent apply --headless # Headless browser mode
168
+ ApplyAgent apply --url URL # Apply to a specific job
169
+ ApplyAgent status # Pipeline statistics
170
+ ApplyAgent dashboard # Open HTML results dashboard
171
+ ```
@@ -0,0 +1,61 @@
1
+ {
2
+ "personal": {
3
+ "full_name": "YOUR_LEGAL_NAME",
4
+ "preferred_name": "YOUR_PREFERRED_NAME",
5
+ "email": "your.email@example.com",
6
+ "password": "YOUR_JOB_SITE_PASSWORD",
7
+ "phone": "555-123-4567",
8
+ "address": "123 Main St",
9
+ "city": "Your City",
10
+ "province_state": "Your State/Province",
11
+ "country": "Your Country",
12
+ "postal_code": "A1B 2C3",
13
+ "linkedin_url": "https://www.linkedin.com/in/yourprofile",
14
+ "github_url": "https://github.com/yourusername",
15
+ "portfolio_url": "",
16
+ "website_url": ""
17
+ },
18
+ "work_authorization": {
19
+ "legally_authorized_to_work": "Yes",
20
+ "require_sponsorship": "No",
21
+ "work_permit_type": ""
22
+ },
23
+ "availability": {
24
+ "earliest_start_date": "Immediately",
25
+ "available_for_full_time": "Yes",
26
+ "available_for_contract": "No"
27
+ },
28
+ "compensation": {
29
+ "salary_expectation": "85000",
30
+ "salary_currency": "USD",
31
+ "salary_range_min": "80000",
32
+ "salary_range_max": "100000",
33
+ "currency_conversion_note": ""
34
+ },
35
+ "experience": {
36
+ "years_of_experience_total": "3",
37
+ "education_level": "Bachelor's Degree",
38
+ "current_job_title": "",
39
+ "current_company": "",
40
+ "target_role": "software engineer"
41
+ },
42
+ "skills_boundary": {
43
+ "languages": ["Python", "SQL", "JavaScript"],
44
+ "frameworks": ["FastAPI", "Flask", "React"],
45
+ "devops": ["Docker", "AWS", "CI/CD"],
46
+ "databases": ["PostgreSQL", "MongoDB"],
47
+ "tools": ["Git", "Linux"]
48
+ },
49
+ "resume_facts": {
50
+ "preserved_companies": ["Company A", "Company B"],
51
+ "preserved_projects": ["Project X", "Project Y"],
52
+ "preserved_school": "Your University",
53
+ "real_metrics": ["50% improvement", "10x faster"]
54
+ },
55
+ "eeo_voluntary": {
56
+ "gender": "Decline to self-identify",
57
+ "race_ethnicity": "Decline to self-identify",
58
+ "veteran_status": "I am not a protected veteran",
59
+ "disability_status": "I do not wish to answer"
60
+ }
61
+ }
@@ -0,0 +1,54 @@
1
+ [project]
2
+ name = "applyagent"
3
+ version = "0.3.0"
4
+ description = "AI-powered end-to-end job application pipeline"
5
+ readme = "README.md"
6
+ license = "AGPL-3.0-only"
7
+ requires-python = ">=3.11"
8
+ authors = [{name = "Pickle-Pixel"}]
9
+ keywords = ["job-search", "automation", "ai", "resume", "apply", "job-application"]
10
+ classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "Environment :: Console",
13
+ "License :: OSI Approved :: GNU Affero General Public License v3",
14
+ "Programming Language :: Python :: 3.11",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Programming Language :: Python :: 3.13",
17
+ "Topic :: Office/Business",
18
+ ]
19
+
20
+ dependencies = [
21
+ "typer>=0.9.0",
22
+ "rich>=13.0",
23
+ "httpx>=0.24",
24
+ "beautifulsoup4>=4.12",
25
+ "playwright>=1.40",
26
+ "python-dotenv>=1.0",
27
+ "pyyaml>=6.0",
28
+ "pandas>=2.0",
29
+ ]
30
+
31
+ [project.optional-dependencies]
32
+ dev = ["pytest>=7.0", "ruff>=0.1"]
33
+
34
+ [project.scripts]
35
+ applyagent = "applyagent.cli:app"
36
+
37
+ [project.urls]
38
+ Homepage = "https://github.com/Pickle-Pixel/ApplyAgent"
39
+ Repository = "https://github.com/Pickle-Pixel/ApplyAgent"
40
+ Issues = "https://github.com/Pickle-Pixel/ApplyAgent/issues"
41
+
42
+ [build-system]
43
+ requires = ["hatchling"]
44
+ build-backend = "hatchling.build"
45
+
46
+ [tool.hatch.build.targets.wheel]
47
+ packages = ["src/applyagent"]
48
+
49
+ [tool.hatch.build]
50
+ artifacts = ["src/applyagent/config/*.yaml"]
51
+
52
+ [tool.ruff]
53
+ target-version = "py311"
54
+ line-length = 120
@@ -0,0 +1,3 @@
1
+ """ApplyAgent — AI-powered end-to-end job application pipeline."""
2
+
3
+ __version__ = "0.3.0"
@@ -0,0 +1,5 @@
1
+ """Enable `python -m applyagent`."""
2
+
3
+ from applyagent.cli import app
4
+
5
+ app()
@@ -0,0 +1 @@
1
+ """Apply pipeline: Chrome management, prompt building, orchestration, and dashboard."""