Keep AI-generated code separate from human code.
Versioned. Reviewable. Reproducible.
AI-generated code is everywhere, but it's a mess:
- ChatGPT snippets copy-pasted inline
- Copilot suggestions scattered across files
- No way to track what's AI vs human
- Impossible to audit or review
VAAC fixes this. All AI-generated code lives in one place: the .ai/ directory.
your-project/
├── src/
│ └── utils.ts ← You write the prompt here
└── .ai/
└── slugify-01.ts ← AI generates code here
1. Annotate your function:
import { Ai } from '@gace/vaac';
@Ai({
id: 'slugify-01',
prompt: 'Convert text to URL-friendly slug. Lowercase, replace spaces with dashes, remove special characters.'
})
export function slugify(text: string): string {}2. Run your build:
npm run build3. VAAC generates .ai/slugify-01.ts:
export function slugify(text: string): string {
return text
.toLowerCase()
.trim()
.replace(/[^\w\s-]/g, '')
.replace(/\s+/g, '-');
}4. At build time, your function body is replaced with the generated code.
Your source stays clean. AI code stays separate.
npm install @gace/vaacAdd to your vite.config.ts:
import { defineConfig } from 'vite';
import { vaac } from '@gace/vaac/vite';
import 'dotenv/config';
export default defineConfig({
plugins: [
vaac({
model: 'openai/gpt-4-turbo',
verbose: true, // Optional: enable debug logging
// apiKey: '...', // Optional: auto-detects from env vars
}),
],
});Create a .env file with your API key:
# OpenRouter (recommended - access to multiple models)
OPENROUTER_API_KEY=sk-or-...
# Or use OpenAI directly
# OPENAI_API_KEY=sk-...
As AI-generated code becomes ubiquitous, mixing it with human-written code creates chaos - hard to track, hard to audit, hard to manage.
VAAC isolates AI code. Every generated function lives in
.ai/, committed to Git, reviewed like any other code. Your human code stays clean.
| Feature | Description |
|---|---|
| Separation | AI code in .ai/, human code everywhere else |
| Versioned | Generated files are committed to Git |
| Reproducible | Same commit = same build output |
| CI-safe | Build fails if .ai/ files are missing - no surprise AI calls |
| Zero runtime | Generated code is compiled in, no runtime dependency |
| Editable | Don't like the AI output? Edit .ai/ files directly |
| Action | How |
|---|---|
| Generate code | Run npm run build - missing .ai/ files are created |
| Review AI code | Open .ai/[id].ts - it's just TypeScript |
| Edit AI code | Modify .ai/[id].ts directly - your changes persist |
| Regenerate | Delete .ai/[id].ts and rebuild |
| Commit | Add both source and .ai/ files to Git |
vaac({
// AI model (default: gpt-4-turbo)
model: 'openai/gpt-4-turbo',
// Output directory (default: .ai)
outputDir: '.ai',
// Enable debug logging (default: false)
verbose: true,
// API key - auto-detects from env vars
// Priority: OPENROUTER_API_KEY > OPENAI_API_KEY
// Or pass explicitly:
// apiKey: process.env.OPENROUTER_API_KEY,
// CI mode: error if files missing instead of generating
ciMode: process.env.CI === 'true',
})MIT
Built with the belief that AI and human code shouldn't mix.