scai
Version:
> **AI-powered CLI for local code analysis, commit message suggestions, and natural-language queries.** 100% local, private, GDPR-friendly, made in Denmark/EU with ❤️.
79 lines (78 loc) • 2.84 kB
JavaScript
import fs from 'fs';
import path from 'path';
import lockfile from 'proper-lockfile';
import readline from 'readline';
import { backupScaiFolder } from '../db/backup.js';
import { getDbPathForRepo, getDbForRepo } from '../db/client.js';
import chalk from 'chalk';
export async function resetDatabase() {
const dbPath = getDbPathForRepo();
console.log(`⚠️ You are about to delete the database at: ${dbPath}`);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const confirm = await new Promise((resolve) => {
rl.question('Are you sure you want to proceed? (y/N): ', (answer) => {
rl.close();
resolve(answer.trim().toLowerCase() === 'y');
});
});
if (!confirm) {
console.log('❌ Reset aborted. Database was not deleted.');
return;
}
console.log('🔁 Backing up existing .scai folder...');
await backupScaiFolder();
// Close the DB connection
try {
const db = getDbForRepo();
db.close();
console.log('🔒 Closed SQLite database connection.');
}
catch (err) {
console.warn('⚠️ Could not close database:', err instanceof Error ? err.message : err);
}
// Release lockfile if present
try {
const releaseLock = await lockfile.unlock(dbPath).catch(() => null);
if (releaseLock) {
console.log('🔓 Released database lock.');
}
}
catch (err) {
console.warn('⚠️ Failed to release database lock:', err instanceof Error ? err.message : err);
}
// Delete DB and related files
const dbDir = path.dirname(dbPath);
const dbBase = path.basename(dbPath);
const dbPrefix = dbBase.replace(/\.sqlite$/, '');
const filesToDelete = [
`${dbPath}`,
path.join(dbDir, `${dbPrefix}.sqlite-wal`),
path.join(dbDir, `${dbPrefix}.sqlite-shm`),
];
const lockDir = `${dbPath}.lock`;
for (const file of filesToDelete) {
if (fs.existsSync(file)) {
try {
fs.unlinkSync(file);
console.log(`🧹 Deleted ${path.basename(file)}`);
}
catch (err) {
console.error(`❌ Failed to delete ${file}:`, err instanceof Error ? err.message : err);
}
}
}
// Clean up lock directory
if (fs.existsSync(lockDir)) {
try {
fs.rmSync(lockDir, { recursive: true, force: true });
console.log('🧹 Removed leftover lock directory.');
}
catch (err) {
console.warn('⚠️ Failed to remove lock directory:', err instanceof Error ? err.message : err);
}
}
console.log('✅ Database has been fully reset. ' + chalk.yellow('You can now re-run: scai index start'));
}