#!/usr/bin/env node // migrate-ai-foundry.mjs — One-shot migration: back up data/, remap registry // keys ai-foundry -> foundry (+ 2 probed DEAD targets), migrate reserved schema // fields, write atomically. Idempotent: re-running finds nothing to remap. // Usage: node migrate-ai-foundry.mjs import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { loadRegistry, saveRegistry } from './lib/registry-io.mjs'; import { backupDir } from './lib/backup.mjs'; import { migrateRegistry } from './lib/registry-migrate.mjs'; const __dirname = dirname(fileURLToPath(import.meta.url)); const DATA_DIR = join(__dirname, 'data'); const PLUGIN_ROOT = join(__dirname, '..', '..'); const BACKUP_ROOT = join(PLUGIN_ROOT, '.kb-backup'); const registry = loadRegistry(DATA_DIR); const before = Object.keys(registry.urls).length; const { backupPath } = backupDir(DATA_DIR, BACKUP_ROOT); console.log(`Backed up data/ -> ${backupPath}`); const { registry: migrated, stats } = migrateRegistry(registry); const after = Object.keys(migrated.urls).length; saveRegistry(migrated, DATA_DIR); const remainingAiFoundry = Object.keys(migrated.urls) .filter((u) => u.includes('/azure/ai-foundry/')).length; console.log('=== ai-foundry -> foundry remap ==='); console.log(`URLs: ${before} -> ${after} (collisions merged: ${stats.collisions})`); console.log(`Remapped: ${stats.remapped} (DEAD explicit targets: ${stats.deadRemapped})`); console.log(`Remaining ai-foundry keys: ${remainingAiFoundry} (expect 0)`);