Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e7d416048 | |||
| 23f41cc152 | |||
| ad7e9b0b46 | |||
| 8cf016f0d8 | |||
| 626cfe30ba | |||
| 45ac9af405 | |||
| d832343b38 | |||
| b38c99aaa0 | |||
| e379d60c65 | |||
| 99b68c9bb0 | |||
| 32d38975ec | |||
| 4ac2d99c32 | |||
| 9265670e63 | |||
| 9341b9cd16 | |||
| 8e6418a574 | |||
| 33609bff9a | |||
| ef7bab3e32 | |||
| 723dca735f | |||
| dc868e3fbc | |||
| f80a3fdb73 |
71
changelog.md
71
changelog.md
@@ -1,5 +1,73 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.4.2 - fix(scriptindex)
|
||||||
|
Handle missing script metadata fields in ScriptIndex.search to prevent crashes
|
||||||
|
|
||||||
|
- Add null/undefined checks for name, slug, and description in ScriptIndex.search to avoid runtime exceptions when script metadata is incomplete
|
||||||
|
- Improves robustness of scripts search against partially populated or malformed cached metadata
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.4.1 - fix(cli)
|
||||||
|
Fallback to 'unknown' when script.slug is missing in scripts list
|
||||||
|
|
||||||
|
- Fixes a potential runtime error when listing scripts if a script entry lacks a slug
|
||||||
|
- Uses a safe fallback ('unknown') before calling padEnd to ensure stable output
|
||||||
|
- Modified file: ts/moxytool.cli.ts
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.4.0 - feat(cli)
|
||||||
|
Improve CLI output and logging with colored header, grouped script listings, and ANSI-styled logger
|
||||||
|
|
||||||
|
- Set smartcli instance version from deno.json to surface the package version in the CLI
|
||||||
|
- Revamp standard command output with a colored ASCII header, clearer commands list, and improved usage line
|
||||||
|
- Group script index output by type including Proxmox VE host (pve), Containers (ct), Virtual Machines (vm), and Other
|
||||||
|
- Enhance scripts listing formatting (slug padding and bullet points) for readability
|
||||||
|
- Replace timestamped logger messages with ANSI-colored output and icons for error/warn/success/info
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.3.6 - fix(deps)
|
||||||
|
Bump smartcli dependency and add local settings file
|
||||||
|
|
||||||
|
- Bumped @push.rocks/smartcli from ^4.0.18 to ^4.0.19 in deno.json
|
||||||
|
- Added .claude/settings.local.json (development/local settings file)
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.3.5 - fix(smartcli)
|
||||||
|
Bump @push.rocks/smartcli to ^4.0.18 and add local settings file for tooling permissions
|
||||||
|
|
||||||
|
- Updated dependency @push.rocks/smartcli from ^4.0.16 to ^4.0.18 in deno.json
|
||||||
|
- Added a local settings file (.claude/settings.local.json) to configure runtime/tooling permissions (web fetch domains, bash/deno/npm command allowances, and local read access)
|
||||||
|
- No code API changes; this is a dependency/infra update — incrementing patch version
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.3.4 - fix(smartcli)
|
||||||
|
Update @push.rocks/smartcli to ^4.0.16 and add local Claude settings
|
||||||
|
|
||||||
|
- Bump dependency in deno.json: @push.rocks/smartcli from ^4.0.15 to ^4.0.16
|
||||||
|
- Add .claude/settings.local.json containing local permissions/configuration (development/local-only file)
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.3.3 - fix(deno.json)
|
||||||
|
Bump @push.rocks/smartcli to ^4.0.15 and add local Claude settings
|
||||||
|
|
||||||
|
- Updated deno.json: @push.rocks/smartcli ^4.0.14 → ^4.0.15
|
||||||
|
- Added .claude/settings.local.json with local permissions for development/CI
|
||||||
|
- No runtime source changes; dependency update only — recommend a patch release
|
||||||
|
|
||||||
|
## 2025-10-28 - 1.3.2 - fix(cli)
|
||||||
|
Correct scripts subcommand argument parsing and bump smartcli dependency
|
||||||
|
|
||||||
|
- Fix scripts command argument indices so the subcommand is read from argvArg._[1] and subsequent arguments from argvArg._[2]. This resolves incorrect handling of 'scripts search', 'scripts info' and 'scripts run' inputs.
|
||||||
|
- Upgrade @push.rocks/smartcli dependency from ^4.0.11 to ^4.0.14 in deno.json for compatibility/stability improvements.
|
||||||
|
|
||||||
|
## 2025-10-27 - 1.3.1 - fix(publish)
|
||||||
|
Switch publish registry to internal Verdaccio instance and add local CI settings
|
||||||
|
|
||||||
|
- Update package.json publishConfig.registry from https://registry.npmjs.org/ to https://verdaccio.lossless.digital/ to publish packages to the internal Verdaccio registry.
|
||||||
|
- Add .claude/settings.local.json to include local CI/dev settings (local configuration only).
|
||||||
|
|
||||||
|
## 2025-10-27 - 1.3.0 - feat(cli)
|
||||||
|
Add automatic update command and documentation updates
|
||||||
|
|
||||||
|
- Add 'update' CLI command that checks the latest Gitea release and runs the install script to perform a self-update
|
||||||
|
- Implements release fetch/compare logic and executes the repository install.sh via curl
|
||||||
|
- Update README to document the one-line installer and the new 'moxytool update' usage
|
||||||
|
- Update changelog to note the new update command and installation clarifications
|
||||||
|
|
||||||
## 2025-10-27 - 1.2.0 - feat(scripts)
|
## 2025-10-27 - 1.2.0 - feat(scripts)
|
||||||
Add community scripts subsystem: script index, runner, and CLI commands with background refresh; update docs and paths
|
Add community scripts subsystem: script index, runner, and CLI commands with background refresh; update docs and paths
|
||||||
|
|
||||||
@@ -19,6 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
## [1.1.0] - 2025-01-27
|
## [1.1.0] - 2025-01-27
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- `update` command for automatic self-updating from Gitea releases
|
||||||
- `scripts` command for Proxmox community scripts management
|
- `scripts` command for Proxmox community scripts management
|
||||||
- Access to 400+ community-maintained installation scripts
|
- Access to 400+ community-maintained installation scripts
|
||||||
- Automatic daily index updates with local caching
|
- Automatic daily index updates with local caching
|
||||||
@@ -26,8 +95,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Interactive script execution with full stdin/stdout/stderr passthrough
|
- Interactive script execution with full stdin/stdout/stderr passthrough
|
||||||
- Support for both LXC containers and VM templates
|
- Support for both LXC containers and VM templates
|
||||||
- Script metadata display (requirements, ports, credentials)
|
- Script metadata display (requirements, ports, credentials)
|
||||||
|
- One-line installation script as primary installation method
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
- `moxytool update` - Update MOXYTOOL to the latest version automatically
|
||||||
- `moxytool scripts list` - List all available scripts
|
- `moxytool scripts list` - List all available scripts
|
||||||
- `moxytool scripts search <query>` - Search scripts by keyword
|
- `moxytool scripts search <query>` - Search scripts by keyword
|
||||||
- `moxytool scripts info <slug>` - View detailed script information
|
- `moxytool scripts info <slug>` - View detailed script information
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@serve.zone/moxytool",
|
"name": "@serve.zone/moxytool",
|
||||||
"version": "1.2.0",
|
"version": "1.4.2",
|
||||||
"exports": "./mod.ts",
|
"exports": "./mod.ts",
|
||||||
"nodeModulesDir": "auto",
|
"nodeModulesDir": "auto",
|
||||||
"tasks": {
|
"tasks": {
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"@push.rocks/npmextra": "npm:@push.rocks/npmextra@^5.1.2",
|
"@push.rocks/npmextra": "npm:@push.rocks/npmextra@^5.1.2",
|
||||||
"@push.rocks/projectinfo": "npm:@push.rocks/projectinfo@^5.0.1",
|
"@push.rocks/projectinfo": "npm:@push.rocks/projectinfo@^5.0.1",
|
||||||
"@push.rocks/qenv": "npm:@push.rocks/qenv@^6.1.0",
|
"@push.rocks/qenv": "npm:@push.rocks/qenv@^6.1.0",
|
||||||
"@push.rocks/smartcli": "npm:@push.rocks/smartcli@^4.0.11",
|
"@push.rocks/smartcli": "npm:@push.rocks/smartcli@^4.0.19",
|
||||||
"@push.rocks/smartdelay": "npm:@push.rocks/smartdelay@^3.0.5",
|
"@push.rocks/smartdelay": "npm:@push.rocks/smartdelay@^3.0.5",
|
||||||
"@push.rocks/smartfile": "npm:@push.rocks/smartfile@^11.0.23",
|
"@push.rocks/smartfile": "npm:@push.rocks/smartfile@^11.0.23",
|
||||||
"@push.rocks/smartjson": "npm:@push.rocks/smartjson@^5.0.20",
|
"@push.rocks/smartjson": "npm:@push.rocks/smartjson@^5.0.20",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@serve.zone/moxytool",
|
"name": "@serve.zone/moxytool",
|
||||||
"version": "1.2.0",
|
"version": "1.4.2",
|
||||||
"description": "Proxmox administration tool for vGPU setup, VM management, and cluster configuration",
|
"description": "Proxmox administration tool for vGPU setup, VM management, and cluster configuration",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"proxmox",
|
"proxmox",
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
],
|
],
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://registry.npmjs.org/"
|
"registry": "https://verdaccio.lossless.digital/"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34"
|
"packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34"
|
||||||
}
|
}
|
||||||
|
|||||||
41
readme.md
41
readme.md
@@ -19,7 +19,22 @@ MOXYTOOL is a comprehensive command-line tool for managing Proxmox servers, with
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### Global Installation (Recommended)
|
### One-Line Installation (Recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Download and install MOXYTOOL automatically
|
||||||
|
curl -sSL https://code.foss.global/serve.zone/moxytool/raw/branch/main/install.sh | sudo bash
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Detect your platform automatically (Linux x64/ARM64, macOS Intel/Apple Silicon, Windows)
|
||||||
|
- Download the latest binary from Gitea releases (~400-500KB)
|
||||||
|
- Install to `/usr/local/bin/moxytool`
|
||||||
|
- Make it available system-wide
|
||||||
|
|
||||||
|
### Via npm (Alternative)
|
||||||
|
|
||||||
|
Install globally using npm:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install -g @serve.zone/moxytool
|
npm install -g @serve.zone/moxytool
|
||||||
@@ -31,14 +46,28 @@ or with pnpm:
|
|||||||
pnpm install -g @serve.zone/moxytool
|
pnpm install -g @serve.zone/moxytool
|
||||||
```
|
```
|
||||||
|
|
||||||
### Local Installation
|
**Benefits:**
|
||||||
|
- Automatic platform detection and binary download
|
||||||
```bash
|
- Easy updates via `npm update -g @serve.zone/moxytool`
|
||||||
npm install @serve.zone/moxytool
|
- Version management with npm
|
||||||
```
|
- Works with Node.js >=14
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
### Updating MOXYTOOL
|
||||||
|
|
||||||
|
Update to the latest version from the repository:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
moxytool update
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will:
|
||||||
|
- Check the current version
|
||||||
|
- Fetch the latest release from Gitea
|
||||||
|
- Automatically download and install the update if available
|
||||||
|
- Preserve your existing configuration
|
||||||
|
|
||||||
### vGPU Setup
|
### vGPU Setup
|
||||||
|
|
||||||
Install and configure NVIDIA vGPU support on your Proxmox host:
|
Install and configure NVIDIA vGPU support on your Proxmox host:
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@serve.zone/moxytool',
|
name: '@serve.zone/moxytool',
|
||||||
version: '1.2.0',
|
version: '1.4.2',
|
||||||
description: 'Proxmox administration tool for vGPU setup, VM management, and cluster configuration'
|
description: 'Proxmox administration tool for vGPU setup, VM management, and cluster configuration'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -263,9 +263,9 @@ export class ScriptIndex {
|
|||||||
return this.cache.scripts.filter((script) => {
|
return this.cache.scripts.filter((script) => {
|
||||||
// Search in name, description, and slug
|
// Search in name, description, and slug
|
||||||
return (
|
return (
|
||||||
script.name.toLowerCase().includes(lowerQuery) ||
|
(script.name && script.name.toLowerCase().includes(lowerQuery)) ||
|
||||||
script.slug.toLowerCase().includes(lowerQuery) ||
|
(script.slug && script.slug.toLowerCase().includes(lowerQuery)) ||
|
||||||
script.description.toLowerCase().includes(lowerQuery)
|
(script.description && script.description.toLowerCase().includes(lowerQuery))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import * as paths from './moxytool.paths.ts';
|
|||||||
import { logger } from './moxytool.logging.ts';
|
import { logger } from './moxytool.logging.ts';
|
||||||
import { ScriptIndex } from './moxytool.classes.scriptindex.ts';
|
import { ScriptIndex } from './moxytool.classes.scriptindex.ts';
|
||||||
import { ScriptRunner } from './moxytool.classes.scriptrunner.ts';
|
import { ScriptRunner } from './moxytool.classes.scriptrunner.ts';
|
||||||
|
import denoConfig from '../deno.json' with { type: 'json' };
|
||||||
|
|
||||||
export const runCli = async () => {
|
export const runCli = async () => {
|
||||||
const smartshellInstance = new plugins.smartshell.Smartshell({
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
||||||
@@ -10,6 +11,7 @@ export const runCli = async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const smartcliInstance = new plugins.smartcli.Smartcli();
|
const smartcliInstance = new plugins.smartcli.Smartcli();
|
||||||
|
smartcliInstance.version = denoConfig.version;
|
||||||
|
|
||||||
// Initialize script index and check if refresh is needed
|
// Initialize script index and check if refresh is needed
|
||||||
const scriptIndex = new ScriptIndex();
|
const scriptIndex = new ScriptIndex();
|
||||||
@@ -31,13 +33,16 @@ export const runCli = async () => {
|
|||||||
|
|
||||||
// Standard command (no arguments)
|
// Standard command (no arguments)
|
||||||
smartcliInstance.standardCommand().subscribe(async () => {
|
smartcliInstance.standardCommand().subscribe(async () => {
|
||||||
logger.log('info', 'MOXYTOOL - Proxmox Administration Tool');
|
console.log('\x1b[1m\x1b[36m╔════════════════════════════════════════════╗\x1b[0m');
|
||||||
logger.log('info', '');
|
console.log('\x1b[1m\x1b[36m║\x1b[0m \x1b[1mMOXYTOOL\x1b[0m - Proxmox Administration \x1b[1m\x1b[36m║\x1b[0m');
|
||||||
logger.log('info', 'Available commands:');
|
console.log('\x1b[1m\x1b[36m╚════════════════════════════════════════════╝\x1b[0m');
|
||||||
logger.log('info', '* vgpu-setup - Install and configure Proxmox vGPU support');
|
console.log('');
|
||||||
logger.log('info', '* scripts - Manage Proxmox community scripts');
|
console.log('\x1b[1mCommands:\x1b[0m');
|
||||||
logger.log('info', '');
|
console.log(' \x1b[36m►\x1b[0m vgpu-setup Install and configure Proxmox vGPU support');
|
||||||
logger.log('info', 'Usage: moxytool <command> [options]');
|
console.log(' \x1b[36m►\x1b[0m scripts Manage Proxmox community scripts (400+)');
|
||||||
|
console.log(' \x1b[36m►\x1b[0m update Update MOXYTOOL to the latest version');
|
||||||
|
console.log('');
|
||||||
|
console.log('\x1b[2mUsage: moxytool <command> [options]\x1b[0m');
|
||||||
});
|
});
|
||||||
|
|
||||||
// vGPU setup command
|
// vGPU setup command
|
||||||
@@ -129,9 +134,81 @@ export const runCli = async () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Update command
|
||||||
|
smartcliInstance.addCommand('update').subscribe(async (argvArg) => {
|
||||||
|
logger.log('info', 'Checking for updates...');
|
||||||
|
logger.log('info', '');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Get current version from deno.json
|
||||||
|
const denoJsonPath = plugins.path.join(paths.packageDir, 'deno.json');
|
||||||
|
let currentVersion = '1.1.0'; // fallback
|
||||||
|
|
||||||
|
try {
|
||||||
|
const denoJsonContent = await Deno.readTextFile(denoJsonPath);
|
||||||
|
const denoJson = JSON.parse(denoJsonContent);
|
||||||
|
currentVersion = denoJson.version || currentVersion;
|
||||||
|
} catch {
|
||||||
|
// Use fallback version
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch latest version from Gitea API
|
||||||
|
const apiUrl = 'https://code.foss.global/api/v1/repos/serve.zone/moxytool/releases/latest';
|
||||||
|
const response = await fetch(apiUrl);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
logger.log('error', 'Failed to check for updates');
|
||||||
|
logger.log('error', `HTTP ${response.status}: ${response.statusText}`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const release = await response.json();
|
||||||
|
const latestVersion = release.tag_name; // e.g., "v1.1.0"
|
||||||
|
|
||||||
|
// Normalize versions for comparison (ensure both have "v" prefix)
|
||||||
|
const normalizedCurrent = currentVersion.startsWith('v') ? currentVersion : `v${currentVersion}`;
|
||||||
|
const normalizedLatest = latestVersion.startsWith('v') ? latestVersion : `v${latestVersion}`;
|
||||||
|
|
||||||
|
logger.log('info', `Current version: ${normalizedCurrent}`);
|
||||||
|
logger.log('info', `Latest version: ${normalizedLatest}`);
|
||||||
|
logger.log('info', '');
|
||||||
|
|
||||||
|
// Compare normalized versions
|
||||||
|
if (normalizedCurrent === normalizedLatest) {
|
||||||
|
logger.log('success', 'Already up to date!');
|
||||||
|
logger.log('info', '');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log('ok', `New version available: ${latestVersion}`);
|
||||||
|
logger.log('info', 'Downloading and installing...');
|
||||||
|
logger.log('info', '');
|
||||||
|
|
||||||
|
// Download and run the install script
|
||||||
|
const installUrl = 'https://code.foss.global/serve.zone/moxytool/raw/branch/main/install.sh';
|
||||||
|
|
||||||
|
const updateResult = await smartshellInstance.exec(
|
||||||
|
`curl -sSL ${installUrl} | bash`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (updateResult.exitCode !== 0) {
|
||||||
|
logger.log('error', 'Update failed');
|
||||||
|
logger.log('error', updateResult.stderr || 'Unknown error');
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log('info', '');
|
||||||
|
logger.log('success', `Updated to ${latestVersion}`);
|
||||||
|
logger.log('info', '');
|
||||||
|
} catch (error) {
|
||||||
|
logger.log('error', `Update failed: ${error instanceof Error ? error.message : String(error)}`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Scripts management commands
|
// Scripts management commands
|
||||||
smartcliInstance.addCommand('scripts').subscribe(async (argvArg) => {
|
smartcliInstance.addCommand('scripts').subscribe(async (argvArg) => {
|
||||||
const subcommand = argvArg._[0];
|
const subcommand = argvArg._[1]; // _[0] is 'scripts', _[1] is the subcommand
|
||||||
|
|
||||||
if (!subcommand) {
|
if (!subcommand) {
|
||||||
logger.log('info', 'MOXYTOOL Scripts - Proxmox Community Scripts Management');
|
logger.log('info', 'MOXYTOOL Scripts - Proxmox Community Scripts Management');
|
||||||
@@ -164,8 +241,18 @@ export const runCli = async () => {
|
|||||||
logger.log('info', '');
|
logger.log('info', '');
|
||||||
|
|
||||||
// Group by type
|
// Group by type
|
||||||
|
const pveScripts = scripts.filter(s => s.type === 'pve');
|
||||||
const containers = scripts.filter(s => s.type === 'ct');
|
const containers = scripts.filter(s => s.type === 'ct');
|
||||||
const vms = scripts.filter(s => s.type === 'vm');
|
const vms = scripts.filter(s => s.type === 'vm');
|
||||||
|
const otherScripts = scripts.filter(s => s.type !== 'pve' && s.type !== 'ct' && s.type !== 'vm');
|
||||||
|
|
||||||
|
if (pveScripts.length > 0) {
|
||||||
|
logger.log('info', 'Proxmox VE Host Scripts:');
|
||||||
|
pveScripts.forEach(script => {
|
||||||
|
logger.log('info', ` • ${script.slug.padEnd(25)} - ${script.name}`);
|
||||||
|
});
|
||||||
|
logger.log('info', '');
|
||||||
|
}
|
||||||
|
|
||||||
if (containers.length > 0) {
|
if (containers.length > 0) {
|
||||||
logger.log('info', 'Containers (LXC):');
|
logger.log('info', 'Containers (LXC):');
|
||||||
@@ -180,6 +267,15 @@ export const runCli = async () => {
|
|||||||
vms.forEach(script => {
|
vms.forEach(script => {
|
||||||
logger.log('info', ` • ${script.slug.padEnd(25)} - ${script.name}`);
|
logger.log('info', ` • ${script.slug.padEnd(25)} - ${script.name}`);
|
||||||
});
|
});
|
||||||
|
logger.log('info', '');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherScripts.length > 0) {
|
||||||
|
logger.log('info', 'Other:');
|
||||||
|
otherScripts.forEach(script => {
|
||||||
|
const slug = script.slug || 'unknown';
|
||||||
|
logger.log('info', ` • ${slug.padEnd(25)} - ${script.name} (${script.type})`);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.log('info', '');
|
logger.log('info', '');
|
||||||
@@ -189,7 +285,7 @@ export const runCli = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'search': {
|
case 'search': {
|
||||||
const query = argvArg._[1];
|
const query = argvArg._[2]; // _[0]=scripts, _[1]=search, _[2]=query
|
||||||
|
|
||||||
if (!query) {
|
if (!query) {
|
||||||
logger.log('error', 'Please provide a search query');
|
logger.log('error', 'Please provide a search query');
|
||||||
@@ -219,7 +315,7 @@ export const runCli = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'info': {
|
case 'info': {
|
||||||
const slug = argvArg._[1];
|
const slug = argvArg._[2]; // _[0]=scripts, _[1]=info, _[2]=slug
|
||||||
|
|
||||||
if (!slug) {
|
if (!slug) {
|
||||||
logger.log('error', 'Please provide a script slug');
|
logger.log('error', 'Please provide a script slug');
|
||||||
@@ -295,7 +391,7 @@ export const runCli = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'run': {
|
case 'run': {
|
||||||
const slug = argvArg._[1];
|
const slug = argvArg._[2]; // _[0]=scripts, _[1]=run, _[2]=slug
|
||||||
|
|
||||||
if (!slug) {
|
if (!slug) {
|
||||||
logger.log('error', 'Please provide a script slug');
|
logger.log('error', 'Please provide a script slug');
|
||||||
|
|||||||
@@ -1,5 +1,19 @@
|
|||||||
import * as plugins from './moxytool.plugins.ts';
|
import * as plugins from './moxytool.plugins.ts';
|
||||||
|
|
||||||
|
// ANSI color codes
|
||||||
|
const colors = {
|
||||||
|
reset: '\x1b[0m',
|
||||||
|
bright: '\x1b[1m',
|
||||||
|
dim: '\x1b[2m',
|
||||||
|
red: '\x1b[31m',
|
||||||
|
green: '\x1b[32m',
|
||||||
|
yellow: '\x1b[33m',
|
||||||
|
blue: '\x1b[34m',
|
||||||
|
magenta: '\x1b[35m',
|
||||||
|
cyan: '\x1b[36m',
|
||||||
|
white: '\x1b[37m',
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple logger class for MOXYTOOL
|
* A simple logger class for MOXYTOOL
|
||||||
*/
|
*/
|
||||||
@@ -14,22 +28,20 @@ class Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public log(level: string, message: string): void {
|
public log(level: string, message: string): void {
|
||||||
const timestamp = new Date().toISOString();
|
|
||||||
|
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case 'error':
|
case 'error':
|
||||||
console.error(`[${timestamp}] [ERROR] ${message}`);
|
console.error(`${colors.red}✗ ${message}${colors.reset}`);
|
||||||
break;
|
break;
|
||||||
case 'warn':
|
case 'warn':
|
||||||
console.warn(`[${timestamp}] [WARN] ${message}`);
|
console.warn(`${colors.yellow}⚠ ${message}${colors.reset}`);
|
||||||
break;
|
break;
|
||||||
case 'ok':
|
case 'ok':
|
||||||
case 'success':
|
case 'success':
|
||||||
console.log(`[${timestamp}] [OK] ${message}`);
|
console.log(`${colors.green}✓ ${message}${colors.reset}`);
|
||||||
break;
|
break;
|
||||||
case 'info':
|
case 'info':
|
||||||
default:
|
default:
|
||||||
console.log(`[${timestamp}] [INFO] ${message}`);
|
console.log(message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user