careermate 0.0.6 → 0.0.8
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/AGENTS.md +5 -3
- package/README.md +30 -10
- package/THIRD_PARTY_NOTICES.md +2 -1
- package/dist/career-os/README.md +4 -3
- package/dist/career-os/eop/career-description.md +3 -0
- package/dist/career-os/eop/cover-letter.md +8 -4
- package/dist/career-os/eop/fit-analysis.md +1 -1
- package/dist/career-os/eop/job-analysis.md +1 -1
- package/dist/career-os/knowledge/cover-letter.md +4 -3
- package/dist/career-os/knowledge/fit-matching.md +5 -3
- package/dist/career-os/knowledge/human-writing.md +2 -0
- package/dist/career-os/knowledge/verifiers/ai-detection-risk.md +57 -0
- package/dist/career-os/knowledge/verifiers/ats-compat.md +1 -1
- package/dist/career-os/knowledge/verifiers/human-voice.md +2 -0
- package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +1 -1
- package/dist/career-os/knowledge/verifiers/truthfulness.md +1 -0
- package/dist/doctor.mjs +19012 -809
- package/dist/mcp.mjs +19027 -824
- package/dist/migrate.mjs +83 -6
- package/dist/public/i18n/en/common.js +4 -0
- package/dist/public/i18n/en/documents.js +0 -10
- package/dist/public/i18n/en/home.js +5 -0
- package/dist/public/i18n/en/jobs.js +1 -1
- package/dist/public/i18n/en/profile.js +0 -5
- package/dist/public/i18n/ko/common.js +4 -0
- package/dist/public/i18n/ko/documents.js +0 -10
- package/dist/public/i18n/ko/home.js +5 -0
- package/dist/public/i18n/ko/jobs.js +1 -1
- package/dist/public/i18n/ko/profile.js +0 -5
- package/dist/public/lib.js +72 -0
- package/dist/public/pages/applications.js +10 -6
- package/dist/public/pages/documents.js +4 -7
- package/dist/public/pages/home.js +26 -6
- package/dist/public/pages/profile.js +2 -3
- package/dist/public/styles.css +39 -4
- package/dist/web.mjs +18548 -649
- package/docs/MCP_TOOLS.md +19 -10
- package/docs/START_WORKFLOW.md +1 -1
- package/docs/career-os/README.md +4 -3
- package/docs/career-os/eop/career-description.md +3 -0
- package/docs/career-os/eop/cover-letter.md +8 -4
- package/docs/career-os/eop/fit-analysis.md +1 -1
- package/docs/career-os/eop/job-analysis.md +1 -1
- package/docs/career-os/knowledge/cover-letter.md +4 -3
- package/docs/career-os/knowledge/fit-matching.md +5 -3
- package/docs/career-os/knowledge/human-writing.md +2 -0
- package/docs/career-os/knowledge/verifiers/ai-detection-risk.md +57 -0
- package/docs/career-os/knowledge/verifiers/ats-compat.md +1 -1
- package/docs/career-os/knowledge/verifiers/human-voice.md +2 -0
- package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +1 -1
- package/docs/career-os/knowledge/verifiers/truthfulness.md +1 -0
- package/package.json +3 -2
- package/packages/core/src/index.ts +1 -0
- package/packages/core/src/jobsearch.ts +186 -0
- package/packages/core/src/services.ts +24 -2
- package/packages/core/src/summary.ts +196 -0
- package/packages/core/src/verify/charcount.ts +87 -0
- package/packages/core/src/verify/index.ts +1 -0
- package/packages/core/src/verify/lint.ts +5 -0
- package/packages/db/src/repositories.ts +42 -8
- package/packages/db/src/schema.ts +29 -0
- package/packages/exporters/src/docx.ts +165 -0
- package/packages/exporters/src/index.ts +142 -9
- package/packages/exporters/src/markdown.ts +16 -11
- package/packages/knowledge/src/index.ts +17 -5
- package/packages/mcp-tools/src/tools.ts +181 -59
- package/packages/prompts/src/system.ts +1 -0
- package/packages/shared/src/schemas.ts +64 -0
- package/scripts/init.ts +5 -0
|
@@ -114,6 +114,43 @@ export const LinkSchema = z.object({
|
|
|
114
114
|
});
|
|
115
115
|
export type Link = z.infer<typeof LinkSchema>;
|
|
116
116
|
|
|
117
|
+
/* Structured quantitative credentials (한국 이력서 스펙). Values are kept verbatim as
|
|
118
|
+
strings so the AI cites them exactly (학점 3.8, TOEIC 920) without re-deriving. */
|
|
119
|
+
export const EducationSchema = z.object({
|
|
120
|
+
school: reqLine.describe('학교명'),
|
|
121
|
+
degree: z.string().max(MAX_LINE).optional().describe('학위/과정 (고졸·학사·석사·박사 등)'),
|
|
122
|
+
major: z.string().max(MAX_LINE).optional().describe('전공'),
|
|
123
|
+
gpa: z.string().max(MAX_LINE).optional().describe('학점 (예: 3.8)'),
|
|
124
|
+
gpa_scale: z.string().max(MAX_LINE).optional().describe('학점 만점 (예: 4.5)'),
|
|
125
|
+
start_date: z.string().max(MAX_LINE).optional().describe('YYYY-MM'),
|
|
126
|
+
end_date: z.string().max(MAX_LINE).optional().describe('YYYY-MM (졸업/예정)'),
|
|
127
|
+
status: z.string().max(MAX_LINE).optional().describe('졸업/재학/휴학/중퇴/수료'),
|
|
128
|
+
});
|
|
129
|
+
export type Education = z.infer<typeof EducationSchema>;
|
|
130
|
+
|
|
131
|
+
export const CertificationSchema = z.object({
|
|
132
|
+
name: reqLine.describe('자격증/면허명'),
|
|
133
|
+
issuer: z.string().max(MAX_LINE).optional().describe('발급기관'),
|
|
134
|
+
date: z.string().max(MAX_LINE).optional().describe('취득일 YYYY-MM'),
|
|
135
|
+
score: z.string().max(MAX_LINE).optional().describe('점수/등급(있으면)'),
|
|
136
|
+
});
|
|
137
|
+
export type Certification = z.infer<typeof CertificationSchema>;
|
|
138
|
+
|
|
139
|
+
export const LanguageScoreSchema = z.object({
|
|
140
|
+
test: reqLine.describe('시험명 (TOEIC·OPIc·TOEIC Speaking·JLPT·HSK 등)'),
|
|
141
|
+
score: reqLine.describe('점수/등급 (예: 920, IH, N1)'),
|
|
142
|
+
date: z.string().max(MAX_LINE).optional().describe('응시/취득일 YYYY-MM'),
|
|
143
|
+
});
|
|
144
|
+
export type LanguageScore = z.infer<typeof LanguageScoreSchema>;
|
|
145
|
+
|
|
146
|
+
export const AwardSchema = z.object({
|
|
147
|
+
title: reqLine.describe('수상/대외활동명'),
|
|
148
|
+
issuer: z.string().max(MAX_LINE).optional().describe('주최/수여기관'),
|
|
149
|
+
date: z.string().max(MAX_LINE).optional().describe('YYYY-MM'),
|
|
150
|
+
description: z.string().max(MAX_NOTE).optional().describe('간단 설명'),
|
|
151
|
+
});
|
|
152
|
+
export type Award = z.infer<typeof AwardSchema>;
|
|
153
|
+
|
|
117
154
|
export const ProfileInputSchema = z.object({
|
|
118
155
|
name: reqLine.optional(),
|
|
119
156
|
email: optLine,
|
|
@@ -126,6 +163,10 @@ export const ProfileInputSchema = z.object({
|
|
|
126
163
|
preferred_tone: z.string().max(MAX_LINE).optional().describe('자기소개서 선호 문체 (예: 담백하고 구체적)'),
|
|
127
164
|
emphasis_points: strList.optional().describe('강조하고 싶은 핵심 포인트'),
|
|
128
165
|
links: z.array(LinkSchema).max(MAX_ITEMS).optional().describe('포트폴리오/깃허브/링크드인 등'),
|
|
166
|
+
education: z.array(EducationSchema).max(MAX_ITEMS).optional().describe('학력 (학교·학위·전공·학점)'),
|
|
167
|
+
certifications: z.array(CertificationSchema).max(MAX_ITEMS).optional().describe('자격증/면허'),
|
|
168
|
+
language_scores: z.array(LanguageScoreSchema).max(MAX_ITEMS).optional().describe('어학 점수 (토익·오픽 등)'),
|
|
169
|
+
awards: z.array(AwardSchema).max(MAX_ITEMS).optional().describe('수상/대외활동'),
|
|
129
170
|
});
|
|
130
171
|
export type ProfileInput = z.infer<typeof ProfileInputSchema>;
|
|
131
172
|
|
|
@@ -142,6 +183,10 @@ export const ProfileRecordSchema = z.object({
|
|
|
142
183
|
preferred_tone: z.string().nullable(),
|
|
143
184
|
emphasis_points: z.array(z.string()),
|
|
144
185
|
links: z.array(LinkSchema),
|
|
186
|
+
education: z.array(EducationSchema),
|
|
187
|
+
certifications: z.array(CertificationSchema),
|
|
188
|
+
language_scores: z.array(LanguageScoreSchema),
|
|
189
|
+
awards: z.array(AwardSchema),
|
|
145
190
|
});
|
|
146
191
|
export type ProfileRecord = z.infer<typeof ProfileRecordSchema>;
|
|
147
192
|
|
|
@@ -346,6 +391,9 @@ export const JobInputSchema = z.object({
|
|
|
346
391
|
keywords: strList.optional().describe('핵심 키워드'),
|
|
347
392
|
deadline: z.string().max(MAX_LINE).optional().describe('마감일 YYYY-MM-DD'),
|
|
348
393
|
source: z.string().max(MAX_LINE).optional().describe('출처 (사람인/원티드/직접 입력 등)'),
|
|
394
|
+
company_overview: optBody.describe('회사 사업개요·미션·주요 제품·최근 활동 (AI가 리서치해 채움)'),
|
|
395
|
+
talent_profile: optBody.describe('회사가 강조하는 인재상 (한국 자소서·면접에서 정렬 기준)'),
|
|
396
|
+
core_values: strList.optional().describe('회사 핵심가치 (키워드 배열)'),
|
|
349
397
|
});
|
|
350
398
|
export type JobInput = z.infer<typeof JobInputSchema>;
|
|
351
399
|
|
|
@@ -361,6 +409,9 @@ export const JobRecordSchema = z.object({
|
|
|
361
409
|
keywords: z.array(z.string()),
|
|
362
410
|
deadline: z.string().nullable(),
|
|
363
411
|
source: z.string().nullable(),
|
|
412
|
+
company_overview: z.string().nullable(),
|
|
413
|
+
talent_profile: z.string().nullable(),
|
|
414
|
+
core_values: z.array(z.string()),
|
|
364
415
|
});
|
|
365
416
|
export type JobRecord = z.infer<typeof JobRecordSchema>;
|
|
366
417
|
|
|
@@ -459,12 +510,24 @@ export const InterviewQuestionSchema = z.object({
|
|
|
459
510
|
});
|
|
460
511
|
export type InterviewQuestion = z.infer<typeof InterviewQuestionSchema>;
|
|
461
512
|
|
|
513
|
+
/** Post-interview debrief — captured AFTER the interview to close the loop and feed the next round. */
|
|
514
|
+
export const InterviewDebriefSchema = z.object({
|
|
515
|
+
asked_questions: strList.optional().describe('실제로 받은 질문들'),
|
|
516
|
+
went_well: optBody.describe('잘된 점/강했던 답변'),
|
|
517
|
+
to_improve: optBody.describe('아쉬운 점/다음에 개선할 점'),
|
|
518
|
+
next_round_focus: optBody.describe('다음 라운드/면접에 대비해 준비할 포인트'),
|
|
519
|
+
sentiment: z.enum(['positive', 'neutral', 'negative']).optional().describe('체감 분위기'),
|
|
520
|
+
interviewed_at: optLine.describe('면접 본 날짜(YYYY-MM-DD)'),
|
|
521
|
+
});
|
|
522
|
+
export type InterviewDebrief = z.infer<typeof InterviewDebriefSchema>;
|
|
523
|
+
|
|
462
524
|
export const InterviewPrepInputSchema = z.object({
|
|
463
525
|
job_id: reqLine,
|
|
464
526
|
questions: z.array(InterviewQuestionSchema).max(MAX_ITEMS).optional(),
|
|
465
527
|
star_guides: z.array(StarGuideSchema).max(MAX_ITEMS).optional(),
|
|
466
528
|
self_introduction: optBody.describe('1분 자기소개 초안'),
|
|
467
529
|
notes: optNote.describe('면접 후기/메모'),
|
|
530
|
+
debrief: InterviewDebriefSchema.optional().describe('면접 후 디브리프(받은 질문·잘된 점·개선점·다음 라운드 포커스)'),
|
|
468
531
|
});
|
|
469
532
|
export type InterviewPrepInput = z.infer<typeof InterviewPrepInputSchema>;
|
|
470
533
|
|
|
@@ -475,6 +538,7 @@ export const InterviewPrepRecordSchema = z.object({
|
|
|
475
538
|
star_guides: z.array(StarGuideSchema),
|
|
476
539
|
self_introduction: z.string().nullable(),
|
|
477
540
|
notes: z.string().nullable(),
|
|
541
|
+
debrief: InterviewDebriefSchema.nullable(),
|
|
478
542
|
});
|
|
479
543
|
export type InterviewPrepRecord = z.infer<typeof InterviewPrepRecordSchema>;
|
|
480
544
|
|
package/scripts/init.ts
CHANGED
|
@@ -394,6 +394,11 @@ const SAFE_TOOLS: readonly string[] = [
|
|
|
394
394
|
'get_application_context', 'save_fit_analysis', 'update_application_status', 'save_interview_prep',
|
|
395
395
|
'export_cover_letter', 'export_resume', 'export_profile', 'list_recent_activity', 'get_workflow_guide', 'get_playbook', 'get_verifier',
|
|
396
396
|
'validate_cover_letter', 'set_verify_mode', 'get_writing_style_guide', 'check_for_update',
|
|
397
|
+
// 읽기전용 조회 도구(DB 변경·외부 전송 없음) → 사전허용 안전.
|
|
398
|
+
'get_followups', 'get_pipeline_stats', 'prescreen_job',
|
|
399
|
+
// search_jobs: 공개 잡보드에서 공고를 가져오기만(보내는 건 검색어뿐, 사용자 데이터 미전송).
|
|
400
|
+
// check_for_update와 같은 "네트워크 read" 부류라 사전허용 안전(우회·쓰기 없음).
|
|
401
|
+
'search_jobs',
|
|
397
402
|
// careermate 자신의 인박스 폴더·대시보드(127.0.0.1)만 여는 로컬 동작 + 인박스 내부 문서 읽기 → 사전허용 안전.
|
|
398
403
|
'read_inbox', 'open_inbox', 'open_dashboard', 'open_application',
|
|
399
404
|
];
|