md2cv 1.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +674 -0
  3. package/README.md +219 -0
  4. package/dist/bin.d.ts +6 -0
  5. package/dist/bin.d.ts.map +1 -0
  6. package/dist/bin.js +10 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/cli/index.d.ts +50 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +278 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/generator/index.d.ts +36 -0
  13. package/dist/generator/index.d.ts.map +1 -0
  14. package/dist/generator/index.js +302 -0
  15. package/dist/generator/index.js.map +1 -0
  16. package/dist/generator/resume_en.d.ts +22 -0
  17. package/dist/generator/resume_en.d.ts.map +1 -0
  18. package/dist/generator/resume_en.js +524 -0
  19. package/dist/generator/resume_en.js.map +1 -0
  20. package/dist/generator/resume_ja.d.ts +22 -0
  21. package/dist/generator/resume_ja.d.ts.map +1 -0
  22. package/dist/generator/resume_ja.js +440 -0
  23. package/dist/generator/resume_ja.js.map +1 -0
  24. package/dist/generator/rirekisho/components.d.ts +83 -0
  25. package/dist/generator/rirekisho/components.d.ts.map +1 -0
  26. package/dist/generator/rirekisho/components.js +405 -0
  27. package/dist/generator/rirekisho/components.js.map +1 -0
  28. package/dist/generator/rirekisho/data.d.ts +18 -0
  29. package/dist/generator/rirekisho/data.d.ts.map +1 -0
  30. package/dist/generator/rirekisho/data.js +274 -0
  31. package/dist/generator/rirekisho/data.js.map +1 -0
  32. package/dist/generator/rirekisho/index.d.ts +20 -0
  33. package/dist/generator/rirekisho/index.d.ts.map +1 -0
  34. package/dist/generator/rirekisho/index.js +67 -0
  35. package/dist/generator/rirekisho/index.js.map +1 -0
  36. package/dist/generator/rirekisho/layout.d.ts +20 -0
  37. package/dist/generator/rirekisho/layout.d.ts.map +1 -0
  38. package/dist/generator/rirekisho/layout.js +354 -0
  39. package/dist/generator/rirekisho/layout.js.map +1 -0
  40. package/dist/generator/rirekisho/styles.d.ts +9 -0
  41. package/dist/generator/rirekisho/styles.d.ts.map +1 -0
  42. package/dist/generator/rirekisho/styles.js +362 -0
  43. package/dist/generator/rirekisho/styles.js.map +1 -0
  44. package/dist/generator/rirekisho/types.d.ts +163 -0
  45. package/dist/generator/rirekisho/types.d.ts.map +1 -0
  46. package/dist/generator/rirekisho/types.js +80 -0
  47. package/dist/generator/rirekisho/types.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +10 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/parser/index.d.ts +21 -0
  53. package/dist/parser/index.d.ts.map +1 -0
  54. package/dist/parser/index.js +639 -0
  55. package/dist/parser/index.js.map +1 -0
  56. package/dist/types/config.d.ts +64 -0
  57. package/dist/types/config.d.ts.map +1 -0
  58. package/dist/types/config.js +5 -0
  59. package/dist/types/config.js.map +1 -0
  60. package/dist/types/errors.d.ts +78 -0
  61. package/dist/types/errors.d.ts.map +1 -0
  62. package/dist/types/errors.js +146 -0
  63. package/dist/types/errors.js.map +1 -0
  64. package/dist/types/index.d.ts +9 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +9 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/types/metadata.d.ts +55 -0
  69. package/dist/types/metadata.d.ts.map +1 -0
  70. package/dist/types/metadata.js +136 -0
  71. package/dist/types/metadata.js.map +1 -0
  72. package/dist/types/result.d.ts +50 -0
  73. package/dist/types/result.d.ts.map +1 -0
  74. package/dist/types/result.js +74 -0
  75. package/dist/types/result.js.map +1 -0
  76. package/dist/types/sections.d.ts +168 -0
  77. package/dist/types/sections.d.ts.map +1 -0
  78. package/dist/types/sections.js +122 -0
  79. package/dist/types/sections.js.map +1 -0
  80. package/dist/validator/index.d.ts +20 -0
  81. package/dist/validator/index.d.ts.map +1 -0
  82. package/dist/validator/index.js +67 -0
  83. package/dist/validator/index.js.map +1 -0
  84. package/examples/example-cv-en.md +77 -0
  85. package/examples/example-cv-ja.md +116 -0
  86. package/examples/sample-photo.png +0 -0
  87. package/package.json +93 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Result type for error handling - represents either success or failure
3
+ * This is a discriminated union that forces explicit error handling
4
+ */
5
+ /**
6
+ * Creates a successful Result
7
+ */
8
+ export function success(value) {
9
+ return { ok: true, value };
10
+ }
11
+ /**
12
+ * Creates a failed Result
13
+ */
14
+ export function failure(error) {
15
+ return { ok: false, error };
16
+ }
17
+ /**
18
+ * Type guard to check if a Result is successful
19
+ */
20
+ export function isSuccess(result) {
21
+ return result.ok;
22
+ }
23
+ /**
24
+ * Type guard to check if a Result is a failure
25
+ */
26
+ export function isFailure(result) {
27
+ return !result.ok;
28
+ }
29
+ /**
30
+ * Maps a successful Result's value using the provided function
31
+ */
32
+ export function map(result, fn) {
33
+ if (result.ok) {
34
+ return success(fn(result.value));
35
+ }
36
+ return result;
37
+ }
38
+ /**
39
+ * Maps a failed Result's error using the provided function
40
+ */
41
+ export function mapError(result, fn) {
42
+ if (!result.ok) {
43
+ return failure(fn(result.error));
44
+ }
45
+ return result;
46
+ }
47
+ /**
48
+ * Chains Result operations - flatMap/bind
49
+ */
50
+ export function flatMap(result, fn) {
51
+ if (result.ok) {
52
+ return fn(result.value);
53
+ }
54
+ return result;
55
+ }
56
+ /**
57
+ * Unwraps a Result, throwing if it's a failure
58
+ */
59
+ export function unwrap(result) {
60
+ if (result.ok) {
61
+ return result.value;
62
+ }
63
+ throw new Error(`Attempted to unwrap a failure: ${String(result.error)}`);
64
+ }
65
+ /**
66
+ * Unwraps a Result with a default value for failures
67
+ */
68
+ export function unwrapOr(result, defaultValue) {
69
+ if (result.ok) {
70
+ return result.value;
71
+ }
72
+ return defaultValue;
73
+ }
74
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/types/result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAO,MAAoB;IAClD,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAO,MAAoB;IAClD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAU,MAAoB,EAAE,EAAmB;IACpE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAU,MAAoB,EAAE,EAAmB;IACzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,MAAoB,EACpB,EAA8B;IAE9B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAO,MAAoB;IAC/C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAO,MAAoB,EAAE,YAAe;IAClE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Section types and definitions for CV/rirekisho
3
+ */
4
+ import type { OutputFormat } from './config.js';
5
+ /**
6
+ * Section usage context
7
+ */
8
+ export type SectionUsage = 'cv' | 'rirekisho' | 'both';
9
+ /**
10
+ * Section definition
11
+ */
12
+ export interface SectionDef {
13
+ readonly id: string;
14
+ readonly tags: readonly string[];
15
+ readonly usage: SectionUsage;
16
+ readonly requiredFor: readonly OutputFormat[];
17
+ }
18
+ /**
19
+ * All section definitions
20
+ */
21
+ export declare const SECTION_DEFINITIONS: readonly SectionDef[];
22
+ /**
23
+ * Find section definition by tag (case-insensitive)
24
+ */
25
+ export declare function findSectionByTag(tag: string): SectionDef | undefined;
26
+ /**
27
+ * Get all valid tags for a given output format
28
+ */
29
+ export declare function getValidTagsForFormat(format: OutputFormat): string[];
30
+ /**
31
+ * Get required section IDs for a given output format
32
+ */
33
+ export declare function getRequiredSectionsForFormat(format: OutputFormat): string[];
34
+ /**
35
+ * Check if a section is valid for a given output format
36
+ */
37
+ export declare function isSectionValidForFormat(sectionId: string, format: OutputFormat): boolean;
38
+ /**
39
+ * Education entry structure (resume:education block)
40
+ */
41
+ export interface EducationEntry {
42
+ readonly school: string;
43
+ readonly degree: string | undefined;
44
+ readonly location: string | undefined;
45
+ readonly start: Date | undefined;
46
+ readonly end: Date | undefined;
47
+ readonly details: readonly string[] | undefined;
48
+ }
49
+ /**
50
+ * Project entry within a role
51
+ */
52
+ export interface ProjectEntry {
53
+ readonly name: string;
54
+ readonly start: Date | undefined;
55
+ readonly end: Date | undefined;
56
+ readonly bullets: readonly string[] | undefined;
57
+ }
58
+ /**
59
+ * Role entry within experience
60
+ */
61
+ export interface RoleEntry {
62
+ readonly title: string;
63
+ readonly team: string | undefined;
64
+ readonly start: Date | undefined;
65
+ readonly end: Date | 'present' | undefined;
66
+ readonly summary: readonly string[] | undefined;
67
+ readonly highlights: readonly string[] | undefined;
68
+ readonly projects: readonly ProjectEntry[] | undefined;
69
+ }
70
+ /**
71
+ * Experience entry structure (resume:experience block)
72
+ */
73
+ export interface ExperienceEntry {
74
+ readonly company: string;
75
+ readonly location: string | undefined;
76
+ readonly roles: readonly RoleEntry[];
77
+ }
78
+ /**
79
+ * Certification entry structure (resume:certifications block)
80
+ */
81
+ export interface CertificationEntry {
82
+ readonly name: string;
83
+ readonly issuer: string | undefined;
84
+ readonly date: Date | undefined;
85
+ readonly url: string | undefined;
86
+ }
87
+ /**
88
+ * Skill entry structure (resume:skills block)
89
+ * Supports two formats:
90
+ * 1. Flat list: items only (category is empty string)
91
+ * 2. Categorized: category with items or description
92
+ */
93
+ export interface SkillEntry {
94
+ readonly category: string;
95
+ readonly items: readonly string[];
96
+ readonly description: string | undefined;
97
+ readonly level: string | undefined;
98
+ }
99
+ /**
100
+ * Skills section options
101
+ */
102
+ export interface SkillsOptions {
103
+ readonly columns: number | undefined;
104
+ readonly format: 'grid' | 'categorized' | undefined;
105
+ }
106
+ /**
107
+ * Competency entry structure (resume:competencies block)
108
+ */
109
+ export interface CompetencyEntry {
110
+ readonly header: string;
111
+ readonly description: string;
112
+ }
113
+ /**
114
+ * Language entry structure (resume:languages block)
115
+ */
116
+ export interface LanguageEntry {
117
+ readonly language: string;
118
+ readonly level: string | undefined;
119
+ }
120
+ /**
121
+ * Parsed section content
122
+ */
123
+ export type SectionContent = {
124
+ readonly type: 'text';
125
+ readonly text: string;
126
+ } | {
127
+ readonly type: 'list';
128
+ readonly items: readonly string[];
129
+ } | {
130
+ readonly type: 'education';
131
+ readonly entries: readonly EducationEntry[];
132
+ } | {
133
+ readonly type: 'experience';
134
+ readonly entries: readonly ExperienceEntry[];
135
+ } | {
136
+ readonly type: 'certifications';
137
+ readonly entries: readonly CertificationEntry[];
138
+ } | {
139
+ readonly type: 'skills';
140
+ readonly entries: readonly SkillEntry[];
141
+ readonly options: SkillsOptions;
142
+ } | {
143
+ readonly type: 'competencies';
144
+ readonly entries: readonly CompetencyEntry[];
145
+ } | {
146
+ readonly type: 'languages';
147
+ readonly entries: readonly LanguageEntry[];
148
+ } | {
149
+ readonly type: 'table';
150
+ readonly rows: readonly TableRow[];
151
+ };
152
+ /**
153
+ * Table row for rirekisho format
154
+ */
155
+ export interface TableRow {
156
+ readonly year: string;
157
+ readonly month: string;
158
+ readonly content: string;
159
+ }
160
+ /**
161
+ * Parsed section
162
+ */
163
+ export interface ParsedSection {
164
+ readonly id: string;
165
+ readonly title: string;
166
+ readonly content: SectionContent;
167
+ }
168
+ //# sourceMappingURL=sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../src/types/sections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Section types and definitions for CV/rirekisho
3
+ */
4
+ /**
5
+ * All section definitions
6
+ */
7
+ export const SECTION_DEFINITIONS = [
8
+ {
9
+ id: 'summary',
10
+ tags: [
11
+ '概要',
12
+ '職務要約',
13
+ 'Summary',
14
+ 'Professional Summary',
15
+ 'Profile',
16
+ 'Profile Summary',
17
+ 'Executive Summary',
18
+ ],
19
+ usage: 'cv',
20
+ requiredFor: [],
21
+ },
22
+ {
23
+ id: 'education',
24
+ tags: ['学歴', 'Education'],
25
+ usage: 'both',
26
+ requiredFor: [],
27
+ },
28
+ {
29
+ id: 'experience',
30
+ tags: ['職歴', '職務経歴', '職務履歴', 'Experience', 'Work Experience', 'Professional Experience'],
31
+ usage: 'both',
32
+ requiredFor: ['cv', 'rirekisho', 'both'],
33
+ },
34
+ {
35
+ id: 'certifications',
36
+ tags: ['免許・資格', '資格', '免許', 'Certifications'],
37
+ usage: 'both',
38
+ requiredFor: [],
39
+ },
40
+ {
41
+ id: 'motivation',
42
+ tags: ['志望動機', '志望の動機', 'Motivation', 'Motivation for Applying'],
43
+ usage: 'rirekisho',
44
+ requiredFor: [],
45
+ },
46
+ {
47
+ id: 'competencies',
48
+ tags: [
49
+ '自己PR',
50
+ '自己pr',
51
+ '自己PR',
52
+ '自己pr',
53
+ 'Core Competencies',
54
+ 'Key Competencies',
55
+ 'Competencies',
56
+ 'Key Highlights',
57
+ 'Superpowers',
58
+ ],
59
+ usage: 'both',
60
+ requiredFor: [],
61
+ },
62
+ {
63
+ id: 'notes',
64
+ tags: ['本人希望記入欄', 'Notes'],
65
+ usage: 'rirekisho',
66
+ requiredFor: [],
67
+ },
68
+ {
69
+ id: 'skills',
70
+ tags: ['スキル', 'Skills', 'Technical Skills'],
71
+ usage: 'both',
72
+ requiredFor: [],
73
+ },
74
+ {
75
+ id: 'languages',
76
+ tags: ['語学', 'Languages', 'Language Skills'],
77
+ usage: 'cv',
78
+ requiredFor: [],
79
+ },
80
+ ];
81
+ /**
82
+ * Find section definition by tag (case-insensitive)
83
+ */
84
+ export function findSectionByTag(tag) {
85
+ const normalizedTag = tag.toLowerCase().trim();
86
+ return SECTION_DEFINITIONS.find((def) => def.tags.some((t) => t.toLowerCase() === normalizedTag));
87
+ }
88
+ /**
89
+ * Get all valid tags for a given output format
90
+ */
91
+ export function getValidTagsForFormat(format) {
92
+ const tags = [];
93
+ for (const def of SECTION_DEFINITIONS) {
94
+ if (format === 'both' || def.usage === 'both' || def.usage === format) {
95
+ tags.push(...def.tags);
96
+ }
97
+ }
98
+ return tags;
99
+ }
100
+ /**
101
+ * Get required section IDs for a given output format
102
+ */
103
+ export function getRequiredSectionsForFormat(format) {
104
+ return SECTION_DEFINITIONS.filter((def) => {
105
+ if (format === 'both') {
106
+ return def.requiredFor.includes('cv') || def.requiredFor.includes('rirekisho');
107
+ }
108
+ return def.requiredFor.includes(format) || def.requiredFor.includes('both');
109
+ }).map((def) => def.id);
110
+ }
111
+ /**
112
+ * Check if a section is valid for a given output format
113
+ */
114
+ export function isSectionValidForFormat(sectionId, format) {
115
+ const def = SECTION_DEFINITIONS.find((d) => d.id === sectionId);
116
+ if (!def)
117
+ return false;
118
+ if (format === 'both')
119
+ return true;
120
+ return def.usage === 'both' || def.usage === format;
121
+ }
122
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/types/sections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Validator module
3
+ * Validates parsed CV against requirements
4
+ */
5
+ import type { Logger } from '../cli/index.js';
6
+ import type { ParsedCV } from '../parser/index.js';
7
+ import type { OutputFormat } from '../types/config.js';
8
+ import { type Result, type ValidationError } from '../types/index.js';
9
+ /**
10
+ * Validated CV (same structure, guaranteed valid)
11
+ */
12
+ export interface ValidatedCV extends ParsedCV {
13
+ readonly _validated: true;
14
+ }
15
+ /**
16
+ * Validate CV
17
+ */
18
+ export declare function validateCV(cv: ParsedCV, format: OutputFormat, logger: Logger): Result<ValidatedCV, ValidationError[]>;
19
+ export default validateCV;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAQ3B;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;CAC3B;AAqED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAcxC;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Validator module
3
+ * Validates parsed CV against requirements
4
+ */
5
+ import { createValidationError, failure, success, } from '../types/index.js';
6
+ import { METADATA_FIELDS, getRequiredFields } from '../types/metadata.js';
7
+ import { SECTION_DEFINITIONS, findSectionByTag, getRequiredSectionsForFormat, } from '../types/sections.js';
8
+ /**
9
+ * Validate metadata fields
10
+ */
11
+ function validateMetadata(cv, errors) {
12
+ const requiredFields = getRequiredFields();
13
+ const metadata = cv.metadata;
14
+ for (const fieldName of requiredFields) {
15
+ const value = metadata[fieldName];
16
+ if (!value || (typeof value === 'string' && !value.trim())) {
17
+ const def = METADATA_FIELDS[fieldName];
18
+ const envVars = def?.envVars.join(' or ') ?? fieldName.toUpperCase();
19
+ errors.push(createValidationError(`Missing required field: ${fieldName}. Set via environment variable (${envVars}) or frontmatter.`, fieldName, 'string', 'undefined'));
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Validate sections for output format
25
+ */
26
+ function validateSections(cv, format, errors, logger) {
27
+ const requiredSectionIds = getRequiredSectionsForFormat(format);
28
+ const presentSectionIds = cv.sections.map((s) => s.id);
29
+ // Check required sections
30
+ for (const requiredId of requiredSectionIds) {
31
+ if (!presentSectionIds.includes(requiredId)) {
32
+ const def = SECTION_DEFINITIONS.find((d) => d.id === requiredId);
33
+ const tags = def?.tags.join(', ') ?? requiredId;
34
+ errors.push(createValidationError(`Missing required section for ${format}: ${requiredId}. Use one of: ${tags}`, requiredId, 'section', 'missing'));
35
+ }
36
+ }
37
+ // Warn about unknown sections
38
+ // Get all H1 headings from raw content to check for unknown sections
39
+ const h1Regex = /^#\s+(.+)$/gm;
40
+ let match;
41
+ while ((match = h1Regex.exec(cv.rawContent)) !== null) {
42
+ const title = match[1]?.trim();
43
+ if (title) {
44
+ const sectionDef = findSectionByTag(title);
45
+ if (!sectionDef) {
46
+ logger.warn(`Unknown section "${title}" will be ignored`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ /**
52
+ * Validate CV
53
+ */
54
+ export function validateCV(cv, format, logger) {
55
+ const errors = [];
56
+ validateMetadata(cv, errors);
57
+ validateSections(cv, format, errors, logger);
58
+ if (errors.length > 0) {
59
+ return failure(errors);
60
+ }
61
+ return success({
62
+ ...cv,
63
+ _validated: true,
64
+ });
65
+ }
66
+ export default validateCV;
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: John Smith
3
+ email_address: john.smith@example.com
4
+ phone_number: +1-555-123-4567
5
+ home_address: San Francisco, CA
6
+ linkedin: https://linkedin.com/in/johnsmith
7
+ ---
8
+
9
+ # Summary
10
+
11
+ Experienced software engineer with 5+ years in full-stack development. Passionate about building scalable systems and mentoring teams. Proven track record of delivering high-impact projects and driving technical excellence.
12
+
13
+ # Core Competencies
14
+
15
+ ```resume:competencies
16
+ - header: Technical Leadership
17
+ description: Led cross-functional teams of 5-10 engineers, driving architecture decisions and establishing best practices for code quality and testing.
18
+ - header: System Design
19
+ description: Designed and implemented microservices architecture handling 1M+ daily active users with 99.9% uptime.
20
+ - header: Agile Development
21
+ description: Champion of agile methodologies, facilitating sprint planning, retrospectives, and continuous improvement initiatives.
22
+ ```
23
+
24
+ # Experience
25
+
26
+ ```resume:experience
27
+ - company: Tech Corp
28
+ location: San Francisco, CA
29
+ roles:
30
+ - title: Senior Software Engineer
31
+ start: 2021-01
32
+ end: present
33
+ summary:
34
+ - Lead engineer for the platform team, responsible for core infrastructure and developer experience.
35
+ highlights:
36
+ - Led development of microservices architecture serving 1M+ users
37
+ - Mentored junior developers and conducted code reviews
38
+ - Improved system performance by 40% through optimization
39
+ - company: StartupXYZ
40
+ location: San Francisco, CA
41
+ roles:
42
+ - title: Software Engineer
43
+ start: 2019-03
44
+ end: 2020-12
45
+ highlights:
46
+ - Built React-based frontend applications
47
+ - Implemented RESTful APIs with Node.js
48
+ - Collaborated with product team on feature development
49
+ ```
50
+
51
+ # Education
52
+
53
+ ```resume:education
54
+ - school: Stanford University
55
+ degree: Bachelor of Science in Computer Science
56
+ location: Stanford, CA
57
+ start: 2015-09
58
+ end: 2019-06
59
+ details:
60
+ - GPA 3.8/4.0
61
+ - Dean's List
62
+ ```
63
+
64
+ # Skills
65
+
66
+ - JavaScript
67
+ - TypeScript
68
+ - Python
69
+ - Go
70
+ - React
71
+ - Vue.js
72
+ - Node.js
73
+ - PostgreSQL
74
+ - Redis
75
+ - AWS
76
+ - Docker
77
+ - Kubernetes
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: Taro Yamada
3
+ name_ja: 山田 太郎
4
+ name_furigana: ヤマダ タロウ
5
+ email_address: taro.yamada@example.com
6
+ phone_number: 090-1234-5678
7
+ post_code: 150-0001
8
+ home_address: 東京都渋谷区神宮前 1 - 2 - 3
9
+ home_address_furigana: とうきょうと しぶやく じんぐうまえ
10
+ email_address2: taro.yamada2@example.com
11
+ phone_number2: 03-1234-5678
12
+ post_code2: 100-0001
13
+ home_address2: 東京都千代田区千代田 1 - 1
14
+ home_address_furigana2: とうきょうと ちよだく ちよだ
15
+ dob: 1995-04-15
16
+ gender: 男
17
+ ---
18
+
19
+ # 概要
20
+
21
+ 5年以上のフルスタック開発経験を持つソフトウェアエンジニア。スケーラブルなシステム構築とチーム育成に情熱を持つ。大規模Webアプリケーションの設計から運用まで一貫して担当し、マイクロサービスアーキテクチャへの移行プロジェクトをリード。アジャイル開発手法を活用したチームマネジメントにも強みを持ち、若手エンジニアの育成にも積極的に取り組んでいる。
22
+
23
+ # 職歴
24
+
25
+ ```resume:experience
26
+ - company: 株式会社テック
27
+ location: 東京都港区
28
+ roles:
29
+ - title: シニアエンジニア
30
+ team: プラットフォーム開発部
31
+ start: 2021-04
32
+ end: present
33
+ summary:
34
+ - マイクロサービスアーキテクチャの設計・実装を担当
35
+ - 100万ユーザー規模のシステム運用
36
+ highlights:
37
+ - 5名のチームリードとしてコードレビュー・メンタリング実施
38
+ - システムパフォーマンスを40%改善
39
+ - CI/CDパイプラインの構築によりデプロイ時間を50%短縮
40
+ - company: スタートアップABC株式会社
41
+ location: 東京都渋谷区
42
+ roles:
43
+ - title: エンジニア
44
+ team: プロダクト開発チーム
45
+ start: 2019-04
46
+ end: 2021-03
47
+ summary:
48
+ - React/TypeScriptによるフロントエンド開発
49
+ - Node.js/PostgreSQLによるREST API実装
50
+ highlights:
51
+ - プロダクトチームと連携した機能開発
52
+ - ユニットテストカバレッジを30%から80%に向上
53
+ ```
54
+
55
+ # 学歴
56
+
57
+ ```resume:education
58
+ - school: 東京大学大学院
59
+ degree: 情報理工学系研究科 修士課程
60
+ location: 東京都文京区
61
+ start: 2019-04
62
+ end: 2021-03
63
+ details:
64
+ - 分散システムとクラウドコンピューティングを専攻
65
+ - "修士論文: コンテナオーケストレーションの最適化に関する研究"
66
+ - school: 東京大学
67
+ degree: 工学部 情報工学科
68
+ location: 東京都文京区
69
+ start: 2015-04
70
+ end: 2019-03
71
+ details:
72
+ - "GPA: 3.8/4.0"
73
+ - 学部長賞受賞
74
+ - "卒業研究: 機械学習を用いた自然言語処理の研究"
75
+ ```
76
+
77
+ # スキル
78
+
79
+ ```resume:skills
80
+ categories:
81
+ - category: 言語
82
+ description: JavaScript, TypeScript, Python, Go
83
+ - category: フロントエンド
84
+ description: React, Vue.js, HTML/CSS
85
+ - category: バックエンド
86
+ description: Node.js, PostgreSQL, Redis
87
+ - category: インフラ
88
+ description: AWS, Docker, Kubernetes
89
+ ```
90
+
91
+ # 資格
92
+
93
+ ```resume:certifications
94
+ - name: AWS ソリューションアーキテクト アソシエイト
95
+ issuer: Amazon Web Services
96
+ date: 2023-05
97
+ - name: 基本情報技術者
98
+ date: 2018-10
99
+ - name: TOEIC 850点
100
+ date: 2022-03
101
+ ```
102
+
103
+ # 志望動機
104
+
105
+ 貴社のクラウドネイティブ技術への取り組みと、エンジニア主導の開発文化に強く共感しております。これまで培ってきたマイクロサービス設計やチームリードの経験を活かし、貴社のプロダクト開発に貢献したいと考えております。特に、大規模システムのパフォーマンス最適化や、開発プロセスの改善において即戦力として活躍できると確信しております。
106
+
107
+ # 自己PR
108
+
109
+ - 5年以上のフルスタック開発経験と、マイクロサービスアーキテクチャの設計・実装スキル
110
+ - 5名規模のチームリードとして、コードレビューやメンタリングを通じた若手育成の実績
111
+ - システムパフォーマンス40%改善、デプロイ時間50%短縮などの具体的な成果
112
+ - AWS、Docker、Kubernetesを活用したクラウドネイティブ開発の豊富な経験
113
+
114
+ # 本人希望記入欄
115
+
116
+ 勤務地は東京都内を希望いたします。リモートワークとオフィス勤務のハイブリッド形態を希望しております。
Binary file