jd-writer
Job-description authoring microservice for recruiters, hiring managers and HR: generate a complete JD (summary, responsibilities, requirements, benefits, equal-opportunity statement) from {role...
jd-writer (engines/adapters/domain/jd-writer)
Intelligent job-description authoring microservice. Turns {role, level, company} into a complete, inclusive job post — and audits existing ones. Hybrid: every tool has a deterministic heuristic/template core that runs fully offline; generative tools optionally enrich via a reachable LLM and tag results mode: 'heuristic' | 'llm' (never require a model, never throw on a down model).
Tools
| tool | input | what it does |
|---|---|---|
write | { role, level?, company?, remote?, industry? } | Full JD: title, summary, experience range, responsibilities, requirements, nice-to-haves, benefits, EEO statement. |
optimize | { text } | Readability (Flesch + grade level), bias flag count, concrete fix list, 0–100 score. |
inclusivityCheck | { text } | Flags gendered / ageist / ableist / exclusionary / hype wording with neutral rewrites + an auto-rewritten draft and inclusivity score. |
seniorityCalibrate | { role, level } | Recommends title, years range, scope, autonomy, leadership expectation for the level. |
requirements | { role, level } | Must-have vs nice-to-have + a competency matrix with expected proficiency. |
benefitsList | { remote?, count? } | Competitive, categorized benefits/perks list (health/time/money/growth/flexibility/culture/perks). |
Levels: intern, junior, mid, senior, lead, staff, principal, manager, director, vp (aliases: entry→junior, sr→senior, jr→junior, mgr→manager…).
Usage
import jd from './index.js';
await jd.adapters.write({ role: 'Backend Engineer', level: 'senior', company: 'Acme', remote: true });
jd.adapters.inclusivityCheck({ text: 'We want a young rockstar ninja who is a great culture fit.' });
jd.adapters.seniorityCalibrate({ role: 'Product Manager', level: 'lead' });
DRY boundaries
- Bias/inclusivity here is JD-domain (biased job wording + rewrites) — not the generic text stats
of a-text / nlp.
jd-writeris the write side (author the posting);resume-scoreris the read side (score
candidates against a JD) and interview-kit is the assess side.
- Self-contained: no cross-pack imports except
../_shared/llm.jsfor the optional AI mode.