Real-World Use Cases & Integration Examples
Comprehensive collection of practical, production-ready integration scenarios for Fluorite MCP across different development environments, team structures, and project scales.
📖 Table of Contents
- Development Team Workflows
- CI/CD Integration Patterns
- IDE and Editor Integrations
- Large Project Management
- Cross-Team Collaboration
- Production Deployment Scenarios
- Troubleshooting Real-World Issues
Development Team Workflows
Startup Team: Rapid MVP Development
Scenario: 3-person startup building a SaaS platform, needs to move from idea to MVP in 4 weeks.
Team Structure:
- 1 Full-stack developer (React/Node.js)
- 1 Backend developer (Python/FastAPI)
- 1 Product manager (technical)
Setup & Configuration
# Team setup script
#!/bin/bash
echo "🚀 Setting up Fluorite MCP for startup team..."
# Install Fluorite MCP for each team member
npm install -g fluorite-mcp
# Add to Claude Code CLI
claude mcp add fluorite-mcp -- fluorite-mcp
# Create team configuration
mkdir -p .fluorite
cat > .fluorite/team-config.yml << EOF
team:
name: "StartupMVP"
size: "small"
stage: "mvp"
frameworks:
primary: ["nextjs", "fastapi"]
experimental: ["supabase", "vercel"]
quality_gates:
error_threshold: 2 # Allow some errors during rapid development
warning_threshold: 10
mvp_mode: true
spike_preferences:
favor_minimal: true
prioritize_speed: true
include_auth: true
include_database: true
EOF
echo "✅ Team setup complete!"
Daily Development Workflow
Morning Standup Integration:
# Sprint planning with Fluorite
echo "📋 Today's development goals:"
echo "1. User authentication system"
echo "2. Basic dashboard with data visualization"
echo "3. API rate limiting"
# Auto-generate spike recommendations
claude-code "Generate implementation plan for:"
claude-code "1. Next.js app with Supabase auth"
claude-code "2. FastAPI backend with JWT"
claude-code "3. React dashboard with charts"
Real Implementation Examples:
# Frontend developer's morning
claude-code "Create a user dashboard with authentication, data tables, and charts using Next.js, Supabase auth, and Recharts"
# Expected output:
# ✅ Template selected: nextjs-supabase-auth
# ✅ Template selected: tanstack-table-react-minimal
# ✅ Template selected: recharts integration
# 📦 Files created:
# - app/dashboard/page.tsx
# - app/auth/login/page.tsx
# - components/DataTable.tsx
# - components/ChartContainer.tsx
# - lib/supabase.ts
# - middleware.ts (auth protection)
# Backend developer's workflow
claude-code "Set up FastAPI with JWT authentication, PostgreSQL database, background tasks for email notifications, and rate limiting"
# Expected output:
# ✅ Templates applied:
# - fastapi-jwt-auth
# - fastapi-sqlalchemy-postgres
# - fastapi-background-tasks
# - fastapi-rate-limit-minimal
# 📦 Complete API structure created
# 🔧 Database models and migrations ready
# 📧 Email notification system configured
Weekly Team Review
// scripts/weekly-review.ts
import { FluoriteIntegration } from './fluorite-integration';
async function generateWeeklyReport() {
const fluorite = new FluoriteIntegration();
await fluorite.initialize();
// Analyze all code written this week
const analysis = await fluorite.analyzeProject('.', 'auto-detect');
// Generate team progress report
const report = {
linesOfCode: analysis.summary.filesAnalyzed,
qualityScore: (1 - analysis.summary.errors / 100) * 100,
templatesUsed: await getTemplatesUsedThisWeek(),
productivity: calculateProductivityMetrics(),
nextWeekFocus: await generateRecommendations()
};
console.log(`
📊 Weekly Team Report
==================
📝 Files analyzed: ${report.linesOfCode}
⭐ Quality score: ${report.qualityScore}%
🧪 Templates used: ${report.templatesUsed.length}
📈 Productivity: ${report.productivity}
🎯 Next week focus: ${report.nextWeekFocus}
`);
}
// Run every Friday
generateWeeklyReport();
Results after 4 weeks:
- ✅ Full MVP deployed to production
- ✅ Authentication, database, payments integrated
- ✅ 85% code quality score maintained
- ✅ 10x faster development vs. building from scratch
Enterprise Team: Large-Scale Application
Scenario: 50-person engineering team at fintech company, building compliance-heavy trading platform.
Team Structure:
- 15 Frontend developers (React/Next.js)
- 20 Backend developers (Java/Spring Boot, Python/FastAPI)
- 10 DevOps engineers
- 5 QA engineers
Enterprise Configuration
# .fluorite/enterprise-config.yml
enterprise:
name: "FinTech Trading Platform"
compliance_level: "SOX/PCI-DSS"
team_size: "large"
security:
required_patterns:
- audit-logging
- input-validation
- encryption-at-rest
- secure-headers
frameworks:
approved:
- nextjs: "14.x"
- spring-boot: "3.x"
- fastapi: "0.100+"
forbidden:
- experimental-frameworks
- beta-packages
quality_gates:
error_threshold: 0
warning_threshold: 2
security_scan: required
compliance_check: required
validation_rules:
enabled:
- fintech-compliance
- security-headers
- audit-trail-required
- data-encryption
- access-control
team_structure:
frontend:
leads: ["alice", "bob"]
frameworks: ["nextjs", "react"]
backend:
leads: ["charlie", "diana"]
frameworks: ["spring-boot", "fastapi"]
infrastructure:
leads: ["eve", "frank"]
tools: ["kubernetes", "terraform"]
Team-Specific Custom Specifications
# .fluorite/specs/fintech-audit-logging.yaml
name: FinTech Audit Logging Standards
version: 1.0.0
category: enterprise-security
compliance: SOX, PCI-DSS
standards:
audit_events:
required:
- user_login_logout
- data_access
- configuration_changes
- privileged_operations
format: structured_json
retention: "7_years"
log_fields:
mandatory:
- timestamp_utc
- user_id
- session_id
- ip_address
- user_agent
- action_type
- resource_accessed
- outcome
sensitive_data: "encrypted"
patterns:
typescript: |
import { auditLogger } from '@company/audit-logger';
export const auditEvent = (event: AuditEvent) => {
auditLogger.info({
timestamp: new Date().toISOString(),
userId: event.userId,
sessionId: event.sessionId,
action: event.action,
resource: event.resource,
outcome: event.outcome,
metadata: encrypt(event.sensitive)
});
};
java: |
@Component
public class AuditService {
@Autowired
private AuditLogger auditLogger;
public void logEvent(AuditEvent event) {
auditLogger.info(AuditLogEntry.builder()
.timestamp(Instant.now())
.userId(event.getUserId())
.action(event.getAction())
.resource(event.getResource())
.outcome(event.getOutcome())
.build());
}
}
Multi-Team Development Workflow
Frontend Team Lead Workflow:
# Morning team coordination
claude-code "Generate architecture review for new trading dashboard feature with real-time data, compliance logging, and accessibility requirements"
# Results in:
# 📊 Architecture analysis
# 🔒 Security requirements checklist
# ♿ Accessibility compliance plan
# 🧪 Testing strategy with Playwright
# 📱 Component design system integration
Backend Team Distributed Development:
# Microservice implementation
claude-code "Create microservice for trade execution with audit logging, rate limiting, circuit breaker pattern, and OpenTelemetry tracing"
# Auto-selects enterprise patterns:
# ✅ fastapi-opentelemetry
# ✅ fastapi-rate-limit-minimal
# ✅ Circuit breaker implementation
# ✅ Audit logging integration
# ✅ Kubernetes deployment manifests
Quality Gates Integration
// .github/workflows/enterprise-quality-gates.yml
name: Enterprise Quality Gates
on:
pull_request:
branches: [main, develop]
jobs:
compliance-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Fluorite MCP
run: npm install -g fluorite-mcp
- name: SOX Compliance Check
run: |
fluorite-mcp --static-analysis \
--project-path . \
--framework auto-detect \
--compliance sox-standards \
--audit-logging-required \
--data-encryption-check
- name: Security Validation
run: |
fluorite-mcp --static-analysis \
--security-scan high \
--enabled-rules fintech-security,audit-trail-required \
--max-issues 0
- name: Generate Compliance Report
run: |
fluorite-mcp --generate-compliance-report \
--standards sox,pci-dss \
--output compliance-report.json
- name: Upload Compliance Artifacts
uses: actions/upload-artifact@v4
with:
name: compliance-report
path: compliance-report.json
Results after 6 months:
- ✅ 100% compliance audit pass rate
- ✅ 40% faster feature development
- ✅ 99.9% code quality score
- ✅ Zero security vulnerabilities in production
CI/CD Integration Patterns
Multi-Environment Deployment Pipeline
Scenario: SaaS company with development, staging, UAT, and production environments.
Advanced CI/CD Configuration
# .github/workflows/multi-environment-pipeline.yml
name: Multi-Environment Pipeline with Fluorite MCP
on:
push:
branches: [main, develop, feature/*]
pull_request:
branches: [main, develop]
env:
FLUORITE_LOG_LEVEL: info
NODE_OPTIONS: "--max-old-space-size=4096"
jobs:
setup:
runs-on: ubuntu-latest
outputs:
environment: ${{ steps.determine-env.outputs.environment }}
changed-services: ${{ steps.detect-changes.outputs.services }}
deploy-strategy: ${{ steps.strategy.outputs.strategy }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Determine Environment
id: determine-env
run: |
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "environment=production" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then
echo "environment=staging" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref }}" == "refs/heads/feature/*" ]]; then
echo "environment=preview" >> $GITHUB_OUTPUT
else
echo "environment=development" >> $GITHUB_OUTPUT
fi
- name: Detect Changed Services
id: detect-changes
run: |
CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }})
SERVICES=""
if echo "$CHANGED_FILES" | grep -q "^frontend/"; then
SERVICES="${SERVICES},frontend"
fi
if echo "$CHANGED_FILES" | grep -q "^backend/"; then
SERVICES="${SERVICES},backend"
fi
if echo "$CHANGED_FILES" | grep -q "^shared/"; then
SERVICES="${SERVICES},frontend,backend"
fi
echo "services=${SERVICES#,}" >> $GITHUB_OUTPUT
- name: Determine Deployment Strategy
id: strategy
run: |
case "${{ steps.determine-env.outputs.environment }}" in
production)
echo "strategy=blue-green" >> $GITHUB_OUTPUT
;;
staging)
echo "strategy=rolling-update" >> $GITHUB_OUTPUT
;;
*)
echo "strategy=recreate" >> $GITHUB_OUTPUT
;;
esac
analysis:
runs-on: ubuntu-latest
needs: setup
strategy:
matrix:
service: ${{ fromJson(format('["{0}"]', needs.setup.outputs.changed-services)) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install Fluorite MCP
run: npm install -g fluorite-mcp
- name: Service-Specific Analysis
run: |
cd ${{ matrix.service }}
# Framework detection
FRAMEWORK="auto-detect"
if [ -f "next.config.js" ] || [ -f "next.config.ts" ]; then
FRAMEWORK="nextjs"
elif [ -f "main.py" ] && grep -q "fastapi" requirements.txt; then
FRAMEWORK="fastapi"
fi
# Run comprehensive analysis
fluorite-mcp --static-analysis \
--project-path . \
--framework $FRAMEWORK \
--predict-errors true \
--analyze-dependencies true \
--strict-mode ${{ needs.setup.outputs.environment == 'production' && 'true' || 'false' }}
- name: Environment-Specific Validation
run: |
case "${{ needs.setup.outputs.environment }}" in
production)
fluorite-mcp --static-analysis \
--focus security \
--enabled-rules production-readiness,performance-critical \
--max-issues 0
;;
staging)
fluorite-mcp --static-analysis \
--focus performance \
--enabled-rules staging-validation \
--max-issues 2
;;
preview)
fluorite-mcp --quick-validate \
--framework $FRAMEWORK \
--preview-mode true
;;
esac
security-scan:
runs-on: ubuntu-latest
if: needs.setup.outputs.environment == 'production'
needs: [setup, analysis]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Fluorite MCP
run: npm install -g fluorite-mcp
- name: Production Security Scan
run: |
fluorite-mcp --static-analysis \
--project-path . \
--focus security \
--enabled-rules security-xss-prevention,security-injection,security-auth-patterns \
--strict-mode true \
--compliance-check true
- name: Dependency Security Audit
run: |
fluorite-mcp --static-analysis \
--analyze-dependencies true \
--security-scan true \
--vulnerability-threshold high
- name: Generate Security Report
run: |
fluorite-mcp --generate-security-report \
--format json \
--output security-report.json
- name: Upload Security Report
uses: actions/upload-artifact@v4
with:
name: security-report-${{ github.sha }}
path: security-report.json
build:
runs-on: ubuntu-latest
needs: [setup, analysis]
strategy:
matrix:
service: ${{ fromJson(format('["{0}"]', needs.setup.outputs.changed-services)) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Build Environment
run: |
case "${{ matrix.service }}" in
frontend)
echo "BUILD_COMMAND=npm run build" >> $GITHUB_ENV
echo "DOCKERFILE=Dockerfile.frontend" >> $GITHUB_ENV
;;
backend)
echo "BUILD_COMMAND=pip install -r requirements.txt" >> $GITHUB_ENV
echo "DOCKERFILE=Dockerfile.backend" >> $GITHUB_ENV
;;
esac
- name: Build Application
run: |
cd ${{ matrix.service }}
${{ env.BUILD_COMMAND }}
- name: Build Optimization Analysis
run: |
cd ${{ matrix.service }}
fluorite-mcp --static-analysis \
--focus performance \
--analyze-bundle-size \
--optimize-recommendations
- name: Build Docker Image
run: |
docker build -f ${{ matrix.service }}/${{ env.DOCKERFILE }} \
-t ${{ matrix.service }}:${{ github.sha }} \
${{ matrix.service }}
test:
runs-on: ubuntu-latest
needs: [setup, build]
strategy:
matrix:
test-type: [unit, integration, e2e]
service: ${{ fromJson(format('["{0}"]', needs.setup.outputs.changed-services)) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Fluorite MCP
run: npm install -g fluorite-mcp
- name: Generate Test Strategy
run: |
cd ${{ matrix.service }}
fluorite-mcp --auto-spike \
--task "Generate ${{ matrix.test-type }} test strategy for ${{ matrix.service }}" \
--constraints '{"test_type": "${{ matrix.test-type }}", "framework": "auto-detect"}'
- name: Run Tests
run: |
cd ${{ matrix.service }}
case "${{ matrix.test-type }}" in
unit)
npm run test:unit
;;
integration)
npm run test:integration
;;
e2e)
npm run test:e2e
;;
esac
deploy:
runs-on: ubuntu-latest
needs: [setup, security-scan, test]
if: always() && needs.test.result == 'success'
environment: ${{ needs.setup.outputs.environment }}
steps:
- name: Deploy with Strategy
run: |
case "${{ needs.setup.outputs.deploy-strategy }}" in
blue-green)
echo "🔄 Deploying with blue-green strategy..."
# Blue-green deployment logic
;;
rolling-update)
echo "🔄 Deploying with rolling update..."
# Rolling update logic
;;
recreate)
echo "🔄 Deploying with recreate strategy..."
# Recreate deployment logic
;;
esac
- name: Post-Deployment Validation
run: |
sleep 30 # Wait for deployment to stabilize
# Generate health check
fluorite-mcp --auto-spike \
--task "Generate health check for deployed services" \
--constraints '{"environment": "${{ needs.setup.outputs.environment }}"}'
- name: Performance Monitoring Setup
if: needs.setup.outputs.environment == 'production'
run: |
fluorite-mcp --auto-spike \
--task "Set up performance monitoring and alerting" \
--constraints '{"monitoring": "prometheus", "alerting": "slack"}'
post-deployment:
runs-on: ubuntu-latest
needs: [setup, deploy]
if: always() && needs.deploy.result == 'success'
steps:
- name: Deployment Metrics
run: |
echo "📊 Deployment completed successfully!"
echo "Environment: ${{ needs.setup.outputs.environment }}"
echo "Services: ${{ needs.setup.outputs.changed-services }}"
echo "Strategy: ${{ needs.setup.outputs.deploy-strategy }}"
- name: Notify Team
run: |
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"🚀 Deployment to ${{ needs.setup.outputs.environment }} completed successfully!\n\n**Services:** ${{ needs.setup.outputs.changed-services }}\n**Strategy:** ${{ needs.setup.outputs.deploy-strategy }}\n**Commit:** ${{ github.sha }}"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
IDE and Editor Integrations
Visual Studio Code Team Setup
Scenario: Development team using VS Code with custom Fluorite MCP integration for real-time code analysis.
Custom VS Code Extension
// fluorite-vscode-extension/src/extension.ts
import * as vscode from 'vscode';
import { FluoriteIntegration } from './fluorite-integration';
export function activate(context: vscode.ExtensionContext) {
console.log('Fluorite MCP extension is now active!');
const fluorite = new FluoriteIntegration();
let initialized = false;
// Initialize Fluorite on first use
const initializeFluorite = async () => {
if (!initialized) {
await fluorite.initialize();
initialized = true;
vscode.window.showInformationMessage('Fluorite MCP initialized successfully!');
}
};
// Real-time validation on save
const onSaveHandler = vscode.workspace.onDidSaveTextDocument(async (document) => {
if (!shouldValidateDocument(document)) return;
await initializeFluorite();
await validateDocument(document);
});
// Command: Analyze current file
const analyzeFileCommand = vscode.commands.registerCommand(
'fluorite.analyzeFile',
async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
await initializeFluorite();
await validateDocument(editor.document);
}
);
// Command: Apply spike template
const applySpikeCommand = vscode.commands.registerCommand(
'fluorite.applySpike',
async () => {
await initializeFluorite();
await showSpikeTemplatePicker();
}
);
// Command: Project-wide analysis
const analyzeProjectCommand = vscode.commands.registerCommand(
'fluorite.analyzeProject',
async () => {
await initializeFluorite();
await analyzeCurrentProject();
}
);
// Command: Generate component
const generateComponentCommand = vscode.commands.registerCommand(
'fluorite.generateComponent',
async () => {
await initializeFluorite();
await generateComponentWizard();
}
);
// Status bar item
const statusBarItem = vscode.window.createStatusBarItem(
vscode.StatusBarAlignment.Right,
100
);
statusBarItem.text = "$(zap) Fluorite";
statusBarItem.tooltip = "Fluorite MCP Status";
statusBarItem.command = 'fluorite.showStatus';
statusBarItem.show();
// Show status command
const showStatusCommand = vscode.commands.registerCommand(
'fluorite.showStatus',
async () => {
await initializeFluorite();
const health = await fluorite.getHealthStatus();
vscode.window.showInformationMessage(
`Fluorite MCP Status: ${health.healthy ? 'Healthy' : 'Unhealthy'}\n` +
`Performance: ${health.performance ? 'Good' : 'Poor'}\n` +
`Cache Hit Rate: ${health.metrics?.cache?.hitRate || 'N/A'}%`
);
}
);
context.subscriptions.push(
onSaveHandler,
analyzeFileCommand,
applySpikeCommand,
analyzeProjectCommand,
generateComponentCommand,
showStatusCommand,
statusBarItem
);
async function shouldValidateDocument(document: vscode.TextDocument): Promise<boolean> {
const config = vscode.workspace.getConfiguration('fluorite');
const enableRealTime = config.get<boolean>('enableRealTimeValidation', true);
if (!enableRealTime) return false;
const supportedExtensions = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.py'];
const fileExtension = document.fileName.substring(document.fileName.lastIndexOf('.'));
return supportedExtensions.includes(fileExtension);
}
async function validateDocument(document: vscode.TextDocument) {
const diagnostics: vscode.Diagnostic[] = [];
try {
const framework = detectFramework(document.fileName);
const language = detectLanguage(document.fileName);
const result = await fluorite.validateCode(
document.getText(),
language,
framework
);
if (!result.valid) {
for (const issue of result.issues) {
const line = issue.line ? issue.line - 1 : 0;
const range = new vscode.Range(line, 0, line, 1000);
const diagnostic = new vscode.Diagnostic(
range,
issue.message,
issue.severity === 'error'
? vscode.DiagnosticSeverity.Error
: vscode.DiagnosticSeverity.Warning
);
diagnostic.source = 'Fluorite MCP';
diagnostics.push(diagnostic);
}
}
} catch (error) {
console.error('Fluorite validation failed:', error);
}
const collection = vscode.languages.createDiagnosticCollection('fluorite');
collection.set(document.uri, diagnostics);
}
async function showSpikeTemplatePicker() {
const quickPick = vscode.window.createQuickPick();
quickPick.placeholder = 'Search for spike templates...';
quickPick.busy = true;
quickPick.show();
try {
const templates = await fluorite.discoverSpikes('');
quickPick.items = templates.map(template => ({
label: template.id,
description: template.name,
detail: template.description,
template: template
}));
quickPick.busy = false;
quickPick.onDidAccept(async () => {
const selected = quickPick.selectedItems[0] as any;
if (selected) {
quickPick.dispose();
await applySpikeTemplate(selected.template);
}
});
} catch (error) {
quickPick.dispose();
vscode.window.showErrorMessage(`Failed to load spike templates: ${error}`);
}
}
async function applySpikeTemplate(template: any) {
const workspacePath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (!workspacePath) {
vscode.window.showErrorMessage('No workspace folder open');
return;
}
try {
// Show parameter input dialog if template has parameters
const params: Record<string, string> = {};
if (template.params && template.params.length > 0) {
for (const param of template.params) {
if (param.required) {
const value = await vscode.window.showInputBox({
prompt: `Enter value for ${param.name}`,
value: param.default || ''
});
if (value === undefined) return; // User cancelled
params[param.name] = value;
}
}
}
// Apply the template
const result = await fluorite.applySpike(template.id, params);
if (result.success) {
vscode.window.showInformationMessage(
`Spike template '${template.id}' applied successfully! Created ${result.filesCreated.length} files.`
);
// Refresh explorer to show new files
vscode.commands.executeCommand('workbench.files.action.refreshFilesExplorer');
} else {
vscode.window.showErrorMessage(`Failed to apply spike template: ${result.error}`);
}
} catch (error) {
vscode.window.showErrorMessage(`Error applying spike template: ${error}`);
}
}
async function analyzeCurrentProject() {
const workspacePath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (!workspacePath) {
vscode.window.showErrorMessage('No workspace folder open');
return;
}
vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: "Analyzing project with Fluorite MCP...",
cancellable: false
}, async (progress) => {
try {
progress.report({ message: "Detecting framework..." });
const framework = detectProjectFramework(workspacePath);
progress.report({ message: "Running static analysis..." });
const analysis = await fluorite.analyzeProject(workspacePath, framework);
progress.report({ message: "Generating report..." });
// Create and show analysis report
const reportContent = generateAnalysisReport(analysis);
const doc = await vscode.workspace.openTextDocument({
content: reportContent,
language: 'markdown'
});
await vscode.window.showTextDocument(doc);
} catch (error) {
vscode.window.showErrorMessage(`Project analysis failed: ${error}`);
}
});
}
async function generateComponentWizard() {
const componentType = await vscode.window.showQuickPick([
{ label: 'React Component', value: 'react' },
{ label: 'Vue Component', value: 'vue' },
{ label: 'Next.js Page', value: 'nextjs-page' },
{ label: 'FastAPI Endpoint', value: 'fastapi-endpoint' }
], { placeHolder: 'Select component type' });
if (!componentType) return;
const componentName = await vscode.window.showInputBox({
prompt: 'Enter component name',
validateInput: (value) => {
if (!value) return 'Component name is required';
if (!/^[A-Z][a-zA-Z0-9]*$/.test(value)) {
return 'Component name must be PascalCase';
}
return null;
}
});
if (!componentName) return;
try {
const task = `Create a ${componentType.label} called ${componentName}`;
const recommendation = await fluorite.autoSelectSpike(task);
if (recommendation.selectedTemplate) {
await applySpikeTemplate({
id: recommendation.selectedTemplate,
params: [{ name: 'component_name', required: true }]
});
} else {
vscode.window.showWarningMessage('No suitable template found for this component type');
}
} catch (error) {
vscode.window.showErrorMessage(`Component generation failed: ${error}`);
}
}
function detectFramework(fileName: string): string {
if (fileName.includes('app/') || fileName.includes('pages/')) return 'nextjs';
if (fileName.endsWith('.vue')) return 'vue';
if (fileName.endsWith('.py')) return 'fastapi';
if (fileName.includes('.tsx') || fileName.includes('.jsx')) return 'react';
return 'typescript';
}
function detectLanguage(fileName: string): string {
const ext = fileName.substring(fileName.lastIndexOf('.') + 1);
const languageMap: Record<string, string> = {
'ts': 'typescript',
'tsx': 'tsx',
'js': 'javascript',
'jsx': 'jsx',
'vue': 'vue',
'py': 'python'
};
return languageMap[ext] || 'typescript';
}
function detectProjectFramework(projectPath: string): string {
const fs = require('fs');
const path = require('path');
try {
const packageJsonPath = path.join(projectPath, 'package.json');
if (fs.existsSync(packageJsonPath)) {
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
if (packageJson.dependencies?.next) return 'nextjs';
if (packageJson.dependencies?.vue) return 'vue';
if (packageJson.dependencies?.react) return 'react';
}
if (fs.existsSync(path.join(projectPath, 'main.py'))) return 'fastapi';
if (fs.existsSync(path.join(projectPath, 'requirements.txt'))) return 'python';
} catch (error) {
console.error('Framework detection failed:', error);
}
return 'typescript';
}
function generateAnalysisReport(analysis: any): string {
return `# Fluorite MCP Project Analysis Report
## Summary
- **Files Analyzed**: ${analysis.summary.filesAnalyzed}
- **Errors Found**: ${analysis.summary.errors}
- **Warnings**: ${analysis.summary.warnings}
- **Predictions**: ${analysis.summary.predictions}
## Issues Found
${analysis.issues.map((issue: any) => `- **${issue.severity.toUpperCase()}**: ${issue.message}`).join('\n')}
## Predictions
${analysis.predictions.map((pred: any) => `- **${pred.type}** (${Math.round(pred.probability * 100)}%): ${pred.description}`).join('\n')}
## Recommendations
${analysis.recommendations.map((rec: string) => `- ${rec}`).join('\n')}
---
*Generated by Fluorite MCP at ${new Date().toISOString()}*
`;
}
}
export function deactivate() {}
VS Code Settings
// .vscode/settings.json
{
"fluorite.enableRealTimeValidation": true,
"fluorite.framework": "auto-detect",
"fluorite.analysisLevel": "standard",
"fluorite.autoFixEnabled": true,
"fluorite.spikeTemplatesPath": "./spikes",
"fluorite.customRules": [
"team-naming-convention",
"accessibility-compliance",
"performance-optimization"
],
"fluorite.excludePatterns": [
"**/*.test.ts",
"**/*.spec.ts",
"**/node_modules/**",
"**/dist/**",
"**/build/**"
],
"fluorite.notifications": {
"showSuccessMessages": true,
"showWarningMessages": true,
"showErrorMessages": true
},
"fluorite.performance": {
"enableCaching": true,
"cacheTimeout": 3600,
"maxMemoryUsage": "2GB"
}
}
Team Workspace Configuration
// .vscode/fluorite-team.code-workspace
{
"folders": [
{
"name": "Frontend",
"path": "./frontend"
},
{
"name": "Backend",
"path": "./backend"
},
{
"name": "Shared",
"path": "./shared"
}
],
"settings": {
"fluorite.enableRealTimeValidation": true,
"fluorite.framework": "auto-detect",
"fluorite.teamConfig": "./.fluorite/team-config.yml",
"fluorite.multiProject": true,
"fluorite.projectMappings": {
"frontend": {
"framework": "nextjs",
"includePatterns": ["src/**/*.ts", "src/**/*.tsx"],
"excludePatterns": ["**/*.test.*"]
},
"backend": {
"framework": "fastapi",
"includePatterns": ["**/*.py"],
"excludePatterns": ["**/__pycache__/**"]
}
}
},
"extensions": {
"recommendations": [
"fluorite-mcp.vscode-extension",
"ms-python.python",
"ms-vscode.vscode-typescript-next",
"bradlc.vscode-tailwindcss"
]
}
}
Daily Usage Examples:
// Developer workflow integration
// 1. Open project in VS Code
// 2. Fluorite automatically activates and analyzes project structure
// 3. Real-time validation as you type
// 4. Quick fixes and suggestions
// 5. Spike template integration for rapid prototyping
// Example: Creating a new feature
// Command Palette: "Fluorite: Generate Component"
// → Wizard guides through component creation
// → Auto-selects appropriate spike template
// → Generates component with tests and documentation
Large Project Management
Monorepo with Multiple Teams
Scenario: E-commerce platform with 100+ microservices, 200+ developers across 15 teams.
Monorepo Structure
ecommerce-platform/
├── apps/
│ ├── web-customer/ # Next.js customer app
│ ├── web-admin/ # Next.js admin panel
│ ├── mobile-app/ # React Native app
│ └── docs/ # Documentation site
├── services/
│ ├── user-service/ # FastAPI user management
│ ├── product-service/ # FastAPI product catalog
│ ├── order-service/ # FastAPI order processing
│ ├── payment-service/ # FastAPI payment handling
│ ├── notification-service/ # FastAPI notifications
│ └── analytics-service/ # Python data processing
├── packages/
│ ├── ui-components/ # Shared React components
│ ├── api-client/ # TypeScript API client
│ ├── shared-types/ # TypeScript definitions
│ └── config/ # Shared configurations
├── tools/
│ ├── build-tools/ # Custom build utilities
│ ├── testing/ # Test utilities
│ └── deployment/ # Deployment scripts
└── .fluorite/
├── monorepo-config.yml
├── team-mappings.yml
└── quality-gates.yml
Monorepo Configuration
# .fluorite/monorepo-config.yml
monorepo:
name: "E-commerce Platform"
type: "nx-workspace" # or "lerna", "pnpm-workspace"
scale: "enterprise"
structure:
apps:
web-customer:
team: "customer-experience"
framework: "nextjs"
criticality: "high"
web-admin:
team: "admin-tools"
framework: "nextjs"
criticality: "medium"
mobile-app:
team: "mobile"
framework: "react-native"
criticality: "high"
services:
user-service:
team: "identity"
framework: "fastapi"
criticality: "critical"
product-service:
team: "catalog"
framework: "fastapi"
criticality: "high"
order-service:
team: "fulfillment"
framework: "fastapi"
criticality: "critical"
payment-service:
team: "payments"
framework: "fastapi"
criticality: "critical"
compliance: "pci-dss"
packages:
ui-components:
team: "design-system"
framework: "react"
consumers: ["web-customer", "web-admin", "mobile-app"]
analysis:
parallel_processing: true
max_workers: 20
cache_strategy: "distributed"
quality_gates:
global:
error_threshold: 0
warning_threshold: 5
coverage_threshold: 80
per_service:
critical:
error_threshold: 0
warning_threshold: 0
coverage_threshold: 95
high:
error_threshold: 0
warning_threshold: 2
coverage_threshold: 85
medium:
error_threshold: 2
warning_threshold: 10
coverage_threshold: 70
Team Mapping Configuration
# .fluorite/team-mappings.yml
teams:
customer-experience:
lead: "alice@company.com"
members: 12
focus: ["frontend", "ux", "performance"]
frameworks: ["nextjs", "react"]
admin-tools:
lead: "bob@company.com"
members: 8
focus: ["frontend", "admin-interfaces"]
frameworks: ["nextjs", "react"]
mobile:
lead: "charlie@company.com"
members: 10
focus: ["mobile", "react-native"]
frameworks: ["react-native", "expo"]
identity:
lead: "diana@company.com"
members: 6
focus: ["authentication", "security"]
frameworks: ["fastapi", "python"]
compliance: ["gdpr", "ccpa"]
catalog:
lead: "eve@company.com"
members: 8
focus: ["product-data", "search"]
frameworks: ["fastapi", "elasticsearch"]
fulfillment:
lead: "frank@company.com"
members: 10
focus: ["order-processing", "inventory"]
frameworks: ["fastapi", "python"]
payments:
lead: "grace@company.com"
members: 6
focus: ["payments", "security"]
frameworks: ["fastapi", "python"]
compliance: ["pci-dss", "sox"]
design-system:
lead: "henry@company.com"
members: 4
focus: ["ui-components", "design-tokens"]
frameworks: ["react", "storybook"]
workflows:
cross_team_changes:
require_approval: true
approvers_needed: 2
breaking_changes:
notification_channels: ["slack", "email"]
approval_process: "rfc"
dependency_updates:
auto_approve: false
security_updates: true
Advanced Monorepo Analysis
// tools/fluorite-monorepo-analyzer.ts
import { FluoriteIntegration } from '../lib/fluorite-integration';
import { execSync } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
interface MonorepoConfig {
monorepo: {
name: string;
type: string;
structure: Record<string, any>;
};
}
interface TeamMapping {
teams: Record<string, {
lead: string;
members: number;
focus: string[];
frameworks: string[];
compliance?: string[];
}>;
}
export class MonorepoAnalyzer {
private fluorite: FluoriteIntegration;
private config: MonorepoConfig;
private teamMapping: TeamMapping;
constructor() {
this.fluorite = new FluoriteIntegration();
this.config = this.loadConfig('.fluorite/monorepo-config.yml');
this.teamMapping = this.loadConfig('.fluorite/team-mappings.yml');
}
async initialize() {
await this.fluorite.initialize();
}
async analyzeFullMonorepo(): Promise<MonorepoAnalysisResult> {
console.log('🔍 Starting comprehensive monorepo analysis...');
const startTime = Date.now();
const results: MonorepoAnalysisResult = {
summary: {
totalProjects: 0,
analysisTime: 0,
issuesFound: 0,
teamsAffected: new Set()
},
projectResults: new Map(),
crossProjectIssues: [],
securityFindings: [],
performanceIssues: [],
complianceStatus: new Map()
};
// Get all projects to analyze
const projects = await this.discoverProjects();
results.summary.totalProjects = projects.length;
console.log(`📦 Found ${projects.length} projects to analyze`);
// Parallel analysis of projects
const analysisPromises = projects.map(project =>
this.analyzeProject(project).catch(error => ({
project,
error: error.message,
success: false
}))
);
const analysisResults = await Promise.all(analysisPromises);
// Process results
for (const result of analysisResults) {
if (result.success) {
results.projectResults.set(result.project.name, result);
results.summary.issuesFound += result.issues.length;
// Track affected teams
const team = this.getProjectTeam(result.project.name);
if (team) {
results.summary.teamsAffected.add(team);
}
// Categorize issues
for (const issue of result.issues) {
if (issue.type === 'security') {
results.securityFindings.push({
project: result.project.name,
issue: issue
});
}
if (issue.type === 'performance') {
results.performanceIssues.push({
project: result.project.name,
issue: issue
});
}
}
}
}
// Analyze cross-project dependencies
results.crossProjectIssues = await this.analyzeCrossProjectDependencies(projects);
// Check compliance status
results.complianceStatus = await this.checkComplianceStatus(projects);
results.summary.analysisTime = Date.now() - startTime;
console.log(`✅ Monorepo analysis completed in ${results.summary.analysisTime}ms`);
return results;
}
async analyzeProject(project: ProjectInfo): Promise<ProjectAnalysisResult> {
console.log(`📊 Analyzing ${project.name}...`);
try {
const framework = this.getProjectFramework(project.name);
const team = this.getProjectTeam(project.name);
const criticality = this.getProjectCriticality(project.name);
// Run Fluorite analysis
const analysis = await this.fluorite.analyzeProject(project.path, framework);
// Team-specific rules
const teamRules = this.getTeamRules(team);
// Compliance checks
const complianceIssues = await this.checkProjectCompliance(project, team);
return {
project,
team,
framework,
criticality,
analysis,
issues: [
...analysis.issues,
...complianceIssues
],
teamRulesApplied: teamRules,
success: true
};
} catch (error) {
console.error(`❌ Failed to analyze ${project.name}:`, error);
return {
project,
error: error.message,
success: false
};
}
}
async analyzeCrossProjectDependencies(projects: ProjectInfo[]): Promise<CrossProjectIssue[]> {
console.log('🔗 Analyzing cross-project dependencies...');
const issues: CrossProjectIssue[] = [];
const dependencyGraph = await this.buildDependencyGraph(projects);
// Check for circular dependencies
const circularDeps = this.findCircularDependencies(dependencyGraph);
for (const cycle of circularDeps) {
issues.push({
type: 'circular-dependency',
severity: 'error',
description: `Circular dependency detected: ${cycle.join(' → ')}`,
affectedProjects: cycle,
resolution: 'Refactor to remove circular dependency'
});
}
// Check for version mismatches
const versionMismatches = await this.findVersionMismatches(projects);
for (const mismatch of versionMismatches) {
issues.push({
type: 'version-mismatch',
severity: 'warning',
description: `Version mismatch for ${mismatch.package}: ${mismatch.versions.join(', ')}`,
affectedProjects: mismatch.projects,
resolution: 'Align to single version across monorepo'
});
}
// Check for unnecessary dependencies
const unnecessaryDeps = await this.findUnnecessaryDependencies(projects);
for (const dep of unnecessaryDeps) {
issues.push({
type: 'unnecessary-dependency',
severity: 'info',
description: `Unnecessary dependency ${dep.package} in ${dep.project}`,
affectedProjects: [dep.project],
resolution: 'Remove unused dependency'
});
}
return issues;
}
async checkComplianceStatus(projects: ProjectInfo[]): Promise<Map<string, ComplianceStatus>> {
const complianceMap = new Map<string, ComplianceStatus>();
for (const project of projects) {
const team = this.getProjectTeam(project.name);
const teamConfig = this.teamMapping.teams[team];
if (teamConfig?.compliance) {
const status: ComplianceStatus = {
required: teamConfig.compliance,
status: new Map(),
lastChecked: new Date(),
issues: []
};
for (const standard of teamConfig.compliance) {
const compliance = await this.checkSpecificCompliance(project, standard);
status.status.set(standard, compliance);
if (!compliance.compliant) {
status.issues.push(...compliance.issues);
}
}
complianceMap.set(project.name, status);
}
}
return complianceMap;
}
async generateMonorepoReport(results: MonorepoAnalysisResult): Promise<string> {
const report = `
# 📊 Monorepo Analysis Report
**Generated**: ${new Date().toISOString()}
**Analysis Time**: ${results.summary.analysisTime}ms
**Projects Analyzed**: ${results.summary.totalProjects}
**Issues Found**: ${results.summary.issuesFound}
**Teams Affected**: ${results.summary.teamsAffected.size}
## 🎯 Executive Summary
### Quality Metrics
${this.generateQualityMetrics(results)}
### Security Status
${this.generateSecuritySummary(results)}
### Performance Overview
${this.generatePerformanceSummary(results)}
## 📈 Project Breakdown
${this.generateProjectBreakdown(results)}
## 🔗 Cross-Project Analysis
${this.generateCrossProjectSummary(results)}
## 🛡️ Compliance Status
${this.generateComplianceSummary(results)}
## 📋 Recommendations
${this.generateRecommendations(results)}
---
*Generated by Fluorite MCP Monorepo Analyzer*
`;
return report;
}
// Helper methods
private async discoverProjects(): Promise<ProjectInfo[]> {
const projects: ProjectInfo[] = [];
// Discover from monorepo structure
const structure = this.config.monorepo.structure;
for (const [category, items] of Object.entries(structure)) {
if (typeof items === 'object') {
for (const [name, config] of Object.entries(items)) {
const projectPath = path.join(category, name);
if (fs.existsSync(projectPath)) {
projects.push({
name,
path: projectPath,
category,
config
});
}
}
}
}
return projects;
}
private getProjectTeam(projectName: string): string {
const structure = this.config.monorepo.structure;
for (const [category, items] of Object.entries(structure)) {
if (typeof items === 'object' && items[projectName]) {
return items[projectName].team;
}
}
return 'unknown';
}
private getProjectFramework(projectName: string): string {
const structure = this.config.monorepo.structure;
for (const [category, items] of Object.entries(structure)) {
if (typeof items === 'object' && items[projectName]) {
return items[projectName].framework || 'auto-detect';
}
}
return 'auto-detect';
}
private getProjectCriticality(projectName: string): string {
const structure = this.config.monorepo.structure;
for (const [category, items] of Object.entries(structure)) {
if (typeof items === 'object' && items[projectName]) {
return items[projectName].criticality || 'medium';
}
}
return 'medium';
}
private getTeamRules(team: string): string[] {
const teamConfig = this.teamMapping.teams[team];
if (!teamConfig) return [];
const rules: string[] = [];
// Add framework-specific rules
for (const framework of teamConfig.frameworks) {
rules.push(`${framework}-best-practices`);
}
// Add focus-specific rules
for (const focus of teamConfig.focus) {
rules.push(`${focus}-standards`);
}
// Add compliance rules
if (teamConfig.compliance) {
for (const compliance of teamConfig.compliance) {
rules.push(`${compliance}-compliance`);
}
}
return rules;
}
private loadConfig(filePath: string): any {
try {
const content = fs.readFileSync(filePath, 'utf8');
// In real implementation, use yaml parser
return JSON.parse(content);
} catch (error) {
console.error(`Failed to load config ${filePath}:`, error);
return {};
}
}
// Additional helper methods would be implemented here...
}
// Usage
async function runMonorepoAnalysis() {
const analyzer = new MonorepoAnalyzer();
await analyzer.initialize();
const results = await analyzer.analyzeFullMonorepo();
const report = await analyzer.generateMonorepoReport(results);
fs.writeFileSync('monorepo-analysis-report.md', report);
console.log('📄 Report generated: monorepo-analysis-report.md');
}
// Types
interface ProjectInfo {
name: string;
path: string;
category: string;
config: any;
}
interface MonorepoAnalysisResult {
summary: {
totalProjects: number;
analysisTime: number;
issuesFound: number;
teamsAffected: Set<string>;
};
projectResults: Map<string, any>;
crossProjectIssues: CrossProjectIssue[];
securityFindings: any[];
performanceIssues: any[];
complianceStatus: Map<string, ComplianceStatus>;
}
interface CrossProjectIssue {
type: string;
severity: string;
description: string;
affectedProjects: string[];
resolution: string;
}
interface ComplianceStatus {
required: string[];
status: Map<string, any>;
lastChecked: Date;
issues: any[];
}
interface ProjectAnalysisResult {
project: ProjectInfo;
team?: string;
framework?: string;
criticality?: string;
analysis?: any;
issues?: any[];
teamRulesApplied?: string[];
success: boolean;
error?: string;
}
// Run analysis
if (require.main === module) {
runMonorepoAnalysis().catch(console.error);
}
Daily Monorepo Workflow:
# Morning team sync
npm run fluorite:daily-report
# Generates overnight analysis summary for team leads
# Pre-commit validation
npm run fluorite:validate-changes
# Only analyzes changed projects
# Weekly architecture review
npm run fluorite:architecture-review
# Deep analysis of cross-project dependencies
# Monthly compliance audit
npm run fluorite:compliance-audit
# Full compliance status across all teams
Results after 1 year:
- ✅ 95% reduction in cross-team integration issues
- ✅ 60% faster onboarding for new developers
- ✅ 100% compliance audit success rate
- ✅ 80% reduction in production bugs from integration issues
Cross-Team Collaboration
Multi-Vendor Development
Scenario: Large enterprise project with 3 external vendor teams plus internal team, building integrated platform.
Vendor Team Structure
Internal Team (Company Corp):
- 15 developers
- Frameworks: Next.js, PostgreSQL, Kubernetes
- Owns: Core platform, authentication, user management
Vendor A (TechSolutions Inc):
- 10 developers
- Frameworks: React, FastAPI, MongoDB
- Owns: Analytics dashboard, reporting system
Vendor B (DevPartners LLC):
- 8 developers
- Frameworks: Vue.js, Java Spring Boot, MySQL
- Owns: E-commerce module, payment processing
Vendor C (CodeCrafters Co):
- 5 developers
- Frameworks: React Native, Node.js, Redis
- Owns: Mobile app, real-time notifications
Cross-Vendor Configuration
# .fluorite/multi-vendor-config.yml
collaboration:
name: "Enterprise Integration Platform"
vendors:
internal:
name: "Company Corp Internal Team"
contact: "internal-dev@company.com"
frameworks: ["nextjs", "postgresql", "kubernetes"]
modules: ["core-platform", "authentication", "user-management"]
quality_gate: "strict"
vendor-a:
name: "TechSolutions Inc"
contact: "dev-team@techsolutions.com"
frameworks: ["react", "fastapi", "mongodb"]
modules: ["analytics", "reporting"]
quality_gate: "standard"
vendor-b:
name: "DevPartners LLC"
contact: "development@devpartners.com"
frameworks: ["vue", "spring-boot", "mysql"]
modules: ["ecommerce", "payments"]
quality_gate: "strict" # Payment processing requires strict
vendor-c:
name: "CodeCrafters Co"
contact: "team@codecrafters.co"
frameworks: ["react-native", "nodejs", "redis"]
modules: ["mobile-app", "notifications"]
quality_gate: "standard"
integration_standards:
api_contracts:
format: "openapi-3.0"
validation: "required"
versioning: "semantic"
authentication:
method: "jwt"
provider: "internal-auth-service"
scopes: "defined-per-module"
data_formats:
dates: "iso-8601"
currency: "iso-4217"
localization: "i18n-standard"
security:
https: "required"
cors: "configured"
rate_limiting: "per-vendor"
audit_logging: "required"
communication:
daily_standups: true
weekly_integration_review: true
monthly_architecture_review: true
channels:
slack: "#vendor-integration"
email: "integration-team@company.com"
documentation: "confluence.company.com/vendors"
quality_gates:
global:
api_compatibility: "required"
security_scan: "required"
integration_tests: "required"
per_vendor:
internal:
error_threshold: 0
coverage_threshold: 90
vendor-a:
error_threshold: 1
coverage_threshold: 80
vendor-b:
error_threshold: 0 # Payments critical
coverage_threshold: 95
vendor-c:
error_threshold: 2
coverage_threshold: 75
Shared API Contract Validation
// tools/api-contract-validator.ts
import { FluoriteIntegration } from '../lib/fluorite-integration';
import { OpenAPIValidator } from 'openapi-validator';
export class VendorIntegrationValidator {
private fluorite: FluoriteIntegration;
private apiSpecs: Map<string, any> = new Map();
constructor() {
this.fluorite = new FluoriteIntegration();
}
async initialize() {
await this.fluorite.initialize();
await this.loadApiSpecs();
}
async validateCrossVendorIntegration(): Promise<IntegrationValidationResult> {
console.log('🔗 Validating cross-vendor integration...');
const results: IntegrationValidationResult = {
apiCompatibility: new Map(),
securityCompliance: new Map(),
dataFormatAlignment: new Map(),
authenticationFlow: { valid: false, issues: [] },
overallStatus: 'unknown'
};
// Validate API contracts between vendors
await this.validateApiContracts(results);
// Check security compliance
await this.validateSecurityStandards(results);
// Validate data format consistency
await this.validateDataFormats(results);
// Check authentication flow
await this.validateAuthFlow(results);
// Determine overall status
results.overallStatus = this.calculateOverallStatus(results);
return results;
}
private async validateApiContracts(results: IntegrationValidationResult) {
const vendors = ['internal', 'vendor-a', 'vendor-b', 'vendor-c'];
for (let i = 0; i < vendors.length; i++) {
for (let j = i + 1; j < vendors.length; j++) {
const vendorA = vendors[i];
const vendorB = vendors[j];
const compatibility = await this.checkApiCompatibility(vendorA, vendorB);
results.apiCompatibility.set(`${vendorA}-${vendorB}`, compatibility);
}
}
}
private async checkApiCompatibility(vendorA: string, vendorB: string): Promise<CompatibilityResult> {
const specA = this.apiSpecs.get(vendorA);
const specB = this.apiSpecs.get(vendorB);
if (!specA || !specB) {
return {
compatible: false,
issues: [`Missing API spec for ${!specA ? vendorA : vendorB}`],
score: 0
};
}
const issues: string[] = [];
let score = 100;
// Check endpoint compatibility
const endpointIssues = this.validateEndpoints(specA, specB);
issues.push(...endpointIssues);
score -= endpointIssues.length * 10;
// Check data model compatibility
const dataModelIssues = this.validateDataModels(specA, specB);
issues.push(...dataModelIssues);
score -= dataModelIssues.length * 15;
// Check authentication compatibility
const authIssues = this.validateAuthMethods(specA, specB);
issues.push(...authIssues);
score -= authIssues.length * 20;
return {
compatible: score >= 80,
issues,
score: Math.max(0, score)
};
}
async generateIntegrationReport(results: IntegrationValidationResult): Promise<string> {
const report = `
# 🔗 Cross-Vendor Integration Report
**Generated**: ${new Date().toISOString()}
**Overall Status**: ${this.getStatusEmoji(results.overallStatus)} ${results.overallStatus.toUpperCase()}
## 📊 API Compatibility Matrix
${this.generateCompatibilityMatrix(results.apiCompatibility)}
## 🛡️ Security Compliance
${this.generateSecurityMatrix(results.securityCompliance)}
## 📋 Data Format Alignment
${this.generateDataFormatMatrix(results.dataFormatAlignment)}
## 🔐 Authentication Flow
**Status**: ${results.authenticationFlow.valid ? '✅ Valid' : '❌ Invalid'}
${results.authenticationFlow.issues.length > 0 ? '**Issues:**\n' + results.authenticationFlow.issues.map(issue => `- ${issue}`).join('\n') : ''}
## 🎯 Action Items
${this.generateActionItems(results)}
## 📈 Integration Health Score
${this.calculateHealthScore(results)}%
---
*Generated by Fluorite MCP Vendor Integration Validator*
`;
return report;
}
// Daily vendor coordination workflow
async runDailyCoordination(): Promise<void> {
console.log('🌅 Running daily vendor coordination...');
// 1. Validate all vendor changes from last 24 hours
const recentChanges = await this.getRecentChanges();
for (const change of recentChanges) {
console.log(`📊 Analyzing changes from ${change.vendor}...`);
// Run vendor-specific analysis
const analysis = await this.fluorite.analyzeProject(
change.path,
change.framework
);
// Check for breaking changes
const breakingChanges = await this.detectBreakingChanges(change, analysis);
if (breakingChanges.length > 0) {
await this.notifyAffectedVendors(change.vendor, breakingChanges);
}
}
// 2. Run integration tests
const integrationResults = await this.runCrossVendorTests();
// 3. Generate daily status report
const statusReport = await this.generateDailyStatusReport();
// 4. Send to all teams
await this.sendDailyReport(statusReport);
}
private async detectBreakingChanges(change: VendorChange, analysis: any): Promise<BreakingChange[]> {
const breakingChanges: BreakingChange[] = [];
// API breaking changes
if (change.affectedFiles.some(file => file.includes('api/') || file.includes('routes/'))) {
const apiChanges = await this.analyzeApiChanges(change);
breakingChanges.push(...apiChanges);
}
// Data model changes
if (change.affectedFiles.some(file => file.includes('models/') || file.includes('schemas/'))) {
const modelChanges = await this.analyzeDataModelChanges(change);
breakingChanges.push(...modelChanges);
}
// Authentication changes
if (change.affectedFiles.some(file => file.includes('auth/') || file.includes('security/'))) {
const authChanges = await this.analyzeAuthChanges(change);
breakingChanges.push(...authChanges);
}
return breakingChanges;
}
private async notifyAffectedVendors(sourceVendor: string, changes: BreakingChange[]): Promise<void> {
const affectedVendors = this.getAffectedVendors(changes);
for (const vendor of affectedVendors) {
const notification = {
from: sourceVendor,
to: vendor,
changes: changes.filter(c => c.affectedVendors.includes(vendor)),
timestamp: new Date(),
urgency: this.calculateUrgency(changes)
};
await this.sendVendorNotification(notification);
}
}
}
// Usage in vendor coordination
async function runVendorCoordination() {
const validator = new VendorIntegrationValidator();
await validator.initialize();
// Run daily coordination
await validator.runDailyCoordination();
// Run weekly integration validation
const results = await validator.validateCrossVendorIntegration();
const report = await validator.generateIntegrationReport(results);
console.log('📄 Integration report generated');
console.log(report);
}
// Types
interface IntegrationValidationResult {
apiCompatibility: Map<string, CompatibilityResult>;
securityCompliance: Map<string, ComplianceResult>;
dataFormatAlignment: Map<string, AlignmentResult>;
authenticationFlow: AuthFlowResult;
overallStatus: 'healthy' | 'warning' | 'critical' | 'unknown';
}
interface CompatibilityResult {
compatible: boolean;
issues: string[];
score: number;
}
interface VendorChange {
vendor: string;
path: string;
framework: string;
affectedFiles: string[];
timestamp: Date;
}
interface BreakingChange {
type: 'api' | 'data-model' | 'authentication' | 'security';
description: string;
affectedVendors: string[];
severity: 'low' | 'medium' | 'high' | 'critical';
migrationRequired: boolean;
}
Weekly Integration Review
#!/bin/bash
# scripts/weekly-vendor-review.sh
echo "📅 Weekly Vendor Integration Review"
echo "=================================="
# Run comprehensive validation
node tools/vendor-integration-validator.js
# Generate vendor performance metrics
echo "📊 Vendor Performance Metrics:"
echo "Internal Team: $(fluorite-mcp --catalog-stats | grep 'Quality Score')"
echo "Vendor A: $(curl -s https://vendor-a-metrics.api/quality)"
echo "Vendor B: $(curl -s https://vendor-b-metrics.api/quality)"
echo "Vendor C: $(curl -s https://vendor-c-metrics.api/quality)"
# Check integration test results
echo "🧪 Integration Test Results:"
npm run test:integration:vendor-a
npm run test:integration:vendor-b
npm run test:integration:vendor-c
# Generate action items
echo "📋 Action Items Generated:"
node tools/generate-vendor-action-items.js
# Send summary to all teams
echo "📧 Sending summary to all vendor teams..."
node tools/send-weekly-summary.js
Results after 6 months:
- ✅ 90% reduction in integration issues
- ✅ 50% faster cross-vendor feature development
- ✅ 95% API compatibility maintained
- ✅ Zero production outages from vendor integration
Production Deployment Scenarios
Blue-Green Deployment with Validation
Scenario: High-traffic e-commerce platform requiring zero-downtime deployments with comprehensive validation.
Production Deployment Pipeline
# .github/workflows/production-deployment.yml
name: Production Blue-Green Deployment
on:
push:
branches: [main]
tags: ['v*']
env:
FLUORITE_LOG_LEVEL: info
DEPLOYMENT_TIMEOUT: 1800 # 30 minutes
HEALTH_CHECK_TIMEOUT: 300 # 5 minutes
jobs:
pre-deployment-validation:
runs-on: ubuntu-latest
outputs:
deployment-strategy: ${{ steps.strategy.outputs.strategy }}
validation-passed: ${{ steps.validation.outputs.passed }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Fluorite MCP
run: npm install -g fluorite-mcp
- name: Production Readiness Check
id: validation
run: |
echo "🔍 Running production readiness validation..."
# Comprehensive static analysis
fluorite-mcp --static-analysis \
--project-path . \
--framework auto-detect \
--strict-mode true \
--predict-errors true \
--focus security,performance \
--max-issues 0
# Security scan
fluorite-mcp --static-analysis \
--security-scan high \
--compliance-check true \
--vulnerability-threshold critical
# Performance validation
fluorite-mcp --static-analysis \
--focus performance \
--analyze-bundle-size \
--performance-budget-check
echo "passed=true" >> $GITHUB_OUTPUT
- name: Determine Deployment Strategy
id: strategy
run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "strategy=blue-green" >> $GITHUB_OUTPUT
else
echo "strategy=canary" >> $GITHUB_OUTPUT
fi
build-production:
runs-on: ubuntu-latest
needs: pre-deployment-validation
if: needs.pre-deployment-validation.outputs.validation-passed == 'true'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install Dependencies
run: npm ci --only=production
- name: Build Application
run: |
export NODE_ENV=production
npm run build
- name: Build Optimization Analysis
run: |
fluorite-mcp --static-analysis \
--focus performance \
--analyze-bundle-size \
--output-format json > build-analysis.json
- name: Validate Build
run: |
# Check bundle size limits
BUNDLE_SIZE=$(cat build-analysis.json | jq '.bundleSize.total')
MAX_SIZE=5000000 # 5MB limit
if [ "$BUNDLE_SIZE" -gt "$MAX_SIZE" ]; then
echo "❌ Bundle size exceeds limit: ${BUNDLE_SIZE} > ${MAX_SIZE}"
exit 1
fi
echo "✅ Bundle size within limits: ${BUNDLE_SIZE}"
- name: Build Docker Image
run: |
docker build \
--tag production-app:${{ github.sha }} \
--tag production-app:latest \
--build-arg NODE_ENV=production \
.
- name: Container Security Scan
run: |
# Scan container for vulnerabilities
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image production-app:${{ github.sha }}
deploy-blue-green:
runs-on: ubuntu-latest
needs: [pre-deployment-validation, build-production]
if: needs.pre-deployment-validation.outputs.deployment-strategy == 'blue-green'
environment: production
steps:
- name: Determine Current Environment
id: current
run: |
CURRENT=$(kubectl get service production-service -o jsonpath='{.spec.selector.version}')
if [ "$CURRENT" = "blue" ]; then
echo "current=blue" >> $GITHUB_OUTPUT
echo "target=green" >> $GITHUB_OUTPUT
else
echo "current=green" >> $GITHUB_OUTPUT
echo "target=blue" >> $GITHUB_OUTPUT
fi
- name: Deploy to Target Environment
run: |
echo "🚀 Deploying to ${{ steps.current.outputs.target }} environment..."
# Update deployment with new image
kubectl set image deployment/production-${{ steps.current.outputs.target }} \
app=production-app:${{ github.sha }}
# Wait for rollout
kubectl rollout status deployment/production-${{ steps.current.outputs.target }} \
--timeout=${{ env.DEPLOYMENT_TIMEOUT }}s
- name: Health Check Target Environment
run: |
echo "🏥 Running health checks on ${{ steps.current.outputs.target }}..."
TARGET_URL="https://${{ steps.current.outputs.target }}.internal.company.com"
# Basic health check
for i in {1..30}; do
if curl -f "$TARGET_URL/health"; then
echo "✅ Health check passed"
break
fi
echo "⏳ Health check attempt $i/30..."
sleep 10
done
- name: Comprehensive Validation
run: |
echo "🧪 Running comprehensive validation..."
TARGET_URL="https://${{ steps.current.outputs.target }}.internal.company.com"
# Generate validation tests
fluorite-mcp --auto-spike \
--task "Generate health check and smoke tests for production deployment" \
--constraints '{"environment": "production", "target_url": "'$TARGET_URL'"}'
# Run smoke tests
npm run test:smoke -- --url="$TARGET_URL"
# Performance validation
npm run test:performance -- --url="$TARGET_URL"
# Security validation
npm run test:security -- --url="$TARGET_URL"
- name: Switch Traffic
if: success()
run: |
echo "🔄 Switching traffic to ${{ steps.current.outputs.target }}..."
# Update service selector
kubectl patch service production-service -p \
'{"spec":{"selector":{"version":"${{ steps.current.outputs.target }}"}}}'
echo "✅ Traffic switched successfully"
- name: Monitor New Environment
run: |
echo "📊 Monitoring new environment for 5 minutes..."
for i in {1..30}; do
# Check error rate
ERROR_RATE=$(curl -s "https://monitoring.company.com/api/error-rate" | jq '.current')
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
echo "❌ High error rate detected: $ERROR_RATE"
echo "🔄 Rolling back deployment..."
# Rollback
kubectl patch service production-service -p \
'{"spec":{"selector":{"version":"${{ steps.current.outputs.current }}"}}}'
exit 1
fi
echo "✅ Error rate normal: $ERROR_RATE"
sleep 10
done
- name: Cleanup Old Environment
if: success()
run: |
echo "🧹 Cleaning up ${{ steps.current.outputs.current }} environment..."
# Scale down old deployment
kubectl scale deployment/production-${{ steps.current.outputs.current }} --replicas=1
# Keep for quick rollback if needed
echo "✅ Old environment scaled down but preserved for rollback"
post-deployment:
runs-on: ubuntu-latest
needs: [deploy-blue-green]
if: always() && needs.deploy-blue-green.result == 'success'
steps:
- name: Post-Deployment Validation
run: |
echo "🔍 Running post-deployment validation..."
# Wait for metrics to stabilize
sleep 60
# Check key metrics
RESPONSE_TIME=$(curl -s "https://monitoring.company.com/api/response-time" | jq '.p95')
THROUGHPUT=$(curl -s "https://monitoring.company.com/api/throughput" | jq '.current')
ERROR_RATE=$(curl -s "https://monitoring.company.com/api/error-rate" | jq '.current')
echo "📊 Deployment Metrics:"
echo "Response Time (p95): ${RESPONSE_TIME}ms"
echo "Throughput: ${THROUGHPUT} req/s"
echo "Error Rate: ${ERROR_RATE}%"
# Validate metrics are within acceptable ranges
if (( $(echo "$RESPONSE_TIME > 500" | bc -l) )); then
echo "⚠️ High response time detected"
fi
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
echo "⚠️ Elevated error rate detected"
fi
- name: Update Monitoring Dashboards
run: |
# Generate monitoring dashboard for new deployment
fluorite-mcp --auto-spike \
--task "Generate Grafana dashboard for production monitoring" \
--constraints '{"version": "${{ github.sha }}", "environment": "production"}'
- name: Generate Deployment Report
run: |
cat > deployment-report.md << EOF
# 🚀 Production Deployment Report
**Deployment ID**: ${{ github.sha }}
**Timestamp**: $(date -u +"%Y-%m-%dT%H:%M:%SZ")
**Strategy**: Blue-Green
**Status**: ✅ Success
## Metrics
- **Response Time (p95)**: ${RESPONSE_TIME}ms
- **Throughput**: ${THROUGHPUT} req/s
- **Error Rate**: ${ERROR_RATE}%
## Changes Deployed
$(git log --oneline ${{ github.event.before }}..${{ github.sha }})
## Health Status
✅ All health checks passed
✅ Performance within SLA
✅ Security validation passed
EOF
- name: Notify Teams
run: |
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"🚀 Production deployment completed successfully!\n\n**Version**: `${{ github.sha }}`\n**Strategy**: Blue-Green\n**Response Time**: '$RESPONSE_TIME'ms\n**Error Rate**: '$ERROR_RATE'%\n\n✅ All metrics within SLA"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
Production Monitoring Integration
// tools/production-monitor.ts
import { FluoriteIntegration } from '../lib/fluorite-integration';
import { PrometheusMetrics } from '../lib/prometheus-metrics';
export class ProductionMonitor {
private fluorite: FluoriteIntegration;
private metrics: PrometheusMetrics;
constructor() {
this.fluorite = new FluoriteIntegration();
this.metrics = new PrometheusMetrics();
}
async initialize() {
await this.fluorite.initialize();
await this.metrics.initialize();
}
async startContinuousMonitoring(): Promise<void> {
console.log('📊 Starting continuous production monitoring...');
// Monitor every 30 seconds
setInterval(async () => {
try {
await this.runHealthCheck();
await this.checkPerformanceMetrics();
await this.validateSecurityStatus();
await this.checkErrorRates();
} catch (error) {
console.error('Monitor check failed:', error);
await this.handleMonitoringFailure(error);
}
}, 30000);
// Deep analysis every 5 minutes
setInterval(async () => {
await this.runDeepAnalysis();
}, 300000);
// Generate daily report
setInterval(async () => {
await this.generateDailyReport();
}, 86400000); // 24 hours
}
private async runHealthCheck(): Promise<void> {
const endpoints = [
'https://api.company.com/health',
'https://app.company.com/api/health',
'https://admin.company.com/health'
];
for (const endpoint of endpoints) {
try {
const response = await fetch(endpoint);
const health = await response.json();
this.metrics.recordHealthCheck(endpoint, health.status === 'healthy');
if (health.status !== 'healthy') {
await this.alertUnhealthyEndpoint(endpoint, health);
}
} catch (error) {
this.metrics.recordHealthCheck(endpoint, false);
await this.alertEndpointDown(endpoint, error);
}
}
}
private async checkPerformanceMetrics(): Promise<void> {
const metrics = await this.metrics.getCurrentMetrics();
// Check response time
if (metrics.responseTime.p95 > 500) {
await this.alertSlowResponse(metrics.responseTime);
}
// Check error rate
if (metrics.errorRate > 0.01) { // 1%
await this.alertHighErrorRate(metrics.errorRate);
}
// Check throughput
if (metrics.throughput < 100) {
await this.alertLowThroughput(metrics.throughput);
}
}
private async runDeepAnalysis(): Promise<void> {
console.log('🔍 Running deep production analysis...');
try {
// Analyze recent deployments
const recentDeployments = await this.getRecentDeployments();
for (const deployment of recentDeployments) {
const analysis = await this.fluorite.analyzeProject(
deployment.path,
deployment.framework
);
// Check for performance regressions
const regressions = await this.detectPerformanceRegressions(deployment, analysis);
if (regressions.length > 0) {
await this.alertPerformanceRegression(deployment, regressions);
}
// Check for new issues
const newIssues = await this.detectNewIssues(deployment, analysis);
if (newIssues.length > 0) {
await this.alertNewIssues(deployment, newIssues);
}
}
} catch (error) {
console.error('Deep analysis failed:', error);
}
}
private async generateDailyReport(): Promise<void> {
console.log('📄 Generating daily production report...');
const report = await this.compileDailyMetrics();
// Send to operations team
await this.sendDailyReport(report);
// Store for historical analysis
await this.storeDailyReport(report);
}
private async alertUnhealthyEndpoint(endpoint: string, health: any): Promise<void> {
const alert = {
level: 'warning',
title: 'Unhealthy Endpoint Detected',
message: `Endpoint ${endpoint} reported unhealthy status`,
details: health,
timestamp: new Date(),
runbook: 'https://docs.company.com/runbooks/unhealthy-endpoint'
};
await this.sendAlert(alert);
}
private async alertSlowResponse(responseTime: any): Promise<void> {
const alert = {
level: 'warning',
title: 'Slow Response Time',
message: `P95 response time is ${responseTime.p95}ms (threshold: 500ms)`,
details: responseTime,
timestamp: new Date(),
runbook: 'https://docs.company.com/runbooks/slow-response'
};
await this.sendAlert(alert);
}
private async sendAlert(alert: any): Promise<void> {
// Send to monitoring system
await fetch('https://monitoring.company.com/api/alerts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(alert)
});
// Send to Slack if critical
if (alert.level === 'critical') {
await fetch(process.env.SLACK_WEBHOOK_URL!, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `🚨 ${alert.title}: ${alert.message}`
})
});
}
}
}
// Start monitoring
if (require.main === module) {
const monitor = new ProductionMonitor();
monitor.initialize().then(() => {
monitor.startContinuousMonitoring();
console.log('✅ Production monitoring started');
});
}
Results after production deployment:
- ✅ Zero-downtime deployment achieved
- ✅ All performance metrics within SLA
- ✅ Comprehensive monitoring and alerting active
- ✅ Automated rollback capability validated
Troubleshooting Real-World Issues
Memory Leak in Production
Scenario: Production Node.js application experiencing gradual memory increase leading to out-of-memory crashes.
Issue Detection and Analysis
// tools/memory-leak-analyzer.ts
import { FluoriteIntegration } from '../lib/fluorite-integration';
import { execSync } from 'child_process';
import * as fs from 'fs';
export class MemoryLeakAnalyzer {
private fluorite: FluoriteIntegration;
constructor() {
this.fluorite = new FluoriteIntegration();
}
async initialize() {
await this.fluorite.initialize();
}
async investigateMemoryLeak(): Promise<MemoryLeakReport> {
console.log('🔍 Investigating memory leak...');
const report: MemoryLeakReport = {
timestamp: new Date(),
memoryTrend: await this.analyzeMemoryTrend(),
staticAnalysis: await this.runStaticAnalysis(),
codePatterns: await this.detectLeakyPatterns(),
heapSnapshot: await this.analyzeHeapSnapshot(),
recommendations: []
};
// Generate recommendations based on findings
report.recommendations = await this.generateRecommendations(report);
return report;
}
private async analyzeMemoryTrend(): Promise<MemoryTrend> {
console.log('📈 Analyzing memory trend...');
// Get memory metrics from the last 24 hours
const metrics = await this.getMemoryMetrics();
const trend: MemoryTrend = {
samples: metrics,
growthRate: this.calculateGrowthRate(metrics),
pattern: this.identifyPattern(metrics),
predictedCrash: this.predictCrashTime(metrics)
};
return trend;
}
private async runStaticAnalysis(): Promise<StaticAnalysisResult> {
console.log('🔬 Running static analysis for memory issues...');
// Run Fluorite analysis with memory focus
const analysis = await this.fluorite.analyzeProject('.', 'nodejs');
// Filter for memory-related issues
const memoryIssues = analysis.issues.filter(issue =>
issue.message.includes('memory') ||
issue.message.includes('leak') ||
issue.message.includes('closure') ||
issue.message.includes('circular reference')
);
return {
totalIssues: analysis.issues.length,
memoryRelatedIssues: memoryIssues.length,
issues: memoryIssues,
severity: this.calculateSeverity(memoryIssues)
};
}
private async detectLeakyPatterns(): Promise<LeakyPattern[]> {
console.log('🕵️ Detecting common memory leak patterns...');
const patterns: LeakyPattern[] = [];
// Pattern 1: Event listeners not removed
const eventListenerIssues = await this.findEventListenerLeaks();
patterns.push(...eventListenerIssues);
// Pattern 2: Timers not cleared
const timerIssues = await this.findTimerLeaks();
patterns.push(...timerIssues);
// Pattern 3: Circular references
const circularRefIssues = await this.findCircularReferences();
patterns.push(...circularRefIssues);
// Pattern 4: Large object accumulation
const objectAccumulation = await this.findObjectAccumulation();
patterns.push(...objectAccumulation);
return patterns;
}
private async findEventListenerLeaks(): Promise<LeakyPattern[]> {
const patterns: LeakyPattern[] = [];
// Use Fluorite to find event listener patterns
const result = await this.fluorite.validateCode(`
// Check for addEventListener without removeEventListener
const addEventPattern = /addEventListener\\s*\\(/g;
const removeEventPattern = /removeEventListener\\s*\\(/g;
`, 'javascript');
// Analyze code for event listener patterns
const files = await this.getJavaScriptFiles();
for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
const addEvents = (content.match(/addEventListener/g) || []).length;
const removeEvents = (content.match(/removeEventListener/g) || []).length;
if (addEvents > removeEvents) {
patterns.push({
type: 'event-listener-leak',
file,
description: `Potential event listener leak: ${addEvents} addEventListener vs ${removeEvents} removeEventListener`,
severity: 'medium',
lineNumber: this.findLineNumber(content, 'addEventListener'),
suggestedFix: 'Add corresponding removeEventListener calls'
});
}
}
return patterns;
}
private async findTimerLeaks(): Promise<LeakyPattern[]> {
const patterns: LeakyPattern[] = [];
const files = await this.getJavaScriptFiles();
for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
const setIntervals = (content.match(/setInterval/g) || []).length;
const clearIntervals = (content.match(/clearInterval/g) || []).length;
const setTimeouts = (content.match(/setTimeout/g) || []).length;
const clearTimeouts = (content.match(/clearTimeout/g) || []).length;
if (setIntervals > clearIntervals) {
patterns.push({
type: 'timer-leak',
file,
description: `Potential timer leak: ${setIntervals} setInterval vs ${clearIntervals} clearInterval`,
severity: 'high',
lineNumber: this.findLineNumber(content, 'setInterval'),
suggestedFix: 'Add corresponding clearInterval calls'
});
}
if (setTimeouts > clearTimeouts) {
patterns.push({
type: 'timer-leak',
file,
description: `Potential timer leak: ${setTimeouts} setTimeout vs ${clearTimeouts} clearTimeout`,
severity: 'medium',
lineNumber: this.findLineNumber(content, 'setTimeout'),
suggestedFix: 'Add corresponding clearTimeout calls'
});
}
}
return patterns;
}
private async analyzeHeapSnapshot(): Promise<HeapAnalysis> {
console.log('🧠 Analyzing heap snapshot...');
try {
// Generate heap snapshot
const snapshotPath = this.generateHeapSnapshot();
// Analyze the snapshot
const analysis = await this.parseHeapSnapshot(snapshotPath);
return analysis;
} catch (error) {
console.error('Heap snapshot analysis failed:', error);
return {
totalSize: 0,
objectCounts: new Map(),
retainerTrees: [],
suspiciousObjects: []
};
}
}
private generateHeapSnapshot(): string {
const snapshotPath = `/tmp/heap-${Date.now()}.heapsnapshot`;
// Use Node.js built-in heapdump
execSync(`node -e "
const v8 = require('v8');
const fs = require('fs');
const snapshot = v8.writeHeapSnapshot('${snapshotPath}');
console.log('Heap snapshot written to ${snapshotPath}');
"`);
return snapshotPath;
}
private async generateRecommendations(report: MemoryLeakReport): Promise<string[]> {
const recommendations: string[] = [];
// Based on static analysis
if (report.staticAnalysis.memoryRelatedIssues > 0) {
recommendations.push('Address memory-related issues found in static analysis');
}
// Based on patterns
const eventListenerLeaks = report.codePatterns.filter(p => p.type === 'event-listener-leak');
if (eventListenerLeaks.length > 0) {
recommendations.push(`Fix ${eventListenerLeaks.length} potential event listener leaks`);
}
const timerLeaks = report.codePatterns.filter(p => p.type === 'timer-leak');
if (timerLeaks.length > 0) {
recommendations.push(`Fix ${timerLeaks.length} potential timer leaks`);
}
// Based on memory trend
if (report.memoryTrend.growthRate > 10) { // 10MB/hour
recommendations.push('Investigate high memory growth rate');
}
// Based on heap analysis
if (report.heapSnapshot.suspiciousObjects.length > 0) {
recommendations.push('Investigate suspicious objects in heap snapshot');
}
return recommendations;
}
async generateMemoryLeakReport(report: MemoryLeakReport): Promise<string> {
const reportContent = `
# 🧠 Memory Leak Investigation Report
**Generated**: ${report.timestamp.toISOString()}
**Status**: ${this.determineStatus(report)}
## 📈 Memory Trend Analysis
**Growth Rate**: ${report.memoryTrend.growthRate.toFixed(2)} MB/hour
**Pattern**: ${report.memoryTrend.pattern}
**Predicted Crash**: ${report.memoryTrend.predictedCrash?.toISOString() || 'Unknown'}
## 🔬 Static Analysis Results
**Total Issues**: ${report.staticAnalysis.totalIssues}
**Memory-Related Issues**: ${report.staticAnalysis.memoryRelatedIssues}
**Severity**: ${report.staticAnalysis.severity}
### Issues Found:
${report.staticAnalysis.issues.map(issue => `- **${issue.severity.toUpperCase()}**: ${issue.message}`).join('\n')}
## 🕵️ Leak Pattern Detection
**Patterns Found**: ${report.codePatterns.length}
${report.codePatterns.map(pattern => `
### ${pattern.type}
- **File**: ${pattern.file}
- **Line**: ${pattern.lineNumber}
- **Description**: ${pattern.description}
- **Severity**: ${pattern.severity}
- **Fix**: ${pattern.suggestedFix}
`).join('\n')}
## 🧠 Heap Analysis
**Total Heap Size**: ${(report.heapSnapshot.totalSize / 1024 / 1024).toFixed(2)} MB
**Suspicious Objects**: ${report.heapSnapshot.suspiciousObjects.length}
## 🎯 Recommendations
${report.recommendations.map(rec => `- ${rec}`).join('\n')}
## 🛠️ Next Steps
1. **Immediate**: Fix high-severity timer and event listener leaks
2. **Short-term**: Address all identified patterns
3. **Long-term**: Implement memory monitoring and alerts
---
*Generated by Fluorite MCP Memory Leak Analyzer*
`;
return reportContent;
}
// Helper methods
private async getJavaScriptFiles(): Promise<string[]> {
const files: string[] = [];
// Find all JS/TS files
const findCommand = 'find . -type f \\( -name "*.js" -o -name "*.ts" \\) ! -path "./node_modules/*"';
const output = execSync(findCommand, { encoding: 'utf8' });
return output.trim().split('\n').filter(file => file.length > 0);
}
private findLineNumber(content: string, pattern: string): number {
const lines = content.split('\n');
for (let i = 0; i < lines.length; i++) {
if (lines[i].includes(pattern)) {
return i + 1;
}
}
return 0;
}
private calculateGrowthRate(metrics: MemoryMetric[]): number {
if (metrics.length < 2) return 0;
const first = metrics[0];
const last = metrics[metrics.length - 1];
const timeDiff = (last.timestamp.getTime() - first.timestamp.getTime()) / (1000 * 60 * 60); // hours
const memoryDiff = (last.memoryUsage - first.memoryUsage) / (1024 * 1024); // MB
return memoryDiff / timeDiff;
}
}
// Usage
async function investigateMemoryLeak() {
const analyzer = new MemoryLeakAnalyzer();
await analyzer.initialize();
const report = await analyzer.investigateMemoryLeak();
const reportContent = await analyzer.generateMemoryLeakReport(report);
fs.writeFileSync('memory-leak-report.md', reportContent);
console.log('📄 Memory leak report generated: memory-leak-report.md');
// Print immediate recommendations
console.log('\n🎯 Immediate Recommendations:');
report.recommendations.forEach(rec => console.log(`- ${rec}`));
}
// Types
interface MemoryLeakReport {
timestamp: Date;
memoryTrend: MemoryTrend;
staticAnalysis: StaticAnalysisResult;
codePatterns: LeakyPattern[];
heapSnapshot: HeapAnalysis;
recommendations: string[];
}
interface MemoryTrend {
samples: MemoryMetric[];
growthRate: number;
pattern: string;
predictedCrash?: Date;
}
interface LeakyPattern {
type: string;
file: string;
description: string;
severity: string;
lineNumber: number;
suggestedFix: string;
}
interface MemoryMetric {
timestamp: Date;
memoryUsage: number;
processId: number;
}
if (require.main === module) {
investigateMemoryLeak().catch(console.error);
}
Resolution Process:
- Immediate Action: Scale up instances to handle load
- Investigation: Run memory leak analyzer
- Fix Implementation: Address identified patterns
- Verification: Deploy fixes and monitor
- Prevention: Add memory monitoring alerts
Results:
- ✅ Memory leak root cause identified within 2 hours
- ✅ Fix deployed reducing memory growth by 95%
- ✅ Monitoring alerts prevent future occurrences
- ✅ No production downtime during investigation
This comprehensive use cases and examples documentation provides practical, real-world scenarios that teams can directly implement and adapt to their specific needs. Each scenario includes detailed configurations, code examples, and measurable outcomes to demonstrate the value of Fluorite MCP integration.