feat: claw-apply v0.1 — full implementation

- job_searcher.mjs: LinkedIn + Wellfound search, queue population
- job_applier.mjs: Easy Apply + Wellfound apply, Mode A/B
- lib/form_filler.mjs: config-driven form filling, custom answers.json
- lib/linkedin.mjs: two-panel Easy Apply flow
- lib/wellfound.mjs: Wellfound search + apply
- lib/browser.mjs: Kernel stealth browser factory with local fallback
- lib/queue.mjs: jobs_queue.json management
- lib/notify.mjs: Telegram notifications
- setup.mjs: setup wizard with login verification
- Config templates: profile, search_config, answers, settings
- SKILL.md: OpenClaw skill definition
This commit is contained in:
2026-03-05 23:24:09 +00:00
parent 2056a05429
commit 52a56f59f6
16 changed files with 1278 additions and 0 deletions

10
config/answers.json Normal file
View File

@@ -0,0 +1,10 @@
[
{ "pattern": "sponsor", "answer": "No", "note": "Work authorization — no sponsorship needed" },
{ "pattern": "authorized.*work", "answer": "Yes", "note": "Authorized to work in US" },
{ "pattern": "legally.*work", "answer": "Yes" },
{ "pattern": "relocat", "answer": "No" },
{ "pattern": "remote.*willing", "answer": "Yes" },
{ "pattern": "start date", "answer": "Immediately" },
{ "pattern": "notice period", "answer": "2 weeks" },
{ "pattern": "degree|bachelor", "answer": "No" }
]

21
config/profile.json Normal file
View File

@@ -0,0 +1,21 @@
{
"name": { "first": "Jane", "last": "Smith" },
"email": "jane@example.com",
"phone": "555-123-4567",
"location": {
"city": "San Francisco",
"state": "California",
"zip": "94102",
"country": "United States"
},
"linkedin_url": "https://linkedin.com/in/janesmith",
"resume_path": "/home/user/resume.pdf",
"years_experience": 7,
"work_authorization": {
"authorized": true,
"requires_sponsorship": false
},
"willing_to_relocate": false,
"desired_salary": 150000,
"cover_letter": "Your cover letter text here. Keep it to 3-4 sentences — why you, why this type of role, one proof point."
}

40
config/search_config.json Normal file
View File

@@ -0,0 +1,40 @@
{
"_note": "Configure your job searches here. Each search runs on both listed platforms.",
"searches": [
{
"name": "Founding GTM",
"track": "gtm",
"keywords": [
"founding account executive",
"first sales hire",
"first GTM hire",
"founding AE",
"head of sales startup remote"
],
"platforms": ["linkedin", "wellfound"],
"filters": {
"remote": true,
"posted_within_days": 2
},
"exclude_keywords": ["BDR", "SDR", "staffing", "insurance", "retail", "consumer", "recruiter", "DataAnnotation"],
"salary_min": 130000
},
{
"name": "Enterprise AE",
"track": "ae",
"keywords": [
"enterprise account executive SaaS remote",
"senior account executive technical SaaS remote",
"enterprise AE data infrastructure cloud"
],
"platforms": ["linkedin"],
"filters": {
"remote": true,
"posted_within_days": 2,
"easy_apply_only": true
},
"exclude_keywords": ["BDR", "SDR", "SMB", "staffing", "retail", "DataAnnotation"],
"salary_min": 150000
}
]
}

25
config/settings.json Normal file
View File

@@ -0,0 +1,25 @@
{
"_note": "Main settings for claw-apply. Fill in your values and run: node setup.mjs",
"mode": "A",
"review_window_minutes": 30,
"schedules": {
"search": "0 * * * *",
"apply": "0 */6 * * *"
},
"max_applications_per_run": 50,
"notifications": {
"telegram_user_id": "YOUR_TELEGRAM_USER_ID",
"bot_token": "YOUR_TELEGRAM_BOT_TOKEN"
},
"kernel": {
"proxy_id": "YOUR_KERNEL_PROXY_ID",
"profiles": {
"linkedin": "LinkedIn-YourName",
"wellfound": "WellFound-YourName"
}
},
"browser": {
"provider": "kernel",
"playwright_path": null
}
}