From obsidian-resume
Generate a Harvard OCS-style LaTeX resume from Obsidian vault notes
How this command is triggered — by the user, by Claude, or both
Slash command
/obsidian-resume:generate-resume [path to obsidian_export.json or resume markdown]The summary Claude sees in its command listing — used to decide when to auto-load this command
# /generate-resume
Generate a Harvard OCS-style LaTeX resume from the user's Obsidian notes.
**Plugin root:** `${CLAUDE_PLUGIN_ROOT}`
**Skill source of truth:** `${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/`
Follow these steps in order. Do not skip steps.
---
## Step 1 — Locate the input
The user may have passed input as `$ARGUMENTS`. Resolve it like this:
1. **If `$ARGUMENTS` is a directory** → it's an Obsidian vault. Run the export script on it (see Step 1a below). **This is the recommended path.**
2. **If `$ARGUMENTS` is a `.json` file** → read it with the Read tool. This is a pr...Generate a Harvard OCS-style LaTeX resume from the user's Obsidian notes.
Plugin root: ${CLAUDE_PLUGIN_ROOT}
Skill source of truth: ${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/
Follow these steps in order. Do not skip steps.
The user may have passed input as $ARGUMENTS. Resolve it like this:
$ARGUMENTS is a directory → it's an Obsidian vault. Run the export script on it (see Step 1a below). This is the recommended path.$ARGUMENTS is a .json file → read it with the Read tool. This is a pre-exported obsidian_export.json.$ARGUMENTS is a .md file → read it. Treat as raw resume notes.$ARGUMENTS is empty → ask the user:
"Give me a path to your Obsidian vault folder, a pre-exported
obsidian_export.json, or paste markdown notes here."
Use Bash test -d "$ARGUMENTS" to distinguish a directory from a file.
Do not proceed until you have actual content.
When the user passes a vault path, invoke the bundled Python exporter via the Bash tool — do not reimplement the parsing inline.
OUT="$(mktemp -t obsidian_export.XXXXXX.json)"
python3 "${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/scripts/export_vault.py" \
--vault "$ARGUMENTS" \
--out "$OUT"
echo "$OUT"
Then read the JSON file at the path printed by echo. The script handles:
.obsidian/, .trash/, and other dot-directories#career, #resume, #job, #experience, etc.)
or career-named folders (Career, Job, Resume, CV, Work, Experience, Portfolio, ...)key:: value fieldsreferences/export_schema.mdIf the script fails:
python3: command not found → tell the user they need Python 3 installed and stop.Vault not found → the path was wrong; ask the user for the correct path.If the script returns zero notes:
Re-run with --all to include every .md file, or ask the user which folder/tag to scope to:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/scripts/export_vault.py" \
--vault "$ARGUMENTS" --all --out "$OUT"
Once you have the JSON, read it with the Read tool and proceed to Step 3.
Before generating LaTeX, read these in full:
${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/SKILL.md — full workflow${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/references/harvard_template.md — LaTeX preamble + section examples${CLAUDE_PLUGIN_ROOT}/skills/obsidian-resume/references/export_schema.md — JSON schema (only if working from JSON)These files are the authoritative spec. The rules in them override anything else.
Build the structured profile object defined in SKILL.md Step 1.
Rules:
title:, company:, dates:, tags:) map directly to profile fields## Experience, ## Skills headings signal sectionsbullets[]company:: Acme) are treated like frontmatter#career, #resume, #job mark notes as relevantApply every rule from references/harvard_template.md:
\hrule\hfill& % $ # _ { } ~ ^ \\usepackage[utf8]{inputenc} and \usepackage[T1]{fontenc} for accented namesRun the output checklist from SKILL.md:
inputenc and fontenc included\begin{} matches an \end{}\hfill\section*{} + \hrulepdflatex (mentally trace)Ask the user where to save:
"Where should I save the
.texfile? (default:./resume.tex)"
Write the complete .tex to that path with the Write tool. Then print compile instructions:
pdflatex resume.tex
pdflatex resume.tex # run twice for correct spacing
If pdflatex isn't installed, point to:
brew install --cask mactexsudo apt install texlive-fullAfter saving, offer:
"Resume saved. Want me to find live job listings that match this profile? Run
/find-jobswith the same input."
inputenc + fontenc. Do not transliterate names.npx claudepluginhub dawnn07/obsidian-resume --plugin obsidian-resume