diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 48269846..1409e41a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -308,15 +308,20 @@ jobs: # `--skip-verify` bypasses the initial verification gate. release.sh # also requires a clean working tree, so any in-place lockfile churn # from `pnpm install --frozen-lockfile` must be reverted first — unless - # the policy job uploaded a regenerated lockfile (manifest-only PRs), - # in which case we keep the artifact-restored copy so the workspace - # build sees a lockfile that matches the manifest. + # the policy job uploaded a regenerated lockfile (manifest-changing + # PRs), in which case we stage the artifact-restored copy into an + # ephemeral local commit so release.sh sees a clean tree and its + # workspace build sees a lockfile that matches the manifest. - name: Release canary dry run via release.sh internal build env: USED_ARTIFACT_LOCKFILE: ${{ needs.policy.outputs.lockfile_regenerated || '0' }} run: | git checkout -B master HEAD - if [ "$USED_ARTIFACT_LOCKFILE" != "1" ]; then + if [ "$USED_ARTIFACT_LOCKFILE" = "1" ]; then + git add pnpm-lock.yaml + git -c user.email=ci@paperclip.local -c user.name=CI \ + commit --no-verify -m "ci(canary): stage regenerated lockfile" + else git checkout -- pnpm-lock.yaml fi ./scripts/release.sh canary --skip-verify --dry-run diff --git a/cli/src/__tests__/skills.test.ts b/cli/src/__tests__/skills.test.ts index d77f8ee5..038b9812 100644 --- a/cli/src/__tests__/skills.test.ts +++ b/cli/src/__tests__/skills.test.ts @@ -248,7 +248,7 @@ describe("skills CLI commands", () => { "http://paperclip.test/api/skills/catalog?kind=bundled&category=software-development&q=github", expect.objectContaining({ method: "GET" }), ); - const rendered = logSpy.mock.calls.map((call) => String(call[0])).join("\n"); + const rendered = logSpy.mock.calls.map((call: unknown[]) => String(call[0])).join("\n"); expect(rendered).toContain("id"); expect(rendered).toContain("paperclipai:bundled:software-development:github-pr-workflow"); expect(rendered).toContain("roles"); diff --git a/cli/src/__tests__/teams.test.ts b/cli/src/__tests__/teams.test.ts index 379f8d9b..d1182a98 100644 --- a/cli/src/__tests__/teams.test.ts +++ b/cli/src/__tests__/teams.test.ts @@ -114,7 +114,7 @@ describe("teams CLI commands", () => { "http://paperclip.test/api/teams/catalog?kind=bundled&category=software-development&q=engineering", expect.objectContaining({ method: "GET" }), ); - const rendered = logSpy.mock.calls.map((call) => String(call[0])).join("\n"); + const rendered = logSpy.mock.calls.map((call: unknown[]) => String(call[0])).join("\n"); expect(rendered).toContain("id"); expect(rendered).toContain("paperclipai:bundled:software-development:product-engineering"); }); @@ -188,7 +188,7 @@ describe("teams CLI commands", () => { "http://paperclip.test/api/companies/company-1/teams/catalog/installed", expect.objectContaining({ method: "GET" }), ); - const rendered = logSpy.mock.calls.map((call) => String(call[0])).join("\n"); + const rendered = logSpy.mock.calls.map((call: unknown[]) => String(call[0])).join("\n"); expect(rendered).toContain("installedStatus"); expect(rendered).toContain("out_of_date"); expect(rendered).toContain("not_installed"); diff --git a/package.json b/package.json index d4c7614f..af587171 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "cross-env": "^10.1.0", "esbuild": "^0.28.0", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" }, "engines": { "node": ">=20" diff --git a/packages/db/package.json b/packages/db/package.json index a5615937..dfd2f1af 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -54,6 +54,6 @@ "drizzle-kit": "^0.31.9", "tsx": "^4.19.2", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" } } diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index 6edba34d..c744919a 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -50,6 +50,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/examples/plugin-authoring-smoke-example/package.json b/packages/plugins/examples/plugin-authoring-smoke-example/package.json index 847d9e00..2d99d084 100644 --- a/packages/plugins/examples/plugin-authoring-smoke-example/package.json +++ b/packages/plugins/examples/plugin-authoring-smoke-example/package.json @@ -37,7 +37,7 @@ "rollup": "^4.61.1", "tslib": "^2.8.1", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" }, "peerDependencies": { "react": ">=18" diff --git a/packages/plugins/examples/plugin-orchestration-smoke-example/package.json b/packages/plugins/examples/plugin-orchestration-smoke-example/package.json index d8d18721..428bd081 100644 --- a/packages/plugins/examples/plugin-orchestration-smoke-example/package.json +++ b/packages/plugins/examples/plugin-orchestration-smoke-example/package.json @@ -38,7 +38,7 @@ "rollup": "^4.61.1", "tslib": "^2.8.1", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" }, "peerDependencies": { "react": ">=18" diff --git a/packages/plugins/paperclip-plugin-fake-sandbox/package.json b/packages/plugins/paperclip-plugin-fake-sandbox/package.json index 5797a7c1..8d363004 100644 --- a/packages/plugins/paperclip-plugin-fake-sandbox/package.json +++ b/packages/plugins/paperclip-plugin-fake-sandbox/package.json @@ -24,6 +24,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/plugin-llm-wiki/package.json b/packages/plugins/plugin-llm-wiki/package.json index 5cc07a75..95e23203 100644 --- a/packages/plugins/plugin-llm-wiki/package.json +++ b/packages/plugins/plugin-llm-wiki/package.json @@ -47,7 +47,7 @@ "rollup": "^4.61.1", "tslib": "^2.8.1", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" }, "peerDependencies": { "react": ">=18" diff --git a/packages/plugins/plugin-workspace-diff/package.json b/packages/plugins/plugin-workspace-diff/package.json index d302aabe..eec44700 100644 --- a/packages/plugins/plugin-workspace-diff/package.json +++ b/packages/plugins/plugin-workspace-diff/package.json @@ -63,7 +63,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "typescript": "^5.7.3", - "vitest": "^3.0.5" + "vitest": "^4.1.8" }, "peerDependencies": { "react": ">=18", diff --git a/packages/plugins/sandbox-providers/cloudflare/bridge-template/package.json b/packages/plugins/sandbox-providers/cloudflare/bridge-template/package.json index 7817cb71..ca3d38e6 100644 --- a/packages/plugins/sandbox-providers/cloudflare/bridge-template/package.json +++ b/packages/plugins/sandbox-providers/cloudflare/bridge-template/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@cloudflare/workers-types": "^4.20260501.0", "typescript": "^5.7.3", - "vitest": "^3.2.4", + "vitest": "^4.1.8", "wrangler": "^4.15.0" } } diff --git a/packages/plugins/sandbox-providers/cloudflare/package.json b/packages/plugins/sandbox-providers/cloudflare/package.json index bc56ce22..ecb37288 100644 --- a/packages/plugins/sandbox-providers/cloudflare/package.json +++ b/packages/plugins/sandbox-providers/cloudflare/package.json @@ -54,6 +54,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/sandbox-providers/daytona/package.json b/packages/plugins/sandbox-providers/daytona/package.json index d5039f58..cae60c2c 100644 --- a/packages/plugins/sandbox-providers/daytona/package.json +++ b/packages/plugins/sandbox-providers/daytona/package.json @@ -56,6 +56,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/sandbox-providers/e2b/package.json b/packages/plugins/sandbox-providers/e2b/package.json index 434cac0b..864c0a0b 100644 --- a/packages/plugins/sandbox-providers/e2b/package.json +++ b/packages/plugins/sandbox-providers/e2b/package.json @@ -56,6 +56,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/sandbox-providers/exe-dev/package.json b/packages/plugins/sandbox-providers/exe-dev/package.json index 33ae49bf..94d7f5ff 100644 --- a/packages/plugins/sandbox-providers/exe-dev/package.json +++ b/packages/plugins/sandbox-providers/exe-dev/package.json @@ -53,6 +53,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/plugins/sandbox-providers/modal/package.json b/packages/plugins/sandbox-providers/modal/package.json index e3d62639..86ce73ae 100644 --- a/packages/plugins/sandbox-providers/modal/package.json +++ b/packages/plugins/sandbox-providers/modal/package.json @@ -56,6 +56,6 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.7.3", - "vitest": "^3.2.4" + "vitest": "^4.1.8" } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 5e01b9e4..335e5b24 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -48,6 +48,7 @@ "zod": "^3.24.2" }, "devDependencies": { + "@types/node": "^24.6.0", "typescript": "^5.7.3" } } diff --git a/packages/skills-catalog/package.json b/packages/skills-catalog/package.json index 134c6beb..640e14a4 100644 --- a/packages/skills-catalog/package.json +++ b/packages/skills-catalog/package.json @@ -45,5 +45,8 @@ "test": "pnpm -w exec vitest run --root packages/skills-catalog --config vitest.config.ts", "typecheck": "tsc -p tsconfig.json --noEmit", "validate": "node ../../cli/node_modules/tsx/dist/cli.mjs scripts/validate-catalog.ts" + }, + "devDependencies": { + "@types/node": "^24.6.0" } } diff --git a/packages/teams-catalog/package.json b/packages/teams-catalog/package.json index 9ae11c34..002a090e 100644 --- a/packages/teams-catalog/package.json +++ b/packages/teams-catalog/package.json @@ -45,5 +45,8 @@ "test": "pnpm -w exec vitest run --root packages/teams-catalog --config vitest.config.ts", "typecheck": "tsc -p tsconfig.json --noEmit", "validate": "node ../../cli/node_modules/tsx/dist/cli.mjs scripts/validate-catalog.ts" + }, + "devDependencies": { + "@types/node": "^24.6.0" } } diff --git a/scripts/run-vitest-stable.mjs b/scripts/run-vitest-stable.mjs index 5f78baf0..117f5995 100644 --- a/scripts/run-vitest-stable.mjs +++ b/scripts/run-vitest-stable.mjs @@ -60,7 +60,6 @@ const generalGroupNames = [generalServerGroupName, generalWorkspacesAGroupName, const serializedServerVitestArgs = [ "--no-file-parallelism", "--maxWorkers=1", - "--minWorkers=1", ]; function walk(dir) { @@ -322,7 +321,7 @@ function runSerializedSuites(routeTests, shardIndex, shardCount) { "@paperclipai/server", routeTest.repoPath, "--pool=forks", - "--poolOptions.forks.isolate=true", + "--isolate", ], routeTest.repoPath, ); diff --git a/server/package.json b/server/package.json index ae78553f..4d77772c 100644 --- a/server/package.json +++ b/server/package.json @@ -93,6 +93,6 @@ "tsx": "^4.19.2", "typescript": "^5.7.3", "vite": "^6.1.0", - "vitest": "^3.0.5" + "vitest": "^4.1.8" } } diff --git a/server/vitest.config.ts b/server/vitest.config.ts index 4047b723..d07d5a3a 100644 --- a/server/vitest.config.ts +++ b/server/vitest.config.ts @@ -8,13 +8,6 @@ export default defineConfig({ maxWorkers: 1, minWorkers: 1, pool: "forks", - poolOptions: { - forks: { - isolate: true, - maxForks: 1, - minForks: 1, - }, - }, sequence: { concurrent: false, hooks: "list", diff --git a/ui/package.json b/ui/package.json index 337d1f77..36fa6c4c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -79,6 +79,6 @@ "typescript": "^5.7.3", "storybook": "10.3.5", "vite": "^6.1.0", - "vitest": "^3.0.5" + "vitest": "^4.1.8" } } diff --git a/ui/src/components/CommentThread.test.tsx b/ui/src/components/CommentThread.test.tsx index b1f3d741..ed791baa 100644 --- a/ui/src/components/CommentThread.test.tsx +++ b/ui/src/components/CommentThread.test.tsx @@ -61,16 +61,16 @@ vi.mock("@/plugins/slots", () => ({ describe("CommentThread", () => { let container: HTMLDivElement; - let writeTextMock: ReturnType; - let execCommandMock: ReturnType; + let writeTextMock: ReturnType Promise>>; + let execCommandMock: ReturnType>; beforeEach(() => { container = document.createElement("div"); document.body.appendChild(container); vi.useFakeTimers(); vi.setSystemTime(new Date("2026-03-11T12:00:00.000Z")); - writeTextMock = vi.fn(async () => {}); - execCommandMock = vi.fn(() => true); + writeTextMock = vi.fn<(text: string) => Promise>(async () => {}); + execCommandMock = vi.fn(() => true); Object.assign(navigator, { clipboard: { writeText: writeTextMock, diff --git a/ui/src/components/MarkdownEditor.test.tsx b/ui/src/components/MarkdownEditor.test.tsx index e5cc6468..5213097b 100644 --- a/ui/src/components/MarkdownEditor.test.tsx +++ b/ui/src/components/MarkdownEditor.test.tsx @@ -685,7 +685,7 @@ describe("MarkdownEditor", () => { } async function openMentionMenuFor( - handleChange: ReturnType, + handleChange: ReturnType void>>, mentions = [ { id: "project:project-123", diff --git a/ui/src/pages/IssueDetail.test.tsx b/ui/src/pages/IssueDetail.test.tsx index fb92ea33..362d1254 100644 --- a/ui/src/pages/IssueDetail.test.tsx +++ b/ui/src/pages/IssueDetail.test.tsx @@ -954,7 +954,7 @@ describe("IssueDetail", () => { expect(container.textContent).toContain("Issue detail smoke"); expect(container.textContent).toContain("Chat thread"); expect( - consoleErrorSpy.mock.calls.some((call) => + consoleErrorSpy.mock.calls.some((call: unknown[]) => String(call[0]).includes("React has detected a change in the order of Hooks"), ), ).toBe(false);