resumate 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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/cli/commands/add.d.ts +8 -0
  4. package/dist/cli/commands/add.d.ts.map +1 -0
  5. package/dist/cli/commands/add.js +47 -0
  6. package/dist/cli/commands/add.js.map +1 -0
  7. package/dist/cli/commands/archive.d.ts +6 -0
  8. package/dist/cli/commands/archive.d.ts.map +1 -0
  9. package/dist/cli/commands/archive.js +276 -0
  10. package/dist/cli/commands/archive.js.map +1 -0
  11. package/dist/cli/commands/draft.d.ts +2 -0
  12. package/dist/cli/commands/draft.d.ts.map +1 -0
  13. package/dist/cli/commands/draft.js +45 -0
  14. package/dist/cli/commands/draft.js.map +1 -0
  15. package/dist/cli/commands/init.d.ts +3 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -0
  17. package/dist/cli/commands/init.js +85 -0
  18. package/dist/cli/commands/init.js.map +1 -0
  19. package/dist/cli/commands/migrate.d.ts +8 -0
  20. package/dist/cli/commands/migrate.d.ts.map +1 -0
  21. package/dist/cli/commands/migrate.js +119 -0
  22. package/dist/cli/commands/migrate.js.map +1 -0
  23. package/dist/cli/commands/refine.d.ts +7 -0
  24. package/dist/cli/commands/refine.d.ts.map +1 -0
  25. package/dist/cli/commands/refine.js +148 -0
  26. package/dist/cli/commands/refine.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +56 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/utils/prompts.d.ts +10 -0
  32. package/dist/cli/utils/prompts.d.ts.map +1 -0
  33. package/dist/cli/utils/prompts.js +90 -0
  34. package/dist/cli/utils/prompts.js.map +1 -0
  35. package/dist/cli/utils/validation.d.ts +15 -0
  36. package/dist/cli/utils/validation.d.ts.map +1 -0
  37. package/dist/cli/utils/validation.js +166 -0
  38. package/dist/cli/utils/validation.js.map +1 -0
  39. package/dist/models/config.d.ts +23 -0
  40. package/dist/models/config.d.ts.map +1 -0
  41. package/dist/models/config.js +22 -0
  42. package/dist/models/config.js.map +1 -0
  43. package/dist/models/experience.d.ts +239 -0
  44. package/dist/models/experience.d.ts.map +1 -0
  45. package/dist/models/experience.js +16 -0
  46. package/dist/models/experience.js.map +1 -0
  47. package/dist/services/archive-analyzer.d.ts +13 -0
  48. package/dist/services/archive-analyzer.d.ts.map +1 -0
  49. package/dist/services/archive-analyzer.js +106 -0
  50. package/dist/services/archive-analyzer.js.map +1 -0
  51. package/dist/services/draft-analyzer.d.ts +7 -0
  52. package/dist/services/draft-analyzer.d.ts.map +1 -0
  53. package/dist/services/draft-analyzer.js +205 -0
  54. package/dist/services/draft-analyzer.js.map +1 -0
  55. package/dist/services/experience-locator.d.ts +31 -0
  56. package/dist/services/experience-locator.d.ts.map +1 -0
  57. package/dist/services/experience-locator.js +162 -0
  58. package/dist/services/experience-locator.js.map +1 -0
  59. package/dist/services/experience-manager.d.ts +52 -0
  60. package/dist/services/experience-manager.d.ts.map +1 -0
  61. package/dist/services/experience-manager.js +157 -0
  62. package/dist/services/experience-manager.js.map +1 -0
  63. package/dist/services/file-manager.d.ts +18 -0
  64. package/dist/services/file-manager.d.ts.map +1 -0
  65. package/dist/services/file-manager.js +90 -0
  66. package/dist/services/file-manager.js.map +1 -0
  67. package/dist/services/markdown-processor.d.ts +17 -0
  68. package/dist/services/markdown-processor.d.ts.map +1 -0
  69. package/dist/services/markdown-processor.js +57 -0
  70. package/dist/services/markdown-processor.js.map +1 -0
  71. package/dist/services/migration-service.d.ts +74 -0
  72. package/dist/services/migration-service.d.ts.map +1 -0
  73. package/dist/services/migration-service.js +392 -0
  74. package/dist/services/migration-service.js.map +1 -0
  75. package/dist/services/slug-generator.d.ts +5 -0
  76. package/dist/services/slug-generator.d.ts.map +1 -0
  77. package/dist/services/slug-generator.js +31 -0
  78. package/dist/services/slug-generator.js.map +1 -0
  79. package/dist/services/workflow-manager.d.ts +11 -0
  80. package/dist/services/workflow-manager.d.ts.map +1 -0
  81. package/dist/services/workflow-manager.js +33 -0
  82. package/dist/services/workflow-manager.js.map +1 -0
  83. package/dist/templates/ai-prompts.d.ts +16 -0
  84. package/dist/templates/ai-prompts.d.ts.map +1 -0
  85. package/dist/templates/ai-prompts.js +257 -0
  86. package/dist/templates/ai-prompts.js.map +1 -0
  87. package/dist/templates/skills/resumate.archive.md.template +75 -0
  88. package/dist/templates/skills/resumate.draft.md.template +46 -0
  89. package/dist/templates/skills/resumate.refine.md.template +94 -0
  90. package/package.json +59 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 taeyeongryu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # Resumate
2
+
3
+ 커리어 경험을 자유롭게 기록하고, AI와의 대화를 통해 이력서에 바로 쓸 수 있는 구조화된 데이터로 변환합니다.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g resumate
9
+ ```
10
+
11
+ **필수 요건:** Node.js 18+, [Claude Code](https://claude.ai/code)
12
+
13
+ ## 사용법
14
+
15
+ ### 1. 프로젝트 만들기
16
+
17
+ ```bash
18
+ resumate init my-career
19
+ cd my-career
20
+ ```
21
+
22
+ 이 폴더에서 Claude Code를 실행하면 Resumate 스킬을 사용할 수 있습니다.
23
+
24
+ ### 2. 경험 기록하기
25
+
26
+ Claude Code에서 `/resumate.draft`를 실행하면 AI가 제목, 회사명, 직책을 물어보고 초안 파일을 만들어줍니다.
27
+
28
+ 파일을 열어 경험을 자유롭게 작성합니다. 형식에 구애받지 않고 편하게 쓰면 됩니다:
29
+
30
+ ```markdown
31
+ 회사에서 대시보드 프로젝트의 로딩 속도가 너무 느려서 최적화 작업을 했다.
32
+ React.memo랑 useMemo를 적극적으로 활용하고, 번들 사이즈도 줄였다.
33
+ 결과적으로 로딩 시간을 반으로 줄였다. 사용한 기술은 react, ts, 레디스.
34
+ ```
35
+
36
+ ### 3. AI Q&A로 다듬기
37
+
38
+ Claude Code에서 `/resumate.refine react-optimization`을 실행하면 AI가 초안을 분석하고 부족한 정보를 질문합니다:
39
+
40
+ > "작업 기간은 어떻게 되나요?"
41
+ > "구체적인 성과 지표가 있나요?"
42
+
43
+ 질문에 답변을 작성하고 다시 `/resumate.refine`을 실행하면 다음 질문이 이어집니다. 충분하면 `완료` 또는 `done`을 입력합니다.
44
+
45
+ ### 4. 이력서용 데이터로 변환하기
46
+
47
+ Claude Code에서 `/resumate.archive react-optimization`을 실행하면 AI가 최종 구조화를 수행합니다:
48
+
49
+ - **기술명 정규화** — "ts" → "TypeScript", "레디스" → "Redis"
50
+ - **성과 변환** — "로딩 시간 반으로 줄임" → "페이지 로딩 시간 50% 개선"
51
+ - **날짜 해석** — "3월 말부터 상반기까지" → 2024-03-31 ~ 2024-06-30
52
+ - **완성도 평가** — 0-100% 점수와 개선 제안
53
+
54
+ ## 결과물 예시
55
+
56
+ ```yaml
57
+ ---
58
+ title: "React 성능 최적화"
59
+ date: "2024-06-15"
60
+ duration:
61
+ original: "3월 말부터 상반기까지"
62
+ start: "2024-03-31"
63
+ end: "2024-06-30"
64
+ interpretation: "2024년 3월 말 ~ 6월 말 (약 3개월)"
65
+ project: "TechCorp Dashboard"
66
+ technologies:
67
+ - original: "react"
68
+ normalized: "React"
69
+ - original: "ts"
70
+ normalized: "TypeScript"
71
+ achievements:
72
+ - original: "로딩 시간 반으로 줄임"
73
+ resumeReady: "페이지 로딩 시간 50% 개선"
74
+ completeness:
75
+ score: 85
76
+ suggestions:
77
+ - "개인적인 소감을 추가하면 더 좋습니다"
78
+ tags:
79
+ - frontend
80
+ - typescript
81
+ ---
82
+ ```
83
+
84
+ ## 스킬 요약
85
+
86
+ | 스킬 | 설명 |
87
+ |------|------|
88
+ | `/resumate.draft` | 새 경험 초안 생성 |
89
+ | `/resumate.refine <검색어>` | AI Q&A로 경험 다듬기 |
90
+ | `/resumate.archive <검색어>` | 이력서용 구조화 데이터 생성 |
91
+
92
+ 검색어는 슬러그(`react-optimization`), 날짜(`2024-06`), 키워드(`react performance`) 등 유연하게 사용할 수 있습니다.
93
+
94
+ 스킬 정의를 최신 버전으로 업데이트하려면 `resumate update`를 실행합니다.
95
+
96
+ ## License
97
+
98
+ MIT
@@ -0,0 +1,8 @@
1
+ export declare function addCommand(options: {
2
+ title?: string;
3
+ company?: string;
4
+ role?: string;
5
+ date?: string;
6
+ slug?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChB"}
@@ -0,0 +1,47 @@
1
+ import { createConfig } from '../../models/config.js';
2
+ import { validateResumateInitialized } from '../utils/validation.js';
3
+ import { ExperienceManager } from '../../services/experience-manager.js';
4
+ import { generateDatePrefix, generateSlug } from '../../services/slug-generator.js';
5
+ export async function addCommand(options) {
6
+ const rootDir = process.cwd();
7
+ const config = createConfig(rootDir);
8
+ if (!(await validateResumateInitialized(rootDir))) {
9
+ console.error('✗ Error: Not a Resumate project');
10
+ console.error('');
11
+ console.error(" Run 'resumate init' first to initialize the project.");
12
+ process.exit(1);
13
+ }
14
+ const title = options.title || 'Untitled Experience';
15
+ const company = options.company || 'Unknown Company';
16
+ const role = options.role || 'Unknown Role';
17
+ const dateStr = options.date || generateDatePrefix();
18
+ const slug = options.slug || generateSlug(title);
19
+ try {
20
+ const manager = new ExperienceManager(config);
21
+ const date = new Date(dateStr);
22
+ if (isNaN(date.getTime())) {
23
+ console.error(`✗ Error: Invalid date format: ${dateStr}`);
24
+ console.error('');
25
+ console.error(' Expected format: YYYY-MM-DD (e.g., 2024-06-15)');
26
+ process.exit(1);
27
+ }
28
+ const experience = await manager.createExperience(date, slug, {
29
+ title,
30
+ company,
31
+ role,
32
+ });
33
+ console.log(`✓ Created experience: ${experience.name}`);
34
+ console.log('');
35
+ console.log(` Location: experiences/${experience.name}/draft.md`);
36
+ console.log('');
37
+ console.log(' Next steps:');
38
+ console.log(' • Edit the draft in your editor');
39
+ console.log(` • Run 'resumate refine ${dateStr}' when ready for Q&A`);
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ console.error(`✗ Error: ${message}`);
44
+ process.exit(1);
45
+ }
46
+ }
47
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAMhC;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC,CAAC,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC;IAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE;YAC5D,KAAK;YACL,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,CAAC,IAAI,WAAW,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,sBAAsB,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ArchiveOptions {
2
+ prompt?: boolean;
3
+ content?: string;
4
+ }
5
+ export declare function archiveCommand(query: string, options?: ArchiveOptions): Promise<void>;
6
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA8CD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE3F"}
@@ -0,0 +1,276 @@
1
+ import { createConfig } from '../../models/config.js';
2
+ import { validateResumateInitialized, parseDurationFromText, parseList, generateTags, validateStructuredArchiveContent } from '../utils/validation.js';
3
+ import { ExperienceManager } from '../../services/experience-manager.js';
4
+ import { ExperienceLocator } from '../../services/experience-locator.js';
5
+ import { extractTitle, extractQASection, parseQAPairs, stringifyMarkdown } from '../../services/markdown-processor.js';
6
+ import { analyzeRefined, calculateCompleteness } from '../../services/archive-analyzer.js';
7
+ import { buildArchivePromptOutput } from '../../templates/ai-prompts.js';
8
+ function extractFieldFromQA(qaPairs, fieldKeywords) {
9
+ for (const pair of qaPairs) {
10
+ const questionLower = pair.question.toLowerCase();
11
+ if (fieldKeywords.some((kw) => questionLower.includes(kw)) && pair.answer) {
12
+ return pair.answer;
13
+ }
14
+ }
15
+ return undefined;
16
+ }
17
+ function extractData(originalContent, qaPairs, dateStr) {
18
+ const title = extractTitle(originalContent);
19
+ const date = dateStr;
20
+ const durationText = extractFieldFromQA(qaPairs, ['기간', '시작일', '종료일', 'timeframe', 'duration']);
21
+ const duration = durationText ? (parseDurationFromText(durationText) ?? undefined) : undefined;
22
+ const achievementText = extractFieldFromQA(qaPairs, ['성과', 'achievement', '지표', 'metric']);
23
+ const achievements = achievementText ? parseList(achievementText) : undefined;
24
+ const techText = extractFieldFromQA(qaPairs, ['기술', '도구', 'technolog', 'tool']);
25
+ const technologies = techText ? parseList(techText) : undefined;
26
+ const learnings = extractFieldFromQA(qaPairs, ['배운', 'learning', '교훈']);
27
+ const reflections = extractFieldFromQA(qaPairs, ['느끼', 'reflection', '소감', '계획']);
28
+ const project = extractFieldFromQA(qaPairs, ['프로젝트', '회사', 'project', 'company']);
29
+ const tags = technologies ? generateTags(technologies) : undefined;
30
+ return { title, date, duration, project, technologies, tags, achievements, learnings, reflections };
31
+ }
32
+ export async function archiveCommand(query, options) {
33
+ const rootDir = process.cwd();
34
+ const config = createConfig(rootDir);
35
+ if (!(await validateResumateInitialized(rootDir))) {
36
+ console.error('✗ Error: Not a Resumate project');
37
+ console.error('');
38
+ console.error(" Run 'resumate init' first to initialize the project.");
39
+ process.exit(1);
40
+ }
41
+ try {
42
+ const manager = new ExperienceManager(config);
43
+ const locator = new ExperienceLocator(config);
44
+ // Use ExperienceLocator for flexible search
45
+ const experience = await locator.findOne(query);
46
+ // Check if refined exists
47
+ if (!experience.versions.refined) {
48
+ console.error(`✗ Error: No refined version found for experience: ${experience.name}`);
49
+ console.error('');
50
+ console.error(' The archive command requires a refined version.');
51
+ console.error('');
52
+ console.error(' Next steps:');
53
+ console.error(` 1. Run 'resumate refine ${experience.name}' first`);
54
+ console.error(` 2. Then run 'resumate archive ${experience.name}'`);
55
+ process.exit(1);
56
+ }
57
+ // Check if already archived
58
+ if (experience.versions.archived) {
59
+ console.error(`✗ Error: Experience already has archived version: ${experience.name}`);
60
+ console.error('');
61
+ console.error(` Location: experiences/${experience.name}/archived.md`);
62
+ console.error('');
63
+ console.error(' Options:');
64
+ console.error(' • Edit archived.md directly');
65
+ console.error(" • Delete archived.md and run 'resumate archive' again to recreate");
66
+ process.exit(1);
67
+ }
68
+ // Read refined content
69
+ const refinedContent = await manager.getVersion(experience.name, 'refined');
70
+ const dateStr = experience.date.toISOString().split('T')[0];
71
+ // Handle --prompt flag: analyze and output JSON
72
+ if (options?.prompt) {
73
+ await handlePromptMode(refinedContent, experience.name, dateStr);
74
+ return;
75
+ }
76
+ // Handle --content flag: accept AI-structured content and write archive
77
+ if (options?.content) {
78
+ await handleContentMode(options.content, refinedContent, experience.name, dateStr, manager);
79
+ return;
80
+ }
81
+ // Default: relaxed fallback mode (never fails)
82
+ await handleFallbackMode(refinedContent, experience.name, dateStr, manager);
83
+ }
84
+ catch (error) {
85
+ const message = error instanceof Error ? error.message : String(error);
86
+ console.error(`✗ Error: ${message}`);
87
+ process.exit(1);
88
+ }
89
+ }
90
+ async function handlePromptMode(refinedContent, experienceName, dateStr) {
91
+ const analysis = analyzeRefined(refinedContent, dateStr);
92
+ const output = buildArchivePromptOutput(analysis, experienceName);
93
+ process.stdout.write(JSON.stringify(output));
94
+ }
95
+ async function handleContentMode(contentJson, refinedContent, experienceName, dateStr, manager) {
96
+ const data = validateStructuredArchiveContent(contentJson);
97
+ console.log(`Found experience: ${experienceName}`);
98
+ console.log('');
99
+ console.log('Generating AI-structured archive...');
100
+ // Build frontmatter
101
+ const frontmatter = {
102
+ title: data.title,
103
+ date: dateStr,
104
+ };
105
+ if (data.duration) {
106
+ frontmatter.duration = data.duration;
107
+ }
108
+ if (data.project)
109
+ frontmatter.project = data.project;
110
+ if (data.technologies.length > 0)
111
+ frontmatter.technologies = data.technologies;
112
+ if (data.achievements.length > 0)
113
+ frontmatter.achievements = data.achievements;
114
+ if (data.learnings)
115
+ frontmatter.learnings = data.learnings;
116
+ if (data.reflections)
117
+ frontmatter.reflections = data.reflections;
118
+ // Generate tags from normalized technology names
119
+ const normalizedTechNames = data.technologies.map((t) => t.normalized);
120
+ const tags = generateTags(normalizedTechNames);
121
+ if (tags.length > 0)
122
+ frontmatter.tags = tags;
123
+ // Include completeness metadata
124
+ frontmatter.completeness = {
125
+ score: data.completeness.score,
126
+ suggestions: data.completeness.suggestions,
127
+ };
128
+ // Build markdown body
129
+ const qaResult = extractQASection(refinedContent);
130
+ const originalContent = qaResult
131
+ ? qaResult.originalContent.replace(/^---[\s\S]*?---\s*/, '').replace(/^#.*\n\n?/, '').trim()
132
+ : refinedContent.replace(/^---[\s\S]*?---\s*/, '').replace(/^#.*\n\n?/, '').trim();
133
+ let body = `\n# Detailed Context\n\n${originalContent}`;
134
+ // Achievements with resume-ready suggestions
135
+ if (data.achievements.length > 0) {
136
+ body += '\n\n## Achievements\n\n';
137
+ for (const a of data.achievements) {
138
+ body += `- ${a.original}\n`;
139
+ if (a.resumeReady !== a.original) {
140
+ body += ` → 이력서 작성 시: "${a.resumeReady}"\n`;
141
+ }
142
+ }
143
+ }
144
+ // Key Learnings
145
+ if (data.learnings) {
146
+ body += `\n## Key Learnings\n\n${data.learnings}\n`;
147
+ }
148
+ // Q&A Summary
149
+ if (data.qaSummary.length > 0) {
150
+ body += '\n## Q&A Summary\n\n';
151
+ for (const qa of data.qaSummary) {
152
+ body += `### Q: ${qa.question}\n`;
153
+ body += `**A**: ${qa.answer}\n`;
154
+ body += `**해석**: ${qa.interpretation}\n\n`;
155
+ }
156
+ }
157
+ // AI Comments
158
+ if (data.aiComments) {
159
+ body += `## AI Comments\n\n${data.aiComments}\n`;
160
+ }
161
+ const archiveContent = stringifyMarkdown(body + '\n', frontmatter);
162
+ await manager.addArchivedVersion(experienceName, archiveContent);
163
+ printArchiveSuccess(experienceName, data);
164
+ }
165
+ async function handleFallbackMode(refinedContent, experienceName, dateStr, manager) {
166
+ console.log(`Found experience: ${experienceName}`);
167
+ console.log('');
168
+ console.log('Generating structured archive from refined version...');
169
+ const qaResult = extractQASection(refinedContent);
170
+ // Handle case where there's no Q&A section — archive content as-is
171
+ const originalContent = qaResult
172
+ ? qaResult.originalContent
173
+ : refinedContent;
174
+ const qaPairs = qaResult ? parseQAPairs(qaResult.qaSection) : [];
175
+ const data = extractData(originalContent, qaPairs, dateStr);
176
+ // Build frontmatter — never fail, use null for missing fields
177
+ const frontmatter = {
178
+ title: data.title || experienceName,
179
+ date: data.date,
180
+ };
181
+ if (data.duration)
182
+ frontmatter.duration = data.duration;
183
+ if (data.project)
184
+ frontmatter.project = data.project;
185
+ if (data.technologies?.length)
186
+ frontmatter.technologies = data.technologies;
187
+ if (data.tags?.length)
188
+ frontmatter.tags = data.tags;
189
+ if (data.achievements?.length)
190
+ frontmatter.achievements = data.achievements;
191
+ if (data.learnings)
192
+ frontmatter.learnings = data.learnings;
193
+ if (data.reflections)
194
+ frontmatter.reflections = data.reflections;
195
+ // Calculate completeness for fallback mode
196
+ const completeness = calculateCompleteness({
197
+ title: data.title,
198
+ duration: data.duration,
199
+ achievements: data.achievements,
200
+ technologies: data.technologies,
201
+ learnings: data.learnings,
202
+ project: data.project,
203
+ reflections: data.reflections,
204
+ });
205
+ frontmatter.completeness = {
206
+ score: completeness.score,
207
+ suggestions: completeness.suggestions,
208
+ };
209
+ // Build body
210
+ const contentBody = originalContent.replace(/^---[\s\S]*?---\s*/, '').replace(/^#.*\n\n?/, '').trim();
211
+ let body = `\n# Detailed Context\n\n${contentBody}`;
212
+ if (data.achievements?.length) {
213
+ body += '\n\n## Achievements\n\n';
214
+ data.achievements.forEach((a) => (body += `- ${a}\n`));
215
+ }
216
+ if (data.learnings) {
217
+ body += `\n## Key Learnings\n\n${data.learnings}\n`;
218
+ }
219
+ const archiveContent = stringifyMarkdown(body + '\n', frontmatter);
220
+ await manager.addArchivedVersion(experienceName, archiveContent);
221
+ console.log(`✓ Created archived version: experiences/${experienceName}/archived.md`);
222
+ console.log('');
223
+ console.log(' Preserved versions:');
224
+ console.log(' • draft.md (original)');
225
+ console.log(' • refined.md (with Q&A)');
226
+ console.log('');
227
+ console.log(' Extracted fields:');
228
+ console.log(` Title: ${data.title}`);
229
+ if (data.duration)
230
+ console.log(` Duration: ${data.duration.start} to ${data.duration.end}`);
231
+ if (data.project)
232
+ console.log(` Project: ${data.project}`);
233
+ if (data.technologies?.length)
234
+ console.log(` Technologies: ${data.technologies.length} items`);
235
+ if (data.achievements?.length)
236
+ console.log(` Achievements: ${data.achievements.length} items`);
237
+ if (data.learnings)
238
+ console.log(' Learnings: Documented');
239
+ if (data.reflections)
240
+ console.log(' Reflections: Documented');
241
+ console.log('');
242
+ console.log(` Completeness: ${completeness.score}%`);
243
+ if (completeness.suggestions.length > 0) {
244
+ console.log(' Suggestions:');
245
+ completeness.suggestions.slice(0, 3).forEach((s) => console.log(` • ${s}`));
246
+ }
247
+ }
248
+ function printArchiveSuccess(experienceName, data) {
249
+ console.log(`✓ Created archived version: experiences/${experienceName}/archived.md`);
250
+ console.log('');
251
+ console.log(' Preserved versions:');
252
+ console.log(' • draft.md (original)');
253
+ console.log(' • refined.md (with Q&A)');
254
+ console.log('');
255
+ console.log(' Structured fields:');
256
+ console.log(` Title: ${data.title}`);
257
+ if (data.duration)
258
+ console.log(` Duration: ${data.duration.interpretation}`);
259
+ if (data.project)
260
+ console.log(` Project: ${data.project}`);
261
+ if (data.technologies.length > 0)
262
+ console.log(` Technologies: ${data.technologies.map(t => t.normalized).join(', ')}`);
263
+ if (data.achievements.length > 0)
264
+ console.log(` Achievements: ${data.achievements.length} items`);
265
+ if (data.learnings)
266
+ console.log(' Learnings: Documented');
267
+ if (data.reflections)
268
+ console.log(' Reflections: Documented');
269
+ console.log('');
270
+ console.log(` Completeness: ${data.completeness.score}%`);
271
+ if (data.completeness.suggestions.length > 0) {
272
+ console.log(' Suggestions:');
273
+ data.completeness.suggestions.slice(0, 3).forEach((s) => console.log(` • ${s}`));
274
+ }
275
+ }
276
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function draftCommand(content: string): Promise<void>;
2
+ //# sourceMappingURL=draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CjE"}
@@ -0,0 +1,45 @@
1
+ import path from 'node:path';
2
+ import { createConfig } from '../../models/config.js';
3
+ import { validateResumateInitialized } from '../utils/validation.js';
4
+ import { writeFile, directoryExists } from '../../services/file-manager.js';
5
+ import { extractTitle } from '../../services/markdown-processor.js';
6
+ import { generateUniqueFilename } from '../../services/slug-generator.js';
7
+ export async function draftCommand(content) {
8
+ const rootDir = process.cwd();
9
+ const config = createConfig(rootDir);
10
+ if (!(await validateResumateInitialized(rootDir))) {
11
+ console.error('Error: Resumate not initialized.');
12
+ console.error('Run `resumate init <projectname>` first.');
13
+ process.exit(1);
14
+ }
15
+ if (!(await directoryExists(config.draftsDir))) {
16
+ console.error('Error: .resumate/drafts/ directory not found.');
17
+ console.error('Run `resumate init <projectname>` to fix directory structure.');
18
+ process.exit(1);
19
+ }
20
+ if (!content || content.trim().length === 0) {
21
+ console.error('Error: Please provide content for your experience.');
22
+ console.error('Usage: resumate draft "Your experience text here"');
23
+ process.exit(1);
24
+ }
25
+ try {
26
+ const title = extractTitle(content);
27
+ const filename = await generateUniqueFilename(title, config.draftsDir);
28
+ const filepath = path.join(config.draftsDir, filename);
29
+ const hasTitle = content.trim().startsWith('#');
30
+ const fileContent = hasTitle ? content.trim() : `# ${title}\n\n${content.trim()}`;
31
+ await writeFile(filepath, fileContent + '\n');
32
+ console.log('Draft created successfully!');
33
+ console.log('');
34
+ console.log(` File: .resumate/drafts/${filename}`);
35
+ console.log('');
36
+ console.log('Next step: Refine this draft with AI');
37
+ console.log(` /resumate refine @${filename.replace('.md', '')}`);
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ console.error(`Error creating draft: ${message}`);
42
+ process.exit(1);
43
+ }
44
+ }
45
+ //# sourceMappingURL=draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ export declare function initCommand(projectname: string): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAmBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBnD;AAED,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CpE"}
@@ -0,0 +1,85 @@
1
+ import path from 'node:path';
2
+ import { createConfig } from '../../models/config.js';
3
+ import { ensureDirectory, directoryExists, writeFile, readFile } from '../../services/file-manager.js';
4
+ import { fileURLToPath } from 'node:url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const SKILL_TEMPLATES = [
8
+ 'resumate.draft.md.template',
9
+ 'resumate.refine.md.template',
10
+ 'resumate.archive.md.template',
11
+ ];
12
+ function getTemplatesDir() {
13
+ // In dist: dist/cli/commands/init.js -> we need dist/templates/skills/
14
+ return path.resolve(__dirname, '..', '..', 'templates', 'skills');
15
+ }
16
+ export async function updateCommand() {
17
+ const rootDir = process.cwd();
18
+ const config = createConfig(rootDir);
19
+ if (!(await directoryExists(config.resumateDir))) {
20
+ console.error('Error: Resumate not initialized in this directory.');
21
+ console.error('Run `resumate init <projectname>` first.');
22
+ process.exit(1);
23
+ }
24
+ try {
25
+ await installSkills(config.claudeCommandsDir);
26
+ console.log('Updated Claude Code skill definitions in .claude/commands/');
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ console.error(`Error updating skills: ${message}`);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ export async function initCommand(projectname) {
35
+ const rootDir = path.resolve(process.cwd(), projectname);
36
+ const config = createConfig(rootDir);
37
+ if (await directoryExists(config.resumateDir)) {
38
+ console.error(`Error: .resumate/ already exists in ${rootDir}`);
39
+ console.error('Resumate is already initialized in this directory.');
40
+ process.exit(1);
41
+ }
42
+ try {
43
+ // Create .resumate/ for metadata
44
+ await ensureDirectory(config.resumateDir);
45
+ // Create experiences/ directory (new structure)
46
+ await ensureDirectory(config.experiencesDir);
47
+ console.log(`Created directory structure in ${projectname}/`);
48
+ // Install Claude Code skills
49
+ await installSkills(config.claudeCommandsDir);
50
+ console.log('Installed Claude Code skill definitions in .claude/commands/');
51
+ console.log('');
52
+ console.log(`Resumate initialized successfully in ${projectname}/`);
53
+ console.log('');
54
+ console.log('Directory structure:');
55
+ console.log(` ${projectname}/`);
56
+ console.log(' ├── .resumate/ # metadata');
57
+ console.log(' ├── experiences/ # experience entries');
58
+ console.log(' └── .claude/ # AI commands (optional)');
59
+ console.log('');
60
+ console.log('Next steps:');
61
+ console.log(` 1. cd ${projectname}`);
62
+ console.log(' 2. Open Claude Code: claude');
63
+ console.log(' 3. Add a new experience: resumate add --interactive');
64
+ console.log('');
65
+ console.log('For existing projects with old structure:');
66
+ console.log(' • Run \'resumate migrate\' to convert');
67
+ }
68
+ catch (error) {
69
+ const message = error instanceof Error ? error.message : String(error);
70
+ console.error(`Error initializing Resumate: ${message}`);
71
+ process.exit(1);
72
+ }
73
+ }
74
+ async function installSkills(commandsDir) {
75
+ await ensureDirectory(commandsDir);
76
+ const templatesDir = getTemplatesDir();
77
+ for (const templateFile of SKILL_TEMPLATES) {
78
+ const templatePath = path.join(templatesDir, templateFile);
79
+ const skillName = templateFile.replace('.template', '');
80
+ const destPath = path.join(commandsDir, skillName);
81
+ const content = await readFile(templatePath);
82
+ await writeFile(destPath, content);
83
+ }
84
+ }
85
+ //# sourceMappingURL=init.js.map