Find a file
Ajax Davis 32499bbc68 feat: add README rendering and enhanced package metadata display
**Database Schema:**
- Add npmReadme, npmKeywords, npmAuthor, npmMaintainers fields to Tool model

**NPM Client:**
- Add fetchLatestPackageWithMetadata() function to fetch README and top-level metadata
- Export new PackageVersionWithReadme type

**Sync Workers:**
- Update keyword and changes sync to fetch and store README content
- Store author, maintainers, and keywords from package.json

**UI Components:**
- Create Markdown component using react-markdown with GitHub Flavored Markdown
- Add rehype-sanitize for security and remark-gfm for tables/strikethrough support

**Tool Detail Page:**
- Convert from createElement to JSX for better maintainability
- Display README in a dedicated card with proper markdown rendering
- Show NPM keywords, author, and maintainers in sidebar
- Add ThemeToggle to header
- Improve layout with better spacing and organization

This brings the tool detail pages much closer to NPM's package pages,
providing users with comprehensive information about each tool including
the full README documentation.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 22:41:50 +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 feat: add README rendering and enhanced package metadata display 2025-11-29 22:41:50 +10:00
packages feat: add README rendering and enhanced package metadata display 2025-11-29 22:41:50 +10:00
scripts feat: configure Vercel to wait for CI before deploying 2025-11-26 17:42:23 +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 feat: add README rendering and enhanced package metadata display 2025-11-29 22:41:50 +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