← back to Homesonspec

apps/workers/src/cli.ts

60 lines

import { prisma } from "@homesonspec/database";
import { meridianHomesAdapter } from "@homesonspec/collector-meridian-homes";
import { tollBrothersAdapter } from "@homesonspec/collector-toll-brothers";
import { lennarAdapter } from "@homesonspec/collector-lennar";
import { drHortonAdapter } from "@homesonspec/collector-dr-horton";
import { kbHomeAdapter } from "@homesonspec/collector-kb-home";
import { pulteAdapter } from "@homesonspec/collector-pulte";
import { triPointeAdapter } from "@homesonspec/collector-tri-pointe";
import { taylorMorrisonAdapter } from "@homesonspec/collector-taylor-morrison";
import { discoveryAdapter } from "@homesonspec/collector-discovery";
import { davidWeekleyAdapter } from "@homesonspec/collector-david-weekley";
import { ashtonWoodsAdapter } from "@homesonspec/collector-ashton-woods";
import { runPipeline } from "./pipeline";
import { recordSourceRun } from "./verify";

/**
 * Direct pipeline runner — no queue required.
 *   pnpm --filter @homesonspec/workers pipeline -- --adapter=meridian-homes-fixtures
 */
const ADAPTERS = {
  [meridianHomesAdapter.key]: meridianHomesAdapter,
  [tollBrothersAdapter.key]: tollBrothersAdapter,
  [lennarAdapter.key]: lennarAdapter,
  [drHortonAdapter.key]: drHortonAdapter,
  [kbHomeAdapter.key]: kbHomeAdapter,
  [pulteAdapter.key]: pulteAdapter,
  [triPointeAdapter.key]: triPointeAdapter,
  [taylorMorrisonAdapter.key]: taylorMorrisonAdapter,
  [discoveryAdapter.key]: discoveryAdapter,
  [davidWeekleyAdapter.key]: davidWeekleyAdapter,
  [ashtonWoodsAdapter.key]: ashtonWoodsAdapter,
};

async function main() {
  const arg = process.argv.find((a) => a.startsWith("--adapter="));
  const key = arg?.split("=")[1] ?? meridianHomesAdapter.key;
  const adapter = ADAPTERS[key];
  if (!adapter) {
    console.error(`Unknown adapter "${key}". Known: ${Object.keys(ADAPTERS).join(", ")}`);
    process.exit(1);
  }
  console.log(`Running pipeline for ${key} (extractor v${adapter.version})…`);
  try {
    const summary = await runPipeline(adapter);
    console.log(JSON.stringify(summary, null, 2));
  } catch (err) {
    // Record the failure so the failure streak advances toward auto-pause.
    const message = err instanceof Error ? err.message : String(err);
    await recordSourceRun(key, { ok: false, kind: "pipeline", message }).catch(() => {});
    throw err;
  }
}

main()
  .catch((error) => {
    console.error(error);
    process.exitCode = 1;
  })
  .finally(() => prisma.$disconnect());