/** * One-shot markdown backlog import. * * Sibling of `watch-markdown-backlog.ts` but runs ONE sweep and exits. Use * this when you want to bootstrap or refresh the DB from `plans/**` without * leaving a long-running file watcher in place — particularly important * during agent sessions, because the watcher's upsert overwrites * `markdown_backlog_items.status` from frontmatter on every sweep and would * clobber `claim_task` / `complete_task` state. * * Until the DB → markdown export side ships (see follow-up task), the * convention is: * - Edit `.md` files to author / refine intent. * - Run this script when you want the changes in the DB. * - Let agents drive runtime status via MCP tools BETWEEN syncs. * * Env: * - DATABASE_URL (required) * - MARKDOWN_BACKLOG_WORKSPACE_ID — UUID of the target workspace (required) * - MARKDOWN_BACKLOG_REPO_ROOT — absolute path to repo root (default: cwd) */ import { resolve } from "node:path"; import { db } from "../client"; import { syncMarkdownBacklogScan } from "../markdown-backlog/sync"; const workspaceId = process.env.MARKDOWN_BACKLOG_WORKSPACE_ID?.trim(); const repoRootAbs = resolve( process.env.MARKDOWN_BACKLOG_REPO_ROOT?.trim() || process.cwd(), ); if (!workspaceId) { console.error( "[import-markdown-backlog] Set MARKDOWN_BACKLOG_WORKSPACE_ID to your workspace UUID.", ); process.exit(1); } void (async () => { try { const result = await syncMarkdownBacklogScan(db, { workspaceId, repoRootAbs, }); console.log( `[import-markdown-backlog] done — scanned ${result.scannedFiles} files, upserted ${result.upsertedRows} rows, deleted ${result.deletedRows} stale rows. Repo root: ${repoRootAbs}`, ); process.exit(0); } catch (e) { console.error("[import-markdown-backlog] sync failed:", e); process.exit(1); } })();