ワンクリックで
setup
Initialize JobOps workspace - configure output directories, install templates, and optionally migrate legacy files
メニュー
Initialize JobOps workspace - configure output directories, install templates, and optionally migrate legacy files
Build a complete resume through all 3 steps (draft, provenance check, final)
Assess candidate against job posting using pre-created scoring rubric
Compare assessment files across application folders under applications_root
Interview-driven generation of three market-validated ideal-role archetypes (Anchor, Stretch, Pivot) from career history, elicited preferences, and high-scoring assessment patterns
Generate a strategic cover letter with requirements-matching table from Step 3 resume
Render an application statusboard from a reconciled YAML tracker and (on Claude Code) drive an interactive navigate-and-act loop over the application pipeline
| name | setup |
| description | Initialize JobOps workspace - configure output directories, install templates, and optionally migrate legacy files |
| disable-model-invocation | true |
| argument-hint | [--reconfigure] [--skip-migration] [--skip-history] |
This skill initializes or reconfigures a JobOps workspace. It writes a single
user-owned config file at .jobops/config.json, creates the output directory
tree, installs templates from the plugin into the workspace, updates
.gitignore, and offers optional career-history import and legacy-file migration.
Flags:
--reconfigure — re-run setup against an existing workspace; prompts before overwriting anything.--skip-migration — skip the legacy-file migration step (Step 9) unconditionally.--skip-history — skip the optional career-history import (Step 8).If .jobops/config.json already exists, read it and present three choices:
If --reconfigure was passed, skip the prompt and go straight to option 1.
If no config exists, proceed to Step 2.
Walk the user through every path in config.directories. Present the default,
a one-sentence purpose, and allow inline editing. Paths are normalized
(strip trailing slash, resolve ~, keep as relative-to-workspace form that
starts with ./).
| Key | Default | Purpose |
|---|---|---|
resume_source | ./ResumeSourceFolder | Master HAM-Z career data (user-maintained input) |
job_postings | ./Job_Postings | Target job descriptions (user-maintained input) |
applications_root | ./Applications | Per-application output tree (one folder per application) |
company_intelligence | ./Company_Intelligence | OSINT output tree (shared across applications to same company) |
career_analysis | ./Career_Analysis | Career-level outputs (idealjob, change-one-thing, comparejobs) |
crisis_management | ./Crisis_Management | Crisis-skill outputs (severance, non-compete, etc.) |
tailored_cv | ./Tailored_CV | Base resume library for revise-first /jobops:buildresume (one per role family) |
application_tracker | ./Applications/tracker.yaml | Application status tracker maintained by /jobops:dashboard (one YAML file, not a folder) |
application_trackeris a file path, not a directory — Step 3 must notmkdirit. Its parent directory (applications_root) is already created, so no extra action is needed.
For each path: validate the parent is writable. If not, surface the specific error and allow the user to correct it before continuing.
For each confirmed path, run mkdir -p <path>. Report each as
created (newly made) or exists (already present). Do not fail if a
path already exists.
Skip
application_tracker— it is a file path, not a directory; its parent (applications_root) is already created by this loop.
Also mkdir -p .jobops .jobops/templates/default .jobops/templates/custom.
Ask in order:
canadian | american. Default canadian.
Controls resume voice and spelling conventions.CA-ON, US-CA).
Default CA-ON. Used by crisis skills; they accept
--jurisdiction=<code> to override per-invocation.retrospective | forward. Default retrospective.
Controls how /jobops:coverletter writes the letter. retrospective maps the job's
requirements to what the candidate has already done. forward proposes what the
candidate would do in the first 90 days, tying each action to a real problem the role
faces and to past work that proves the candidate can do it; it runs a short interview
each time it is used. Override per-invocation with
/jobops:coverletter --mode=retrospective|forward.Do not ask for default_currency here — that is owned by /jobops-ic:setup
(see Step 4 of that flow).
Collect the contact fields that populate the resume and cover-letter headers. These
live in config.candidate so every document renders the same header and no field is
ever fused into another (the cover-letter header had no phone slot historically, which
produced fused (xxx) xxx-xxxxemail@example.com artifacts; the dedicated field fixes
this).
Ask for each (any may be left blank; blank fields are omitted from the header with their separator):
Jane DoeCFA, FRICS (blank if none)Toronto, ON(555) 555-1234 (its own header field; never concatenated onto the email)jane.doe@example.comlinkedin.com/in/janedoegithub.com/janedoe (blank if none)If the user prefers to keep contact details out of config, write the block with empty strings; the resume and cover-letter skills surface the gap rather than invent a value.
Copy the plugin's bundled templates into the workspace:
cp ${CLAUDE_PLUGIN_ROOT}/templates/*.md .jobops/templates/default/ 2>/dev/null || true
cp -r ${CLAUDE_PLUGIN_ROOT}/templates/latex .jobops/templates/default/
Report the count of files copied. Expected count after this task runs:
3 markdown templates (assessment_rubric_framework.md, evidence_verification_framework.md,
assessment_report_structure.md) plus 1 latex/ subdirectory (preamble.base.tex.template,
preamble.resume.tex.template, preamble.coverletter.tex.template,
preamble.document.tex.template, jobops-filter.lua, config.json, README.md).
If the glob fails in the current execution context (no files matched), fall back to:
find ${CLAUDE_PLUGIN_ROOT}/templates -maxdepth 1 -type f -exec cp {} .jobops/templates/default/ \;
cp -r ${CLAUDE_PLUGIN_ROOT}/templates/latex .jobops/templates/default/
Do not touch .jobops/templates/custom/ — it is user-owned.
.jobops/config.jsonEmit the full schema below with the values gathered in Steps 2 and 4.
migration.completed starts as false so Step 9 runs on first setup.
{
"version": "2.0",
"directories": {
"resume_source": "<step-2 value>",
"job_postings": "<step-2 value>",
"applications_root": "<step-2 value>",
"company_intelligence": "<step-2 value>",
"career_analysis": "<step-2 value>",
"crisis_management": "<step-2 value>",
"tailored_cv": "<step-2 value>",
"application_tracker": "<step-2 value>"
},
"preferences": {
"cultural_profile": "<step-4 value>",
"default_jurisdiction": "<step-4 value>",
"cover_letter_mode": "<step-4 value>"
},
"candidate": {
"name": "<step-4b value>",
"credentials": "<step-4b value>",
"location": "<step-4b value>",
"phone": "<step-4b value>",
"email": "<step-4b value>",
"linkedin": "<step-4b value>",
"github": "<step-4b value>"
},
"templates": {
"base_dir": "./.jobops/templates",
"active": {
"assessment_rubric_framework": "default",
"evidence_verification_framework": "default",
"assessment_report_structure": "default",
"latex_config": "default"
}
},
"migration": {
"completed": false,
"completed_at": null,
"files_moved": 0
}
}
Write atomically: write to .jobops/config.json.tmp, then mv over the final
name.
Show the user the JobOps block that will be appended to .gitignore:
# JobOps workspace
.jobops/
Applications/
Company_Intelligence/
Career_Analysis/
Crisis_Management/
(If the user customized any of the directory names in Step 2, substitute those paths in the block.)
Offer three choices:
.gitignore..gitignore.If .gitignore does not exist, create it. If the block (detected by the
# JobOps workspace marker line) already exists, replace it in place rather
than appending a second copy.
Only offer this step if --skip-history was not passed and the
resume_source directory is empty or contains fewer than 3 files.
Prompt: "Do you have an existing resume to import as the basis for your HAM-Z career inventory? (yes/no)"
If yes, accept a path to a .pdf, .docx, .txt, or .md file. Extract
text, then populate:
{resume_source}/Experience/<Company>_<Role>.md — one file per role{resume_source}/CareerHighlights/highlights.md{resume_source}/Technology/stack.md{resume_source}/Preferences/preferences.md{resume_source}/Vision.md — stub, to be filled in manuallyAfter population, flag any entries that lack metrics or hard skills so the user knows where to focus subsequent manual enrichment.
Skip this step if --skip-migration was passed OR migration.completed is
already true in the config being reconfigured.
Scan for legacy folders at the workspace root and subfolders named:
OutputResumes/Briefing_Notes/Scoring_Rubrics/Intelligence_Reports/If all four are absent or empty, skip this step silently (and still set
migration.completed = true).
Otherwise run:
9a. Dry-run parse. For each file in the legacy folders, attempt to parse
{Company}_{Role}_{YYYYMMDD} from the filename using the following patterns
(tried in order):
^([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$^(?:Step\d+_)?(?:Draft_|Provenance_Analysis_|Final_Resume_)?([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$^Rubric_([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$For each match, compose a planned destination:
OutputResumes/Step1_* and Step2_* and Step3_* → {applications_root}/{Company}_{Role}_{Date}/resume/<stepN>.mdOutputResumes/Cover_Letter_* → {applications_root}/{Company}_{Role}_{Date}/cover-letter/cover_letter.mdScoring_Rubrics/Rubric_* → {applications_root}/{Company}_{Role}_{Date}/assessment/rubric.mdBriefing_Notes/* → {applications_root}/{Company}_{Role}_{Date}/interview/briefing.mdIntelligence_Reports/<Company>_* → {company_intelligence}/{Company}/<agent>.md (parse the agent name from the filename segment between Company and Date)9b. Preview. Print the planned moves grouped by target app folder. List unresolved files (no regex match) in a separate "manual" group.
9c. User-editable mapping. Offer three options:
9d. Execute. For each confirmed move:
git mv <src> <dst> (preserves history).mv.9e. Update config. Set:
migration.completed = truemigration.completed_at = <ISO-8601 now>migration.files_moved = <count of successful moves>Unresolved files stay in place; the user handles them manually.
Print:
{job_postings}/ named {Company}_{Role}_{YYYYMMDD}.md./jobops:buildresume <job_posting.md> to produce a tailored resume./jobops:osint <Company> to gather company intelligence./jobops-ic:setup to enable IC features.Exit.