@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.
Files changed (74) hide show
  1. package/dist/commands/doctor.d.ts.map +1 -1
  2. package/dist/commands/doctor.js +8 -6
  3. package/dist/commands/doctor.js.map +1 -1
  4. package/dist/commands/init.d.ts +17 -0
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +315 -17
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/ranger.d.ts +7 -2
  9. package/dist/commands/ranger.d.ts.map +1 -1
  10. package/dist/commands/ranger.js +99 -21
  11. package/dist/commands/ranger.js.map +1 -1
  12. package/dist/commands/uninstall.d.ts +16 -0
  13. package/dist/commands/uninstall.d.ts.map +1 -0
  14. package/dist/commands/uninstall.js +206 -0
  15. package/dist/commands/uninstall.js.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -1
  18. package/package.json +8 -6
  19. package/ranger-tui/pyproject.toml +51 -0
  20. package/ranger-tui/ranger_tui/__init__.py +5 -0
  21. package/ranger-tui/ranger_tui/__main__.py +16 -0
  22. package/ranger-tui/ranger_tui/__pycache__/__init__.cpython-314.pyc +0 -0
  23. package/ranger-tui/ranger_tui/__pycache__/__main__.cpython-314.pyc +0 -0
  24. package/ranger-tui/ranger_tui/__pycache__/accessibility.cpython-314.pyc +0 -0
  25. package/ranger-tui/ranger_tui/__pycache__/app.cpython-314.pyc +0 -0
  26. package/ranger-tui/ranger_tui/__pycache__/config.cpython-314.pyc +0 -0
  27. package/ranger-tui/ranger_tui/__pycache__/theme.cpython-314.pyc +0 -0
  28. package/ranger-tui/ranger_tui/accessibility.py +499 -0
  29. package/ranger-tui/ranger_tui/actions/__init__.py +13 -0
  30. package/ranger-tui/ranger_tui/actions/agent_actions.py +74 -0
  31. package/ranger-tui/ranger_tui/actions/session_actions.py +110 -0
  32. package/ranger-tui/ranger_tui/actions/task_actions.py +107 -0
  33. package/ranger-tui/ranger_tui/app.py +93 -0
  34. package/ranger-tui/ranger_tui/assets/ranger_head.png +0 -0
  35. package/ranger-tui/ranger_tui/config.py +100 -0
  36. package/ranger-tui/ranger_tui/data/__init__.py +16 -0
  37. package/ranger-tui/ranger_tui/data/__pycache__/__init__.cpython-314.pyc +0 -0
  38. package/ranger-tui/ranger_tui/data/__pycache__/client.cpython-314.pyc +0 -0
  39. package/ranger-tui/ranger_tui/data/__pycache__/models.cpython-314.pyc +0 -0
  40. package/ranger-tui/ranger_tui/data/client.py +858 -0
  41. package/ranger-tui/ranger_tui/data/models.py +151 -0
  42. package/ranger-tui/ranger_tui/screens/__init__.py +16 -0
  43. package/ranger-tui/ranger_tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  44. package/ranger-tui/ranger_tui/screens/__pycache__/dashboard.cpython-314.pyc +0 -0
  45. package/ranger-tui/ranger_tui/screens/__pycache__/modals.cpython-314.pyc +0 -0
  46. package/ranger-tui/ranger_tui/screens/__pycache__/session.cpython-314.pyc +0 -0
  47. package/ranger-tui/ranger_tui/screens/__pycache__/task.cpython-314.pyc +0 -0
  48. package/ranger-tui/ranger_tui/screens/command_palette.py +357 -0
  49. package/ranger-tui/ranger_tui/screens/dashboard.py +232 -0
  50. package/ranger-tui/ranger_tui/screens/help.py +103 -0
  51. package/ranger-tui/ranger_tui/screens/modals.py +95 -0
  52. package/ranger-tui/ranger_tui/screens/session.py +289 -0
  53. package/ranger-tui/ranger_tui/screens/task.py +187 -0
  54. package/ranger-tui/ranger_tui/styles/ranger.tcss +254 -0
  55. package/ranger-tui/ranger_tui/theme.py +93 -0
  56. package/ranger-tui/ranger_tui/widgets/__init__.py +23 -0
  57. package/ranger-tui/ranger_tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  58. package/ranger-tui/ranger_tui/widgets/__pycache__/accessible.cpython-314.pyc +0 -0
  59. package/ranger-tui/ranger_tui/widgets/__pycache__/logo.cpython-314.pyc +0 -0
  60. package/ranger-tui/ranger_tui/widgets/__pycache__/logo_assets.cpython-314.pyc +0 -0
  61. package/ranger-tui/ranger_tui/widgets/__pycache__/ranger_image.cpython-314.pyc +0 -0
  62. package/ranger-tui/ranger_tui/widgets/__pycache__/sidebar.cpython-314.pyc +0 -0
  63. package/ranger-tui/ranger_tui/widgets/__pycache__/topbar.cpython-314.pyc +0 -0
  64. package/ranger-tui/ranger_tui/widgets/accessible.py +176 -0
  65. package/ranger-tui/ranger_tui/widgets/agents_table.py +151 -0
  66. package/ranger-tui/ranger_tui/widgets/header.py +141 -0
  67. package/ranger-tui/ranger_tui/widgets/logo.py +258 -0
  68. package/ranger-tui/ranger_tui/widgets/logo_assets.py +62 -0
  69. package/ranger-tui/ranger_tui/widgets/metrics_panel.py +121 -0
  70. package/ranger-tui/ranger_tui/widgets/ranger_image.py +91 -0
  71. package/ranger-tui/ranger_tui/widgets/sessions_table.py +191 -0
  72. package/ranger-tui/ranger_tui/widgets/sidebar.py +91 -0
  73. package/ranger-tui/ranger_tui/widgets/tasks_table.py +189 -0
  74. package/ranger-tui/ranger_tui/widgets/topbar.py +168 -0
@@ -1,39 +1,119 @@
1
1
  /**
2
2
  * Ranger command - Launch interactive TUI dashboard
3
3
  *
4
- * The TUI is now implemented in Python using Textual.
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 { resolve, dirname } from 'node:path';
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
- // Path to the ranger-tui package
15
- const rangerTuiPath = resolve(__dirname, '../../../ranger-tui');
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
- console.log(chalk.dim(`Path: ${rangerTuiPath}`));
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('python3', args, {
36
- cwd: rangerTuiPath,
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. Please install Python 3.11+ and ranger-tui:'));
48
- console.error(chalk.dim(' cd packages/ranger-tui && pip install -e .'));
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('Make sure ranger-tui is installed:'));
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('\nMake sure Python 3.11+ is installed and ranger-tui is set up:'));
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":"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"}
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;AAErD,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,cAAc,EAAE,8CAA8C,CAAC;KACtE,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,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,CAAC,KAAK,EAAE,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.0.0",
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.0.0",
30
- "@anastops/adapters": "1.0.0",
31
- "@anastops/mcp-server": "1.0.0",
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": "^20.11.0",
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"]
@@ -0,0 +1,5 @@
1
+ """
2
+ Ranger TUI - Beautiful terminal UI dashboard for Anastops orchestration.
3
+ """
4
+
5
+ __version__ = "0.1.0"
@@ -0,0 +1,16 @@
1
+ """
2
+ Entry point for ranger-tui.
3
+ """
4
+
5
+ import asyncio
6
+ from ranger_tui.app import RangerApp
7
+
8
+
9
+ def main() -> None:
10
+ """Run the Ranger TUI application."""
11
+ app = RangerApp()
12
+ app.run()
13
+
14
+
15
+ if __name__ == "__main__":
16
+ main()