From 7f780f06421f42e6c795512d791925f83d245f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=A9=98?= Date: Thu, 23 Apr 2026 09:08:24 +0000 Subject: [PATCH] =?UTF-8?q?chore:=20walkthrough=20cleanup=20=E2=80=94=20en?= =?UTF-8?q?gines,=20types,=20mock=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add engines >= 22.5.0 to root and cli package.json (node:sqlite requirement) - Remove unused @types/better-sqlite3 from cli devDeps (leftover from sql.js migration) - Add files/publishConfig to core package.json (parity with other packages) - Fix daemon test type errors: add getAllWorkflowRuns to mock LogStore, fix array destructuring on mock.calls, fix sense-runtime callback signatures All 356 tests pass across all packages. 小橘 🍊(NEKO Team) --- package.json | 3 +++ packages/cli/package.json | 4 +++- packages/core/package.json | 4 ++++ .../src/__tests__/crash-recovery.test.ts | 19 +++++++++-------- .../daemon/src/__tests__/hot-reload.test.ts | 21 ++++++++++--------- .../kernel-workflow-integration.test.ts | 17 ++++++++------- .../src/__tests__/sense-runtime.test.ts | 4 ++-- .../src/__tests__/workflow-manager.test.ts | 1 + pnpm-lock.yaml | 3 --- 9 files changed, 43 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 640761f..b51c833 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "nerve", "private": true, + "engines": { + "node": ">=22.5.0" + }, "scripts": { "build": "pnpm -r run build", "check": "biome check .", diff --git a/packages/cli/package.json b/packages/cli/package.json index 4b0c67e..5f89021 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,5 +1,8 @@ { "name": "@uncaged/nerve-cli", + "engines": { + "node": ">=22.5.0" + }, "version": "0.1.8", "type": "module", "bin": { @@ -23,7 +26,6 @@ "citty": "^0.1.6" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.13", "@types/node": "^22.0.0", "@uncaged/nerve-daemon": "workspace:*", "vitest": "^4.1.5" diff --git a/packages/core/package.json b/packages/core/package.json index d398648..e50a1bd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,6 +3,10 @@ "version": "0.1.4", "type": "module", "main": "dist/index.js", + "files": ["dist"], + "publishConfig": { + "access": "public" + }, "types": "dist/index.d.ts", "scripts": { "prepublishOnly": "bash ../../scripts/prepublish-check.sh", diff --git a/packages/daemon/src/__tests__/crash-recovery.test.ts b/packages/daemon/src/__tests__/crash-recovery.test.ts index faf4a23..b4eea4c 100644 --- a/packages/daemon/src/__tests__/crash-recovery.test.ts +++ b/packages/daemon/src/__tests__/crash-recovery.test.ts @@ -89,10 +89,11 @@ function makeLogStore( } return activeRuns; }), - getTriggerPayload: vi.fn(() => ({ value: 42 })), - getThreadEvents: vi.fn(() => [{ type: "thread_start", triggerPayload: {} }]), + getTriggerPayload: vi.fn((): unknown => ({ value: 42 })), + getThreadEvents: vi.fn((): Array<{ type: string; [key: string]: unknown }> => [{ type: "thread_start", triggerPayload: {} }]), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; return store; } @@ -127,7 +128,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { child.emit("exit", 1, null); const crashedCalls = logStore.upsertWorkflowRun.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "crashed", + (args: any[]) => (args[0] as { type: string }).type === "crashed", ); expect(crashedCalls).toHaveLength(2); @@ -216,10 +217,10 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { // resume-thread should have been sent const resumeCalls = (secondChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "resume-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "resume-thread", ); expect(resumeCalls).toHaveLength(1); expect(resumeCalls[0][0]).toMatchObject({ @@ -286,7 +287,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { }); const appendCalls = logStore.append.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "thread_command_event", + (args: any[]) => (args[0] as { type: string }).type === "thread_command_event", ); expect(appendCalls).toHaveLength(1); expect(appendCalls[0][0]).toMatchObject({ @@ -313,7 +314,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { mgr.startWorkflow("my-wf", payload); const startedCall = logStore.upsertWorkflowRun.mock.calls.find( - ([entry]: [{ type: string }]) => entry.type === "started", + (args: any[]) => (args[0] as { type: string }).type === "started", ); expect(startedCall).toBeDefined(); const logEntry = startedCall?.[0] as { payload: string | null }; diff --git a/packages/daemon/src/__tests__/hot-reload.test.ts b/packages/daemon/src/__tests__/hot-reload.test.ts index 12318d6..0d56a24 100644 --- a/packages/daemon/src/__tests__/hot-reload.test.ts +++ b/packages/daemon/src/__tests__/hot-reload.test.ts @@ -79,6 +79,7 @@ function makeLogStore() { getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; } @@ -126,7 +127,7 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { await drainPromise; const interruptedCalls = logStore.upsertWorkflowRun.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "interrupted", + (args: any[]) => (args[0] as { type: string }).type === "interrupted", ); expect(interruptedCalls).toHaveLength(2); @@ -190,10 +191,10 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { const newChild = mockChildren[1]; const resumeCalls = (newChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "resume-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "resume-thread", ); expect(resumeCalls).toHaveLength(0); @@ -218,10 +219,10 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { const newChild = mockChildren[1]; const startCalls = (newChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ); expect(startCalls).toHaveLength(1); @@ -266,7 +267,7 @@ describe("Kernel — workflow hot reload via file-watcher (Phase 3)", () => { // Kernel's handleWorkflowFileChange should log a workflow_reload event // We test this via the kernel itself const appendCalls = logStore.append.mock.calls; - const startCall = appendCalls.find(([e]: [{ type: string }]) => e.type === "start"); + const startCall = appendCalls.find((args: any[]) => (args[0] as { type: string }).type === "start"); expect(startCall).toBeDefined(); const stopPromise = kernel.stop(); diff --git a/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts b/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts index 7991398..da6c09c 100644 --- a/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts +++ b/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts @@ -78,6 +78,7 @@ function makeLogStore() { appendWithWorkflowUpdate: vi.fn(), getWorkflowRun: vi.fn(() => null), getActiveWorkflowRuns: vi.fn(() => []), + getAllWorkflowRuns: vi.fn(() => []), getTriggerPayload: vi.fn(() => null), getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), @@ -137,10 +138,10 @@ describe("kernel + workflowManager integration", () => { // We need to check that a start-thread message was sent to the workflow worker const workflowWorker = mockChildren.find((c) => (c.send as ReturnType).mock.calls.some( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: unknown[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ), ); expect(workflowWorker).toBeDefined(); @@ -212,10 +213,10 @@ describe("kernel + workflowManager integration", () => { // No workflow worker should have been spawned (only the sense group worker) const workflowWorkerSpawned = mockChildren.some((c) => (c.send as ReturnType).mock.calls.some( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: unknown[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ), ); expect(workflowWorkerSpawned).toBe(false); diff --git a/packages/daemon/src/__tests__/sense-runtime.test.ts b/packages/daemon/src/__tests__/sense-runtime.test.ts index a162a1e..7f30135 100644 --- a/packages/daemon/src/__tests__/sense-runtime.test.ts +++ b/packages/daemon/src/__tests__/sense-runtime.test.ts @@ -10,7 +10,7 @@ import { describe, expect, it } from "vitest"; import { createBlobStore } from "../blob-store.js"; import { parseParentMessage } from "../ipc.js"; import { executeCompute, openPeerDb, openSenseDb, runMigrations } from "../sense-runtime.js"; -import type { DrizzleDB, PeerMap, SenseRuntime } from "../sense-runtime.js"; +import type { ComputeFn, DrizzleDB, PeerMap, SenseRuntime } from "../sense-runtime.js"; // --------------------------------------------------------------------------- // Helpers @@ -168,7 +168,7 @@ describe("openPeerDb", () => { // --------------------------------------------------------------------------- describe("executeCompute", () => { - function makeRuntime(computeFn: (db: DrizzleDB, peers: PeerMap) => Promise): { + function makeRuntime(computeFn: ComputeFn): { runtime: SenseRuntime; sqlite: Database.Database; } { diff --git a/packages/daemon/src/__tests__/workflow-manager.test.ts b/packages/daemon/src/__tests__/workflow-manager.test.ts index c0cd2e3..8fb3a50 100644 --- a/packages/daemon/src/__tests__/workflow-manager.test.ts +++ b/packages/daemon/src/__tests__/workflow-manager.test.ts @@ -76,6 +76,7 @@ function makeLogStore() { getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb9c56c..7a41a30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,9 +27,6 @@ importers: specifier: ^0.1.6 version: 0.1.6 devDependencies: - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 '@types/node': specifier: ^22.0.0 version: 22.19.17 -- 2.43.0