feat(amazon-shopping): scrape and filter amazon product results

This commit is contained in:
2026-04-15 18:48:51 -05:00
parent ef326896f4
commit 1e0e265f1e
15 changed files with 844 additions and 6 deletions
+16 -2
View File
@@ -3,7 +3,9 @@
import minimist from "minimist";
import { fileURLToPath } from "node:url";
import { searchProducts } from "./browser.js";
import { parseNaturalLanguageRequest } from "./query-parser.js";
import { createMarkdownReport } from "./report.js";
import type { ProductFilters, SearchProductsRequest, SearchProductsResponse } from "./types.js";
export interface CliDeps {
@@ -138,7 +140,19 @@ async function defaultSearchProducts(request: SearchProductsRequest, deps: CliDe
if (request.dryRun) {
return createDryRunResponse(request, deps.now ?? (() => new Date()));
}
throw new Error("Live Amazon search is not implemented yet. Use --dry-run until browser orchestration is installed.");
return searchProducts(request, { now: deps.now });
}
function writeResponse(response: SearchProductsResponse, output: SearchProductsRequest["output"], deps: CliDeps): void {
if (output === "markdown") {
deps.stdout.write(createMarkdownReport(response));
return;
}
if (output === "both") {
deps.stdout.write(`${JSON.stringify(response, null, 2)}\n\n${createMarkdownReport(response)}`);
return;
}
deps.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
}
export async function runCli(
@@ -156,7 +170,7 @@ export async function runCli(
const response = deps.searchProducts
? await deps.searchProducts(request)
: await defaultSearchProducts(request, deps);
deps.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
writeResponse(response, request.output, deps);
return 0;
} catch (error: unknown) {
const message = error instanceof Error ? error.message : String(error);