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.
Files changed (69) hide show
  1. package/AGENTS.md +5 -3
  2. package/README.md +30 -10
  3. package/THIRD_PARTY_NOTICES.md +2 -1
  4. package/dist/career-os/README.md +4 -3
  5. package/dist/career-os/eop/career-description.md +3 -0
  6. package/dist/career-os/eop/cover-letter.md +8 -4
  7. package/dist/career-os/eop/fit-analysis.md +1 -1
  8. package/dist/career-os/eop/job-analysis.md +1 -1
  9. package/dist/career-os/knowledge/cover-letter.md +4 -3
  10. package/dist/career-os/knowledge/fit-matching.md +5 -3
  11. package/dist/career-os/knowledge/human-writing.md +2 -0
  12. package/dist/career-os/knowledge/verifiers/ai-detection-risk.md +57 -0
  13. package/dist/career-os/knowledge/verifiers/ats-compat.md +1 -1
  14. package/dist/career-os/knowledge/verifiers/human-voice.md +2 -0
  15. package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +1 -1
  16. package/dist/career-os/knowledge/verifiers/truthfulness.md +1 -0
  17. package/dist/doctor.mjs +19012 -809
  18. package/dist/mcp.mjs +19027 -824
  19. package/dist/migrate.mjs +83 -6
  20. package/dist/public/i18n/en/common.js +4 -0
  21. package/dist/public/i18n/en/documents.js +0 -10
  22. package/dist/public/i18n/en/home.js +5 -0
  23. package/dist/public/i18n/en/jobs.js +1 -1
  24. package/dist/public/i18n/en/profile.js +0 -5
  25. package/dist/public/i18n/ko/common.js +4 -0
  26. package/dist/public/i18n/ko/documents.js +0 -10
  27. package/dist/public/i18n/ko/home.js +5 -0
  28. package/dist/public/i18n/ko/jobs.js +1 -1
  29. package/dist/public/i18n/ko/profile.js +0 -5
  30. package/dist/public/lib.js +72 -0
  31. package/dist/public/pages/applications.js +10 -6
  32. package/dist/public/pages/documents.js +4 -7
  33. package/dist/public/pages/home.js +26 -6
  34. package/dist/public/pages/profile.js +2 -3
  35. package/dist/public/styles.css +39 -4
  36. package/dist/web.mjs +18548 -649
  37. package/docs/MCP_TOOLS.md +19 -10
  38. package/docs/START_WORKFLOW.md +1 -1
  39. package/docs/career-os/README.md +4 -3
  40. package/docs/career-os/eop/career-description.md +3 -0
  41. package/docs/career-os/eop/cover-letter.md +8 -4
  42. package/docs/career-os/eop/fit-analysis.md +1 -1
  43. package/docs/career-os/eop/job-analysis.md +1 -1
  44. package/docs/career-os/knowledge/cover-letter.md +4 -3
  45. package/docs/career-os/knowledge/fit-matching.md +5 -3
  46. package/docs/career-os/knowledge/human-writing.md +2 -0
  47. package/docs/career-os/knowledge/verifiers/ai-detection-risk.md +57 -0
  48. package/docs/career-os/knowledge/verifiers/ats-compat.md +1 -1
  49. package/docs/career-os/knowledge/verifiers/human-voice.md +2 -0
  50. package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +1 -1
  51. package/docs/career-os/knowledge/verifiers/truthfulness.md +1 -0
  52. package/package.json +3 -2
  53. package/packages/core/src/index.ts +1 -0
  54. package/packages/core/src/jobsearch.ts +186 -0
  55. package/packages/core/src/services.ts +24 -2
  56. package/packages/core/src/summary.ts +196 -0
  57. package/packages/core/src/verify/charcount.ts +87 -0
  58. package/packages/core/src/verify/index.ts +1 -0
  59. package/packages/core/src/verify/lint.ts +5 -0
  60. package/packages/db/src/repositories.ts +42 -8
  61. package/packages/db/src/schema.ts +29 -0
  62. package/packages/exporters/src/docx.ts +165 -0
  63. package/packages/exporters/src/index.ts +142 -9
  64. package/packages/exporters/src/markdown.ts +16 -11
  65. package/packages/knowledge/src/index.ts +17 -5
  66. package/packages/mcp-tools/src/tools.ts +181 -59
  67. package/packages/prompts/src/system.ts +1 -0
  68. package/packages/shared/src/schemas.ts +64 -0
  69. 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
  ];