singularity-forge/scripts/uninstall-pi-global.js

66 lines
2 KiB
JavaScript
Raw Normal View History

2026-03-11 13:34:03 -07:00
#!/usr/bin/env node
import { existsSync, readFileSync, readdirSync, rmSync, rmdirSync } from 'node:fs'
import os from 'node:os'
import { join, resolve } from 'node:path'
2026-03-11 13:34:03 -07:00
const __dirname = import.meta.dirname
2026-03-11 13:34:03 -07:00
const resourcesDir = resolve(__dirname, '..', 'src', 'resources')
const piRoot = join(os.homedir(), '.pi')
const piAgentDir = join(piRoot, 'agent')
const removed = []
const skipped = []
function safeRemove(path, label) {
if (!existsSync(path)) return
rmSync(path, { recursive: true, force: true })
removed.push(label)
}
function removeResourceEntries(containerName) {
const srcDir = join(resourcesDir, containerName)
const destDir = join(piAgentDir, containerName)
if (!existsSync(srcDir) || !existsSync(destDir)) return
for (const entry of readdirSync(srcDir)) {
safeRemove(join(destDir, entry), `${containerName}/${entry}`)
}
try {
if (readdirSync(destDir).length === 0) {
rmdirSync(destDir)
removed.push(`${containerName}/`)
}
} catch {
// ignore non-empty or missing dirs
}
}
function removeIfContentMatches(targetPath, sourcePath, label) {
if (!existsSync(targetPath) || !existsSync(sourcePath)) return
try {
const target = readFileSync(targetPath, 'utf8')
const source = readFileSync(sourcePath, 'utf8')
if (target === source) {
rmSync(targetPath, { force: true })
removed.push(label)
} else {
skipped.push(`${label} (modified, left in place)`)
}
} catch {
skipped.push(`${label} (could not verify, left in place)`)
}
}
removeResourceEntries('extensions')
removeResourceEntries('skills')
removeResourceEntries('agents')
removeIfContentMatches(join(piAgentDir, 'AGENTS.md'), join(resourcesDir, 'AGENTS.md'), 'agent/AGENTS.md')
removeIfContentMatches(join(piRoot, 'SF-WORKFLOW.md'), join(resourcesDir, 'SF-WORKFLOW.md'), 'SF-WORKFLOW.md')
2026-03-11 13:34:03 -07:00
process.stdout.write(
`Removed SF resources from ${piRoot}\n` +
2026-03-11 13:34:03 -07:00
`Removed: ${removed.length ? removed.join(', ') : '(nothing)'}\n` +
(skipped.length ? `Skipped: ${skipped.join(', ')}\n` : '')
)