jobhunter-cli 0.0.post1.dev85__py3-none-any.whl

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.
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.5
2
+ Name: jobhunter-cli
3
+ Version: 0.0.post1.dev85
4
+ Summary: An AI-powered, zero-database Python CLI that automates job hunting. It scrapes ATS boards, evaluates candidate-job fit using LLMs against your CV, and dispatches real-time Telegram alerts.
5
+ Author-email: ziad-aboughaleb <ziadaboughaleb@gmail.com>
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.14
8
+ Requires-Dist: ddgs>=9.16.1
9
+ Requires-Dist: filelock>=4.2.4
10
+ Requires-Dist: httpx>=0.28.1
11
+ Requires-Dist: openai>=3.41.0
12
+ Requires-Dist: pydantic-settings>=2.16.1
13
+ Requires-Dist: pydantic>=2.14.1
14
+ Requires-Dist: rich>=15.0.0
15
+ Requires-Dist: typer>=0.27.3
16
+ Description-Content-Type: text/markdown
17
+
18
+ # JobHunter 🎯
19
+
20
+ > **AI-Powered, Highly Concurrent, Zero-Database Automated Job Hunting Pipeline**
21
+
22
+ `JobHunter` is a robust, production-grade Python CLI application designed to fully automate the job search and filtering lifecycle. It continuously scrapes Applicant Tracking Systems (ATS) and job boards, filters opportunities against precise regex and keyword criteria, evaluates candidate-job fit using Large Language Models (LLMs) with strict JSON schemas, and dispatches rich real-time alerts directly to Telegram.
23
+
24
+ ---
25
+
26
+ ## 🚀 Key Features
27
+
28
+ - **High Concurrency & Rate Limiting**: Powered by `concurrent.futures` with dynamic worker bounds, exponential backoff retries on transient network errors, and intelligent request pacing.
29
+ - **ATS WAF & API Bypass**: Bypasses heavy frontend anti-bot walls by querying official public underlying JSON/XML board APIs directly (Greenhouse, Lever, Personio, Workable, Recruitee, Ashby, plus aggregators like Remotive, RemoteOK, and Arbeitnow).
30
+ - **Multi-Stage Filtering**: Filters jobs through regex word-boundary matching for titles, excluded companies, location rules, remote requirements, posting age, and minimum tech stack keyword hits (`stack_hits`).
31
+ - **AI-Driven Evaluation**: Evaluates shortlisted candidates against your exact CV (`config/cv.md`) and preferences (`config/preferences.md`) using OpenAI-compatible LLMs, enforcing hard gates, scoring rubrics, and anti-hallucination guardrails.
32
+ - **Telegram Rich Alerts**: Dispatches beautifully formatted HTML notifications featuring VIP priority badges, score color-coding, AI reasoning, score breakdowns, professional pitches, and direct links.
33
+ - **Autonomous Maintenance Tools**: Includes built-in CLI commands to automatically discover new company career boards via DuckDuckGo and prune dead or broken board URLs.
34
+ - **Zero-Database State Management**: Uses atomic file writes with file locking (`filelock`) and a rolling 90-day retention cache (`seen.json`) to prevent duplicate processing without requiring an external database.
35
+
36
+ ---
37
+
38
+ ## 🛠️ Quickstart Guide
39
+
40
+ ### Prerequisites
41
+
42
+ - **Python >= 3.14**
43
+ - **uv** (recommended Python package and project manager)
44
+
45
+ ### 1. Install
46
+
47
+ Install the CLI globally via PyPI using `uv` (recommended) or `pip`:
48
+
49
+ ```bash
50
+ uv tool install jobhunter-cli
51
+ # OR
52
+ pip install jobhunter-cli
53
+ ```
54
+
55
+ ### 2. Initialize Your Workspace
56
+
57
+ Create a dedicated folder for your job search and run the `init` command to automatically download the configuration templates:
58
+
59
+ ```bash
60
+ mkdir my-job-search && cd my-job-search
61
+ jobhunter init
62
+ ```
63
+
64
+ ### 3. Configure
65
+
66
+ The `init` command creates a `.env` file and a `config/` directory.
67
+
68
+ 1. Open `.env` and add your API keys:
69
+ ```env
70
+ TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
71
+ TELEGRAM_CHAT_ID=your_telegram_chat_id_here
72
+ LLM_API_KEY=your_openai_or_compatible_api_key_here
73
+ ```
74
+ 2. Edit the templates in the `config/` folder (`config.json`, `cv.md`, `preferences.md`) with your specific details.
75
+
76
+ > **💡 Note on GitHub Actions:** `JobHunter` automatically falls back to environment variables (`CONFIG_JSON`, `CV`, `PREFERENCES`) if physical files do not exist on disk. This allows deploying via GitHub Actions on public repositories using GitHub Secrets.
77
+
78
+ ### 4. Run the Pipeline
79
+
80
+ Execute the full pipeline (Fetch -> Evaluate -> Send) from within your workspace directory:
81
+
82
+ ```bash
83
+ jobhunter run
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 🔄 The 5-Stage Pipeline
89
+
90
+ ```
91
+ [Discover / Configure] ──> [Fetch & Filter] ──> [AI Evaluate] ──> [Send to Telegram] ──> [State Purge & Seen Sync]
92
+ ```
93
+
94
+ 1. **Discover / Configure**: Resolve targets from `config.json` or discover new company boards using `jobhunter discover`.
95
+ 2. **Fetch**: Scrape raw job postings concurrently across configured ATS boards and aggregators.
96
+ 3. **Filter & Prune**: Discard duplicates, previously seen jobs, and postings failing title, location, age, or stack keyword criteria. Rank candidates by VIP priority and stack keyword hits.
97
+ 4. **Evaluate**: Submit shortlisted candidates to the LLM. Enforce hard gates and score against your CV and preferences.
98
+ 5. **Send & Purge**: Dispatch passing job alerts to Telegram. Log processed jobs to `seen.json` with a 90-day retention window and purge completed items from active state files.
99
+
100
+ ---
101
+
102
+ ## 📖 Documentation Deep Dives
103
+
104
+ For comprehensive technical documentation, consult the downloaded `docs/` folder or view them on GitHub:
105
+
106
+ - **[Architecture Guide](docs/architecture.md)**: Detailed breakdown of the decoupled pipeline modules, concurrency model, and zero-database state lifecycle.
107
+ - **[Configuration & Settings](docs/configuration.md)**: Comprehensive guide to `config.json`, Pydantic settings, environment variables, and prompt engineering setup (`cv.md` / `preferences.md`).
108
+
109
+ ---
110
+
111
+ ## 💻 CLI Commands Reference
112
+
113
+ | Command | Description | Key Options |
114
+ | :------------------- | :---------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
115
+ | `jobhunter init` | Scaffolds a new workspace by downloading templates and docs | `[TARGET_DIR]` (Target directory to initialize) |
116
+ | `jobhunter run` | Runs the full pipeline (fetch -> evaluate -> send) | `-s, --source` (Specific ATS/aggregator to fetch from)<br>`--no-aggregators` (Skip aggregators)<br>`--ignore-seen` (Ignore seen cache)<br>`-l, --limit` (Override max candidates)<br>`--dry-run` (Alert without cache updates) |
117
+ | `jobhunter fetch` | Scrapes and filters jobs from configured boards | `-s, --source`, `--no-aggregators`, `--ignore-seen`, `-l, --limit` |
118
+ | `jobhunter evaluate` | Scores and evaluates pending candidates using AI | `-j, --job` (Evaluate specific job UID), `-l, --limit` |
119
+ | `jobhunter send` | Dispatches passing job evaluations to Telegram | `--dry-run` |
120
+ | `jobhunter discover` | Discovers new company ATS slugs via DuckDuckGo | `-w, --write` (Persist to config), `-s, --source`, `-t, --titles` (Comma-separated titles) |
121
+ | `jobhunter prune` | Validates and prunes broken company slugs from config | `-w, --write`, `-s, --source` |
122
+ | `jobhunter prompt` | Prints the compiled AI evaluation system prompt | None |
123
+
124
+ ---
125
+
126
+ ## 🏗️ Building from Source (Development)
127
+
128
+ If you want to contribute or modify the source code directly:
129
+
130
+ ```bash
131
+ git clone https://github.com/ziad-aboughaleb/job-hunter.git
132
+ cd job-hunter
133
+ uv sync
134
+ uv run jobhunter init
135
+ uv run jobhunter run
136
+ ```
@@ -0,0 +1,37 @@
1
+ jobhunter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ jobhunter/__main__.py,sha256=JTVBq9z8Xq1Y7Js5BcO8UYV49MiE0DV5U8H3k0Ee6Ek,60
3
+ jobhunter/_version.py,sha256=oOrsNgu8SNhTwXCXp7_B7iUH0tYA6yDbTcyvuxlPv2o,545
4
+ jobhunter/main.py,sha256=YQFETa2Qh8tT5cjHqd0DQQ7uTlYRV28cdZmW0-gZhww,4004
5
+ jobhunter/models.py,sha256=mMQfWA11mmRaxpLurQD8pPDsdDYpFDfgw0H-7mizQg4,2748
6
+ jobhunter/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ jobhunter/core/filters.py,sha256=WzRCuU2l5WDCAGYzJVqOll8eto3VL_s3zkGEU90J3HU,3969
8
+ jobhunter/core/http.py,sha256=HA7hFI8j3shad2mzcgttC1dP3FKfZszW4MyM5fQyPsI,1990
9
+ jobhunter/core/logger.py,sha256=v7zb5wYZuaBgRgMYWZKebS2qhdTLugZoRppFCzoc0QQ,1763
10
+ jobhunter/core/paths.py,sha256=xKSIqX7T1tkg4VKIfylRDLBX3bbOGEWFoHjoMYMu6Ww,3521
11
+ jobhunter/core/settings.py,sha256=4fo9exvE-KIRNljp-9hR-f3efkJZ3atJe8zsd606q4I,3687
12
+ jobhunter/core/textutil.py,sha256=S2llpWhs7JEygpMG4DxEj9bTlMehNMyhc-VdAjaf-MM,877
13
+ jobhunter/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ jobhunter/pipeline/evaluate.py,sha256=ke4lZwjrvPnpB7npXW1EjHqGeOz27raCC32R6QVmtQI,11821
15
+ jobhunter/pipeline/fetch.py,sha256=1leQ2SoSFMIj-mgVx95uEBN0w17tHSdHYs5s4GtpDNg,9052
16
+ jobhunter/pipeline/send.py,sha256=0TFFIj3SWJV-QUStvLFENj-csqzlvvAY5LcIF2-nuOs,7150
17
+ jobhunter/sources/__init__.py,sha256=p6fx01j-YXf0-JNCk9CXxs2VC7ygHHv7dBXg_06lOyE,489
18
+ jobhunter/sources/arbeitnow.py,sha256=COEkVfi5UcBF3lC9k7LEQKkeMfiquvfDY7ITh1QCx4U,2696
19
+ jobhunter/sources/ashby.py,sha256=MxJ3gtkflfXbPI4fcYacZeqTxYoY0sgGdMm-o-04A70,2765
20
+ jobhunter/sources/base.py,sha256=pbA8a61BBQp_Uil9gZMcQrPeC1zGJZmivWlqMI_NTp0,3374
21
+ jobhunter/sources/greenhouse.py,sha256=91Lkm26081fEAwAP8rh31SIPYA8rfH4NZPvlqeWSkWU,2367
22
+ jobhunter/sources/lever.py,sha256=1WmktirnDH2F1TIQB3HeT5w_Sjj5JxwUc0Wr9FsZrIM,3027
23
+ jobhunter/sources/personio.py,sha256=jLw_-CvryzD83jymOIPwJa0woWkcuKLUzur0eLm5-wg,3901
24
+ jobhunter/sources/recruitee.py,sha256=SF5gPQphCLHx96nbqxr8cp7L4jMoCGVmhDNjR5cyHeo,2710
25
+ jobhunter/sources/remoteok.py,sha256=T2cjW7Qh2gzFZbtGhlDCQgeJNVBo-wHejrzjQsIGye0,2295
26
+ jobhunter/sources/remotive.py,sha256=WhVnvKMu1IEmfJmwRhpEHhGPE5smptlxlAYZB3mTRFw,2199
27
+ jobhunter/sources/workable.py,sha256=l-HqQVaq_ADdqwmegHpeIFi7HvT3DTJxrKsrxBmMZ_s,3383
28
+ jobhunter/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ jobhunter/tools/discover.py,sha256=q5j4ewoq1aZULczb88YKvgNKOf9nVf3ySpyCLv0tklk,8745
30
+ jobhunter/tools/init.py,sha256=qm_5o9yUR3n_XQQOR4wQGIaxx4SCO1A9iYY3Ig_wsDM,3029
31
+ jobhunter/tools/prompt.py,sha256=AEV6o_Nz8RY_XAce8_NHcYjyQXXZLOO-wLLemQIBhms,4130
32
+ jobhunter/tools/prune.py,sha256=3b7om12OtkSlIq2Olgzc8RI8Ha-UphKgLu6oqfaX910,4638
33
+ jobhunter_cli-0.0.post1.dev85.dist-info/METADATA,sha256=EwaM7twq0PVT1lRCh0Tytt_tzYiSVP8KdX3p8wwcztI,8833
34
+ jobhunter_cli-0.0.post1.dev85.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
35
+ jobhunter_cli-0.0.post1.dev85.dist-info/entry_points.txt,sha256=_abjRAdzIUq9VzTzlGmvIUUKX5ZCa1Pb56a7AtI9x3M,50
36
+ jobhunter_cli-0.0.post1.dev85.dist-info/licenses/LICENSE,sha256=kRM_HHYVVKEvbHBECKQu4fApgwDB3yEVNuOvXIHvwcE,1072
37
+ jobhunter_cli-0.0.post1.dev85.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ jobhunter = jobhunter.main:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ziad Aboughaleb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.