resume-parser-ats 1.1.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.
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * Prompt templates for the resume parser skill.
4
+ *
5
+ * These templates guide the agent when using the parser tools
6
+ * and when presenting results to the user.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.FULL_PIPELINE_PROMPT = exports.INSIGHTS_PROMPT = exports.ANALYSIS_PROMPT = exports.PARSE_PROMPT = void 0;
10
+ // ---------------------------------------------------------------------------
11
+ // Parse prompt — used when running the initial parsing step
12
+ // ---------------------------------------------------------------------------
13
+ exports.PARSE_PROMPT = `You are a resume parsing specialist. Your job is to deeply parse the provided resume using the 4-step OpenResume algorithm and return structured, clean results.
14
+
15
+ ## Instructions
16
+
17
+ 1. **Step 1 — Extract Text Items**: Read the resume content and identify all text items with their positions, boldness, and line breaks.
18
+ 2. **Step 2 — Group into Lines**: Merge adjacent text items on the same line. Group items by Y-coordinate.
19
+ 3. **Step 3 — Group into Sections**: Detect section titles (bold, UPPERCASE, or keyword match). Assign lines to their section.
20
+ 4. **Step 4 — Extract Attributes**: Use the feature scoring system to identify Name, Email, Phone, Location, School, Degree, GPA, Dates, Job Title, Company, and Skills.
21
+
22
+ ## Output Format
23
+
24
+ Present the parsed results in this table format:
25
+
26
+ ### Profile
27
+ | Field | Value |
28
+ |-----------|-------|
29
+ | Name | ... |
30
+ | Email | ... |
31
+ | Phone | ... |
32
+ | Location | ... |
33
+ | Link | ... |
34
+
35
+ ### Education
36
+ | School | Degree | GPA | Date | Descriptions |
37
+ |---------|---------|------|-------|-------------|
38
+
39
+ ### Work Experience
40
+ | Company | Job Title | Date | Descriptions |
41
+ |----------|------------|-------|-------------|
42
+
43
+ ### Skills
44
+ | Descriptions |
45
+ |-------------|
46
+
47
+ If any field cannot be parsed, mark it as "Not parsed" and explain why in a notes section.`;
48
+ // ---------------------------------------------------------------------------
49
+ // Analysis prompt — used when evaluating ATS compatibility
50
+ // ---------------------------------------------------------------------------
51
+ exports.ANALYSIS_PROMPT = `You are evaluating how well a resume would be parsed by an Application Tracking System (ATS). Use the parsed resume data to compute an ATS compatibility score.
52
+
53
+ ## Scoring Criteria
54
+
55
+ | Category | Weight | Description |
56
+ |----------|--------|-------------|
57
+ | Name extraction | 20 pts | Can the parser identify a name? |
58
+ | Email extraction | 20 pts | Can the parser identify an email? |
59
+ | Phone extraction | 10 pts | Can the parser identify a phone number? |
60
+ | Section detection | 15 pts | Are all key sections detected? |
61
+ | Education parsing | 10 pts | Is school/degree/date parsed correctly? |
62
+ | Experience parsing | 15 pts | Is company/title/date parsed correctly? |
63
+ | Skills parsing | 10 pts | Are skills extracted correctly? |
64
+
65
+ ## Scoring Guide
66
+ - **90-100**: Excellent — resume will parse correctly in nearly all ATS systems
67
+ - **70-89**: Good — minor issues that won't significantly impact ATS parsing
68
+ - **50-69**: Fair — significant issues that will cause problems in some ATS
69
+ - **0-49**: Poor — critical issues that will cause major parsing failures
70
+
71
+ ## Output
72
+
73
+ Provide:
74
+ 1. An ATS Compatibility Score (0-100)
75
+ 2. A letter grade (A+ through F)
76
+ 3. Per-field extraction confidence (high/medium/low/missing)
77
+ 4. A list of format issues grouped by severity (critical/high/medium/low)
78
+ 5. Overall notes and recommendations`;
79
+ // ---------------------------------------------------------------------------
80
+ // Insights prompt — used when generating improvement suggestions
81
+ // ---------------------------------------------------------------------------
82
+ exports.INSIGHTS_PROMPT = `You are a resume improvement advisor. Based on the parsed resume data and ATS analysis, provide actionable, structured suggestions to improve the resume.
83
+
84
+ ## Suggestion Priorities
85
+
86
+ 1. **CRITICAL**: Name or email cannot be parsed → Must fix immediately
87
+ 2. **HIGH**: Key sections missing, dates/phone not parseable → Fix before applying
88
+ 3. **MEDIUM**: Formatting causes merge issues, skills not extracted cleanly → Fix soon
89
+ 4. **LOW**: Minor inconsistencies, optional enhancements → Fix when convenient
90
+
91
+ ## Output Format
92
+
93
+ Present suggestions in this structured format:
94
+
95
+ ## 📊 Resume Parsing Report
96
+
97
+ ### ATS Compatibility Score: XX/100 (Grade: X)
98
+
99
+ ### ✅ Successfully Parsed Fields
100
+ | Field | Parsed Value | Confidence |
101
+ |-------|-------------|------------|
102
+
103
+ ### ⚠️ Issues Found
104
+ | # | Severity | Field | Issue | Suggestion |
105
+ |---|----------|-------|-------|------------|
106
+
107
+ ### 📝 Priority Fixes
108
+ 1. **[Fix Title]**: Description
109
+ - Before: current state
110
+ - After: suggested state
111
+
112
+ ### 💡 Structural Suggestions
113
+ - Suggestion 1
114
+ - Suggestion 2
115
+
116
+ ### 📋 Section-by-Section Analysis
117
+ #### Profile
118
+ - Analysis...
119
+
120
+ #### Education
121
+ - Analysis...
122
+
123
+ #### Work Experience
124
+ - Analysis...
125
+
126
+ #### Skills
127
+ - Analysis...
128
+
129
+ Every suggestion must be specific and actionable. Don't say "improve formatting" — say "Move the date to the same line as the company name and use the format 'Month Year–Present'."`;
130
+ // ---------------------------------------------------------------------------
131
+ // Combined prompt — used for full pipeline runs
132
+ // ---------------------------------------------------------------------------
133
+ exports.FULL_PIPELINE_PROMPT = `You are a resume parsing and analysis expert. Run the complete 4-step parsing algorithm on the provided resume, then analyze the results and provide actionable improvement suggestions.
134
+
135
+ ## Pipeline Steps
136
+
137
+ 1. **Parse**: Follow the 4-step OpenResume algorithm (text items → lines → sections → attributes)
138
+ 2. **Analyze**: Score ATS compatibility and identify format issues
139
+ 3. **Suggest**: Provide prioritized, structured fix suggestions
140
+
141
+ ## Important Rules
142
+
143
+ - Always run all 4 parsing steps — do not skip steps
144
+ - Every suggestion must explain WHY it matters in ATS terms
145
+ - Prioritize Name and Email extraction — if they fail, flag as CRITICAL
146
+ - Compare parsed output vs. likely intended content to surface discrepancies
147
+ - Never modify the original file — this is a read-only analysis tool
148
+
149
+ Provide the complete report following the format in the insights prompt template.`;
150
+ //# sourceMappingURL=parser-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-prompt.js","sourceRoot":"","sources":["../../../src/prompts/parser-prompt.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAEjE,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2FAkC+D,CAAC;AAE5F,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAEjE,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA2BM,CAAC;AAEtC,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAEjE,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qLA+CsJ,CAAC;AAEtL,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAEjE,QAAA,oBAAoB,GAAG;;;;;;;;;;;;;;;;kFAgB8C,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Resume Analysis Tool
3
+ *
4
+ * Takes parsed resume data and computes an ATS compatibility score
5
+ * along with per-field extraction confidence ratings.
6
+ */
7
+ import type { ParsedResume } from "../index";
8
+ export interface AnalyzeResumeInput {
9
+ filePath?: string;
10
+ rawText?: string;
11
+ parsedResume: ParsedResume;
12
+ strictness?: "lenient" | "moderate" | "strict";
13
+ }
14
+ export interface FieldAnalysis {
15
+ field: string;
16
+ value: string | null;
17
+ confidence: "high" | "medium" | "low" | "missing";
18
+ score: number;
19
+ maxScore: number;
20
+ notes: string[];
21
+ }
22
+ export interface SectionAnalysis {
23
+ section: string;
24
+ detected: boolean;
25
+ lineCount: number;
26
+ subsectionCount: number;
27
+ issues: string[];
28
+ }
29
+ export interface AnalyzeResumeOutput {
30
+ success: boolean;
31
+ data: {
32
+ atsScore: number;
33
+ atsGrade: string;
34
+ fieldAnalyses: FieldAnalysis[];
35
+ sectionAnalyses: SectionAnalysis[];
36
+ overallNotes: string[];
37
+ formatIssues: FormatIssue[];
38
+ };
39
+ metadata: {
40
+ parserVersion: string;
41
+ strictness: string;
42
+ };
43
+ }
44
+ export interface FormatIssue {
45
+ severity: "critical" | "high" | "medium" | "low";
46
+ category: "parsing" | "formatting" | "content" | "structure";
47
+ description: string;
48
+ affectedFields: string[];
49
+ suggestion: string;
50
+ }
51
+ export declare function analyzeResume(input: AnalyzeResumeInput): AnalyzeResumeOutput;
52
+ //# sourceMappingURL=analyze-resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-resume.d.ts","sourceRoot":"","sources":["../../../src/tools/analyze-resume.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,aAAa,EAAE,CAAC;QAC/B,eAAe,EAAE,eAAe,EAAE,CAAC;QACnC,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,YAAY,EAAE,WAAW,EAAE,CAAC;KAC7B,CAAC;IACF,QAAQ,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAsMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CA4G5E"}
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ /**
3
+ * Resume Analysis Tool
4
+ *
5
+ * Takes parsed resume data and computes an ATS compatibility score
6
+ * along with per-field extraction confidence ratings.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.analyzeResume = analyzeResume;
10
+ // ---------------------------------------------------------------------------
11
+ // Scoring weights based on strictness
12
+ // ---------------------------------------------------------------------------
13
+ const SCORING_WEIGHTS = {
14
+ lenient: {
15
+ name: 15,
16
+ email: 15,
17
+ phone: 5,
18
+ location: 5,
19
+ sections: 15,
20
+ education: 10,
21
+ experience: 15,
22
+ skills: 10,
23
+ formatting: 10,
24
+ },
25
+ moderate: {
26
+ name: 20,
27
+ email: 20,
28
+ phone: 10,
29
+ location: 5,
30
+ sections: 15,
31
+ education: 10,
32
+ experience: 15,
33
+ skills: 10,
34
+ formatting: 5,
35
+ },
36
+ strict: {
37
+ name: 25,
38
+ email: 25,
39
+ phone: 10,
40
+ location: 5,
41
+ sections: 10,
42
+ education: 10,
43
+ experience: 15,
44
+ skills: 10,
45
+ formatting: 0,
46
+ },
47
+ };
48
+ // Weight keys derived from SCORING_WEIGHTS structure
49
+ // Used for iterating over weight categories
50
+ // ---------------------------------------------------------------------------
51
+ // Field analysis helpers
52
+ // ---------------------------------------------------------------------------
53
+ function analyzeField(field, value, regex, strictness) {
54
+ const notes = [];
55
+ let confidence = "missing";
56
+ let score = 0;
57
+ const maxScore = 10;
58
+ if (!value) {
59
+ notes.push(`${field} could not be extracted from the resume`);
60
+ if (strictness === "strict")
61
+ notes.push("Critical for ATS — most systems require this field");
62
+ }
63
+ else {
64
+ if (regex && regex.test(value)) {
65
+ confidence = "high";
66
+ score = 10;
67
+ notes.push(`${field} was successfully parsed and matches expected format`);
68
+ }
69
+ else if (value.length > 0) {
70
+ confidence = "medium";
71
+ score = 7;
72
+ notes.push(`${field} was extracted but may not match expected format`);
73
+ if (regex)
74
+ notes.push(`Expected pattern: ${regex.source}`);
75
+ }
76
+ }
77
+ return { field, value, confidence, score, maxScore, notes };
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Format issue detection
81
+ // ---------------------------------------------------------------------------
82
+ function detectFormatIssues(resume, _fieldAnalyses) {
83
+ const issues = [];
84
+ // CRITICAL: Name or Email missing
85
+ if (!resume.profile.name) {
86
+ issues.push({
87
+ severity: "critical",
88
+ category: "parsing",
89
+ description: "Name could not be parsed from the resume",
90
+ affectedFields: ["name"],
91
+ suggestion: "Ensure your name is on the first line, is bolded, and contains only letters and spaces. Avoid special characters or formatting that could confuse an ATS.",
92
+ });
93
+ }
94
+ if (!resume.profile.email) {
95
+ issues.push({
96
+ severity: "critical",
97
+ category: "parsing",
98
+ description: "Email could not be parsed from the resume",
99
+ affectedFields: ["email"],
100
+ suggestion: "Ensure your email follows the format name@domain.com and is on its own line. Avoid embedding it in other text.",
101
+ });
102
+ }
103
+ // HIGH: Phone missing
104
+ if (!resume.profile.phone) {
105
+ issues.push({
106
+ severity: "high",
107
+ category: "parsing",
108
+ description: "Phone number could not be parsed",
109
+ affectedFields: ["phone"],
110
+ suggestion: "Use a standard phone format like (123) 456-7890 or 123-456-7890. Avoid formatting like +1.234.567.8901 that may confuse parsers.",
111
+ });
112
+ }
113
+ // MEDIUM: Section detection issues
114
+ const expectedSections = ["EDUCATION", "EXPERIENCE", "SKILLS"];
115
+ for (const expected of expectedSections) {
116
+ const found = resume.sections.some((s) => s.title.toUpperCase() === expected);
117
+ if (!found) {
118
+ issues.push({
119
+ severity: "medium",
120
+ category: "structure",
121
+ description: `Expected section "${expected}" was not detected`,
122
+ affectedFields: [expected.toLowerCase()],
123
+ suggestion: `Add a clearly titled "${expected}" section in UPPERCASE and bolded so ATS can identify it.`,
124
+ });
125
+ }
126
+ }
127
+ // MEDIUM: Empty descriptions in experience
128
+ for (const exp of resume.experience) {
129
+ if (exp.descriptions.length === 0) {
130
+ issues.push({
131
+ severity: "medium",
132
+ category: "content",
133
+ description: `Work experience at "${exp.company || "unknown company"}" has no bullet points`,
134
+ affectedFields: ["experience"],
135
+ suggestion: "Add bullet points starting with • or - describing your achievements and responsibilities. Use action verbs and quantify results when possible.",
136
+ });
137
+ }
138
+ }
139
+ // LOW: Location missing
140
+ if (!resume.profile.location) {
141
+ issues.push({
142
+ severity: "low",
143
+ category: "content",
144
+ description: "Location (City, State) could not be parsed",
145
+ affectedFields: ["location"],
146
+ suggestion: "Add your location in the format 'City, ST' (e.g., 'San Francisco, CA') so ATS can match you to local jobs.",
147
+ });
148
+ }
149
+ // MEDIUM: Check for text item merging issues
150
+ const hasMergIssues = resume.rawTextItems.some((item) => item.text.includes("@") && item.text.length > 50);
151
+ if (hasMergIssues) {
152
+ issues.push({
153
+ severity: "medium",
154
+ category: "formatting",
155
+ description: "Some text items appear to be improperly merged",
156
+ affectedFields: ["formatting"],
157
+ suggestion: "Use consistent spacing between elements. Avoid placing email, phone, and other contact info on the same line.",
158
+ });
159
+ }
160
+ return issues;
161
+ }
162
+ // ---------------------------------------------------------------------------
163
+ // Grade helper
164
+ // ---------------------------------------------------------------------------
165
+ function scoreToGrade(score) {
166
+ if (score >= 90)
167
+ return "A+";
168
+ if (score >= 85)
169
+ return "A";
170
+ if (score >= 80)
171
+ return "A-";
172
+ if (score >= 75)
173
+ return "B+";
174
+ if (score >= 70)
175
+ return "B";
176
+ if (score >= 65)
177
+ return "B-";
178
+ if (score >= 60)
179
+ return "C+";
180
+ if (score >= 55)
181
+ return "C";
182
+ if (score >= 50)
183
+ return "C-";
184
+ if (score >= 40)
185
+ return "D";
186
+ return "F";
187
+ }
188
+ // ---------------------------------------------------------------------------
189
+ // Main analysis function
190
+ // ---------------------------------------------------------------------------
191
+ function analyzeResume(input) {
192
+ const { parsedResume, strictness = "moderate" } = input;
193
+ const weights = SCORING_WEIGHTS[strictness];
194
+ // Field analyses
195
+ const fieldAnalyses = [
196
+ analyzeField("name", parsedResume.profile.name, /^[a-zA-Z\s\.]+$/, strictness),
197
+ analyzeField("email", parsedResume.profile.email, /\S+@\S+\.\S+/, strictness),
198
+ analyzeField("phone", parsedResume.profile.phone, /\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/, strictness),
199
+ analyzeField("location", parsedResume.profile.location, /[A-Z][a-zA-Z\s]+,\s*[A-Z]{2}/, strictness),
200
+ analyzeField("url", parsedResume.profile.url, /\S+\.[a-z]+\/\S+/, strictness),
201
+ ];
202
+ // Section analyses
203
+ const sectionAnalyses = parsedResume.sections.map((s) => ({
204
+ section: s.title,
205
+ detected: true,
206
+ lineCount: s.lines.length,
207
+ subsectionCount: s.lines.length > 0 ? 1 : 0,
208
+ issues: s.lines.length === 0 ? [`${s.title} section is empty`] : [],
209
+ }));
210
+ // Check for missing common sections
211
+ const commonSections = ["EDUCATION", "EXPERIENCE", "SKILLS"];
212
+ for (const cs of commonSections) {
213
+ const found = parsedResume.sections.some((s) => s.title === cs);
214
+ if (!found) {
215
+ sectionAnalyses.push({
216
+ section: cs,
217
+ detected: false,
218
+ lineCount: 0,
219
+ subsectionCount: 0,
220
+ issues: [`${cs} section was not found in the resume`],
221
+ });
222
+ }
223
+ }
224
+ // Detect format issues
225
+ const formatIssues = detectFormatIssues(parsedResume, fieldAnalyses);
226
+ // Calculate weighted ATS score
227
+ const nameScore = fieldAnalyses.find((f) => f.field === "name").score;
228
+ const emailScore = fieldAnalyses.find((f) => f.field === "email").score;
229
+ const phoneScore = fieldAnalyses.find((f) => f.field === "phone").score;
230
+ const locationScore = fieldAnalyses.find((f) => f.field === "location").score;
231
+ const sectionsWithContent = parsedResume.sections.filter((s) => s.lines.length > 0).length;
232
+ const maxSections = 5;
233
+ const sectionScore = Math.min(10, (sectionsWithContent / maxSections) * 10);
234
+ const hasEducation = parsedResume.education.length > 0;
235
+ const educationScore = hasEducation ? 10 : 0;
236
+ const hasExperience = parsedResume.experience.length > 0;
237
+ const experienceScore = hasExperience ? 10 : 0;
238
+ const hasSkills = parsedResume.skills.length > 0;
239
+ const skillsScore = hasSkills ? 10 : 0;
240
+ const formatScore = formatIssues.filter((i) => i.severity === "low" || i.severity === "medium").length === 0 ? 10 : 5;
241
+ const rawScore = (nameScore / 10) * weights.name +
242
+ (emailScore / 10) * weights.email +
243
+ (phoneScore / 10) * weights.phone +
244
+ (locationScore / 10) * weights.location +
245
+ (sectionScore / 10) * weights.sections +
246
+ (educationScore / 10) * weights.education +
247
+ (experienceScore / 10) * weights.experience +
248
+ (skillsScore / 10) * weights.skills +
249
+ (formatScore / 10) * weights.formatting;
250
+ const totalWeight = Object.values(weights).reduce((a, b) => a + b, 0);
251
+ const atsScore = Math.round((rawScore / totalWeight) * 100);
252
+ const atsGrade = scoreToGrade(atsScore);
253
+ // Overall notes
254
+ const overallNotes = [];
255
+ if (atsScore >= 85) {
256
+ overallNotes.push("Resume is well-formatted and should parse correctly in most ATS systems.");
257
+ }
258
+ else if (atsScore >= 70) {
259
+ overallNotes.push("Resume is reasonably formatted but has some issues that could affect ATS parsing.");
260
+ }
261
+ else if (atsScore >= 50) {
262
+ overallNotes.push("Resume has significant formatting issues that will likely cause ATS parsing problems.");
263
+ }
264
+ else {
265
+ overallNotes.push("Resume has critical formatting issues that will severely impact ATS parsing. Immediate action required.");
266
+ }
267
+ if (formatIssues.filter((i) => i.severity === "critical").length > 0) {
268
+ overallNotes.push("Critical issues detected: Name and/or Email cannot be reliably parsed. This will significantly reduce your chances of being found by recruiters.");
269
+ }
270
+ return {
271
+ success: true,
272
+ data: {
273
+ atsScore: Math.min(100, Math.max(0, atsScore)),
274
+ atsGrade,
275
+ fieldAnalyses,
276
+ sectionAnalyses,
277
+ overallNotes,
278
+ formatIssues,
279
+ },
280
+ metadata: {
281
+ parserVersion: "1.0.0",
282
+ strictness,
283
+ },
284
+ };
285
+ }
286
+ //# sourceMappingURL=analyze-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-resume.js","sourceRoot":"","sources":["../../../src/tools/analyze-resume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Step 1–4: Resume Parsing Engine
3
+ *
4
+ * Implements the full OpenResume algorithm:
5
+ * Step 1: Read text items from PDF
6
+ * Step 2: Group text items into lines
7
+ * Step 3: Group lines into sections
8
+ * Step 4: Extract resume attributes from sections via feature scoring
9
+ */
10
+ import type { TextItem, LineItem, SectionItem, ParsedResume } from "../index";
11
+ export interface ParseResumeInput {
12
+ /** Path to a PDF file */
13
+ filePath?: string;
14
+ /** Raw text (fallback if PDF not available) */
15
+ rawText?: string;
16
+ }
17
+ export interface ParseResumeOutput {
18
+ success: boolean;
19
+ data: ParsedResume;
20
+ metadata: {
21
+ parserVersion: string;
22
+ stepsCompleted: number[];
23
+ warnings: string[];
24
+ };
25
+ }
26
+ /**
27
+ * Extract text items from raw resume text (simplified version).
28
+ *
29
+ * In a full implementation this would use pdfjs-dist to extract
30
+ * text items with position, bold, and newline metadata from a PDF.
31
+ * Here we simulate the extraction from raw text input.
32
+ */
33
+ export declare function extractTextItemsFromPDF(filePath: string): Promise<{
34
+ items: TextItem[];
35
+ warnings: string[];
36
+ }>;
37
+ /**
38
+ * Fallback: parse text items from raw text input
39
+ *
40
+ * Heuristics for determining bold/section-title:
41
+ * 1. Known section headers (EDUCATION, EXPERIENCE, etc.) → bold + section title
42
+ * 2. Short ALL-CAPS lines (≤ 40 chars) → bold (but NOT a section title if
43
+ * they look like a name — i.e., only letters, spaces, periods, and → )
44
+ * 3. First non-empty line is treated as the candidate name → bold, NOT section title
45
+ */
46
+ export declare function extractTextItemsFromRawText(rawText: string): TextItem[];
47
+ /**
48
+ * Merge adjacent text items on the same Y-coordinate if their horizontal
49
+ * distance is smaller than the average character width.
50
+ */
51
+ export declare function groupTextItemsIntoLines(items: TextItem[]): LineItem[];
52
+ /**
53
+ * Group lines into sections based on section titles.
54
+ */
55
+ export declare function groupLinesIntoSections(lines: LineItem[]): SectionItem[];
56
+ export declare function parseResume(input: ParseResumeInput): ParseResumeOutput;
57
+ //# sourceMappingURL=parse-resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-resume.d.ts","sourceRoot":"","sources":["../../../src/tools/parse-resume.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EAMX,YAAY,EACb,MAAM,UAAU,CAAC;AAMlB,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAMD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAyDpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwDvE;AAMD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CA8ErE;AAkDD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAwBvE;AAwTD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAuEtE"}