katze 0.1.1__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.
katze-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,259 @@
1
+ Metadata-Version: 2.4
2
+ Name: katze
3
+ Version: 0.1.1
4
+ Summary: JobKatze Auto-Apply CLI
5
+ Author: Monnawat Tongkaw
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/ModemT/jobkatze
8
+ Project-URL: Repository, https://github.com/ModemT/jobkatze
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: typer>=0.12.0
12
+ Requires-Dist: rich>=13.0.0
13
+ Requires-Dist: httpx>=0.27.0
14
+ Requires-Dist: playwright>=1.40.0
15
+ Requires-Dist: pypdf>=4.0.0
16
+ Requires-Dist: pyyaml>=6.0.0
17
+ Requires-Dist: prompt_toolkit>=3.0.40
18
+ Requires-Dist: typst>=0.11.0
19
+
20
+ # `katze` — JobKatze Auto-Apply CLI
21
+
22
+ `katze` pulls your curated (`saved`) or matched (`match`) jobs from JobKatze, generates tailored English cover letters compiled to PDF via Typst and `agy`, opens and pre-fills ATS application forms in a persistent Chrome window, and harvests mandatory application questions across companies.
23
+
24
+ ---
25
+
26
+ ## Prerequisites
27
+
28
+ 1. **Python 3.11+**
29
+ 2. **Google Chrome** (or Chromium) installed locally
30
+ 3. **Typst** for compiling cover letters to PDF:
31
+ ```bash
32
+ brew install typst
33
+ ```
34
+ 4. **Antigravity CLI (`agy`)** on `PATH` for local agent cover letter generation
35
+
36
+ ---
37
+
38
+ ## Installation
39
+
40
+ ### Recommended: Global Tool via `uv`
41
+
42
+ Install `katze` globally from anywhere on your machine in editable mode:
43
+
44
+ ```bash
45
+ uv tool install --editable /path/to/jobkatze/cli
46
+ ```
47
+
48
+ Whenever you pull changes in the repository, the global `katze` executable automatically reflects code changes. To update dependencies:
49
+
50
+ ```bash
51
+ uv tool install --editable /path/to/jobkatze/cli --reinstall
52
+ ```
53
+
54
+ ### Local Virtual Environment
55
+
56
+ Or install inside a virtual environment:
57
+
58
+ ```bash
59
+ cd cli
60
+ python3 -m venv .venv
61
+ .venv/bin/pip install -e .
62
+ .venv/bin/playwright install chromium
63
+ ```
64
+
65
+ Or using the repository's `api` virtual environment:
66
+
67
+ ```bash
68
+ api/.venv/bin/pip install -e cli
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Quickstart
74
+
75
+ ### 1. Initialize configuration and resume
76
+
77
+ ```bash
78
+ katze init /path/to/your/resume.pdf
79
+ ```
80
+
81
+ This creates `~/.config/jobkatze/` (override with `JOBKATZE_CONFIG_DIR`) containing:
82
+ - `resume.pdf` — copy of your resume uploaded to ATS file inputs
83
+ - `profile.yaml` — candidate answers used to auto-fill application forms
84
+ - `letter.typ` — Typst template for compiling cover letter PDFs
85
+
86
+ ### 2. Edit your pre-filled form answers (`katze config`) or update your resume (`katze resume`)
87
+
88
+ Modify your profile interactively in the terminal UI, set individual fields directly, or open in `$EDITOR`:
89
+
90
+ ```bash
91
+ # Interactive terminal UI (select field by # or name, 'a' for all, 'e' for $EDITOR)
92
+ katze config
93
+
94
+ # Set fields directly from the command line
95
+ katze config --set city=Munich --set salary_expectation_eur=95000
96
+
97
+ # Show current configuration table
98
+ katze config --show
99
+ ```
100
+
101
+ Update your resume at any time (copies into `~/.config/jobkatze/resume.pdf` and syncs to backend):
102
+
103
+ ```bash
104
+ # Inspect active resume path and file status
105
+ katze resume
106
+
107
+ # Choose a PDF via native macOS Finder dialog
108
+ katze resume --finder
109
+
110
+ # Copy a specific PDF into ~/.config/jobkatze/resume.pdf and sync to backend
111
+ katze resume /path/to/new_resume.pdf
112
+ ```
113
+
114
+ ### 3. Interactive Shell & Command Guides (`katze`)
115
+
116
+ Launch the full interactive shell with in-place screen switching, `↑`/`↓` arrow keys, and command suggestions:
117
+
118
+ ```bash
119
+ # Launch interactive shell
120
+ katze
121
+
122
+ # View quick reference guide anytime
123
+ katze help
124
+
125
+ # View dedicated guide for a specific command
126
+ katze help resume
127
+ katze help apply
128
+ katze help login
129
+ ```
130
+
131
+ Inside the interactive shell:
132
+ - Type `/` to open the command suggestion menu.
133
+ - Use `↑`/`↓` arrow keys or `Tab` to navigate options and press `Enter` to select.
134
+ - Each command has its own screen with step-by-step guidance and actions.
135
+ - Screens switch in place without filling up terminal scrollback. Press `Esc` or `/back` to return to the main menu, and `q` or `/quit` to exit.
136
+
137
+ ### 4. Log in to JobKatze
138
+
139
+ Authenticate seamlessly through your web browser or command line:
140
+
141
+ ```bash
142
+ # Browser login: opens JobKatze web app to authorize in 1 click
143
+ katze login
144
+
145
+ # Headless login with email and password
146
+ katze login --email you@example.com --password secret
147
+
148
+ # Local devserver (http://localhost:7071/api)
149
+ katze login --local
150
+ ```
151
+
152
+ When running `katze login`, your default browser opens the authorization page. If you are already logged in to JobKatze in your browser, click **Authorize katze** to connect immediately without retyping credentials.
153
+
154
+ ---
155
+
156
+ ## Commands
157
+
158
+ ### `katze apply` — Open and pre-fill application tabs in Chrome
159
+
160
+ ```bash
161
+ # Apply to jobs you bookmarked ("Saved") on JobKatze Web
162
+ katze apply --from saved --limit 5
163
+
164
+ # Pull top resume-matched jobs from direct ATS boards (Greenhouse, Personio, Ashby, Lever, Recruitee, Workable)
165
+ katze apply --from match --limit 5
166
+
167
+ # Filter by specific ATS platform(s)
168
+ katze apply --from match --source greenhouse,personio,ashby --limit 5
169
+
170
+ # Apply to a single job ID
171
+ katze apply --job <job_id>
172
+
173
+ # Regenerate cover letters even if cached locally
174
+ katze apply --job <job_id> --regen
175
+
176
+ # Prompt immediately in the terminal for submission confirmation
177
+ katze apply --from saved --prompt
178
+ ```
179
+
180
+ #### How persistent Chrome tabs work
181
+ - `katze apply` launches a detached Chrome process using `~/.config/jobkatze/chrome-profile` on `--remote-debugging-port=9222` and connects via Chrome DevTools Protocol (CDP).
182
+ - When `katze apply` exits, **all Chrome tabs stay open**.
183
+ - Running `katze apply` again attaches to the same Chrome window and appends new tabs next to your existing ones.
184
+ - Each tab title is prefixed with:
185
+ - `[READY] Company - Role` when 0 mandatory fields remain unfilled.
186
+ - `[NEEDS N] Company - Role` when `N` mandatory fields need manual input (outlined in amber `2px solid #e08b00` on the page).
187
+
188
+ ---
189
+
190
+ ### `katze confirm` — Mark submitted tabs as `applied`
191
+
192
+ After reviewing open tabs and clicking **Submit** in Chrome, sync your submission status back to JobKatze Web:
193
+
194
+ ```bash
195
+ # Interactively confirm each pending tab [y/N]
196
+ katze confirm
197
+
198
+ # Mark all pending tabs as applied without prompting
199
+ katze confirm --all
200
+
201
+ # Mark a specific job ID as applied
202
+ katze confirm --job <job_id>
203
+ ```
204
+
205
+ ---
206
+
207
+ ### `katze letter` — Generate a tailored cover letter PDF only
208
+
209
+ ```bash
210
+ # Generate ~/.config/jobkatze/applications/<job_id>/cover_letter.{txt,pdf}
211
+ katze letter <job_id>
212
+
213
+ # Pass a custom angle or instruction to the agent
214
+ katze letter <job_id> --hint "Emphasize distributed systems and Kubernetes experience"
215
+
216
+ # Overwrite an existing letter
217
+ katze letter <job_id> --regen
218
+ ```
219
+
220
+ ---
221
+
222
+ ### `katze questions` — Harvest & analyze mandatory ATS questions
223
+
224
+ Scan application forms over plain HTTP (no browser required) to inspect what mandatory questions companies ask and verify what percentage of fields your `profile.yaml` covers:
225
+
226
+ ```bash
227
+ # Scan mandatory questions across top 25 resume-matched direct-ATS jobs
228
+ katze questions scan --from match --limit 25
229
+
230
+ # Scan mandatory questions across your saved jobs
231
+ katze questions scan --from saved --limit 25
232
+
233
+ # View the cumulative frequency and profile coverage report from ~/.config/jobkatze/questions.jsonl
234
+ katze questions report
235
+ ```
236
+
237
+ ---
238
+
239
+ ## Local Files (`~/.config/jobkatze/`)
240
+
241
+ | Path | Purpose |
242
+ | :--- | :--- |
243
+ | `config.toml` | API base URL and authentication token (`0600` permissions) |
244
+ | `profile.yaml` | Pre-filled candidate answers for text inputs, dropdowns, radio groups, and checkboxes |
245
+ | `resume.pdf` | Candidate CV uploaded to file inputs |
246
+ | `letter.typ` | Typst template compiled for each cover letter |
247
+ | `applications/<job_id>/cover_letter.txt` | Plain-text cover letter generated by `agy` |
248
+ | `applications/<job_id>/cover_letter.pdf` | Compiled PDF cover letter uploaded to ATS forms |
249
+ | `questions.jsonl` | Deduplicated log of observed mandatory ATS form questions |
250
+ | `pending_tabs.json` | Queue of open tabs awaiting `katze confirm` |
251
+ | `chrome-profile/` | Persistent Chromium user data directory |
252
+
253
+ ---
254
+
255
+ ## Running Tests
256
+
257
+ ```bash
258
+ PYTHONPATH=cli api/.venv/bin/pytest cli/tests/
259
+ ```
katze-0.1.1/README.md ADDED
@@ -0,0 +1,240 @@
1
+ # `katze` — JobKatze Auto-Apply CLI
2
+
3
+ `katze` pulls your curated (`saved`) or matched (`match`) jobs from JobKatze, generates tailored English cover letters compiled to PDF via Typst and `agy`, opens and pre-fills ATS application forms in a persistent Chrome window, and harvests mandatory application questions across companies.
4
+
5
+ ---
6
+
7
+ ## Prerequisites
8
+
9
+ 1. **Python 3.11+**
10
+ 2. **Google Chrome** (or Chromium) installed locally
11
+ 3. **Typst** for compiling cover letters to PDF:
12
+ ```bash
13
+ brew install typst
14
+ ```
15
+ 4. **Antigravity CLI (`agy`)** on `PATH` for local agent cover letter generation
16
+
17
+ ---
18
+
19
+ ## Installation
20
+
21
+ ### Recommended: Global Tool via `uv`
22
+
23
+ Install `katze` globally from anywhere on your machine in editable mode:
24
+
25
+ ```bash
26
+ uv tool install --editable /path/to/jobkatze/cli
27
+ ```
28
+
29
+ Whenever you pull changes in the repository, the global `katze` executable automatically reflects code changes. To update dependencies:
30
+
31
+ ```bash
32
+ uv tool install --editable /path/to/jobkatze/cli --reinstall
33
+ ```
34
+
35
+ ### Local Virtual Environment
36
+
37
+ Or install inside a virtual environment:
38
+
39
+ ```bash
40
+ cd cli
41
+ python3 -m venv .venv
42
+ .venv/bin/pip install -e .
43
+ .venv/bin/playwright install chromium
44
+ ```
45
+
46
+ Or using the repository's `api` virtual environment:
47
+
48
+ ```bash
49
+ api/.venv/bin/pip install -e cli
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Quickstart
55
+
56
+ ### 1. Initialize configuration and resume
57
+
58
+ ```bash
59
+ katze init /path/to/your/resume.pdf
60
+ ```
61
+
62
+ This creates `~/.config/jobkatze/` (override with `JOBKATZE_CONFIG_DIR`) containing:
63
+ - `resume.pdf` — copy of your resume uploaded to ATS file inputs
64
+ - `profile.yaml` — candidate answers used to auto-fill application forms
65
+ - `letter.typ` — Typst template for compiling cover letter PDFs
66
+
67
+ ### 2. Edit your pre-filled form answers (`katze config`) or update your resume (`katze resume`)
68
+
69
+ Modify your profile interactively in the terminal UI, set individual fields directly, or open in `$EDITOR`:
70
+
71
+ ```bash
72
+ # Interactive terminal UI (select field by # or name, 'a' for all, 'e' for $EDITOR)
73
+ katze config
74
+
75
+ # Set fields directly from the command line
76
+ katze config --set city=Munich --set salary_expectation_eur=95000
77
+
78
+ # Show current configuration table
79
+ katze config --show
80
+ ```
81
+
82
+ Update your resume at any time (copies into `~/.config/jobkatze/resume.pdf` and syncs to backend):
83
+
84
+ ```bash
85
+ # Inspect active resume path and file status
86
+ katze resume
87
+
88
+ # Choose a PDF via native macOS Finder dialog
89
+ katze resume --finder
90
+
91
+ # Copy a specific PDF into ~/.config/jobkatze/resume.pdf and sync to backend
92
+ katze resume /path/to/new_resume.pdf
93
+ ```
94
+
95
+ ### 3. Interactive Shell & Command Guides (`katze`)
96
+
97
+ Launch the full interactive shell with in-place screen switching, `↑`/`↓` arrow keys, and command suggestions:
98
+
99
+ ```bash
100
+ # Launch interactive shell
101
+ katze
102
+
103
+ # View quick reference guide anytime
104
+ katze help
105
+
106
+ # View dedicated guide for a specific command
107
+ katze help resume
108
+ katze help apply
109
+ katze help login
110
+ ```
111
+
112
+ Inside the interactive shell:
113
+ - Type `/` to open the command suggestion menu.
114
+ - Use `↑`/`↓` arrow keys or `Tab` to navigate options and press `Enter` to select.
115
+ - Each command has its own screen with step-by-step guidance and actions.
116
+ - Screens switch in place without filling up terminal scrollback. Press `Esc` or `/back` to return to the main menu, and `q` or `/quit` to exit.
117
+
118
+ ### 4. Log in to JobKatze
119
+
120
+ Authenticate seamlessly through your web browser or command line:
121
+
122
+ ```bash
123
+ # Browser login: opens JobKatze web app to authorize in 1 click
124
+ katze login
125
+
126
+ # Headless login with email and password
127
+ katze login --email you@example.com --password secret
128
+
129
+ # Local devserver (http://localhost:7071/api)
130
+ katze login --local
131
+ ```
132
+
133
+ When running `katze login`, your default browser opens the authorization page. If you are already logged in to JobKatze in your browser, click **Authorize katze** to connect immediately without retyping credentials.
134
+
135
+ ---
136
+
137
+ ## Commands
138
+
139
+ ### `katze apply` — Open and pre-fill application tabs in Chrome
140
+
141
+ ```bash
142
+ # Apply to jobs you bookmarked ("Saved") on JobKatze Web
143
+ katze apply --from saved --limit 5
144
+
145
+ # Pull top resume-matched jobs from direct ATS boards (Greenhouse, Personio, Ashby, Lever, Recruitee, Workable)
146
+ katze apply --from match --limit 5
147
+
148
+ # Filter by specific ATS platform(s)
149
+ katze apply --from match --source greenhouse,personio,ashby --limit 5
150
+
151
+ # Apply to a single job ID
152
+ katze apply --job <job_id>
153
+
154
+ # Regenerate cover letters even if cached locally
155
+ katze apply --job <job_id> --regen
156
+
157
+ # Prompt immediately in the terminal for submission confirmation
158
+ katze apply --from saved --prompt
159
+ ```
160
+
161
+ #### How persistent Chrome tabs work
162
+ - `katze apply` launches a detached Chrome process using `~/.config/jobkatze/chrome-profile` on `--remote-debugging-port=9222` and connects via Chrome DevTools Protocol (CDP).
163
+ - When `katze apply` exits, **all Chrome tabs stay open**.
164
+ - Running `katze apply` again attaches to the same Chrome window and appends new tabs next to your existing ones.
165
+ - Each tab title is prefixed with:
166
+ - `[READY] Company - Role` when 0 mandatory fields remain unfilled.
167
+ - `[NEEDS N] Company - Role` when `N` mandatory fields need manual input (outlined in amber `2px solid #e08b00` on the page).
168
+
169
+ ---
170
+
171
+ ### `katze confirm` — Mark submitted tabs as `applied`
172
+
173
+ After reviewing open tabs and clicking **Submit** in Chrome, sync your submission status back to JobKatze Web:
174
+
175
+ ```bash
176
+ # Interactively confirm each pending tab [y/N]
177
+ katze confirm
178
+
179
+ # Mark all pending tabs as applied without prompting
180
+ katze confirm --all
181
+
182
+ # Mark a specific job ID as applied
183
+ katze confirm --job <job_id>
184
+ ```
185
+
186
+ ---
187
+
188
+ ### `katze letter` — Generate a tailored cover letter PDF only
189
+
190
+ ```bash
191
+ # Generate ~/.config/jobkatze/applications/<job_id>/cover_letter.{txt,pdf}
192
+ katze letter <job_id>
193
+
194
+ # Pass a custom angle or instruction to the agent
195
+ katze letter <job_id> --hint "Emphasize distributed systems and Kubernetes experience"
196
+
197
+ # Overwrite an existing letter
198
+ katze letter <job_id> --regen
199
+ ```
200
+
201
+ ---
202
+
203
+ ### `katze questions` — Harvest & analyze mandatory ATS questions
204
+
205
+ Scan application forms over plain HTTP (no browser required) to inspect what mandatory questions companies ask and verify what percentage of fields your `profile.yaml` covers:
206
+
207
+ ```bash
208
+ # Scan mandatory questions across top 25 resume-matched direct-ATS jobs
209
+ katze questions scan --from match --limit 25
210
+
211
+ # Scan mandatory questions across your saved jobs
212
+ katze questions scan --from saved --limit 25
213
+
214
+ # View the cumulative frequency and profile coverage report from ~/.config/jobkatze/questions.jsonl
215
+ katze questions report
216
+ ```
217
+
218
+ ---
219
+
220
+ ## Local Files (`~/.config/jobkatze/`)
221
+
222
+ | Path | Purpose |
223
+ | :--- | :--- |
224
+ | `config.toml` | API base URL and authentication token (`0600` permissions) |
225
+ | `profile.yaml` | Pre-filled candidate answers for text inputs, dropdowns, radio groups, and checkboxes |
226
+ | `resume.pdf` | Candidate CV uploaded to file inputs |
227
+ | `letter.typ` | Typst template compiled for each cover letter |
228
+ | `applications/<job_id>/cover_letter.txt` | Plain-text cover letter generated by `agy` |
229
+ | `applications/<job_id>/cover_letter.pdf` | Compiled PDF cover letter uploaded to ATS forms |
230
+ | `questions.jsonl` | Deduplicated log of observed mandatory ATS form questions |
231
+ | `pending_tabs.json` | Queue of open tabs awaiting `katze confirm` |
232
+ | `chrome-profile/` | Persistent Chromium user data directory |
233
+
234
+ ---
235
+
236
+ ## Running Tests
237
+
238
+ ```bash
239
+ PYTHONPATH=cli api/.venv/bin/pytest cli/tests/
240
+ ```
@@ -0,0 +1,4 @@
1
+ """JobKatze CLI package."""
2
+
3
+ __version__ = "0.1.0"
4
+