From jobops
Migrates JobOps v1.x legacy files from OutputResumes, Briefing_Notes, Scoring_Rubrics, Intelligence_Reports to v2.0 application-centric layout via filename regex parsing. Dry-run preview with editable mapping.
npx claudepluginhub reggiechan74/jobops --plugin jobopsThis skill uses the workspace's default tool permissions.
This skill moves files from the legacy v1.x output layout
Initializes or reconfigures JobOps workspace: sets directories for resumes, job postings, applications, company intel, career analysis; installs templates; optionally migrates legacy files.
Migrates existing projects to AgenticDev structure using AI analysis to discover, categorize docs, generate frontmatter, update links, and preserve git history. For brownfield projects with ad-hoc documentation.
Migrates legacy .claude/commands/ files to .claude/skills/ directories in Claude Code repos. Actions: discover (find), analyze (map), migrate, audit, validate, fix.
Share bugs, ideas, or general feedback.
This skill moves files from the legacy v1.x output layout
(OutputResumes/, Briefing_Notes/, Scoring_Rubrics/,
Intelligence_Reports/) into the v2.0 application-centric layout. It is
a standalone runnable version of Step 9 of /jobops:setup.
Flags:
--dry-run — stop after the preview without moving any files.Read .jobops/config.json. If missing, stop with:
JOBOPS NOT CONFIGURED Run /jobops:setup to initialize your workspace.
Use config.directories.applications_root and
config.directories.company_intelligence as destinations.
Look for files in any of:
OutputResumes/Briefing_Notes/Scoring_Rubrics/Intelligence_Reports/If all four are absent or empty, print:
Nothing to migrate. Legacy folders are empty or missing.
…and exit with success.
For each file, attempt to parse {Company}_{Role}_{YYYYMMDD} (or, for
Intelligence_Reports, {Company}_{AgentType}_{YYYYMMDD}) using the
patterns below.
Pattern-to-folder mapping:
OutputResumes/, Scoring_Rubrics/,
and Briefing_Notes/.Intelligence_Reports/.Patterns (tried in order within each folder's applicable set):
^([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$^(?:Step\d+_)?(?:Draft_|Provenance_Analysis_|Final_Resume_|Cover_Letter_|Briefing_|Interview_Prep_)?([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$^Rubric_([A-Za-z0-9]+)_([A-Za-z0-9]+)_(\d{8})\.md$^([A-Za-z0-9]+)_(Corporate|Legal|Leadership|Compensation|Culture|Market)_Intelligence_(\d{8})\.md$ — applied only to files inside Intelligence_Reports/.Capture groups for patterns 1–3: (Company)_(Role)_(Date).
Capture groups for pattern 4: (Company)_(AgentType)_(Date).
Compose destinations:
OutputResumes/Step1_Draft_* → {applications_root}/{Company}_{Role}_{Date}/resume/step1_draft.mdOutputResumes/Step2_Provenance_Analysis_* → .../resume/step2_provenance.mdOutputResumes/Step3_Final_Resume_* → .../resume/step3_final.mdOutputResumes/Cover_Letter_* → .../cover-letter/cover_letter.mdScoring_Rubrics/Rubric_* → .../assessment/rubric.mdBriefing_Notes/* (matches pattern 1 or 2) → .../interview/briefing.mdIntelligence_Reports/* (matches pattern 4) → {company_intelligence}/{Company}/{agent_lowercase}.md
AcmeCorp_Corporate_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/corporate.mdAcmeCorp_Legal_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/legal.mdAcmeCorp_Leadership_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/leadership.mdAcmeCorp_Compensation_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/compensation.mdAcmeCorp_Culture_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/culture.mdAcmeCorp_Market_Intelligence_20260423.md → {company_intelligence}/AcmeCorp/market.mdFiles that do not match any pattern are added to an "unresolved" list.
Print planned moves grouped by destination app folder (or company folder), then the unresolved list. Include total counts.
If --dry-run was passed, stop here and exit with success.
Offer:
For each confirmed move:
mkdir -p <destination parent> if needed.git ls-files --error-unmatch <file> returns 0), use git mv <src> <dst>.mv.Read .jobops/config.json. Set:
migration.completed = truemigration.completed_at = <ISO-8601 now>migration.files_moved = <existing value> + <successful moves this run>Write back atomically.
Print:
Exit.