Commit graph

334 commits

Author SHA1 Message Date
Ajax Davis
e38e627a07 feat(web): add comprehensive /publish page with full publishing guide
- Create new /publish page with step-by-step instructions
- Show all 3 metadata tiers (Minimal, Basic, Rich) with examples
- Include quality score explanation and real-world examples
- Add category reference and tips for success
- Update homepage with Publish navigation link
- Add Publish Your Tool promotional section to homepage

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 22:19:43 +10:00
Ajax Davis
7f5d307c0f fix(api): remove conflicting [id] route causing build error
Next.js error: "You cannot use different slug names for the same dynamic path ('id' !== 'slug')"

Removed /api/tools/[id]/route.ts to resolve conflict with /api/tools/[slug]/route.ts
The [slug] route already handles fetching tools by package name

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 19:59:21 +10:00
Ajax Davis
aff28c4de9 fix(api): add maxDuration to tool detail endpoints
- Add maxDuration = 60 to /api/tools/[slug] route
- Add maxDuration = 60 to /api/tools/[id] route
- Prevents timeout on Prisma cold start for individual tool queries

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 14:34:14 +10:00
Ajax Davis
0d7a8e4696 fix(ci): skip lefthook install when .git directory missing
- Prevents lefthook from failing in CI/Vercel environments
- Only installs git hooks when in actual git repository

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 13:51:05 +10:00
Ajax Davis
23dd6b1a33 docs: add case study on fixing API route timeouts
- Comprehensive debugging journey from timeout to working endpoints
- Details on Turborepo monorepo build order for Vercel
- Prisma cold start optimization strategies
- Progressive debugging approach with code examples
- Performance metrics before/after optimization
- All examples reference tpmjs.com as production domain

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 22:01:31 +10:00
Ajax Davis
a07b705f80 fix(api): optimize /api/tools by removing expensive count query 2025-11-28 21:53:28 +10:00
Ajax Davis
e14e1340cc debug(api): check DATABASE_URL in production 2025-11-28 21:47:02 +10:00
Ajax Davis
d338f46f31 fix(api): simplify /api/tools to test timeout issue 2025-11-28 21:44:33 +10:00
Ajax Davis
a5526222ad fix(vercel): configure Turborepo monorepo build for apps/web
- Change build filter from @tpmjs/web to @tpmjs/web...
- The ... suffix tells pnpm to build all dependencies first
- This fixes 'Module not found' errors for @tpmjs/env, @tpmjs/types, @tpmjs/ui
- Ensures workspace packages are built before web app tries to import them

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 21:15:18 +10:00
Ajax Davis
065196df6b fix(build): simplify Vercel build command
- Remove --webpack flag (incompatible with Turbo)
- Remove functions config (not working as expected)
- Use direct pnpm build command

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:48:51 +10:00
Ajax Davis
8281f8fb5b fix(build): disable Turbopack for Vercel deployment
- Add --webpack flag to build command to use Webpack instead of Turbopack
- Add maxDuration export to health route
- This should ensure API routes are properly detected and deployed as serverless functions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:46:53 +10:00
Ajax Davis
748ca4d19c fix(api): configure Vercel functions for API routes with maxDuration
- Add explicit functions configuration to vercel.json
- Set maxDuration to 60 seconds for all API routes
- This ensures Vercel properly detects and deploys API routes as serverless functions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:43:31 +10:00
Ajax Davis
b93cd42167 fix: remove redirects to resolve redirect loop 2025-11-28 20:36:47 +10:00
Ajax Davis
c42bfb684c fix(redirects): exclude API routes from www redirect
The redirect was being applied to ALL routes including API routes,
causing them to return "Redirecting..." instead of executing.

Use negative lookahead regex `/((?!api).*)` to exclude /api/* paths
from the www → non-www redirect.

This ensures:
- API routes execute normally without redirection
- Page routes still redirect from www.tpmjs.com to tpmjs.com
- Follows Option 2 from the investigation plan

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:28:59 +10:00
Ajax Davis
9be3af7427 fix(routing): move www redirect from vercel.json to Next.js config
Root cause: The redirect rule in /vercel.json was intercepting ALL requests
(including /api/*) before they reached the Next.js app, causing API routes
to timeout without generating any logs.

Changes:
- Move www → non-www redirect to apps/web/next.config.ts async redirects()
- Remove redirects array from root vercel.json
- Keep cron job configuration in root vercel.json

Why this fixes the issue:
- Next.js handles redirects AFTER route resolution (pages vs API routes)
- API routes execute before redirect logic is applied
- Redirects still work for pages as expected
- More idiomatic for Next.js applications

Testing:
- API routes should now respond: /api/health, /api/tools
- www.tpmjs.com should still redirect to tpmjs.com
- All existing functionality preserved

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:25:52 +10:00
Ajax Davis
cc6c8243ed fix(vercel): configure Turborepo monorepo build for apps/web
- Add vercel.json to apps/web with Turborepo build command
- Configure build to use turbo build --filter=@tpmjs/web
- Ensures Vercel properly detects and builds Next.js app in monorepo structure
- Fixes API routes timing out due to incorrect project root detection

This resolves the issue where Vercel wasn't detecting the Next.js app
inside apps/web/, causing API routes to never be built as serverless functions.

Note: You must also set Root Directory to "apps/web" in Vercel dashboard:
Project Settings > General > Root Directory

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 05:58:10 +10:00
Ajax Davis
a92dfff27d fix(build): add workspace packages to Next.js transpilePackages
- Add @tpmjs/db, @tpmjs/types, @tpmjs/env to transpilePackages
- Fixes API routes timing out on Vercel due to untranspiled TypeScript imports
- Ensures all workspace dependencies are properly bundled for serverless functions

Without transpilation, Vercel couldn't properly bundle the @tpmjs/db package,
causing API route handlers to hang when trying to import Prisma client.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 05:53:47 +10:00
Ajax Davis
1a0f75d20b feat(api): add health check endpoint for diagnostics 2025-11-28 05:45:17 +10:00
Ajax Davis
c13ff2287b refactor: convert tool-search page from createElement to JSX 2025-11-28 05:30:55 +10:00
Ajax Davis
e1ac973b2a fix(format): apply Biome formatting to homepage and tool-search page 2025-11-28 05:28:15 +10:00
Ajax Davis
f3af742207 fix(config): redirect www subdomain to apex domain
- Add redirect rule in vercel.json to redirect www.tpmjs.com → tpmjs.com
- Use permanent (301) redirect for SEO benefits
- Preserves all paths and query parameters with /:path* pattern
- Ensures canonical URL is always non-www

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 05:13:55 +10:00
Ajax Davis
354f18a56a perf(web): fix homepage CPU blocking by removing heavy animations
- Replace DitherHeadline (canvas-based) with simple h1 heading
- Replace AnimatedCounter components with static text
- Remove parallax scroll effect
- Remove glitch bar animations
- Removes CPU-intensive canvas dithering that was blocking page interaction

Fixes issue where homepage froze and prevented link clicks until tab closed.
Users can now interact with the page immediately on load.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:56:30 +10:00
Ajax Davis
af1d2044d7 feat(web): add featured tools section and navigation to homepage
- Add "Discover AI Tools" section with CTA buttons to tool search
- Add three feature cards highlighting search, metrics, and AI integration
- Add "Tools" link to header navigation for easy access
- Simplify header nav by removing unused Pro/Teams/Pricing buttons

Features:
- Browse/Search tools CTAs prominently displayed
- Feature cards explain key benefits (Smart Search, Quality Metrics, AI Ready)
- Direct navigation to tool search from homepage
- Responsive grid layout for feature cards

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:49:16 +10:00
Ajax Davis
e1e9a14cef feat(web): add category and tag filtering to tool search page
- Add category dropdown filter with dynamic options from fetched tools
- Add clickable tag badges for filtering by tags (up to 10 most common)
- Implement client-side tag filtering with multi-select support
- Add "Clear Filters" button when filters are active
- Extract unique categories and tags from API responses
- Update UI with visual feedback for selected tags (default vs outline)

Features:
- Category filter integrates with API /api/tools?category param
- Tag filtering happens client-side for instant feedback
- Tags highlight when selected for better UX
- Filters persist across tab changes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:47:42 +10:00
Ajax Davis
b0375057ca feat(web): add comprehensive tool detail pages and API routes
- Add /api/tools/[slug] endpoint to fetch individual tool by package name
- Create dynamic /tool/[slug] detail pages with complete tool information
- Display installation commands, usage examples, parameters, and stats
- Add breadcrumb navigation and links between search and detail pages
- Update tool search page to link to detail pages
- Show AI agent integration info, frameworks, tags, and quality scores

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:45:35 +10:00
Ajax Davis
66dac336b0 fix(ci): allow TypeScript path aliases in dependency-cruiser architecture check
- Add pathNot: ['^~/'] exception to not-to-unresolvable rule
- This allows ~/env and other app-relative path aliases used in Next.js apps
- TypeScript compiler and Next.js resolve these correctly at build time

The ~ path alias is configured in apps/web/tsconfig.json and resolves to
apps/web/src. While dependency-cruiser can't resolve it during static
analysis, the actual build tools handle it correctly.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:24:33 +10:00
Ajax Davis
b682c675eb fix(ci): configure dependency-cruiser to resolve ~ path alias and fix sync route imports
- Add path.resolve for __dirname in ESM context to dependency-cruiser config
- Configure alias in enhancedResolveOptions to map ~ to apps/web/src
- Restore correct ~/env imports in sync routes (was incorrectly @tpmjs/env)

This fixes two issues:
1. dependency-cruiser can now properly resolve the ~ TypeScript path alias
2. Sync routes import from the correct local env file, not the package

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:20:18 +10:00
Ajax Davis
e92f652679 fix(ci): ensure type-check runs after build to generate Prisma client
- Add "build" to type-check dependsOn in turbo.json
- Ensures packages run their own build before type-checking
- Fixes @tpmjs/db type-check failing due to missing Prisma client
- Maintains existing "^build" dependency on workspace dependencies

This ensures Prisma client generation (via db package build script)
completes before TypeScript type-checking runs, preventing CI failures.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:09:07 +10:00
Ajax Davis
d46028412b fix(db): add build script to generate Prisma client for CI
- Add build script that runs 'prisma generate'
- Ensures Prisma client is generated during CI build phase
- Fixes type-check failures caused by missing PrismaClient type

This resolves CI errors:
- error TS2305: Module '"@prisma/client"' has no exported member 'PrismaClient'

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:04:57 +10:00
Ajax Davis
d27e27fd2a feat(frontend): integrate tool search page with /api/tools endpoint
- Replace mock data with real API fetching using useEffect
- Add loading and error states
- Update field names to match API schema (npmPackageName, npmVersion, etc.)
- Display quality score with progress bar
- Show downloads per month instead of generic usage metric
- Add Official badge for official tools
- Support search and filtering via API query parameters

The page now fetches tools from the database through the /api/tools endpoint
and displays real NPM registry data synced by the workers.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 04:00:23 +10:00
Ajax Davis
f86d40faca chore: version @tpmjs/createblogpost to 0.2.0
Release @tpmjs/createblogpost v0.2.0 with initial features:
- Creates structured blog posts with frontmatter and metadata
- Supports both Markdown and MDX output formats
- Automatic slug generation, word count, and reading time calculation
- Rich TPMJS metadata for NPM registry discovery

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 03:17:50 +10:00
Ajax Davis
b58df449da feat(tools): create @tpmjs/createblogpost test tool package
Add test tool package to verify sync system can discover and process tools:

Package Features:
- Creates structured blog posts with frontmatter and metadata
- Supports both Markdown and MDX output formats
- Automatic slug generation from title
- Word count and reading time calculation
- SEO-friendly metadata generation

TPMJS Integration:
- Rich-tier tpmjs field with all optional metadata
- Tagged with 'tpmjs-tool' keyword for NPM discovery
- Complete parameter and return type documentation
- AI agent guidance for optimal LLM usage
- Pricing, authentication, and framework metadata

Implementation:
- Full TypeScript implementation with exported types
- Proper tsconfig and tsup build configuration
- Comprehensive README with usage examples
- Changeset for publishing workflow
- Added packages/tools/* to pnpm workspace

This package serves as an end-to-end test of the sync workers to verify:
1. NPM keyword search discovers the package
2. Changes feed picks up updates
3. tpmjs field validation works correctly
4. Rich-tier metadata is properly extracted
5. Quality score calculation functions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 03:10:31 +10:00
Ajax Davis
3b95502577 feat(sync): implement Phase 3 Sync Workers with Vercel Cron integration
Add complete sync worker system for NPM package discovery and metrics:

**Sync Workers:**
- Changes Feed Sync (/api/sync/changes) - Polls NPM changes every 2 min
- Keyword Search Sync (/api/sync/keyword) - Searches tpmjs-tool keyword every 15 min
- Metrics Sync (/api/sync/metrics) - Updates downloads & quality scores hourly

**Features:**
- Secure CRON_SECRET authentication for all sync endpoints
- Comprehensive error handling with sync logs and checkpoints
- Smart package validation and filtering (skip invalid tpmjs fields)
- Automatic tool upsert with discovery method tracking
- Quality score calculation based on tier, downloads, and GitHub stars
- 5-minute timeout support for long-running sync operations

**Dependencies:**
- Add @tpmjs/npm-client to web app for NPM API integration
- Use barrel exports from npm-client package (no subpath imports)
- Add CRON_SECRET env variable validation
- Add ~/src path alias to tsconfig

**Infrastructure:**
- Configure Vercel Cron jobs in vercel.json for automated syncing
- Add publishedAt field to PackageVersion schema
- Fix Prisma JSON field handling (use undefined instead of null)
- Proper null checks for fetchLatestPackageVersion return values

**Type Safety:**
- Cast TpmjsField union type to access optional rich-tier properties
- Handle searchByKeyword array return type correctly
- Fix fetchDownloadStats to return number directly

All API routes follow Next.js 16 conventions with proper type checking.
Type-check and full build successful.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:57:54 +10:00
Ajax Davis
7ebb4f88fa feat(api): implement Phase 2 Core API Routes for tool registry
Add 4 REST API endpoints for the TPMJS tool registry:

**GET /api/tools**
- Search and list tools with filtering, sorting, pagination
- Query params: q (search), category, official, limit, offset
- Returns tools with pagination metadata
- Sorts by quality score and download count

**GET /api/tools/[id]**
- Get tool details by ID (cuid) or package name
- Supports both lookup methods with OR query
- Returns full tool metadata

**POST /api/tools/validate**
- Validate tpmjs field schema
- Determines tier (minimal vs rich)
- Returns validation errors with detailed messages
- Uses @tpmjs/types validateTpmjsField function

**GET /api/stats**
- Aggregate statistics about the registry
- Total tools, official tools, category breakdown
- Recent tools (last 7 days), total downloads
- Efficient parallel queries with Promise.all

All endpoints include proper error handling, TypeScript types,
and follow Next.js 16 App Router conventions.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:35:25 +10:00
Ajax Davis
fa962d3527 feat(claude): add database slash commands for common operations
Add 5 new slash commands for database management:

- /db-check - Check database connection and show table row counts
- /db-migrate - Create and apply Prisma migrations (production)
- /db-push - Push schema changes without migrations (development)
- /db-studio - Open Prisma Studio visual database browser
- /db-seed - Run seed script to initialize database

These commands make it easy to test database connectivity, run migrations,
view data in Prisma Studio, and seed the database with initial data.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:24:28 +10:00
Ajax Davis
9c91df95ec docs(claude): add comprehensive development workflow documentation
Add detailed section covering:
- Testing individual packages with --filter flag
- Testing all packages via Turborepo
- Building packages (individual and all)
- Database commands for Prisma (generate, push, migrate, studio, seed)
- Development server commands
- Pre-commit hooks (Lefthook) explanation
- Turborepo caching behavior and invalidation
- Common workflows (after pulling, creating packages, testing)
- Troubleshooting guide for common issues

This documents how to test, build, and develop in this monorepo,
including all CLI commands used during development.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:21:38 +10:00
Ajax Davis
1b3b47f8b2 feat(npm-client): create NPM registry API client package
- Implement changes feed client for real-time package discovery
- Implement keyword search with auto-pagination support
- Implement package metadata fetcher with tpmjs field extraction
- Implement download statistics client for quality scoring
- Implement rate limiter with configurable concurrency and delays
- Implement retry logic with exponential backoff for 429 errors

All API responses validated with Zod schemas for type safety.
Rate limiter defaults: max 10 concurrent, 100ms minimum delay.
Handles scoped packages (@scope/name) correctly.
Graceful 404 handling returns null instead of throwing.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:19:59 +10:00
Ajax Davis
1a86036ace feat(types): add comprehensive TPMJS field schemas with validation
- Add @tpmjs/types/tpmjs module with minimal and rich tier schemas
- Define 12 valid tool categories (web-scraping, api-integration, etc.)
- Add schemas for parameters, returns, authentication, pricing, links
- Implement validateTpmjsField() with automatic tier detection
- Add type guards (isTpmjsMinimal, isTpmjsRich)
- Support optional rich fields: frameworks, aiAgent, status, tags

Validation features:
- Minimal tier: category, description (20-500 chars), example (10+ chars)
- Rich tier: adds parameters, returns, auth, pricing, frameworks, etc.
- Auto-detects tier based on presence of rich fields
- Comprehensive error messages with Zod

Export configuration:
- Added ./tpmjs export to package.json
- Updated tsup.config.ts entry points
- Built and type-checked successfully

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:12:11 +10:00
Ajax Davis
3ae9ced6fa feat(db): create database package with Prisma schema for NPM registry
- Add @tpmjs/db package with Prisma ORM setup
- Define Tool model with NPM metadata and TPMJS fields
- Define SyncCheckpoint model for tracking sync worker progress
- Define SyncLog model for audit trail of sync operations
- Add Prisma client singleton with dev logging
- Add seed script for initializing sync checkpoints
- Include comprehensive README with setup instructions

Package includes:
- Complete Prisma schema matching NPM_MIRROR.md spec
- Three models: Tool, SyncCheckpoint, SyncLog
- Indexes for performance on key fields
- TypeScript support via @tpmjs/tsconfig
- Scripts for db:migrate, db:push, db:studio, db:seed

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:07:39 +10:00
Ajax Davis
d8918d2df1 docs: update implementation checklist to use Neon instead of Supabase
- Replace all Supabase references with Neon Postgres
- Update database platform from "Supabase Postgres (managed)" to "Neon Postgres (serverless)"
- Update project creation URLs and instructions
- Update environment variable descriptions
- Update pre-launch checklist backup references

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 02:00:51 +10:00
Ajax Davis
b6eee12bd8 feat: simplify homepage to only show hero section
- Remove ProblemSection, VisionSection, EcosystemStats, and DeveloperStories
- Keep only Header, HeroSection, and Footer
- Cleaner, more focused landing page experience

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 23:25:55 +10:00
Ajax Davis
d19b1e2925 fix(ui): replace Tailwind classes with direct SVG attributes in FlowDiagram
- Convert all SVG fill/stroke from Tailwind classes to direct attributes
- Use hsl(var(--css-custom-property)) for theme compatibility
- Add explicit fontSize, fontFamily, fontWeight instead of text-* classes
- Fixes text visibility issue where labels appeared as black rectangles

Resolves rendering bug where SVG text elements weren't displaying properly
due to improper CSS class application on SVG elements.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 23:14:41 +10:00
Ajax Davis
0c0fcee7ae fix: format linear-gradient to single line for Biome
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 23:05:56 +10:00
Ajax Davis
5e92ae49a3 feat: implement revolutionary dithered landing page with Bayer matrix animation
Core Dithering System:
- Add Bayer matrix 8×8/4×4 ordered dithering algorithm
- Implement DitherEngine with canvas-based text rendering
- Create reveal (one-shot) and pulse (continuous) animation modes
- Add SSR safety checks for Next.js server-side rendering

New UI Components:
- DitherCanvas: Base component with RAF-based animation
- DitherHeadline: Multi-line staggered reveal for hero text
- DitherSectionHeader: Pulsing section headers
- FlowDiagram: Animated SVG showing agent→registry→tools flow
- ActivityStream: Live ticker with mock tool activity

Accessibility Features:
- useReducedMotion hook for prefers-reduced-motion support
- Screen reader compatibility with aria-labels
- Fallback to static rendering when animations disabled

Homepage Redesign:
- Replace generic sections with narrative storytelling
- Add ProblemSection: Fragmented chaos design (before tpmjs)
- Add VisionSection: Dynamic ecosystem visualization (after tpmjs)
- Redesign EcosystemStats with dithered counters and live activity
- Add DeveloperStories: Code-first testimonials
- Update HeroSection with dithered headline and blueprint scanline

Visual Design:
- Minimalist + Blueprint technical aesthetic
- Animated scanline background effect
- Grid patterns with subtle opacity
- Brutalist typography and hard edges

Technical Implementation:
- Export new components in UI package.json
- Add components to tsup.config.ts entry points
- SSR-safe canvas operations with environment checks
- Performance optimizations: frame caching, mobile detection

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 22:44:32 +10:00
Ajax Davis
a6dfde3383 fix(ui): correct button text visibility in HeroSection search button
Replace text-background with text-foreground to ensure button text is visible against the bright accent background color in both light and dark themes.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 19:34:14 +10:00
Ajax Davis
21802ba9bf fix(ui): resolve visual defects in brutalist homepage design
**Number Formatting Fixes:**
- Add missing separator="," to INVOCATIONS counter in HeroSection
- Implement adaptive number display (12M+ on mobile, 12,000,000+ on desktop)
- Increase metrics strip text size from text-sm to text-base for better readability

**Search UI Improvements:**
- Increase input right padding (pr-36 md:pr-40) to prevent text overlap
- Make search button taller and more responsive (h-12 md:h-16)
- Add shadow-lg to search button for better visual separation
- Improve button sizing consistency across breakpoints

**Typography Enhancements:**
- Enhance header "TPMJS" title with larger font (text-xl md:text-2xl)
- Add font-bold, uppercase, and tracking-tight for brutalist aesthetic
- Improve visual hierarchy and prominence

**Visual Consistency:**
- All counters now display with proper thousand separators
- Responsive design ensures optimal display across mobile, tablet, desktop
- Maintains brutalist design principles with improved clarity

Fixes visual defects identified in screenshot analysis

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 16:23:17 +10:00
Ajax Davis
aabee6baf4 style: apply Biome formatting to HeroSection
Fix multiline text formatting for long span content

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 15:41:15 +10:00
Ajax Davis
70f87a60b2 fix: replace hardcoded dark mode colors with theme-aware semantic tokens in tool-search page
- Replace bg-black with bg-background
- Replace text-zinc-100 with text-foreground
- Replace text-zinc-400 with text-foreground-secondary
- Replace text-zinc-500 with text-foreground-tertiary
- Ensures page respects light/dark theme toggle

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 15:37:46 +10:00
Ajax Davis
036b04b0bd fix(ui): resolve Radio hydration error by deferring context validation
- Remove SSR check from useRadioGroup hook that caused hydration mismatch
- Always return default values when context is null (SSR + hydration)
- Add useEffect in Radio component to validate context after hydration
- Dev-only warning instead of runtime error during hydration

Fixes "Radio must be used within a RadioGroup" error on playground page
during React hydration. The issue was that during hydration, the context
wasn't available yet even though components were properly wrapped.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 09:15:02 +10:00
Ajax Davis
288a828d1a fix(ui): correct SSR check logic in useRadioGroup hook
- Fixed SSR detection: only return defaults when `window === undefined` (SSR)
- Previous version had inverted logic that threw errors in browser
- Maintains runtime validation in browser while allowing SSR builds
- Fixes Next.js build failures and browser errors on playground page

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 04:44:07 +10:00