code icon Code

Delete Workspace Contents

Deletes files in skills/sauna and documents

Source Code

import fs from "fs";
import path from "path";

const [skillsPath, documentsPath, excludeSkillId] = process.argv.slice(2);

if (!skillsPath || !documentsPath) {
  console.error("Usage: skillsPath documentsPath [excludeSkillId]");
  process.exit(1);
}

/**
 * Recursively delete a directory
 */
function deleteDir(dir) {
  if (!fs.existsSync(dir)) return 0;

  let count = 0;
  const entries = fs.readdirSync(dir, { withFileTypes: true });

  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);
    if (entry.isDirectory()) {
      count += deleteDir(fullPath);
      fs.rmdirSync(fullPath);
    } else {
      fs.unlinkSync(fullPath);
      count++;
    }
  }

  return count;
}

/**
 * Check if a directory contains the skill to preserve
 */
function containsPreservedSkill(dir, excludedSkillName) {
  if (!excludedSkillName) return false;
  if (!fs.existsSync(dir)) return false;

  const files = fs.readdirSync(dir);
  return files.some((f) => f.includes(excludedSkillName));
}

try {
  console.log("Starting workspace reset...\n");

  let deletedSkills = 0;
  let deletedDocuments = 0;
  let preservedSkill = null;

  // Extract skill name from ID for matching
  const excludedSkillName = excludeSkillId ? excludeSkillId.replace("skill:", "") : null;

  // Delete skills/sauna contents
  if (fs.existsSync(skillsPath)) {
    const skillItems = fs.readdirSync(skillsPath);

    for (const item of skillItems) {
      const itemPath = path.join(skillsPath, item);
      const stats = fs.statSync(itemPath);

      if (stats.isDirectory()) {
        if (containsPreservedSkill(itemPath, excludedSkillName)) {
          preservedSkill = item;
          console.log(`✓ Preserved: ${item}`);
          continue;
        }

        const count = deleteDir(itemPath);
        fs.rmdirSync(itemPath);
        console.log(`✗ Deleted skill: ${item} (${count} files)`);
        deletedSkills++;
      } else {
        fs.unlinkSync(itemPath);
        console.log(`✗ Deleted file: ${item}`);
        deletedSkills++;
      }
    }
  }

  // Delete documents contents
  if (fs.existsSync(documentsPath)) {
    const docItems = fs.readdirSync(documentsPath);

    for (const item of docItems) {
      const itemPath = path.join(documentsPath, item);
      const stats = fs.statSync(itemPath);

      if (stats.isDirectory()) {
        const count = deleteDir(itemPath);
        fs.rmdirSync(itemPath);
        console.log(`✗ Deleted folder: ${item} (${count} files)`);
      } else {
        fs.unlinkSync(itemPath);
        console.log(`✗ Deleted document: ${item}`);
      }
      deletedDocuments++;
    }
  }

  console.log("\n=== RESET COMPLETE ===");
  console.log(`Skills deleted: ${deletedSkills}`);
  console.log(`Documents deleted: ${deletedDocuments}`);
  if (preservedSkill) {
    console.log(`Skill preserved: ${preservedSkill}`);
  }

  // Output structured data for agent
  console.log(
    JSON.stringify({
      success: true,
      deletedSkills,
      deletedDocuments,
      preservedSkill,
    })
  );
} catch (error) {
  console.error("Error during reset:", error.message);
  process.exit(1);
}