magnus-cli
Version:
Command line tool to pull and push source code files from a Rock RMS server
126 lines (109 loc) • 4.02 kB
text/typescript
import chalk from 'chalk';
import fs from 'fs/promises';
import ora from 'ora';
import path from 'path';
import { listFiles, MAGNUS_PATH } from '../utils/api.js';
import { isAuthenticated } from '../utils/config.js';
// Local configuration file name
const CONFIG_FILENAME = '.magnus';
/**
* Change the current working directory and save it to a local config file
* @param {string} directoryPath - Path to change to
* @returns {Promise<void>}
*/
export async function changeDirectory(directoryPath: string): Promise<void> {
if (!isAuthenticated()) {
throw new Error('Not authenticated. Run "magnus config" first.');
}
const spinner = ora(`Changing to directory: ${directoryPath}...`).start();
try {
// Verify the directory exists on the remote server
const items = await listFiles(directoryPath);
// If the response is empty or doesn't contain directories, we'll still allow it
// but we'll warn the user
if (items.length === 0) {
spinner.warn(`Directory appears to be empty or doesn't exist: ${directoryPath}`);
}
// Save the directory to the local config file
await saveCurrentDirectory(directoryPath);
spinner.succeed(`Current directory changed to: ${directoryPath}`);
// Display the contents of the directory
console.log(chalk.cyan(`\nContents of ${directoryPath}:`));
if (items.length === 0) {
console.log(chalk.yellow(' Directory is empty.'));
} else {
// Display directories first
const dirs = items.filter((item) => item.IsFolder);
if (dirs.length > 0) {
console.log(chalk.blue('\n Directories:'));
dirs.forEach((dir) => {
console.log(
chalk.blue(
` 📁 ${dir.Uri.replace(MAGNUS_PATH, '')} ${chalk.gray(`(${dir.DisplayName})`)}`
)
);
});
}
// Then display files
const files = items.filter((item) => !item.IsFolder);
if (files.length > 0) {
console.log(chalk.green('\n Files:'));
files.forEach((file) => {
console.log(chalk.green(` 📄 ${file.Uri} ${chalk.gray(`(${file.DisplayName})`)}`));
});
}
}
} catch (error) {
spinner.fail(
`Failed to change directory: ${error instanceof Error ? error.message : String(error)}`
);
throw error;
}
}
/**
* Save the current directory to the local config file
* @param {string} directoryPath - Directory path to save
* @returns {Promise<void>}
*/
async function saveCurrentDirectory(directoryPath: string): Promise<void> {
try {
const configPath = path.join(process.cwd(), CONFIG_FILENAME);
// Check if config file exists and read it if it does
let config: Record<string, any> = {};
try {
const configContents = await fs.readFile(configPath, 'utf8');
config = JSON.parse(configContents);
} catch (error) {
// If file doesn't exist or can't be parsed, use empty config
config = {};
}
// Update the current directory in the config
config.currentDirectory = directoryPath;
// Write the updated config back to the file
await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf8');
} catch (error) {
throw new Error(
`Failed to save current directory: ${error instanceof Error ? error.message : String(error)}`
);
}
}
/**
* Get the current directory from the local config file
* @returns {Promise<string>} The current directory path or '/' if not set
*/
export async function getCurrentDirectory(): Promise<string> {
try {
const configPath = path.join(process.cwd(), CONFIG_FILENAME);
// Check if config file exists and read it if it does
try {
const configContents = await fs.readFile(configPath, 'utf8');
const config = JSON.parse(configContents);
return config.currentDirectory || 'root';
} catch (error) {
// If file doesn't exist or can't be parsed, return default
return 'root';
}
} catch (error) {
return 'root';
}
}