Zeno

AI Setup

AI-first development with Cursor and coding assistants

Zeno embraces AI-assisted development. The codebase is designed to work seamlessly with Cursor and other AI coding tools.

AI assistants work best when they understand your project's conventions. Zeno ships with AGENTS.md, Cursor rules, and auto-formatting hooks so that AI-generated code follows the same standards as hand-written code — no manual cleanup needed.

AGENTS.md

The root AGENTS.md file is automatically picked up by Cursor and other AI assistants. It provides:

  • Project overview and structure
  • Development commands
  • TypeScript and React/Next.js conventions
  • Testing guidelines
  • Package management rules

This file ensures AI-generated code follows the project's conventions out of the box.

Cursor Configuration

The .cursor/ directory contains Cursor-specific configuration:

.cursor/
├── rules/
│   └── ultracite.mdc    # Code quality standards (applied to *.ts, *.tsx, *.js, *.jsx)
└── hooks.json           # Auto-fix after file edits

Rules

The Ultracite rule is scoped to source files and automatically loaded when working with matching files. It covers type safety, modern JS/TS patterns, React best practices, error handling, security, and performance.

Hooks

The .cursor/hooks.json configures an afterFileEdit hook that automatically runs Ultracite formatting after every AI-generated file edit:

.cursor/hooks.json
{
  "hooks": {
    "afterFileEdit": [
      {
        "command": "pnpm dlx ultracite fix"
      }
    ]
  }
}

This ensures AI-generated code is always formatted and linted before you even review it.

AI-Friendly Patterns

Zeno follows patterns that help AI understand and generate better code:

Explicit Types

Use interfaces for props and function signatures so AI understands the contract:

interface UserProps {
  id: string
  name: string
  email: string
}

function UserCard({ id, name, email }: UserProps) {
  // ...
}

Descriptive Names

Use auxiliary verbs and clear naming for self-documenting code:

// Good
const isUserAuthenticated = checkAuth()
const hasAdminPermissions = user.role === "admin"

// Avoid
const auth = checkAuth()
const admin = user.role === "admin"

Co-located Types

Keep types near their usage for better AI context:

interface CreateUserInput {
  name: string
  email: string
}

async function createUser(input: CreateUserInput) {
  // AI has full context
}

LLM Documentation

Zeno docs support LLM-friendly formats via Fumadocs:

  • Any doc page is available as Markdown at /docs/<path>.mdx (e.g. /docs/foundation/getting-started/installation.mdx)

This allows AI assistants to fetch and reference documentation directly.