labor-sieve 0.1.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 (51) hide show
  1. labor_sieve-0.1.0/CHANGELOG.md +13 -0
  2. labor_sieve-0.1.0/LICENSE +21 -0
  3. labor_sieve-0.1.0/MANIFEST.in +11 -0
  4. labor_sieve-0.1.0/PKG-INFO +431 -0
  5. labor_sieve-0.1.0/README.md +398 -0
  6. labor_sieve-0.1.0/RELEASE.md +113 -0
  7. labor_sieve-0.1.0/SECURITY.md +22 -0
  8. labor_sieve-0.1.0/SECURITY_REVIEW.md +127 -0
  9. labor_sieve-0.1.0/config.example.yaml +98 -0
  10. labor_sieve-0.1.0/labor_sieve/__init__.py +3 -0
  11. labor_sieve-0.1.0/labor_sieve/cli.py +389 -0
  12. labor_sieve-0.1.0/labor_sieve/config.py +484 -0
  13. labor_sieve-0.1.0/labor_sieve/dedupe.py +175 -0
  14. labor_sieve-0.1.0/labor_sieve/models.py +32 -0
  15. labor_sieve-0.1.0/labor_sieve/net.py +73 -0
  16. labor_sieve-0.1.0/labor_sieve/presets.py +333 -0
  17. labor_sieve-0.1.0/labor_sieve/reports.py +310 -0
  18. labor_sieve-0.1.0/labor_sieve/scoring.py +156 -0
  19. labor_sieve-0.1.0/labor_sieve/sources/__init__.py +1 -0
  20. labor_sieve-0.1.0/labor_sieve/sources/base.py +19 -0
  21. labor_sieve-0.1.0/labor_sieve/sources/greenhouse.py +88 -0
  22. labor_sieve-0.1.0/labor_sieve/sources/lever.py +150 -0
  23. labor_sieve-0.1.0/labor_sieve/sources/local_file.py +96 -0
  24. labor_sieve-0.1.0/labor_sieve/sources/normalization.py +300 -0
  25. labor_sieve-0.1.0/labor_sieve/sources/sample.py +147 -0
  26. labor_sieve-0.1.0/labor_sieve/taxonomy.py +32 -0
  27. labor_sieve-0.1.0/labor_sieve.egg-info/PKG-INFO +431 -0
  28. labor_sieve-0.1.0/labor_sieve.egg-info/SOURCES.txt +49 -0
  29. labor_sieve-0.1.0/labor_sieve.egg-info/dependency_links.txt +1 -0
  30. labor_sieve-0.1.0/labor_sieve.egg-info/entry_points.txt +2 -0
  31. labor_sieve-0.1.0/labor_sieve.egg-info/requires.txt +7 -0
  32. labor_sieve-0.1.0/labor_sieve.egg-info/top_level.txt +1 -0
  33. labor_sieve-0.1.0/presets/datacenter-hardware.yaml +22 -0
  34. labor_sieve-0.1.0/presets/implementation-support.yaml +22 -0
  35. labor_sieve-0.1.0/presets/index.json +40 -0
  36. labor_sieve-0.1.0/presets/linux-sre.yaml +23 -0
  37. labor_sieve-0.1.0/presets/logistics-process.yaml +22 -0
  38. labor_sieve-0.1.0/presets/operations-engineer.yaml +24 -0
  39. labor_sieve-0.1.0/presets/senior-infra-lead.yaml +28 -0
  40. labor_sieve-0.1.0/pyproject.toml +75 -0
  41. labor_sieve-0.1.0/scripts/build-preset-index.py +63 -0
  42. labor_sieve-0.1.0/scripts/build-release.sh +39 -0
  43. labor_sieve-0.1.0/scripts/install.sh +75 -0
  44. labor_sieve-0.1.0/setup.cfg +4 -0
  45. labor_sieve-0.1.0/tests/test_cli.py +46 -0
  46. labor_sieve-0.1.0/tests/test_config.py +98 -0
  47. labor_sieve-0.1.0/tests/test_dedupe.py +84 -0
  48. labor_sieve-0.1.0/tests/test_presets.py +113 -0
  49. labor_sieve-0.1.0/tests/test_reports.py +115 -0
  50. labor_sieve-0.1.0/tests/test_scoring.py +41 -0
  51. labor_sieve-0.1.0/tests/test_sources.py +273 -0
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - CLI commands: init, quickstart, doctor, validate-config, list-options, presets, and run.
6
+ - Sources: sample, local file, Greenhouse, and Lever.
7
+ - Reports: terminal P0/P1 summary plus txt/csv/json/html output files.
8
+ - Scoring and deduplication for normalized job records.
9
+ - Remote preset update and preset apply flow.
10
+ - Install script with pipx support and a dedicated user-venv fallback.
11
+ - Preset index generation for GitHub-hosted preset updates.
12
+ - Manual and scheduled run setup documentation for Linux users.
13
+ - Release build script.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 LaborSieve maintainers
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.
@@ -0,0 +1,11 @@
1
+ include README.md
2
+ include CHANGELOG.md
3
+ include LICENSE
4
+ include RELEASE.md
5
+ include SECURITY.md
6
+ include SECURITY_REVIEW.md
7
+ include config.example.yaml
8
+ include presets/index.json
9
+ recursive-include presets *.yaml
10
+ recursive-include scripts *.sh
11
+ recursive-include scripts *.py
@@ -0,0 +1,431 @@
1
+ Metadata-Version: 2.4
2
+ Name: labor-sieve
3
+ Version: 0.1.0
4
+ Summary: Linux-first command-line job search and reporting for operations-adjacent roles.
5
+ Author: LaborSieve maintainers
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Deadrobot/Labor-Sieve
8
+ Project-URL: Repository, https://github.com/Deadrobot/Labor-Sieve
9
+ Project-URL: Issues, https://github.com/Deadrobot/Labor-Sieve/issues
10
+ Project-URL: Changelog, https://github.com/Deadrobot/Labor-Sieve/blob/main/CHANGELOG.md
11
+ Project-URL: Security, https://github.com/Deadrobot/Labor-Sieve/blob/main/SECURITY.md
12
+ Keywords: jobs,cli,sre,operations,linux
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Office/Business
22
+ Classifier: Topic :: Utilities
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: PyYAML>=6.0
27
+ Provides-Extra: dev
28
+ Requires-Dist: build>=1.2; extra == "dev"
29
+ Requires-Dist: pytest>=8.0; extra == "dev"
30
+ Requires-Dist: setuptools>=68; extra == "dev"
31
+ Requires-Dist: twine>=6.0; extra == "dev"
32
+ Dynamic: license-file
33
+
34
+ # LaborSieve
35
+
36
+ LaborSieve is a Linux-first command-line job search and reporting tool for operations, infrastructure, data center, SRE, logistics/process, and support-adjacent roles.
37
+
38
+ Current scope:
39
+
40
+ - One editable `config.yaml`
41
+ - One command to run
42
+ - P0/P1 matches printed in the terminal
43
+ - Full readable text report written to disk
44
+ - Optional CSV, JSON, and static HTML reports
45
+ - No dashboard, database, background service, Docker, reverse proxy, or resume parser
46
+
47
+ ## Quick Start
48
+
49
+ Install the published command on a Linux machine:
50
+
51
+ ```bash
52
+ pipx install labor-sieve
53
+ ```
54
+
55
+ If `pipx` is not available, use the tagged project installer:
56
+
57
+ ```bash
58
+ curl -fsSL https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/v0.1.0/scripts/install.sh \
59
+ | sh -s -- labor-sieve==0.1.0
60
+ ```
61
+
62
+ Create a working directory, configure preferences, and run a scan:
63
+
64
+ ```bash
65
+ mkdir -p ~/labor-sieve
66
+ cd ~/labor-sieve
67
+ labor-sieve init
68
+ nano config.yaml
69
+ labor-sieve validate-config
70
+ labor-sieve run
71
+ ```
72
+
73
+ If `labor-sieve` is not found after install, add `~/.local/bin` to the shell path:
74
+
75
+ ```bash
76
+ export PATH="$HOME/.local/bin:$PATH"
77
+ ```
78
+
79
+ Developer install from a checkout:
80
+
81
+ ```bash
82
+ python3 -m venv .venv
83
+ . .venv/bin/activate
84
+ python -m pip install -e ".[dev]"
85
+
86
+ labor-sieve init
87
+ $EDITOR config.yaml
88
+ labor-sieve validate-config
89
+ labor-sieve run
90
+ ```
91
+
92
+ Reports are written under `output/` by default:
93
+
94
+ - `output/latest.txt`
95
+ - `output/latest.csv`
96
+ - `output/latest.json`
97
+ - `output/latest.html`
98
+
99
+ Terminal output prints scan counts and P0/P1 summaries. The text report includes every job, including rejected jobs, grouped by priority bucket.
100
+
101
+ Jobs are deduplicated before scoring. Exact URL matches are merged first, then normalized company/title/location matches. Reports show the selected source and any merged source references.
102
+
103
+ ## Commands
104
+
105
+ ```bash
106
+ labor-sieve init
107
+ labor-sieve quickstart
108
+ labor-sieve doctor
109
+ labor-sieve validate-config
110
+ labor-sieve list-options
111
+ labor-sieve list-presets
112
+ labor-sieve update-presets --index-url https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/main/presets/index.json
113
+ labor-sieve use-preset linux-sre
114
+ labor-sieve run
115
+ ```
116
+
117
+ `labor-sieve init` copies `config.example.yaml` to `config.yaml` when `config.yaml` does not already exist.
118
+
119
+ `labor-sieve quickstart` prints first-run setup instructions.
120
+
121
+ `labor-sieve doctor` checks the Python runtime, PyYAML, bundled config/presets, and `config.yaml`.
122
+
123
+ `labor-sieve validate-config` validates `config.yaml` and prints human-readable errors.
124
+
125
+ `labor-sieve list-options` prints built-in seniority levels and role families.
126
+
127
+ `labor-sieve list-presets` prints bundled presets plus downloaded remote presets.
128
+
129
+ `labor-sieve update-presets` downloads preset updates from a JSON index. Remote preset entries require `sha256` by default; pass `--allow-unverified` only for a trusted temporary source.
130
+
131
+ `labor-sieve use-preset PRESET` merges a preset into `config.yaml`, validates the result, and writes a `.bak` backup first.
132
+
133
+ `labor-sieve run` uses enabled sources from `config.yaml`. The sample source is enabled by default so scoring and reports can be tested immediately.
134
+
135
+ ## Configuration
136
+
137
+ The default configuration prioritizes production operations, infrastructure, Linux/SRE, data center, logistics/process, and implementation-support roles.
138
+
139
+ Edit these fields in `config.yaml`:
140
+
141
+ - `seniority`: minimum and maximum target seniority.
142
+ - `role_family_weights`: higher values increase priority for a role family.
143
+ - `keywords.boost`: terms that improve a match.
144
+ - `keywords.penalize`: terms that lower a match.
145
+ - `locations`: remote support and acceptable hybrid locations.
146
+ - `compensation.minimum_base`: base-pay floor, or `null` to disable it.
147
+ - `sources`: enabled job sources.
148
+
149
+ Role families are config-driven. Built-in families are listed in `labor-sieve list-options`. `role_family_weights` also accepts custom snake_case keys, and the scorer applies those weights to matching `role_family` values from sources and presets.
150
+
151
+ Bundled presets live in `presets/`. Downloaded presets live in `~/.config/labor-sieve/presets/` by default and override bundled presets with the same name.
152
+
153
+ Update presets from this repository:
154
+
155
+ ```bash
156
+ labor-sieve update-presets --index-url https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/main/presets/index.json
157
+ ```
158
+
159
+ Remote preset indexes use this shape:
160
+
161
+ ```json
162
+ {
163
+ "presets": [
164
+ {
165
+ "name": "linux-sre",
166
+ "version": "2026.06.11",
167
+ "url": "https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/main/presets/linux-sre.yaml",
168
+ "sha256": "hex-encoded-sha256"
169
+ }
170
+ ]
171
+ }
172
+ ```
173
+
174
+ Apply a preset:
175
+
176
+ ```bash
177
+ labor-sieve list-presets
178
+ labor-sieve use-preset linux-sre
179
+ labor-sieve validate-config
180
+ ```
181
+
182
+ ## Sources
183
+
184
+ Available sources:
185
+
186
+ - `sample`: synthetic jobs for scoring/report smoke tests
187
+ - `local_file`: local `.csv`, `.json`, `.yaml`, or `.yml` exports
188
+ - `greenhouse`: public Greenhouse Job Board API boards
189
+ - `lever`: public Lever Postings API companies
190
+
191
+ Example local file config:
192
+
193
+ ```yaml
194
+ sources:
195
+ sample:
196
+ enabled: false
197
+ local_file:
198
+ enabled: true
199
+ paths:
200
+ - jobs.csv
201
+ greenhouse:
202
+ enabled: false
203
+ board_tokens: []
204
+ timeout_seconds: 20
205
+ lever:
206
+ enabled: false
207
+ companies: []
208
+ timeout_seconds: 20
209
+ base_url: https://api.lever.co/v0/postings
210
+ ```
211
+
212
+ Local file records can include:
213
+
214
+ ```text
215
+ title, company, location, remote, hybrid, seniority, role_family,
216
+ compensation_base_min, url, description, tags
217
+ ```
218
+
219
+ Example Greenhouse config:
220
+
221
+ ```yaml
222
+ sources:
223
+ sample:
224
+ enabled: false
225
+ local_file:
226
+ enabled: false
227
+ paths: []
228
+ greenhouse:
229
+ enabled: true
230
+ board_tokens:
231
+ - example-board-token
232
+ timeout_seconds: 20
233
+ lever:
234
+ enabled: false
235
+ companies: []
236
+ timeout_seconds: 20
237
+ base_url: https://api.lever.co/v0/postings
238
+ ```
239
+
240
+ Example Lever config:
241
+
242
+ ```yaml
243
+ sources:
244
+ sample:
245
+ enabled: false
246
+ local_file:
247
+ enabled: false
248
+ paths: []
249
+ greenhouse:
250
+ enabled: false
251
+ board_tokens: []
252
+ timeout_seconds: 20
253
+ lever:
254
+ enabled: true
255
+ companies:
256
+ - example-company
257
+ timeout_seconds: 20
258
+ base_url: https://api.lever.co/v0/postings
259
+ ```
260
+
261
+ ## Manual Runs
262
+
263
+ Use a working directory that contains `config.yaml` and `output/`:
264
+
265
+ ```bash
266
+ mkdir -p ~/labor-sieve
267
+ cd ~/labor-sieve
268
+ labor-sieve init
269
+ nano config.yaml
270
+ labor-sieve validate-config
271
+ labor-sieve run
272
+ less output/latest.txt
273
+ ```
274
+
275
+ Subsequent runs from the same directory:
276
+
277
+ ```bash
278
+ cd ~/labor-sieve
279
+ labor-sieve run
280
+ ```
281
+
282
+ Update the installed command from PyPI:
283
+
284
+ ```bash
285
+ pipx upgrade labor-sieve
286
+ ```
287
+
288
+ If the tagged project installer was used:
289
+
290
+ ```bash
291
+ curl -fsSL https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/v0.1.0/scripts/install.sh \
292
+ | sh -s -- labor-sieve==0.1.0
293
+ ```
294
+
295
+ ## Scheduled Runs
296
+
297
+ LaborSieve can run on a schedule with cron or a systemd user timer. Use one working directory so `config.yaml` and `output/` stay together.
298
+
299
+ Cron example, every morning at 8:17:
300
+
301
+ ```bash
302
+ mkdir -p ~/labor-sieve ~/.local/state/labor-sieve
303
+ cd ~/labor-sieve
304
+ labor-sieve init
305
+ crontab -e
306
+ ```
307
+
308
+ Add this crontab entry, changing paths as needed:
309
+
310
+ ```cron
311
+ 17 8 * * * cd "$HOME/labor-sieve" && "$HOME/.local/bin/labor-sieve" run >> "$HOME/.local/state/labor-sieve/run.log" 2>&1
312
+ ```
313
+
314
+ systemd user timer example:
315
+
316
+ ```bash
317
+ mkdir -p ~/.config/systemd/user ~/labor-sieve ~/.local/state/labor-sieve
318
+ ```
319
+
320
+ Create `~/.config/systemd/user/labor-sieve.service`:
321
+
322
+ ```ini
323
+ [Unit]
324
+ Description=Run LaborSieve
325
+
326
+ [Service]
327
+ Type=oneshot
328
+ WorkingDirectory=%h/labor-sieve
329
+ ExecStart=%h/.local/bin/labor-sieve run
330
+ StandardOutput=append:%h/.local/state/labor-sieve/run.log
331
+ StandardError=append:%h/.local/state/labor-sieve/run.log
332
+ ```
333
+
334
+ Create `~/.config/systemd/user/labor-sieve.timer`:
335
+
336
+ ```ini
337
+ [Unit]
338
+ Description=Run LaborSieve daily
339
+
340
+ [Timer]
341
+ OnCalendar=*-*-* 08:17:00
342
+ Persistent=true
343
+
344
+ [Install]
345
+ WantedBy=timers.target
346
+ ```
347
+
348
+ Enable and check it:
349
+
350
+ ```bash
351
+ systemctl --user daemon-reload
352
+ systemctl --user enable --now labor-sieve.timer
353
+ systemctl --user list-timers labor-sieve.timer
354
+ systemctl --user start labor-sieve.service
355
+ ```
356
+
357
+ Enable lingering for scheduled user timers on systems that support it:
358
+
359
+ ```bash
360
+ loginctl enable-linger "$USER"
361
+ ```
362
+
363
+ ## Distribution
364
+
365
+ The installer accepts any pip-compatible package spec, including a package version, wheel path, wheel URL, or source archive URL. It uses `pipx` if pipx is installed. Otherwise, it creates a dedicated user venv at `~/.local/share/labor-sieve/venv` and symlinks `labor-sieve` into `~/.local/bin`.
366
+
367
+ Install from PyPI:
368
+
369
+ ```bash
370
+ pipx install labor-sieve
371
+ ```
372
+
373
+ Install from PyPI through the tagged project installer:
374
+
375
+ ```bash
376
+ curl -fsSL https://raw.githubusercontent.com/Deadrobot/Labor-Sieve/v0.1.0/scripts/install.sh \
377
+ | sh -s -- labor-sieve==0.1.0
378
+ ```
379
+
380
+ Install from a local wheel:
381
+
382
+ ```bash
383
+ scripts/install.sh dist/labor_sieve-0.1.0-py3-none-any.whl
384
+ ```
385
+
386
+ Installer environment variables:
387
+
388
+ ```bash
389
+ LABOR_SIEVE_INSTALL_MODE=venv # force the dedicated venv path
390
+ LABOR_SIEVE_INSTALL_ROOT=... # override ~/.local/share/labor-sieve
391
+ LABOR_SIEVE_BIN_DIR=... # override ~/.local/bin
392
+ ```
393
+
394
+ Build release artifacts:
395
+
396
+ ```bash
397
+ python3 -m venv .venv
398
+ . .venv/bin/activate
399
+ python -m pip install -e ".[dev]"
400
+ python3 scripts/build-preset-index.py
401
+ scripts/build-release.sh
402
+ python -m twine check dist/*
403
+ ```
404
+
405
+ The build script writes artifacts to `dist/` and prints SHA-256 checksums.
406
+
407
+ ## Maintainer Notes
408
+
409
+ Add or tune role families in config and presets first. `role_family_weights` accepts custom snake_case keys, and presets can ship those weights without a code change.
410
+
411
+ Source inference changes belong in `labor_sieve/sources/normalization.py`. Add tests when changing inferred `seniority`, `role_family`, compensation parsing, URL normalization, or source-specific field mapping.
412
+
413
+ Regenerate the remote preset index when bundled presets change:
414
+
415
+ ```bash
416
+ python3 scripts/build-preset-index.py
417
+ ```
418
+
419
+ ## Local Testing
420
+
421
+ ```bash
422
+ python -m compileall .
423
+ python -m pytest
424
+ ```
425
+
426
+ Install dev dependencies:
427
+
428
+ ```bash
429
+ python -m pip install -e ".[dev]"
430
+ python -m pytest
431
+ ```