network-jobs-setup
Skill0 starsChanged 3 months agoMITView on GitHub
First-run setup for the local Network Jobs suite. Use when installing network jobs, importing a resume into profile, running the job-search preferences interview (location, remote/hybrid/onsite), filling profile.json, verifying ~/.network-jobs, or helping export LinkedIn connections.
In this repository7 other files it gives its agents.
- AGENTS.mdAGENTS.md
- worker/AGENTS.mdAGENTS.md
- careers-discoverSkill
- intro-email-generatorSkill
- jobs-ingestSkill
- network-jobs-importSkill
- network-jobsSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
20 rules. About 0 are common, 14 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈14
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Always read SCHEMA.md first.
- Distinctive: line 25
One question per call: Ask it, wait for the answer, then ask the next.
- Distinctive: line 26
Never bundle two questions into one prompt or one tool call, even when the tool accepts several.
- Distinctive: line 31
Put the deciding data in the option label (count, fit, family), never in surrounding prose the user has to correlate.
- Distinctive: line 33
Always keep a free-text / "none of these" path.
- Distinctive: line 34
No such tool in this host?
- Distinctive: line 41
If missing, tell the user to run:
- Very specific: line 50
If the user has a resume path: run network-jobs profile import <path> or helpers/import-resume.sh.
- Very specific: line 53
Read $DATA/resume/text.md when present (else resume/source.*).
- Distinctive: line 55
Do not invent an email: Only use an address found in the resume or confirmed by the user.
- Very specific: line 56
If profile.json already has values, show the diff and ask one question — a multi-select over the differing fields to overwrite (all …
- Very specific: line 57
Write ~/.network-jobs/profile.json after confirmation.
- Very specific: line 59
If there is no resume yet, ask for name/email/title as free text, one question at a time (these are facts, not choices — free text, not the …
- Distinctive: line 74
Run a short interview grounded in the resume/profile.
- Very specific: line 81
Write $DATA/preferences.json (SCHEMA).
- Distinctive: line 132
Do not ask every dimension every time.
- Distinctive: line 134
STOP: after writing prefs — summarize them, then ask one question what to do next: import LinkedIn connections (recommended if the graph is …
- Distinctive: line 174
Never send profile, resume, or connections to a remote API.
- Distinctive: line 175
Never create a hosted account or fetch a remote job export.
- Distinctive: line 176
Do not name a specific model vendor when giving tips — stay model-agnostic.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Network Jobs Setup
Onboard a user onto the local Network Jobs suite. No cloud account.
Always read SCHEMA.md first.
Data home
NETWORK_JOBS_HOME or ~/.network-jobs/.
Asking the user
Whenever the next step is picking from a known set, use the host's choice tool —
AskUserQuestion (Claude Code), question (opencode), ask_user_choice, or the
harness equivalent — instead of a prose list.
- One question per call. Ask it, wait for the answer, then ask the next. Never bundle two questions into one prompt or one tool call, even when the tool accepts several.
- Recommend, and say why. Lead with the option you would pick and a one-line reason ("Recommended: senior IC — the resume reads as an IC trajectory and manager seats would widen the search against your own signal").
- Put the deciding data in the option label (count, fit, family), never in surrounding prose the user has to correlate.
- Always keep a free-text / "none of these" path.
- No such tool in this host? Use a short numbered list, recommendation first, never more than 4 options.
Workflow
- Verify install
- Confirm suite skills are discoverable (
network-jobs-import,careers-discover,jobs-ingest,network-jobs,intro-email-generator). - If missing, tell the user to run:
ornpx skills add hirefrank/network-jobs -g -a claude-code -a cursor -a codex npx --yes @hirefrank/network-jobs@latest setup --agent autonetwork-jobs setup --agent auto/network-jobs doctor. - Confirm dirs exist:
connections/,companies/,triage/,corpus/,config/,logs/,resume/.
- Confirm suite skills are discoverable (
Resume → profile (preferred before prefs interview)
- If the user has a resume path: run
network-jobs profile import <path>
orhelpers/import-resume.sh. - Read
$DATA/resume/text.mdwhen present (elseresume/source.*). - Propose updates to
profile.json:name,email,title,company,url. - Do not invent an email. Only use an address found in the resume or confirmed by the user.
- If
profile.jsonalready has values, show the diff and ask one question — a multi-select over the differing fields to overwrite (all preselected) — then write only the fields kept. - Write
~/.network-jobs/profile.jsonafter confirmation.
If there is no resume yet, ask for name/email/title as free text, one question at a time (these are facts, not choices — free text, not the choice tool).
- If the user has a resume path: run
- Semantic matching (optional — ask once)
network-jobs embed-setupadds semantic resume↔job similarity on top of keyword scoring — roles that fit the background without reusing its wording still rank — at the cost of fastembed plus a one-time ~60MB model download (needs network once); keyword scoring works without it. Ifnetwork-jobs doctoralready shows an embeddings provider (fastembed or ollama), skip the question — it is configured. Otherwise ask one yes/no question ("Recommended: yes — it catches fit that keyword overlap misses"), then runnetwork-jobs embed-setuponly if they say yes. If it fails (no network, pip restrictions), say so in one line and move on — never block the preferences interview on it. Preferences interview (after background is known — dynamic) Run a short interview grounded in the resume/profile. This is not a fixed form.
How to run it
- Skim resume + current
profile.json. Note likely track (IC vs manager), domains, seniority signals, recent employers, and gaps. - Propose a draft prefs summary from what you already know (“Sounds like senior IC product in fintech/devtools, NYC-leaning…”).
- Ask only the open questions — skip anything the resume already settles. Put each one to the user on its own: one question, wait for the answer, then the next. Give your recommended answer and a one-line reason with every one, and let the user reply in their own words instead of picking.
- Branch: if they were a manager, ask one question whether they want to stay on a people-manager track, return to IC, or either (recommend whichever their last two roles point at); if lifelong IC, ask one question whether they’re open to managing. Same idea for domain switches, founding vs bigco, etc.
- Write
$DATA/preferences.json(SCHEMA). SetinterviewComplete: trueandupdatedAt. Extra keys OK when useful.
Core dimensions to cover if still unknown (ask conversationally — one question per call, each with a recommendation — not a checklist dump):
Dimension Examples Work mode remote / hybrid / onsite — and if hybrid/onsite, where (never “any office”) Location cities → map to a corpus location bucket ( nyc,sf,la,seattle,austin,boston,chicago,denver,dc,remote,other) when clear; fillonsiteLocationsfor in-person willingnessRole category from the 15 corpus categories, biased by resume — then confirm (see below) Seniority senior / mid Track ic/manager/eitherCompany shape stage, size, industry (from their history + desires) Former employers include / exclude / ask — see below Comp optional salaryMin, or skipMust-haves / deal-breakers e.g. no pure people-mgmt, must have eng partnership — always ask explicitly, then set dealBreakersConfirmed: trueDynamic follow-ups (pick what fits this person):
- IC ↔ manager trajectory
- Stay in current domain vs pivot (use resume industries)
- Startup vs scale-up vs public
- Individual contributor craft depth vs broader GM/ops
- Confirm categories — affinity widens silently. Propose the resume-derived
set, then read it back for confirmation. Warn that each category also
accepts its affinity neighbors (e.g.
productalso acceptsengineering,data,design,operations— seeCATEGORY_AFFINITY), so extra categories widen the net in directions the user never named. Ask what to drop with one multi-select over the proposed set (all preselected, likely drops marked "Recommended to drop"), not just what to add. - Always ask deal-breakers explicitly. Propose candidates from the
resume's anti-signals (domains/roles they have never touched, levels they
aged out of), then ask directly — including "none". Ask as one
multi-select over the proposed candidates plus a "none — nothing to
exclude yet" option (recommended until something has actually cost them).
An empty
dealBreakerswith no confirmation reads as "never asked", andmatch-prefswill warn on it. SetdealBreakersConfirmed: trueonce asked, even when the answer is none. - Former employers — LinkedIn graphs are dense with connections at places they used to work. From the resume, list past employers into
formerEmployers, then ask one question: include, exclude, or ask each time (formerEmployerPolicy). Recommended: exclude unless they say otherwise. - Onsite scope — if they want remote and are open to onsite/hybrid, ask one question — which cities/metros count, offering the
locations/locationBucketscities as the recommended multi-select. Write the answer toonsiteLocations(and matching buckets). Do not interpret “I’ll consider onsite” as every onsite role globally. - Trajectory / domain / shape (the positive side — the resume can't
supply it): where they're moving toward (not just from), domain leanings
within the category (payments, devtools, enterprise…), and role shape
(0→1, platform, GTM-adjacent). This one is open-ended, so ask it as free
text — still a single question, not a three-part menu — and record 2–3
sentences in
notesfor narrative use (fit brief, intros); these are not scored buckets, so keep them out of the structured fields. Then reconciletargetRoleswithtrackas one question (recommending the value the resume supports), so a VP-seekingeitherdoesn't silently keep seeing Staff IC seats. - Travel, visa/work auth, commute limits — only if relevant
- Anything the resume makes surprising (“you’ve been EM for 5 years — still want that?”)
Do not ask every dimension every time. Prefer 3–6 tight questions — each its own call, each with your recommendation — then confirm the written prefs.
STOP after writing prefs — summarize them, then ask one question what to do next: import LinkedIn connections (recommended if the graph is empty), discover roles, or search (recommended if the corpus already has jobs).
- Skim resume + current
LinkedIn export instructions (if companies graph empty) Guide the user:
- Open LinkedIn → Settings & Privacy → Data privacy → Get a copy of your data
- Select Connections only (faster than full archive)
- Request archive; wait for LinkedIn email
- Download the ZIP (contains
Connections.csv)
Then hand off to network-jobs-import.
Tips (model-agnostic; paraphrase fine)
Tips - Pipeline: import → careers-discover (stages only) → you confirm → jobs-ingest → search → warm intro. - Discovery benefits from a stronger model; local search / intros are fine on a mid-tier model. - After discover finishes, review triage/ — do not ingest until you say so. - Resume: network-jobs profile import ~/path/to/resume.pdf - Prefs: re-run this setup skill anytime (“update my job search preferences”). - Refresh: network-jobs update · Health: network-jobs doctor - Wipe jobs only: network-jobs corpus clear --yes
Checks
DATA="${NETWORK_JOBS_HOME:-$HOME/.network-jobs}" # always resolve from the env; never export a literal DATA
ls -la "$DATA"
cat "$DATA/profile.json"
cat "$DATA/preferences.json" 2>/dev/null || true
ls -la "$DATA/resume" 2>/dev/null || true
command -v curl jq unzip
command -v agent-browser >/dev/null && agent-browser --version || echo "agent-browser missing — network-jobs update"
command -v network-jobs || echo "network-jobs CLI missing — re-run setup"Non-negotiables
- Never send profile, resume, or connections to a remote API.
- Never create a hosted account or fetch a remote job export; this suite is local-only.
- Do not name a specific model vendor when giving tips — stay model-agnostic.
- Preferences interview comes after resume/background when possible so questions are grounded.
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
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.

