Episodic memory and architectural policy for AI agents. Frames, Atlas, and Policy.
Stop losing context. Start building agents that remember.
Quick Start · Documentation · Examples · API Reference · Contributing
</div>Lex is a TypeScript framework that gives AI agents episodic memory and architectural awareness. It solves the fundamental problem of context loss in long-running development workflows.
You're working with an AI coding assistant on a complex feature. You stop for the day. When you return:
Lex provides three capabilities:
Result: Your AI assistant recalls exactly where you left off, understands your architecture, and respects your constraints.
Capture meaningful moments in your development workflow:
lex remember \
--reference-point "Implementing user authentication" \
--summary "Added JWT validation to API middleware" \
--next "Wire up password reset flow" \
--modules "services/auth,api/middleware" \
--blockers "Need PermissionService access - forbidden edge in policy" \
--jira "AUTH-123"Later, instantly recall:
lex recall "authentication"
# Returns: Your exact context, blockers, next action, and relevant module neighborhoodWhen you recall a Frame, Lex doesn't dump your entire codebase into context. Instead, it provides an Atlas Frame: the modules you touched plus their immediate neighborhood (dependencies, dependents, permissions).
This "fold radius" approach gives AI assistants exactly the architectural context they need—nothing more, nothing less.
Token efficiency: 10-module project → ~500 tokens (not 50,000)
Define architectural boundaries as code:
{
"modules": {
"ui/components": {
"owns": ["src/ui/components/**"],
"mayCall": ["services/auth", "ui/shared"],
"forbidden": [
{
"target": "database/queries",
"reason": "UI must not access database directly. Use API layer."
}
]
}
}
}Enforce in CI:
lex check merged-facts.json
# ✖ Violation: ui/components → database/queries (forbidden edge)
# Reason: UI must not access database directly. Use API layer.Maintain a single source of truth for AI assistant guidance:
# Your canonical instructions live in one place
.smartergpt/instructions/lex.md
# Project them to host-specific files
lex instructions generate
# Creates: .github/copilot-instructions.md, .cursorrulesBenefits:
Learn more about Instructions →
# Install globally (recommended)
npm install -g @smartergpt/lex
# Or locally in your project
npm install @smartergpt/lexRequires Node.js 20+ (tested through Node.js 22, see .nvmrc)
Lex 2.0.0 is AX-native with structured output (--json), recoverable errors (AXError), and Frame Schema v3 for orchestrator integration. All commands provide both human-readable and machine-parseable output.
# Zero-to-value initialization (new in v2.1.0!)
npx @smartergpt/lex init --yes
# Auto-detects project type (Node.js, Python, Rust, Go, etc.)
# Creates:
# .smartergpt/ - Workspace with prompts, policy, and instructions
# .github/copilot-instructions.md - IDE instructions with LEX markers
# .cursorrules - Cursor IDE instructions (if Cursor detected)
# lex.yaml - Configuration with sensible defaults
# .smartergpt/lex/memory.db - SQLite database (initialized on first use)
# Shows MCP server configuration guidance
# Idempotent: safe to run multiple times
# Interactive mode (prompts for first Frame)
lex init --interactive
# Generate seed policy from directory structure
lex init --policy
# Scans src/ for TypeScript/JavaScript modules
# Generates .smartergpt/lex/lexmap.policy.json with discovered modules
# Example: src/memory/store/ → memory/store module with src/memory/store/** match pattern
# Force reinitialize (overwrite existing files)
lex init --forceWhat happens during init:
.github/copilot-instructions.md and .cursorrules (if Cursor detected) with LEX markers for safe updateslex.yaml with defaults based on your project.smartergpt/lex/memory.dblex remember \
--reference-point "Refactoring payment processing" \
--summary "Extracted validation logic to PaymentValidator" \
--next "Add unit tests for edge cases" \
--modules "services/payment"lex recall "payment"
# Shows your context, blockers, and architectural neighborhoodKeep your memory database optimized and backed up:
# Create a timestamped backup (memory-20251123.sqlite)
lex db backup --rotate 7
# Keeps last 7 backups, stored in .smartergpt/lex/backups/
# Optimize database (rebuild and compact)
lex db vacuum
# Set backup retention via environment variable
export LEX_BACKUP_RETENTION=14 # Keep 14 most recent backupsNDJSON Logging: Lex automatically logs operations to .smartergpt/lex/logs/lex.log.ndjson with structured fields:
timestamp, level, message, module, operation, duration_ms, metadata, errorLEX_LOG_NDJSON=1That's it! You now have persistent memory for your AI workflows.
Use Lex with any MCP-compatible AI assistant (VS Code, Claude Desktop, etc.):
# Install the MCP wrapper
npm install -g @smartergpt/lex-mcp
# Or run directly
npx @smartergpt/lex-mcpVS Code Configuration (.vscode/mcp.json):
{
"servers": {
"lex": {
"command": "npx",
"args": ["@smartergpt/lex-mcp"],
"env": {
"LEX_WORKSPACE_ROOT": "${workspaceFolder}"
}
}
}
}Claude Desktop Configuration:
{
"mcpServers": {
"lex": {
"command": "npx",
"args": ["@smartergpt/lex-mcp"]
}
}
}The MCP server exposes 11 tools for episodic memory, policy validation, and architectural analysis:
frame_create, frame_search, frame_get, frame_list, frame_validatepolicy_check, timeline_show, atlas_analyzesystem_introspect, help, hints_getWant to see how Lex is used in practice? Check out our dogfooding examples — real Frames from building Lex with Lex.
See how we:
lex recall to resume work after breakslex remember at key checkpointsLex is built on three pillars:
┌─────────────────────────────────────────────────────────┐
│ Lex Framework │
├─────────────────────────────────────────────────────────┤
│ │
│ 📸 Memory Layer (lex/memory) │
│ ├─ Frame storage (SQLite) │
│ ├─ Search & recall │
│ └─ MCP server integration │
│ │
│ 🗺️ Atlas Layer (lex/shared/atlas) │
│ ├─ Module dependency graphs │
│ ├─ Fold radius computation │
│ └─ Token-aware context generation │
│ │
│ 🛡️ Policy Layer (lex/policy) │
│ ├─ Boundary definitions │
│ ├─ Multi-language scanners │
│ └─ CI enforcement │
│ │
└─────────────────────────────────────────────────────────┘Lex provides multiple entry points for different use cases:
import { saveFrame, searchFrames, getDb, closeDb } from '@smartergpt/lex';
const db = getDb(); // Uses .smartergpt/lex/memory.db
await saveFrame(db, {
referencePoint: 'authentication flow',
summaryCaption: 'Added password validation',
statusSnapshot: { nextAction: 'Wire up permission check' },
moduleScope: ['services/auth', 'services/password'],
branch: 'feature/auth',
jira: 'AUTH-123'
});
const results = await searchFrames(db, { referencePoint: 'authentication' });
closeDb(db);| Import | Purpose | Documentation |
|---|---|---|
@smartergpt/lex | Core API + store operations | API Usage |
@smartergpt/lex/cli | Programmatic CLI access | CLI Output |
@smartergpt/lex/cli-output | CLI JSON utilities | CLI Output |
@smartergpt/lex/store | Direct database operations | Store Contracts |
@smartergpt/lex/types | All shared types | API Usage |
@smartergpt/lex/errors | AXError schema and utilities (v2.0+) | AX Contract |
@smartergpt/lex/policy | Policy loading & validation | API Usage |
@smartergpt/lex/atlas | Atlas Frame generation | Architecture |
@smartergpt/lex/atlas/code-unit | Code unit schemas | Atlas |
@smartergpt/lex/atlas/schemas | Atlas schemas | Atlas |
@smartergpt/lex/aliases | Module alias resolution | Aliases |
@smartergpt/lex/module-ids | Module ID validation | API Usage |
@smartergpt/lex/memory | Frame payload validation | API Usage |
@smartergpt/lex/logger | NDJSON logging | API Usage |
@smartergpt/lex/lexsona | Behavioral memory socket (v2.0+) | Control Stack |
@smartergpt/lex/prompts | Template system | Canon Architecture |
Current Version: 2.2.0 (Changelog)
Lex 2.0.0 is the first stable release with AX (Agent eXperience) as a first-class design principle. This release introduces structured output, recoverable errors, and Frame Schema v3 for AI agent integration.
Ready for:
2.0.0 Highlights:
runId, planHash, toolCalls) for orchestration (Schema Docs)code, message, context, and nextActions[] for programmatic recoverylex remember --json and lex timeline --json with machine-parseable event streamslex instructions CLI for syncing AI instructions across IDEs (Copilot, Cursor, etc.)recordCorrection/getRules) exported via @smartergpt/lex/lexsonaLexSona Integration:
Lex 2.0.0 provides a public behavioral memory socket (@smartergpt/lex/lexsona) for persona-based workflows. LexSona is a separate private package (v0.2.0+) that consumes this socket to enable offline-capable persona modes. The socket API is stable and documented; LexSona implementation details remain private. Lex itself is persona-agnostic — the socket is a stable integration point for any behavioral engine.
See CHANGELOG v2.0.0 for full release notes.
| Metric | Value |
|---|---|
| Test Files | 78 |
| Test Suites | 23 |
| Source Files | 108 |
| Exports | 14 subpaths |
| Schema Version | 2 |
The Challenge: AI coding assistants lose context between sessions. They can't remember what you were working on, why you made certain decisions, or which parts of your codebase are off-limits.
Our Approach: External memory and structured reasoning — the same techniques human experts use to maintain context across complex, long-running projects.
The Components:
Why This Matters:
We welcome contributions! Here's how to get started:
Read the guides:
Pick an issue:
Submit a PR:
LexRunner — Orchestration for parallel PR workflows
LexSona (v0.2.0+) — Behavioral persona engine, separate private package
Consumes Lex behavioral memory socket (@smartergpt/lex/lexsona) to enable offline-capable persona modes with constraint enforcement. High-level concept: persona-driven workflows without embedding persona logic in Lex core. See Control Stack documentation for conceptual framework (public portions).
MIT License — Free for personal and commercial use.
See LICENSE for full text.
Built with ❤️ by the Lex community
⭐ Star on GitHub · 📦 Install from npm · 💬 Join Discussions
</div>Lex uses TypeScript project references for deterministic, incremental builds:
npm run build # Compile with project references
npm run clean # Clean build artifacts
npm run typecheck # Type-check without emittingWhy NodeNext module resolution?
.ts files with .js import extensions.js files work correctly in Node.js ESMRun CI checks locally without touching GitHub:
npm run local-ci # Run full CI suite locally
npm run local-ci:nonet # Run without network accessThis uses ci.Dockerfile for local parity with CI checks.
While TypeScript scanning is built-in, Python and PHP scanners are available as examples:
# Scan Python codebase
python examples/scanners/python/scan.py src/ > python-facts.json
# Scan PHP codebase
php examples/scanners/php/scan.php src/ > php-facts.json
# Merge with TypeScript facts
lex merge ts-facts.json python-facts.json > merged-facts.json
# Check policy
lex check merged-facts.json⚠️ Security Note: External scanners execute arbitrary code. Review before use.
Lex uses a precedence chain for configuration:
LEX_CANON_DIR=/custom/canon (highest).smartergpt/prompts/prompts/ (lowest)# Customize locally
cp prompts/remember.md .smartergpt/prompts/
vim .smartergpt/prompts/remember.md
# Or use custom directory
LEX_CANON_DIR=/my/custom/canon lex remember ...| Variable | Purpose | Default |
|---|---|---|
LEX_LOG_LEVEL | Log verbosity (silent, trace, debug, info, warn, error, fatal) | info (tests: silent) |
LEX_LOG_PRETTY | Pretty-print logs (1 = enabled) | Auto-detect TTY |
LEX_POLICY_PATH | Custom policy file location | .smartergpt/lex/lexmap.policy.json |
LEX_DB_PATH | Database location | .smartergpt/lex/memory.db |
LEX_DB_KEY | Database encryption passphrase (required in production) | None (unencrypted) |
LEX_GIT_MODE | Git integration (off, live) | off |
LEX_DEFAULT_BRANCH | Override default branch detection | Auto-detect from git |
LEX_CANON_DIR | Override canonical resources root | Package defaults |
LEX_PROMPTS_DIR | Override prompts directory | Package defaults |
LEX_SCHEMAS_DIR | Override schemas directory | Package defaults |
LEX_CLI_OUTPUT_MODE | CLI output format (plain or jsonl) | plain |
LEX_BACKUP_RETENTION | Number of database backups to retain | 7 |
SMARTERGPT_PROFILE | Profile configuration path | .smartergpt/profile.yml |
Protect your Frame data with SQLCipher encryption:
# Enable encryption for new databases
export LEX_DB_KEY="your-strong-passphrase-here"
lex remember --reference-point "work" --summary "Encrypted!"
# Migrate existing database
lex db encrypt --verify
# Production mode requires encryption
export NODE_ENV="production"
export LEX_DB_KEY="production-passphrase"Key Features:
NODE_ENV=production).nvmrc)# Clone repository
git clone https://github.com/Guffawaffle/lex.git
cd lex
# Install dependencies
npm ci
# Build
npm run build
# Run tests
npm test
# Local CI (full suite)
npm run local-cilex/
├── src/ # TypeScript source (no .js files)
│ ├── memory/ # Frame storage & MCP server
│ ├── policy/ # Policy enforcement & scanners
│ ├── shared/ # Shared utilities & types
│ └── index.ts # Main entry point
├── dist/ # Build output (gitignored)
├── canon/ # Canonical prompts & schemas
├── docs/ # Documentation
├── examples/ # Usage examples & optional scanners
├── test/ # Test suite
└── .smartergpt/ # Local workspace (gitignored)npm test # Run all tests (excludes git tests)
npm run test:coverage # With coverage report
npm run test:watch # Watch mode
npm run test:git # Git integration tests (requires non-interactive signing)Note: Git tests are quarantined due to mandatory GPG signing in this environment. See test/README.md for details.
npm run lint # ESLint checks
npm run format # Prettier formatting
npm run typecheck # TypeScript validation