Add content-level language filter, recheck command, expanded keywords

- isEnglishContent() fetches each job page and drops descriptions with ≥6 German or French indicator words; called for every new job in index.ts before writing to CSV
- New `bun recheck` command (recheck.ts) runs searches in raw mode, lists filtered-out jobs, and prints word-frequency suggestions for SOFTWARE_TITLE_RE
- Expanded KEYWORDS and SOFTWARE_TITLE_RE to cover ML/AI, system/applications engineer, director, informatics, and more title variants
- Added `raw` flag to fetchJobs() to bypass the software-role filter
- Add CLAUDE.md with project workflow docs; add CV files and city temp scripts
This commit is contained in:
2026-05-12 13:42:27 +02:00
parent ffe2b4467a
commit bcb6ae5ea3
19 changed files with 1201 additions and 14 deletions
+30
View File
@@ -0,0 +1,30 @@
#!/usr/bin/env bun
import { KEYWORDS } from "./config.ts";
import { fetchJobs, SOFTWARE_TITLE_RE } from "./fetch.ts";
import type { SearchConfig } from "./config.ts";
const JUNIOR_RE = /\b(junior|jr\.?|entry.?level|graduate|intern(?:ship)?|trainee|apprentice|werkstudent)\b/i;
const searches: SearchConfig[] = [
{ label: "Bern (city)", keywords: KEYWORDS, location: "Bern, Switzerland", workType: ["onsite", "hybrid"], timePosted: "month" },
];
const seen = new Set<string>();
const results: { title: string; company: string; link: string; search: string }[] = [];
for (const config of searches) {
console.log(`\n[${config.label}]`);
const jobs = await fetchJobs(config, { raw: false });
for (const job of jobs) {
if (!seen.has(job.id)) {
seen.add(job.id);
results.push({ title: job.title, company: job.company, link: job.link, search: job.search });
}
}
}
console.log(`\n── ${results.length} jobs found in Bern ──\n`);
for (const j of results) {
console.log(` [${j.search}] ${j.title}`);
console.log(` ${j.company} ${j.link}`);
}