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.
- labor_sieve-0.1.0/CHANGELOG.md +13 -0
- labor_sieve-0.1.0/LICENSE +21 -0
- labor_sieve-0.1.0/MANIFEST.in +11 -0
- labor_sieve-0.1.0/PKG-INFO +431 -0
- labor_sieve-0.1.0/README.md +398 -0
- labor_sieve-0.1.0/RELEASE.md +113 -0
- labor_sieve-0.1.0/SECURITY.md +22 -0
- labor_sieve-0.1.0/SECURITY_REVIEW.md +127 -0
- labor_sieve-0.1.0/config.example.yaml +98 -0
- labor_sieve-0.1.0/labor_sieve/__init__.py +3 -0
- labor_sieve-0.1.0/labor_sieve/cli.py +389 -0
- labor_sieve-0.1.0/labor_sieve/config.py +484 -0
- labor_sieve-0.1.0/labor_sieve/dedupe.py +175 -0
- labor_sieve-0.1.0/labor_sieve/models.py +32 -0
- labor_sieve-0.1.0/labor_sieve/net.py +73 -0
- labor_sieve-0.1.0/labor_sieve/presets.py +333 -0
- labor_sieve-0.1.0/labor_sieve/reports.py +310 -0
- labor_sieve-0.1.0/labor_sieve/scoring.py +156 -0
- labor_sieve-0.1.0/labor_sieve/sources/__init__.py +1 -0
- labor_sieve-0.1.0/labor_sieve/sources/base.py +19 -0
- labor_sieve-0.1.0/labor_sieve/sources/greenhouse.py +88 -0
- labor_sieve-0.1.0/labor_sieve/sources/lever.py +150 -0
- labor_sieve-0.1.0/labor_sieve/sources/local_file.py +96 -0
- labor_sieve-0.1.0/labor_sieve/sources/normalization.py +300 -0
- labor_sieve-0.1.0/labor_sieve/sources/sample.py +147 -0
- labor_sieve-0.1.0/labor_sieve/taxonomy.py +32 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/PKG-INFO +431 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/SOURCES.txt +49 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/dependency_links.txt +1 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/entry_points.txt +2 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/requires.txt +7 -0
- labor_sieve-0.1.0/labor_sieve.egg-info/top_level.txt +1 -0
- labor_sieve-0.1.0/presets/datacenter-hardware.yaml +22 -0
- labor_sieve-0.1.0/presets/implementation-support.yaml +22 -0
- labor_sieve-0.1.0/presets/index.json +40 -0
- labor_sieve-0.1.0/presets/linux-sre.yaml +23 -0
- labor_sieve-0.1.0/presets/logistics-process.yaml +22 -0
- labor_sieve-0.1.0/presets/operations-engineer.yaml +24 -0
- labor_sieve-0.1.0/presets/senior-infra-lead.yaml +28 -0
- labor_sieve-0.1.0/pyproject.toml +75 -0
- labor_sieve-0.1.0/scripts/build-preset-index.py +63 -0
- labor_sieve-0.1.0/scripts/build-release.sh +39 -0
- labor_sieve-0.1.0/scripts/install.sh +75 -0
- labor_sieve-0.1.0/setup.cfg +4 -0
- labor_sieve-0.1.0/tests/test_cli.py +46 -0
- labor_sieve-0.1.0/tests/test_config.py +98 -0
- labor_sieve-0.1.0/tests/test_dedupe.py +84 -0
- labor_sieve-0.1.0/tests/test_presets.py +113 -0
- labor_sieve-0.1.0/tests/test_reports.py +115 -0
- labor_sieve-0.1.0/tests/test_scoring.py +41 -0
- 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
|
+
```
|