@pranavraut033/ats-checker 1.4.0 → 2.0.0
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.
- package/README.md +88 -54
- package/dist/chunk-JAFFS7YZ.mjs +1219 -0
- package/dist/chunk-JAFFS7YZ.mjs.map +1 -0
- package/dist/{scoring-pZZR3soa.d.mts → config-CVmXtmvk.d.mts} +186 -90
- package/dist/{scoring-pZZR3soa.d.ts → config-CVmXtmvk.d.ts} +186 -90
- package/dist/index.cjs +1663 -309
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +759 -144
- package/dist/index.mjs.map +1 -1
- package/dist/lang/de/index.cjs +424 -29
- package/dist/lang/de/index.cjs.map +1 -1
- package/dist/lang/de/index.d.mts +1 -1
- package/dist/lang/de/index.d.ts +1 -1
- package/dist/lang/de/index.mjs +424 -29
- package/dist/lang/de/index.mjs.map +1 -1
- package/dist/lang/en/index.cjs +613 -41
- package/dist/lang/en/index.cjs.map +1 -1
- package/dist/lang/en/index.d.mts +1 -1
- package/dist/lang/en/index.d.ts +1 -1
- package/dist/lang/en/index.mjs +1 -1
- package/dist/lang/en/index.mjs.map +1 -1
- package/dist/pdf/index.cjs.map +1 -1
- package/dist/pdf/index.mjs.map +1 -1
- package/package.json +11 -2
- package/dist/chunk-IY7OVF6Z.mjs +0 -479
- package/dist/chunk-IY7OVF6Z.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/match.ts","../src/utils/text.ts","../src/utils/skills.ts","../src/profiles/index.ts"],"names":[],"mappings":"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","file":"chunk-JAFFS7YZ.mjs","sourcesContent":["// ponytail: hand-rolled stemmer + bounded Levenshtein — both stay well under the\n// \"reach for a dep\" threshold (~20 lines each) per the plan's zero-dependency note.\n\n// Longest-suffix-first so e.g. \"-ation\" is stripped before \"-tion\" mis-fires, and\n// \"-ies\"/\"-ied\" before the generic \"-s\"/\"-ed\" catch-alls.\nconst SUFFIXES: {\n suffix: string;\n replacement: string;\n minStemLength: number;\n}[] = [\n { suffix: \"ational\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ization\", replacement: \"ize\", minStemLength: 3 },\n { suffix: \"ations\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ation\", replacement: \"ate\", minStemLength: 3 },\n { suffix: \"ements\", replacement: \"e\", minStemLength: 3 },\n { suffix: \"ement\", replacement: \"e\", minStemLength: 3 },\n { suffix: \"ments\", replacement: \"ment\", minStemLength: 3 },\n { suffix: \"ment\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ies\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"ied\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"ying\", replacement: \"y\", minStemLength: 2 },\n { suffix: \"tion\", replacement: \"t\", minStemLength: 3 },\n { suffix: \"sion\", replacement: \"s\", minStemLength: 3 },\n { suffix: \"ness\", replacement: \"\", minStemLength: 3 },\n { suffix: \"fully\", replacement: \"ful\", minStemLength: 3 },\n { suffix: \"ally\", replacement: \"al\", minStemLength: 3 },\n { suffix: \"ing\", replacement: \"\", minStemLength: 3 },\n { suffix: \"edly\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ed\", replacement: \"\", minStemLength: 3 },\n { suffix: \"ly\", replacement: \"\", minStemLength: 3 },\n { suffix: \"er\", replacement: \"\", minStemLength: 3 },\n { suffix: \"es\", replacement: \"\", minStemLength: 3 },\n { suffix: \"s\", replacement: \"\", minStemLength: 3 },\n];\n\n/**\n * Hand-rolled suffix normalizer: strips common English inflectional/derivational\n * suffixes so word-form variants (developing/developed/develops -> develop) collapse\n * to the same stem. Not a full Porter stemmer — deliberately simple, deterministic,\n * and tuned for resume/JD vocabulary rather than general English.\n */\nfunction stripOneSuffix(lower: string): string {\n for (const { suffix, replacement, minStemLength } of SUFFIXES) {\n if (\n lower.endsWith(suffix) &&\n lower.length - suffix.length >= minStemLength\n ) {\n // Collapse a doubled trailing consonant left behind by stripping \"-ing\"/\"-ed\"\n // (e.g. \"running\" -> \"runn\" -> \"run\", \"planned\" -> \"plann\" -> \"plan\").\n let stemmed = lower.slice(0, lower.length - suffix.length) + replacement;\n if (\n replacement === \"\" &&\n stemmed.length >= 3 &&\n stemmed[stemmed.length - 1] === stemmed[stemmed.length - 2] &&\n !/[aeiou]/.test(stemmed[stemmed.length - 1])\n ) {\n stemmed = stemmed.slice(0, -1);\n }\n return stemmed;\n }\n }\n return lower;\n}\n\n/**\n * Runs suffix-stripping up to twice so a stacked plural+derivational ending (e.g.\n * \"managers\" -> \"manager\" -> \"manag\") converges to the same stem as its singular\n * form, without letting an unbounded loop over-strip short base words (each pass is\n * gated by minStemLength, and stripping stops as soon as a pass makes no change).\n */\nexport function stem(token: string): string {\n let word = token.trim().toLowerCase();\n for (let pass = 0; pass < 2 && word.length > 3; pass++) {\n const next = stripOneSuffix(word);\n if (next === word) {\n break;\n }\n word = next;\n }\n return word;\n}\n\n/**\n * Bounded Levenshtein edit distance. Stops early (returns Infinity-ish maxDistance+1)\n * once it's clear the distance exceeds maxDistance, keeping the cost close to O(n*m)\n * but cheap in practice for the short strings this library compares.\n */\nexport function levenshteinDistance(\n a: string,\n b: string,\n maxDistance: number\n): number {\n const s = a.toLowerCase();\n const t = b.toLowerCase();\n if (s === t) return 0;\n const lenDiff = Math.abs(s.length - t.length);\n if (lenDiff > maxDistance) return maxDistance + 1;\n\n let prevRow = new Array(t.length + 1);\n for (let j = 0; j <= t.length; j++) prevRow[j] = j;\n\n for (let i = 1; i <= s.length; i++) {\n const currRow = new Array(t.length + 1);\n currRow[0] = i;\n let rowMin = currRow[0];\n for (let j = 1; j <= t.length; j++) {\n const cost = s[i - 1] === t[j - 1] ? 0 : 1;\n currRow[j] = Math.min(\n prevRow[j] + 1, // deletion\n currRow[j - 1] + 1, // insertion\n prevRow[j - 1] + cost // substitution\n );\n if (currRow[j] < rowMin) rowMin = currRow[j];\n }\n if (rowMin > maxDistance) {\n // Every entry in this row already exceeds the budget; distance can only grow.\n return maxDistance + 1;\n }\n prevRow = currRow;\n }\n return prevRow[t.length];\n}\n\n/**\n * Fuzzy string equality via bounded Levenshtein distance, used to catch typos/near\n * variants (e.g. \"ReactJS\" vs \"react\" after stemming, or a plain typo). Default\n * threshold scales with length: maxDistance 1 for strings <=6 chars, 2 for longer,\n * matching the plan's \"short vs long\" bound.\n */\nexport function fuzzyEqual(\n a: string,\n b: string,\n opts?: { maxDistance?: number }\n): boolean {\n const x = a.trim().toLowerCase();\n const y = b.trim().toLowerCase();\n if (x === y) return true;\n if (!x || !y) return false;\n const longer = Math.max(x.length, y.length);\n const defaultMax = longer <= 6 ? 1 : 2;\n const maxDistance = opts?.maxDistance ?? defaultMax;\n return levenshteinDistance(x, y, maxDistance) <= maxDistance;\n}\n","import { stem } from \"./match\";\n\nexport const STOP_WORDS = new Set([\n // articles / prepositions / conjunctions\n \"the\",\n \"and\",\n \"or\",\n \"a\",\n \"an\",\n \"of\",\n \"for\",\n \"to\",\n \"with\",\n \"in\",\n \"on\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"into\",\n \"onto\",\n \"upon\",\n \"via\",\n \"per\",\n \"plus\",\n // verbs / modals\n \"is\",\n \"are\",\n \"be\",\n \"was\",\n \"were\",\n \"will\",\n \"can\",\n \"should\",\n \"must\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"get\",\n \"give\",\n \"go\",\n \"use\",\n \"see\",\n \"help\",\n \"work\",\n \"build\",\n \"show\",\n \"need\",\n \"want\",\n \"make\",\n \"let\",\n // pronouns / determiners\n \"it\",\n \"its\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"we\",\n \"our\",\n \"you\",\n \"your\",\n \"they\",\n \"their\",\n \"us\",\n \"who\",\n \"what\",\n \"which\",\n \"how\",\n // common English fillers that leak into JDs\n \"no\",\n \"not\",\n \"all\",\n \"any\",\n \"also\",\n \"more\",\n \"well\",\n \"very\",\n \"highly\",\n \"across\",\n \"over\",\n \"under\",\n \"within\",\n \"about\",\n \"out\",\n \"up\",\n \"down\",\n \"new\",\n \"if\",\n \"so\",\n \"such\",\n \"both\",\n \"each\",\n \"one\",\n \"many\",\n \"only\",\n // JD/HR boilerplate — never skills\n \"years\",\n \"year\",\n \"experience\",\n \"required\",\n \"requirement\",\n \"requirements\",\n \"preferred\",\n \"role\",\n \"degree\",\n \"practices\",\n \"best\",\n \"skills\",\n \"team\",\n \"field\",\n \"related\",\n \"relevant\",\n \"desired\",\n \"strong\",\n \"solid\",\n \"good\",\n \"first\",\n \"based\",\n \"day\",\n \"week\",\n \"month\",\n \"time\",\n \"fast\",\n \"open\",\n \"dynamic\",\n]);\n\n// Shared role-noun vocabulary so the JD side (extractRoleKeywords) and the resume side\n// (title detection) agree on what counts as a \"role\" — this is what makes the two sides\n// comparable via token overlap instead of silently diverging whitelists. Broadened well\n// past engineering so non-eng resumes/JDs (design, sales, HR, finance, ...) get titles too.\nexport const ROLE_NOUNS = [\n \"engineer\",\n \"developer\",\n \"manager\",\n \"scientist\",\n \"analyst\",\n \"designer\",\n \"architect\",\n \"director\",\n \"consultant\",\n \"lead\",\n \"vp\",\n \"specialist\",\n \"coordinator\",\n \"administrator\",\n \"accountant\",\n \"recruiter\",\n \"nurse\",\n \"teacher\",\n \"associate\",\n \"representative\",\n \"executive\",\n \"officer\",\n \"technician\",\n \"strategist\",\n \"marketer\",\n \"writer\",\n \"editor\",\n \"product\",\n \"principal\",\n \"staff\",\n \"head\",\n];\n\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\r\\n?/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nexport function normalizeForComparison(text: string): string {\n // NFKC folds fullwidth/accented chars before lowercasing (locale-independent)\n return normalizeWhitespace(text).normalize(\"NFKC\").toLowerCase();\n}\n\nexport function splitLines(text: string): string[] {\n return text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\n// Tech-aware token pattern: alnum start, optional internal . # + - / chars, alnum-or-symbol end.\n// Preserves c#, c++, node.js, ci/cd, full-stack, a/b as single tokens; drops lone single chars.\n// ponytail: custom regex beats any NLP lib here — domain-specific, no dep, fully deterministic\nconst TECH_TOKEN_RE = /[a-z0-9][a-z0-9.#+\\-/]*[a-z0-9#+]/g;\n\nexport function tokenize(text: string, options?: { stem?: boolean }): string[] {\n const normalized = normalizeForComparison(text);\n // Require at least one letter: drops bare numbers (100, 3+, 50%) and keeps c#, 3d, node.js\n const tokens = (normalized.match(TECH_TOKEN_RE) ?? []).filter(\n (t) => /[a-z]/.test(t) && !STOP_WORDS.has(t)\n );\n if (!options?.stem) {\n return tokens;\n }\n return tokens.map((t) => stem(t));\n}\n\nexport function escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function unique(values: string[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const lower = value.toLowerCase();\n if (!seen.has(lower)) {\n seen.add(lower);\n output.push(value);\n }\n }\n return output;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function countFrequencies(values: string[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const value of values) {\n counts[value] = (counts[value] ?? 0) + 1;\n }\n return counts;\n}\n\nexport function containsTableLikeStructure(text: string): boolean {\n const lines = splitLines(text);\n let tableLines = 0;\n for (const line of lines) {\n const hasPipeColumns = line.includes(\"|\") && line.split(\"|\").length >= 3;\n const hasTabColumns = /\\t.+\\t/.test(line);\n const hasAlignedSpaces = /( {3,})(\\S+)( {3,}\\S+)/.test(line);\n if (hasPipeColumns || hasTabColumns || hasAlignedSpaces) {\n tableLines += 1;\n }\n }\n return tableLines >= 2;\n}\n\n/** ATS-relevant parseability signals extracted from a resume's raw text. */\nexport interface FormattingSignals {\n /** Pipe/tab/aligned-space table structure (reuses containsTableLikeStructure). */\n hasTables: boolean;\n /** Very wide, inconsistent whitespace gaps suggesting a PDF-extracted multi-column layout. */\n hasMultiColumn: boolean;\n /** Control chars / private-use-area glyphs (icon fonts) / replacement chars from a bad extraction. */\n hasSpecialChars: boolean;\n /** Bullets other than the common -, *, •, o, numbered/lettered list markers. */\n nonStandardBullets: boolean;\n /** Text density/shape consistent with a scanned image (no embedded text layer) rather than real text. */\n likelyScanned: boolean;\n /** A plausible email address is present in the raw text (contact info is extractable). */\n contactParseable: boolean;\n}\n\nconst STANDARD_BULLET_RE = /^\\s*(?:[-*•o‣▪]|\\(?[a-z0-9]+[.)])\\s+/i;\n// Common non-standard bullet glyphs PDF/Word exports emit (arrows, checks, diamonds, dingbats).\nconst NON_STANDARD_BULLET_RE = /^\\s*[➤➢✓✔✗➔❖◆♦❯›»★☆♥❤]/;\n// Private-use-area codepoints (icon fonts mis-decoded as text) + the Unicode replacement char.\nconst SPECIAL_CHAR_RE = /[-�]|[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Heuristic parseability/formatting detector for raw resume text. Reuses\n * containsTableLikeStructure for hasTables; the rest are lightweight regex/line\n * scans in the same style. Informational only — callers decide how to score it.\n */\nexport function detectFormatting(raw: string): FormattingSignals {\n const lines = splitLines(raw);\n\n const hasTables = containsTableLikeStructure(raw);\n\n // Multi-column PDFs often extract as lines with very large, irregular whitespace\n // gaps between short fragments (columns interleaved) rather than the more regular\n // 3+ space alignment the table heuristic looks for.\n let wideGapLines = 0;\n for (const line of lines) {\n if (/\\S( {6,})\\S/.test(line)) {\n wideGapLines += 1;\n }\n }\n const hasMultiColumn = wideGapLines >= 2;\n\n const hasSpecialChars = SPECIAL_CHAR_RE.test(raw);\n\n let bulletLines = 0;\n let nonStandardBulletLines = 0;\n for (const line of lines) {\n if (NON_STANDARD_BULLET_RE.test(line)) {\n bulletLines += 1;\n nonStandardBulletLines += 1;\n } else if (STANDARD_BULLET_RE.test(line)) {\n bulletLines += 1;\n }\n }\n const nonStandardBullets =\n nonStandardBulletLines > 0 && nonStandardBulletLines >= bulletLines / 2;\n\n // Very little recognizable alphabetic content relative to overall length suggests a\n // scanned image whose \"text layer\" is empty/garbled rather than genuine extracted text.\n const trimmed = raw.trim();\n const letterCount = (trimmed.match(/[a-zA-Z]/g) ?? []).length;\n const likelyScanned =\n trimmed.length > 0 &&\n (letterCount < 20 || letterCount / trimmed.length < 0.2);\n\n const contactParseable =\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/.test(raw);\n\n return {\n hasTables,\n hasMultiColumn,\n hasSpecialChars,\n nonStandardBullets,\n likelyScanned,\n contactParseable,\n };\n}\n","import { fuzzyEqual, stem } from \"./match\";\nimport { unique } from \"./text\";\nimport {\n KeywordCategory,\n KeywordRegistry,\n SkillAliases,\n} from \"../types/config\";\n\n// Map lookup by default; stem/fuzzy fallback is opt-in (see NormalizeSkillOptions) so\n// existing exact-match callers/tests keep their current behavior until SCORING opts in.\nconst aliasIndexCache = new WeakMap<SkillAliases, Map<string, string>>();\n// Cache of stemmed-alias-key -> canonical, built lazily alongside the exact index so the\n// fuzzy fallback also stays a Map lookup (plus a bounded distance check) rather than a scan.\nconst stemIndexCache = new WeakMap<SkillAliases, Map<string, string>>();\n\nfunction getAliasIndex(aliases: SkillAliases): Map<string, string> {\n let index = aliasIndexCache.get(aliases);\n if (!index) {\n index = new Map();\n for (const [canonical, aliasList] of Object.entries(aliases)) {\n const lower = canonical.toLowerCase();\n index.set(lower, lower);\n for (const alias of aliasList) {\n index.set(alias.toLowerCase(), lower);\n }\n }\n aliasIndexCache.set(aliases, index);\n }\n return index;\n}\n\nfunction getStemIndex(aliases: SkillAliases): Map<string, string> {\n let index = stemIndexCache.get(aliases);\n if (!index) {\n index = new Map();\n for (const [key, canonical] of getAliasIndex(aliases)) {\n const stemmed = stem(key);\n // First writer wins so aliasing collisions stay deterministic across runs.\n if (!index.has(stemmed)) {\n index.set(stemmed, canonical);\n }\n }\n stemIndexCache.set(aliases, index);\n }\n return index;\n}\n\nexport interface NormalizeSkillOptions {\n /** Fall back to stemmed/fuzzy matching when the exact alias lookup misses. Default: false. */\n fuzzy?: boolean;\n /** Passed through to fuzzyEqual when fuzzy fallback is enabled. */\n maxDistance?: number;\n}\n\nexport function normalizeSkill(\n skill: string,\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): string {\n const normalized = skill.trim().toLowerCase();\n const exact = getAliasIndex(aliases).get(normalized);\n if (exact) {\n return exact;\n }\n if (!options?.fuzzy) {\n return normalized;\n }\n\n const stemmed = stem(normalized);\n const stemIndex = getStemIndex(aliases);\n const stemHit = stemIndex.get(stemmed);\n if (stemHit) {\n return stemHit;\n }\n\n // Bounded fuzzy scan of alias keys, stem-first to skip obviously distant candidates\n // before paying for Levenshtein.\n for (const [key, canonical] of stemIndex) {\n if (fuzzyEqual(stemmed, key, { maxDistance: options.maxDistance })) {\n return canonical;\n }\n }\n return normalized;\n}\n\nexport function normalizeSkills(\n skills: string[],\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): string[] {\n return unique(skills.map((skill) => normalizeSkill(skill, aliases, options)));\n}\n\nexport function skillMatched(\n candidate: string,\n targetSkills: Set<string>,\n aliases: SkillAliases,\n options?: NormalizeSkillOptions\n): boolean {\n const normalizedCandidate = normalizeSkill(candidate, aliases, options);\n return targetSkills.has(normalizedCandidate);\n}\n\n/** Derive a flat canonical->aliases map from a keyword registry (back-compat with SkillAliases). */\nexport function deriveSkillAliases(registry: KeywordRegistry): SkillAliases {\n const aliases: SkillAliases = {};\n for (const entry of registry) {\n aliases[entry.canonical] = entry.aliases;\n }\n return aliases;\n}\n\n/** Derive a canonical->category lookup from a keyword registry. */\nexport function buildCategoryIndex(\n registry: KeywordRegistry\n): Map<string, KeywordCategory> {\n const index = new Map<string, KeywordCategory>();\n for (const entry of registry) {\n index.set(entry.canonical.toLowerCase(), entry.category);\n }\n return index;\n}\n\n/** Merge two registries by canonical term; entries in `overrides` win. */\nexport function mergeKeywordRegistries(\n base: KeywordRegistry,\n overrides: KeywordRegistry\n): KeywordRegistry {\n const byCanonical = new Map<string, KeywordRegistry[number]>();\n for (const entry of base)\n byCanonical.set(entry.canonical.toLowerCase(), entry);\n for (const entry of overrides)\n byCanonical.set(entry.canonical.toLowerCase(), entry);\n return [...byCanonical.values()];\n}\n","import { ATSProfile, KeywordRegistry } from \"../types/config\";\nimport { deriveSkillAliases } from \"../utils/skills\";\n\n// ponytail: broad seed set per category, still not an exhaustive taxonomy — grow on demand.\nexport const defaultKeywordRegistry: KeywordRegistry = [\n // languages / frameworks\n // ponytail: \"node\" split from javascript — Node.js runtime !== JS language\n {\n canonical: \"javascript\",\n aliases: [\"js\", \"ecmascript\", \"es6\"],\n category: \"technical\",\n },\n { canonical: \"node\", aliases: [\"node.js\", \"nodejs\"], category: \"technical\" },\n { canonical: \"typescript\", aliases: [\"ts\"], category: \"technical\" },\n {\n canonical: \"react\",\n aliases: [\"reactjs\", \"react.js\"],\n category: \"technical\",\n },\n {\n canonical: \"angular\",\n aliases: [\"angularjs\", \"angular2+\"],\n category: \"technical\",\n },\n { canonical: \"vue\", aliases: [\"vue.js\", \"vuejs\"], category: \"technical\" },\n { canonical: \"svelte\", aliases: [\"sveltekit\"], category: \"technical\" },\n { canonical: \"next.js\", aliases: [\"nextjs\"], category: \"technical\" },\n { canonical: \"nuxt.js\", aliases: [\"nuxtjs\", \"nuxt\"], category: \"technical\" },\n { canonical: \"remix\", aliases: [], category: \"technical\" },\n { canonical: \"c++\", aliases: [\"cpp\"], category: \"technical\" },\n { canonical: \"c#\", aliases: [\"csharp\", \".net\"], category: \"technical\" },\n { canonical: \"java\", aliases: [], category: \"technical\" },\n { canonical: \"python\", aliases: [\"py\"], category: \"technical\" },\n { canonical: \"go\", aliases: [\"golang\"], category: \"technical\" },\n { canonical: \"rust\", aliases: [], category: \"technical\" },\n {\n canonical: \"ruby\",\n aliases: [\"ruby on rails\", \"rails\"],\n category: \"technical\",\n },\n { canonical: \"php\", aliases: [], category: \"technical\" },\n { canonical: \"swift\", aliases: [\"swiftui\"], category: \"technical\" },\n { canonical: \"kotlin\", aliases: [], category: \"technical\" },\n { canonical: \"scala\", aliases: [], category: \"technical\" },\n { canonical: \"perl\", aliases: [], category: \"technical\" },\n {\n canonical: \"r\",\n aliases: [\"r language\", \"r programming\"],\n category: \"technical\",\n },\n { canonical: \"matlab\", aliases: [], category: \"technical\" },\n {\n canonical: \"objective-c\",\n aliases: [\"objective c\", \"objc\"],\n category: \"technical\",\n },\n { canonical: \"dart\", aliases: [], category: \"technical\" },\n { canonical: \"elixir\", aliases: [], category: \"technical\" },\n { canonical: \"haskell\", aliases: [], category: \"technical\" },\n { canonical: \"html\", aliases: [\"html5\"], category: \"technical\" },\n { canonical: \"css\", aliases: [\"css3\"], category: \"technical\" },\n { canonical: \"sass\", aliases: [\"scss\"], category: \"technical\" },\n { canonical: \"less\", aliases: [], category: \"technical\" },\n {\n canonical: \"tailwind css\",\n aliases: [\"tailwind\", \"tailwindcss\"],\n category: \"technical\",\n },\n { canonical: \"bootstrap\", aliases: [], category: \"technical\" },\n { canonical: \"webassembly\", aliases: [\"wasm\"], category: \"technical\" },\n { canonical: \"ios development\", aliases: [\"ios\"], category: \"technical\" },\n {\n canonical: \"android development\",\n aliases: [\"android\"],\n category: \"technical\",\n },\n { canonical: \"react native\", aliases: [], category: \"technical\" },\n { canonical: \"flutter\", aliases: [], category: \"technical\" },\n { canonical: \"xamarin\", aliases: [], category: \"technical\" },\n { canonical: \"machine learning\", aliases: [\"ml\"], category: \"technical\" },\n { canonical: \"deep learning\", aliases: [\"dl\"], category: \"technical\" },\n {\n canonical: \"natural language processing\",\n aliases: [\"nlp\"],\n category: \"technical\",\n },\n { canonical: \"computer vision\", aliases: [\"cv\"], category: \"technical\" },\n {\n canonical: \"large language models\",\n aliases: [\"llm\", \"llms\"],\n category: \"technical\",\n },\n {\n canonical: \"generative ai\",\n aliases: [\"genai\", \"gen ai\"],\n category: \"technical\",\n },\n {\n canonical: \"reinforcement learning\",\n aliases: [\"rl\"],\n category: \"technical\",\n },\n {\n canonical: \"neural networks\",\n aliases: [\"neural network\"],\n category: \"technical\",\n },\n { canonical: \"data engineering\", aliases: [], category: \"technical\" },\n {\n canonical: \"data warehousing\",\n aliases: [\"data warehouse\"],\n category: \"technical\",\n },\n {\n canonical: \"etl\",\n aliases: [\"extract transform load\", \"elt\"],\n category: \"technical\",\n },\n { canonical: \"distributed systems\", aliases: [], category: \"technical\" },\n { canonical: \"embedded systems\", aliases: [], category: \"technical\" },\n {\n canonical: \"firmware development\",\n aliases: [\"firmware\"],\n category: \"technical\",\n },\n { canonical: \"game development\", aliases: [], category: \"technical\" },\n { canonical: \"unity\", aliases: [], category: \"technical\" },\n { canonical: \"unreal engine\", aliases: [\"unreal\"], category: \"technical\" },\n { canonical: \"web development\", aliases: [], category: \"technical\" },\n {\n canonical: \"full stack development\",\n aliases: [\"full-stack development\", \"full stack\"],\n category: \"technical\",\n },\n { canonical: \"api development\", aliases: [], category: \"technical\" },\n { canonical: \"grpc\", aliases: [], category: \"technical\" },\n { canonical: \"websockets\", aliases: [\"websocket\"], category: \"technical\" },\n { canonical: \"linux\", aliases: [], category: \"technical\" },\n { canonical: \"unix\", aliases: [], category: \"technical\" },\n {\n canonical: \"bash scripting\",\n aliases: [\"bash\", \"shell scripting\"],\n category: \"technical\",\n },\n { canonical: \"powershell\", aliases: [], category: \"technical\" },\n // tools / platforms / infra\n {\n canonical: \"sql\",\n aliases: [\"structured query language\"],\n category: \"tool\",\n },\n { canonical: \"postgresql\", aliases: [\"postgres\", \"psql\"], category: \"tool\" },\n { canonical: \"mysql\", aliases: [], category: \"tool\" },\n { canonical: \"sqlite\", aliases: [], category: \"tool\" },\n {\n canonical: \"microsoft sql server\",\n aliases: [\"mssql\", \"sql server\", \"t-sql\"],\n category: \"tool\",\n },\n {\n canonical: \"oracle database\",\n aliases: [\"oracle db\", \"oracle\"],\n category: \"tool\",\n },\n { canonical: \"mongodb\", aliases: [\"mongo\"], category: \"tool\" },\n { canonical: \"cassandra\", aliases: [\"apache cassandra\"], category: \"tool\" },\n { canonical: \"dynamodb\", aliases: [\"amazon dynamodb\"], category: \"tool\" },\n { canonical: \"couchbase\", aliases: [], category: \"tool\" },\n { canonical: \"neo4j\", aliases: [], category: \"tool\" },\n { canonical: \"firebase\", aliases: [], category: \"tool\" },\n { canonical: \"supabase\", aliases: [], category: \"tool\" },\n { canonical: \"graphql\", aliases: [\"gql\"], category: \"tool\" },\n { canonical: \"aws\", aliases: [\"amazon web services\"], category: \"tool\" },\n { canonical: \"amazon ec2\", aliases: [\"ec2\"], category: \"tool\" },\n { canonical: \"amazon s3\", aliases: [\"s3\"], category: \"tool\" },\n { canonical: \"amazon rds\", aliases: [\"rds\"], category: \"tool\" },\n { canonical: \"aws lambda\", aliases: [\"lambda\"], category: \"tool\" },\n { canonical: \"amazon cloudfront\", aliases: [\"cloudfront\"], category: \"tool\" },\n { canonical: \"amazon sqs\", aliases: [\"sqs\"], category: \"tool\" },\n { canonical: \"amazon sns\", aliases: [\"sns\"], category: \"tool\" },\n { canonical: \"azure\", aliases: [\"microsoft azure\"], category: \"tool\" },\n { canonical: \"azure devops\", aliases: [], category: \"tool\" },\n { canonical: \"azure functions\", aliases: [], category: \"tool\" },\n {\n canonical: \"google cloud platform\",\n aliases: [\"gcp\", \"google cloud\"],\n category: \"tool\",\n },\n { canonical: \"google bigquery\", aliases: [\"bigquery\"], category: \"tool\" },\n { canonical: \"google kubernetes engine\", aliases: [\"gke\"], category: \"tool\" },\n {\n canonical: \"docker\",\n aliases: [\"containers\", \"containerization\"],\n category: \"tool\",\n },\n { canonical: \"kubernetes\", aliases: [\"k8s\"], category: \"tool\" },\n { canonical: \"helm\", aliases: [], category: \"tool\" },\n { canonical: \"terraform\", aliases: [], category: \"tool\" },\n { canonical: \"pulumi\", aliases: [], category: \"tool\" },\n { canonical: \"ansible\", aliases: [], category: \"tool\" },\n { canonical: \"puppet\", aliases: [], category: \"tool\" },\n { canonical: \"chef\", aliases: [], category: \"tool\" },\n { canonical: \"jenkins\", aliases: [], category: \"tool\" },\n { canonical: \"circleci\", aliases: [\"circle ci\"], category: \"tool\" },\n { canonical: \"github actions\", aliases: [], category: \"tool\" },\n { canonical: \"gitlab ci\", aliases: [\"gitlab ci/cd\"], category: \"tool\" },\n { canonical: \"travis ci\", aliases: [], category: \"tool\" },\n {\n canonical: \"git\",\n aliases: [\"github\", \"gitlab\", \"bitbucket\"],\n category: \"tool\",\n },\n { canonical: \"jira\", aliases: [], category: \"tool\" },\n { canonical: \"confluence\", aliases: [], category: \"tool\" },\n { canonical: \"trello\", aliases: [], category: \"tool\" },\n { canonical: \"asana\", aliases: [], category: \"tool\" },\n { canonical: \"monday.com\", aliases: [\"monday\"], category: \"tool\" },\n { canonical: \"notion\", aliases: [], category: \"tool\" },\n { canonical: \"linear\", aliases: [], category: \"tool\" },\n { canonical: \"slack\", aliases: [], category: \"tool\" },\n { canonical: \"microsoft teams\", aliases: [\"ms teams\"], category: \"tool\" },\n { canonical: \"pytorch\", aliases: [\"torch\"], category: \"tool\" },\n { canonical: \"tensorflow\", aliases: [\"tf\"], category: \"tool\" },\n { canonical: \"keras\", aliases: [], category: \"tool\" },\n { canonical: \"scikit-learn\", aliases: [\"sklearn\"], category: \"tool\" },\n { canonical: \"pandas\", aliases: [], category: \"tool\" },\n { canonical: \"numpy\", aliases: [], category: \"tool\" },\n {\n canonical: \"hugging face\",\n aliases: [\"huggingface\", \"transformers\"],\n category: \"tool\",\n },\n { canonical: \"langchain\", aliases: [], category: \"tool\" },\n { canonical: \"openai api\", aliases: [\"openai\", \"gpt api\"], category: \"tool\" },\n { canonical: \"jupyter\", aliases: [\"jupyter notebook\"], category: \"tool\" },\n { canonical: \"fastapi\", aliases: [], category: \"tool\" },\n { canonical: \"flask\", aliases: [], category: \"tool\" },\n { canonical: \"django\", aliases: [], category: \"tool\" },\n {\n canonical: \"express.js\",\n aliases: [\"express\", \"expressjs\"],\n category: \"tool\",\n },\n { canonical: \"spring boot\", aliases: [\"spring\"], category: \"tool\" },\n { canonical: \"laravel\", aliases: [], category: \"tool\" },\n { canonical: \"kafka\", aliases: [\"apache kafka\"], category: \"tool\" },\n { canonical: \"rabbitmq\", aliases: [], category: \"tool\" },\n { canonical: \"redis\", aliases: [], category: \"tool\" },\n { canonical: \"memcached\", aliases: [], category: \"tool\" },\n { canonical: \"elasticsearch\", aliases: [\"elastic\"], category: \"tool\" },\n { canonical: \"logstash\", aliases: [], category: \"tool\" },\n { canonical: \"kibana\", aliases: [], category: \"tool\" },\n { canonical: \"grafana\", aliases: [], category: \"tool\" },\n { canonical: \"prometheus\", aliases: [], category: \"tool\" },\n { canonical: \"datadog\", aliases: [], category: \"tool\" },\n { canonical: \"new relic\", aliases: [], category: \"tool\" },\n { canonical: \"splunk\", aliases: [], category: \"tool\" },\n {\n canonical: \"spark\",\n aliases: [\"apache spark\", \"pyspark\"],\n category: \"tool\",\n },\n { canonical: \"hadoop\", aliases: [\"apache hadoop\"], category: \"tool\" },\n { canonical: \"airflow\", aliases: [\"apache airflow\"], category: \"tool\" },\n { canonical: \"dbt\", aliases: [\"data build tool\"], category: \"tool\" },\n { canonical: \"snowflake\", aliases: [], category: \"tool\" },\n { canonical: \"databricks\", aliases: [], category: \"tool\" },\n { canonical: \"looker\", aliases: [], category: \"tool\" },\n { canonical: \"tableau\", aliases: [], category: \"tool\" },\n { canonical: \"power bi\", aliases: [\"powerbi\"], category: \"tool\" },\n {\n canonical: \"excel\",\n aliases: [\"microsoft excel\", \"ms excel\"],\n category: \"tool\",\n },\n { canonical: \"google sheets\", aliases: [], category: \"tool\" },\n { canonical: \"spss\", aliases: [], category: \"tool\" },\n { canonical: \"sas\", aliases: [], category: \"tool\" },\n { canonical: \"salesforce\", aliases: [], category: \"tool\" },\n { canonical: \"hubspot\", aliases: [], category: \"tool\" },\n { canonical: \"marketo\", aliases: [], category: \"tool\" },\n { canonical: \"mailchimp\", aliases: [], category: \"tool\" },\n { canonical: \"google analytics\", aliases: [\"ga4\"], category: \"tool\" },\n { canonical: \"google tag manager\", aliases: [\"gtm\"], category: \"tool\" },\n { canonical: \"sap\", aliases: [], category: \"tool\" },\n { canonical: \"quickbooks\", aliases: [], category: \"tool\" },\n { canonical: \"netsuite\", aliases: [], category: \"tool\" },\n { canonical: \"workday\", aliases: [], category: \"tool\" },\n { canonical: \"zendesk\", aliases: [], category: \"tool\" },\n { canonical: \"servicenow\", aliases: [], category: \"tool\" },\n { canonical: \"freshdesk\", aliases: [], category: \"tool\" },\n { canonical: \"figma\", aliases: [], category: \"tool\" },\n { canonical: \"sketch\", aliases: [], category: \"tool\" },\n { canonical: \"adobe xd\", aliases: [\"xd\"], category: \"tool\" },\n { canonical: \"invision\", aliases: [], category: \"tool\" },\n { canonical: \"photoshop\", aliases: [\"adobe photoshop\"], category: \"tool\" },\n {\n canonical: \"illustrator\",\n aliases: [\"adobe illustrator\"],\n category: \"tool\",\n },\n {\n canonical: \"after effects\",\n aliases: [\"adobe after effects\"],\n category: \"tool\",\n },\n { canonical: \"premiere pro\", aliases: [\"adobe premiere\"], category: \"tool\" },\n { canonical: \"autocad\", aliases: [], category: \"tool\" },\n { canonical: \"solidworks\", aliases: [], category: \"tool\" },\n { canonical: \"postman\", aliases: [], category: \"tool\" },\n { canonical: \"selenium\", aliases: [], category: \"tool\" },\n { canonical: \"cypress\", aliases: [], category: \"tool\" },\n { canonical: \"playwright\", aliases: [], category: \"tool\" },\n { canonical: \"jest\", aliases: [], category: \"tool\" },\n { canonical: \"mocha\", aliases: [], category: \"tool\" },\n { canonical: \"junit\", aliases: [], category: \"tool\" },\n // engineering concepts\n { canonical: \"accessibility\", aliases: [\"a11y\"], category: \"concept\" },\n { canonical: \"frontend\", aliases: [\"front-end\"], category: \"concept\" },\n { canonical: \"backend\", aliases: [\"back-end\"], category: \"concept\" },\n {\n canonical: \"security\",\n aliases: [\"cybersecurity\", \"infosec\"],\n category: \"concept\",\n },\n {\n canonical: \"application security\",\n aliases: [\"appsec\"],\n category: \"concept\",\n },\n {\n canonical: \"penetration testing\",\n aliases: [\"pentesting\", \"pen testing\"],\n category: \"concept\",\n },\n { canonical: \"vulnerability assessment\", aliases: [], category: \"concept\" },\n {\n canonical: \"identity and access management\",\n aliases: [\"iam\"],\n category: \"concept\",\n },\n { canonical: \"zero trust\", aliases: [], category: \"concept\" },\n { canonical: \"encryption\", aliases: [], category: \"concept\" },\n {\n canonical: \"testing\",\n aliases: [\"unittest\", \"pytest\"],\n category: \"concept\",\n },\n { canonical: \"unit testing\", aliases: [], category: \"concept\" },\n { canonical: \"integration testing\", aliases: [], category: \"concept\" },\n {\n canonical: \"end-to-end testing\",\n aliases: [\"e2e testing\"],\n category: \"concept\",\n },\n { canonical: \"regression testing\", aliases: [], category: \"concept\" },\n { canonical: \"microservices\", aliases: [], category: \"concept\" },\n {\n canonical: \"monolithic architecture\",\n aliases: [\"monolith\"],\n category: \"concept\",\n },\n {\n canonical: \"event-driven architecture\",\n aliases: [\"event driven architecture\"],\n category: \"concept\",\n },\n {\n canonical: \"serverless\",\n aliases: [\"serverless architecture\"],\n category: \"concept\",\n },\n { canonical: \"agile\", aliases: [], category: \"concept\" },\n { canonical: \"scrum\", aliases: [], category: \"concept\" },\n { canonical: \"kanban\", aliases: [], category: \"concept\" },\n { canonical: \"waterfall\", aliases: [], category: \"concept\" },\n { canonical: \"sprint planning\", aliases: [], category: \"concept\" },\n { canonical: \"blockchain\", aliases: [], category: \"concept\" },\n { canonical: \"smart contracts\", aliases: [], category: \"concept\" },\n { canonical: \"devops\", aliases: [], category: \"concept\" },\n {\n canonical: \"site reliability engineering\",\n aliases: [\"sre\"],\n category: \"concept\",\n },\n {\n canonical: \"infrastructure as code\",\n aliases: [\"iac\"],\n category: \"concept\",\n },\n {\n canonical: \"ci/cd\",\n aliases: [\n \"continuous integration\",\n \"continuous deployment\",\n \"continuous delivery\",\n ],\n category: \"concept\",\n },\n {\n canonical: \"rest api\",\n aliases: [\"restful api\", \"rest apis\"],\n category: \"concept\",\n },\n { canonical: \"api design\", aliases: [], category: \"concept\" },\n { canonical: \"design patterns\", aliases: [], category: \"concept\" },\n { canonical: \"data structures\", aliases: [], category: \"concept\" },\n { canonical: \"algorithms\", aliases: [], category: \"concept\" },\n {\n canonical: \"object-oriented programming\",\n aliases: [\"oop\", \"object oriented programming\"],\n category: \"concept\",\n },\n { canonical: \"functional programming\", aliases: [], category: \"concept\" },\n { canonical: \"cloud computing\", aliases: [], category: \"concept\" },\n { canonical: \"cloud migration\", aliases: [], category: \"concept\" },\n { canonical: \"system design\", aliases: [], category: \"concept\" },\n { canonical: \"high availability\", aliases: [], category: \"concept\" },\n { canonical: \"scalability\", aliases: [], category: \"concept\" },\n { canonical: \"load balancing\", aliases: [], category: \"concept\" },\n { canonical: \"caching\", aliases: [], category: \"concept\" },\n {\n canonical: \"tdd\",\n aliases: [\"test driven development\", \"test-driven development\"],\n category: \"concept\",\n },\n {\n canonical: \"bdd\",\n aliases: [\"behavior driven development\", \"behavior-driven development\"],\n category: \"concept\",\n },\n { canonical: \"code review\", aliases: [\"code reviews\"], category: \"concept\" },\n { canonical: \"pair programming\", aliases: [], category: \"concept\" },\n { canonical: \"ux design\", aliases: [\"user experience\"], category: \"concept\" },\n {\n canonical: \"ui design\",\n aliases: [\"user interface design\"],\n category: \"concept\",\n },\n { canonical: \"user research\", aliases: [], category: \"concept\" },\n { canonical: \"wireframing\", aliases: [], category: \"concept\" },\n { canonical: \"prototyping\", aliases: [], category: \"concept\" },\n { canonical: \"design systems\", aliases: [], category: \"concept\" },\n { canonical: \"responsive design\", aliases: [], category: \"concept\" },\n { canonical: \"project management\", aliases: [], category: \"concept\" },\n { canonical: \"program management\", aliases: [], category: \"concept\" },\n { canonical: \"change management\", aliases: [], category: \"concept\" },\n { canonical: \"risk management\", aliases: [], category: \"concept\" },\n { canonical: \"quality assurance\", aliases: [\"qa\"], category: \"concept\" },\n { canonical: \"data privacy\", aliases: [], category: \"concept\" },\n { canonical: \"version control\", aliases: [], category: \"concept\" },\n {\n canonical: \"documentation\",\n aliases: [\"technical documentation\"],\n category: \"concept\",\n },\n { canonical: \"requirements gathering\", aliases: [], category: \"concept\" },\n {\n canonical: \"business process improvement\",\n aliases: [],\n category: \"concept\",\n },\n { canonical: \"root cause analysis\", aliases: [], category: \"concept\" },\n { canonical: \"lean\", aliases: [\"lean methodology\"], category: \"concept\" },\n { canonical: \"six sigma\", aliases: [], category: \"concept\" },\n // product / data domain\n { canonical: \"roadmap\", aliases: [\"product roadmap\"], category: \"domain\" },\n { canonical: \"stakeholder management\", aliases: [], category: \"domain\" },\n { canonical: \"prioritization\", aliases: [], category: \"domain\" },\n { canonical: \"a/b testing\", aliases: [\"ab testing\"], category: \"domain\" },\n { canonical: \"analytics\", aliases: [], category: \"domain\" },\n { canonical: \"statistics\", aliases: [\"stats\"], category: \"domain\" },\n { canonical: \"data visualization\", aliases: [], category: \"domain\" },\n { canonical: \"data governance\", aliases: [], category: \"domain\" },\n { canonical: \"product management\", aliases: [], category: \"domain\" },\n { canonical: \"product strategy\", aliases: [], category: \"domain\" },\n {\n canonical: \"go-to-market strategy\",\n aliases: [\"go to market\", \"gtm strategy\"],\n category: \"domain\",\n },\n {\n canonical: \"user story writing\",\n aliases: [\"user stories\"],\n category: \"domain\",\n },\n { canonical: \"competitive analysis\", aliases: [], category: \"domain\" },\n {\n canonical: \"okrs\",\n aliases: [\"objectives and key results\"],\n category: \"domain\",\n },\n {\n canonical: \"kpis\",\n aliases: [\"key performance indicators\"],\n category: \"domain\",\n },\n // finance / accounting domain\n { canonical: \"financial analysis\", aliases: [], category: \"domain\" },\n { canonical: \"financial modeling\", aliases: [], category: \"domain\" },\n { canonical: \"budgeting\", aliases: [], category: \"domain\" },\n { canonical: \"forecasting\", aliases: [], category: \"domain\" },\n { canonical: \"bookkeeping\", aliases: [], category: \"domain\" },\n { canonical: \"accounts payable\", aliases: [\"ap\"], category: \"domain\" },\n { canonical: \"accounts receivable\", aliases: [\"ar\"], category: \"domain\" },\n { canonical: \"payroll\", aliases: [], category: \"domain\" },\n { canonical: \"auditing\", aliases: [\"audit\"], category: \"domain\" },\n { canonical: \"tax preparation\", aliases: [], category: \"domain\" },\n { canonical: \"gaap\", aliases: [], category: \"domain\" },\n { canonical: \"ifrs\", aliases: [], category: \"domain\" },\n {\n canonical: \"reconciliation\",\n aliases: [\"account reconciliation\"],\n category: \"domain\",\n },\n { canonical: \"general ledger\", aliases: [], category: \"domain\" },\n { canonical: \"cost accounting\", aliases: [], category: \"domain\" },\n {\n canonical: \"mergers and acquisitions\",\n aliases: [\"m&a\"],\n category: \"domain\",\n },\n { canonical: \"investment banking\", aliases: [], category: \"domain\" },\n { canonical: \"portfolio management\", aliases: [], category: \"domain\" },\n { canonical: \"equity research\", aliases: [], category: \"domain\" },\n {\n canonical: \"treasury management\",\n aliases: [\"treasury\"],\n category: \"domain\",\n },\n { canonical: \"fintech\", aliases: [], category: \"domain\" },\n {\n canonical: \"payments processing\",\n aliases: [\"payment processing\"],\n category: \"domain\",\n },\n // sales / account management domain\n { canonical: \"lead generation\", aliases: [], category: \"domain\" },\n { canonical: \"account management\", aliases: [], category: \"domain\" },\n {\n canonical: \"crm\",\n aliases: [\"customer relationship management\"],\n category: \"domain\",\n },\n {\n canonical: \"sales pipeline\",\n aliases: [\"pipeline management\"],\n category: \"domain\",\n },\n { canonical: \"cold calling\", aliases: [], category: \"domain\" },\n { canonical: \"upselling\", aliases: [\"cross-selling\"], category: \"domain\" },\n { canonical: \"customer retention\", aliases: [], category: \"domain\" },\n {\n canonical: \"business development\",\n aliases: [\"bizdev\"],\n category: \"domain\",\n },\n { canonical: \"quota attainment\", aliases: [], category: \"domain\" },\n { canonical: \"b2b sales\", aliases: [], category: \"domain\" },\n { canonical: \"b2c sales\", aliases: [], category: \"domain\" },\n { canonical: \"saas\", aliases: [\"software as a service\"], category: \"domain\" },\n { canonical: \"e-commerce\", aliases: [\"ecommerce\"], category: \"domain\" },\n // human resources domain\n {\n canonical: \"recruiting\",\n aliases: [\"talent acquisition\"],\n category: \"domain\",\n },\n { canonical: \"onboarding\", aliases: [], category: \"domain\" },\n { canonical: \"employee relations\", aliases: [], category: \"domain\" },\n { canonical: \"benefits administration\", aliases: [], category: \"domain\" },\n { canonical: \"performance management\", aliases: [], category: \"domain\" },\n {\n canonical: \"compensation and benefits\",\n aliases: [\"comp and benefits\"],\n category: \"domain\",\n },\n {\n canonical: \"diversity and inclusion\",\n aliases: [\"dei\"],\n category: \"domain\",\n },\n { canonical: \"employee engagement\", aliases: [], category: \"domain\" },\n {\n canonical: \"hris\",\n aliases: [\"human resources information system\"],\n category: \"domain\",\n },\n // healthcare domain\n { canonical: \"patient care\", aliases: [], category: \"domain\" },\n { canonical: \"clinical documentation\", aliases: [], category: \"domain\" },\n { canonical: \"hipaa\", aliases: [], category: \"domain\" },\n {\n canonical: \"electronic health records\",\n aliases: [\"ehr\", \"emr\"],\n category: \"domain\",\n },\n { canonical: \"medical billing\", aliases: [], category: \"domain\" },\n {\n canonical: \"medical coding\",\n aliases: [\"icd-10\", \"cpt coding\"],\n category: \"domain\",\n },\n { canonical: \"telehealth\", aliases: [], category: \"domain\" },\n { canonical: \"clinical trials\", aliases: [], category: \"domain\" },\n { canonical: \"regulatory affairs\", aliases: [], category: \"domain\" },\n // legal domain\n { canonical: \"contract review\", aliases: [], category: \"domain\" },\n { canonical: \"legal research\", aliases: [], category: \"domain\" },\n { canonical: \"litigation\", aliases: [], category: \"domain\" },\n {\n canonical: \"regulatory compliance\",\n aliases: [\"compliance\"],\n category: \"domain\",\n },\n { canonical: \"due diligence\", aliases: [], category: \"domain\" },\n {\n canonical: \"intellectual property\",\n aliases: [\"ip law\"],\n category: \"domain\",\n },\n {\n canonical: \"gdpr\",\n aliases: [\"general data protection regulation\"],\n category: \"domain\",\n },\n { canonical: \"soc 2\", aliases: [\"soc2\"], category: \"domain\" },\n { canonical: \"iso 27001\", aliases: [], category: \"domain\" },\n { canonical: \"pci dss\", aliases: [\"pci compliance\"], category: \"domain\" },\n // education domain\n { canonical: \"curriculum development\", aliases: [], category: \"domain\" },\n { canonical: \"lesson planning\", aliases: [], category: \"domain\" },\n { canonical: \"classroom management\", aliases: [], category: \"domain\" },\n { canonical: \"instructional design\", aliases: [], category: \"domain\" },\n { canonical: \"student assessment\", aliases: [], category: \"domain\" },\n { canonical: \"e-learning\", aliases: [\"elearning\"], category: \"domain\" },\n // operations / supply chain domain\n {\n canonical: \"supply chain management\",\n aliases: [\"supply chain\"],\n category: \"domain\",\n },\n { canonical: \"inventory management\", aliases: [], category: \"domain\" },\n { canonical: \"procurement\", aliases: [], category: \"domain\" },\n { canonical: \"vendor management\", aliases: [], category: \"domain\" },\n { canonical: \"logistics\", aliases: [], category: \"domain\" },\n { canonical: \"warehouse management\", aliases: [], category: \"domain\" },\n { canonical: \"demand planning\", aliases: [], category: \"domain\" },\n { canonical: \"manufacturing\", aliases: [], category: \"domain\" },\n { canonical: \"quality control\", aliases: [], category: \"domain\" },\n { canonical: \"lean manufacturing\", aliases: [], category: \"domain\" },\n // customer service domain\n {\n canonical: \"customer support\",\n aliases: [\"customer service\"],\n category: \"domain\",\n },\n { canonical: \"technical support\", aliases: [], category: \"domain\" },\n { canonical: \"conflict resolution\", aliases: [], category: \"domain\" },\n { canonical: \"customer success\", aliases: [], category: \"domain\" },\n { canonical: \"help desk\", aliases: [\"helpdesk\"], category: \"domain\" },\n // soft skills\n { canonical: \"communication\", aliases: [], category: \"soft\" },\n { canonical: \"written communication\", aliases: [], category: \"soft\" },\n { canonical: \"verbal communication\", aliases: [], category: \"soft\" },\n { canonical: \"leadership\", aliases: [], category: \"soft\" },\n { canonical: \"team leadership\", aliases: [], category: \"soft\" },\n { canonical: \"teamwork\", aliases: [\"collaboration\"], category: \"soft\" },\n {\n canonical: \"cross-functional collaboration\",\n aliases: [\"cross functional collaboration\"],\n category: \"soft\",\n },\n {\n canonical: \"problem solving\",\n aliases: [\"problem-solving\"],\n category: \"soft\",\n },\n { canonical: \"adaptability\", aliases: [\"flexibility\"], category: \"soft\" },\n { canonical: \"time management\", aliases: [], category: \"soft\" },\n { canonical: \"critical thinking\", aliases: [], category: \"soft\" },\n { canonical: \"creativity\", aliases: [], category: \"soft\" },\n { canonical: \"attention to detail\", aliases: [], category: \"soft\" },\n {\n canonical: \"decision making\",\n aliases: [\"decision-making\"],\n category: \"soft\",\n },\n { canonical: \"emotional intelligence\", aliases: [], category: \"soft\" },\n { canonical: \"negotiation\", aliases: [], category: \"soft\" },\n {\n canonical: \"organization\",\n aliases: [\"organizational skills\"],\n category: \"soft\",\n },\n {\n canonical: \"public speaking\",\n aliases: [\"presentation skills\"],\n category: \"soft\",\n },\n { canonical: \"mentoring\", aliases: [\"coaching\"], category: \"soft\" },\n { canonical: \"interpersonal skills\", aliases: [], category: \"soft\" },\n { canonical: \"work ethic\", aliases: [], category: \"soft\" },\n { canonical: \"stakeholder communication\", aliases: [], category: \"soft\" },\n {\n canonical: \"self-motivation\",\n aliases: [\"self motivation\"],\n category: \"soft\",\n },\n { canonical: \"resilience\", aliases: [], category: \"soft\" },\n { canonical: \"empathy\", aliases: [], category: \"soft\" },\n { canonical: \"active listening\", aliases: [], category: \"soft\" },\n { canonical: \"delegation\", aliases: [], category: \"soft\" },\n { canonical: \"strategic thinking\", aliases: [], category: \"soft\" },\n { canonical: \"multitasking\", aliases: [], category: \"soft\" },\n // marketing\n {\n canonical: \"seo\",\n aliases: [\"search engine optimization\"],\n category: \"marketing\",\n },\n {\n canonical: \"sem\",\n aliases: [\"search engine marketing\"],\n category: \"marketing\",\n },\n { canonical: \"branding\", aliases: [\"brand strategy\"], category: \"marketing\" },\n { canonical: \"campaign management\", aliases: [], category: \"marketing\" },\n { canonical: \"content marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"content strategy\", aliases: [], category: \"marketing\" },\n {\n canonical: \"social media marketing\",\n aliases: [\"social media\"],\n category: \"marketing\",\n },\n { canonical: \"email marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"digital marketing\", aliases: [], category: \"marketing\" },\n {\n canonical: \"growth marketing\",\n aliases: [\"growth hacking\"],\n category: \"marketing\",\n },\n { canonical: \"copywriting\", aliases: [], category: \"marketing\" },\n { canonical: \"market research\", aliases: [], category: \"marketing\" },\n {\n canonical: \"ppc\",\n aliases: [\"pay-per-click\", \"google ads\"],\n category: \"marketing\",\n },\n {\n canonical: \"conversion rate optimization\",\n aliases: [\"cro\"],\n category: \"marketing\",\n },\n { canonical: \"public relations\", aliases: [\"pr\"], category: \"marketing\" },\n { canonical: \"marketing automation\", aliases: [], category: \"marketing\" },\n { canonical: \"affiliate marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"influencer marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"product marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"event marketing\", aliases: [], category: \"marketing\" },\n { canonical: \"brand awareness\", aliases: [], category: \"marketing\" },\n { canonical: \"media planning\", aliases: [], category: \"marketing\" },\n { canonical: \"lead nurturing\", aliases: [], category: \"marketing\" },\n];\n\nexport const defaultSkillAliases = deriveSkillAliases(defaultKeywordRegistry);\n\nexport const softwareEngineerProfile: ATSProfile = {\n name: \"software-engineer\",\n mandatorySkills: [\"javascript\", \"typescript\", \"react\", \"node\"],\n optionalSkills: [\"graphql\", \"sql\", \"docker\"],\n minExperience: 3,\n};\n\nexport const dataScientistProfile: ATSProfile = {\n name: \"data-scientist\",\n mandatorySkills: [\"python\", \"sql\", \"statistics\"],\n optionalSkills: [\"pandas\", \"numpy\", \"pytorch\", \"tensorflow\"],\n minExperience: 2,\n};\n\nexport const productManagerProfile: ATSProfile = {\n name: \"product-manager\",\n mandatorySkills: [\"roadmap\", \"stakeholder management\", \"prioritization\"],\n optionalSkills: [\"a/b testing\", \"analytics\", \"sql\"],\n minExperience: 3,\n};\n\nexport const defaultProfiles: ATSProfile[] = [\n softwareEngineerProfile,\n dataScientistProfile,\n productManagerProfile,\n];\n"]}
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
interface EmploymentGap {
|
|
2
|
+
/** Title (or company/fallback label) of the role worked immediately before the gap. */
|
|
3
|
+
afterRole: string;
|
|
4
|
+
months: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** ATS-relevant parseability signals extracted from a resume's raw text. */
|
|
8
|
+
interface FormattingSignals {
|
|
9
|
+
/** Pipe/tab/aligned-space table structure (reuses containsTableLikeStructure). */
|
|
10
|
+
hasTables: boolean;
|
|
11
|
+
/** Very wide, inconsistent whitespace gaps suggesting a PDF-extracted multi-column layout. */
|
|
12
|
+
hasMultiColumn: boolean;
|
|
13
|
+
/** Control chars / private-use-area glyphs (icon fonts) / replacement chars from a bad extraction. */
|
|
14
|
+
hasSpecialChars: boolean;
|
|
15
|
+
/** Bullets other than the common -, *, •, o, numbered/lettered list markers. */
|
|
16
|
+
nonStandardBullets: boolean;
|
|
17
|
+
/** Text density/shape consistent with a scanned image (no embedded text layer) rather than real text. */
|
|
18
|
+
likelyScanned: boolean;
|
|
19
|
+
/** A plausible email address is present in the raw text (contact info is extractable). */
|
|
20
|
+
contactParseable: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type Seniority = "junior" | "mid" | "senior" | "lead" | "principal";
|
|
24
|
+
|
|
1
25
|
type ResumeSection = "summary" | "experience" | "skills" | "education" | "projects" | "certifications";
|
|
2
26
|
interface ParsedDateRange {
|
|
3
27
|
raw?: string;
|
|
@@ -16,6 +40,8 @@ interface ParsedExperienceEntry {
|
|
|
16
40
|
location?: string;
|
|
17
41
|
dates?: ParsedDateRange;
|
|
18
42
|
description?: string;
|
|
43
|
+
/** Skills mentioned within this role's bullets, resolved via the alias/fuzzy registry lookup. */
|
|
44
|
+
skills: string[];
|
|
19
45
|
}
|
|
20
46
|
interface ParsedAchievement {
|
|
21
47
|
text: string;
|
|
@@ -51,7 +77,15 @@ interface ParsedResume {
|
|
|
51
77
|
contact?: {
|
|
52
78
|
email?: string;
|
|
53
79
|
phone?: string;
|
|
80
|
+
linkedin?: string;
|
|
81
|
+
location?: string;
|
|
54
82
|
};
|
|
83
|
+
/** Inferred overall seniority (highest-ranked signal across job titles), or undefined if unknown. */
|
|
84
|
+
seniority?: Seniority;
|
|
85
|
+
/** Gaps of minGapMonths+ between consecutive (chronologically merged) roles. */
|
|
86
|
+
employmentGaps: EmploymentGap[];
|
|
87
|
+
/** ATS-relevant parseability/formatting signals extracted from the raw text. */
|
|
88
|
+
formatting: FormattingSignals;
|
|
55
89
|
warnings: string[];
|
|
56
90
|
}
|
|
57
91
|
/** A JD's "N+ years of <skill>" requirement, e.g. { skill: "figma", years: 5 }. */
|
|
@@ -73,95 +107,8 @@ interface ParsedJobDescription {
|
|
|
73
107
|
/** canonical keyword -> the surface form (original casing/spelling) the JD used. */
|
|
74
108
|
keywordSurfaceForms: Record<string, string>;
|
|
75
109
|
requiredLanguages: ParsedLanguage[];
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
interface ATSWeights {
|
|
79
|
-
skills: number;
|
|
80
|
-
experience: number;
|
|
81
|
-
keywords: number;
|
|
82
|
-
education: number;
|
|
83
|
-
}
|
|
84
|
-
type SkillAliases = Record<string, string[]>;
|
|
85
|
-
type KeywordCategory = "technical" | "tool" | "concept" | "soft" | "marketing" | "domain";
|
|
86
|
-
interface KeywordEntry {
|
|
87
|
-
canonical: string;
|
|
88
|
-
aliases: string[];
|
|
89
|
-
category: KeywordCategory;
|
|
90
|
-
}
|
|
91
|
-
type KeywordRegistry = KeywordEntry[];
|
|
92
|
-
interface ATSProfile {
|
|
93
|
-
name: string;
|
|
94
|
-
mandatorySkills: string[];
|
|
95
|
-
optionalSkills: string[];
|
|
96
|
-
minExperience?: number;
|
|
97
|
-
}
|
|
98
|
-
interface KeywordDensityConfig {
|
|
99
|
-
/** Minimum density before a keyword is considered underused (informational only). */
|
|
100
|
-
min: number;
|
|
101
|
-
/** Maximum density before a keyword is considered stuffed. */
|
|
102
|
-
max: number;
|
|
103
|
-
/** Penalty applied when density exceeds max. */
|
|
104
|
-
overusePenalty: number;
|
|
105
|
-
}
|
|
106
|
-
interface SectionPenaltyConfig {
|
|
107
|
-
missingSummary?: number;
|
|
108
|
-
missingExperience?: number;
|
|
109
|
-
missingSkills?: number;
|
|
110
|
-
missingEducation?: number;
|
|
111
|
-
/** Penalty when no parseable contact email is detected. Defaults to 0 (warning-only). */
|
|
112
|
-
missingContact?: number;
|
|
113
|
-
}
|
|
114
|
-
interface ATSRule {
|
|
115
|
-
id: string;
|
|
116
|
-
description?: string;
|
|
117
|
-
penalty: number;
|
|
118
|
-
warning?: string;
|
|
119
|
-
condition: (context: RuleContext) => boolean;
|
|
120
|
-
}
|
|
121
|
-
interface ATSConfig {
|
|
122
|
-
weights?: Partial<ATSWeights>;
|
|
123
|
-
skillAliases?: SkillAliases;
|
|
124
|
-
/** Categorized keyword/alias entries (technical, tool, concept, soft, marketing, domain). Merges over the default registry by canonical term. */
|
|
125
|
-
keywordRegistry?: KeywordRegistry;
|
|
126
|
-
profile?: ATSProfile;
|
|
127
|
-
rules?: ATSRule[];
|
|
128
|
-
keywordDensity?: KeywordDensityConfig;
|
|
129
|
-
sectionPenalties?: SectionPenaltyConfig;
|
|
130
|
-
allowPartialMatches?: boolean;
|
|
131
|
-
/**
|
|
132
|
-
* ISO date string (e.g. "2024-06-01") used as the "today" reference when
|
|
133
|
-
* computing duration for open-ended date ranges ("Present"/"Current"/"Now").
|
|
134
|
-
* Omit to use the actual current date (live/production behaviour).
|
|
135
|
-
* Set to a fixed value in tests or batch processing to guarantee determinism.
|
|
136
|
-
*/
|
|
137
|
-
referenceDate?: string;
|
|
138
|
-
}
|
|
139
|
-
interface NormalizedWeights extends ATSWeights {
|
|
140
|
-
/** Weights normalized so they sum to 1. */
|
|
141
|
-
normalizedTotal: number;
|
|
142
|
-
}
|
|
143
|
-
interface ResolvedATSConfig {
|
|
144
|
-
weights: NormalizedWeights;
|
|
145
|
-
skillAliases: SkillAliases;
|
|
146
|
-
keywordRegistry: KeywordRegistry;
|
|
147
|
-
/** canonical term -> category, derived once from keywordRegistry. */
|
|
148
|
-
categoryIndex: Map<string, KeywordCategory>;
|
|
149
|
-
profile?: ATSProfile;
|
|
150
|
-
rules: ATSRule[];
|
|
151
|
-
keywordDensity: KeywordDensityConfig;
|
|
152
|
-
sectionPenalties: Required<SectionPenaltyConfig>;
|
|
153
|
-
allowPartialMatches: boolean;
|
|
154
|
-
/** Resolved reference date for "Present" duration calculations. */
|
|
155
|
-
referenceDate?: Date;
|
|
156
|
-
}
|
|
157
|
-
interface RuleContext {
|
|
158
|
-
resume: ParsedResume;
|
|
159
|
-
job: ParsedJobDescription;
|
|
160
|
-
weights: NormalizedWeights;
|
|
161
|
-
keywordDensity: KeywordDensityConfig;
|
|
162
|
-
breakdown?: ATSBreakdown;
|
|
163
|
-
matchedKeywords?: string[];
|
|
164
|
-
overusedKeywords?: string[];
|
|
110
|
+
/** Inferred seniority cue from the JD's role/title text, or undefined if unknown. */
|
|
111
|
+
seniority?: Seniority;
|
|
165
112
|
}
|
|
166
113
|
|
|
167
114
|
/**
|
|
@@ -274,8 +221,32 @@ interface ATSBreakdown {
|
|
|
274
221
|
skills: number;
|
|
275
222
|
experience: number;
|
|
276
223
|
keywords: number;
|
|
224
|
+
/** Real-ATS parseability score (0-100) — formatting, contact extractability, section coverage. */
|
|
225
|
+
parseability: number;
|
|
277
226
|
education: number;
|
|
278
227
|
}
|
|
228
|
+
/** One point deduction applied while computing the parseability score. */
|
|
229
|
+
interface ParseabilityDeduction {
|
|
230
|
+
reason: string;
|
|
231
|
+
points: number;
|
|
232
|
+
}
|
|
233
|
+
/** Detail behind `breakdown.parseability` — the formatting signals plus what was deducted and why. */
|
|
234
|
+
interface ParseabilityReport extends FormattingSignals {
|
|
235
|
+
/** Number of standard resume sections the parser detected. */
|
|
236
|
+
detectedSectionCount: number;
|
|
237
|
+
/** Ordered list of deductions applied to get from 100 down to `breakdown.parseability`. */
|
|
238
|
+
deductions: ParseabilityDeduction[];
|
|
239
|
+
}
|
|
240
|
+
/** Comparison between the resume's inferred seniority and the JD's required seniority. */
|
|
241
|
+
interface SeniorityMatch {
|
|
242
|
+
resume?: Seniority;
|
|
243
|
+
required?: Seniority;
|
|
244
|
+
/**
|
|
245
|
+
* True when the resume's seniority rank is >= the JD's required rank, or when either side
|
|
246
|
+
* is unknown (we never penalize on missing signal — only on a confirmed mismatch).
|
|
247
|
+
*/
|
|
248
|
+
met: boolean;
|
|
249
|
+
}
|
|
279
250
|
interface AnalyzeResumeInput {
|
|
280
251
|
resumeText: string;
|
|
281
252
|
jobDescription: string;
|
|
@@ -338,6 +309,131 @@ interface ATSAnalysisResult {
|
|
|
338
309
|
requiredYears: number;
|
|
339
310
|
resumeYears: number;
|
|
340
311
|
}[];
|
|
312
|
+
/** Detail behind `breakdown.parseability` — which formatting signals were detected and penalized. */
|
|
313
|
+
parseabilityReport: ParseabilityReport;
|
|
314
|
+
/** Gaps of 3+ months between consecutive (chronologically merged) roles. Informational only. */
|
|
315
|
+
employmentGaps: EmploymentGap[];
|
|
316
|
+
/** Resume vs JD-required seniority comparison. Informational only outside its modest, capped
|
|
317
|
+
* contribution to `breakdown.experience` (see scorer.ts). */
|
|
318
|
+
seniorityMatch: SeniorityMatch;
|
|
319
|
+
/**
|
|
320
|
+
* Per-skill years of experience derived from per-role dating (sum of durations of roles whose
|
|
321
|
+
* bullets mention that skill), replacing the old "assume the skill spans the whole resume
|
|
322
|
+
* tenure" approximation. Informational only — does not feed `score`/`breakdown`.
|
|
323
|
+
*/
|
|
324
|
+
perSkillExperience: {
|
|
325
|
+
skill: string;
|
|
326
|
+
years: number;
|
|
327
|
+
}[];
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
interface ATSWeights {
|
|
331
|
+
skills: number;
|
|
332
|
+
experience: number;
|
|
333
|
+
keywords: number;
|
|
334
|
+
/** How much the resume's real-ATS parseability (formatting/contact/sections) counts toward score. */
|
|
335
|
+
parseability: number;
|
|
336
|
+
education: number;
|
|
337
|
+
}
|
|
338
|
+
type SkillAliases = Record<string, string[]>;
|
|
339
|
+
type KeywordCategory = "technical" | "tool" | "concept" | "soft" | "marketing" | "domain";
|
|
340
|
+
interface KeywordEntry {
|
|
341
|
+
canonical: string;
|
|
342
|
+
aliases: string[];
|
|
343
|
+
category: KeywordCategory;
|
|
344
|
+
}
|
|
345
|
+
type KeywordRegistry = KeywordEntry[];
|
|
346
|
+
interface ATSProfile {
|
|
347
|
+
name: string;
|
|
348
|
+
mandatorySkills: string[];
|
|
349
|
+
optionalSkills: string[];
|
|
350
|
+
minExperience?: number;
|
|
351
|
+
}
|
|
352
|
+
interface KeywordDensityConfig {
|
|
353
|
+
/** Minimum density before a keyword is considered underused (informational only). */
|
|
354
|
+
min: number;
|
|
355
|
+
/** Maximum density before a keyword is considered stuffed. */
|
|
356
|
+
max: number;
|
|
357
|
+
/** Penalty applied when density exceeds max. */
|
|
358
|
+
overusePenalty: number;
|
|
359
|
+
}
|
|
360
|
+
interface SectionPenaltyConfig {
|
|
361
|
+
missingSummary?: number;
|
|
362
|
+
missingExperience?: number;
|
|
363
|
+
missingSkills?: number;
|
|
364
|
+
missingEducation?: number;
|
|
365
|
+
/**
|
|
366
|
+
* Penalty when no parseable contact email is detected. Defaults to 12 — a real ATS treats
|
|
367
|
+
* unparseable contact info as a near-knockout (recruiters/automated outreach can't reach the
|
|
368
|
+
* candidate at all), so this is deliberately more than a token warning-only value.
|
|
369
|
+
*/
|
|
370
|
+
missingContact?: number;
|
|
371
|
+
}
|
|
372
|
+
interface MatchingConfig {
|
|
373
|
+
/**
|
|
374
|
+
* Fall back to stemmed/fuzzy matching (typos, word-form variants like "developing" vs
|
|
375
|
+
* "develop", "ReactJS" vs "react") when an exact alias lookup misses. Default: true.
|
|
376
|
+
* Set to false to reproduce pre-v2 exact-match-only behavior.
|
|
377
|
+
*/
|
|
378
|
+
fuzzy?: boolean;
|
|
379
|
+
/** Passed through to fuzzyEqual's bounded Levenshtein distance when fuzzy matching is enabled. */
|
|
380
|
+
threshold?: number;
|
|
381
|
+
}
|
|
382
|
+
interface ATSRule {
|
|
383
|
+
id: string;
|
|
384
|
+
description?: string;
|
|
385
|
+
penalty: number;
|
|
386
|
+
warning?: string;
|
|
387
|
+
condition: (context: RuleContext) => boolean;
|
|
388
|
+
}
|
|
389
|
+
interface ATSConfig {
|
|
390
|
+
weights?: Partial<ATSWeights>;
|
|
391
|
+
skillAliases?: SkillAliases;
|
|
392
|
+
/** Categorized keyword/alias entries (technical, tool, concept, soft, marketing, domain). Merges over the default registry by canonical term. */
|
|
393
|
+
keywordRegistry?: KeywordRegistry;
|
|
394
|
+
profile?: ATSProfile;
|
|
395
|
+
rules?: ATSRule[];
|
|
396
|
+
keywordDensity?: KeywordDensityConfig;
|
|
397
|
+
sectionPenalties?: SectionPenaltyConfig;
|
|
398
|
+
allowPartialMatches?: boolean;
|
|
399
|
+
/** Stemmed/fuzzy matching behavior for skills/keywords. Defaults to `{ fuzzy: true }`. */
|
|
400
|
+
matching?: MatchingConfig;
|
|
401
|
+
/**
|
|
402
|
+
* ISO date string (e.g. "2024-06-01") used as the "today" reference when
|
|
403
|
+
* computing duration for open-ended date ranges ("Present"/"Current"/"Now").
|
|
404
|
+
* Omit to use the actual current date (live/production behaviour).
|
|
405
|
+
* Set to a fixed value in tests or batch processing to guarantee determinism.
|
|
406
|
+
*/
|
|
407
|
+
referenceDate?: string;
|
|
408
|
+
}
|
|
409
|
+
interface NormalizedWeights extends ATSWeights {
|
|
410
|
+
/** Weights normalized so they sum to 1. */
|
|
411
|
+
normalizedTotal: number;
|
|
412
|
+
}
|
|
413
|
+
interface ResolvedATSConfig {
|
|
414
|
+
weights: NormalizedWeights;
|
|
415
|
+
skillAliases: SkillAliases;
|
|
416
|
+
keywordRegistry: KeywordRegistry;
|
|
417
|
+
/** canonical term -> category, derived once from keywordRegistry. */
|
|
418
|
+
categoryIndex: Map<string, KeywordCategory>;
|
|
419
|
+
profile?: ATSProfile;
|
|
420
|
+
rules: ATSRule[];
|
|
421
|
+
keywordDensity: KeywordDensityConfig;
|
|
422
|
+
sectionPenalties: Required<SectionPenaltyConfig>;
|
|
423
|
+
allowPartialMatches: boolean;
|
|
424
|
+
/** Resolved matching behavior; `fuzzy` is always defined (defaults to true). */
|
|
425
|
+
matching: Required<Pick<MatchingConfig, "fuzzy">> & Pick<MatchingConfig, "threshold">;
|
|
426
|
+
/** Resolved reference date for "Present" duration calculations. */
|
|
427
|
+
referenceDate?: Date;
|
|
428
|
+
}
|
|
429
|
+
interface RuleContext {
|
|
430
|
+
resume: ParsedResume;
|
|
431
|
+
job: ParsedJobDescription;
|
|
432
|
+
weights: NormalizedWeights;
|
|
433
|
+
keywordDensity: KeywordDensityConfig;
|
|
434
|
+
breakdown?: ATSBreakdown;
|
|
435
|
+
matchedKeywords?: string[];
|
|
436
|
+
overusedKeywords?: string[];
|
|
341
437
|
}
|
|
342
438
|
|
|
343
|
-
export type { ATSProfile as A, JSONSchema as J, KeywordRegistry as K, LLMConfig as L, NormalizedWeights as N, ParsedDateRange as P, ResolvedATSConfig as R, SkillAliases as S, LLMResult as a, LLMBudget as b, AnalyzeResumeInput as c, ATSAnalysisResult as d, ATSWeights as e, KeywordCategory as f, KeywordEntry as g, KeywordDensityConfig as h, SectionPenaltyConfig as i, ATSRule as j, ATSConfig as k, RuleContext as l, ResumeSection as m, ParsedExperienceEntry as n, ParsedAchievement as o, ParsedLanguage as p, ParsedResume as q, SkillExperienceRequirement as r, ParsedJobDescription as s, ATSBreakdown as t,
|
|
439
|
+
export type { ATSProfile as A, AnalyzeResumeInputV2 as B, LLMUsageStats as C, JSONSchema as J, KeywordRegistry as K, LLMConfig as L, MatchingConfig as M, NormalizedWeights as N, ParsedDateRange as P, ResolvedATSConfig as R, SkillAliases as S, LLMResult as a, LLMBudget as b, AnalyzeResumeInput as c, ATSAnalysisResult as d, ATSWeights as e, KeywordCategory as f, KeywordEntry as g, KeywordDensityConfig as h, SectionPenaltyConfig as i, ATSRule as j, ATSConfig as k, RuleContext as l, ResumeSection as m, ParsedExperienceEntry as n, ParsedAchievement as o, ParsedLanguage as p, ParsedResume as q, SkillExperienceRequirement as r, ParsedJobDescription as s, ATSBreakdown as t, ParseabilityDeduction as u, ParseabilityReport as v, SeniorityMatch as w, KeywordWeight as x, LLMClient as y, LLMFeatures as z };
|