ワンクリックで
manual-sync
Fetch new LeetCode comp posts and manually parse/normalize them (replacing the LLM pipeline). Invoke with /manual-sync.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Fetch new LeetCode comp posts and manually parse/normalize them (replacing the LLM pipeline). Invoke with /manual-sync.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | manual-sync |
| description | Fetch new LeetCode comp posts and manually parse/normalize them (replacing the LLM pipeline). Invoke with /manual-sync. |
| disable-model-invocation | true |
You replace the LLM steps of leetcomp-sync. The fetch script grabs raw posts, then YOU parse, normalize, and rebuild final data.
cd {{workspace}} && uv run python -c "
import asyncio
from leetcomp.utils import last_fetched_info
from leetcomp.fetch import fetch_posts_in_bulk
from leetcomp import POSTS_FILE
till_id, till_ts = last_fetched_info(POSTS_FILE)
print(f'OLD_FIRST_ID={till_id}')
asyncio.run(fetch_posts_in_bulk(till_id=till_id, till_timestamp=till_ts))
print('FETCH_DONE')
"
Note the OLD_FIRST_ID printed. All lines in data/posts.jsonl before that id's line are new posts. If no new posts were fetched, stop and report that.
Read the new posts from data/posts.jsonl. For each post:
{"id": ..., "created_at": ..., "skip": true}{"id": ..., "created_at": ..., "skip": true}Parsed record JSON line:
{"id": <int>, "created_at": "<str>", "skip": false, "compensation-post": true,
"offer-type": "full-time", "company": "<raw>", "company-normalized": "<lowercase>",
"role": "<raw>", "role-normalized": "<lowercase short form>", "yoe": <float>,
"base": <float, LPA>, "total": <float LPA explicit>, "total-calculated": <float LPA computed>,
"location": "<city>", "currency": "INR"}
Key rules:
total = user-stated total; total-calculated = annual compensation computed from recurring annual components only (base + annual bonus/target bonus + annualized stocks/equity), and only if no explicit total is statedtotal-calculated: joining/sign-on bonus, relocation bonus, retention bonus, PF, gratuity, retirals, benefits, reimbursements, clawback notes, etc.total-calculated when there are enough components to exceed just base alone, and no explicit total is stated. Do not leave it out just because one component (e.g. vesting period) uses a standard default.total exactly as stated instead of recomputingdata/role_map.json conventions when possible; prefer specific normalized titles over overly generic ones when the role is explicitly stated (e.g. application engineer l3 is better than l3)Critical accuracy rules:
role and role-normalizedlocation even if the author mentions current city, preferred city, NCR, office preference, or a company office elsewheresde/sse just because the YOE/company suggests itrole text from the post when present, and normalize separately in role-normalizedMandatory verification before writing:
company, role, location, yoe, explicit total) appears in the post textrole-normalized against existing data/role_map.json patterns before creating a new style of normalizationtotal-calculated excludes one-time components unless the post explicitly gives a total, in which case use totaldata/parsed_posts.jsonl (newest first)For each of company_map.json, role_map.json, location_map.json:
company-normalized, role-normalized, location)"lowercase_variant": "Canonical Name"Canonical naming:
cd {{workspace}} && uv run python -c "from leetcomp.transform import create_final_data; create_final_data()"
Print summary: new posts fetched, parsed offers vs skipped, new mappings added per entity type, total final records.
cd {{workspace}} && python3 -c "import json; print(f'Final records: {len(json.load(open(\"data/final_data.json\")))}')"