--- name: hope-portfolio description: Use when a user wants to generate a portfolio — their work, their story, their evidence — as a self-contained branded portfolio folder (works offline — served locally or opened directly) they can send to a recruiter, post as a link, or save as a PDF. This is Hope's signature skill. Trigger phrases include "make my portfolio", "generate a portfolio", "create my portfolio for {company}", "I need a portfolio", "show off my work", "tailor a portfolio for this role", "build me something to send", or any request where the deliverable is a curated showcase of who the user is professionally. user-invocable: true --- # Hope Portfolio · Milestone 3 — Hope's Signature You are running Hope's portfolio generation. This is the skill that defines Hope. The user submits this artifact, and they get interview calls. Make it count. ## Locate the plugin files first (do this before anything else) Hope's reference docs and the portfolio template folder ship **inside the plugin**, not in the user's project. The paths below (`references/…`, `assets/templates/…`) are **relative to the plugin root** — they are NOT relative to your working directory (which is the user's project folder). `${CLAUDE_PLUGIN_ROOT}` is **not** substituted inside this Markdown, so you must resolve the plugin root yourself with Bash, once, before you read anything: ```bash # Resolve the Hope plugin root (references/, assets/, scripts/ live there). # $CLAUDE_PLUGIN_ROOT is NOT expanded in this Markdown — resolve in Bash. Works # whether Hope is installed, marketplace-cached, or run via --plugin-dir. PLUGIN_ROOT="" for c in "$CLAUDE_PLUGIN_ROOT" "$HOME"/.claude/plugins/cache/hope/hope/*/ "$HOME/.claude/plugins/marketplaces/hope"; do [ -n "$c" ] && [ -f "${c%/}/plugin.json" ] && { PLUGIN_ROOT="${c%/}"; break; } done [ -z "$PLUGIN_ROOT" ] && PLUGIN_ROOT="$(dirname "$(find "$HOME/.claude/plugins" -path '*hope*/plugin.json' -print -quit 2>/dev/null)")" echo "PLUGIN_ROOT=$PLUGIN_ROOT" # sanity-check before reading bundled files ``` If `PLUGIN_ROOT` comes back empty, ask the user where the Hope plugin is checked out (e.g. a `--plugin-dir` path) rather than guessing relative paths — a relative `references/…` read resolves against the user's project folder and will 404. Read these before generating — they're load-bearing. The design tokens are locked; the voice rules apply to every word in the portfolio: ```bash cat "$PLUGIN_ROOT/references/design-tokens.md" cat "$PLUGIN_ROOT/references/voice-guide.md" cat "$PLUGIN_ROOT/references/career-graph-schema.md" cat "$PLUGIN_ROOT/references/milestones.md" ``` ## What this skill outputs A **portfolio folder** at `career-graph/documents/portfolios/portfolio--/` containing exactly four named files — - `index.html` — skeleton + all content markup. Also home to everything that gets stamped or stripped: the JSON-LD block, the OG metas, the `hope:share-url` meta, and the `{{#show_summary}}` conditional structure (stamping + strip semantics unchanged). - `portfolio.css` — the full stylesheet; the design tokens (`:root`) live here and nowhere else. - `portfolio.js` — the full script. - `data.js` — a classic script defining one global, `window.HOPE_DATA = {…}`: the chronological dataset the Throughline reads, plus the traveler choice — see "The Throughline — timeline data contract" below. — plus two **share-card pages** (`share-card.html` and `share-card-square.html`) in the same folder — see "Share cards & link-preview meta" below. **The self-contained promise is folder-level: the folder needs nothing but a browser — fully offline-capable.** (Opening: see the "show it" step — on macOS, a one-line local server is the reliable path; double-click usually works but can be blocked by folder permissions.) That's law — classic `