fix(linkedin-search): reject an unknown --remote mode instead of searching every workplace type (#645)

* fix(linkedin-search): reject an unknown --remote mode instead of searching every workplace type

workTypeFlag() maps a mode it does not recognise to null, and the search URL
then carries no f_WT. So --remote remote,hybrid, a misspelt mode or a bare
--remote returned onsite postings too, with exit 0 and an empty stderr.
Validate the mode before dispatch and exit 1 with BAD_ARG; remote, hybrid,
onsite and the accepted on-site spelling keep their f_WT values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* changelog: place the #645 entry under [Unreleased]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Mads Lorentzen <madslorentzen_17@hotmail.com>
This commit is contained in:
authored and GitHub committed 2026-10-19 19:55:31 +02:00
1 parent 6ce6a1dece
commit 5f0b799479
3 files changed
+63

No files matched your search

@@ -9,6 +9,7 @@
import { runSearch, type SearchOpts } from "./commands/search.js"
import { runDetail, type DetailOpts } from "./commands/detail.js"
import { workTypeFlag } from "./helpers.js"
interface Flags {
_: string[]
@@ -121,6 +122,17 @@ async function main(): Promise<number> {
return 1
}
// workTypeFlag() maps a mode it does not know to null and the request then
// carries no f_WT, so "remote,hybrid", a misspelling or a bare --remote
// searched every workplace type, onsite included, with exit 0.
if (flags.remote !== undefined && (typeof flags.remote !== "string" || workTypeFlag(flags.remote) === null)) {
const got = typeof flags.remote === "string" ? `"${flags.remote}"` : "no value"
process.stderr.write(
JSON.stringify({ error: `--remote must be one of remote|hybrid|onsite, got ${got}`, code: "BAD_ARG" }) + "\n",
)
return 1
}
if (flags.jobage !== undefined && flags["jobage-minutes"] !== undefined) {
process.stderr.write(
JSON.stringify({
@@ -0,0 +1,44 @@
import { describe, expect, test } from "bun:test";
import { runSearchFixture } from "./helpers";
const LOCATION = "Copenhagen, Denmark";
// workTypeFlag() maps a mode it does not recognise to null, and the search
// URL then carries no f_WT at all. So `--remote remote,hybrid`, a misspelt
// mode, or a bare `--remote` searched every workplace type - onsite included -
// and exited 0 as if the filter had been applied. These run the real CLI
// against the saved search fixture and count the outbound requests.
describe("--remote mode", () => {
for (const args of [
["--remote", "remote,hybrid"],
["--remote", "remotely"],
["--remote", "--limit", "1"],
["--remote"],
]) {
test(`${args.join(" ")} exits 1 with BAD_ARG before any request`, async () => {
const { result, requests } = await runSearchFixture(["search", "-l", LOCATION, "-q", "engineer", ...args]);
expect(result.exitCode).toBe(1);
expect(result.stdout).toBe("");
const error = JSON.parse(result.stderr);
expect(error.code).toBe("BAD_ARG");
expect(error.error).toContain("--remote");
expect(requests).toHaveLength(0);
});
}
for (const [mode, wt] of [["remote", "2"], ["hybrid", "3"], ["onsite", "1"], ["on-site", "1"], ["Remote", "2"]]) {
test(`--remote ${mode} sends f_WT=${wt}`, async () => {
const { result, requests } = await runSearchFixture(["search", "-l", LOCATION, "--remote", mode]);
expect(result.exitCode).toBe(0);
expect(requests).toHaveLength(1);
expect(requests[0].searchParams.get("f_WT")).toBe(wt);
});
}
test("omitting --remote still searches every workplace type", async () => {
const { result, requests } = await runSearchFixture(["search", "-l", LOCATION]);
expect(result.exitCode).toBe(0);
expect(requests).toHaveLength(1);
expect(requests[0].searchParams.has("f_WT")).toBe(false);
});
});
+7
View File
@@ -115,6 +115,13 @@ per-file diff commands.
lookup then failed and `/apply` quietly dropped the benchmark. The converter now exits 2 before
reading the workbook or opening the output, and `0` or a finite custom baseline still converts.
- **`linkedin-search` rejects a `--remote` mode it does not recognise instead of searching every
workplace type** (#645, `.agents/skills/linkedin-search/cli/src/cli.ts`, `tests/remote-mode.test.ts`) -
`workTypeFlag()` maps an unknown mode to `null` and the request then carries no `f_WT`, so
`--remote remote,hybrid`, a misspelt mode or a bare `--remote` returned onsite postings too,
with exit 0 and an empty stderr. Anything other than `remote`, `hybrid` or `onsite` (and the
accepted `on-site` spelling) now exits 1 with `BAD_ARG` before any request is sent.
## [1.7.3] - 2026-10-19
### Added