Commit Graph
6 Commits
Author SHA1 Message Date
Abhinav 6ef295bf7b fix(linkedin-search): accept LinkedIn job URLs with trailing slashes in detail command (#411) (#412)
* fix(linkedin-search): accept LinkedIn job URLs with trailing slashes in detail command (#411)

* docs(changelog): record linkedin-search trailing-slash fix (#411)
2026-09-01 21:35:06 +02:00
Ayobami AdegokeandNavakanth Reddy Dumpa 3d296448bd feat(linkedin-search): report closed postings via isActive, wire into /scrape (adopts #280) (#383)
* feat(linkedin-search): add active status verification for job postings

* fix(linkedin-search): scope closed-posting detection to the top card, pin with tests (#280)

The first version matched five markers against the whole document, so
recruiter boilerplate quoting 'no longer accepting applications' in a
description flagged a live job CLOSED. Detection now stops where the
description markup begins and matches only the two markers real closed
pages carry (closed-job__flavor and the banner text, verified against
live guest pages); the three speculative phrases are dropped. Four new
fixture tests pin both directions plus the two description false-positive
cases - the false-positive pair fails on the unscoped version.

* feat(scrape): mark closed-at-source LinkedIn postings expired, never drop (#280)

/scrape Step 2 now consumes linkedin-search detail's isActive: a job whose
posting page renders the closed banner is written to seen_jobs.json with
status expired rather than silently dropped, per the /rank marking pattern -
the fix for the ghost-jobs class in #331. isActive: true is documented as
absence of the banner, not proof the posting is open.

---------

Co-authored-by: Navakanth Reddy Dumpa <navkanthr@gmail.com>
2026-08-29 11:12:26 +02:00
Mads LorentzenandClaude Opus 5 a306912133 fix(linkedin-search): drop the never-delivered applyUrl detail field
The regex required class= before href= within one tag; LinkedIn's real
markup puts href first, so applyUrl was null on every live posting while
SKILL.md claimed the command returns an apply link. Fixing the regex
would only yield the job-view URL - a duplicate of url - so the field is
removed rather than repaired, and a test pins the removal. Review
finding F19 (2026-08-19), decision approved by Mads.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 20:34:35 +02:00
Gurnoor Kaur b167efae3b feat(linkedin-search): add --jobage-minutes for sub-day freshness windows (#302)
jobageToTPR() only emits whole-day f_TPR windows, so a search can't be
restricted to postings from the last N minutes. LinkedIn's f_TPR filters
server-side down to one-second granularity (confirmed empirically), so
this is a pure window-construction change via a new minutesToTPR()
helper - no HTML parsing changes needed.

--jobage-minutes and --jobage both express a freshness window; passing
both is rejected with CONFLICTING_AGE_FLAGS rather than one silently
overriding the other.
2026-08-07 15:50:23 +02:00
Kushida fc9e3e1f32 fix: respect zero LinkedIn result limits (#76) 2026-07-08 20:57:41 +02:00
d8f38fe766 Add country-agnostic linkedin-search skill (#20)
A general-purpose, field-agnostic job-search skill built on LinkedIn's public
jobs-guest endpoints. Works for any market out of the box — location is an
explicit required flag (no country default). Zero runtime dependencies (bun only);
search + detail commands.

Includes a personal-use / Terms-of-Service note (automated access is against
LinkedIn's ToS — keep volume low, non-commercial).

(Pairs with the .gitignore fix in #21, which lets skills under .agents/ be tracked.)

Co-authored-by: Akhil Tripathi <kodabear@Akhils-MacBook-Pro.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 20:26:19 +02:00