feat(amazon-shopping): parse filters and extract search candidates

This commit is contained in:
2026-04-15 18:31:44 -05:00
parent 8ad532545d
commit ef326896f4
15 changed files with 822 additions and 10 deletions
+7 -8
View File
@@ -3,6 +3,7 @@
import minimist from "minimist";
import { fileURLToPath } from "node:url";
import { parseNaturalLanguageRequest } from "./query-parser.js";
import type { ProductFilters, SearchProductsRequest, SearchProductsResponse } from "./types.js";
export interface CliDeps {
@@ -76,12 +77,13 @@ export function parseCliRequest(argv: string[]): SearchProductsRequest {
alias: { h: "help" }
});
const query = String(args.query ?? args._.join(" ")).trim();
if (!query) {
const rawQuery = String(args.query ?? args._.join(" ")).trim();
if (!rawQuery) {
throw new Error("A product query is required");
}
const limit = parsePositiveInteger(args.limit, "limit") ?? 15;
const natural = parseNaturalLanguageRequest(rawQuery);
const limit = parsePositiveInteger(args.limit, "limit") ?? natural.limit ?? 15;
if (limit > 30 && !args["allow-large-limit"]) {
throw new Error("Requested limits above 30 require --allow-large-limit or a batched run");
}
@@ -91,10 +93,7 @@ export function parseCliRequest(argv: string[]): SearchProductsRequest {
throw new Error("max-search-pages must be 5 or less");
}
const filters: ProductFilters = {
includeKeywords: [],
excludeKeywords: []
};
const filters: ProductFilters = { ...natural.filters };
const minRating = parseNumber(args["min-rating"], "min-rating");
const minReviews = parsePositiveInteger(args["min-reviews"], "min-reviews");
const maxPrice = parseNumber(args["max-price"], "max-price");
@@ -108,7 +107,7 @@ export function parseCliRequest(argv: string[]): SearchProductsRequest {
const markdown = Boolean(args.markdown);
return {
query,
query: natural.query || rawQuery,
filters,
limit,
maxSearchPages,