agentleFS
muggl3mindmuggl3mind/career-manager/onboarding/SKILL.md

onboarding

Skill24 starsChanged 42 days agoMITView on GitHub

Set up your personalized career-manager pipeline. Reads your resume, asks 1 question, then generates all config files so the pipeline is ready to run. Use when first setting up the pipeline or when your career goals change.

  • Pipes a download into a shell
  • Installs packages

100 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use paywalls, popups and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • CesarjoquinSkill

    paywalls

    When the user wants to create or optimize in-app paywalls, upgrade screens, upsell modals, or feature gates. Also use when the user mentions "paywall," "upgrade screen," "upgrade modal," "upsell," "feature gate," "convert free to paid," "freemium conversion," "trial expiration screen," "limit reached screen," "plan upgrade prompt," "in-app pricing," "free users won't upgrade," "trial to paid conversion," or "how do I get users to pay." Use this for any in-product moment where you're asking users to upgrade. Distinct from public pricing pages (see cro) — this focuses on in-product upgrade moments where the user has already experienced value. For pricing decisions, see pricing.

    Also in 19 projects that use this

  • CesarjoquinSkill

    popups

    When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also use when the user mentions "exit intent," "popup conversions," "modal optimization," "lead capture popup," "email popup," "announcement banner," "overlay," "collect emails with a popup," "exit popup," "scroll trigger," "sticky bar," or "notification bar." Use this for any overlay or interrupt-style conversion element. For forms outside of popups, see cro. For general page conversion optimization, see cro.

    Also in 18 projects that use this

  • coreyhaines31Skill

    marketing-council

    When the user wants multiple expert perspectives on a marketing question — a simulated board of advisors staffed by legendary marketers (Seth Godin, David Ogilvy, Eugene Schwartz, April Dunford, Rory Sutherland, Alex Hormozi, Byron Sharp, and more). Also use when the user mentions 'marketing council,' 'board of advisors,' 'advisory board,' 'what would Seth Godin say,' 'what would Ogilvy think,' 'channel Hormozi,' 'get multiple perspectives,' 'debate this,' 'have the council review,' 'marketing mentors,' or asks how a famous marketer would approach their problem. The council gives each advisor's take through their documented frameworks, surfaces where they disagree, and synthesizes a recommendation. For executing the winning direction, hand off to positioning, offers, copywriting, ads, or the relevant skill.

    Also in 13 projects that use this

  • roerohanSkill

    prospecting

    When the user wants to find, qualify, and build a list of prospects to reach out to — across B2B SaaS, general B2B, or local small businesses. Also use when the user mentions "prospecting," "build a prospect list," "find prospects," "find leads," "lead gen list," "find SaaS companies that," "find B2B companies," "find local businesses," "ICP-fit accounts," "who should we go after," "outbound list," "target account list," "find clients near me," "businesses without websites," "prospect research," "qualified leads," "find my first customers," "early adopters," "design partners," "beta users," or "who has this problem." Use this for the list-building and qualification phase. For writing the outbound copy after the list is built, see cold-email. For deep competitive research on specific accounts, see competitor-profiling.

    Also in 16 projects that use this

  • roerohanSkill

    emails

    When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email program. Also use when the user mentions "email sequence," "drip campaign," "nurture sequence," "onboarding emails," "welcome sequence," "re-engagement emails," "email automation," "lifecycle emails," "trigger-based emails," "email funnel," "email workflow," "what emails should I send," "welcome series," or "email cadence." Use this for any multi-email automated flow. For cold outreach emails, see cold-email. For in-app onboarding, see onboarding.

    Also in 18 projects that use this

  • +7 more from Cesarjoquin

The file

Show its rules and text

We split this skill into the rules it gives an agent

26 rules. 0 are common, 19 are distinctive, and 7 are very specific to this project.

  • 0

    Common

    Most of the 85 edited versions we read keep these.

  • 19

    Distinctive

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If uv is not installed, install it first (official installer: macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh, Windows …

    line 20
  2. Distinctive:

    Before reading the resume or generating files, create a repo-local virtual environment if one doesn't already exist:

    line 22
  3. Very specific:

    Run all subsequent Python commands through uv run (e.g., uv run python3 scripts/smoke_test.py) so dependencies resolve against the …

    line 29
  4. Very specific:

    Ask: "Where's your resume?

    line 33
  5. Distinctive:

    When the user provides a path:

    line 35
  6. Very specific:

    Verify the file exists and is .docx or .pdf

    line 36
  7. Distinctive:

    Read the resume and extract: work history, skills, industries, seniority, education, accomplishments

    line 38
  8. Distinctive:

    If the file doesn't exist or isn't a supported format, ask again with guidance.

    line 40
  9. Distinctive:

    Ask this single combined question:

    line 46
  10. Distinctive:

    From targets: Add paths from the user's stated target roles that aren't already covered by Phase 1.

    line 70
  11. Distinctive:

    When presenting the paths, tell the user explicitly: "I'm starting with 4-5 focused paths so each search run stays fast.

    line 74
  12. Distinctive:

    Wait for confirmation. If the user tweaks anything, update and re-confirm.

    line 78
  13. Distinctive:

    After confirmation, generate all files silently.

    line 82
  14. Distinctive:

    IMPORTANT: Before writing each file, read the existing file first (Write tool requirement).

    line 84
  15. Very specific:

    All regex patterns must be valid Python regex, no inline flags like (?i)

    line 217
  16. Very specific:

    Default: ["United States"] if the user doesn't specify

    line 223
  17. Distinctive:

    If user says "Europe", expand to specific countries: Ireland, United Kingdom, Germany, Netherlands, France

    line 224
  18. Distinctive:

    Run smoke test checks inline (do not ask the user to run a separate command):

    line 242
  19. Distinctive:

    Verify all 4 generated files exist and are non-empty

    line 244
  20. Very specific:

    Run uv run python3 scripts/smoke_test.py and verify all checks pass (this validates search-config schema, query_packs is a dict, …

    line 245
  21. Distinctive:

    If all checks pass: "Setup complete." If any check fails: report the specific issue and fix it.

    line 247
  22. Distinctive:

    If any check fails: report the specific issue and fix it.

    line 248
  23. Distinctive:

    If the user has already run onboarding (files exist):

    line 256
  24. Distinctive:

    Ask: "You already have a profile set up.

    line 257
  25. Distinctive:

    Only regenerate files that need updating

    line 258
  26. Distinctive:

    Never touch pipeline data (target-companies.csv, applications.csv)

    line 260

“Common” is measured: kept by at least 6 in 10 of the 85 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Onboarding

Personalize the career-manager pipeline for a new user through a focused setup.

When to Use

  • First time setting up the pipeline after cloning
  • Career goals, target roles, or compensation targets have changed
  • Want to regenerate search queries or scoring criteria

Flow

Step 0: Ensure Local Python Environment

If uv is not installed, install it first (official installer: macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh, Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"), then make sure it is on PATH for subsequent commands. A system Python is not required — uv downloads a managed Python automatically when none is available.

Before reading the resume or generating files, create a repo-local virtual environment if one doesn't already exist:

uv venv
uv pip install -r requirements.txt

Run all subsequent Python commands through uv run (e.g., uv run python3 scripts/smoke_test.py) so dependencies resolve against the repo-local .venv and never install into a global Python, Conda, or system environment.

Step 1: Get the Resume

Ask: "Where's your resume? Give me the file path (e.g., ~/Desktop/resume.docx)"

When the user provides a path:

  1. Verify the file exists and is .docx or .pdf
  2. Copy it to cv-tailor/data/CV/Master CV/ (create directory if needed)
  3. Read the resume and extract: work history, skills, industries, seniority, education, accomplishments

If the file doesn't exist or isn't a supported format, ask again with guidance.

Do NOT ask the user to copy files manually. You handle the copy.

Step 2: One Question

Ask this single combined question:

"Based on your resume, I can see your background. I need four things your resume doesn't tell me:

  1. Target roles - What roles are you going after? Be specific about seniority (Senior PM, Director of Engineering, Solutions Architect) and domain.
  2. Salary floor - What's the minimum base salary you'd accept?
  3. Location - Remote, hybrid, or onsite? Open to relocation?
  4. Job markets - Which countries should I search for jobs in? (Default: United States)"

Step 3: Confirm Profile

Present the full profile combining resume inference + user answers:

"Here's your profile:

Background: [inferred from resume - key roles, industries, years of experience, strongest skills] Target roles: [from answer] Salary floor: [from answer] Location: [from answer] Career paths I'd search:

Derive paths in two phases:

  1. From resume: For each sector or employer type the user spent 2+ years in, derive a career path. Group similar employers (e.g., multiple Big 4 firms = one "Professional Services / Advisory" path, not four). If no employer meets the 2-year threshold, use the user's longest-tenured roles regardless.
  2. From targets: Add paths from the user's stated target roles that aren't already covered by Phase 1.

Merge only paths that are truly redundant (same companies, same roles). Prefer granular paths over merged ones. When in doubt, keep them separate. List Phase 1 paths first (longest tenure first), then Phase 2 paths. Final count: 4-5 paths. Every path adds agents, tokens, and wall-clock time to each pipeline run, so default to the smallest set that covers the user's strongest angles. If more than 5 strong candidates emerge, keep the 4-5 strongest now and save the rest.

When presenting the paths, tell the user explicitly: "I'm starting with 4-5 focused paths so each search run stays fast. You can add more paths later by re-running onboarding whenever your goals expand."

Anything you'd change?"

Wait for confirmation. If the user tweaks anything, update and re-confirm.

Step 4: Generate Files

After confirmation, generate all files silently. No overwrite warnings. No "about to write..." messages. Just write them.

IMPORTANT: Before writing each file, read the existing file first (Write tool requirement). Do this silently. Do NOT tell the user you're reading before writing. Do NOT warn about overwriting.

Never touch pipeline data files (target-companies.csv, applications.csv, etc.).

File 1: config.yaml

Generate from config.yaml.example template with:

  • paths.cv_base set to the directory where the user's resume was found (parent of the file they provided)
  • Credential-based integrations (todoist_enabled, gmail_enabled, tavily_enabled) set to false; keep jobspy_enabled: true so the first discovery run can scrape job boards
  • Email fields left as placeholders

File 2: job-search/references/criteria.md

Generate with this structure. The rubric must be CALIBRATED (tight, evidence-based) rather than loose; a well-calibrated rubric produces a spread of scores, not a cluster at the top. The average company the user's agents encounter should score around 50, not 70.

## Unique Value Proposition
[2-3 paragraphs: what makes this person uniquely valuable]

## Target Roles
[Role categories with descriptions]

## Target Company Types
[4-5 career paths. Each path has:]
### Path N: [Path Name]
- **Description:** [What kind of companies]
- **Example Companies:** [2-3 well-known examples for context, not monitored]
- **Role Types:** [Specific roles that fit]
- **Why You Fit:** [Connection to background]
- **Compensation Notes:** [Range based on salary floor]

## Evaluation Framework

10 scoring dimensions, each assessed yes (fits), no (does not fit), or unknown (cannot determine). Unknown dimensions are null, never 0, and are excluded from the score. Total score = (yes count / evaluated count) * 100, rounded down. Canonical implementation: `job-search/scripts/core/scoring.py`.

### Group 1: Core Fit (4 dimensions)
### Group 2: Compensation & Career (3 dimensions)
### Group 3: Culture & Growth (3 dimensions)

For EACH dimension you generate, produce:
- **Name** and 1-line purpose.
- **Yes condition.** A concrete observable test, not an adjective. "Yes = public Levels.fyi data showing $200K+ TC at this level" is good. "Yes = pays well" is bad.
- **No condition.** The concrete observable that rules the dimension out.
- **Evidence required for yes.** Named source (job posting, employee review, funding announcement, public statement, etc.). If evidence is unavailable, the dimension is unknown (null), never a yes by default.

Emphasize in the rubric itself: "If you cannot find specific evidence, mark the dimension unknown rather than assuming the best case. A company without disclosed comp is unknown (null), not a yes, and not a 0."

## Scoring Guide

Thresholds align with `pipeline.action_list.*_min_score` in `config.yaml`:
- **85-100 (HIGH):** Pursue aggressively. Cold outreach or immediate apply.
- **70-84 (MED):** Strong fit with current evidence. Apply if role is open.
- **60-69 (LOW):** Moderate fit. Watch list or skip unless specific role matches.
- **<60:** Skip.

**Handling unknowns:** Unknown dimensions are null, never 0. They are excluded from the ratio, so missing information never penalizes (or inflates) a company. If fewer than 5 of 10 dimensions are assessable, set `llm_flags: "needs_research"` and omit the score. The keyword scorer is a fallback only, used for rows with no `llm_score`; it never overrides one.

**Distributional check:** When this rubric is applied to the user's existing target list, expect roughly:
- ~20% score ≥85 (genuine A-tier)
- ~30% score 70-84 (B-tier, apply-worthy)
- ~35% score 60-69 (C-tier, watch)
- ~15% score <60 (skip)

If the distribution is heavily skewed high, the rubric is too loose. Tighten the yes conditions and evidence requirements.

File 3: job-search/references/background-context.md

Generate with this structure:

## Personal Information
## Technical Capabilities
## Project Portfolio
## Professional Experience
## Education & Certifications
## Positioning Angles
## Travel & Location Preferences

File 4: job-search/data/search-config.json

The repo ships this file as a placeholder stub with "setup_required": true (a full neutral template lives at job-search/data/search-config.json.example). Overwrite the entire stub with the generated config and do not carry over the setup_required flag (or set it to false); the pipeline refuses to run while it is true.

Generate valid JSON matching this exact structure. Pay close attention to types. query_packs and path_check_instructions are dicts, not lists.

{
  "search_locations": ["United States"],
  "query_packs": {
    "<snake_case_path_key>": {
      "label": "Human-Readable Path Name",
      "queries": ["search query 1", "search query 2", "..."],
      "locations": ["Remote", "United States"],
      "job_type": "fulltime"
    }
  },
  "role_include_patterns": ["regex_pattern", "..."],
  "role_exclude_patterns": ["regex_pattern", "..."],
  "employer_exclude_patterns": ["regex_pattern", "..."],
  "location_exclude_patterns": ["regex_pattern", "..."],
  "keywords": {
    "domain": ["keyword", "..."],
    "ai": ["keyword", "..."],
    "tech": ["keyword", "..."]
  },
  "path_check_instructions": {
    "1": "Multi-sentence discovery strategy for path 1...",
    "2": "Multi-sentence discovery strategy for path 2..."
  },
  "role_patterns": ["human-readable role title", "..."],
  "scoring": {
    "domain_keywords": {"keyword": 8},
    "ai_keywords": {"keyword": 6},
    "role_keywords": {"keyword": 7},
    "comp_indicators": {"keyword": 5},
    "growth_indicators": {"keyword": 4}
  },
  "path_aliases": {
    "fuzzy variant": "Exact Query Pack Label",
    "another variant": "Exact Query Pack Label"
  },
  "display_groups": {
    "Group Name": ["Query Pack Label 1", "Query Pack Label 2"],
    "Another Group": ["Query Pack Label 3"]
  }
}

Critical rules:

  • query_packs is a dict keyed by snake_case name, NOT a list. Each value has label, queries, locations, job_type
  • path_check_instructions is a dict keyed by path number as string ("1", "2", etc.), NOT a single string
  • One query pack per career path (for JobSpy)
  • All regex patterns must be valid Python regex, no inline flags like (?i)
  • 4-5 paths (one pack each), 3+ queries per pack. Users add more paths later by re-running onboarding
  • display_groups groups related query pack labels into 3-4 dashboard display categories. Each label must match a query pack's label field exactly. Paths not mapped go to "Other"

Search locations:

  • search_locations is the user's answer to "Which countries should I search for jobs in?"
  • Default: ["United States"] if the user doesn't specify
  • If user says "Europe", expand to specific countries: Ireland, United Kingdom, Germany, Netherlands, France
  • Populate each query pack's locations field from search_locations (plus "Remote")
  • Auto-generate location_exclude_patterns to exclude countries NOT in search_locations. Do not add exclude patterns for countries the user wants to search in.

Scoring keywords: Each scoring dict maps keyword strings to integer weights. Higher weights = stronger signal for that category. Generate weights based on how central each term is to the user's target roles.

Path aliases: Map fuzzy LLM path variants to canonical query_pack labels. The LLM sometimes returns shortened or rephrased path names during evaluation. This map catches common variants so they normalize correctly. Generate 3-5 aliases per career path based on likely LLM rephrasings. Keys are lowercase variants, values are exact query_pack labels.

Path check instructions: Generate 3-4 sentence discovery strategies per path. Each instruction must include:

  • What signals indicate a good fit for this path
  • What to look for on careers pages
  • What disqualifies a company
  • Location requirements (reference search_locations)

See onboarding/references/example-output.md for a complete working example.

Step 5: Verify Setup

Run smoke test checks inline (do not ask the user to run a separate command):

  1. Verify all 4 generated files exist and are non-empty
  2. Run uv run python3 scripts/smoke_test.py and verify all checks pass (this validates search-config schema, query_packs is a dict, path_check_instructions is a dict, dependencies, and config.yaml)

If all checks pass: "Setup complete." If any check fails: report the specific issue and fix it.

Step 6: Start First Search

Automatically hand off to the job-search skill and run the full pipeline. Do not ask the user for confirmation; they just completed setup, so the next step is always discovery.

Re-run Behavior

If the user has already run onboarding (files exist):

  • Ask: "You already have a profile set up. What's changed?"
  • Only regenerate files that need updating
  • This is also how users add career paths beyond the initial 4-5: extend query_packs, path_check_instructions, path_aliases, and display_groups in search-config.json and add matching path sections to criteria.md
  • Never touch pipeline data (target-companies.csv, applications.csv)

Boundaries

  • This skill generates config files only. It does not run the pipeline.
  • It does not modify pipeline scripts.
  • It does not create or modify the Master CV content. It only copies the user's file.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.