#986 by GitHub stars

DanielPan12/JobHuntBot

A reusable job application workflow for Codex and other AI agents. Use when a user wants to set up or run an AI-assisted job search system: collecting a candidate profile, creating an application dashboard, defining screening and resume-routing rules, finding and ranking job leads, applying to jobs

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Oct 26, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

21ae79206e29 → 21ae79206e29

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 21ae79206e29ac3825cfabeb4b7840cbfe1cfe99

git clone --filter=blob:none --no-checkout https://github.com/DanielPan12/JobHuntBot.git .hotskills/danielpan12-jobhuntbot && git -C .hotskills/danielpan12-jobhuntbot checkout --detach 21ae79206e29ac3825cfabeb4b7840cbfe1cfe99 # Copy each selected skill directory from .hotskills/danielpan12-jobhuntbot into .agents/skills/<skill-name>/
883GitHub stars
9stars in 7 days
1skill in this repository
2commits in 30 days

Heat

5.4
  • Star growth, last 7 daysAhead of 82% of tracked repositories
  • Star growth, last 24 hoursAhead of 71% of tracked repositories
  • Rank movement, last 7 daysAhead of 13% of tracked repositories
  • Commits, last 30 daysAhead of 60% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 5, 2026883

Individual skills in this repository

How it works

jobhuntbot

When your agent uses it

A reusable job application workflow for Codex and other AI agents. Use when a user wants to set up or run an AI-assisted job search system: collecting a candidate profile, creating an application dashboard, defining screening and resume-routing rules, finding and ranking job leads, applying to jobs within explicit safety boundaries, recording outcomes, triaging blockers, or iterating a job application workflow.

What it loads into context

Frontmatter

85 tokens

Always available to the agent

SKILL.md

2,851 tokens

When the skill is activated

Reference documents

19,358 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Core Contract
  2. Workflow
  3. Safety

Scripts executed separately

  • dashboard/csv-store.js
  • dashboard/dashboard-model.js
  • dashboard/scripts/audit-data.js
  • dashboard/scripts/company-categories.js
  • dashboard/server.js
  • dashboard/start-dashboard.bat
  • dashboard/start-dashboard.sh
  • dashboard/tests/audit-data.test.js
  • dashboard/tests/csv-row-index.test.js
  • dashboard/tests/csv-store.test.js
  • dashboard/tests/dashboard-browser.test.js
  • dashboard/tests/dashboard-csv-validation.test.js
  • dashboard/tests/dashboard-model.test.js
  • dashboard/tests/server.test.js
  • dashboard/tests/test-helpers.js
  • scripts/check-public-package.js
  • scripts/check-public-package.test.js

Files

  • .github/workflows/validate.ymlasset766 bytes
  • .gitignoreasset340 bytes
  • AGENTS.mddoc1,535 bytes
  • LICENSEasset1,143 bytes
  • README.mddoc22,140 bytes
  • SKILL.mdcore15,206 bytes
  • SKILL.mdcore15,206 bytes
  • SKILL.mdcore15,206 bytes
  • SKILL.mdcore15,206 bytes
  • SKILL.mdcore15,206 bytes
  • dashboard/application_log.csvasset157 bytes
  • dashboard/automation_rules.csvasset63 bytes
  • dashboard/blocker_queue.csvasset130 bytes
  • dashboard/company_categories.jsonasset38 bytes
  • dashboard/csv-store.jsruns5,350 bytes
  • dashboard/daily_dashboard.csvasset132 bytes
  • dashboard/dashboard-model.jsruns5,353 bytes
  • dashboard/dashboard.htmlasset54,271 bytes
  • dashboard/follow_up.csvasset89 bytes
  • dashboard/job_pool.csvasset212 bytes
  • dashboard/resume_rules.csvasset84 bytes
  • dashboard/scripts/audit-data.jsruns7,281 bytes
  • dashboard/scripts/company-categories.jsruns3,672 bytes
  • dashboard/server.jsruns12,128 bytes
  • dashboard/start-dashboard.batruns109 bytes
  • dashboard/start-dashboard.shruns233 bytes
  • dashboard/tests/audit-data.test.jsruns3,311 bytes
  • dashboard/tests/csv-row-index.test.jsruns1,909 bytes
  • dashboard/tests/csv-store.test.jsruns3,175 bytes
  • dashboard/tests/dashboard-browser.test.jsruns10,532 bytes
  • dashboard/tests/dashboard-csv-validation.test.jsruns1,182 bytes
  • dashboard/tests/dashboard-model.test.jsruns10,548 bytes
  • dashboard/tests/server.test.jsruns9,515 bytes
  • dashboard/tests/test-helpers.jsruns2,642 bytes
  • references/application-playbook.mddoc17,938 bytes
  • references/lead-discovery.mddoc7,939 bytes
  • references/safety-and-boundaries.mddoc3,984 bytes
  • references/setup-workflow.mddoc16,099 bytes
  • scripts/check-public-package.jsruns7,511 bytes
  • scripts/check-public-package.test.jsruns4,315 bytes
  • templates/answer_bank.template.mddoc2,824 bytes
  • templates/application-progress.template.jsonasset2,274 bytes
  • templates/application_rules.template.mddoc5,760 bytes
  • templates/candidate_profile.template.jsonasset1,938 bytes
  • templates/dashboard-template/README.mddoc6,750 bytes
  • templates/dashboard-template/application_log.csvasset157 bytes
  • templates/dashboard-template/automation_rules.csvasset63 bytes
  • templates/dashboard-template/blocker_queue.csvasset130 bytes
  • templates/dashboard-template/daily_dashboard.csvasset132 bytes
  • templates/dashboard-template/follow_up.csvasset89 bytes
  • templates/dashboard-template/job_pool.csvasset212 bytes
  • templates/dashboard-template/resume_rules.csvasset84 bytes
  • templates/experience_bank.template.mddoc4,768 bytes
  • templates/resume_routing.template.mddoc4,546 bytes
Read SKILL.md

# JobHuntBot

JobHuntBot is a job application operating workflow for AI agents. It helps users turn job searching into a repeatable system: profile, dashboard, screening rules, resume strategy, application execution, blocker triage, and follow-up.

## Core Contract 

Optimize for truthful, traceable, interview-generating applications, not blind volume.

Treat setup as an agent-led onboarding flow, not a user homework packet. Ask only for the minimum information needed to start safely, create drafts/templates for the user, then iterate after the first trial run.

Before searching or applying, make sure the user has:

1. A candidate profile.
2. A dashboard or workbook for tracking outcomes.
View the complete source on GitHub

Skills included

  • jobhuntbot

Repository facts

License
MIT
Created
Aug 2, 2026
Last pushed
Oct 12, 2026
Forks
71
Open issues
0
Project activity
Active

Rank over the last 12 weeks

Now #986 · best #701 · down 217 in 30 days

  1. #973 on Oct 31
  2. #975 on Nov 1
  3. #980 on Nov 2
  4. #979 on Nov 3
  5. #984 from Nov 4 to Nov 5
  6. #986 since Nov 6
76 earlier periods
  1. #883 on Aug 2
  2. #876 on Aug 7
  3. #877 on Aug 8
  4. #864 on Aug 9
  5. #889 on Aug 10
  6. #884 on Aug 11
  7. #876 on Aug 12
  8. #875 on Aug 13
  9. #855 on Aug 14
  10. #826 on Aug 15
  11. #848 on Aug 16
  12. #846 on Aug 17
  13. #863 on Aug 18
  14. #854 on Aug 19
  15. #843 on Aug 20
  16. #851 on Aug 21
  17. #797 on Aug 22
  18. #851 on Aug 23
  19. #859 on Aug 24
  20. #864 on Aug 25
  21. #844 on Aug 26
  22. #848 on Aug 27
  23. #870 on Aug 28
  24. #782 on Aug 29
  25. #777 on Aug 30
  26. #806 on Aug 31
  27. #808 on Sep 1
  28. #776 on Sep 2
  29. #775 on Sep 3
  30. #746 on Sep 4
  31. #723 on Sep 5
  32. #743 on Sep 6
  33. #747 on Sep 7
  34. #769 on Sep 8
  35. #748 on Sep 9
  36. #753 on Sep 10
  37. #731 on Sep 11
  38. #724 on Sep 12
  39. #720 on Sep 13
  40. #745 on Sep 14
  41. #740 on Sep 15
  42. #747 on Sep 16
  43. #748 on Sep 17
  44. #730 on Sep 18
  45. #704 on Sep 19
  46. #715 on Sep 20
  47. #736 on Sep 21
  48. #755 on Sep 22
  49. #750 on Sep 23
  50. #719 on Sep 24
  51. #701 on Sep 25
  52. #702 on Sep 26
  53. #728 on Sep 27
  54. #748 on Sep 28
  55. #776 on Sep 29
  56. #758 on Sep 30
  57. #730 on Oct 2
  58. #743 on Oct 4
  59. #752 on Oct 5
  60. #769 on Oct 7
  61. #814 on Oct 8
  62. #763 on Oct 10
  63. #787 on Oct 12
  64. #794 on Oct 13
  65. #805 on Oct 14
  66. #795 on Oct 15
  67. #801 on Oct 16
  68. #775 on Oct 17
  69. #762 on Oct 18
  70. #818 on Oct 20
  71. #808 on Oct 22
  72. #815 on Oct 23
  73. #948 on Oct 25
  74. #965 on Oct 28
  75. #967 on Oct 29
  76. #969 on Oct 30

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 4 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 101 signals by file

.gitignore

  • Access to secretsline 13
    [Credential-related source omitted]

README.md

  • Network accessline 70
    6. **Open the dashboard** to see progress:    - Windows: double-click `dashboard/start-dashboard.bat`    - macOS/Linux: run `dashboard/start-dashboard.sh` (requires [Node.js](https://nodejs.org/) installed; `chmod +x` it once if needed)
  • Network accessline 71
    - Windows: double-click `dashboard/start-dashboard.bat`    - macOS/Linux: run `dashboard/start-dashboard.sh` (requires [Node.js](https://nodejs.org/) installed; `chmod +x` it once if needed)    - This opens `http://localhost:8420/dashboard.
  • Network accessline 72
    - macOS/Linux: run `dashboard/start-dashboard.sh` (requires [Node.js](https://nodejs.org/) installed; `chmod +x` it once if needed)
  • Network accessline 73
    - This opens `http://localhost:8420/dashboard.html` in your browser. It reads the CSVs in the same folder live — every refresh shows the latest state, no build step, no external server, nothing leaves your machine.
  • Network accessline 96
    **Important:** open the dashboard through `start-dashboard.bat`/`start-dashboard.sh`, not by double-clicking `dashboard.html` directly — the page fetches the CSVs over `http://`, which browsers block when a file is opened directly from disk
  • Network accessline 199
    6. **打开进度看板**查看情况:    - Windows:双击 `dashboard/start-dashboard.bat`    - macOS/Linux:运行 `dashboard/start-dashboard.sh`(需要先安装 [Node.js](https://nodejs.org/);如有需要先执行一次 `chmod +x`)
  • Network accessline 200
    - Windows:双击 `dashboard/start-dashboard.bat`    - macOS/Linux:运行 `dashboard/start-dashboard.sh`(需要先安装 [Node.js](https://nodejs.org/);如有需要先执行一次 `chmod +x`)    - 会在浏览器打开 `http://localhost:8420/dashboard.html`,实时读取同目录下的 CSV——每次刷新都是最新状态,不需要构建、不
  • Network accessline 201
    - macOS/Linux:运行 `dashboard/start-dashboard.sh`(需要先安装 [Node.js](https://nodejs.org/);如有需要先执行一次 `chmod +x`)
  • Network accessline 202
    - 会在浏览器打开 `http://localhost:8420/dashboard.html`,实时读取同目录下的 CSV——每次刷新都是最新状态,不需要构建、不需要外部服务器,数据也不会离开你的电脑。
  • Network accessline 223
    **注意:** 请通过 `start-dashboard.bat`/`start-dashboard.sh` 打开看板,不要直接双击 `dashboard.html`——页面需要通过 `http://` 读取 CSV 数据,直接从磁盘打开文件时浏览器会拦截这类请求。

SKILL.md

  • Access to secretsline 144
    [Credential-related source omitted]

dashboard/csv-store.js

  • Executable scriptline 1
    Executable file

dashboard/dashboard-model.js

  • Executable scriptline 1
    Executable file

dashboard/dashboard.html

  • Network accessline 410
    async function readCSVFile(name) {     const res = await fetch('./' + name + '?t=' + Date.now(), { cache: 'no-store' });
  • Network accessline 411
    const res = await fetch('./' + name + '?t=' + Date.now(), { cache: 'no-store' });
  • Network accessline 419
    const warnEl = document.getElementById('connect-warn');     try {       const categoryResponse = await fetch('./company_categories.json?t=' + Date.now(), { cache: 'no-store' });
  • Network accessline 420
    try {       const categoryResponse = await fetch('./company_categories.json?t=' + Date.now(), { cache: 'no-store' });       if (!categoryResponse.ok) throw new Error('公司分类读取失败 (HTTP ' + categoryResponse.status + ')');
  • Network accessline 421
    const categoryResponse = await fetch('./company_categories.json?t=' + Date.now(), { cache: 'no-store' });
  • Network accessline 564
    btn.disabled = true;     try {       const res = await fetch('/api/update-status', {
  • Network accessline 565
    try {       const res = await fetch('/api/update-status', {         method: 'POST',
  • Network accessline 566
    const res = await fetch('/api/update-status', {
  • Network accessline 993
    ? { followUpRowIndex: calEditingRowIndex, expectedEvent: calExpectedEvent, jobRowIndex: calSelectedJob.__rowIndex, company: calSelectedJob.company, job_title: calSelectedJob.job_title, job_url: calSelectedJob.job_url || '', date, time, even
  • Network accessline 994
    : { jobRowIndex: calSelectedJob.__rowIndex, company: calSelectedJob.company, job_title: calSelectedJob.job_title, job_url: calSelectedJob.job_url || '', date, time, event_type };       const res = await fetch(isEdit ? '/api/calendar/update'
  • Network accessline 995
    const res = await fetch(isEdit ? '/api/calendar/update' : '/api/calendar/add', {
  • Network accessline 1009
    if (!confirm('删除这条日程:' + ev.date + ' ' + ev.time + ' ' + ev.company + ' · ' + ev.event_type + '?')) return;     try {       const res = await fetch('/api/calendar/delete', {
  • Network accessline 1010
    try {       const res = await fetch('/api/calendar/delete', {         method: 'POST', headers: { 'Content-Type': 'application/json' },
  • Network accessline 1011
    const res = await fetch('/api/calendar/delete', {

dashboard/scripts/audit-data.js

  • Executable scriptline 1
    Executable file

dashboard/scripts/company-categories.js

  • Executable scriptline 1
    Executable file

dashboard/server.js

  • Executable scriptline 1
    Executable file
  • Network accessline 220
    server.listen(PORT, '127.0.0.1', () => {     console.log('求职进度仪表盘已启动: http://localhost:' + PORT + '/dashboard.html');
  • Network accessline 221
    console.log('求职进度仪表盘已启动: http://localhost:' + PORT + '/dashboard.html');

dashboard/start-dashboard.bat

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    chcp 65001 >nul cd /d "%~dp0" start "" "http://localhost:8420/dashboard.html"
  • Network accessline 3
    cd /d "%~dp0" start "" "http://localhost:8420/dashboard.html" node server.js
  • Network accessline 4
    start "" "http://localhost:8420/dashboard.html"

dashboard/start-dashboard.sh

  • Executable scriptline 1
    #!/bin/sh
  • Network accessline 3
    cd "$(dirname "$0")" ( sleep 1 && (open "http://localhost:8420/dashboard.html" 2>/dev/null || xdg-open "http://localhost:8420/dashboard.html" 2>/dev/null) ) &
  • Network accessline 4
    ( sleep 1 && (open "http://localhost:8420/dashboard.html" 2>/dev/null || xdg-open "http://localhost:8420/dashboard.html" 2>/dev/null) ) &

dashboard/tests/audit-data.test.js

  • Executable scriptline 1
    Executable file

dashboard/tests/csv-row-index.test.js

  • Executable scriptline 1
    Executable file

dashboard/tests/csv-store.test.js

  • Executable scriptline 1
    Executable file

dashboard/tests/dashboard-browser.test.js

  • Executable scriptline 1
    Executable file
  • Network accessline 30
    const today = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai' }).format(new Date());       const jobs = [         { company: 'Acme', job_title: '公司汇总', job_url: 'https://example.com', status: 'Submitted', record_type: 'company_
  • Network accessline 31
    const jobs = [         { company: 'Acme', job_title: '公司汇总', job_url: 'https://example.com', status: 'Submitted', record_type: 'company_summary' },         { company: 'Acme', job_title: 'A岗位', job_url: 'https://example.com/A', status: 'Subm
  • Network accessline 32
    { company: 'Acme', job_title: '公司汇总', job_url: 'https://example.com', status: 'Submitted', record_type: 'company_summary' },
  • Network accessline 33
    { company: 'Acme', job_title: 'A岗位', job_url: 'https://example.com/A', status: 'Submitted', current_stage: '', date_found: '2026-07-01' },
  • Network accessline 34
    { company: 'Acme', job_title: 'B岗位', job_url: 'https://example.com/B', status: 'Submitted', current_stage: '', date_found: '2026-07-02' },
  • Network accessline 35
    { company: 'Acme', job_title: '待填岗位', job_url: 'https://example.com/C', status: 'Needs user', current_stage: '教育与实习已填写', blocker: '缺薪资、日期', next_action: '集中补齐缺漏' },
  • Network accessline 50
    ]));       fs.writeFileSync(path.join(fixture, 'blocker_queue.csv'), csv([         { company: 'Acme', job_title: '待填岗位', job_url: 'https://example.com/C', status: 'open', blocker_category: 'missing fact', user_action_needed: '确认薪资' },
  • Network accessline 51
    fs.writeFileSync(path.join(fixture, 'blocker_queue.csv'), csv([         { company: 'Acme', job_title: '待填岗位', job_url: 'https://example.com/C', status: 'open', blocker_category: 'missing fact', user_action_needed: '确认薪资' },         { compan
  • Network accessline 52
    { company: 'Acme', job_title: '待填岗位', job_url: 'https://example.com/C', status: 'open', blocker_category: 'missing fact', user_action_needed: '确认薪资' },
  • Network accessline 53
    { company: 'Acme', job_title: '待填岗位', job_url: 'https://example.com/C', status: 'open', blocker_category: 'missing fact', user_action_needed: '补毕业日期' },
  • Network accessline 54
    { company: 'Acme', job_title: 'A岗位', job_url: 'https://example.com/A', status: 'open', blocker_category: 'Post-submission discrepancy', user_action_needed: '核实志愿顺序' },
  • Network accessline 58
    server = createDashboardServer({ root: fixture });       await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));       const base = 'http://127.0.0.1:' + server.address().port;
  • Network accessline 59
    await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));       const base = 'http://127.0.0.1:' + server.address().port;       browser = await chromium.launch({ channel: process.env.DASHBOARD_BROWSER_CHANNEL || 'msedge', headle
  • Network accessline 60
    const base = 'http://127.0.0.1:' + server.address().port;
  • Network accessline 116
    const request = await requestPromise;       assert.deepEqual(request.postDataJSON().expectedEvent, { date: today, time: '10:00', event_type: '一面' });       assert.equal(request.postDataJSON().job_url, 'https://example.com/A');
  • Network accessline 117
    assert.deepEqual(request.postDataJSON().expectedEvent, { date: today, time: '10:00', event_type: '一面' });       assert.equal(request.postDataJSON().job_url, 'https://example.com/A');       await page.waitForFunction(() => document.querySele
  • Network accessline 118
    assert.equal(request.postDataJSON().job_url, 'https://example.com/A');

dashboard/tests/dashboard-csv-validation.test.js

  • Executable scriptline 1
    Executable file

dashboard/tests/dashboard-model.test.js

  • Executable scriptline 1
    Executable file
  • Network accessline 104
    test('role history uses exact posting identity and latest successful date, not CSV order or company', () => {   const job = role('ACME', 'Submitted', { job_title: '供应链 (A)', job_url: 'https://example.com/#/job/A' });
  • Network accessline 105
    const job = role('ACME', 'Submitted', { job_title: '供应链 (A)', job_url: 'https://example.com/#/job/A' });
  • Network accessline 106
    const logs = [     role('Acme', 'Submitted', { job_title: '供应链', job_url: job.job_url, attempt_date: '2026-10-10', job_description: 'A最新JD' }),     role('Acme', 'Submitted', { job_title: '产品 (B)', job_url: 'https://example.com/#/job/B', att
  • Network accessline 107
    role('Acme', 'Submitted', { job_title: '供应链', job_url: job.job_url, attempt_date: '2026-10-10', job_description: 'A最新JD' }),     role('Acme', 'Submitted', { job_title: '产品 (B)', job_url: 'https://example.com/#/job/B', attempt_date: '2026-10
  • Network accessline 108
    role('Acme', 'Submitted', { job_title: '产品 (B)', job_url: 'https://example.com/#/job/B', attempt_date: '2026-10-11', job_description: 'B的JD' }),
  • Network accessline 112
    const before = structuredClone(logs);   assert.equal(latestApplication(job, logs).job_description, 'A最新JD');   assert.equal(latestApplication({ ...job, job_url: 'https://example.com/#/job/C' }, logs), null);
  • Network accessline 113
    assert.equal(latestApplication(job, logs).job_description, 'A最新JD');   assert.equal(latestApplication({ ...job, job_url: 'https://example.com/#/job/C' }, logs), null);   assert.deepEqual(logs, before);
  • Network accessline 114
    assert.equal(latestApplication({ ...job, job_url: 'https://example.com/#/job/C' }, logs), null);
  • Network accessline 115
    assert.deepEqual(logs, before);   assert.equal(sameRole(job, { ...job, job_url: 'https://example.com/#/job/B' }), false);   assert.equal(sameRole(job, { ...job, company: 'Acme Subsidiary' }), false);
  • Network accessline 116
    assert.equal(sameRole(job, { ...job, job_url: 'https://example.com/#/job/B' }), false);
  • Network accessline 122
    test('consolidated actions preserve all gaps, pool-only blockers and post-submission corrections', () => {   const jobs = [role('Acme', 'Submitted', { job_title: '已投岗位', job_url: 'https://example.com/1' }),
  • Network accessline 123
    const jobs = [role('Acme', 'Submitted', { job_title: '已投岗位', job_url: 'https://example.com/1' }),
  • Network accessline 124
    role('Acme', 'Needs user', { job_title: '待填岗位', job_url: 'https://example.com/2', current_stage: '基础信息已完成' }),
  • Network accessline 125
    role('Other', 'Blocked', { job_title: '计划员', blocker: '用户已登录;浏览器连接失败', next_action: '恢复已登录浏览器' })];   const blockers = [     role('Acme', 'open', { job_title: '旧标题', job_url: 'https://example.com/2', blocker_category: 'missing fact', user_a
  • Network accessline 126
    const blockers = [     role('Acme', 'open', { job_title: '旧标题', job_url: 'https://example.com/2', blocker_category: 'missing fact', user_action_needed: '确认薪资' }),     role('Acme', 'open', { job_title: '待填岗位', job_url: 'https://example.com/2
  • Network accessline 127
    role('Acme', 'open', { job_title: '旧标题', job_url: 'https://example.com/2', blocker_category: 'missing fact', user_action_needed: '确认薪资' }),
  • Network accessline 128
    role('Acme', 'open', { job_title: '待填岗位', job_url: 'https://example.com/2', blocker_category: 'missing fact', user_action_needed: '补毕业日期' }),
  • Network accessline 129
    role('Acme', 'open', { job_title: '已投岗位', job_url: 'https://example.com/1', blocker_category: 'Post-submission discrepancy' }),
  • Network accessline 130
    role('Acme', 'resolved', { job_title: '待填岗位', job_url: 'https://example.com/2' }),
  • Network accessline 131
    role('Acme', 'abandoned', { job_title: '放弃岗位', job_url: 'https://example.com/3' }),
  • Network accessline 146
    test('same title on different posting URLs remains separate and ambiguous gaps are not discarded', () => {   const jobs = [role('Acme', 'Needs user', { job_title: '产品经理', job_url: 'https://example.com/1' }),
  • Network accessline 147
    const jobs = [role('Acme', 'Needs user', { job_title: '产品经理', job_url: 'https://example.com/1' }),
  • Network accessline 148
    role('Acme', 'Needs user', { job_title: '产品经理', job_url: 'https://example.com/2' })];

dashboard/tests/server.test.js

  • Executable scriptline 1
    Executable file
  • Network accessline 118
    test('same-title postings cannot overwrite one another after a URL or row change', async t => {   const app = await fixture(t, { jobs: 'company,job_title,status,current_stage,job_url\n示例科技,示例岗位,Submitted,,https://example.com/a\n示例科技,示例岗位,Su
  • Network accessline 119
    const app = await fixture(t, { jobs: 'company,job_title,status,current_stage,job_url\n示例科技,示例岗位,Submitted,,https://example.com/a\n示例科技,示例岗位,Submitted,,https://example.com/b\n' });
  • Network accessline 120
    const before = app.read('job_pool.csv');   assert.equal((await app.post('/api/update-status', { ...endJob, job_url: 'https://example.com/a' })).status, 409);   assert.equal((await app.post('/api/calendar/add', { ...event, job_url: 'https://
  • Network accessline 121
    assert.equal((await app.post('/api/update-status', { ...endJob, job_url: 'https://example.com/a' })).status, 409);
  • Network accessline 122
    assert.equal((await app.post('/api/calendar/add', { ...event, job_url: 'https://example.com/a' })).status, 409);
  • Network accessline 123
    assert.equal((await app.post('/api/update-status', endJob)).status, 409);   assert.equal(app.read('job_pool.csv'), before);   assert.equal((await app.post('/api/update-status', { ...endJob, job_url: 'https://example.com/b' })).status, 200);
  • Network accessline 124
    assert.equal(app.read('job_pool.csv'), before);   assert.equal((await app.post('/api/update-status', { ...endJob, job_url: 'https://example.com/b' })).status, 200); });
  • Network accessline 125
    assert.equal((await app.post('/api/update-status', { ...endJob, job_url: 'https://example.com/b' })).status, 200);
  • Network accessline 148
    assert.equal((await app.request('/outside')).status, 403);   const crossOrigin = await app.request('/api/update-status', { method: 'POST', payload: endJob, headers: { Origin: 'https://example.com' } });
  • Network accessline 149
    const crossOrigin = await app.request('/api/update-status', { method: 'POST', payload: endJob, headers: { Origin: 'https://example.com' } });

dashboard/tests/test-helpers.js

  • Executable scriptline 1
    Executable file

references/safety-and-boundaries.md

  • Access to secretsline 13
    [Credential-related source omitted]

scripts/check-public-package.js

  • Executable scriptline 1
    #!/usr/bin/env node

scripts/check-public-package.test.js

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Signal confidence: 1 fact
  • Network access in prose of documentationREADME.md:72Low confidence

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

DanielPan12/JobHuntBot: #986 on hotskills, 883 stars

[![DanielPan12/JobHuntBot on hotskills](https://hotskills.dev/badge/danielpan12-jobhuntbot.svg)](https://hotskills.dev/skill/danielpan12-jobhuntbot/)