UNPKG

ruvector-extensions

Version:

Advanced features for ruvector: embeddings, UI, exports, temporal tracking, and persistence

354 lines (274 loc) 7.58 kB
# Temporal Tracking - Quick Start Guide Get started with temporal tracking in 5 minutes! ## Installation ```bash npm install ruvector-extensions ``` ## Basic Usage ```typescript import { TemporalTracker, ChangeType } from 'ruvector-extensions'; // Create tracker const tracker = new TemporalTracker(); // Track a change tracker.trackChange({ type: ChangeType.ADDITION, path: 'nodes.User', before: null, after: { name: 'User', properties: ['id', 'name', 'email'] }, timestamp: Date.now() }); // Create version const v1 = await tracker.createVersion({ description: 'Initial user schema', tags: ['v1.0'] }); console.log('Created version:', v1.id); ``` ## Common Operations ### 1. Track Multiple Changes ```typescript // Add User node tracker.trackChange({ type: ChangeType.ADDITION, path: 'nodes.User', before: null, after: { name: 'User', properties: ['id', 'name'] }, timestamp: Date.now() }); // Add FOLLOWS edge tracker.trackChange({ type: ChangeType.ADDITION, path: 'edges.FOLLOWS', before: null, after: { from: 'User', to: 'User' }, timestamp: Date.now() }); // Create version with both changes const version = await tracker.createVersion({ description: 'Social graph schema', tags: ['v1.0', 'production'] }); ``` ### 2. Time-Travel Queries ```typescript // Query state at specific time const yesterday = Date.now() - 86400000; const pastState = await tracker.queryAtTimestamp(yesterday); console.log('Database state 24h ago:', pastState); // Query state at specific version const stateAtV1 = await tracker.queryAtTimestamp({ versionId: v1.id }); ``` ### 3. Compare Versions ```typescript const diff = await tracker.compareVersions(v1.id, v2.id); console.log('Changes between versions:'); console.log(`Added: ${diff.summary.additions}`); console.log(`Modified: ${diff.summary.modifications}`); console.log(`Deleted: ${diff.summary.deletions}`); diff.changes.forEach(change => { console.log(`${change.type}: ${change.path}`); }); ``` ### 4. Revert to Previous Version ```typescript // Something went wrong, revert! const revertVersion = await tracker.revertToVersion(v1.id); console.log('Reverted to:', v1.description); console.log('Created revert version:', revertVersion.id); ``` ### 5. List Versions ```typescript // All versions const allVersions = tracker.listVersions(); // Production versions only const prodVersions = tracker.listVersions(['production']); allVersions.forEach(v => { console.log(`${v.description} - ${v.tags.join(', ')}`); }); ``` ## Change Types ### Addition ```typescript tracker.trackChange({ type: ChangeType.ADDITION, path: 'nodes.NewType', before: null, // Was nothing after: { ... }, // Now exists timestamp: Date.now() }); ``` ### Modification ```typescript tracker.trackChange({ type: ChangeType.MODIFICATION, path: 'config.maxUsers', before: 100, // Was 100 after: 500, // Now 500 timestamp: Date.now() }); ``` ### Deletion ```typescript tracker.trackChange({ type: ChangeType.DELETION, path: 'deprecated.feature', before: { ... }, // Was this after: null, // Now gone timestamp: Date.now() }); ``` ## Event Listeners ```typescript // Listen for version creation tracker.on('versionCreated', (version) => { console.log(`New version: ${version.description}`); notifyTeam(`Version ${version.description} deployed`); }); // Listen for reverts tracker.on('versionReverted', (from, to) => { console.log(`⚠️ Database reverted!`); alertOps(`Reverted from ${from} to ${to}`); }); // Listen for changes tracker.on('changeTracked', (change) => { console.log(`Change: ${change.type} at ${change.path}`); }); ``` ## Backup & Restore ```typescript // Export backup const backup = tracker.exportBackup(); saveToFile('backup.json', JSON.stringify(backup)); // Restore backup const backup = JSON.parse(readFromFile('backup.json')); tracker.importBackup(backup); ``` ## Storage Management ```typescript // Get storage stats const stats = tracker.getStorageStats(); console.log(`Versions: ${stats.versionCount}`); console.log(`Size: ${(stats.estimatedSizeBytes / 1024).toFixed(2)} KB`); // Prune old versions (keep last 10 + important ones) tracker.pruneVersions(10, ['production', 'baseline']); ``` ## Visualization ```typescript const vizData = tracker.getVisualizationData(); // Timeline vizData.timeline.forEach(item => { console.log(`${item.timestamp}: ${item.description}`); }); // Hotspots (most changed paths) vizData.hotspots.forEach(({ path, changeCount }) => { console.log(`${path}: ${changeCount} changes`); }); // Use with D3.js const graph = vizData.versionGraph; d3Graph.nodes(graph.nodes).links(graph.edges); ``` ## Best Practices ### 1. Use Meaningful Descriptions ```typescript // ❌ Bad await tracker.createVersion({ description: 'Update' }); // ✅ Good await tracker.createVersion({ description: 'Add email verification to user registration', tags: ['feature', 'auth'], author: 'developer@company.com' }); ``` ### 2. Tag Your Versions ```typescript // Development await tracker.createVersion({ description: 'Work in progress', tags: ['dev', 'unstable'] }); // Production await tracker.createVersion({ description: 'Stable release v2.0', tags: ['production', 'stable', 'v2.0'] }); ``` ### 3. Create Checkpoints ```typescript // Before risky operation const checkpoint = await tracker.createVersion({ description: 'Pre-migration checkpoint', tags: ['checkpoint', 'safe-point'] }); try { performRiskyMigration(); } catch (error) { await tracker.revertToVersion(checkpoint.id); } ``` ### 4. Prune Regularly ```typescript // Keep last 50 versions + important ones setInterval(() => { tracker.pruneVersions(50, ['production', 'checkpoint']); }, 7 * 24 * 60 * 60 * 1000); // Weekly ``` ## Complete Example ```typescript import { TemporalTracker, ChangeType } from 'ruvector-extensions'; async function main() { const tracker = new TemporalTracker(); // Listen for events tracker.on('versionCreated', (v) => { console.log(`✓ Version ${v.description} created`); }); // Initial schema tracker.trackChange({ type: ChangeType.ADDITION, path: 'nodes.User', before: null, after: { name: 'User', properties: ['id', 'name'] }, timestamp: Date.now() }); const v1 = await tracker.createVersion({ description: 'Initial schema', tags: ['v1.0'] }); // Enhance schema tracker.trackChange({ type: ChangeType.MODIFICATION, path: 'nodes.User.properties', before: ['id', 'name'], after: ['id', 'name', 'email', 'createdAt'], timestamp: Date.now() }); const v2 = await tracker.createVersion({ description: 'Enhanced user fields', tags: ['v1.1'] }); // Compare changes const diff = await tracker.compareVersions(v1.id, v2.id); console.log('Changes:', diff.summary); // Time-travel const stateAtV1 = await tracker.queryAtTimestamp(v1.timestamp); console.log('State at v1:', stateAtV1); // If needed, revert if (somethingWentWrong) { await tracker.revertToVersion(v1.id); } // Backup const backup = tracker.exportBackup(); console.log(`Backed up ${backup.versions.length} versions`); } main().catch(console.error); ``` ## Next Steps - Read the [full API documentation](./TEMPORAL.md) - See [complete examples](../src/examples/temporal-example.ts) - Check [implementation details](./TEMPORAL_SUMMARY.md) ## Support - Documentation: https://github.com/ruvnet/ruvector - Issues: https://github.com/ruvnet/ruvector/issues --- Happy tracking! 🚀