| name | creating-libraries |
| description | This skill should be used when the user asks to "create a library", "scaffold a new lib", "add a local library", "create a namespace module", "set up _.ts and __.ts", or needs to create a new TypeScript library following the _.ts/__.ts namespace pattern. Handles both simple (single file) and complex (barrel) library structures. |
Creating Libraries
Scaffold new TypeScript libraries following the namespace module conventions.
CRITICAL
Read the Conventions First
Before creating any library, read the appropriate convention documents:
- Core pattern:
~/.claude/docs/conventions/namespace-module.md— The abstract_.ts/__.tspattern - Local libraries (
/src/lib/*):~/.claude/docs/conventions/library-local.md - Package libraries (package IS the library):
~/.claude/docs/conventions/library-package.md
File Naming
_.ts— Namespace module (REQUIRED)__.ts— Barrel module (only if multiple implementation files)_.test.ts— Public API tests_.test.fixture.ts— Shared test fixtures (exportsnamespace Fx)
Operations
Create Simple Library (Single Implementation)
Use when library has one implementation file.
Structure:
src/lib/<name>/
├── _.ts # export * as Name from './<name>.js'
├── <name>.ts # Implementation
└── _.test.ts # Tests
Steps:
- Create directory at
src/lib/<name>/(kebab-case) - Create
<name>.tswith implementation - Create
_.tswith:export * as <PascalName> from './<name>.js' - Create
_.test.tsimporting from./_.js - Add to
package.jsonimports:"#<name>": "./build/lib/<name>/_.js" - Add to
tsconfig.jsonpaths:"#<name>": ["src/lib/<name>/_.ts"]
Create Complex Library (Multiple Files)
Use when library has multiple implementation files.
Structure:
src/lib/<name>/
├── _.ts # export * as Name from './__.js'
├── __.ts # Barrel: exports from all implementation files
├── foo.ts # Implementation
├── bar.ts # Implementation
└── _.test.ts # Tests
Steps:
- Create directory at
src/lib/<name>/(kebab-case) - Create implementation files
- Create
__.tswith re-exports from all implementation files - Create
_.tswith:export * as <PascalName> from './__.js' - Create
_.test.tsimporting from./_.js - Add package.json imports and tsconfig.json paths
Examples
Simple Library Example
// src/lib/mask/mask.ts
export const create = (pattern: string): Mask => ({ pattern })
export const apply = (mask: Mask, value: string): string => value
export interface Mask {
pattern: string
}
// src/lib/mask/_.ts
export * as Mask from './mask.js'
// src/lib/mask/_.test.ts
import { Mask } from './_.js'
test('.create', () => {/* ... */})
Complex Library Example
// src/lib/parser/tokenizer.ts
export const tokenize = (input: string): Token[] => []
// src/lib/parser/lexer.ts
export const lex = (tokens: Token[]): Lexeme[] => []
// src/lib/parser/__.ts
export { lex, type Lexeme } from './lexer.js'
export { type Token, tokenize } from './tokenizer.js'
// src/lib/parser/_.ts
export * as Parser from './__.js'
Reference
Naming Conventions
| Element | Case | Example |
|---|---|---|
| Directory | kebab-case | my-lib/ |
| Files | kebab-case | my-lib.ts |
| Namespace | PascalCase | MyLib |
Package.json Imports Entry
{
"imports": {
"#<name>": "./build/lib/<name>/_.js"
}
}
TSConfig Paths Entry
{
"compilerOptions": {
"paths": {
"#<name>": ["src/lib/<name>/_.ts"]
}
}
}
Notes
- Always use
.jsextension in imports (ESM requirement) - Namespace name = PascalCase of directory name
- Tests import ONLY from
_.ts, never from implementation files - Code modules can import siblings via relative paths
- Cross-library imports use
#<name>subpath imports