From 5f8d3330f7d5fa92a580dbbfe99871e7d0cc261b Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Sun, 7 Jun 2026 00:51:41 +0700 Subject: [PATCH] update skill --- .claude/skills/chrome-session/SKILL.md | 37 ++++++++++++++------- tracking/telegram_channels.json | 45 ++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 11 deletions(-) diff --git a/.claude/skills/chrome-session/SKILL.md b/.claude/skills/chrome-session/SKILL.md index 7011709..db29fc3 100644 --- a/.claude/skills/chrome-session/SKILL.md +++ b/.claude/skills/chrome-session/SKILL.md @@ -24,27 +24,42 @@ Do NOT use this skill for: ## Setup overview -- **Launcher script**: `scripts/launch-chrome.sh` — starts Chrome with `--remote-debugging-port=9222` against the local profile copy at `.chrome/Default`. +- **Launcher script**: `scripts/launch-chrome.sh` — starts Chrome with `--remote-debugging-port=9222` against the local profile copy at `.chrome/`. The script is idempotent: if Chrome is already running it exits immediately. - **Profile copy**: `.chrome/` is a fork of Oleg's `Profile 1` (the `usulpro@gmail.com` profile). Logged-in cookies live here. The directory is gitignored. - **MCP server**: `chrome-devtools` is configured in `.mcp.json` with `--browserUrl=http://127.0.0.1:9222`, i.e. it attaches to the already-running Chrome rather than launching its own. -You do not launch Chrome yourself — Oleg starts it manually via the script. Your job is to detect whether it's running and to use the MCP tools to drive it. - ## Standard workflow -### 1. Verify Chrome is running and attached +### 1. Ensure Chrome is running and attached -Before any browser action, confirm the debug port is live: +Before any browser action, confirm the debug port is live, and launch Chrome automatically if it isn't: ```bash curl -sf http://127.0.0.1:9222/json/version >/dev/null && echo OK || echo DOWN ``` -If `DOWN`, tell Oleg: +**If `DOWN`** — launch the script in the background and poll until Chrome is ready: -> Chrome не запущен с debug-портом. Запусти `./scripts/launch-chrome.sh` и скажи когда готово. +```bash +# Launch Chrome in background (script uses exec, so backgrounding the script is correct) +nohup /projects/my-projects/cv-2026/scripts/launch-chrome.sh >/tmp/chrome-launch.log 2>&1 & -Do NOT try to launch Chrome yourself — the script blocks the terminal and the user is the one who controls the browser window. +# Poll up to 15 seconds +for i in $(seq 1 15); do + sleep 1 + curl -sf http://127.0.0.1:9222/json/version >/dev/null && echo "Chrome up after ${i}s" && break + echo "Waiting... ${i}s" +done +curl -sf http://127.0.0.1:9222/json/version >/dev/null || echo "FAILED" +``` + +If Chrome does not respond after 15 seconds, stop and report: + +> Chrome не запускается. Посмотри `/tmp/chrome-launch.log` и проверь, что `.chrome/` существует. + +If the launcher prints `Error: .chrome/ does not exist`, stop immediately — there is no profile to use and you cannot create one. + +Do NOT try to sign Oleg in, copy profiles, or work around a missing `.chrome/` directory. ### 2. Open / select the right page @@ -100,7 +115,7 @@ When the user asks "what fields does this application form want?", use `take_sna | Symptom | Likely cause | Action | |---------|--------------|--------| -| `curl http://127.0.0.1:9222/json/version` fails | Chrome not launched with debug port | Ask Oleg to run `./scripts/launch-chrome.sh` | +| `curl http://127.0.0.1:9222/json/version` fails | Chrome not launched with debug port | Run `./scripts/launch-chrome.sh` in background and poll (see step 1) | | `new_page` times out but the tab appears in `list_pages` | Slow site / heavy SPA | Continue — check the final URL via `list_pages` | | Final URL is `/login`, `/checkpoint`, `/signin` | Not signed in | **Stop. Tell Oleg.** Don't try to log in for him. | | Feed/list shows only the first few items | Lazy loading hasn't fired | Scroll the inner container, not `window` | @@ -109,7 +124,7 @@ When the user asks "what fields does this application form want?", use `take_sna ## Don'ts -- **Don't launch Chrome yourself** (the launcher blocks the terminal; Oleg owns the window). +- **Don't launch Chrome interactively** — always use `nohup ... &` so it detaches from the terminal. - **Don't try to sign Oleg in** when you hit a login wall — just report and wait. - **Don't submit forms, click "Apply", send messages, or post anything** unless explicitly instructed. - **Don't loop on bot-detection pages** — one detection means stop. @@ -118,7 +133,7 @@ When the user asks "what fields does this application form want?", use `take_sna ## Example: "read first N LinkedIn posts" -1. `curl -sf http://127.0.0.1:9222/json/version` → confirm Chrome up. +1. `curl -sf http://127.0.0.1:9222/json/version` → if DOWN, launch via `nohup ./scripts/launch-chrome.sh &` and poll until up. 2. `list_pages` — is LinkedIn already open? If not, `new_page(https://www.linkedin.com/feed/)`. 3. Verify final URL contains `/feed/` and not `/login`. 4. `evaluate_script`: find `
`, step `scrollTop += 1200` with 800ms waits until enough `"Feed post"` h2s have appeared. diff --git a/tracking/telegram_channels.json b/tracking/telegram_channels.json index a8b52d7..0d46195 100644 --- a/tracking/telegram_channels.json +++ b/tracking/telegram_channels.json @@ -1,4 +1,15 @@ { + "JS_RemoteJobs": { + "lang": "en", + "priority": "p1", + "exclude": ["kafka", "golang", "kotlin", "android", "swift", " rust ", " java "] + }, + "notificaJobs_nodeJS": { + "lang": "en", + "priority": "p1", + "exclude": ["kafka", "golang", "kotlin", "android", "swift", " rust "] + }, + "jaabz_com": { "lang": "en", "priority": "p1", @@ -38,6 +49,28 @@ "include": [["typescript", "javascript", " react", "node.js", "nodejs", "fullstack", "full-stack", "ai engineer", "tech lead", "techlead"]], "exclude": ["mental health", "marketing", "sales", "designer", "manager", "recruit", "kafka", "golang", "kotlin", "android", "swift"] }, + "ai_dev_job": { + "lang": "ru", + "priority": "p2" + }, + "jsdevjob": { + "lang": "ru", + "priority": "p2", + "include": [["react", "javascript", "typescript", "frontend", "fullstack", "full-stack", " llm", " ai engineer"]], + "exclude": ["kafka", "golang", "kotlin", "android", "swift", "курс ", "вебинар", "конкурс", "#резюме", "#resume"] + }, + "itdevjobs": { + "lang": "mixed", + "priority": "p2", + "include": [["#remote"], ["#typescript", "#javascript", "#react", "#fullstack"]], + "exclude": ["kafka", "golang", "kotlin", "android", "swift", "#резюме", "#resume", "#cv"] + }, + "serbia_jobs": { + "lang": "en", + "priority": "p2", + "include": [["#vacancy", "#вакансия"], ["frontend", "fullstack", "full-stack", "javascript", "typescript", " react", "node.js", "nodejs", "ai engineer", " llm", "tech lead"]], + "exclude": ["kafka", "golang", "kotlin", "android", "swift", " java ", "#cv", "#resume", "#резюме", "#ищуработу", "sales manager", "marketing"] + }, "javascript_jobs_feed": { "lang": "ru", "priority": "p2" @@ -79,6 +112,18 @@ "exclude": ["kafka", "golang", "kotlin", "android", "swift", "#резюме", "#resume", "#cv", "#ищуработу"] }, + "devsunite": { + "lang": "en", + "priority": "p3", + "include": [["javascript", "typescript", " react", "node.js", "nodejs", "fullstack", "full-stack"]], + "exclude": ["kafka", "golang", "kotlin", "android", "swift", " java ", " rust ", "php", "devops", "qa", "sales", "marketing", "designer", "cloud engineer", "aws engineer"] + }, + "it_jobs_cyprus": { + "lang": "ru", + "priority": "p3", + "include": [["#vacancy", "#вакансия"], ["javascript", "typescript", " react", "node.js", "nodejs", "fullstack", "full-stack", "frontend", "ai engineer", " llm"]], + "exclude": ["kafka", "golang", "kotlin", "android", "swift", " java ", "#cv", "#resume", "#резюме", "#ищуработу", "igaming", "iGaming", "sales", "marketing", "devops", "manual test", "qa engineer"] + }, "devops_jobs": { "lang": "ru", "priority": "p3",