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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/cli/commands/add.d.ts +8 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +47 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/archive.d.ts +6 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +276 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/draft.d.ts +2 -0
- package/dist/cli/commands/draft.d.ts.map +1 -0
- package/dist/cli/commands/draft.js +45 -0
- package/dist/cli/commands/draft.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +85 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +8 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +119 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/refine.d.ts +7 -0
- package/dist/cli/commands/refine.d.ts.map +1 -0
- package/dist/cli/commands/refine.js +148 -0
- package/dist/cli/commands/refine.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/prompts.d.ts +10 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -0
- package/dist/cli/utils/prompts.js +90 -0
- package/dist/cli/utils/prompts.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +15 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +166 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/dist/models/config.d.ts +23 -0
- package/dist/models/config.d.ts.map +1 -0
- package/dist/models/config.js +22 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/experience.d.ts +239 -0
- package/dist/models/experience.d.ts.map +1 -0
- package/dist/models/experience.js +16 -0
- package/dist/models/experience.js.map +1 -0
- package/dist/services/archive-analyzer.d.ts +13 -0
- package/dist/services/archive-analyzer.d.ts.map +1 -0
- package/dist/services/archive-analyzer.js +106 -0
- package/dist/services/archive-analyzer.js.map +1 -0
- package/dist/services/draft-analyzer.d.ts +7 -0
- package/dist/services/draft-analyzer.d.ts.map +1 -0
- package/dist/services/draft-analyzer.js +205 -0
- package/dist/services/draft-analyzer.js.map +1 -0
- package/dist/services/experience-locator.d.ts +31 -0
- package/dist/services/experience-locator.d.ts.map +1 -0
- package/dist/services/experience-locator.js +162 -0
- package/dist/services/experience-locator.js.map +1 -0
- package/dist/services/experience-manager.d.ts +52 -0
- package/dist/services/experience-manager.d.ts.map +1 -0
- package/dist/services/experience-manager.js +157 -0
- package/dist/services/experience-manager.js.map +1 -0
- package/dist/services/file-manager.d.ts +18 -0
- package/dist/services/file-manager.d.ts.map +1 -0
- package/dist/services/file-manager.js +90 -0
- package/dist/services/file-manager.js.map +1 -0
- package/dist/services/markdown-processor.d.ts +17 -0
- package/dist/services/markdown-processor.d.ts.map +1 -0
- package/dist/services/markdown-processor.js +57 -0
- package/dist/services/markdown-processor.js.map +1 -0
- package/dist/services/migration-service.d.ts +74 -0
- package/dist/services/migration-service.d.ts.map +1 -0
- package/dist/services/migration-service.js +392 -0
- package/dist/services/migration-service.js.map +1 -0
- package/dist/services/slug-generator.d.ts +5 -0
- package/dist/services/slug-generator.d.ts.map +1 -0
- package/dist/services/slug-generator.js +31 -0
- package/dist/services/slug-generator.js.map +1 -0
- package/dist/services/workflow-manager.d.ts +11 -0
- package/dist/services/workflow-manager.d.ts.map +1 -0
- package/dist/services/workflow-manager.js +33 -0
- package/dist/services/workflow-manager.js.map +1 -0
- package/dist/templates/ai-prompts.d.ts +16 -0
- package/dist/templates/ai-prompts.d.ts.map +1 -0
- package/dist/templates/ai-prompts.js +257 -0
- package/dist/templates/ai-prompts.js.map +1 -0
- package/dist/templates/skills/resumate.archive.md.template +75 -0
- package/dist/templates/skills/resumate.draft.md.template +46 -0
- package/dist/templates/skills/resumate.refine.md.template +94 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|