Oh-my-toong-playground resume-apply
MUST USE this skill when ANY of these appear: (1) a JD or job posting is present — look for keywords like 채용, 채용공고, 주요업무, 자격요건, Requirements, Qualifications, 우대사항, 포지션; (2) user mentions applying to a specific company — '지원', '지원하려고', '지원 준비', '이력서 지원', 'resume apply', 'apply'; (3) user wants to tailor resume for a position — '이력서 맞춤', '이력서 준비', 'JD 이력서', 'JD 기반', 'JD 보고'; (4) user provides a JD via text, file path, or URL; (5) user mentions a company name with intent to apply (e.g. '토스 지원', '네이버 준비', '카카오 이력서'); (6) user wants to find or browse JDs — '어디 넣을까', '지원할 곳', 'JD 찾아', 'JD 골라', '공고 뭐 있지', '지원 준비 시작'. This skill handles the FULL workflow: acquire JD (provided or discovered from configured source) → create branch ({company}/{YYMMDD}) → tailor resume via review-resume → commit → generate PDF → deliver to configured output. Do NOT confuse with review-resume (general review without a target JD) or simple _config.yml edits.
git clone https://github.com/toongri/oh-my-toong-playground
T=$(mktemp -d) && git clone --depth=1 https://github.com/toongri/oh-my-toong-playground "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/resume-apply" ~/.claude/skills/toongri-oh-my-toong-playground-resume-apply && rm -rf "$T"
skills/resume-apply/SKILL.mdResume Apply Workflow
End-to-end workflow that tailors a resume to a specific JD, generates a PDF, and delivers it to a configured output path.
Prerequisites
- Current directory:
project rootresume-manage - Docker running (required for PDF generation)
installedbun
Core Principle
All resume modifications are made by directly editing
_config.yml. Do not create intermediate files, scratch documents, or temporary drafts. Every change — whether applying review-resume feedback, tailoring content for a JD, or adjusting any resume field — happens in _config.yml itself.
Workflow
Execute the 7 steps below in order. Each step proceeds automatically to the next, except Step 3 (review-resume) which involves user interaction and follows the review-resume skill's protocol.
Step Completion Tracking
After completing each step, output:
[Step N/7: {step name} ✓]
Before starting the next step, verify the previous step's completion marker was output. Step 3 (review-resume) often involves extensive user interaction — after it concludes, re-read this Step list to locate your position and continue with Step 4. Steps 5-7 are the most commonly skipped because Step 3 consumes significant context.
Step 1: Acquire JD
Get the Job Description. Two paths depending on whether the user already has one.
1-A. JD Provided
The user provided a JD directly. Read it using the appropriate method:
- Text pasted directly → use as-is
- File path → read with the
toolRead - URL → fetch with
WebFetch
Skip to Extract from JD below.
1-B. JD Discovery
The user wants to apply but didn't provide a specific JD. Help them find one.
1. Check Configuration
Read
$OMT_DIR/resume-apply/config.yaml for the jd_source key.
- Key exists → go to step 3 (Browse JD Source)
- Key missing → go to step 2 (First-Run Interview)
2. First-Run Interview
Ask the user:
Q1. JD Storage Location
"JD 쌓아놓은 곳이 있나요? (로컬 폴더, 노션 페이지, 북마크 파일 등)"
Q2. Preference Criteria (optional)
"보통 어떤 회사나 포지션에 관심 있으세요? JD 고르는 기준이 있나요?"
없으면 최신순으로 보여드립니다.
Save to
$OMT_DIR/resume-apply/config.yaml:
jd_source: "<user answer — path, URL, or natural language rule>" jd_selection_order: "latest" # default, or user-specified criteria jd_preferences: # optional — only if user provided target_companies: [...] target_positions: [...] criteria: "<natural language>"
If the config file already has
pdf_output_dir_rule etc., append the new keys without overwriting existing ones.
3. Browse JD Source
Interpret
jd_source and list available JDs:
- Local directory → list files. 파일명에서 company/position/date를 먼저 추론하고 (예:
), 파일명만으로 정보가 부족한 경우에만 최근 10개 이내의 파일 본문을 읽어 추출한다.2026-03-25_toss_backend.md - URL → fetch with WebFetch, parse page content to extract JD listings (company/position/date)
- Natural language rule (e.g., "노션 취업 준비 페이지") → interpret the rule using available tools. If the source is not directly accessible, ask the user to provide the JD list or content.
Sort by
jd_selection_order (default: newest first). If jd_preferences exists, highlight matching JDs.
Present the list to the user:
Found 3 JDs in ~/Documents/jd/: 1. [2026-03-25] 토스 - Backend Engineer 2. [2026-03-20] 네이버 - Server Developer 3. [2026-03-15] 카카오 - Platform Engineer → 어떤 JD로 진행할까요?
4. User Selects
Read the selected JD and proceed to extraction.
Extract from JD
- Company name: English lowercase, kebab-case for multi-word names
- Application date: default to today (
format)YYMMDD
Confirm the extracted company name and date with the user before proceeding.
Example:
JD: "라인망가 백엔드 엔지니어 채용" → company: linemanga → date: 260320 (today) → branch: linemanga/260320
Step 2: Create Branch
Switch to
main first (to avoid carrying over another company's changes), then create a new branch:
git checkout main git checkout -b {company}/{YYMMDD}
If the branch already exists, ask the user whether to overwrite or use a different name.
Step 3: Review & Improve Resume
Invoke the
review-resume skill via the Skill tool.
Keep the full JD text in context — the review-resume skill needs the target position/company to perform accurate evaluation.
review-resume 스킬은 유저와의 인터랙션을 포함한 전체 평가 프로세스를 수행한다. 유저 승인까지 포함된 모든 과정이 완료될 때까지 Step 4로 진행하지 마라.
Step 4: Apply Review Findings & Commit
review-resume에서 승인된 수정사항을
_config.yml에 적용한다.
적용 완료 후 커밋:
git add _config.yml git commit -m "docs: {company} JD-based resume tailoring"
Include any other modified files in the commit if applicable.
Step 5: Generate PDF
bun run pdf {company}/{YYMMDD}
This script:
- Checks out the target branch
- Starts Jekyll server via Docker
- Converts to PDF via Playwright → produces
in project rootresume.pdf - Shuts down Docker and restores the original branch
This may take some time. Report errors to the user if they occur.
Step 6: Deliver PDF
6-1. Check Configuration
Read the output configuration file:
$OMT_DIR/resume-apply/config.yaml
- File not found → go to 6-2 (first-run interview)
- File exists → go to 6-3 (copy PDF)
6-2. First-Run Interview
Ask the user two questions:
Q1. PDF output directory rule
"What rule should determine the PDF output directory?"
Example:
~/Documents/cv 내에서 가장 숫자가 큰 기존 디렉토리 사용You can specify a fixed path (e.g.,
) or a dynamic rule that the AI will resolve each time.~/Desktop/지원서/
Q2. PDF naming format
"What naming convention should be used? You can combine these variables:"
— company name{company} — application date (YYMMDD){date} — name field from _config.yml{name} — position title extracted from the JD (use as-is from JD, do not translate){position}Example:
이력서_{name}_{company}_{date}.pdf
Save the answers as YAML:
# $OMT_DIR/resume-apply/config.yaml pdf_output_dir_rule: "<user answer>" pdf_naming_format: "<user answer>"
Create the directory with
mkdir -p if it doesn't exist.
6-3. Copy PDF
- Resolve output directory: Read
from config.pdf_output_dir_rule- If it's a fixed path, use directly.
- If it's a natural language rule (e.g., "~/Documents/cv 내에서 가장 숫자가 큰 기존 디렉토리"), interpret the rule: list the directory contents, apply the rule logic, and determine the correct path.
- Read the
field fromname
for the_config.yml
variable{name} - Extract
from the JD's position title (use as-is from JD, do not translate){position} - Substitute variables in
pdf_naming_format - Create resolved output directory if it doesn't exist
- Copy the PDF:
cp resume.pdf "{resolved_output_dir}/{substituted_filename}" - Report the final path to the user
Step 7: Push & Cleanup
Push the branch to origin and delete the local branch:
git push origin {company}/{YYMMDD} git branch -D {company}/{YYMMDD}
The local branch is safe to delete because the remote now has the full history. If the push fails, do not delete the local branch — report the error to the user.
Completion Verification
Before reporting completion to the user, output this checklist:
[Resume Apply Completion] - [ ] Step 1: JD acquired (provided or discovered), company/date confirmed - [ ] Step 2: Branch created from main - [ ] Step 3: review-resume completed (user approval included) - [ ] Step 4: Review findings applied to _config.yml and committed - [ ] Step 5: PDF generated - [ ] Step 6: PDF delivered to configured output - [ ] Step 7: Branch pushed and local deleted
Every step must be DONE. If any step shows incomplete, complete it before finalizing.