Design stack-based systems using @outfitter/* packages...
Design transport-agnostic handler systems with proper Result types and error taxonomy.
Gather information about:
For each domain operation:
Handler<Input, Output, Error1 | Error2>Example:
// Input schema
const CreateUserInputSchema = z.object({
email: z.string().email(),
name: z.string().min(1),
});
// Output type
interface User {
id: string;
email: string;
name: string;
}
// Handler signature
const createUser: Handler<unknown, User, ValidationError | ConflictError>;
Map domain errors to the 10 categories:
| Domain Error | Stack Category | Error Class |
|---|---|---|
| Not found | not_found |
NotFoundError |
| Invalid input | validation |
ValidationError |
| Already exists | conflict |
ConflictError |
| No permission | permission |
PermissionError |
| Auth required | auth |
AuthError |
| Timed out | timeout |
TimeoutError |
| Connection failed | network |
NetworkError |
| Limit exceeded | rate_limit |
RateLimitError |
| Bug/unexpected | internal |
InternalError |
| User cancelled | cancelled |
CancelledError |
Packages are organized into three tiers:
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā TOOLING TIER ā
ā Build-time, dev-time, test-time packages ā
ā @outfitter/testing ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā²
ā depends on
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā RUNTIME TIER ā
ā Application-specific packages for different deployment targets ā
ā @outfitter/cli @outfitter/mcp @outfitter/daemon ā
ā @outfitter/config @outfitter/logging @outfitter/file-ops ā
ā @outfitter/state ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā²
ā depends on
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā FOUNDATION TIER ā
ā Zero-runtime-dependency core packages ā
ā @outfitter/contracts @outfitter/types ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
| Tier | Packages | Dependency Rule |
|---|---|---|
| Foundation | contracts, types |
No @outfitter/* deps |
| Runtime | cli, mcp, daemon, config, logging, file-ops, state |
May depend on Foundation |
| Tooling | testing |
May depend on Foundation + Runtime |
| Package | Purpose | When to Use |
|---|---|---|
@outfitter/contracts |
Result types, errors, Handler contract | Always (foundation) |
@outfitter/types |
Type utilities, collection helpers | Type manipulation |
@outfitter/cli |
CLI commands, output modes, formatting | CLI applications |
@outfitter/mcp |
MCP server, tool registration | AI agent tools |
@outfitter/config |
XDG paths, config loading | Configuration needed |
@outfitter/logging |
Structured logging, redaction | Logging needed |
@outfitter/daemon |
Background services, IPC | Long-running services |
@outfitter/file-ops |
Secure paths, atomic writes, locking | File operations |
@outfitter/state |
Pagination, cursor state | Paginated data |
@outfitter/testing |
Test harnesses, fixtures | Testing |
Selection criteria:
@outfitter/contracts (foundation)@outfitter/cli (includes UI components)@outfitter/mcp@outfitter/config (paths) and @outfitter/file-ops (safety)Determine:
Project: {PROJECT_NAME}
Transport Surfaces: {CLI | MCP | HTTP | ...}
Directory Structure:
āāā src/
ā āāā handlers/ # Transport-agnostic business logic
ā ā āāā {handler-1}.ts
ā ā āāā {handler-2}.ts
ā āāā commands/ # CLI adapter (if CLI)
ā āāā tools/ # MCP adapter (if MCP)
ā āāā index.ts # Entry point
āāā tests/
āāā handlers/ # Handler tests
Dependencies:
āāā @outfitter/contracts # Foundation (always)
āāā @outfitter/{package-2} # {reason}
āāā @outfitter/{package-3} # {reason}
| Handler | Input | Output | Errors | Description |
|---|---|---|---|---|
getUser |
GetUserInput |
User |
NotFoundError |
Fetch user by ID |
createUser |
CreateUserInput |
User |
ValidationError, ConflictError |
Create new user |
deleteUser |
DeleteUserInput |
void |
NotFoundError, PermissionError |
Remove user |
Domain Errors ā Stack Taxonomy:
{domain-error-1} ā {stack-category} ({ErrorClass})
- When: {condition}
- Exit code: {code}
{domain-error-2} ā {stack-category} ({ErrorClass})
- When: {condition}
- Exit code: {code}
Always:
Never:
outfitter-stack:stack-patterns ā Reference for all patternsoutfitter:tdd ā TDD implementation methodologyoutfitter-stack:stack-templates ā Templates for components