Job Application Tracker
Use a local, portable job board as the single source of truth for application records. Let the user speak naturally; resolve the correct board, preserve existing information, and apply deterministic, conflict-safe changes.
Language Policy
Keep the skill implementation, Agent instructions, references, scripts, schemas, comments, and tests in English. Treat English names and definitions as canonical.
User-facing surfaces may be localized. README.md and the assets/dashboard-* front-end files currently include Chinese and English. Store language-neutral codes for stages and batches so display language never changes the underlying meaning.
Required References
Read only the reference needed for the current operation:
- Read references/data-model.md before recording, updating, validating, summarizing, or reminding.
- Read references/deployment.md before installing, activating, locating, moving, repairing, or starting a board.
- Read references/board-ui.md before rebuilding or changing the dashboard, launchers, local server, or visualization logic.
Resolve the Board First
Denote the selected directory as BOARD_DIR.
Use python3 on macOS/Linux. On Windows, replace python3 in the commands below with py -3 when available, otherwise python.
-
If the user supplies a path, inspect it:
python3 <skill-dir>/scripts/board_locator.py inspect --board-dir <path>If it contains valid legacy
data.jsonbut lacks the marker, explain that a portable, non-sensitive identity file will be added, then run:python3 <skill-dir>/scripts/board_locator.py mark --board-dir <path> -
Otherwise discover marked boards:
python3 <skill-dir>/scripts/board_locator.py discover -
Interpret discovery exactly:
- Exit 0: use the single valid board and report its path and record count.
- Exit 4: ask for an existing path or explicit permission to create a new board.
- Exit 5: show every candidate and require the user to choose.
Never choose by modification time, record count, or guesswork. Never create a board merely because discovery failed. Never store a global absolute-path registry in the user's home directory.
Safe Data Workflow
For every read or write:
-
Resolve
BOARD_DIR. -
Get the real current date when dates affect the operation: run
date +%Y-%m-%don macOS/Linux or(Get-Date).ToString('yyyy-MM-dd')in Windows PowerShell. -
Take a snapshot:
python3 <skill-dir>/scripts/data_store.py snapshot \ --data <BOARD_DIR/data.json> -
Preserve the returned
boardTitle, optionallang, optionalstageLevels, all records, all unknown-but-valid record fields, and the returned ETag. -
For a write, create a candidate JSON file and replace safely:
python3 <skill-dir>/scripts/data_store.py replace \ --data <BOARD_DIR/data.json> \ --input <candidate.json> \ --expected-etag <etag> -
Treat exit 3 as a concurrent-edit conflict. Take a new snapshot, reapply only the user's requested change, and retry. Never force a stale write.
-
Confirm success only after the tool succeeds.
Never write data.json directly. Never load teaching examples without explicit user confirmation or treat them as real applications. Never modify deployed engine files during a data-only operation.
Core Operations
Record or Update an Application
- Read references/data-model.md.
- Match an existing record by company and role. If the target is ambiguous, ask the user to choose.
- For a new record, require company and role. Ask once for missing optional details—channel, application portal, city, and recruiting batch—then wait for the user's answer or explicit request to skip before saving.
- Insert a new record at the beginning of
recordsso new applications appear first by default. Preserve the existing array position when updating a record. - For an existing record, change only the fields the user mentioned.
- Advance progress by appending an event; never maintain a separate status field.
- For an unseen custom stage, preserve its exact text and add a
stageLevelsrule. Use the user's requested placement; otherwise default to a distinct level immediately beforek_hr. - Keep
noteempty unless the user explicitly asks to write something into it. - Use the safe data workflow and report the exact record and event changed.
Never fabricate a company, role, date, channel, location, salary, outcome, or interview round.
Show a Text Progress Summary
- Read references/data-model.md.
- Take a safe snapshot without modifying data.
- Put qualifying dated reminders from today through the next seven days first.
- Group records into in progress, offered, ended, and not yet applied.
- Identify stale in-progress records and upcoming milestones.
- End with one concrete next action.
Do not rebuild HTML unless the user explicitly asks.
Open or Rebuild the Visual Board
- Read references/deployment.md and references/board-ui.md.
- Resolve and validate the existing board before touching engine files.
- Normally tell the user to start the board and open
http://127.0.0.1:8770/. - Recopy the front-end engine set only when an engine file is missing or the user explicitly asks to rebuild or update the engine.
- Preserve
data.jsonand all backups.
Install or Activate
Read references/deployment.md and follow its discovery-first workflow. Installation of the skill and creation of a new board are separate actions. Creating a board requires explicit user intent.
Hard Rules
- Use only a resolved, marked
BOARD_DIR. - Do not silently create a replacement board.
- Do not recursively scan the user's home directory.
- Do not store a global path registry.
- Use
data_store.pyfor every Agent-side data write. - Preserve unmentioned data and existing fields.
- Keep
noteempty unless explicitly requested. - Use neutral stage and batch codes from
references/data-model.md. - Use the real current date; do not rely on mental date arithmetic.
- If file-write permission is unavailable, explain the exact manual steps and never claim a write succeeded.
- Do not combine a data mutation with an engine rebuild unless the user explicitly requests both.
- Do not overwrite
data.json,.data.backup.*.json, or.job-tracker-board.jsonwhen deploying or updating engine files.
Bundled Resources
scripts/board_locator.py: identify, mark, and safely discover board directories.scripts/data_store.py: snapshot, validate, conflict-check, atomically replace, and back up data.assets/dashboard-template.html,dashboard.css, anddashboard-*.js: localized, dependency-free dashboard modules.assets/server.py: loopback-only local server and validated data API.assets/start.command/assets/stop.command: macOS launchers.assets/start-board.bat/assets/stop-board.batwith matching PowerShell helpers: Windows launchers with health checks and diagnostic logs.assets/data.json: empty seed for an explicitly requested new board only.tools/: deterministic Sankey crossing-regression utilities.