#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
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>/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
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 tokensAlways available to the agent
SKILL.md
2,851 tokensWhen the skill is activated
Reference documents
19,358 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Core Contract
- Workflow
- Safety
Scripts executed separately
dashboard/csv-store.jsdashboard/dashboard-model.jsdashboard/scripts/audit-data.jsdashboard/scripts/company-categories.jsdashboard/server.jsdashboard/start-dashboard.batdashboard/start-dashboard.shdashboard/tests/audit-data.test.jsdashboard/tests/csv-row-index.test.jsdashboard/tests/csv-store.test.jsdashboard/tests/dashboard-browser.test.jsdashboard/tests/dashboard-csv-validation.test.jsdashboard/tests/dashboard-model.test.jsdashboard/tests/server.test.jsdashboard/tests/test-helpers.jsscripts/check-public-package.jsscripts/check-public-package.test.js
Files
.github/workflows/validate.ymlasset766 bytes.gitignoreasset340 bytesAGENTS.mddoc1,535 bytesLICENSEasset1,143 bytesREADME.mddoc22,140 bytesSKILL.mdcore15,206 bytesSKILL.mdcore15,206 bytesSKILL.mdcore15,206 bytesSKILL.mdcore15,206 bytesSKILL.mdcore15,206 bytesdashboard/application_log.csvasset157 bytesdashboard/automation_rules.csvasset63 bytesdashboard/blocker_queue.csvasset130 bytesdashboard/company_categories.jsonasset38 bytesdashboard/csv-store.jsruns5,350 bytesdashboard/daily_dashboard.csvasset132 bytesdashboard/dashboard-model.jsruns5,353 bytesdashboard/dashboard.htmlasset54,271 bytesdashboard/follow_up.csvasset89 bytesdashboard/job_pool.csvasset212 bytesdashboard/resume_rules.csvasset84 bytesdashboard/scripts/audit-data.jsruns7,281 bytesdashboard/scripts/company-categories.jsruns3,672 bytesdashboard/server.jsruns12,128 bytesdashboard/start-dashboard.batruns109 bytesdashboard/start-dashboard.shruns233 bytesdashboard/tests/audit-data.test.jsruns3,311 bytesdashboard/tests/csv-row-index.test.jsruns1,909 bytesdashboard/tests/csv-store.test.jsruns3,175 bytesdashboard/tests/dashboard-browser.test.jsruns10,532 bytesdashboard/tests/dashboard-csv-validation.test.jsruns1,182 bytesdashboard/tests/dashboard-model.test.jsruns10,548 bytesdashboard/tests/server.test.jsruns9,515 bytesdashboard/tests/test-helpers.jsruns2,642 bytesreferences/application-playbook.mddoc17,938 bytesreferences/lead-discovery.mddoc7,939 bytesreferences/safety-and-boundaries.mddoc3,984 bytesreferences/setup-workflow.mddoc16,099 bytesscripts/check-public-package.jsruns7,511 bytesscripts/check-public-package.test.jsruns4,315 bytestemplates/answer_bank.template.mddoc2,824 bytestemplates/application-progress.template.jsonasset2,274 bytestemplates/application_rules.template.mddoc5,760 bytestemplates/candidate_profile.template.jsonasset1,938 bytestemplates/dashboard-template/README.mddoc6,750 bytestemplates/dashboard-template/application_log.csvasset157 bytestemplates/dashboard-template/automation_rules.csvasset63 bytestemplates/dashboard-template/blocker_queue.csvasset130 bytestemplates/dashboard-template/daily_dashboard.csvasset132 bytestemplates/dashboard-template/follow_up.csvasset89 bytestemplates/dashboard-template/job_pool.csvasset212 bytestemplates/dashboard-template/resume_rules.csvasset84 bytestemplates/experience_bank.template.mddoc4,768 bytestemplates/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 GitHubSkills 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
- #973 on Oct 31
- #975 on Nov 1
- #980 on Nov 2
- #979 on Nov 3
- #984 from Nov 4 to Nov 5
- #986 since Nov 6
76 earlier periods
- #883 on Aug 2
- #876 on Aug 7
- #877 on Aug 8
- #864 on Aug 9
- #889 on Aug 10
- #884 on Aug 11
- #876 on Aug 12
- #875 on Aug 13
- #855 on Aug 14
- #826 on Aug 15
- #848 on Aug 16
- #846 on Aug 17
- #863 on Aug 18
- #854 on Aug 19
- #843 on Aug 20
- #851 on Aug 21
- #797 on Aug 22
- #851 on Aug 23
- #859 on Aug 24
- #864 on Aug 25
- #844 on Aug 26
- #848 on Aug 27
- #870 on Aug 28
- #782 on Aug 29
- #777 on Aug 30
- #806 on Aug 31
- #808 on Sep 1
- #776 on Sep 2
- #775 on Sep 3
- #746 on Sep 4
- #723 on Sep 5
- #743 on Sep 6
- #747 on Sep 7
- #769 on Sep 8
- #748 on Sep 9
- #753 on Sep 10
- #731 on Sep 11
- #724 on Sep 12
- #720 on Sep 13
- #745 on Sep 14
- #740 on Sep 15
- #747 on Sep 16
- #748 on Sep 17
- #730 on Sep 18
- #704 on Sep 19
- #715 on Sep 20
- #736 on Sep 21
- #755 on Sep 22
- #750 on Sep 23
- #719 on Sep 24
- #701 on Sep 25
- #702 on Sep 26
- #728 on Sep 27
- #748 on Sep 28
- #776 on Sep 29
- #758 on Sep 30
- #730 on Oct 2
- #743 on Oct 4
- #752 on Oct 5
- #769 on Oct 7
- #814 on Oct 8
- #763 on Oct 10
- #787 on Oct 12
- #794 on Oct 13
- #805 on Oct 14
- #795 on Oct 15
- #801 on Oct 16
- #775 on Oct 17
- #762 on Oct 18
- #818 on Oct 20
- #808 on Oct 22
- #815 on Oct 23
- #948 on Oct 25
- #965 on Oct 28
- #967 on Oct 29
- #969 on Oct 30
Before you install
Network or broad shellAutomated 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:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 81 network referencesin 8 files: dashboard/tests/dashboard-model.test.js:104 dashboard/tests/dashboard-browser.test.js:30 dashboard/dashboard.html:410 and 5 more
- No hidden or obfuscated text
- No instruction overrides
- 17 executable scriptsin 17 files: dashboard/csv-store.js:1 dashboard/dashboard-model.js:1 dashboard/scripts/audit-data.js:1 and 14 more
- 3 references to secretsin 3 files: .gitignore:13 SKILL.md:144 references/safety-and-boundaries.md:13
- No requests to vote in Hot
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
dashboard/start-dashboard.bat
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 | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.
[](https://hotskills.dev/skill/danielpan12-jobhuntbot/)