Use when creating, auditing, or validating MetaSaver contracts packages. Includes Zod validation schemas, TypeScript types, barrel exports, and database type re-exports. File types: .ts, package.json, tsconfig.json.
Creates and validates MetaSaver contracts packages with Zod schemas, TypeScript types, and wildcard exports. Use when building new domain contracts, adding entities, or auditing package structure for compliance.
/plugin marketplace add metasaver/claude-marketplace/plugin install core-claude-plugin@metasaver-marketplaceThis skill is limited to using the following tools:
TEMPLATES.mdtemplates/eslint.config.js.templatetemplates/package.json.templatetemplates/shared-index.ts.templatetemplates/tsconfig.json.templatetemplates/types.ts.templatetemplates/validation.ts.templateThis skill documents the complete structure for MetaSaver contracts packages. Contracts packages provide:
Use when:
packages/contracts/{domain}-contracts/
├── src/
│ ├── shared/ # (optional) Shared enums/types used by multiple entities
│ │ └── types.ts # Shared types and enums
│ └── {entity}/ # One folder per entity
│ ├── types.ts # TypeScript types and interfaces
│ └── validation.ts # Zod schemas and inferred types
├── eslint.config.js # ESLint flat config (required)
├── package.json
└── tsconfig.json
CRITICAL: Use direct exports (no barrel index.ts files)
from "@metasaver/contracts/users/types"IMPORTANT - Package level file requirements:
.gitignore - do not create at package leveleslint.config.js (flat config) - do not use .eslintrc.cjsSee TEMPLATES.md for all available templates. Key templates:
| Template | Purpose | Location |
|---|---|---|
types.ts.template | Entity type definitions | src/{entity}/types.ts |
validation.ts.template | Zod validation schemas | src/{entity}/validation.ts |
shared-types.ts.template | Shared enums/types | src/shared/types.ts |
package.json.template | Package configuration | package.json |
tsconfig.json.template | TypeScript config | tsconfig.json |
eslint.config.js.template | ESLint flat config | eslint.config.js |
type imports for Prisma types.partial() for optional fieldsz.infer<>exports field in package.json (zero maintenance)from "@metasaver/contracts/users/types""exports": {
"./*": { "types": "./dist/*.d.ts", "import": "./dist/*.js" }
}
| Scenario | Location |
|---|---|
| Enum used by one entity only | Colocate in {entity}/types.ts |
| Enum used by 2+ entities | Place in /shared/types.ts |
All enums should have a corresponding Labels object for UI display.
Export Example:
// src/shared/types.ts
export enum UserRole {
ADMIN = "admin",
USER = "user",
}
export const UserRoleLabels = {
[UserRole.ADMIN]: "Administrator",
[UserRole.USER]: "User",
} as const;
@metasaver/core-typescript-config/baserootDir and outDir in compilerOptionscomposite, declarationMap, sourceMap are inherited)metasaver.projectType: "contracts"test:unit NOT testmkdir -p src/{entity}types.ts.template → src/{entity}/types.ts, replace variablesvalidation.ts.template → src/{entity}/validation.ts, replace variablespackage.json has wildcard exports (already configured):
"exports": {
"./*": { "types": "./dist/*.d.ts", "import": "./dist/*.js" }
}
/shared/ if doesn't existsrc/shared/types.tspackages/contracts/{domain}-contracts/src/types.ts, validation.ts (use direct exports, no index.ts)index.ts barrel files anywhere.gitignore - do not create at package leveleslint.config.js (flat config) - do not use .eslintrc.cjseslint.config.js (flat config)type imports for Prisma types.partial()z.infer<>package.json has exports field with all public pathsindex.ts barrel filestypes.ts file/shared/types.ts file@metasaver/{domain}-contracts patternmetasaver.projectType: "contracts"test:unit NOT test@metasaver/core-typescript-config/baserootDir and outDir in compilerOptionscomposite, declarationMap, sourceMap)| Violation | Fix |
|---|---|
| Duplicating Prisma model fields | Re-export from database package |
Using test instead of test:unit | Change to test:unit |
| Using barrel exports (index.ts) | Remove index.ts, use package.json exports field |
| Missing package.json exports field | Add exports field with all public paths |
| Duplicate tsconfig settings | Remove settings inherited from base |
Package-level .gitignore or .eslintrc.cjs | Use monorepo root config, use eslint.config.js |
Entity-specific enum in /shared/ | Move to entity types.ts file |
| Using default exports | Always use named exports only |
| Importing from barrel index | Always import directly: from "{pkg}/users/types" |