Find a file
Ajax Davis 295199d43f fix: use dynamic import for AI SDK to resolve tiktoken WASM build error
Convert static import of executeToolWithAgent to dynamic import inside the
POST handler. This prevents the AI SDK (and its tiktoken dependency) from
being loaded at build time, which was causing WASM loading errors.

**Why this fix works:**
- Next.js 16 + Turbopack tries to analyze routes at build time
- tiktoken requires tiktoken_bg.wasm which can't load during static analysis
- Dynamic imports defer loading until runtime, avoiding build-time WASM issues

**Changes:**
- Remove: `import { executeToolWithAgent } from '@/lib/ai-agent/tool-executor-agent'`
- Add: `const { executeToolWithAgent } = await import('@/lib/ai-agent/tool-executor-agent')`
  inside the stream start() handler

Build now completes successfully. Route is properly marked as dynamic (ƒ).

Resolves: "Error: Missing tiktoken_bg.wasm" during Next.js build

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:50:49 +10:00
.changeset fix(lint): configure Biome to properly ignore build directories 2025-11-26 22:49:45 +10:00
.claude/commands feat(claude): add database slash commands for common operations 2025-11-28 02:24:28 +10:00
.github/workflows fix: add build step to lint job in CI workflow 2025-11-26 18:36:44 +10:00
.vscode feat: add complete monorepo structure and all packages 2025-11-25 21:59:40 +10:00
apps/web fix: use dynamic import for AI SDK to resolve tiktoken WASM build error 2025-11-30 01:50:49 +10:00
packages feat: integrate Railway sandbox microservice for secure package execution 2025-11-30 01:30:47 +10:00
scripts feat: configure Vercel to wait for CI before deploying 2025-11-26 17:42:23 +10:00
services/sandbox-executor feat: add Railway-based sandbox executor microservice 2025-11-30 01:07:24 +10:00
supabase feat(sync): implement Phase 3 Sync Workers with Vercel Cron integration 2025-11-28 02:57:54 +10:00
.dependency-cruiser.js fix(ci): allow TypeScript path aliases in dependency-cruiser architecture check 2025-11-28 04:24:33 +10:00
.gitignore feat(web): add comprehensive tool detail pages and API routes 2025-11-28 04:45:35 +10:00
.npmrc feat: add complete monorepo structure and all packages 2025-11-25 21:59:40 +10:00
.nvmrc feat: add quality gate tools and Node 22 setup 2025-11-26 17:33:45 +10:00
2025-BEST-PRACTICES.md feat: add quality gate tools and Node 22 setup 2025-11-26 17:33:45 +10:00
API_ROUTES_TIMEOUT_INVESTIGATION.md fix(ci): skip lefthook install when .git directory missing 2025-11-29 13:51:05 +10:00
biome.json fix(lint): configure Biome to properly ignore build directories 2025-11-26 22:49:45 +10:00
CLAUDE.md docs: add case study on fixing API route timeouts 2025-11-28 22:01:31 +10:00
convert-label-tests.py refactor(ui): convert all remaining components from createElement to JSX syntax 2025-11-26 03:14:34 +10:00
DEPLOYMENT.md feat: configure Vercel to wait for CI before deploying 2025-11-26 17:42:23 +10:00
HOW_TO_PUBLISH_A_TOOL.md fix(api): remove conflicting [id] route causing build error 2025-11-29 19:59:21 +10:00
IMPLEMENTATION_CHECKLIST.md docs: update implementation checklist to use Neon instead of Supabase 2025-11-28 02:00:51 +10:00
knip.json fix(lint): configure Biome to properly ignore build directories 2025-11-26 22:49:45 +10:00
lefthook.yml feat: add complete monorepo structure and all packages 2025-11-25 21:59:40 +10:00
NPM_MIRROR.md feat(sync): implement Phase 3 Sync Workers with Vercel Cron integration 2025-11-28 02:57:54 +10:00
package.json fix(ci): skip lefthook install when .git directory missing 2025-11-29 13:51:05 +10:00
pnpm-lock.yaml fix: remove VM2 sandboxing to resolve Next.js build errors 2025-11-30 00:57:32 +10:00
pnpm-workspace.yaml feat(tools): create @tpmjs/createblogpost test tool package 2025-11-28 03:10:31 +10:00
QUALITY-GATES.md feat: add quality gate tools and Node 22 setup 2025-11-26 17:33:45 +10:00
README.md feat: configure Vercel to wait for CI before deploying 2025-11-26 17:42:23 +10:00
reset.d.ts fix(lint): configure Biome to properly ignore build directories 2025-11-26 22:49:45 +10:00
test-db.mjs fix(ci): skip lefthook install when .git directory missing 2025-11-29 13:51:05 +10:00
tsconfig.json feat: add complete monorepo structure and all packages 2025-11-25 21:59:40 +10:00
turbo.json fix(ci): ensure type-check runs after build to generate Prisma client 2025-11-28 04:09:07 +10:00
vercel.json fix(routing): move www redirect from vercel.json to Next.js config 2025-11-28 20:25:52 +10:00
VERCEL_FIX_CHECKLIST.md fix(ci): skip lefthook install when .git directory missing 2025-11-29 13:51:05 +10:00

TPMJS Monorepo

CI

Tool Package Manager for AI Agents - A Turborepo monorepo with strict TypeScript, Next.js 16, and best practices.

Structure

apps/
  web/          - Next.js 16 App Router application
packages/
  config/       - Shared configurations (Biome, ESLint, Tailwind, TypeScript)
  ui/           - React component library (.ts-only, no barrels)
  utils/        - Utility functions
  types/        - Shared TypeScript types
  env/          - Zod environment schema loader
  test/         - Vitest shared configuration
  mocks/        - MSW mock server
  storybook/    - Storybook documentation

Getting Started

Prerequisites

  • Node.js >= 22 (LTS)
  • pnpm >= 8
  • nvm (recommended for Node version management)

Installation

pnpm install

Development

# Run all apps in development mode
pnpm dev

# Run specific app
pnpm --filter @tpmjs/web dev
pnpm --filter @tpmjs/storybook dev

Building

# Build all packages and apps
pnpm build

# Build specific package
pnpm --filter @tpmjs/ui build

Testing

# Run all tests
pnpm test

# Run tests in watch mode with UI
pnpm test:ui

Linting & Formatting

# Lint all packages
pnpm lint

# Format all files
pnpm format

# Check formatting
pnpm format:check

Quality Gates

# Check architecture/dependency rules
pnpm check-architecture

# Find unused code and dependencies
pnpm find-deadcode

# Check type coverage
pnpm type-coverage

See QUALITY-GATES.md for details.

Component Usage

Components are imported directly without barrel exports:

import { Button } from '@tpmjs/ui/Button/Button';
import { Card, CardHeader } from '@tpmjs/ui/Card/Card';

Important: All UI components use .ts extension (not .tsx) and use createElement instead of JSX.

Publishing Workflow

1. Create Changesets

After making changes to publishable packages:

pnpm changeset

Follow the prompts to describe your changes and select which packages are affected.

2. Version Packages

When ready to release:

pnpm changeset:version

This updates package versions and generates CHANGELOGs.

3. Publish to npm

pnpm changeset:publish

This builds and publishes all packages with changesets to npm.

4. Push to GitHub

git push --follow-tags

Published Packages

  • @tpmjs/ui - React component library
  • @tpmjs/utils - Utility functions
  • @tpmjs/types - TypeScript types
  • @tpmjs/env - Environment schema loader

Deployment

The project is configured to only deploy to Vercel when all CI checks pass. This ensures production always has high-quality, tested code.

CI Checks:

  • Linting & formatting
  • Type checking
  • Tests
  • Production build
  • Architecture validation
  • Dead code detection

See DEPLOYMENT.md for full configuration details.

Module Boundaries

ESLint enforces module boundaries:

  • Apps can import from published packages only
  • Packages cannot import from apps
  • No barrel exports (index.ts) allowed
  • Direct imports required: @tpmjs/ui/Button/Button

Architecture Decisions

Why .ts-only Components?

Using .ts instead of .tsx for React components:

  • Enforces explicit createElement calls
  • Makes React's runtime nature more visible
  • Prevents JSX spreading anti-patterns
  • Better for code generation and tooling

Why No Barrel Exports?

  • Clearer dependency graphs
  • Better tree-shaking
  • Explicit imports show what's actually used
  • Prevents circular dependencies

Why Biome + ESLint?

  • Biome: Fast formatting and basic linting
  • ESLint: Semantic rules (module boundaries, TypeScript strictness)
  • Each tool focuses on what it does best

Scripts Reference

  • dev - Start development servers
  • build - Build all packages
  • test - Run tests
  • test:ui - Run tests with UI
  • lint - Lint code
  • format - Format code with Biome
  • format:check - Check formatting
  • type-check - TypeScript type checking
  • type-coverage - Check type coverage (no implicit any)
  • check-architecture - Validate dependency rules
  • find-deadcode - Find unused code/dependencies
  • clean - Remove build artifacts
  • changeset - Create a changeset
  • changeset:version - Version packages
  • changeset:publish - Publish to npm

License

MIT