Files
ai-job-search/.agents/skills/linkedin-search/cli
AshutoshandClaude Sonnet 4.6 e595663dc1 fix: NaN filter bypass in LinkedIn CLI --jobage/--page/--limit flags (#35)
* fix: silent zero output in salary converter and NaN filter bypass in LinkedIn CLI

Bug #10 (convert_salary_excel.py):
openpyxl ws[row_index] random access fails silently under read_only=True,
leaving headers empty and producing no output. Fix: save the header row
values during the existing iter_rows scan so ws[header_row] is never called.

Bug #5 (.agents/skills/linkedin-search/cli/src/cli.ts):
parseInt on --jobage/--page/--limit flags returns NaN on non-numeric input.
NaN propagates silently — the jobage filter is dropped, page/limit are broken.
Fix: validate each parsed int, exit 1 with a structured BAD_ARG error on NaN.

Also adds:
- tests/test_bug10_salary_converter.py: 10 scenarios, 31 assertions (all green)
- tests/test_bug5_linkedin_cli.sh: 8 scenarios, 16 assertions (all green)
- docs/bugfixes.md: root cause, impact, and fix explanation for both bugs,
  plus a note on the pre-existing detect_column_type "n" pattern issue

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: address PR review — drop salary converter change, move test to bun

- Drop tools/convert_salary_excel.py change (bug not reproducible on
  modern openpyxl; reviewer confirmed master works correctly)
- Drop tests/test_bug10_salary_converter.py and top-level tests/ dir
- Drop docs/bugfixes.md (analysis belongs in PR description, not repo)
- Replace tests/test_bug5_linkedin_cli.sh with a proper bun test file
  at .agents/skills/linkedin-search/cli/tests/cli-flag-validation.test.ts
  following the jobindex-search/cli/tests/ convention (runCLI/parseJSON
  helpers, describe/test/expect, descriptive names)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 21:23:29 +02:00
..

linkedin-cli

CLI for searching jobs on LinkedIn's public job listings, for any country/region (and remote), across any sector.

Data source: LinkedIn jobs-guest endpoints (seeMoreJobPostings/search and jobPosting/<id>). Authentication: None required. Dependencies: None (plain bun + fetch). bun install is optional and only pulls dev type defs.

Personal use only. This uses LinkedIn's public job pages; automated access is against LinkedIn's Terms of Service. Keep volume low, don't use it commercially or for bulk data collection, and run it on your own responsibility.

Installation

cd .agents/skills/linkedin-search/cli
bun install   # optional — only installs TypeScript dev types

The CLI runs without any install because it has zero runtime dependencies.

Commands

Command Description
search Search for job listings (--location required)
detail Fetch full detail for a single job listing

search accepts --format json|table|plain (default json); detail accepts --format json|plain. All errors are written to stderr as { "error": "...", "code": "..." } with exit code 1.

Quick examples

# Software roles in Hyderabad, last 7 days
bun run src/cli.ts search -q "backend engineer" -l "Hyderabad, Telangana, India" --jobage 7 --format table

# Design roles in London
bun run src/cli.ts search -q "product designer" -l "London, United Kingdom" --format table

# Fully remote
bun run src/cli.ts search -q "technical writer" -l "Remote" --remote remote --format table

# Full detail for one job
bun run src/cli.ts detail 4426311357 --format plain

See ../SKILL.md for the full flag reference and the Terms-of-Service note.

Search flags

Flag Alias Description
--location -l Required. Place string, e.g. "Mumbai, Maharashtra, India", "Berlin, Germany", "Remote".
--query -q Keywords (title / skill / role). Recommended.
--jobage Posted within N days: 1, 7, 14, 30.
--remote remote | hybrid | onsite.
--page 1-indexed page (10 results/page).
--limit -n Cap results emitted.
--format json | table | plain.