JobOps Legacy Migration
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.
Configuration
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.
Step 1: Scan legacy folders
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.
Step 2: Dry-run parse
For each file, attempt to parse {Company}_{Role}_{YYYYMMDD} (or, for
Intelligence_Reports, {Company}_{AgentType}_{YYYYMMDD}) using the
patterns below.
Pattern-to-folder mapping:
- Patterns 1–3 apply to files under
OutputResumes/,Scoring_Rubrics/, andBriefing_Notes/. - Pattern 4 applies only to files under
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 insideIntelligence_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- e.g.
AcmeCorp_Corporate_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/corporate.md - e.g.
AcmeCorp_Legal_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/legal.md - e.g.
AcmeCorp_Leadership_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/leadership.md - e.g.
AcmeCorp_Compensation_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/compensation.md - e.g.
AcmeCorp_Culture_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/culture.md - e.g.
AcmeCorp_Market_Intelligence_20260423.md→{company_intelligence}/AcmeCorp/market.md
- e.g.
Files that do not match any pattern are added to an "unresolved" list.
Step 3: Preview
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.
Step 4: User-editable mapping
Offer:
- Execute as shown — run the moves.
- Edit mapping — drop into an inline editor where the user can reassign specific files to different app folders, different destination filenames, or mark as "skip".
- Cancel — exit without moving anything.
Step 5: Execute
For each confirmed move:
mkdir -p <destination parent>if needed.- If the file is tracked in git (
git ls-files --error-unmatch <file>returns 0), usegit mv <src> <dst>. - Otherwise use plain
mv. - Count failures separately and report them; do not abort the whole batch on one failure.
Step 6: Update config
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.
Step 7: Summary
Print:
- Files scanned, matched, unresolved.
- Files moved successfully vs failed.
- Path to the still-unresolved files (for manual handling).
- Reminder to review and commit the moves if the workspace is under version control.
Exit.