2026-03-11 13:34:03 -07:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
|
|
|
import os from 'node:os'
|
|
|
|
|
import { dirname, join, resolve } from 'node:path'
|
|
|
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
|
|
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
|
|
const resourcesDir = resolve(__dirname, '..', 'src', 'resources')
|
|
|
|
|
const piRoot = join(os.homedir(), '.pi')
|
|
|
|
|
const piAgentDir = join(piRoot, 'agent')
|
|
|
|
|
|
|
|
|
|
const copyDir = (name) => {
|
|
|
|
|
const src = join(resourcesDir, name)
|
|
|
|
|
const dest = join(piAgentDir, name)
|
|
|
|
|
if (!existsSync(src)) return false
|
|
|
|
|
mkdirSync(dest, { recursive: true })
|
|
|
|
|
cpSync(src, dest, { recursive: true, force: true })
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mkdirSync(piAgentDir, { recursive: true })
|
|
|
|
|
|
|
|
|
|
const copied = []
|
|
|
|
|
if (copyDir('extensions')) copied.push('extensions')
|
|
|
|
|
if (copyDir('skills')) copied.push('skills')
|
|
|
|
|
if (copyDir('agents')) copied.push('agents')
|
|
|
|
|
|
|
|
|
|
const agentsMdSrc = join(resourcesDir, 'AGENTS.md')
|
|
|
|
|
if (existsSync(agentsMdSrc)) {
|
|
|
|
|
writeFileSync(join(piAgentDir, 'AGENTS.md'), readFileSync(agentsMdSrc))
|
|
|
|
|
copied.push('AGENTS.md')
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 14:54:20 +02:00
|
|
|
const workflowSrc = join(resourcesDir, 'SF-WORKFLOW.md')
|
2026-03-11 13:34:03 -07:00
|
|
|
if (existsSync(workflowSrc)) {
|
2026-04-15 14:54:20 +02:00
|
|
|
writeFileSync(join(piRoot, 'SF-WORKFLOW.md'), readFileSync(workflowSrc))
|
|
|
|
|
copied.push('SF-WORKFLOW.md')
|
2026-03-11 13:34:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
process.stdout.write(
|
2026-04-15 14:54:20 +02:00
|
|
|
`Installed SF resources for pi in ${piRoot}\n` +
|
2026-03-11 13:34:03 -07:00
|
|
|
`Copied: ${copied.join(', ')}\n` +
|
|
|
|
|
`Extensions are now available under ${join(piAgentDir, 'extensions')}\n`
|
|
|
|
|
)
|