# π MEGA PROMPT: Hybrid TypeScript/C++ Package System
**Version**: 1.0
**Last Updated**: January 2026
**For**: AI Assistants working on 3-frontend package bootstrap system
---
## π― PROJECT ESSENCE
This is a **hybrid TypeScript/C++ bootloader system** that powers a modular package architecture. Three frontends (CLI, Qt6, Next.js) act as **entry points** that bootstrap a NestJS-based package system. The system is pragmatic: schemas are improvable, not sacred; patterns come from functional programming; and delightfulness matters.
### The Mental Model
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User Input β
β (CLI / Qt6 GUI / Next.js Web) β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Bootloader β β Frontend-specific logic
β (3x) β - Routes/state management
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Package β β Central coordinator
β System β - Loads packages from /packages/
β (NestJS) β - Manages seed data & schemas
ββββββββββββββββ
β
ββββββββ΄βββββββ
βΌ βΌ
ββββββββββ ββββββββββ
β DBAL β β C++ β
β Layer β β Daemonsβ
β β β(Media) β
ββββββββββ ββββββββββ
β β
ββββββββ¬βββββββ
βΌ
ββββββββββββββββ
β Database β
β(PostgreSQL) β
ββββββββββββββββ
```
**Key Principle**: Seed data lives in `/packages/*/seed/`, not scattered elsewhere. Schemas are single source of truth but improvable.
---
## π PRIORITY READING (In Order)
1. **IMMEDIATE_FIXES.md** β - What's actually broken right now
2. **claude.md** - System overview and patterns
3. **agents.md** - Agent guidelines for this codebase
4. **README.md** - Project structure and setup
5. **ROADMAP.md** (if exists) - Vision and evolution
6. **docs/** - Architecture, testing, deployment guides
7. **schemas/** - Data models (understand but improve if needed)
---
## ποΈ ARCHITECTURE AT A GLANCE
### Three Frontends (Each a Bootloader)
| Frontend | Purpose | Tech Stack | Startup Flow |
|----------|---------|-----------|--------------|
| **CLI** | Command-line interface | TypeScript/Node | Read config β Load packages β Execute |
| **Qt6** | Desktop GUI application | C++/Qt6 | Parse Qt resources β Load packages β Render |
| **Next.js** | Web application | TypeScript/React | HTTP request β Load packages β Render page |
**Critical**: Each frontend is a **bootloader**. It doesn't contain business logicβit loads and orchestrates packages.
### Package System (The Heart)
```
/packages/
βββ [package-name]/
β βββ seed/ β REAL seed data (not /dbal/shared/seeds/)
β β βββ metadata.json β Package manifest
β β βββ page-config/ β Routes/pages
β β βββ workflow/ β Automation workflows
β β βββ credential/ β API credentials
β β βββ component/ β UI components
β β βββ [entity-type]/ β Other entity types
β βββ src/ β Business logic (if TypeScript package)
β βββ package.json
β βββ README.md
```
**Pattern**: Each package is self-contained. Seed data describes what the package does. Business logic implements it.
### DBAL Layer (Database Access)
- **Phase 2** (Current): TypeScript DBAL in `/dbal/development/`
- **Phase 3** (Future): C++ daemon in `/dbal/production/`
- **Shared**: YAML schemas at `/dbal/shared/api/schema/entities/` (source of truth)
**Rule**: Always use `getDBALClient()` from `@/dbal`, never raw Prisma.
### Schemas: Two Layers
| Layer | Location | Purpose | Editable? |
|-------|----------|---------|-----------|
| **Entity Schemas** | `/dbal/shared/api/schema/entities/*.yaml` | Database structure (source of truth) | Yes, improve as needed |
| **Validation Schemas** | `/schemas/seed-data/*.schema.json` | Seed data validation | Yes, extend for new features |
| **Package Schemas** | `/schemas/package-schemas/*.schema.json` | Package system architecture | Yes, treat as blueprint |
**Philosophy**: Schemas are **improvable**. If they lack features, extend them. They're not dogma.
---
## π¨ DESIGN PHILOSOPHY (How to Think)
### 1. Functional Programming First
```typescript
// β
GOOD: Functional, pure, composable
const loadPackage = (path: string) => readJSON(path);
const filterActive = (packages: Package[]) => packages.filter(p => p.active);
const orchestrate = pipe(loadPackages, filterActive, initializeAll);
// β BAD: Imperative, class-heavy, side effects
class PackageManager {
private packages: Package[] = [];
async load(path) { this.packages = await readJSON(path); }
async filter() { this.packages = this.packages.filter(p => p.active); }
}
```
### 2. Make It Delightful
- Code should be obvious. If it requires 20 comments, refactor it.
- Styling matters. Use Tailwind (web), Qt stylesheets (desktop), ANSI colors (CLI).
- Error messages should hint at solutions, not just fail.
- Performance should feel snappy.
### 3. Schemas Are Improvable
```json
// If schema lacks what you need:
// 1. Document the gap
// 2. Extend the schema
// 3. Update examples
// 4. Move on
// Example: Script schema is JSON AST, but n8n-style is simpler for visual GUIs
{
"trigger": "http.post",
"input": { "body": "{ name, email }" },
"steps": [
{ "action": "validate.email", "target": "$input.email" },
{ "action": "db.create", "table": "users", "data": "$input" }
],
"output": { "userId": "$steps[1].id" }
}
// This coexists with JSON AST for complex logic. Both are valid.
```
### 4. No Magic, No Lua
- **No Lua**: JSON is sufficient for visual scripting (n8n, Scratch patterns).
- **No magic imports**: Be explicit. Use dependency injection.
- **No hidden state**: Logs should explain what's happening.
### 5. GUIs Over Raw Input
```typescript
// β RAW: User types CSS directly
// β
GUI: Dropdowns + composition
,
fontSize: ,
layout: ,
}}
/>
```
---
## π PROJECT STRUCTURE
```
.
βββ IMMEDIATE_FIXES.md β Current priorities
βββ claude.md System overview
βββ agents.md Agent guidelines
βββ README.md Project intro
βββ ROADMAP.md Vision & evolution
β
βββ docs/ Architecture & guides
β βββ TESTING_GUIDE.md
β βββ DEPLOYMENT.md
β βββ COMPONENTS.md
β βββ ...
β
βββ schemas/ Data model definitions
β βββ seed-data/ Validation schemas for seed files
β β βββ page-config.schema.json
β β βββ workflow.schema.json
β β βββ component.schema.json
β β βββ ...
β βββ package-schemas/ Package system definitions
β βββ metadata_schema.json
β βββ entities_schema.json
β βββ ...
β
βββ packages/ Modular packages (REAL seed data here)
β βββ package-name/
β β βββ seed/
β β β βββ metadata.json
β β β βββ page-config/
β β β βββ workflow/
β β β βββ ...
β β βββ src/ (if TypeScript package)
β β βββ package.json
β βββ ...
β
βββ dbal/ Database abstraction layer
β βββ development/ TypeScript DBAL (Phase 2, current)
β β βββ src/
β β βββ prisma/
β β βββ package.json
β βββ production/ C++ DBAL (Phase 3, future)
β β βββ include/
β β βββ src/
β β βββ CMakeLists.txt
β βββ shared/
β βββ api/schema/entities/ YAML entity schemas (source of truth)
β βββ seeds/ Bootstrap seeds (minimal)
β βββ docs/
β
βββ frontends/ Entry points (bootloaders)
β βββ cli/ TypeScript CLI
β β βββ src/commands/
β β βββ package.json
β βββ qt6/ C++ Qt6 desktop GUI
β β βββ src/
β β βββ CMakeLists.txt
β βββ nextjs/ TypeScript/React web
β βββ src/app/
β βββ src/components/
β βββ package.json
β
βββ old/ Pre-refactor reference code
β βββ [legacy patterns for understanding changes]
β
βββ [support files]
βββ package.json
βββ tsconfig.json
βββ CMakeLists.txt
βββ ...
```
---
## π§ CORE PATTERNS
### Pattern 1: Functional Package Loading
```typescript
// β
GOOD: Pure, composable, testable
const loadPackageMetadata = (path: string): Promise =>
readJSON(`${path}/seed/metadata.json`);
const loadPackageSeed = (path: string, entityType: string): Promise =>
readJSON(`${path}/seed/${entityType}/data.json`).catch(() => []);
const initializePackages = async (packagePaths: string[]) =>
Promise.all(packagePaths.map(async (path) => ({
metadata: await loadPackageMetadata(path),
pages: await loadPackageSeed(path, 'page-config'),
workflows: await loadPackageSeed(path, 'workflow'),
})));
```
### Pattern 2: Schema-Driven Validation
```typescript
// Validate seed data against schema
const validateSeedData = (data: unknown, schemaPath: string): ValidationResult => {
const schema = loadSchema(schemaPath);
const validator = ajv.compile(schema);
const valid = validator(data);
return {
valid,
errors: validator.errors || [],
};
};
// Usage
const result = validateSeedData(seedData, '/schemas/seed-data/workflow.schema.json');
if (!result.valid) {
console.error('Seed validation failed:', result.errors);
}
```
### Pattern 3: Bootloader Flow (Frontend-Agnostic)
```typescript
// Each frontend implements this flow differently, but structure is same
interface BootloaderFlow {
1_readConfig: () => Promise;
2_loadPackages: (config: Config) => Promise;
3_validatePackages: (packages: Package[]) => Promise;
4_initializeDatabase: (packages: Package[]) => Promise;
5_renderUI: (packages: Package[]) => Promise;
}
// CLI Implementation
async function cliBootloader() {
const config = readConfigFile('./metabuilder.config.json');
const packages = await loadPackagesFromDisk(config.packagesDir);
const validation = await validatePackages(packages);
if (!validation.valid) {
console.error('Validation failed:', validation.errors);
process.exit(1);
}
await initializeDatabase(packages);
await cliRender(packages);
}
// Qt6 Implementation
async function qt6Bootloader() {
const config = readConfigFromResources();
const packages = await loadPackagesFromDisk(config.packagesDir);
const validation = await validatePackages(packages);
if (!validation.valid) {
showErrorDialog(validation.errors);
return;
}
await initializeDatabase(packages);
qt6Render(packages);
}
// Next.js Implementation
export async function pageBootloader() {
const config = loadConfigFromEnv();
const packages = await loadPackagesFromDisk(config.packagesDir);
const validation = await validatePackages(packages);
if (!validation.valid) {
return NextResponse.json({ error: validation.errors }, { status: 400 });
}
await initializeDatabase(packages);
return renderNextPage(packages);
}
```
### Pattern 4: N8N-Style Workflows (Over JSON AST)
```json
// Simple, visual, drop-and-drop friendly
{
"id": "workflow_user_signup",
"name": "User Signup Flow",
"trigger": {
"type": "form.submit",
"formId": "form_signup"
},
"steps": [
{
"id": "validate_email",
"action": "validate.email",
"input": { "email": "$trigger.email" },
"onError": "step_show_error"
},
{
"id": "check_exists",
"action": "db.query",
"query": "SELECT id FROM users WHERE email = $1",
"params": ["$validate_email.input.email"],
"onSuccess": "step_check_result"
},
{
"id": "check_result",
"action": "condition",
"if": "$check_exists.rows.length > 0",
"then": "step_error_exists",
"else": "step_create_user"
},
{
"id": "create_user",
"action": "db.insert",
"table": "users",
"data": {
"email": "$trigger.email",
"name": "$trigger.name",
"createdAt": "now()"
}
},
{
"id": "send_email",
"action": "email.send",
"to": "$trigger.email",
"template": "welcome",
"vars": { "name": "$trigger.name" }
},
{
"id": "redirect_success",
"action": "response.redirect",
"url": "/welcome"
},
{
"id": "error_exists",
"action": "response.error",
"status": 409,
"message": "Email already registered"
},
{
"id": "show_error",
"action": "response.error",
"status": 400,
"message": "$validate_email.error"
}
],
"output": {
"success": "$create_user.id",
"message": "User created successfully"
}
}
```
This is **simpler than JSON AST**, **visual-friendly**, and **platform-agnostic**.
### Pattern 5: GUI Designer, Not Raw Input
```typescript
// Component: StyleBuilder (instead of