OpenSource-Hub

ai-job-search

CLI ツール

MadsLorentzen/ai-job-search

Claude Code に基づく AI 求職フレームワーク。

概要

Claude Code を活用して求職プロセスを自動化するフレームワーク。ユーザープロファイル、求人検索、マッチング度の評価、履歴書とカバーレターのカスタマイズ、および面接準備を含みます。

README プレビュー

\n  \n\n\n# AI Job Search\n\nAn AI-powered job application framework built on [Claude Code](https://claude.com/claude-code). Fork it, fill in your profile, and let Claude evaluate job postings, tailor your CV, write cover letters, and prepare you for interviews.\n\n> Note: This is an independent open-source project and is not affiliated with, endorsed by, sponsored by, or maintained by Anthropic. Anthropic and Claude Code are referenced only to describe the toolchain this workflow uses.\n\n\n  \n    \n  \n\n\n## What this is\n\nA structured workflow that turns Claude Code into a full-stack job application assistant. The core workflow (self-profiling, fit evaluation, and the drafter-reviewer application pipeline) is **language- and country-agnostic**. The job portal search skills are built for the Danish market (Jobindex, Jobnet, Akademikernes Jobbank, etc.), but the pattern is designed to be swapped for your local job boards.\n\n```\n/setup          /scrape              /apply \n  |                |                     |\n  v                v                     v\nFill in        Search job           Evaluate fit\nyour profile   portals              Score & recommend\n  |                |                     |\n  v                v                     v\nProfile        Present matches      Draft CV + Cover Letter\nfiles ready    with fit ratings     (LaTeX, tailored)\n                   |                     |\n                   v                     v\n               Pick a match         Reviewer agent critiques\n               -> /apply            -> Revise -> Final output\n```\n\nThe framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking.\n\n## Prerequisites\n\n- [Claude Code](https://claude.com/claude-code) (CLI)\n- Python 3.10+\n- [Bun](https://bun.sh) (for Danish job search CLI tools)\n- LaTeX distribution with `lualatex` and `xelatex`: [TeX Live](https

FAQ (5)

トラブル対応
キリル文字などの非ラテン文字のタイトルが変更されたときに、同じ Freehire URL に対して重複するジョブキーを修正するにはどうすればよいですか?

この重複は、tools/job_key.py が title + url をハッシュするために発生します。非ラテン文字のタイトルは untitled にスラグ化され、一方 Freehire の英数字スラグは6桁の _JOB_ID パターンに一致しません。URL が存在する場合は常に URL のみをハッシュし、URL が存在しない場合のフォールバックとしてのみタイトルを使用するように、ヘルパーを修正してください。続いて、すべてのタイトルバリアントが1つのキーを生成することを確認します:

U=https://freehire.me/jobs/inzhener-ooo-chen-hlk3qjfg
python3 tools/job_key.py --company "ООО Чен" --title "Инженер" --url "$U"
python3 tools/job_key.py --company "ООО Чен" --title "инженер" --url "$U"
python3 tools/job_key.py --company "ООО Чен" --title "Инженер-механик" --url "$U"
python3 tools/job_key.py --audit

3つのコマンドはすべて同じキーを返し、duplicate_urls はその求人を報告しなくなるはずです。修正を適用した後、古い重複キーが除外セットに残らないように、seen_jobs.json を再構築または重複排除してください。求人が再掲載される際にスラグが変わる可能性があるため、タイトルスラグの正規化や英数字スラグ ID に依存してはいけません。

参照 Issue #501
トラブル対応
Excel の行に 500 人の従業員と Count 列および Index 列の両方が含まれているのに、なぜ salary_lookup は "too few employees to publish (privacy)" と表示するのですか?

これは、convert_salary_excel.py が Count + Index(デンマーク語では Antal + Lønindeks)のような接尾辞のない単体のヘッダーをペアにしないために発生します。これらの派生カテゴリ名は空になるため、1つの all_employees カテゴリではなく、個別のカテゴリとしてエクスポートされます。

即時の回避策: 両方のヘッダーに同じ空でないカテゴリ接尾辞を付けてから、JSON を再生成します:

Count all | Index all

デンマーク語の場合:

Antal alle | Lønindeks alle

次に実行します:

python3 tools/convert_salary_excel.py acme.xlsx --output salary_data.json
python3 salary_lookup.py "Acme Corp"

ルックアップには、件数、インデックス、ベースライン差異を含む1つの結合行が表示されるはずです。

恒久的なコード修正: tools/convert_salary_excel.py の count/index のペアリング条件を変更し、空文字列を含む同一の派生カテゴリ名を受け入れるようにして、空のペアにはデフォルトのカテゴリ名 all_employees を割り当てます。対応するインデックス列のない単体の Count/Antal 列は、スタンドアロンの件数列のままにする必要があります。

参照 Issue #469
トラブル対応
jobdanmark-search detailがリトライせずに最初のHTTP 429または5xxレスポンスで失敗する問題を修正するには?

detail コマンドは .agents/skills/jobdanmark-search/cli/src/commands/detail.ts 内で fetch() を直接呼び出しており、CLI のリトライラッパーをバイパスしています。jobdanmark-search/cli/src/helpers.ts に、apiFetch/apiPost と同じリトライ/バックオフループ、タイムアウト、およびエクスポートされた USER_AGENT を使用する htmlFetch(url) ラッパーを追加して修正してください。HTTP 404 の場合は null を返すようにして、detail が NOT_FOUND の動作を維持できるようにし、その後 detail.ts 内の直接の fetch() 呼び出しを htmlFetch() に置き換えてください。リトライバックオフ、リクエストタイムアウト、ラッパーのテストを拡張し、fetch をスタブして 429 を返させ、期待される 500ms〜5s のバックオフスケジュールで複数回の試行が行われることを検証するハンドラーレベルのテストを追加してください。

参照 Issue #459
トラブル対応
WindowsでWebページのテキストを出力する際のUnicodeEncodeError 'charmap codec can't encode character' の修正方法

このクラッシュは、Windows 上で Python のパイプ接続された stdout がデフォルトで従来の ANSI コードページ (cp1252) になり、非ラテン文字(例: ポーランド語の Ż、Ł、デンマーク語の Ø、キリル文字/CJK)をエンコードできないために発生します。スクリプトの起動時に UTF-8 出力を強制することで修正してください。tools/fetch_page.py と tools/robots_check.py では、すべての print() の前に共通ヘルパー _force_utf8_output() を呼び出します。これは tools/rank_state.py、tools/job_key.py、tools/posting_guard.py、tools/verify_layout.py、tools/verify_pdf.py、および tools/upstream_triage.py ですでに使われているのと同じパターンです。これは sys.stdout/sys.stderr を UTF-8 に再構成します(Python 3.7+ の sys.stdout.reconfigure(encoding='utf-8', errors='replace') と同等)。コードを変更しない代替の回避策: 実行前に環境変数 PYTHONIOENCODING=utf-8 または PYTHONUTF8=1 を設定します(例: PYTHONIOENCODING=utf-8 python3 tools/fetch_page.py <url> --text)、または Windows コンソールで chcp 65001 を実行して UTF-8 に切り替えます。

参照 Issue #685
トラブル対応
jobdanmark-search detail が JSON-LD の description に生の HTML タグを返してしまう問題は、どうすれば修正できますか?

JSON-LDブランチ(detail.ts内のfromJsonLd)では、jobPosting.descriptionをそのまま代入しないでください。既存のnode-html-parser依存関係でパースし、structuredTextを使用してエンティティをデコードし、ブロック要素を個別の行に変換してから、既存のcleanTextヘルパーで各行を正規化してください。これにより、JSON-LDの出力がレンダリングされたHTMLブランチと一致します。タグは除去され、&amp;や&oslash;などのエンティティはデコードされ、段落やリストの改行は保持されます。detail-jsonld.test.tsを更新して、生の<p>マークアップではなくプレーンテキストを期待するようにし、<p>...</p><ul><li>...</li></ul>のようなHTMLを含むテストケースを追加してください。

参照 Issue #515