home / skills / open-circle / valibot / repo-structure-navigate

repo-structure-navigate skill

/skills/repo-structure-navigate

This skill helps you navigate the Valibot repository structure to quickly locate schemas, actions, methods, tests, and docs.

npx playbooks add skill open-circle/valibot --skill repo-structure-navigate

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
6.8 KB
---
name: repo-structure-navigate
description: Navigate the Valibot repository structure. Use when looking for files, understanding the codebase layout, finding schema/action/method implementations, locating tests, API docs, or guide pages. Covers monorepo layout, library architecture, file naming conventions, and quick lookups.
---

# Valibot Repository Structure

## Monorepo Layout

```
valibot/
├── library/          # Core valibot package (zero dependencies)
├── packages/
│   ├── i18n/         # Translated error messages (25+ languages)
│   └── to-json-schema/  # JSON Schema converter
├── codemod/
│   ├── migrate-to-v0.31.0/  # Version migration
│   └── zod-to-valibot/      # Zod converter
├── website/          # valibot.dev (Qwik + Vite)
├── brand/            # Brand assets
├── skills/           # Agent skills (this folder)
└── prompts/          # Legacy AI agent guides
```

## Core Library (`/library/src/`)

### Directory Structure

| Directory   | Purpose                         | Examples                                      |
| ----------- | ------------------------------- | --------------------------------------------- |
| `schemas/`  | Data type validators            | `string/`, `object/`, `array/`, `union/`      |
| `actions/`  | Validation & transformation     | `email/`, `minLength/`, `trim/`, `transform/` |
| `methods/`  | High-level API                  | `parse/`, `safeParse/`, `pipe/`, `partial/`   |
| `types/`    | TypeScript definitions          | `schema.ts`, `issue.ts`, `dataset.ts`         |
| `utils/`    | Internal helpers (prefixed `_`) | `_addIssue/`, `_stringify/`, `ValiError/`     |
| `storages/` | Global state                    | Config, message storage                       |

### Schema Categories

- **Primitives**: `string`, `number`, `boolean`, `bigint`, `date`, `symbol`, `blob`, `file`
- **Objects**: `object`, `strictObject`, `looseObject`, `objectWithRest`
- **Arrays**: `array`, `tuple`, `strictTuple`, `looseTuple`, `tupleWithRest`
- **Advanced**: `union`, `variant`, `intersect`, `record`, `map`, `set`, `lazy`, `custom`
- **Modifiers**: `optional`, `nullable`, `nullish`, `nonNullable`, `nonNullish`, `nonOptional`

### Action Types

**Validation** (return issues): `email`, `url`, `uuid`, `regex`, `minLength`, `maxValue`, `check`

**Transformation** (modify data): `trim`, `toLowerCase`, `toUpperCase`, `mapItems`, `transform`

**Metadata**: `brand`, `flavor`, `metadata`, `description`, `title`

### File Naming Convention

Each schema/action/method has its own directory:

```
schemas/string/
├── string.ts        # Implementation
├── string.test.ts   # Runtime tests
├── string.test-d.ts # Type tests
└── index.ts         # Re-export
```

### Core Patterns

**Schemas** define data types:

```typescript
export interface StringSchema<TMessage> extends BaseSchema<...> {
  readonly kind: 'schema';
  readonly type: 'string';
  // ...
}
```

**Actions** validate/transform in pipelines:

```typescript
export interface EmailAction<TInput, TMessage> extends BaseValidation<...> {
  readonly kind: 'validation';
  readonly type: 'email';
  // ...
}
```

**Methods** provide API functions:

```typescript
export function parse<TSchema>(
  schema: TSchema,
  input: unknown
): InferOutput<TSchema>;
```

### Key Types

- `BaseSchema`, `BaseValidation`, `BaseTransformation` - Base interfaces
- `InferOutput<T>`, `InferInput<T>`, `InferIssue<T>` - Type inference
- `Config`, `ErrorMessage<T>`, `BaseIssue<T>` - Configuration and errors
- `'~standard'` property - [Standard Schema](https://github.com/standard-schema/standard-schema) compatibility

## Website (`/website/src/routes/`)

### API Documentation

```
routes/api/
├── (schemas)/string/     # Schema docs
│   ├── index.mdx         # MDX content
│   └── properties.ts     # Type definitions
├── (actions)/email/      # Action docs
├── (methods)/parse/      # Method docs
├── (types)/StringSchema/ # Type docs
└── menu.md               # Navigation
```

### Guides

```
routes/guides/
├── (get-started)/       # Intro, installation
├── (main-concepts)/     # Schemas, pipelines, parsing
├── (schemas)/           # Objects, arrays, unions
├── (advanced)/          # Async, i18n, JSON Schema
├── (migration)/         # Version upgrades
└── menu.md              # Navigation
```

## Development

### Playground

Use `library/playground.ts` for quick experimentation.

### Adding a Schema/Action

1. Create directory: `library/src/schemas/yourSchema/`
2. Create files: `yourSchema.ts`, `yourSchema.test.ts`, `yourSchema.test-d.ts`, `index.ts`
3. Follow existing patterns (copy similar implementation)
4. Export from category `index.ts`
5. Run `pnpm -C library test`

### Modifying Core Types

⚠️ Changes to `library/src/types/` affect the entire library. Always run full test suite.

## Quick Lookups

| Looking for...        | Location                                       |
| --------------------- | ---------------------------------------------- |
| Schema implementation | `library/src/schemas/[name]/[name].ts`         |
| Action implementation | `library/src/actions/[name]/[name].ts`         |
| Method implementation | `library/src/methods/[name]/[name].ts`         |
| Type definitions      | `library/src/types/`                           |
| Internal utilities    | `library/src/utils/`                           |
| Error messages (i18n) | `packages/i18n/[lang]/`                        |
| API docs page         | `website/src/routes/api/(category)/[name]/`    |
| Guide page            | `website/src/routes/guides/(category)/[name]/` |
| Tests                 | Same directory as source, `.test.ts` suffix    |
| Type tests            | Same directory as source, `.test-d.ts` suffix  |

## Commands

```bash
# Library
pnpm -C library build      # Build
pnpm -C library test       # Run tests
pnpm -C library lint       # Lint
pnpm -C library format     # Format

# Website
pnpm -C website dev        # Dev server
pnpm -C website build      # Production build

# Root
pnpm install               # Install all
pnpm format                # Format all
```

## Key Principles

1. **Modularity** - Small, focused functions; one per file
2. **Zero dependencies** - Core library has no runtime deps
3. **100% test coverage** - Required for library
4. **Tree-shakable** - Use `// @__NO_SIDE_EFFECTS__` annotation
5. **Type-safe** - Full TypeScript with strict mode
6. **ESM only** - Imports include `.ts` extensions

## Do's and Don'ts

**Do:**

- Follow existing code patterns
- Write runtime and type tests
- Add JSDoc documentation
- Keep functions small and focused
- Check bundle size impact

**Don't:**

- Add external dependencies
- Modify core types without full test run
- Skip tests
- Create large multi-purpose functions
- Modify generated files (`dist/`, `coverage/`)

Overview

This skill navigates the Valibot repository structure and helps you find files, implementations, tests, and docs quickly. It maps the monorepo layout, core library architecture, naming conventions, and where website guides and API pages live. Use it to get immediate pointers so you can jump to the right file or folder.

How this skill works

I inspect the repository layout and return canonical file paths and directory roles (e.g., schemas, actions, methods, types, utils). I explain where to find implementation files, runtime and type tests, i18n message packs, and website routes for API and guide pages. I also surface recommended commands for building, testing, and running the site.

When to use it

  • Looking for the implementation of a specific schema, action, or method
  • Locating runtime or TypeScript type tests for a feature
  • Understanding the monorepo directory roles and package boundaries
  • Finding website API docs or guide MDX pages for a specific topic
  • Quickly getting the right command to build, test, or run the site

Best practices

  • Follow the one-file-per-feature pattern: each schema/action/method has its own folder with implementation, tests, type tests, and index re-export
  • Always add both runtime (.test.ts) and type (.test-d.ts) tests when adding features
  • Do not add runtime dependencies to the core library; keep it zero-deps and ESM-only
  • Run pnpm -C library test after changing core types and the full test suite for type-sensitive changes
  • Keep functions small and document public APIs with JSDoc to preserve tree-shakability and bundle-size constraints

Example use cases

  • Find the string schema implementation: library/src/schemas/string/string.ts and tests in the same folder
  • Locate an action like email: library/src/actions/email/email.ts and its tests
  • Open a method implementation such as parse: library/src/methods/parse/parse.ts
  • Browse API docs for a schema: website/src/routes/api/(schemas)/string/index.mdx and properties.ts
  • Edit or add a new schema: create library/src/schemas/yourSchema/{yourSchema.ts,yourSchema.test.ts,yourSchema.test-d.ts,index.ts} then run pnpm -C library test

FAQ

Where are error message translations stored?

Translations live under packages/i18n/[lang]/ with one folder per language.

How are docs and guides organized in the website?

API docs are under website/src/routes/api/(category)/[name]/ and guides under website/src/routes/guides/(category)/[name]/.