Files
wifi-densepose/npm/packages/ruvector-extensions/docs/TEMPORAL_QUICKSTART.md
ruv d803bfe2b1 Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
2026-02-28 14:39:40 -05:00

7.4 KiB

Temporal Tracking - Quick Start Guide

Get started with temporal tracking in 5 minutes!

Installation

npm install ruvector-extensions

Basic Usage

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

// 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

// 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

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

// 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

// 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

tracker.trackChange({
  type: ChangeType.ADDITION,
  path: 'nodes.NewType',
  before: null,  // Was nothing
  after: { ... }, // Now exists
  timestamp: Date.now()
});

Modification

tracker.trackChange({
  type: ChangeType.MODIFICATION,
  path: 'config.maxUsers',
  before: 100,    // Was 100
  after: 500,     // Now 500
  timestamp: Date.now()
});

Deletion

tracker.trackChange({
  type: ChangeType.DELETION,
  path: 'deprecated.feature',
  before: { ... }, // Was this
  after: null,     // Now gone
  timestamp: Date.now()
});

Event Listeners

// 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

// 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

// 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

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

// ❌ 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

// 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

// 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

// Keep last 50 versions + important ones
setInterval(() => {
  tracker.pruneVersions(50, ['production', 'checkpoint']);
}, 7 * 24 * 60 * 60 * 1000); // Weekly

Complete Example

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

Support


Happy tracking! 🚀