$ gh repo fork pingdotgg/t3code --clone
✓ Cloned t3code into ./t3code
-
$ cd t3code && bun install
+
$ cd t3code && vp install
✓ 1 284 packages installed in 4.2s
-
$ bun dev
+
$ vp run dev
▲ T3 Code dev server → http://localhost:4001
$
diff --git a/apps/marketing/vercel.ts b/apps/marketing/vercel.ts
new file mode 100644
index 00000000000..c7344e9ff78
--- /dev/null
+++ b/apps/marketing/vercel.ts
@@ -0,0 +1,7 @@
+import type { VercelConfig } from "@vercel/config/v1";
+
+export const config: VercelConfig = {
+ installCommand: "npm install -g vite-plus && vp install --filter '@t3tools/marketing'",
+ buildCommand: "vp run --filter @t3tools/marketing build",
+ outputDirectory: "dist",
+};
diff --git a/apps/mobile/README.md b/apps/mobile/README.md
index bf86896f8d4..44639e74ccf 100644
--- a/apps/mobile/README.md
+++ b/apps/mobile/README.md
@@ -21,25 +21,25 @@ Run commands from `apps/mobile`.
Start Metro for the dev client:
```bash
-bun run dev:client
+vp run dev:client
```
Build and run the local iOS dev client:
```bash
-bun run ios:dev
+vp run ios:dev
```
Build and run the local iOS preview app:
```bash
-bun run ios:preview
+vp run ios:preview
```
Force the review diff highlighter engine:
```bash
-EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=javascript bun run ios:dev
+EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=javascript vp run ios:dev
```
`javascript` is the default and recommended setting for the review diff screen. Set `EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=native` only when you explicitly want to test the native Shiki engine.
@@ -47,8 +47,8 @@ EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=javascript bun run ios:dev
Inspect the resolved Expo config for a variant:
```bash
-bun run config:dev
-bun run config:preview
+vp run config:dev
+vp run config:preview
```
Run static checks for mobile native code:
@@ -64,18 +64,18 @@ The native lint task runs SwiftLint for Swift plus ktlint and detekt for Kotlin.
Create a cloud dev-client build:
```bash
-bun run eas:ios:dev
+vp run eas:ios:dev
```
Create a persistent preview build:
```bash
-bun run eas:ios:preview
+vp run eas:ios:preview
```
Android equivalents:
```bash
-bun run eas:android:dev
-bun run eas:android:preview
+vp run eas:android:dev
+vp run eas:android:preview
```
diff --git a/apps/mobile/package.json b/apps/mobile/package.json
index 728f5bbc22a..d2dec20e521 100644
--- a/apps/mobile/package.json
+++ b/apps/mobile/package.json
@@ -31,7 +31,7 @@
"config:preview": "APP_VARIANT=preview expo config",
"config:prod": "APP_VARIANT=production expo config",
"profile:android:hermes": "mkdir -p profiles/review && react-native profile-hermes profiles/review",
- "test": "vitest run",
+ "test": "vp test run",
"typecheck": "tsc --noEmit"
},
"dependencies": {
diff --git a/apps/mobile/src/features/connection/pairing.test.ts b/apps/mobile/src/features/connection/pairing.test.ts
index e0af038b46e..028c46c1ce5 100644
--- a/apps/mobile/src/features/connection/pairing.test.ts
+++ b/apps/mobile/src/features/connection/pairing.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { extractPairingUrlFromQrPayload, parsePairingUrl } from "./pairing";
diff --git a/apps/mobile/src/features/diffs/nativeReviewDiffSurface.test.ts b/apps/mobile/src/features/diffs/nativeReviewDiffSurface.test.ts
index 3898ac7350c..65e7539340d 100644
--- a/apps/mobile/src/features/diffs/nativeReviewDiffSurface.test.ts
+++ b/apps/mobile/src/features/diffs/nativeReviewDiffSurface.test.ts
@@ -1,4 +1,4 @@
-import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
const expoMocks = vi.hoisted(() => ({
requireNativeView: vi.fn(),
diff --git a/apps/mobile/src/features/review/reviewCommentSelection.test.ts b/apps/mobile/src/features/review/reviewCommentSelection.test.ts
index a9bcde48baa..25e5f9ce482 100644
--- a/apps/mobile/src/features/review/reviewCommentSelection.test.ts
+++ b/apps/mobile/src/features/review/reviewCommentSelection.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
countReviewCommentContexts,
diff --git a/apps/mobile/src/features/review/reviewFileVisibility.test.ts b/apps/mobile/src/features/review/reviewFileVisibility.test.ts
index 4e7cb1c2002..4a7a2f98af6 100644
--- a/apps/mobile/src/features/review/reviewFileVisibility.test.ts
+++ b/apps/mobile/src/features/review/reviewFileVisibility.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
getDefaultReviewExpandedFileIds,
diff --git a/apps/mobile/src/features/review/reviewHighlighterEngine.test.ts b/apps/mobile/src/features/review/reviewHighlighterEngine.test.ts
index 5449fc6bf42..e3e1ab0eead 100644
--- a/apps/mobile/src/features/review/reviewHighlighterEngine.test.ts
+++ b/apps/mobile/src/features/review/reviewHighlighterEngine.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
resolveReviewHighlighterEngine,
diff --git a/apps/mobile/src/features/review/reviewHighlighterState.test.ts b/apps/mobile/src/features/review/reviewHighlighterState.test.ts
index 90c71350fd0..43ec2e04182 100644
--- a/apps/mobile/src/features/review/reviewHighlighterState.test.ts
+++ b/apps/mobile/src/features/review/reviewHighlighterState.test.ts
@@ -1,4 +1,4 @@
-import { assert, beforeEach, it } from "vitest";
+import { assert, beforeEach, it } from "vite-plus/test";
import { AtomRegistry } from "effect/unstable/reactivity";
import {
diff --git a/apps/mobile/src/features/review/reviewModel.test.ts b/apps/mobile/src/features/review/reviewModel.test.ts
index 4592657316d..3390afd9ff2 100644
--- a/apps/mobile/src/features/review/reviewModel.test.ts
+++ b/apps/mobile/src/features/review/reviewModel.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
MessageId,
diff --git a/apps/mobile/src/features/review/reviewModel.ts b/apps/mobile/src/features/review/reviewModel.ts
index 2fda1b9bd0f..9459d41872d 100644
--- a/apps/mobile/src/features/review/reviewModel.ts
+++ b/apps/mobile/src/features/review/reviewModel.ts
@@ -1,5 +1,5 @@
-import type { ChangeTypes, FileDiffMetadata } from "@pierre/diffs/types";
import { parsePatchFiles } from "@pierre/diffs/utils/parsePatchFiles";
+import type { ChangeTypes, FileDiffMetadata } from "@pierre/diffs/types";
import type { OrchestrationCheckpointSummary, ReviewDiffPreviewSource } from "@t3tools/contracts";
import * as Arr from "effect/Array";
import { pipe } from "effect/Function";
diff --git a/apps/mobile/src/features/review/reviewState.test.ts b/apps/mobile/src/features/review/reviewState.test.ts
index fe3aaab515d..8e99636d417 100644
--- a/apps/mobile/src/features/review/reviewState.test.ts
+++ b/apps/mobile/src/features/review/reviewState.test.ts
@@ -1,4 +1,4 @@
-import { assert, it } from "vitest";
+import { assert, it } from "vite-plus/test";
import {
getReviewAsyncStateSnapshot,
diff --git a/apps/mobile/src/features/review/reviewWordDiffs.test.ts b/apps/mobile/src/features/review/reviewWordDiffs.test.ts
index 1ef081fc403..63ef51236a0 100644
--- a/apps/mobile/src/features/review/reviewWordDiffs.test.ts
+++ b/apps/mobile/src/features/review/reviewWordDiffs.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { applyDiffRangesToTokens, computeWordAltDiffRanges } from "./reviewWordDiffs";
diff --git a/apps/mobile/src/features/review/shikiReviewHighlighter.test.ts b/apps/mobile/src/features/review/shikiReviewHighlighter.test.ts
index 402d00668db..fedf6e10b96 100644
--- a/apps/mobile/src/features/review/shikiReviewHighlighter.test.ts
+++ b/apps/mobile/src/features/review/shikiReviewHighlighter.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import type { ReviewRenderableFile } from "./reviewModel";
import { highlightReviewFile } from "./shikiReviewHighlighter";
diff --git a/apps/mobile/src/features/review/useNativeReviewDiffBridge.test.ts b/apps/mobile/src/features/review/useNativeReviewDiffBridge.test.ts
index 479e34cc8f1..cb28a30d92e 100644
--- a/apps/mobile/src/features/review/useNativeReviewDiffBridge.test.ts
+++ b/apps/mobile/src/features/review/useNativeReviewDiffBridge.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { buildNativeReviewTokensResetKey, hashReviewDiffKey } from "./useNativeReviewDiffBridge";
diff --git a/apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.test.ts b/apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.test.ts
index 482ff6cdbce..0a819df28d2 100644
--- a/apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.test.ts
+++ b/apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { resolveTerminalRouteBootstrap } from "./terminalRouteBootstrap";
diff --git a/apps/mobile/src/features/terminal/nativeTerminalModule.test.ts b/apps/mobile/src/features/terminal/nativeTerminalModule.test.ts
index 0869c436075..c7418a52533 100644
--- a/apps/mobile/src/features/terminal/nativeTerminalModule.test.ts
+++ b/apps/mobile/src/features/terminal/nativeTerminalModule.test.ts
@@ -1,4 +1,4 @@
-import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
const expoMocks = vi.hoisted(() => ({
requireNativeView: vi.fn(),
diff --git a/apps/mobile/src/features/terminal/terminalBufferReplay.test.ts b/apps/mobile/src/features/terminal/terminalBufferReplay.test.ts
index b4b3a033fc1..88323719af0 100644
--- a/apps/mobile/src/features/terminal/terminalBufferReplay.test.ts
+++ b/apps/mobile/src/features/terminal/terminalBufferReplay.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { getTerminalBufferReplayKey, getTerminalSurfaceReplayBuffer } from "./terminalBufferReplay";
diff --git a/apps/mobile/src/features/terminal/terminalLaunchContext.test.ts b/apps/mobile/src/features/terminal/terminalLaunchContext.test.ts
index 8324aeb1cf9..cbd446a88d1 100644
--- a/apps/mobile/src/features/terminal/terminalLaunchContext.test.ts
+++ b/apps/mobile/src/features/terminal/terminalLaunchContext.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { EnvironmentId, ThreadId } from "@t3tools/contracts";
import {
diff --git a/apps/mobile/src/features/terminal/terminalMenu.test.ts b/apps/mobile/src/features/terminal/terminalMenu.test.ts
index f5def9542d9..048ce2ac409 100644
--- a/apps/mobile/src/features/terminal/terminalMenu.test.ts
+++ b/apps/mobile/src/features/terminal/terminalMenu.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import type { KnownTerminalSession } from "@t3tools/client-runtime";
import { DEFAULT_TERMINAL_ID, EnvironmentId, ThreadId } from "@t3tools/contracts";
diff --git a/apps/mobile/src/features/terminal/terminalPreferences.test.ts b/apps/mobile/src/features/terminal/terminalPreferences.test.ts
index 06bfdfbf3c1..d72603f3467 100644
--- a/apps/mobile/src/features/terminal/terminalPreferences.test.ts
+++ b/apps/mobile/src/features/terminal/terminalPreferences.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
DEFAULT_TERMINAL_FONT_SIZE,
diff --git a/apps/mobile/src/features/terminal/terminalTheme.test.ts b/apps/mobile/src/features/terminal/terminalTheme.test.ts
index 5c5dba9cb7c..3bf37b2eaab 100644
--- a/apps/mobile/src/features/terminal/terminalTheme.test.ts
+++ b/apps/mobile/src/features/terminal/terminalTheme.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { buildGhosttyThemeConfig, getPierreTerminalTheme } from "./terminalTheme";
diff --git a/apps/mobile/src/features/terminal/terminalUiState.test.ts b/apps/mobile/src/features/terminal/terminalUiState.test.ts
index f1016a84cab..0bb3c139591 100644
--- a/apps/mobile/src/features/terminal/terminalUiState.test.ts
+++ b/apps/mobile/src/features/terminal/terminalUiState.test.ts
@@ -1,4 +1,4 @@
-import { beforeEach, describe, expect, it } from "vitest";
+import { beforeEach, describe, expect, it } from "vite-plus/test";
import { EnvironmentId, ThreadId } from "@t3tools/contracts";
import {
diff --git a/apps/mobile/src/lib/commandMetadata.test.ts b/apps/mobile/src/lib/commandMetadata.test.ts
index 1744d84bd02..d1ba1d86eba 100644
--- a/apps/mobile/src/lib/commandMetadata.test.ts
+++ b/apps/mobile/src/lib/commandMetadata.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it, vi } from "vitest";
+import { describe, expect, it, vi } from "vite-plus/test";
import { makeQueuedMessageMetadata, makeTurnCommandMetadata } from "./commandMetadata";
diff --git a/apps/mobile/src/lib/connection.test.ts b/apps/mobile/src/lib/connection.test.ts
index e55d20bd190..ddd3a40eab3 100644
--- a/apps/mobile/src/lib/connection.test.ts
+++ b/apps/mobile/src/lib/connection.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it, vi } from "vitest";
+import { describe, expect, it, vi } from "vite-plus/test";
import { mobileAuthClientMetadata, redactPairingCredential } from "./connection";
diff --git a/apps/mobile/src/lib/repositoryGroups.test.ts b/apps/mobile/src/lib/repositoryGroups.test.ts
index ddc9a5e8ac3..191afe03c18 100644
--- a/apps/mobile/src/lib/repositoryGroups.test.ts
+++ b/apps/mobile/src/lib/repositoryGroups.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import { EnvironmentId, ProjectId, ProviderInstanceId, ThreadId } from "@t3tools/contracts";
diff --git a/apps/mobile/src/lib/threadActivity.test.ts b/apps/mobile/src/lib/threadActivity.test.ts
index 70f6736e85c..94354df744e 100644
--- a/apps/mobile/src/lib/threadActivity.test.ts
+++ b/apps/mobile/src/lib/threadActivity.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it } from "vitest";
+import { describe, expect, it } from "vite-plus/test";
import {
EventId,
diff --git a/apps/server/package.json b/apps/server/package.json
index fac1b924c2b..2440caf9363 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -16,11 +16,10 @@
"type": "module",
"scripts": {
"dev": "node --watch src/bin.ts",
- "build": "node scripts/cli.ts build",
- "build:bundle": "tsdown",
+ "build:bundle": "vp pack",
"start": "node dist/bin.mjs",
"typecheck": "tsgo --noEmit",
- "test": "vitest run"
+ "test": "vp test run"
},
"dependencies": {
"@anthropic-ai/claude-agent-sdk": "^0.3.154",
@@ -43,7 +42,7 @@
"@types/node": "catalog:",
"effect-acp": "workspace:*",
"effect-codex-app-server": "workspace:*",
- "tsdown": "catalog:",
+ "vite-plus": "catalog:",
"vitest": "catalog:"
},
"engines": {
diff --git a/apps/server/scripts/acp-mock-agent.ts b/apps/server/scripts/acp-mock-agent.ts
index 0cdd7c1aff3..20b12ef20dc 100644
--- a/apps/server/scripts/acp-mock-agent.ts
+++ b/apps/server/scripts/acp-mock-agent.ts
@@ -1,4 +1,4 @@
-#!/usr/bin/env bun
+#!/usr/bin/env node
// @effect-diagnostics nodeBuiltinImport:off
import { appendFileSync } from "node:fs";
diff --git a/apps/server/scripts/cli.ts b/apps/server/scripts/cli.ts
index c7f40de42d7..ce8e813b881 100644
--- a/apps/server/scripts/cli.ts
+++ b/apps/server/scripts/cli.ts
@@ -17,8 +17,8 @@ import {
} from "../../../scripts/lib/brand-assets.ts";
import { resolveCatalogDependencies } from "../../../scripts/lib/resolve-catalog.ts";
import { fromJsonStringPretty } from "@t3tools/shared/schemaJson";
-import rootPackageJson from "../../../package.json" with { type: "json" };
import serverPackageJson from "../package.json" with { type: "json" };
+import { parse as parseYaml } from "yaml";
interface PackageJson {
name: string;
@@ -39,6 +39,11 @@ interface PackageJson {
const PackageJsonPrettyJson = fromJsonStringPretty(Schema.Unknown);
const encodePackageJson = Schema.encodeEffect(PackageJsonPrettyJson);
+interface WorkspaceConfig {
+ readonly catalog?: Record