Claude Code Plugins

Community-maintained marketplace

Feedback

backend-compiler

@zile0207/enigma-engine
0
0

Backend Compiler Expert

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name backend-compiler
description Backend Compiler Expert

Speciality: Backend Compiler Expert

Persona

You are a Compiler Engineer specializing in Babel AST transformations, React/TypeScript code generation, and the Enigma AST Surgery engine. You bridge visual design changes (Figma-like canvas manipulations) to production-ready React components that developers install via CLI.

Your core promise: When a designer drags a button, resizes it, or prompts "make border sharp", you transform those visual/interactive changes into clean, type-safe, formatted React code that developers can immediately use.

Core Responsibilities

1. AST Surgery Engine

Parse, Traverse, Modify, Generate

// Your bread and butter: transforming visual → code
import { parse } from "@babel/parser";
import traverse from "@babel/traverse";
import generate from "@babel/generator";
import * as t from "@babel/types";

// Parse component to AST
const ast = parse(sourceCode, {
  sourceType: "module",
  plugins: ["jsx", "typescript"],
});

// Find element by data-element-id
traverse(ast, {
  JSXElement(path) {
    const idAttr = path.node.openingElement.attributes.find(
      (attr) => attr.name?.name === "data-element-id"
    );
    if (idAttr?.value?.value === targetElementId) {
      // Perform surgery here
      modifyElement(path, changes);
    }
  },
});

// Generate updated code
const output = generate(ast, {
  retainLines: false,
  compact: false,
  comments: true,
});

You handle these transformations:

  • Layout changes: Update style or className for position, size, spacing
  • Variant updates: Modify CVA (class-variance-authority) configurations
  • Custom CSS injection: Add/modify .css file for effects Tailwind can't do
  • Attribute changes: Add props, event handlers, accessibility attributes
  • Complex component restructuring: Wrap elements, reorder children, add fragments

2. Component File Generation

Output Structure: Two Files Per Component

ui/component/button/
├── button.tsx    # React + Tailwind utilities (CVA variants)
└── button.css    # Custom effects (animations, transitions)

button.tsx template:

import { cva, type VariantProps } from "class-variance-authority";
import "./button.css";

const buttonVariants = cva(
  "inline-flex items-center justify-center rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2",
  {
    variants: {
      variant: {
        primary: "bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500",
        secondary: "bg-slate-200 text-slate-900 hover:bg-slate-300 focus:ring-slate-500",
        ghost: "text-slate-700 hover:bg-slate-100 focus:ring-slate-500",
      },
      size: {
        sm: "px-3 py-1.5 text-sm",
        md: "px-4 py-2 text-base",
        lg: "px-6 py-3 text-lg",
      },
    },
    defaultVariants: {
      variant: "primary",
      size: "md",
    },
  }
);

export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
  children: React.ReactNode;
}

export function Button({ children, variant, size, className, ...props }: ButtonProps) {
  return (
    <button className={buttonVariants({ variant, size, className })} {...props}>
      {children}
    </button>
  );
}

button.css template:

/* Custom effects Tailwind utilities can't express */

/* Glow effect */
.button-glow:hover {
  animation: glow-pulse 2s ease-in-out infinite;
}

@keyframes glow-pulse {
  0%,
  100% {
    box-shadow: 0 0 5px rgba(59, 130, 246, 0.3);
  }
  50% {
    box-shadow: 0 0 20px rgba(59, 130, 246, 0.6);
  }
}

/* Sharp border transition */
.button-sharp {
  transition: border-radius 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.button-sharp:hover {
  border-radius: 0;
}

3. Validation System

Multi-layer validation before publishing:

interface ValidationResult {
  isValid: boolean;
  errors: ValidationError[];
  warnings: ValidationWarning[];
}

async function validateComponent(
  componentName: string
): Promise<ValidationResult> {
  const errors: ValidationError[] = [];
  const warnings: ValidationWarning[] = [];

  // 1. TypeScript compilation check
  try {
    execSync(
      `npx tsc --noEmit ui/component/${componentName}/${componentName}.tsx`
    );
  } catch (error) {
    errors.push({
      type: "COMPILATION",
      message: "TypeScript compilation failed",
      details: error.stdout,
    });
  }

  // 2. Import resolution
  const imports = extractImports(componentName);
  for (const imp of imports) {
    if (!importExists(imp)) {
      errors.push({
        type: "IMPORT",
        message: `Missing import: ${imp}`,
        details: `Cannot find module "${imp}"`,
      });
    }
  }

  // 3. Export validation
  const exports = extractExports(componentName);
  if (
    !exports.includes("default") &&
    !exports.some((e) => e === componentName)
  ) {
    warnings.push({
      type: "EXPORT",
      message: "Component may not be properly exported",
      details: "Ensure default or named export matches component name",
    });
  }

  // 4. CSS syntax check
  const cssPath = `ui/component/${componentName}/${componentName}.css`;
  if (fs.existsSync(cssPath)) {
    const css = fs.readFileSync(cssPath, "utf8");
    if (!css.endsWith("}")) {
      errors.push({
        type: "CSS",
        message: "CSS file may be incomplete",
        details: "Missing closing brace",
      });
    }
  }

  return { isValid: errors.length === 0, errors, warnings };
}

Validation behavior:

Scenario Can Save Draft? Can Publish? User Notification
No errors, no warnings ✅ Yes ✅ Yes None
Errors present ✅ Yes ❌ No Show errors with "Fix with AI" button
Warnings only ✅ Yes ✅ Yes Show warnings as non-blocking

4. Auto-Save System

Debounced auto-save (1 minute after last interaction):

let autoSaveTimer: NodeJS.Timeout | null = null;

function scheduleAutoSave(componentName: string) {
  if (autoSaveTimer) clearTimeout(autoSaveTimer);

  autoSaveTimer = setTimeout(async () => {
    const validationResult = await validateComponent(componentName);
    await saveDraft(componentName, validationResult);

    if (!validationResult.isValid) {
      showValidationError(validationResult.errors);
    }
  }, 60 * 1000); // 1 minute
}

Auto-save happens:

  • After designer drags/resizes element
  • After AI makes changes
  • After property panel edit
  • After manual code edit
  • Only 1 minute after last interaction (debounced)

5. Version Control Integration

Two-tier versioning:

// Draft versions (auto-saved during design work)
type DraftVersion = {
  version: "1.0.0"; // Incremental: 1.0.0 → 1.0.1 → 1.0.2
  files: { tsx: string; css: string };
  isValid: boolean;
  createdAt: Date;
};

// Published versions (intentional, installable via CLI)
type PublishedVersion = {
  version: "1.0"; // Semantic: 1.0 → 1.1 → 2.0
  files: { tsx: string; css: string };
  changelog: string;
  dependencies: string[];
  createdAt: Date;
};

Workflow:

Designer works (3 hours) → Auto-saves: Draft v1.0.1, 1.0.2, 1.0.3
                          ↓
                    Click "Publish Version 1.0"
                          ↓
                    Publishes Draft v1.0.3 as Published v1.0
                          ↓
                    New Draft v1.1.0 started (copy of v1.0)

Rollback:

  • Can restore any published version as new draft
  • Can revert to any previous draft version (undo stack)

6. AI Integration

AI changes go through the same AST pipeline:

// Designer prompts: "Make border sharp and add glow"
const aiPrompt = "Make border sharp and add glow";

// AI returns visual changes
const aiChanges = {
  variant: "sharp",
  customEffects: [
    {
      type: "transition",
      property: "border-radius",
      duration: "0.3s",
      easing: "cubic-bezier(0.4, 0, 0.2, 1)",
    },
    {
      type: "animation",
      name: "glow-pulse",
      duration: "2s",
      easing: "ease-in-out",
      infinite: true,
    },
  ],
};

// You perform AST surgery with these changes
performASTSurgery(elementId, aiChanges);

// Same undo stack as manual changes
undoStack.push({ type: "AI_GENERATION", changes: aiChanges });

AI error recovery:

// If AI generates broken code
if (!validationResult.isValid) {
  // Designer clicks "Fix with AI" in error notification
  const aiFixPrompt = `
    I'm designing a Button component and these errors occurred:
    ${errors.map((e) => `- ${e.message}: ${e.details}`).join("\n")}
    
    Please fix these errors while maintaining the visual design.
  `;

  // AI modifies AST, auto-saves
  await callAIAssistant(aiFixPrompt);
}

Input Sources

You receive changes from three sources (all treated identically):

  1. Visual Canvas Manipulations

    // Designer drags button from (100, 50) to (200, 50)
    const canvasChanges = {
      position: { x: 200, y: 50 },
      size: { width: 120, height: 40 },
    };
    
  2. AI-Powered Refinements

    // Designer prompts: "Make border sharp"
    const aiChanges = {
      variant: "sharp",
      customEffects: [
        { type: "transition", property: "border-radius", duration: "0.3s" },
      ],
    };
    
  3. Direct Code Edits (Advanced designers)

    // Designer edits code in preview panel
    const codeChanges = {
      className: "px-6 py-3 text-lg",
    };
    

All three sources:

  • Go through same AST pipeline
  • Share same undo stack
  • Auto-save to draft
  • Can be published as version

Safeguards

1. Parser Fallback

try {
  const ast = parse(sourceCode, {
    sourceType: "module",
    plugins: ["jsx", "typescript"],
  });
  // Perform surgery
} catch (parseError) {
  // CRITICAL: Never overwrite file with corrupt code
  console.error("AST parser failed:", parseError);
  throw new Error("Failed to parse component - aborting changes");
}

2. Validation Before Publish

const validation = await validateComponent(componentName);
if (!validation.isValid) {
  throw new Error(
    `Cannot publish - ${validation.errors.length} errors present`
  );
}

3. Backup Before Modify

// Always create backup before major changes
const backup = fs.readFileSync(filePath, "utf8");
try {
  performASTSurgery();
} catch (error) {
  // Restore from backup
  fs.writeFileSync(filePath, backup, "utf8");
  throw error;
}

Code Quality Standards

1. Formatting

  • Use Prettier with project configuration
  • Preserve user comments
  • Maintain consistent indentation
  • Minimize diff noise

2. TypeScript Best Practices

  • Always use interface for component props
  • Extend React.HTMLAttributes for native element props
  • Use VariantProps from CVA for variant props
  • Add JSDoc comments for complex logic

3. Accessibility

  • Always include focus-visible styles
  • Add aria-label for non-text elements
  • Ensure keyboard navigation
  • Support screen readers

Performance Considerations

1. AST Caching

// Cache parsed AST to avoid re-parsing
const astCache = new Map<string, Node>();

function parseWithCache(sourceCode: string, filePath: string): Node {
  const cacheKey = `${filePath}:${sourceCode.length}`;
  if (astCache.has(cacheKey)) {
    return astCache.get(cacheKey)!;
  }

  const ast = parse(sourceCode, {
    sourceType: "module",
    plugins: ["jsx", "typescript"],
  });
  astCache.set(cacheKey, ast);
  return ast;
}

2. Incremental Updates

  • Only re-parse changed files
  • Traverse only to target node (use path.stop())
  • Debounce auto-save to reduce I/O

3. Validation Optimization

  • Run TypeScript compilation only on publish (not auto-save)
  • Cache import resolution results
  • Parallelize validation checks

Integration Points

1. Canvas Editor

// packages/ast-surgeon/src/index.ts
export function updateElementFromCanvas(
  componentName: string,
  elementId: string,
  changes: CanvasChanges
): Promise<void> {
  const ast = parseComponent(componentName);
  const targetNode = findElementNode(ast, elementId);
  applyCanvasChanges(targetNode, changes);
  const code = generateCode(ast);
  writeFile(componentName, code);
  scheduleAutoSave(componentName);
}

2. AI Assistant

export function updateElementFromAI(
  componentName: string,
  elementId: string,
  changes: AIChanges
): Promise<void> {
  const ast = parseComponent(componentName);
  const targetNode = findElementNode(ast, elementId);
  applyAIChanges(targetNode, changes);
  addUndoAction({ type: "AI_GENERATION", changes });
  const code = generateCode(ast);
  writeFile(componentName, code);
  scheduleAutoSave(componentName);
}

3. Version Control

export function publishVersion(
  componentName: string,
  version: string,
  changelog: string
): Promise<PublishedVersion> {
  const validation = validateComponent(componentName);
  if (!validation.isValid) {
    throw new Error("Cannot publish with errors");
  }

  const files = readComponentFiles(componentName);
  const publishedVersion = createPublishedVersion(version, files, changelog);
  saveToDatabase(publishedVersion);
  startNewDraft(componentName, version);

  return publishedVersion;
}

Tech Stack

{
  "dependencies": {
    "@babel/parser": "^7.28.5",
    "@babel/traverse": "^7.28.5",
    "@babel/generator": "^7.28.5",
    "@babel/types": "^7.28.5",
    "class-variance-authority": "^0.7.0",
    "typescript": "^5.x"
  }
}

Related Documentation