Nocigar/sillytavern
10
1// Plugin manager script.2// Usage: node plugins.js update3// More operations coming soon.4const { default: git } = require('simple-git');5const fs = require('fs');6const path = require('path');7const { color } = require('./src/util');8 9const pluginsPath = './plugins';10 11const command = process.argv[2];12 13if (command === 'update') {14 console.log(color.magenta('Updating all plugins'));15 updatePlugins();16}17 18if (command === 'install') {19 const pluginName = process.argv[3];20 console.log('Installing a new plugin', color.green(pluginName));21 installPlugin(pluginName);22}23 24async function updatePlugins() {25 const directories = fs.readdirSync(pluginsPath)26 .filter(file => !file.startsWith('.'))27 .filter(file => fs.statSync(path.join(pluginsPath, file)).isDirectory());28 29 console.log(`Found ${color.cyan(directories.length)} directories in ./plugins`);30 31 for (const directory of directories) {32 try {33 console.log(`Updating plugin ${color.green(directory)}...`);34 const pluginPath = path.join(pluginsPath, directory);35 const pluginRepo = git(pluginPath);36 await pluginRepo.fetch();37 const commitHash = await pluginRepo.revparse(['HEAD']);38 const trackingBranch = await pluginRepo.revparse(['--abbrev-ref', '@{u}']);39 const log = await pluginRepo.log({40 from: commitHash,41 to: trackingBranch,42 });43 44 if (log.total === 0) {45 console.log(`Plugin ${color.blue(directory)} is already up to date`);46 continue;47 }48 49 await pluginRepo.pull();50 const latestCommit = await pluginRepo.revparse(['HEAD']);51 console.log(`Plugin ${color.green(directory)} updated to commit ${color.cyan(latestCommit)}`);52 } catch (error) {53 console.error(color.red(`Failed to update plugin ${directory}: ${error.message}`));54 }55 }56 57 console.log(color.magenta('All plugins updated!'));58 59}60 61async function installPlugin(pluginName) {62 try {63 const pluginPath = path.join(pluginsPath, path.basename(pluginName, '.git'));64 65 if (fs.existsSync(pluginPath)) {66 return console.log(color.yellow(`Directory already exists at ${pluginPath}`));67 }68 69 await git().clone(pluginName, pluginPath, { '--depth': 1 });70 console.log(`Plugin ${color.green(pluginName)} installed to ${color.cyan(pluginPath)}`);71 }72 catch (error) {73 console.error(color.red(`Failed to install plugin ${pluginName}`), error);74 }75}76 