[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M74YD4RY95GW98409BRFM7KB":3,"skill-same:01M74YD4RY95GW98409BRFM7KB":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":49},"01M74YD4RY95GW98409BRFM7KB","build-profile",null,"Build or update the JobClaw master profile — the single file every other job-hunt skill reads. Ingests a resume (extracting every embedded URL), LinkedIn PDF, exported AI-memory, and links, then asks only for what's missing in one batched, optional gap prompt. Captures career-goal context for downstream skills.","jain777\u002Fjobclaw-skills","jain777","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57412580?v=4","01M74YCRYXSRMZFKERV6JS8M5D","Jeevesh Jain","01M74YCRZK4C3NNAEDWG5W8YMP",7,"MIT","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-profile\u002FSKILL.md",[],[],"2026-11-11 17:31:23",false,"---\nname: build-profile\ndescription: >\n  Build or update the JobClaw master profile — the single file every other job-hunt\n  skill reads. Ingests a resume (extracting every embedded URL), LinkedIn PDF, exported\n  AI-memory, and links, then asks only for what's missing in one batched, optional gap\n  prompt. Captures career-goal context for downstream skills.\nwhen_to_use: >\n  Use at the start of a job hunt, when onboarding a new user, when the user shares a\n  resume\u002FCV\u002FLinkedIn export, or whenever profile\u002Fmaster-profile.md is missing or stale.\nuser-invocable: true\nallowed-tools: Read, WebFetch, WebSearch, Write, Edit, Bash, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot\n---\n\n# build-profile\n\nProduce `profile\u002Fmaster-profile.md` from whatever the user already has, then fill gaps with a short, track-aware interview. **Ingest first, ask last.**\n\n## 1. Gather what exists (don't ask the user to retype anything)\n\nCollect any of these the user provides; actively offer the options:\n- **Resume \u002F CV** — see step 1a for PDFs (mandatory link-extractor first), then read the body with your runtime's file-read tool.\n- **LinkedIn PDF** — read it. (Point them to LinkedIn → profile → *Resources* → *Save to PDF* if they don't have it.)\n- **AI-memory (proactively offer it).** Ask once: *\"Have you used ChatGPT, Claude, or Gemini for your job search or career? Paste this prompt into the one you use most and bring back the result — I'll fold in recent interviews, feedback, and career details you'd otherwise have to retype.\"* Then surface the prompt from [`..\u002F..\u002Fprofile\u002FIMPORT_MEMORIES_PROMPT.md`](..\u002F..\u002Fprofile\u002FIMPORT_MEMORIES_PROMPT.md) (it pulls only **job-search-relevant** memories, not everything). On ingest, merge **only new facts** — never duplicate what the resume\u002Fprofile already has; mark uncertain items `[VERIFY]`.\n- **Links** — record every link, then **enrich** the user's own ones (see §1b). LinkedIn stays record-only (ToS).\n\nRead everything before asking anything.\n\n### 1a. For every PDF input — run the link extractor FIRST\n\nA typical agent file-read tool surfaces visible anchor text only (it shows the word \"LinkedIn\" but not the URL it's hyperlinked to). LaTeX\u002FWord\u002FDocs resumes routinely embed `\\href{url}{anchor}` annotations whose URLs are invisible to a plain read. **You will silently lose the user's LinkedIn \u002F GitHub \u002F portfolio URLs** if you skip this step — which is why `extract_links.py` exists.\n\n```\npython3 skills\u002Fbuild-profile\u002Fscripts\u002Fextract_links.py \u003Cpath-to-resume.pdf>\n```\n\nThe script decompresses every FlateDecode stream and pulls every `\u002FURI` annotation it can find. Stdout is JSON:\n\n```jsonc\n{\n  \"urls\": [\"https:\u002F\u002F...\", ...],           \u002F\u002F every URL found, in order\n  \"classified\": {\n    \"linkedin\": \"https:\u002F\u002Flinkedin.com\u002Fin\u002F...\",\n    \"github\": \"https:\u002F\u002Fgithub.com\u002F...\",\n    \"other\": { \"\u003Chost-or-label>\": \"\u003Curl>\", ... }\n  }\n}\n```\n\nThe script also returns a **`status`** field — branch on it:\n- `ok` → use the `classified` map directly to populate `links:` (canonical keys land in their named\n  fields; unknowns land in `links.other`). Surface any `links.other` entries with one short question —\n  *\"I found these other URLs in your resume: \u003Clist>. Keep any as portfolio links?\"* — so project pages\n  (e.g. *lambdatest.com\u002Fvisual-ai-testing*) can be promoted to `portfolio` if relevant.\n- `encrypted` \u002F `scanned_image` \u002F `unreadable` → the script never crashes (exit 0). When status is one\n  of these **and** the file-read tool also returns little\u002Fno body text, the PDF is unusable: tell the user\n  what's wrong (use the script's `note`) and offer the fallback ladder — (a) paste the resume text,\n  (b) supply a `.txt`\u002F`.md`\u002F`.docx` version, or (c) re-export from LinkedIn (*profile → Resources →\n  Save to PDF*). **Explicitly warn that embedded links are lost on scanned\u002Fencrypted PDFs** and ask\n  them to paste their LinkedIn \u002F GitHub \u002F portfolio URLs manually.\n\nAfter the extractor, use your runtime's file-read tool for body text. For non-PDF inputs (markdown, pasted text,\nLinkedIn URLs), scan the text directly with regex for any `https?:\u002F\u002F…` matches.\n\n### 1b. Enrich the user's own links (don't just record URLs)\n\nA portfolio or personal site usually holds proof points the resume omits (projects, metrics, roles,\nskills). Mine the user's **own** links — portfolio, personal site, project pages, and GitHub beyond the\nAPI — with a graceful fallback ladder. Skip LinkedIn (record-only, ToS). Cap at the few most relevant\nlinks so onboarding stays fast.\n\nFor each link, stop at the first tier that yields usable content:\n1. **GitHub** → `WebFetch https:\u002F\u002Fapi.github.com\u002Fusers\u002F\u003Cuser>` + `\u002Frepos?sort=stars` (top repos, languages, bio). No key.\n2. **`WebFetch` the page** → extract real proof points from the readable HTML.\n3. **`WebSearch`** (when WebFetch returns an SPA shell \u002F thin content) → search the person + domain\u002Fhandle for indexed content (project write-ups, talks, press).\n4. **Playwright MCP** (only if the session exposes it — optional, not required) → `mcp__playwright__browser_navigate` then `mcp__playwright__browser_snapshot` to render a JS-only page and read it. If Playwright isn't available, **skip it** and ask the user to paste a few highlights instead.\n\n**Rules:** ingest only **new** facts not already in the resume\u002Fprofile (no duplication); mark anything\ninferred (not explicitly stated by the user) as `[VERIFY]`; **never fabricate**. Summarize what you\nlearned back to the user in one line per link (\"Your portfolio shows X, Y — added as projects\").\n\n## 2. Know the track and region\n\n- **Track** (ask if unclear): `product · software · finance · quant · marketing · founders-office · hr · design · data · sales · operations · customer-success · content`. Decides which fields matter and which links to push for — see [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md).\n- **Region**: infer the applicant's `region` using this ladder, stopping at the first that resolves:\n  1. **Location string** → region code (`New York`→`US`, `Bengaluru`→`IN`).\n  2. **Contact clues** if location is missing\u002Fambiguous (e.g. \"Remote\") → a `+91` phone or `₹`\u002FCTC\u002FLPA\n     mentions → `IN`; a `+1` phone or `$`\u002Fstate abbreviations → `US`.\n  3. **`target.regions`** if already known from the conversation.\n  4. **Otherwise ask one short question:** *\"Which country are you based in, and where are you hunting?\"*\n  Codes must match a pack in [`..\u002F..\u002Fknowledge\u002Fregions\u002F`](..\u002F..\u002Fknowledge\u002Fregions\u002F). **Never silently\n  default to US.** When region was inferred from weak signals (clues, not an explicit location), write\n  it as `[VERIFY]` so downstream skills treat it as soft. Then confirm where they're hunting\n  (`target.regions`). The chosen pack dictates which region-specific fields to collect (IN →\n  current\u002Fexpected CTC + notice period; US → work authorization per\n  [`..\u002F..\u002Fknowledge\u002Fwork-authorization.md`](..\u002F..\u002Fknowledge\u002Fwork-authorization.md)) and what to omit\n  (e.g., don't collect photo\u002FDOB).\n\n## 3. Ask only for gaps\n\nCompare what you extracted against [reference\u002Fprofile-schema.md](reference\u002Fprofile-schema.md). Then ask a **short, batched** set of questions for only the missing or `[VERIFY]` fields, prioritizing the track's must-haves, the **region's** required fields (per the region pack), and anything `find-jobs`\u002F`score-fit` need (target roles, locations, remote preference, salary floor; work authorization for US; current\u002Fexpected CTC + notice period for IN). Don't interrogate — 5–8 crisp questions max, grouped, with sensible defaults offered.\n\n### 3a. The single optional links-gap prompt\n\nAfter populating `links:` from extraction, run **one** track-aware optional prompt to surface what the resume didn't include. Use the link gap matrix in [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md) to decide what to suggest.\n\nShape:\n\n> *\"I found these links: \\\u003Clist of canonical keys filled\\>. For \\\u003Ctrack\\> roles, candidates also commonly include: \\\u003Cstrongly + optional gaps from the matrix\\>. Want to add any? (Paste or skip.)\"*\n\n**One prompt. Dismissible. No follow-ups.** The user can paste any handle\u002FURL or skip entirely.\n\n### 3b. Two closing context prompts\n\nThe `context:` block is read by `find-jobs`, `score-fit`, and `tailor-resume` to bias direction — never rendered into a PDF or external message. Ask once:\n\n1. *\"In 2–3 sentences, what are you actually optimizing for over the next 12–24 months?\"* → `context.career_goal` (≤ 600 chars).\n2. *\"Anything else I should know that won't go on the resume — geo constraints, life situation, things to avoid?\"* → `context.additional_info` (≤ 400 chars). Skip if the conversation already covered it; record what surfaced.\n\nBoth fields are optional but high-value.\n\n### 3c. The single optional proof-point gap prompt\n\nGaps aren't just blank fields — the highest-value gap is **evidence a strong candidate for *this target* would show but the resume doesn't**. Compute the expected proof points for the user's `target.tracks` (+ AI archetype if applicable) from the **\"Proof-point coverage\"** section of [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md) (which points at the archetype proof points in [`..\u002F..\u002Fknowledge\u002Fai-roles.md`](..\u002F..\u002Fknowledge\u002Fai-roles.md) for AI tracks). Check coverage against the extracted Experience\u002FProjects\u002FAchievements, then ask **one** target-framed prompt:\n\n> *\"Strong \\\u003Ctarget track\u002Farchetype\\> candidates usually show \\\u003CX \u002F Y \u002F Z\\>. From your resume I can see \\\u003CX\\>; I don't see \\\u003CY, Z\\> — anything to add there? (Paste or skip.)\"*\n\nThis is the fix for the case where a missing portfolio\u002Fcase-study (marketing) or eval\u002FLLMOps evidence (AI Platform) is the candidate's **#1 gap for their target**, not a generic blank. Frame it by the target, never invent the evidence. **One prompt. Dismissible. No follow-ups.** Shares the relevance vocabulary in [`..\u002F..\u002Fknowledge\u002Frelevance.md`](..\u002F..\u002Fknowledge\u002Frelevance.md).\n\n## 4. Write the profile\n\nWrite `profile\u002Fmaster-profile.md` following [reference\u002Fprofile-schema.md](reference\u002Fprofile-schema.md) exactly (YAML frontmatter + markdown sections). Rules:\n- **Never fabricate.** If a fact is unknown, leave the field empty \u002F omit it; mark anything uncertain inline as `[VERIFY]`.\n- Quantify achievements where the source gives numbers; don't invent metrics.\n- Capture the user's **voice\u002Fconstraints** in the Notes section (tone, hard limits like no-relocation, sponsorship needs) — downstream skills rely on it.\n- Populate **every** link the extractor found (canonical keys to their named fields; everything else under `links.other`). Keep unfamiliar URLs even if you can't classify them.\n- If the file already exists, **update in place** (preserve user edits; only fill\u002Fcorrect).\n\n## 5. Confirm\n\nShow a tight summary (identity, target, # roles captured, # links captured, gaps still `[VERIFY]`) and tell the user they can now run `\u002Ffind-jobs`. Keep tone encouraging and concise — no emoji.\n\n**Heads-up on setup (mention once, now).** Run `python3 scripts\u002Fdoctor.py` to check dependencies. Everything works with no install **except producing resume PDFs**, which needs **rendercv** (a one-time install: `python3 -m venv skills\u002Frender-resume\u002F.venv && skills\u002Frender-resume\u002F.venv\u002Fbin\u002Fpip install \"rendercv[full]\"`). Flag this here so it's installed before the user reaches `\u002Ftailor-resume`, not mid-render. (API keys are all optional; doctor lists which strengthen find-jobs\u002Fresearch.)\n\n## Next steps\nProfile saved. Next: `\u002Ffind-jobs` to pull matching roles — or `\u002Fapply-to-job \u003Curl>` to evaluate one specific job end-to-end.\n","# build-profile\n\nProduce `profile\u002Fmaster-profile.md` from whatever the user already has, then fill gaps with a short, track-aware interview. **Ingest first, ask last.**\n\n## 1. Gather what exists (don't ask the user to retype anything)\n\nCollect any of these the user provides; actively offer the options:\n- **Resume \u002F CV** — see step 1a for PDFs (mandatory link-extractor first), then read the body with your runtime's file-read tool.\n- **LinkedIn PDF** — read it. (Point them to LinkedIn → profile → *Resources* → *Save to PDF* if they don't have it.)\n- **AI-memory (proactively offer it).** Ask once: *\"Have you used ChatGPT, Claude, or Gemini for your job search or career? Paste this prompt into the one you use most and bring back the result — I'll fold in recent interviews, feedback, and career details you'd otherwise have to retype.\"* Then surface the prompt from [`..\u002F..\u002Fprofile\u002FIMPORT_MEMORIES_PROMPT.md`](..\u002F..\u002Fprofile\u002FIMPORT_MEMORIES_PROMPT.md) (it pulls only **job-search-relevant** memories, not everything). On ingest, merge **only new facts** — never duplicate what the resume\u002Fprofile already has; mark uncertain items `[VERIFY]`.\n- **Links** — record every link, then **enrich** the user's own ones (see §1b). LinkedIn stays record-only (ToS).\n\nRead everything before asking anything.\n\n### 1a. For every PDF input — run the link extractor FIRST\n\nA typical agent file-read tool surfaces visible anchor text only (it shows the word \"LinkedIn\" but not the URL it's hyperlinked to). LaTeX\u002FWord\u002FDocs resumes routinely embed `\\href{url}{anchor}` annotations whose URLs are invisible to a plain read. **You will silently lose the user's LinkedIn \u002F GitHub \u002F portfolio URLs** if you skip this step — which is why `extract_links.py` exists.\n\n```\npython3 skills\u002Fbuild-profile\u002Fscripts\u002Fextract_links.py \u003Cpath-to-resume.pdf>\n```\n\nThe script decompresses every FlateDecode stream and pulls every `\u002FURI` annotation it can find. Stdout is JSON:\n\n```jsonc\n{\n  \"urls\": [\"https:\u002F\u002F...\", ...],           \u002F\u002F every URL found, in order\n  \"classified\": {\n    \"linkedin\": \"https:\u002F\u002Flinkedin.com\u002Fin\u002F...\",\n    \"github\": \"https:\u002F\u002Fgithub.com\u002F...\",\n    \"other\": { \"\u003Chost-or-label>\": \"\u003Curl>\", ... }\n  }\n}\n```\n\nThe script also returns a **`status`** field — branch on it:\n- `ok` → use the `classified` map directly to populate `links:` (canonical keys land in their named\n  fields; unknowns land in `links.other`). Surface any `links.other` entries with one short question —\n  *\"I found these other URLs in your resume: \u003Clist>. Keep any as portfolio links?\"* — so project pages\n  (e.g. *lambdatest.com\u002Fvisual-ai-testing*) can be promoted to `portfolio` if relevant.\n- `encrypted` \u002F `scanned_image` \u002F `unreadable` → the script never crashes (exit 0). When status is one\n  of these **and** the file-read tool also returns little\u002Fno body text, the PDF is unusable: tell the user\n  what's wrong (use the script's `note`) and offer the fallback ladder — (a) paste the resume text,\n  (b) supply a `.txt`\u002F`.md`\u002F`.docx` version, or (c) re-export from LinkedIn (*profile → Resources →\n  Save to PDF*). **Explicitly warn that embedded links are lost on scanned\u002Fencrypted PDFs** and ask\n  them to paste their LinkedIn \u002F GitHub \u002F portfolio URLs manually.\n\nAfter the extractor, use your runtime's file-read tool for body text. For non-PDF inputs (markdown, pasted text,\nLinkedIn URLs), scan the text directly with regex for any `https?:\u002F\u002F…` matches.\n\n### 1b. Enrich the user's own links (don't just record URLs)\n\nA portfolio or personal site usually holds proof points the resume omits (projects, metrics, roles,\nskills). Mine the user's **own** links — portfolio, personal site, project pages, and GitHub beyond the\nAPI — with a graceful fallback ladder. Skip LinkedIn (record-only, ToS). Cap at the few most relevant\nlinks so onboarding stays fast.\n\nFor each link, stop at the first tier that yields usable content:\n1. **GitHub** → `WebFetch https:\u002F\u002Fapi.github.com\u002Fusers\u002F\u003Cuser>` + `\u002Frepos?sort=stars` (top repos, languages, bio). No key.\n2. **`WebFetch` the page** → extract real proof points from the readable HTML.\n3. **`WebSearch`** (when WebFetch returns an SPA shell \u002F thin content) → search the person + domain\u002Fhandle for indexed content (project write-ups, talks, press).\n4. **Playwright MCP** (only if the session exposes it — optional, not required) → `mcp__playwright__browser_navigate` then `mcp__playwright__browser_snapshot` to render a JS-only page and read it. If Playwright isn't available, **skip it** and ask the user to paste a few highlights instead.\n\n**Rules:** ingest only **new** facts not already in the resume\u002Fprofile (no duplication); mark anything\ninferred (not explicitly stated by the user) as `[VERIFY]`; **never fabricate**. Summarize what you\nlearned back to the user in one line per link (\"Your portfolio shows X, Y — added as projects\").\n\n## 2. Know the track and region\n\n- **Track** (ask if unclear): `product · software · finance · quant · marketing · founders-office · hr · design · data · sales · operations · customer-success · content`. Decides which fields matter and which links to push for — see [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md).\n- **Region**: infer the applicant's `region` using this ladder, stopping at the first that resolves:\n  1. **Location string** → region code (`New York`→`US`, `Bengaluru`→`IN`).\n  2. **Contact clues** if location is missing\u002Fambiguous (e.g. \"Remote\") → a `+91` phone or `₹`\u002FCTC\u002FLPA\n     mentions → `IN`; a `+1` phone or `$`\u002Fstate abbreviations → `US`.\n  3. **`target.regions`** if already known from the conversation.\n  4. **Otherwise ask one short question:** *\"Which country are you based in, and where are you hunting?\"*\n  Codes must match a pack in [`..\u002F..\u002Fknowledge\u002Fregions\u002F`](..\u002F..\u002Fknowledge\u002Fregions\u002F). **Never silently\n  default to US.** When region was inferred from weak signals (clues, not an explicit location), write\n  it as `[VERIFY]` so downstream skills treat it as soft. Then confirm where they're hunting\n  (`target.regions`). The chosen pack dictates which region-specific fields to collect (IN →\n  current\u002Fexpected CTC + notice period; US → work authorization per\n  [`..\u002F..\u002Fknowledge\u002Fwork-authorization.md`](..\u002F..\u002Fknowledge\u002Fwork-authorization.md)) and what to omit\n  (e.g., don't collect photo\u002FDOB).\n\n## 3. Ask only for gaps\n\nCompare what you extracted against [reference\u002Fprofile-schema.md](reference\u002Fprofile-schema.md). Then ask a **short, batched** set of questions for only the missing or `[VERIFY]` fields, prioritizing the track's must-haves, the **region's** required fields (per the region pack), and anything `find-jobs`\u002F`score-fit` need (target roles, locations, remote preference, salary floor; work authorization for US; current\u002Fexpected CTC + notice period for IN). Don't interrogate — 5–8 crisp questions max, grouped, with sensible defaults offered.\n\n### 3a. The single optional links-gap prompt\n\nAfter populating `links:` from extraction, run **one** track-aware optional prompt to surface what the resume didn't include. Use the link gap matrix in [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md) to decide what to suggest.\n\nShape:\n\n> *\"I found these links: \\\u003Clist of canonical keys filled\\>. For \\\u003Ctrack\\> roles, candidates also commonly include: \\\u003Cstrongly + optional gaps from the matrix\\>. Want to add any? (Paste or skip.)\"*\n\n**One prompt. Dismissible. No follow-ups.** The user can paste any handle\u002FURL or skip entirely.\n\n### 3b. Two closing context prompts\n\nThe `context:` block is read by `find-jobs`, `score-fit`, and `tailor-resume` to bias direction — never rendered into a PDF or external message. Ask once:\n\n1. *\"In 2–3 sentences, what are you actually optimizing for over the next 12–24 months?\"* → `context.career_goal` (≤ 600 chars).\n2. *\"Anything else I should know that won't go on the resume — geo constraints, life situation, things to avoid?\"* → `context.additional_info` (≤ 400 chars). Skip if the conversation already covered it; record what surfaced.\n\nBoth fields are optional but high-value.\n\n### 3c. The single optional proof-point gap prompt\n\nGaps aren't just blank fields — the highest-value gap is **evidence a strong candidate for *this target* would show but the resume doesn't**. Compute the expected proof points for the user's `target.tracks` (+ AI archetype if applicable) from the **\"Proof-point coverage\"** section of [reference\u002Ftrack-presets.md](reference\u002Ftrack-presets.md) (which points at the archetype proof points in [`..\u002F..\u002Fknowledge\u002Fai-roles.md`](..\u002F..\u002Fknowledge\u002Fai-roles.md) for AI tracks). Check coverage against the extracted Experience\u002FProjects\u002FAchievements, then ask **one** target-framed prompt:\n\n> *\"Strong \\\u003Ctarget track\u002Farchetype\\> candidates usually show \\\u003CX \u002F Y \u002F Z\\>. From your resume I can see \\\u003CX\\>; I don't see \\\u003CY, Z\\> — anything to add there? (Paste or skip.)\"*\n\nThis is the fix for the case where a missing portfolio\u002Fcase-study (marketing) or eval\u002FLLMOps evidence (AI Platform) is the candidate's **#1 gap for their target**, not a generic blank. Frame it by the target, never invent the evidence. **One prompt. Dismissible. No follow-ups.** Shares the relevance vocabulary in [`..\u002F..\u002Fknowledge\u002Frelevance.md`](..\u002F..\u002Fknowledge\u002Frelevance.md).\n\n## 4. Write the profile\n\nWrite `profile\u002Fmaster-profile.md` following [reference\u002Fprofile-schema.md](reference\u002Fprofile-schema.md) exactly (YAML frontmatter + markdown sections). Rules:\n- **Never fabricate.** If a fact is unknown, leave the field empty \u002F omit it; mark anything uncertain inline as `[VERIFY]`.\n- Quantify achievements where the source gives numbers; don't invent metrics.\n- Capture the user's **voice\u002Fconstraints** in the Notes section (tone, hard limits like no-relocation, sponsorship needs) — downstream skills rely on it.\n- Populate **every** link the extractor found (canonical keys to their named fields; everything else under `links.other`). Keep unfamiliar URLs even if you can't classify them.\n- If the file already exists, **update in place** (preserve user edits; only fill\u002Fcorrect).\n\n## 5. Confirm\n\nShow a tight summary (identity, target, # roles captured, # links captured, gaps still `[VERIFY]`) and tell the user they can now run `\u002Ffind-jobs`. Keep tone encouraging and concise — no emoji.\n\n**Heads-up on setup (mention once, now).** Run `python3 scripts\u002Fdoctor.py` to check dependencies. Everything works with no install **except producing resume PDFs**, which needs **rendercv** (a one-time install: `python3 -m venv skills\u002Frender-resume\u002F.venv && skills\u002Frender-resume\u002F.venv\u002Fbin\u002Fpip install \"rendercv[full]\"`). Flag this here so it's installed before the user reaches `\u002Ftailor-resume`, not mid-render. (API keys are all optional; doctor lists which strengthen find-jobs\u002Fresearch.)\n\n## Next steps\nProfile saved. Next: `\u002Ffind-jobs` to pull matching roles — or `\u002Fapply-to-job \u003Curl>` to evaluate one specific job end-to-end.\n",{"name":5,"description":24,"when_to_use":25,"allowed-tools":26,"user-invocable":27},"Build or update the JobClaw master profile — the single file every other job-hunt skill reads. Ingests a resume (extracting every embedded URL), LinkedIn PDF, exported AI-memory, and links, then asks only for what's missing in one batched, optional gap prompt. Captures career-goal context for downstream skills.\n","Use at the start of a job hunt, when onboarding a new user, when the user shares a resume\u002FCV\u002FLinkedIn export, or whenever profile\u002Fmaster-profile.md is missing or stale.\n","Read, WebFetch, WebSearch, Write, Edit, Bash, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot",true,"main","68211e04d37044c49c3a91f3a29ce9647fada95f","skills\u002Fbuild-profile",1,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills","https:\u002F\u002Fgithub.com\u002Fjain777","https:\u002F\u002Fjeevesh.me\u002F","Product Manager | Builder | Claude Coder","2026-06-09 13:47:19",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":27},[39,42,45],{"tool":40,"command":41},"npx","npx skills add jain777\u002Fjobclaw-skills --skill build-profile",{"tool":43,"command":44},"bunx","bunx skills add jain777\u002Fjobclaw-skills --skill build-profile",{"tool":46,"command":47},"pnpm","pnpm dlx skills add jain777\u002Fjobclaw-skills --skill build-profile","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-profile\u002FSKILL.md",[50,56,60],{"path":51,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":55},"reference\u002Fprofile-schema.md","REFERENCE","参考文档",5656,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-profile\u002Freference\u002Fprofile-schema.md",{"path":57,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":58,"sourceHtmlUrl":59},"reference\u002Ftrack-presets.md",8035,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-profile\u002Freference\u002Ftrack-presets.md",{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"scripts\u002Fextract_links.py","SCRIPT","脚本",9308,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-profile\u002Fscripts\u002Fextract_links.py",[67,74,81,88,95,102],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M74YF759275CXY2ZWZBA1PD0","write-outreach","Write a short, profile-grounded cold outreach message to a recruiter, hiring manager, or potential referrer — LinkedIn DM or email — with one clear CTA and no flattery.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-outreach\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M74YF3WPDQ9D2PJ00XWH29EA","write-cover-letter","Produce a job-specific, profile-grounded cover letter in markdown — ≤ 350 words, ≤ 1 page, three paragraphs (hook → two quantified proofs → fit close). Reuses keywords from a prior tailor-resume sidecar when present. Writes a JSON sidecar reserved for a future \u002Frender-resume --kind cover-letter (rendercv).","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-cover-letter\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M74YF106JXZQ3DMDMVR722YH","triage-inbox","Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company \u002F role \u002F dates \u002F links \u002F asks \u002F deadline \u002F sentiment), and suggest the next action. Writes inbox\u002Ftriage-\u003CYYYY-MM-DD>.json — consumed by infer-status and draft-reply.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriage-inbox\u002FSKILL.md",[],[],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":19},"01M74YEX348VFDH9FG9C00WKG3","tailor-resume","Produce a job-specific, ATS-optimized resume from the user's master profile and a target job — reordering, reframing, and surfacing the most relevant real experience and keywords. Enforces a content rubric (bullet shape, length, parallel grammar, metric coverage), then renders a polished PDF by default (via render-resume) and visually QAs it. Never fabricates.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftailor-resume\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":19},"01M74YESFCVSEG3C0AB8QXVJBR","score-fit","Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched\u002Fmissing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscore-fit\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":19},"01M74YEP224H6Z9Q2K16YZ47K8","review-render","Visually QA a rendered resume PDF and auto-fix layout\u002Fcontent defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-render\u002FSKILL.md",[],[]]