@anastops/cli 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +8 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +17 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +315 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/ranger.d.ts +7 -2
- package/dist/commands/ranger.d.ts.map +1 -1
- package/dist/commands/ranger.js +99 -21
- package/dist/commands/ranger.js.map +1 -1
- package/dist/commands/uninstall.d.ts +16 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +206 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
- package/ranger-tui/pyproject.toml +51 -0
- package/ranger-tui/ranger_tui/__init__.py +5 -0
- package/ranger-tui/ranger_tui/__main__.py +16 -0
- package/ranger-tui/ranger_tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/__main__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/accessibility.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/app.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/config.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/theme.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/accessibility.py +499 -0
- package/ranger-tui/ranger_tui/actions/__init__.py +13 -0
- package/ranger-tui/ranger_tui/actions/agent_actions.py +74 -0
- package/ranger-tui/ranger_tui/actions/session_actions.py +110 -0
- package/ranger-tui/ranger_tui/actions/task_actions.py +107 -0
- package/ranger-tui/ranger_tui/app.py +93 -0
- package/ranger-tui/ranger_tui/assets/ranger_head.png +0 -0
- package/ranger-tui/ranger_tui/config.py +100 -0
- package/ranger-tui/ranger_tui/data/__init__.py +16 -0
- package/ranger-tui/ranger_tui/data/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/data/__pycache__/client.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/data/__pycache__/models.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/data/client.py +858 -0
- package/ranger-tui/ranger_tui/data/models.py +151 -0
- package/ranger-tui/ranger_tui/screens/__init__.py +16 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/dashboard.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/modals.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/session.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/task.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/command_palette.py +357 -0
- package/ranger-tui/ranger_tui/screens/dashboard.py +232 -0
- package/ranger-tui/ranger_tui/screens/help.py +103 -0
- package/ranger-tui/ranger_tui/screens/modals.py +95 -0
- package/ranger-tui/ranger_tui/screens/session.py +289 -0
- package/ranger-tui/ranger_tui/screens/task.py +187 -0
- package/ranger-tui/ranger_tui/styles/ranger.tcss +254 -0
- package/ranger-tui/ranger_tui/theme.py +93 -0
- package/ranger-tui/ranger_tui/widgets/__init__.py +23 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/accessible.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/logo.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/logo_assets.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/ranger_image.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/sidebar.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/topbar.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/accessible.py +176 -0
- package/ranger-tui/ranger_tui/widgets/agents_table.py +151 -0
- package/ranger-tui/ranger_tui/widgets/header.py +141 -0
- package/ranger-tui/ranger_tui/widgets/logo.py +258 -0
- package/ranger-tui/ranger_tui/widgets/logo_assets.py +62 -0
- package/ranger-tui/ranger_tui/widgets/metrics_panel.py +121 -0
- package/ranger-tui/ranger_tui/widgets/ranger_image.py +91 -0
- package/ranger-tui/ranger_tui/widgets/sessions_table.py +191 -0
- package/ranger-tui/ranger_tui/widgets/sidebar.py +91 -0
- package/ranger-tui/ranger_tui/widgets/tasks_table.py +189 -0
- package/ranger-tui/ranger_tui/widgets/topbar.py +168 -0
package/dist/commands/ranger.js
CHANGED
|
@@ -1,39 +1,119 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Ranger command - Launch interactive TUI dashboard
|
|
3
3
|
*
|
|
4
|
-
* The TUI is
|
|
5
|
-
* This command launches the Python-based ranger-tui package
|
|
4
|
+
* The TUI is implemented in Python using Textual.
|
|
5
|
+
* This command launches the Python-based ranger-tui package from:
|
|
6
|
+
* 1. ~/.anastops/ranger-tui/venv/ (npm installed)
|
|
7
|
+
* 2. packages/ranger-tui/ (local development in repo)
|
|
8
|
+
*
|
|
9
|
+
* Use --setup to install/reinstall the Ranger TUI.
|
|
6
10
|
*/
|
|
7
|
-
import { spawn } from 'node:child_process';
|
|
8
|
-
import {
|
|
11
|
+
import { execSync, spawn } from 'node:child_process';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { homedir, platform } from 'node:os';
|
|
14
|
+
import { dirname, join, resolve } from 'node:path';
|
|
9
15
|
import { fileURLToPath } from 'node:url';
|
|
10
16
|
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { setupRanger } from './init.js';
|
|
11
19
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
20
|
const __dirname = dirname(__filename);
|
|
21
|
+
/**
|
|
22
|
+
* Check if python3 has a package installed
|
|
23
|
+
*/
|
|
24
|
+
function pythonHasPackage(packageName) {
|
|
25
|
+
try {
|
|
26
|
+
execSync(`python3 -c "import ${packageName}"`, { stdio: 'pipe' });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Find the best available Python/venv for running ranger-tui
|
|
35
|
+
* Returns: { python: path to python, cwd: working directory, source: 'venv' | 'dev' | null }
|
|
36
|
+
*/
|
|
37
|
+
function findRangerInstallation() {
|
|
38
|
+
const home = homedir();
|
|
39
|
+
// 1. Check for venv installation at ~/.anastops/ranger-tui/
|
|
40
|
+
const venvDir = join(home, '.anastops', 'ranger-tui', 'venv');
|
|
41
|
+
const rangerSrcDir = join(home, '.anastops', 'ranger-tui');
|
|
42
|
+
const venvPython = platform() === 'win32'
|
|
43
|
+
? join(venvDir, 'Scripts', 'python.exe')
|
|
44
|
+
: join(venvDir, 'bin', 'python');
|
|
45
|
+
if (existsSync(venvPython) && existsSync(join(rangerSrcDir, 'ranger_tui'))) {
|
|
46
|
+
return { python: venvPython, cwd: rangerSrcDir, source: 'venv' };
|
|
47
|
+
}
|
|
48
|
+
// 2. Check for local development installation (in repo)
|
|
49
|
+
// From dist/commands/ranger.js -> packages/ranger-tui/src/ranger_tui
|
|
50
|
+
const devPath = resolve(__dirname, '..', '..', '..', 'ranger-tui');
|
|
51
|
+
const devSrcPath = join(devPath, 'src', 'ranger_tui');
|
|
52
|
+
// Dev mode only works if the developer has set up their environment
|
|
53
|
+
// Check for textual package as a proxy for "dev environment is set up"
|
|
54
|
+
if (existsSync(devSrcPath) && pythonHasPackage('textual')) {
|
|
55
|
+
// For dev, we need to run from the src directory so Python can find ranger_tui
|
|
56
|
+
return { python: 'python3', cwd: join(devPath, 'src'), source: 'dev' };
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
13
60
|
export async function rangerCommand(options) {
|
|
14
|
-
//
|
|
15
|
-
|
|
61
|
+
// Handle --setup flag: run ranger installation
|
|
62
|
+
if (options.setup === true) {
|
|
63
|
+
const spinner = ora('Setting up Ranger TUI...').start();
|
|
64
|
+
const userConfigDir = join(homedir(), '.anastops');
|
|
65
|
+
try {
|
|
66
|
+
const result = setupRanger(userConfigDir);
|
|
67
|
+
if (result.success) {
|
|
68
|
+
spinner.succeed(result.message);
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log(chalk.green("Ranger TUI is now installed. Run 'anastops ranger' to launch."));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
spinner.fail(`Ranger TUI setup failed: ${result.message}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
spinner.fail(`Ranger TUI setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Find ranger installation
|
|
84
|
+
const installation = findRangerInstallation();
|
|
85
|
+
if (installation === null) {
|
|
86
|
+
console.error(chalk.red('Ranger TUI is not installed.'));
|
|
87
|
+
console.error('');
|
|
88
|
+
console.error(chalk.bold("Run 'anastops ranger --setup' to install it."));
|
|
89
|
+
console.error(chalk.dim('(Requires Python 3.11+)'));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
// JSON mode outputs data and exits
|
|
93
|
+
if (options.json === true) {
|
|
94
|
+
console.log(chalk.yellow('JSON mode not yet supported in Textual TUI'));
|
|
95
|
+
console.log(chalk.dim('Use the MCP tools directly for JSON output'));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
16
98
|
console.log(chalk.cyan('Starting Ranger TUI...'));
|
|
17
|
-
|
|
99
|
+
if (installation.source === 'dev') {
|
|
100
|
+
console.log(chalk.dim('Using local development installation'));
|
|
101
|
+
}
|
|
18
102
|
// Build command arguments
|
|
19
103
|
const args = ['-m', 'ranger_tui'];
|
|
20
104
|
// Environment variables
|
|
21
105
|
const env = {
|
|
22
106
|
...process.env,
|
|
23
107
|
RANGER_REFRESH_INTERVAL: options.refresh ?? '2',
|
|
108
|
+
// Add ranger_tui to PYTHONPATH for venv installation
|
|
109
|
+
PYTHONPATH: installation.cwd,
|
|
24
110
|
};
|
|
25
111
|
if (options.session !== undefined && options.session !== '') {
|
|
26
112
|
env['RANGER_INITIAL_SESSION'] = options.session;
|
|
27
113
|
}
|
|
28
|
-
// JSON mode outputs data and exits
|
|
29
|
-
if (options.json === true) {
|
|
30
|
-
console.log(chalk.yellow('JSON mode not yet supported in Textual TUI'));
|
|
31
|
-
console.log(chalk.dim('Use the MCP tools directly for JSON output'));
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
114
|
// Launch the Python TUI
|
|
35
|
-
const pythonProcess = spawn(
|
|
36
|
-
cwd:
|
|
115
|
+
const pythonProcess = spawn(installation.python, args, {
|
|
116
|
+
cwd: installation.cwd,
|
|
37
117
|
stdio: 'inherit',
|
|
38
118
|
env,
|
|
39
119
|
});
|
|
@@ -44,22 +124,20 @@ export async function rangerCommand(options) {
|
|
|
44
124
|
resolvePromise();
|
|
45
125
|
}
|
|
46
126
|
else if (code === 127) {
|
|
47
|
-
console.error(chalk.red('\nPython not found.
|
|
48
|
-
console.error(chalk.dim('
|
|
127
|
+
console.error(chalk.red('\nPython not found.'));
|
|
128
|
+
console.error(chalk.dim("Run 'anastops ranger --setup' to reinstall."));
|
|
49
129
|
reject(new Error(`Ranger TUI exited with code ${code}`));
|
|
50
130
|
}
|
|
51
131
|
else {
|
|
52
132
|
console.error(chalk.red(`\nRanger TUI exited with code ${code}`));
|
|
53
|
-
console.error(chalk.dim('
|
|
54
|
-
console.error(chalk.dim(' cd packages/ranger-tui && pip install -e .'));
|
|
133
|
+
console.error(chalk.dim("Run 'anastops ranger --setup' to reinstall."));
|
|
55
134
|
reject(new Error(`Ranger TUI exited with code ${code}`));
|
|
56
135
|
}
|
|
57
136
|
});
|
|
58
137
|
pythonProcess.on('error', (err) => {
|
|
59
138
|
console.error(chalk.red('\nFailed to start Ranger TUI:'));
|
|
60
139
|
console.error(chalk.dim(err.message));
|
|
61
|
-
console.error(chalk.dim(
|
|
62
|
-
console.error(chalk.dim(' cd packages/ranger-tui && pip install -e .'));
|
|
140
|
+
console.error(chalk.dim("\nRun 'anastops ranger --setup' to reinstall."));
|
|
63
141
|
reject(err);
|
|
64
142
|
});
|
|
65
143
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ranger.js","sourceRoot":"","sources":["../../src/commands/ranger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ranger.js","sourceRoot":"","sources":["../../src/commands/ranger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* anastops uninstall command
|
|
3
|
+
*
|
|
4
|
+
* Clean up Anastops installation:
|
|
5
|
+
* - Stop and remove Docker containers
|
|
6
|
+
* - Remove Docker volumes (legacy named volumes)
|
|
7
|
+
* - Optionally remove ~/.anastops/ directory (with --purge)
|
|
8
|
+
* - Optionally remove MCP registrations (with --purge)
|
|
9
|
+
*/
|
|
10
|
+
interface UninstallOptions {
|
|
11
|
+
purge?: boolean;
|
|
12
|
+
keepData?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function uninstallCommand(options: UninstallOptions): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA+FhE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* anastops uninstall command
|
|
3
|
+
*
|
|
4
|
+
* Clean up Anastops installation:
|
|
5
|
+
* - Stop and remove Docker containers
|
|
6
|
+
* - Remove Docker volumes (legacy named volumes)
|
|
7
|
+
* - Optionally remove ~/.anastops/ directory (with --purge)
|
|
8
|
+
* - Optionally remove MCP registrations (with --purge)
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import { existsSync, rmSync, readFileSync, writeFileSync } from 'fs';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import ora from 'ora';
|
|
16
|
+
/**
|
|
17
|
+
* Check if Docker daemon is running
|
|
18
|
+
*/
|
|
19
|
+
function isDockerRunning() {
|
|
20
|
+
try {
|
|
21
|
+
execSync('docker info', { stdio: 'ignore' });
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stop and remove anastops Docker containers
|
|
30
|
+
*/
|
|
31
|
+
function removeContainers() {
|
|
32
|
+
try {
|
|
33
|
+
// Stop containers (ignore errors if not running)
|
|
34
|
+
try {
|
|
35
|
+
execSync('docker stop anastops-mongodb anastops-redis 2>/dev/null', { stdio: 'pipe' });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Containers may not be running
|
|
39
|
+
}
|
|
40
|
+
// Remove containers (ignore errors if not exist)
|
|
41
|
+
try {
|
|
42
|
+
execSync('docker rm anastops-mongodb anastops-redis 2>/dev/null', { stdio: 'pipe' });
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Containers may not exist
|
|
46
|
+
}
|
|
47
|
+
return { success: true, message: 'Removed Docker containers' };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
message: error instanceof Error ? error.message : 'Failed to remove containers',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Remove anastops Docker volumes (legacy named volumes)
|
|
58
|
+
*/
|
|
59
|
+
function removeVolumes() {
|
|
60
|
+
try {
|
|
61
|
+
// Remove volumes (ignore errors if not exist)
|
|
62
|
+
try {
|
|
63
|
+
execSync('docker volume rm anastops-mongodb anastops-redis 2>/dev/null', { stdio: 'pipe' });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Volumes may not exist
|
|
67
|
+
}
|
|
68
|
+
return { success: true, message: 'Removed Docker volumes' };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
message: error instanceof Error ? error.message : 'Failed to remove volumes',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Remove anastops from MCP configuration files
|
|
79
|
+
*/
|
|
80
|
+
function removeMcpRegistrations() {
|
|
81
|
+
const home = homedir();
|
|
82
|
+
const mcpConfigs = [
|
|
83
|
+
{ name: 'Cursor', path: join(home, '.cursor', 'mcp.json') },
|
|
84
|
+
{
|
|
85
|
+
name: 'Claude Desktop',
|
|
86
|
+
path: join(home, '.config', 'claude', 'claude_desktop_config.json'),
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
const removed = [];
|
|
90
|
+
for (const { name, path: configPath } of mcpConfigs) {
|
|
91
|
+
try {
|
|
92
|
+
if (existsSync(configPath)) {
|
|
93
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
94
|
+
const config = JSON.parse(content);
|
|
95
|
+
if (config.mcpServers && 'anastops' in config.mcpServers) {
|
|
96
|
+
delete config.mcpServers.anastops;
|
|
97
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
98
|
+
removed.push(name);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Skip if we can't read/write this config
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { success: true, removed };
|
|
107
|
+
}
|
|
108
|
+
export function uninstallCommand(options) {
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log(chalk.bold('Uninstalling Anastops...'));
|
|
111
|
+
console.log('');
|
|
112
|
+
const home = homedir();
|
|
113
|
+
const userConfigDir = join(home, '.anastops');
|
|
114
|
+
const userDataDir = join(userConfigDir, 'data');
|
|
115
|
+
// 1. Stop and remove Docker containers
|
|
116
|
+
if (isDockerRunning()) {
|
|
117
|
+
const containerSpinner = ora('Stopping Docker containers...').start();
|
|
118
|
+
const containerResult = removeContainers();
|
|
119
|
+
if (containerResult.success) {
|
|
120
|
+
containerSpinner.succeed('Stopped and removed Docker containers');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
containerSpinner.warn(`Containers: ${containerResult.message}`);
|
|
124
|
+
}
|
|
125
|
+
// 2. Remove legacy named volumes
|
|
126
|
+
const volumeSpinner = ora('Removing Docker volumes...').start();
|
|
127
|
+
const volumeResult = removeVolumes();
|
|
128
|
+
if (volumeResult.success) {
|
|
129
|
+
volumeSpinner.succeed('Removed Docker volumes (if any)');
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
volumeSpinner.warn(`Volumes: ${volumeResult.message}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(chalk.dim(' Docker not running - skipping container cleanup'));
|
|
137
|
+
}
|
|
138
|
+
// 3. Handle purge option
|
|
139
|
+
if (options.purge === true) {
|
|
140
|
+
// Remove MCP registrations
|
|
141
|
+
const mcpSpinner = ora('Removing MCP registrations...').start();
|
|
142
|
+
const mcpResult = removeMcpRegistrations();
|
|
143
|
+
if (mcpResult.removed.length > 0) {
|
|
144
|
+
mcpSpinner.succeed(`Removed MCP registration from: ${mcpResult.removed.join(', ')}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
mcpSpinner.info('No MCP registrations found');
|
|
148
|
+
}
|
|
149
|
+
// Remove ~/.anastops/ directory
|
|
150
|
+
if (existsSync(userConfigDir)) {
|
|
151
|
+
if (options.keepData === true && existsSync(userDataDir)) {
|
|
152
|
+
// Keep data directory, remove everything else
|
|
153
|
+
const configSpinner = ora('Removing ~/.anastops/ (keeping data)...').start();
|
|
154
|
+
try {
|
|
155
|
+
// Remove docker directory
|
|
156
|
+
const dockerDir = join(userConfigDir, 'docker');
|
|
157
|
+
if (existsSync(dockerDir)) {
|
|
158
|
+
rmSync(dockerDir, { recursive: true, force: true });
|
|
159
|
+
}
|
|
160
|
+
// Remove .env file
|
|
161
|
+
const envFile = join(userConfigDir, '.env');
|
|
162
|
+
if (existsSync(envFile)) {
|
|
163
|
+
rmSync(envFile, { force: true });
|
|
164
|
+
}
|
|
165
|
+
configSpinner.succeed('Removed ~/.anastops/ configuration (data preserved)');
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
169
|
+
configSpinner.fail(`Failed to remove config: ${message}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Remove entire directory including data
|
|
174
|
+
const configSpinner = ora('Removing ~/.anastops/ directory...').start();
|
|
175
|
+
try {
|
|
176
|
+
rmSync(userConfigDir, { recursive: true, force: true });
|
|
177
|
+
configSpinner.succeed('Removed ~/.anastops/ directory');
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
181
|
+
configSpinner.fail(`Failed to remove directory: ${message}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(chalk.dim(' ~/.anastops/ directory not found'));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Summary
|
|
190
|
+
console.log('');
|
|
191
|
+
console.log(chalk.green('Anastops uninstalled successfully!'));
|
|
192
|
+
console.log('');
|
|
193
|
+
if (options.purge !== true) {
|
|
194
|
+
console.log(chalk.bold('Note:'));
|
|
195
|
+
console.log(' Configuration and data are preserved in ~/.anastops/');
|
|
196
|
+
console.log(' To fully remove, run: anastops uninstall --purge');
|
|
197
|
+
console.log('');
|
|
198
|
+
}
|
|
199
|
+
else if (options.keepData === true) {
|
|
200
|
+
console.log(chalk.bold('Note:'));
|
|
201
|
+
console.log(' Data preserved in ~/.anastops/data/');
|
|
202
|
+
console.log(' To remove data as well, run: anastops uninstall --purge');
|
|
203
|
+
console.log('');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { configCommand } from './commands/config.js';
|
|
|
15
15
|
import { doctorCommand } from './commands/doctor.js';
|
|
16
16
|
import { initCommand } from './commands/init.js';
|
|
17
17
|
import { rangerCommand } from './commands/ranger.js';
|
|
18
|
+
import { uninstallCommand } from './commands/uninstall.js';
|
|
18
19
|
const program = new Command();
|
|
19
20
|
program
|
|
20
21
|
.name('anastops')
|
|
@@ -26,7 +27,10 @@ program
|
|
|
26
27
|
.description('Initialize Anastops: generate credentials, setup Docker, register MCP')
|
|
27
28
|
.option('--skip-docker', 'Skip Docker infrastructure setup and auto-start')
|
|
28
29
|
.option('--skip-mcp', 'Skip MCP server registration')
|
|
30
|
+
.option('--skip-ranger', 'Skip Ranger TUI installation')
|
|
29
31
|
.option('--regenerate', 'Regenerate credentials (overwrites existing)')
|
|
32
|
+
.option('--persistent', 'Use persistent storage (data in ~/.anastops/data/) [default]')
|
|
33
|
+
.option('--ephemeral', 'Use ephemeral storage (data destroyed with containers)')
|
|
30
34
|
.action(initCommand);
|
|
31
35
|
program
|
|
32
36
|
.command('doctor')
|
|
@@ -39,9 +43,16 @@ program
|
|
|
39
43
|
program
|
|
40
44
|
.command('ranger')
|
|
41
45
|
.description('Launch interactive Textual TUI dashboard (requires Python 3.11+)')
|
|
46
|
+
.option('--setup', 'Install/reinstall Ranger TUI (creates Python venv)')
|
|
42
47
|
.option('--refresh <seconds>', 'Auto-refresh interval', '2')
|
|
43
48
|
.option('--session <id>', 'Jump directly to a session')
|
|
44
49
|
.option('--json', 'Output current state as JSON and exit (not yet supported)')
|
|
45
50
|
.action(rangerCommand);
|
|
51
|
+
program
|
|
52
|
+
.command('uninstall')
|
|
53
|
+
.description('Uninstall Anastops: stop containers, remove Docker resources')
|
|
54
|
+
.option('--purge', 'Also remove ~/.anastops/ directory and MCP registrations')
|
|
55
|
+
.option('--keep-data', 'With --purge, preserve ~/.anastops/data/ directory')
|
|
56
|
+
.action(uninstallCommand);
|
|
46
57
|
program.parse();
|
|
47
58
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,+BAA+B;AAC/B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;KACvD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;KACtE,MAAM,CAAC,cAAc,EAAE,8DAA8D,CAAC;KACtF,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;KAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,SAAS,EAAE,oDAAoD,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,GAAG,CAAC;KAC3D,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,2DAA2D,CAAC;KAC7E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,SAAS,EAAE,0DAA0D,CAAC;KAC7E,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;KAC3E,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anastops/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Infrastructure CLI for Anastops MCP Server setup and diagnostics",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
+
"prebuild": "node scripts/copy-ranger.js",
|
|
18
19
|
"build": "tsc",
|
|
19
20
|
"dev": "tsc --watch",
|
|
20
21
|
"start": "node dist/index.js",
|
|
@@ -26,9 +27,9 @@
|
|
|
26
27
|
"clean": "rm -rf dist"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@anastops/core": "1.
|
|
30
|
-
"@anastops/adapters": "1.
|
|
31
|
-
"@anastops/mcp-server": "1.
|
|
30
|
+
"@anastops/core": "1.1.0",
|
|
31
|
+
"@anastops/adapters": "1.1.0",
|
|
32
|
+
"@anastops/mcp-server": "1.1.0",
|
|
32
33
|
"commander": "^14.0.2",
|
|
33
34
|
"enquirer": "^2.4.1",
|
|
34
35
|
"chalk": "^5.6.2",
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
"cli-table3": "^0.6.5"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
39
|
-
"@types/node": "^
|
|
40
|
+
"@types/node": "^25.0.9",
|
|
40
41
|
"typescript": "^5.9.3",
|
|
41
42
|
"vitest": "^4.0.17"
|
|
42
43
|
},
|
|
@@ -44,7 +45,8 @@
|
|
|
44
45
|
"typescript": ">=5.0.0"
|
|
45
46
|
},
|
|
46
47
|
"files": [
|
|
47
|
-
"dist"
|
|
48
|
+
"dist",
|
|
49
|
+
"ranger-tui"
|
|
48
50
|
],
|
|
49
51
|
"keywords": [
|
|
50
52
|
"cli",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "ranger-tui"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Beautiful terminal UI dashboard for Anastops orchestration"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Anastops Team" }
|
|
10
|
+
]
|
|
11
|
+
keywords = ["tui", "terminal", "dashboard", "orchestration", "textual"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 4 - Beta",
|
|
14
|
+
"Environment :: Console",
|
|
15
|
+
"Intended Audience :: Developers",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Topic :: Software Development :: User Interfaces",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
dependencies = [
|
|
23
|
+
"textual>=0.89.0",
|
|
24
|
+
"motor>=3.6.0",
|
|
25
|
+
"redis>=5.2.0",
|
|
26
|
+
"pydantic>=2.10.0",
|
|
27
|
+
"rich>=13.9.0",
|
|
28
|
+
"nanoid>=2.0.0",
|
|
29
|
+
"python-dotenv>=1.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.optional-dependencies]
|
|
33
|
+
dev = [
|
|
34
|
+
"pytest>=8.0.0",
|
|
35
|
+
"pytest-asyncio>=0.24.0",
|
|
36
|
+
"textual-dev>=1.7.0",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
ranger-tui = "ranger_tui.__main__:main"
|
|
41
|
+
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = ["hatchling"]
|
|
44
|
+
build-backend = "hatchling.build"
|
|
45
|
+
|
|
46
|
+
[tool.hatch.build.targets.wheel]
|
|
47
|
+
packages = ["src/ranger_tui"]
|
|
48
|
+
|
|
49
|
+
[tool.pytest.ini_options]
|
|
50
|
+
asyncio_mode = "auto"
|
|
51
|
+
testpaths = ["tests"]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|