chore: scaffold monorepo and migrate uhd_web design system (W0-A)

- pnpm workspace: apps/{web,server}, packages/{contracts,db,domain,adapters,tasks,agent,testkit}
- server: Hono + zod-openapi, API Key auth with scopes, redacting pino logger, SSE event bus with replay, worker heartbeat
- db: Kysely + pg, file migrator, 0001_init (settings/api_key/audit_event/outbox_event)
- web: React Router 7 SPA console shell with 12 workspace placeholders, uhd_web tokens/ui/guard scripts
- docs: ADR-001 (Node over Deno), dev runbook, design system rules

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
umtandClaude Fable 5.1 committed 2026-09-27 17:36:26 +08:00
commit b22c440139
138 files changed
+14455

No files matched your search

+30
View File
@@ -0,0 +1,30 @@
import { EventType } from "@umt/contracts";
import type { Logger } from "pino";
import type { EventBus } from "../http/sse";
export interface WorkerDeps {
logger: Logger;
heartbeatMs: number;
/** role=all 时与 API 共享同一总线,心跳可在 SSE 中看到 */
bus?: EventBus;
}
/** worker 占位:只打印心跳。持久任务引擎在 W1(packages/tasks)接入 */
export function startWorker({ logger, heartbeatMs, bus }: WorkerDeps) {
const log = logger.child({ component: "worker" });
let n = 0;
const beat = () => {
n += 1;
log.debug({ n }, "worker heartbeat");
bus?.publish(EventType.heartbeat, { role: "worker", n });
};
log.info({ heartbeatMs }, "worker started");
beat();
const timer = setInterval(beat, heartbeatMs);
return {
async stop() {
clearInterval(timer);
log.info("worker stopped");
},
};
}