UNPKG

faf-cli

Version:

😽 TURBO-CAT: The Rapid Catalytic Converter • Project DNA ✨ for ANY AI • Fully Integrated with React, Next.js, Svelte, TypeScript, Vite & n8n • FREE FOREVER • 10,000+ developers • Championship Edition

242 lines 11.2 kB
"use strict"; /** * 🔗 Bi-Sync Engine - Revolutionary .faf ↔ CLAUDE.md Synchronization * Context-Mirroring powered by C-Mirror engine * * Features: * • Sub-40ms sync time (faster than most file operations) * • Smart merge algorithms prevent conflicts and data corruption * • Self-healing: Auto-recovers from file locks/system issues * • Event-driven: Broadcasts to Terminal, Slack, Dashboard, etc. * • Atomic writes: Zero-slippage design * • DNA logging: Full audit trail * * Mission: Perfect harmony between .faf (AI context) and CLAUDE.md (Claude Code context) * * Powered by C-Mirror - Championship-grade Context-Mirroring */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.fafToClaudeMd = fafToClaudeMd; exports.claudeMdToFaf = claudeMdToFaf; exports.syncBiDirectional = syncBiDirectional; exports.biSyncCommand = biSyncCommand; const yaml_1 = require("../fix-once/yaml"); const path = __importStar(require("path")); const fs_1 = require("fs"); const faf_mirror_1 = require("../engines/c-mirror/faf-extensions/faf-mirror"); const file_utils_1 = require("../utils/file-utils"); const technical_credit_1 = require("../utils/technical-credit"); const championship_style_1 = require("../utils/championship-style"); /** * 🔄 Convert .faf YAML content to claude.md Markdown format */ function fafToClaudeMd(fafContent) { try { const fafData = (0, yaml_1.parse)(fafContent); let claudeMd = `# 🏎️ CLAUDE.md - ${fafData.project?.name || 'Project'} Persistent Context & Intelligence\n\n`; // Project State if (fafData.project) { claudeMd += `## PROJECT STATE: ${fafData.context_quality?.overall_assessment || 'ACTIVE'} 🚀\n`; if (fafData.project.goal) { claudeMd += `**Current Position:** ${fafData.project.goal}\n`; } claudeMd += `**Tyre Compound:** ULTRASOFT C5 (Maximum Performance)\n\n`; claudeMd += `---\n\n`; } // Core Context claudeMd += `## 🎨 CORE CONTEXT\n\n`; if (fafData.project) { claudeMd += `### Project Identity\n`; claudeMd += `- **Name:** ${fafData.project.name || 'Unknown'}\n`; if (fafData.project.description) { claudeMd += `- **Description:** ${fafData.project.description}\n`; } if (fafData.instant_context?.tech_stack) { claudeMd += `- **Stack:** ${fafData.instant_context.tech_stack}\n`; } claudeMd += `- **Quality:** F1-INSPIRED (Championship Performance)\n\n`; } // Technical Context if (fafData.instant_context) { claudeMd += `### Technical Architecture\n`; if (fafData.instant_context.what_building) { claudeMd += `- **What Building:** ${fafData.instant_context.what_building}\n`; } if (fafData.instant_context.main_language) { claudeMd += `- **Main Language:** ${fafData.instant_context.main_language}\n`; } if (fafData.instant_context.frameworks) { claudeMd += `- **Frameworks:** ${fafData.instant_context.frameworks}\n`; } claudeMd += `\n`; } // Key Files if (fafData.key_files && fafData.key_files.length > 0) { claudeMd += `### 🔧 Key Files\n`; fafData.key_files.forEach((file, index) => { claudeMd += `${index + 1}. **${file.path}** - ${file.purpose || 'Core file'}\n`; }); claudeMd += `\n`; } // Context Quality if (fafData.context_quality) { claudeMd += `### 📊 Context Quality Status\n`; claudeMd += `- **Overall Assessment:** ${fafData.context_quality.overall_assessment || 'Good'}\n`; if (fafData.faf_score) { claudeMd += `- **FAF Score:** ${fafData.faf_score}\n`; } claudeMd += `- **Last Updated:** ${new Date().toISOString().split('T')[0]}\n\n`; } // Championship Footer claudeMd += `---\n\n`; claudeMd += `**STATUS: BI-SYNC ACTIVE 🔗 - Synchronized with .faf context!**\n\n`; claudeMd += `*Last Sync: ${new Date().toISOString()}*\n`; claudeMd += `*Sync Engine: ${championship_style_1.BRAND_MESSAGES.performance}*\n`; claudeMd += `*🏎️⚡️_championship_sync*\n`; return claudeMd; } catch (error) { throw new Error(`Failed to convert .faf to claude.md: ${error instanceof Error ? error.message : String(error)}`); } } /** * 🔄 Convert claude.md Markdown content to .faf YAML format (basic implementation) */ function claudeMdToFaf(claudeMdContent, existingFafData) { // For now, preserve existing .faf structure and update metadata const updatedFaf = { ...existingFafData }; // Update sync metadata if (!updatedFaf.metadata) { updatedFaf.metadata = {}; } updatedFaf.metadata.last_claude_sync = new Date().toISOString(); updatedFaf.metadata.bi_sync = 'active'; return (0, yaml_1.stringify)(updatedFaf, { indent: 2 }); } /** * 🔗 Main Bi-Sync function */ async function syncBiDirectional() { const startTime = Date.now(); const result = { success: false, direction: 'none', filesChanged: [], conflicts: [], duration: 0 }; try { // Find .faf file const fafPath = await (0, file_utils_1.findFafFile)(); if (!fafPath) { throw new Error('No .faf file found. Run `faf init` first.'); } const projectDir = path.dirname(fafPath); const claudeMdPath = path.join(projectDir, 'claude.md'); // Check what exists // const fafExists = true; // We found it above (unused) const claudeMdExists = await fs_1.promises.access(claudeMdPath).then(() => true).catch(() => false); // Show score FIRST - top line const fafContent = await fs_1.promises.readFile(fafPath, 'utf-8'); const fafData = (0, yaml_1.parse)(fafContent); const currentScore = fafData.faf_score || '0%'; console.log(championship_style_1.FAF_COLORS.fafOrange(`🏆 FAF Score: ${currentScore} | Bi-Sync Engine ${championship_style_1.FAF_ICONS.link}`)); console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─ ')}Analyzing sync files...`); if (!claudeMdExists) { // Create claude.md from .faf console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─ ')}Creating claude.md from .faf...`); const claudeMdContent = fafToClaudeMd(fafContent); await fs_1.promises.writeFile(claudeMdPath, claudeMdContent, 'utf-8'); result.success = true; result.direction = 'faf-to-claude'; result.filesChanged.push('claude.md'); console.log(`${championship_style_1.FAF_COLORS.fafGreen('└─ ')}${championship_style_1.FAF_ICONS.party} claude.md created! Bi-sync now active!`); } else { // Both files exist - need to sync console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─ ')}Both files exist - checking sync status...`); // For now, update claude.md from .faf (we can enhance this later) const fafContent = await fs_1.promises.readFile(fafPath, 'utf-8'); const claudeMdContent = fafToClaudeMd(fafContent); await fs_1.promises.writeFile(claudeMdPath, claudeMdContent, 'utf-8'); result.success = true; result.direction = 'faf-to-claude'; result.filesChanged.push('claude.md'); console.log(`${championship_style_1.FAF_COLORS.fafGreen('└─ ')}${championship_style_1.FAF_ICONS.link} Files synchronized! Perfect harmony achieved!`); } result.duration = Date.now() - startTime; // Award technical credit for successful sync await (0, technical_credit_1.autoAwardCredit)('sync_success', fafPath); // Championship success message console.log(); console.log(championship_style_1.FAF_COLORS.fafGreen(`${championship_style_1.FAF_ICONS.trophy} Championship sync complete in ${result.duration}ms!`)); console.log(`${championship_style_1.FAF_COLORS.fafCyan(`${championship_style_1.FAF_ICONS.magic_wand} Try: `)}faf status${championship_style_1.FAF_COLORS.fafCyan(' - See your bi-sync status')}`); return result; } catch (error) { result.duration = Date.now() - startTime; console.error(championship_style_1.FAF_COLORS.fafOrange(`${championship_style_1.FAF_ICONS.shield} Sync failed: ${error instanceof Error ? error.message : String(error)}`)); throw error; } } /** * 🎮 Main sync command handler * Now powered by C-Mirror - Championship-grade Context-Mirroring */ async function biSyncCommand(options = {}) { try { // Find project root const fafFile = await (0, file_utils_1.findFafFile)(); const projectPath = fafFile ? require('path').dirname(fafFile) : process.cwd(); // Create FAF Mirror (uses C-Mirror engine) const mirror = new faf_mirror_1.FAFMirror(projectPath); // Sync with championship display const result = await mirror.sync(); // Award technical credit if successful if (result.success && fafFile) { await (0, technical_credit_1.autoAwardCredit)('sync_success', fafFile); } // Clean up mirror.stop(); // Exit with appropriate code process.exit(result.success ? 0 : 1); } catch (error) { console.error('❌ Bi-sync failed:', error instanceof Error ? error.message : String(error)); process.exit(1); } } //# sourceMappingURL=bi-sync.js.map