ワンクリックで
resume
// Resume an interrupted or paused JobPilot run by id. Re-flips the run to in_progress and replays the apply loop on any remaining approved jobs without re-asking for fit confirmation.
// Resume an interrupted or paused JobPilot run by id. Re-flips the run to in_progress and replays the apply loop on any remaining approved jobs without re-asking for fit confirmation.
Apply to a single job (URL or pasted page) with fit review, or drain the pending queue when no argument is given.
Search a job board and autonomously apply to matching jobs one at a time, until paused, exhausted, or the max-applications cap is hit.
Migrate a React @tanstack/react-form codebase from the prop-drilled `useForm` + erased-form-type pattern to the official `createFormHook` composition API (`useAppForm` / `withForm` / `field.X`). Use when a project threads a `form` object (often cast to an `any`-erased type like `ReactFormExtendedApi<any,...>`) through field-wrapper components that take `form`+`name` props, and you want typed field names/values, no casts, and reusable bound field components. Triggers: "migrate forms to createFormHook", "adopt useAppForm/withForm", "remove AnyReactForm cast", "type-safe tanstack form fields".
Re-score a run's skipped jobs and promote the eligible ones to `approved` for later applying. Recovers jobs wrongly dropped for location, a sparse JD, 1099, or seniority. Does not apply.
Search a chosen job board via Playwright, rank results by fit against the user's resume, and save them to the run so the user can review.
Parse a resume's uploaded PDF into structured JSON (basics, experience, projects, skills, education) and save it to the editor.
| name | resume |
| description | Resume an interrupted or paused JobPilot run by id. Re-flips the run to in_progress and replays the apply loop on any remaining approved jobs without re-asking for fit confirmation. |
| argument-hint | <run-id> |
Resumes a paused or interrupted Run by replaying the apply loop on jobs that
are still approved (or pending if approval was implicit). The user already
approved the fit when the run was first launched, so no re-confirmation gate.
Live view: http://localhost:8000/runs/<run-id>.
Follow plugin/skills/shared/setup.md to load profile, resume,
credentials. Check the web app is up:
JOBPILOT_API=http://localhost:8000
curl -fsS "$JOBPILOT_API/api/health" >/dev/null || { echo "JobPilot web is down. Start it with 'bun run dev'."; exit 1; }
Argument is <run-id>. If missing, list candidates and ask:
curl -fsS "$JOBPILOT_API/api/runs" \
| jq -r '.data[] | select(.status=="paused" or .status=="interrupted")
| "\(.runId)\t\(.status)\t\(.source)\t\(.query)"'
Fetch the run + jobs:
RUN_ID="<run-id>"
RUN=$(curl -fsS "$JOBPILOT_API/api/runs/$RUN_ID")
Verify status is paused or interrupted. If completed or failed, stop:
"Run is already . Nothing to resume." If in_progress, stop:
"Run is still in progress. If the agent crashed, wait for the
auto-reconciler (5 min) or stop the run from the UI first."
Refuse to resume if there are no jobs with status === "approved":
APPROVED=$(echo "$RUN" | jq '[.data.jobs[] | select(.status=="approved")] | length')
[ "$APPROVED" = "0" ] && { echo "No approved jobs left to apply. Mark the run completed from the UI."; exit 0; }
PATCH status back to in_progress:
curl -fsS -X PATCH "$JOBPILOT_API/api/runs/$RUN_ID" \
-H 'content-type: application/json' \
-d '{"status":"in_progress"}'
Read config.maxApplications from the run for the stop condition below:
MAX_APPS=$(echo "$RUN" | jq -r '.data.config.maxApplications // empty')
For each job where status === "approved", score-descending, run the exact
same per-job flow as the apply skill's Phase 4 (see
plugin/skills/apply/SKILL.md sections 4.1 through 4.9):
applying.browser_navigate, then browser_snapshot the header to find the Apply control and click its ref; browser_snapshot the form to enumerate fields and refs.digest from the Job row, invoke the tailor-resume skill with it. On failure POST /result outcome:"failed", failReason:"No tailorable resume base".plugin/skills/shared/form-filling.md; upload the tailored variant.config.maxApplications === 1.browser_wait_for, then a narrowed browser_snapshot for the success or error result./api/runs/$RUN_ID/jobs/<key>/result with outcome:"applied"/"failed"/"skipped". Atomic: updates the Job, creates Application, marks queue consumed, recomputes summary.MAX_APPS set and summary.applied >= MAX_APPS, POST /result outcome:"skipped", skipReason:"Max applications limit reached" for each remaining approved job and end the loop.The /result endpoint preserves the run's original source ("apply" vs "auto-apply") on the created Application row automatically — no separate source-passthrough needed.
Re-fetch the run between jobs and exit cleanly if the user stopped it:
STATUS=$(curl -fsS "$JOBPILOT_API/api/runs/$RUN_ID" | jq -r '.data.status')
if [ "$STATUS" = "paused" ]; then
# POST /result outcome:"skipped" skipReason:"Run paused by user" for each remaining approved job, then stop
exit 0
fi
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
curl -fsS -X PATCH "$JOBPILOT_API/api/runs/$RUN_ID" \
-H 'content-type: application/json' \
-d "$(jq -n --arg t "$NOW" '{status:"completed", completedAt:$t}')"
Print a summary table and the run link http://localhost:8000/runs/<RUN_ID>.
Suggest re-running the auto-apply skill in retry-failed <RUN_ID> mode if any jobs failed.
source when recording applications — a resumed apply run still records source:"apply", not "resume".approved jobs remain.