@wundr.io/cli 1.0.10 → 1.0.12
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/bin/wundr.js +8 -4
- package/package.json +23 -23
- package/src/ai/ai-service.ts +16 -17
- package/src/ai/claude-client.ts +16 -16
- package/src/ai/conversation-manager.ts +29 -29
- package/src/cli.ts +4 -4
- package/src/commands/ai.ts +246 -78
- package/src/commands/alignment.ts +74 -74
- package/src/commands/analyze-optimized.ts +111 -78
- package/src/commands/analyze.ts +14 -14
- package/src/commands/batch.ts +179 -42
- package/src/commands/chat.ts +37 -30
- package/src/commands/claude-init.ts +41 -45
- package/src/commands/claude-setup.ts +204 -119
- package/src/commands/computer-setup.ts +85 -43
- package/src/commands/create-command.ts +4 -4
- package/src/commands/create.ts +27 -27
- package/src/commands/dashboard.ts +24 -24
- package/src/commands/govern.ts +25 -25
- package/src/commands/governance.ts +34 -34
- package/src/commands/guardian.ts +56 -56
- package/src/commands/init.ts +25 -22
- package/src/commands/orchestrator.ts +68 -41
- package/src/commands/performance-optimizer.ts +34 -35
- package/src/commands/plugins.ts +27 -27
- package/src/commands/project-update.ts +175 -72
- package/src/commands/rag.ts +185 -78
- package/src/commands/session.ts +35 -35
- package/src/commands/setup.ts +40 -344
- package/src/commands/test-init.ts +3 -3
- package/src/commands/test.ts +4 -4
- package/src/commands/watch.ts +28 -29
- package/src/commands/worktree.ts +49 -49
- package/src/context/context-manager.ts +10 -10
- package/src/context/session-manager.ts +41 -41
- package/src/framework/command-interface.ts +520 -0
- package/src/framework/command-registry.ts +942 -0
- package/src/framework/completion-exporter.ts +383 -0
- package/src/framework/debug-logger.ts +519 -0
- package/src/framework/error-handler.ts +867 -0
- package/src/framework/help-generator.ts +540 -0
- package/src/framework/index.ts +169 -0
- package/src/framework/interactive-repl.ts +703 -0
- package/src/framework/output-formatter.ts +834 -0
- package/src/framework/progress-manager.ts +539 -0
- package/src/index.ts +4 -4
- package/src/interactive/interactive-mode.ts +16 -16
- package/src/lib/conflict-resolution.ts +799 -9
- package/src/lib/merge-strategy.ts +529 -7
- package/src/lib/safety-mechanisms.ts +422 -18
- package/src/lib/state-detection.ts +1015 -13
- package/src/nlp/command-mapper.ts +29 -29
- package/src/nlp/command-parser.ts +17 -17
- package/src/nlp/intent-classifier.ts +7 -7
- package/src/nlp/intent-parser.ts +54 -52
- package/src/plugins/plugin-manager.ts +61 -39
- package/src/tests/computer-setup-integration.test.ts +46 -15
- package/src/types/modules.d.ts +424 -1
- package/src/utils/backup-rollback-manager.ts +11 -8
- package/src/utils/config-manager.ts +3 -3
- package/src/utils/error-handler.ts +2 -2
- package/src/utils/logger.ts +22 -22
- package/templates/batch/ci-cd.yaml +7 -7
- package/test-suites/api/health.spec.ts +20 -23
- package/test-suites/helpers/test-config.ts +14 -13
- package/test-suites/ui/accessibility.spec.ts +27 -22
- package/test-suites/ui/smoke.spec.ts +26 -21
- package/LICENSE +0 -21
- package/dist/ai/ai-service.d.ts +0 -152
- package/dist/ai/ai-service.d.ts.map +0 -1
- package/dist/ai/ai-service.js +0 -430
- package/dist/ai/ai-service.js.map +0 -1
- package/dist/ai/claude-client.d.ts +0 -130
- package/dist/ai/claude-client.d.ts.map +0 -1
- package/dist/ai/claude-client.js +0 -340
- package/dist/ai/claude-client.js.map +0 -1
- package/dist/ai/conversation-manager.d.ts +0 -164
- package/dist/ai/conversation-manager.d.ts.map +0 -1
- package/dist/ai/conversation-manager.js +0 -614
- package/dist/ai/conversation-manager.js.map +0 -1
- package/dist/ai/index.d.ts +0 -5
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js +0 -8
- package/dist/ai/index.js.map +0 -1
- package/dist/cli.d.ts +0 -36
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -192
- package/dist/cli.js.map +0 -1
- package/dist/commands/ai.d.ts +0 -89
- package/dist/commands/ai.d.ts.map +0 -1
- package/dist/commands/ai.js +0 -799
- package/dist/commands/ai.js.map +0 -1
- package/dist/commands/alignment.d.ts +0 -78
- package/dist/commands/alignment.d.ts.map +0 -1
- package/dist/commands/alignment.js +0 -817
- package/dist/commands/alignment.js.map +0 -1
- package/dist/commands/analyze-optimized.d.ts +0 -14
- package/dist/commands/analyze-optimized.d.ts.map +0 -1
- package/dist/commands/analyze-optimized.js +0 -600
- package/dist/commands/analyze-optimized.js.map +0 -1
- package/dist/commands/analyze.d.ts +0 -65
- package/dist/commands/analyze.d.ts.map +0 -1
- package/dist/commands/analyze.js +0 -435
- package/dist/commands/analyze.js.map +0 -1
- package/dist/commands/batch.d.ts +0 -71
- package/dist/commands/batch.d.ts.map +0 -1
- package/dist/commands/batch.js +0 -738
- package/dist/commands/batch.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -71
- package/dist/commands/chat.d.ts.map +0 -1
- package/dist/commands/chat.js +0 -674
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/claude-init.d.ts +0 -28
- package/dist/commands/claude-init.d.ts.map +0 -1
- package/dist/commands/claude-init.js +0 -591
- package/dist/commands/claude-init.js.map +0 -1
- package/dist/commands/claude-setup.d.ts +0 -119
- package/dist/commands/claude-setup.d.ts.map +0 -1
- package/dist/commands/claude-setup.js +0 -1073
- package/dist/commands/claude-setup.js.map +0 -1
- package/dist/commands/computer-setup-commands.d.ts +0 -53
- package/dist/commands/computer-setup-commands.d.ts.map +0 -1
- package/dist/commands/computer-setup-commands.js +0 -705
- package/dist/commands/computer-setup-commands.js.map +0 -1
- package/dist/commands/computer-setup.d.ts +0 -7
- package/dist/commands/computer-setup.d.ts.map +0 -1
- package/dist/commands/computer-setup.js +0 -849
- package/dist/commands/computer-setup.js.map +0 -1
- package/dist/commands/create-command.d.ts +0 -7
- package/dist/commands/create-command.d.ts.map +0 -1
- package/dist/commands/create-command.js +0 -158
- package/dist/commands/create-command.js.map +0 -1
- package/dist/commands/create.d.ts +0 -74
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -556
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -91
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -538
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/govern.d.ts +0 -70
- package/dist/commands/govern.d.ts.map +0 -1
- package/dist/commands/govern.js +0 -481
- package/dist/commands/govern.js.map +0 -1
- package/dist/commands/governance.d.ts +0 -17
- package/dist/commands/governance.d.ts.map +0 -1
- package/dist/commands/governance.js +0 -703
- package/dist/commands/governance.js.map +0 -1
- package/dist/commands/guardian.d.ts +0 -20
- package/dist/commands/guardian.d.ts.map +0 -1
- package/dist/commands/guardian.js +0 -597
- package/dist/commands/guardian.js.map +0 -1
- package/dist/commands/init.d.ts +0 -59
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -650
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/orchestrator.d.ts +0 -7
- package/dist/commands/orchestrator.d.ts.map +0 -1
- package/dist/commands/orchestrator.js +0 -571
- package/dist/commands/orchestrator.js.map +0 -1
- package/dist/commands/performance-optimizer.d.ts +0 -30
- package/dist/commands/performance-optimizer.d.ts.map +0 -1
- package/dist/commands/performance-optimizer.js +0 -650
- package/dist/commands/performance-optimizer.js.map +0 -1
- package/dist/commands/plugins.d.ts +0 -87
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js +0 -685
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/rag.d.ts +0 -7
- package/dist/commands/rag.d.ts.map +0 -1
- package/dist/commands/rag.js +0 -748
- package/dist/commands/rag.js.map +0 -1
- package/dist/commands/session.d.ts +0 -41
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -441
- package/dist/commands/session.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -29
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -397
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/test-init.d.ts +0 -9
- package/dist/commands/test-init.d.ts.map +0 -1
- package/dist/commands/test-init.js +0 -222
- package/dist/commands/test-init.js.map +0 -1
- package/dist/commands/test.d.ts +0 -25
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -217
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/vp.d.ts +0 -7
- package/dist/commands/vp.d.ts.map +0 -1
- package/dist/commands/vp.js +0 -571
- package/dist/commands/vp.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -76
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -613
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/worktree.d.ts +0 -63
- package/dist/commands/worktree.d.ts.map +0 -1
- package/dist/commands/worktree.js +0 -774
- package/dist/commands/worktree.js.map +0 -1
- package/dist/context/context-manager.d.ts +0 -155
- package/dist/context/context-manager.d.ts.map +0 -1
- package/dist/context/context-manager.js +0 -383
- package/dist/context/context-manager.js.map +0 -1
- package/dist/context/index.d.ts +0 -3
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -6
- package/dist/context/index.js.map +0 -1
- package/dist/context/session-manager.d.ts +0 -207
- package/dist/context/session-manager.d.ts.map +0 -1
- package/dist/context/session-manager.js +0 -686
- package/dist/context/session-manager.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive/interactive-mode.d.ts +0 -76
- package/dist/interactive/interactive-mode.d.ts.map +0 -1
- package/dist/interactive/interactive-mode.js +0 -732
- package/dist/interactive/interactive-mode.js.map +0 -1
- package/dist/nlp/command-mapper.d.ts +0 -174
- package/dist/nlp/command-mapper.d.ts.map +0 -1
- package/dist/nlp/command-mapper.js +0 -624
- package/dist/nlp/command-mapper.js.map +0 -1
- package/dist/nlp/command-parser.d.ts +0 -106
- package/dist/nlp/command-parser.d.ts.map +0 -1
- package/dist/nlp/command-parser.js +0 -417
- package/dist/nlp/command-parser.js.map +0 -1
- package/dist/nlp/index.d.ts +0 -5
- package/dist/nlp/index.d.ts.map +0 -1
- package/dist/nlp/index.js +0 -8
- package/dist/nlp/index.js.map +0 -1
- package/dist/nlp/intent-classifier.d.ts +0 -59
- package/dist/nlp/intent-classifier.d.ts.map +0 -1
- package/dist/nlp/intent-classifier.js +0 -384
- package/dist/nlp/intent-classifier.js.map +0 -1
- package/dist/nlp/intent-parser.d.ts +0 -152
- package/dist/nlp/intent-parser.d.ts.map +0 -1
- package/dist/nlp/intent-parser.js +0 -744
- package/dist/nlp/intent-parser.js.map +0 -1
- package/dist/plugins/plugin-manager.d.ts +0 -120
- package/dist/plugins/plugin-manager.d.ts.map +0 -1
- package/dist/plugins/plugin-manager.js +0 -595
- package/dist/plugins/plugin-manager.js.map +0 -1
- package/dist/types/index.d.ts +0 -224
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/utils/backup-rollback-manager.d.ts +0 -72
- package/dist/utils/backup-rollback-manager.d.ts.map +0 -1
- package/dist/utils/backup-rollback-manager.js +0 -289
- package/dist/utils/backup-rollback-manager.js.map +0 -1
- package/dist/utils/claude-config-installer.d.ts +0 -98
- package/dist/utils/claude-config-installer.d.ts.map +0 -1
- package/dist/utils/claude-config-installer.js +0 -678
- package/dist/utils/claude-config-installer.js.map +0 -1
- package/dist/utils/config-manager.d.ts +0 -73
- package/dist/utils/config-manager.d.ts.map +0 -1
- package/dist/utils/config-manager.js +0 -339
- package/dist/utils/config-manager.js.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -46
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/error-handler.js +0 -169
- package/dist/utils/error-handler.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -25
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -105
- package/dist/utils/logger.js.map +0 -1
- package/src/commands/computer-setup-commands.ts +0 -872
package/bin/wundr.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Wundr CLI Entry Point
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* This is the main executable for the Wundr CLI tool.
|
|
7
7
|
* It handles cross-platform compatibility and bootstraps the CLI.
|
|
8
8
|
*/
|
|
@@ -26,7 +26,9 @@ if (isDevelopment && existsSync(srcPath)) {
|
|
|
26
26
|
if (existsSync(distPath)) {
|
|
27
27
|
require(distPath);
|
|
28
28
|
} else {
|
|
29
|
-
console.error(
|
|
29
|
+
console.error(
|
|
30
|
+
'No compiled JavaScript found. Please run "npm run build" first.'
|
|
31
|
+
);
|
|
30
32
|
process.exit(1);
|
|
31
33
|
}
|
|
32
34
|
}
|
|
@@ -38,6 +40,8 @@ if (isDevelopment && existsSync(srcPath)) {
|
|
|
38
40
|
cli.main();
|
|
39
41
|
}
|
|
40
42
|
} else {
|
|
41
|
-
console.error(
|
|
43
|
+
console.error(
|
|
44
|
+
'Wundr CLI not properly installed. Please reinstall the package.'
|
|
45
|
+
);
|
|
42
46
|
process.exit(1);
|
|
43
|
-
}
|
|
47
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wundr.io/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"description": "Unified CLI framework for the Wundr platform",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wundr",
|
|
@@ -38,18 +38,37 @@
|
|
|
38
38
|
"test-suites",
|
|
39
39
|
"README.md"
|
|
40
40
|
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"build:watch": "tsc --watch",
|
|
44
|
+
"clean": "rm -rf dist",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,md}'",
|
|
47
|
+
"format:check": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json,md}'",
|
|
48
|
+
"lint": "eslint src --ext .ts,.tsx,.js,.jsx --fix",
|
|
49
|
+
"test": "jest",
|
|
50
|
+
"test:watch": "jest --watch",
|
|
51
|
+
"typecheck": "tsc --noEmit"
|
|
52
|
+
},
|
|
41
53
|
"dependencies": {
|
|
54
|
+
"@axe-core/playwright": "^4.10.0",
|
|
42
55
|
"@oclif/core": "^3.15.0",
|
|
43
56
|
"@oclif/plugin-help": "^6.0.0",
|
|
44
57
|
"@oclif/plugin-plugins": "^4.1.0",
|
|
58
|
+
"@playwright/test": "^1.48.0",
|
|
45
59
|
"@types/axios": "^0.9.36",
|
|
46
60
|
"@types/open": "^6.2.1",
|
|
61
|
+
"@wundr.io/computer-setup": "^1.0.12",
|
|
62
|
+
"@wundr.io/config": "^1.0.12",
|
|
63
|
+
"@wundr.io/core": "^1.0.12",
|
|
64
|
+
"@wundr.io/governance": "^1.0.12",
|
|
65
|
+
"@wundr.io/guardian-dashboard": "^1.0.12",
|
|
47
66
|
"@wundr.io/vp-daemon": "^1.0.6",
|
|
48
67
|
"axios": "^1.11.0",
|
|
49
|
-
"chokidar": "^3.5.3",
|
|
50
68
|
"blessed": "^0.1.81",
|
|
51
69
|
"blessed-contrib": "^4.11.0",
|
|
52
70
|
"chalk": "^5.3.0",
|
|
71
|
+
"chokidar": "^3.5.3",
|
|
53
72
|
"commander": "^11.1.0",
|
|
54
73
|
"conf": "^12.0.0",
|
|
55
74
|
"execa": "^8.0.1",
|
|
@@ -61,19 +80,12 @@
|
|
|
61
80
|
"node-pty": "^1.0.0",
|
|
62
81
|
"open": "^10.2.0",
|
|
63
82
|
"ora": "^8.0.1",
|
|
64
|
-
"@playwright/test": "^1.48.0",
|
|
65
|
-
"@axe-core/playwright": "^4.10.0",
|
|
66
83
|
"prompts": "^2.4.2",
|
|
67
84
|
"rxjs": "^7.8.1",
|
|
68
85
|
"terminal-kit": "^3.0.1",
|
|
69
86
|
"ws": "^8.16.0",
|
|
70
87
|
"yaml": "^2.3.4",
|
|
71
|
-
"zod": "^3.22.4"
|
|
72
|
-
"@wundr.io/computer-setup": "1.0.6",
|
|
73
|
-
"@wundr.io/config": "1.0.6",
|
|
74
|
-
"@wundr.io/core": "1.0.6",
|
|
75
|
-
"@wundr.io/guardian-dashboard": "1.0.6",
|
|
76
|
-
"@wundr.io/governance": "1.0.6"
|
|
88
|
+
"zod": "^3.22.4"
|
|
77
89
|
},
|
|
78
90
|
"devDependencies": {
|
|
79
91
|
"@types/blessed": "^0.1.25",
|
|
@@ -124,17 +136,5 @@
|
|
|
124
136
|
"description": "Computer setup and provisioning for developer machines"
|
|
125
137
|
}
|
|
126
138
|
}
|
|
127
|
-
},
|
|
128
|
-
"scripts": {
|
|
129
|
-
"build": "tsc",
|
|
130
|
-
"build:watch": "tsc --watch",
|
|
131
|
-
"clean": "rm -rf dist",
|
|
132
|
-
"dev": "tsc --watch",
|
|
133
|
-
"format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,md}'",
|
|
134
|
-
"format:check": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json,md}'",
|
|
135
|
-
"lint": "eslint src --ext .ts,.tsx,.js,.jsx --fix",
|
|
136
|
-
"test": "jest",
|
|
137
|
-
"test:watch": "jest --watch",
|
|
138
|
-
"typecheck": "tsc --noEmit"
|
|
139
139
|
}
|
|
140
|
-
}
|
|
140
|
+
}
|
package/src/ai/ai-service.ts
CHANGED
|
@@ -5,7 +5,6 @@ import type { ChatSession, ChatMessage } from '../types';
|
|
|
5
5
|
import type { ClaudeMessage } from './claude-client';
|
|
6
6
|
import type { ConfigManager } from '../utils/config-manager';
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
/**
|
|
10
9
|
* AI service configuration
|
|
11
10
|
*/
|
|
@@ -54,7 +53,7 @@ export class AIService {
|
|
|
54
53
|
if (this.config.provider === 'claude') {
|
|
55
54
|
if (!this.config.apiKey) {
|
|
56
55
|
logger.warn(
|
|
57
|
-
'Claude API key not configured. AI features will be limited.'
|
|
56
|
+
'Claude API key not configured. AI features will be limited.'
|
|
58
57
|
);
|
|
59
58
|
logger.info('Configure your API key using: wundr ai setup');
|
|
60
59
|
logger.info('Or set the CLAUDE_API_KEY environment variable');
|
|
@@ -70,7 +69,7 @@ export class AIService {
|
|
|
70
69
|
});
|
|
71
70
|
|
|
72
71
|
logger.info(
|
|
73
|
-
`Initialized Claude client with model: ${this.config.model}
|
|
72
|
+
`Initialized Claude client with model: ${this.config.model}`
|
|
74
73
|
);
|
|
75
74
|
} else {
|
|
76
75
|
throw new Error(`Unsupported AI provider: ${this.config.provider}`);
|
|
@@ -118,7 +117,7 @@ export class AIService {
|
|
|
118
117
|
async sendMessage(
|
|
119
118
|
sessionId: string,
|
|
120
119
|
message: string,
|
|
121
|
-
context?: ConversationContext
|
|
120
|
+
context?: ConversationContext
|
|
122
121
|
): Promise<string> {
|
|
123
122
|
this.ensureClientInitialized();
|
|
124
123
|
|
|
@@ -134,7 +133,7 @@ export class AIService {
|
|
|
134
133
|
const systemPrompt = this.buildSystemPrompt(context);
|
|
135
134
|
const response = await this.claudeClient!.sendConversation(
|
|
136
135
|
conversationMessages,
|
|
137
|
-
systemPrompt
|
|
136
|
+
systemPrompt
|
|
138
137
|
);
|
|
139
138
|
|
|
140
139
|
// Add AI response to history
|
|
@@ -159,7 +158,7 @@ export class AIService {
|
|
|
159
158
|
async *streamMessage(
|
|
160
159
|
sessionId: string,
|
|
161
160
|
message: string,
|
|
162
|
-
context?: ConversationContext
|
|
161
|
+
context?: ConversationContext
|
|
163
162
|
): AsyncGenerator<string, string, unknown> {
|
|
164
163
|
this.ensureClientInitialized();
|
|
165
164
|
|
|
@@ -177,7 +176,7 @@ export class AIService {
|
|
|
177
176
|
|
|
178
177
|
for await (const chunk of this.claudeClient!.streamConversation(
|
|
179
178
|
conversationMessages,
|
|
180
|
-
systemPrompt
|
|
179
|
+
systemPrompt
|
|
181
180
|
)) {
|
|
182
181
|
fullResponse += chunk;
|
|
183
182
|
yield chunk;
|
|
@@ -204,7 +203,7 @@ export class AIService {
|
|
|
204
203
|
*/
|
|
205
204
|
async parseNaturalLanguageCommand(
|
|
206
205
|
input: string,
|
|
207
|
-
_context?: ConversationContext
|
|
206
|
+
_context?: ConversationContext
|
|
208
207
|
): Promise<{
|
|
209
208
|
intent: string;
|
|
210
209
|
command: string;
|
|
@@ -229,7 +228,7 @@ export class AIService {
|
|
|
229
228
|
|
|
230
229
|
const result = await this.claudeClient!.analyzeIntent(
|
|
231
230
|
input,
|
|
232
|
-
availableCommands
|
|
231
|
+
availableCommands
|
|
233
232
|
);
|
|
234
233
|
|
|
235
234
|
return {
|
|
@@ -251,7 +250,7 @@ export class AIService {
|
|
|
251
250
|
*/
|
|
252
251
|
async suggestCommands(
|
|
253
252
|
goal: string,
|
|
254
|
-
context?: ConversationContext
|
|
253
|
+
context?: ConversationContext
|
|
255
254
|
): Promise<
|
|
256
255
|
Array<{
|
|
257
256
|
command: string;
|
|
@@ -279,7 +278,7 @@ export class AIService {
|
|
|
279
278
|
const result = await this.claudeClient!.suggestCommands(
|
|
280
279
|
projectContext,
|
|
281
280
|
goal,
|
|
282
|
-
availableCommands
|
|
281
|
+
availableCommands
|
|
283
282
|
);
|
|
284
283
|
|
|
285
284
|
return result.suggestions.map(suggestion => ({
|
|
@@ -298,7 +297,7 @@ export class AIService {
|
|
|
298
297
|
async explainCommandResults(
|
|
299
298
|
command: string,
|
|
300
299
|
output: string,
|
|
301
|
-
context?: ConversationContext
|
|
300
|
+
context?: ConversationContext
|
|
302
301
|
): Promise<string> {
|
|
303
302
|
this.ensureClientInitialized();
|
|
304
303
|
|
|
@@ -309,7 +308,7 @@ export class AIService {
|
|
|
309
308
|
return await this.claudeClient!.explainResults(
|
|
310
309
|
command,
|
|
311
310
|
output,
|
|
312
|
-
contextString
|
|
311
|
+
contextString
|
|
313
312
|
);
|
|
314
313
|
} catch (error) {
|
|
315
314
|
logger.error('Failed to explain command results:', error);
|
|
@@ -323,7 +322,7 @@ export class AIService {
|
|
|
323
322
|
async generateContextualHelp(
|
|
324
323
|
command: string,
|
|
325
324
|
context?: ConversationContext,
|
|
326
|
-
userLevel: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
|
|
325
|
+
userLevel: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
|
|
327
326
|
): Promise<string> {
|
|
328
327
|
this.ensureClientInitialized();
|
|
329
328
|
|
|
@@ -332,7 +331,7 @@ export class AIService {
|
|
|
332
331
|
return await this.claudeClient!.generateHelp(
|
|
333
332
|
command,
|
|
334
333
|
userContext,
|
|
335
|
-
userLevel
|
|
334
|
+
userLevel
|
|
336
335
|
);
|
|
337
336
|
} catch (error) {
|
|
338
337
|
logger.error('Failed to generate contextual help:', error);
|
|
@@ -492,12 +491,12 @@ export class AIService {
|
|
|
492
491
|
|
|
493
492
|
if (!configuredKey) {
|
|
494
493
|
throw new Error(
|
|
495
|
-
'AI API key not configured.\n\nTo set up AI features:\n1. Run: wundr ai setup\n2. Or set environment variable: export CLAUDE_API_KEY=your_key_here\n3. Or add to config: wundr ai config set apiKey your_key_here'
|
|
494
|
+
'AI API key not configured.\n\nTo set up AI features:\n1. Run: wundr ai setup\n2. Or set environment variable: export CLAUDE_API_KEY=your_key_here\n3. Or add to config: wundr ai config set apiKey your_key_here'
|
|
496
495
|
);
|
|
497
496
|
}
|
|
498
497
|
|
|
499
498
|
throw new Error(
|
|
500
|
-
'AI client failed to initialize. Please check your configuration.'
|
|
499
|
+
'AI client failed to initialize. Please check your configuration.'
|
|
501
500
|
);
|
|
502
501
|
}
|
|
503
502
|
}
|
package/src/ai/claude-client.ts
CHANGED
|
@@ -94,7 +94,7 @@ export class ClaudeClient {
|
|
|
94
94
|
async sendMessage(
|
|
95
95
|
message: string,
|
|
96
96
|
systemPrompt?: string,
|
|
97
|
-
options?: Partial<ClaudeConfig
|
|
97
|
+
options?: Partial<ClaudeConfig>
|
|
98
98
|
): Promise<string> {
|
|
99
99
|
try {
|
|
100
100
|
const messages: ClaudeMessage[] = [];
|
|
@@ -124,7 +124,7 @@ export class ClaudeClient {
|
|
|
124
124
|
async sendConversation(
|
|
125
125
|
messages: ClaudeMessage[],
|
|
126
126
|
systemPrompt?: string,
|
|
127
|
-
options?: Partial<ClaudeConfig
|
|
127
|
+
options?: Partial<ClaudeConfig>
|
|
128
128
|
): Promise<string> {
|
|
129
129
|
try {
|
|
130
130
|
const conversationMessages = [...messages];
|
|
@@ -152,7 +152,7 @@ export class ClaudeClient {
|
|
|
152
152
|
async *streamConversation(
|
|
153
153
|
messages: ClaudeMessage[],
|
|
154
154
|
systemPrompt?: string,
|
|
155
|
-
options?: Partial<ClaudeConfig
|
|
155
|
+
options?: Partial<ClaudeConfig>
|
|
156
156
|
): AsyncGenerator<string, void, unknown> {
|
|
157
157
|
try {
|
|
158
158
|
const conversationMessages = [...messages];
|
|
@@ -172,7 +172,7 @@ export class ClaudeClient {
|
|
|
172
172
|
},
|
|
173
173
|
{
|
|
174
174
|
responseType: 'stream',
|
|
175
|
-
}
|
|
175
|
+
}
|
|
176
176
|
);
|
|
177
177
|
|
|
178
178
|
let buffer = '';
|
|
@@ -186,8 +186,8 @@ export class ClaudeClient {
|
|
|
186
186
|
if (line.startsWith('data: ')) {
|
|
187
187
|
const data = line.slice(6);
|
|
188
188
|
if (data === '[DONE]') {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
191
|
|
|
192
192
|
try {
|
|
193
193
|
const parsed: ClaudeStreamChunk = JSON.parse(data);
|
|
@@ -204,7 +204,7 @@ return;
|
|
|
204
204
|
} catch (error) {
|
|
205
205
|
throw this.handleError(
|
|
206
206
|
error,
|
|
207
|
-
'Failed to stream conversation with Claude'
|
|
207
|
+
'Failed to stream conversation with Claude'
|
|
208
208
|
);
|
|
209
209
|
}
|
|
210
210
|
}
|
|
@@ -214,7 +214,7 @@ return;
|
|
|
214
214
|
*/
|
|
215
215
|
async analyzeIntent(
|
|
216
216
|
input: string,
|
|
217
|
-
availableCommands: string[]
|
|
217
|
+
availableCommands: string[]
|
|
218
218
|
): Promise<{
|
|
219
219
|
intent: string;
|
|
220
220
|
confidence: number;
|
|
@@ -255,7 +255,7 @@ Respond with JSON only in this format:
|
|
|
255
255
|
async suggestCommands(
|
|
256
256
|
projectContext: string,
|
|
257
257
|
userGoal: string,
|
|
258
|
-
availableCommands: string[]
|
|
258
|
+
availableCommands: string[]
|
|
259
259
|
): Promise<{
|
|
260
260
|
suggestions: Array<{
|
|
261
261
|
command: string;
|
|
@@ -298,7 +298,7 @@ Respond with JSON only:
|
|
|
298
298
|
async explainResults(
|
|
299
299
|
command: string,
|
|
300
300
|
output: string,
|
|
301
|
-
context?: string
|
|
301
|
+
context?: string
|
|
302
302
|
): Promise<string> {
|
|
303
303
|
const systemPrompt = `You are a helpful CLI assistant. Explain the results of a CLI command in clear, natural language. Focus on:
|
|
304
304
|
1. What the command did
|
|
@@ -328,7 +328,7 @@ ${output}`;
|
|
|
328
328
|
async generateHelp(
|
|
329
329
|
command: string,
|
|
330
330
|
userContext: string,
|
|
331
|
-
difficulty: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
|
|
331
|
+
difficulty: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
|
|
332
332
|
): Promise<string> {
|
|
333
333
|
const systemPrompt = `You are a CLI documentation assistant. Generate helpful, contextual guidance for CLI commands. Adapt the explanation level to: ${difficulty}
|
|
334
334
|
|
|
@@ -364,7 +364,7 @@ User Context: ${userContext}`;
|
|
|
364
364
|
'Respond with just "OK" if you can understand this message.',
|
|
365
365
|
{
|
|
366
366
|
maxTokens: 10,
|
|
367
|
-
}
|
|
367
|
+
}
|
|
368
368
|
);
|
|
369
369
|
return true;
|
|
370
370
|
} catch (error) {
|
|
@@ -418,28 +418,28 @@ User Context: ${userContext}`;
|
|
|
418
418
|
this.client.interceptors.request.use(
|
|
419
419
|
(config: any) => {
|
|
420
420
|
logger.debug(
|
|
421
|
-
`Claude API Request: ${config.method?.toUpperCase()} ${config.url}
|
|
421
|
+
`Claude API Request: ${config.method?.toUpperCase()} ${config.url}`
|
|
422
422
|
);
|
|
423
423
|
return config;
|
|
424
424
|
},
|
|
425
425
|
(error: any) => {
|
|
426
426
|
logger.error('Claude API Request Error:', error);
|
|
427
427
|
return Promise.reject(error);
|
|
428
|
-
}
|
|
428
|
+
}
|
|
429
429
|
);
|
|
430
430
|
|
|
431
431
|
// Response interceptor
|
|
432
432
|
this.client.interceptors.response.use(
|
|
433
433
|
(response: any) => {
|
|
434
434
|
logger.debug(
|
|
435
|
-
`Claude API Response: ${response.status} ${response.statusText}
|
|
435
|
+
`Claude API Response: ${response.status} ${response.statusText}`
|
|
436
436
|
);
|
|
437
437
|
return response;
|
|
438
438
|
},
|
|
439
439
|
(error: any) => {
|
|
440
440
|
logger.error('Claude API Response Error:', error);
|
|
441
441
|
return Promise.reject(error);
|
|
442
|
-
}
|
|
442
|
+
}
|
|
443
443
|
);
|
|
444
444
|
}
|
|
445
445
|
|
|
@@ -63,7 +63,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
63
63
|
|
|
64
64
|
constructor(
|
|
65
65
|
claudeClient: ClaudeClient,
|
|
66
|
-
config: Partial<ConversationConfig> = {}
|
|
66
|
+
config: Partial<ConversationConfig> = {}
|
|
67
67
|
) {
|
|
68
68
|
super();
|
|
69
69
|
|
|
@@ -93,7 +93,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
93
93
|
context?: string;
|
|
94
94
|
tags?: string[];
|
|
95
95
|
metadata?: Partial<SessionMetadata>;
|
|
96
|
-
} = {}
|
|
96
|
+
} = {}
|
|
97
97
|
): Promise<EnhancedChatSession> {
|
|
98
98
|
const sessionId =
|
|
99
99
|
options.id ||
|
|
@@ -179,7 +179,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
179
179
|
systemPrompt?: string;
|
|
180
180
|
streaming?: boolean;
|
|
181
181
|
metadata?: Record<string, any>;
|
|
182
|
-
} = {}
|
|
182
|
+
} = {}
|
|
183
183
|
): Promise<string | AsyncGenerator<string, void, unknown>> {
|
|
184
184
|
const session = await this.loadSession(sessionId);
|
|
185
185
|
if (!session) {
|
|
@@ -214,12 +214,12 @@ export class ConversationManager extends EventEmitter {
|
|
|
214
214
|
if (options.streaming) {
|
|
215
215
|
response = this.claudeClient.streamConversation(
|
|
216
216
|
claudeMessages,
|
|
217
|
-
options.systemPrompt
|
|
217
|
+
options.systemPrompt
|
|
218
218
|
);
|
|
219
219
|
} else {
|
|
220
220
|
response = await this.claudeClient.sendConversation(
|
|
221
221
|
claudeMessages,
|
|
222
|
-
options.systemPrompt
|
|
222
|
+
options.systemPrompt
|
|
223
223
|
);
|
|
224
224
|
}
|
|
225
225
|
|
|
@@ -228,13 +228,13 @@ export class ConversationManager extends EventEmitter {
|
|
|
228
228
|
return this.handleStreamingResponse(
|
|
229
229
|
session,
|
|
230
230
|
response as AsyncGenerator<string, void, unknown>,
|
|
231
|
-
startTime
|
|
231
|
+
startTime
|
|
232
232
|
);
|
|
233
233
|
} else {
|
|
234
234
|
return await this.handleSyncResponse(
|
|
235
235
|
session,
|
|
236
236
|
response as string,
|
|
237
|
-
startTime
|
|
237
|
+
startTime
|
|
238
238
|
);
|
|
239
239
|
}
|
|
240
240
|
} catch (error) {
|
|
@@ -254,7 +254,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
254
254
|
from?: Date;
|
|
255
255
|
to?: Date;
|
|
256
256
|
roles?: ('user' | 'assistant' | 'system')[];
|
|
257
|
-
} = {}
|
|
257
|
+
} = {}
|
|
258
258
|
): ChatMessage[] {
|
|
259
259
|
const session = this.activeSessions.get(sessionId);
|
|
260
260
|
if (!session) {
|
|
@@ -289,7 +289,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
289
289
|
async addContext(
|
|
290
290
|
sessionId: string,
|
|
291
291
|
contextType: 'project' | 'command' | 'preference' | 'workflow',
|
|
292
|
-
contextData: any
|
|
292
|
+
contextData: any
|
|
293
293
|
): Promise<void> {
|
|
294
294
|
const session = await this.loadSession(sessionId);
|
|
295
295
|
if (!session) {
|
|
@@ -331,7 +331,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
331
331
|
olderThan?: number; // days
|
|
332
332
|
inactiveFor?: number; // days
|
|
333
333
|
maxSessions?: number;
|
|
334
|
-
} = {}
|
|
334
|
+
} = {}
|
|
335
335
|
): Promise<string[]> {
|
|
336
336
|
const archivedSessions: string[] = [];
|
|
337
337
|
const now = new Date();
|
|
@@ -370,7 +370,7 @@ export class ConversationManager extends EventEmitter {
|
|
|
370
370
|
this.activeSessions.size > criteria.maxSessions
|
|
371
371
|
) {
|
|
372
372
|
const sessionsByAccess = Array.from(this.activeSessions.entries()).sort(
|
|
373
|
-
([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime()
|
|
373
|
+
([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime()
|
|
374
374
|
);
|
|
375
375
|
|
|
376
376
|
const excessCount = this.activeSessions.size - criteria.maxSessions;
|
|
@@ -443,8 +443,8 @@ export class ConversationManager extends EventEmitter {
|
|
|
443
443
|
if (sessionId) {
|
|
444
444
|
const session = this.activeSessions.get(sessionId);
|
|
445
445
|
if (!session) {
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
448
|
|
|
449
449
|
return {
|
|
450
450
|
messageCount: session.history.length,
|
|
@@ -460,12 +460,12 @@ return null;
|
|
|
460
460
|
const totalSessions = this.activeSessions.size;
|
|
461
461
|
const totalMessages = Array.from(this.activeSessions.values()).reduce(
|
|
462
462
|
(sum, session) => sum + session.history.length,
|
|
463
|
-
0
|
|
463
|
+
0
|
|
464
464
|
);
|
|
465
465
|
|
|
466
466
|
const totalTokens = Array.from(this.activeSessions.values()).reduce(
|
|
467
467
|
(sum, session) => sum + session.metadata.tokenUsage.total,
|
|
468
|
-
0
|
|
468
|
+
0
|
|
469
469
|
);
|
|
470
470
|
|
|
471
471
|
return {
|
|
@@ -515,7 +515,7 @@ return null;
|
|
|
515
515
|
*/
|
|
516
516
|
async exportSession(
|
|
517
517
|
sessionId: string,
|
|
518
|
-
format: 'json' | 'markdown' | 'csv'
|
|
518
|
+
format: 'json' | 'markdown' | 'csv'
|
|
519
519
|
): Promise<string> {
|
|
520
520
|
const session = await this.loadSession(sessionId);
|
|
521
521
|
if (!session) {
|
|
@@ -570,7 +570,7 @@ return null;
|
|
|
570
570
|
includeArchived?: boolean;
|
|
571
571
|
sortBy?: 'created' | 'updated' | 'lastAccessed';
|
|
572
572
|
sortOrder?: 'asc' | 'desc';
|
|
573
|
-
} = {}
|
|
573
|
+
} = {}
|
|
574
574
|
): Promise<{
|
|
575
575
|
sessions: Array<
|
|
576
576
|
Pick<
|
|
@@ -630,7 +630,7 @@ return null;
|
|
|
630
630
|
logger.error('Session cleanup failed:', error);
|
|
631
631
|
});
|
|
632
632
|
},
|
|
633
|
-
10 * 60 * 1000
|
|
633
|
+
10 * 60 * 1000
|
|
634
634
|
); // Every 10 minutes
|
|
635
635
|
|
|
636
636
|
logger.debug('Conversation manager initialized');
|
|
@@ -646,7 +646,7 @@ return null;
|
|
|
646
646
|
// Keep system messages and recent messages
|
|
647
647
|
const systemMessages = session.history.filter(msg => msg.role === 'system');
|
|
648
648
|
const recentMessages = session.history.slice(
|
|
649
|
-
-contextWindowSize + systemMessages.length
|
|
649
|
+
-contextWindowSize + systemMessages.length
|
|
650
650
|
);
|
|
651
651
|
|
|
652
652
|
// If we still have too many messages, apply compression
|
|
@@ -666,8 +666,8 @@ return null;
|
|
|
666
666
|
const older = messages.slice(0, -recentCount);
|
|
667
667
|
|
|
668
668
|
if (older.length === 0) {
|
|
669
|
-
return recent;
|
|
670
|
-
}
|
|
669
|
+
return recent;
|
|
670
|
+
}
|
|
671
671
|
|
|
672
672
|
const summary: ChatMessage = {
|
|
673
673
|
role: 'system',
|
|
@@ -681,7 +681,7 @@ return recent;
|
|
|
681
681
|
private async handleSyncResponse(
|
|
682
682
|
session: EnhancedChatSession,
|
|
683
683
|
response: string,
|
|
684
|
-
startTime: number
|
|
684
|
+
startTime: number
|
|
685
685
|
): Promise<string> {
|
|
686
686
|
const endTime = Date.now();
|
|
687
687
|
const responseTime = endTime - startTime;
|
|
@@ -716,7 +716,7 @@ return recent;
|
|
|
716
716
|
private async *handleStreamingResponse(
|
|
717
717
|
session: EnhancedChatSession,
|
|
718
718
|
responseGenerator: AsyncGenerator<string, void, unknown>,
|
|
719
|
-
startTime: number
|
|
719
|
+
startTime: number
|
|
720
720
|
): AsyncGenerator<string, void, unknown> {
|
|
721
721
|
let fullResponse = '';
|
|
722
722
|
let firstChunk = true;
|
|
@@ -760,7 +760,7 @@ return recent;
|
|
|
760
760
|
|
|
761
761
|
private updatePerformanceMetrics(
|
|
762
762
|
session: EnhancedChatSession,
|
|
763
|
-
responseTime: number
|
|
763
|
+
responseTime: number
|
|
764
764
|
): void {
|
|
765
765
|
const perf = session.metadata.performance;
|
|
766
766
|
perf.totalRequests++;
|
|
@@ -809,14 +809,14 @@ return recent;
|
|
|
809
809
|
|
|
810
810
|
private searchSession(
|
|
811
811
|
session: EnhancedChatSession,
|
|
812
|
-
query: any
|
|
812
|
+
query: any
|
|
813
813
|
): ChatMessage[] {
|
|
814
814
|
let matches = session.history;
|
|
815
815
|
|
|
816
816
|
if (query.text) {
|
|
817
817
|
const searchText = query.text.toLowerCase();
|
|
818
818
|
matches = matches.filter(msg =>
|
|
819
|
-
msg.content.toLowerCase().includes(searchText)
|
|
819
|
+
msg.content.toLowerCase().includes(searchText)
|
|
820
820
|
);
|
|
821
821
|
}
|
|
822
822
|
|
|
@@ -824,13 +824,13 @@ return recent;
|
|
|
824
824
|
matches = matches.filter(
|
|
825
825
|
msg =>
|
|
826
826
|
msg.timestamp >= query.dateRange.from &&
|
|
827
|
-
msg.timestamp <= query.dateRange.to
|
|
827
|
+
msg.timestamp <= query.dateRange.to
|
|
828
828
|
);
|
|
829
829
|
}
|
|
830
830
|
|
|
831
831
|
if (query.tags && query.tags.length > 0) {
|
|
832
832
|
const hasMatchingTag = query.tags.some((tag: string) =>
|
|
833
|
-
session.tags.includes(tag)
|
|
833
|
+
session.tags.includes(tag)
|
|
834
834
|
);
|
|
835
835
|
if (!hasMatchingTag) {
|
|
836
836
|
matches = [];
|
|
@@ -850,7 +850,7 @@ return recent;
|
|
|
850
850
|
if (query.text) {
|
|
851
851
|
// Boost score based on exact matches
|
|
852
852
|
const exactMatches = matches.filter(msg =>
|
|
853
|
-
msg.content.toLowerCase().includes(query.text.toLowerCase())
|
|
853
|
+
msg.content.toLowerCase().includes(query.text.toLowerCase())
|
|
854
854
|
).length;
|
|
855
855
|
score += exactMatches * 2;
|
|
856
856
|
}
|
package/src/cli.ts
CHANGED
|
@@ -47,7 +47,7 @@ export class WundrCLI {
|
|
|
47
47
|
this.pluginManager = new PluginManager(this.configManager);
|
|
48
48
|
this.interactiveMode = new InteractiveMode(
|
|
49
49
|
this.configManager,
|
|
50
|
-
this.pluginManager
|
|
50
|
+
this.pluginManager
|
|
51
51
|
);
|
|
52
52
|
|
|
53
53
|
this.setupProgram();
|
|
@@ -63,7 +63,7 @@ export class WundrCLI {
|
|
|
63
63
|
this.program
|
|
64
64
|
.name('wundr')
|
|
65
65
|
.description(
|
|
66
|
-
'Unified Developer Platform - Code Analysis, Governance & Computer Setup for Engineering Teams'
|
|
66
|
+
'Unified Developer Platform - Code Analysis, Governance & Computer Setup for Engineering Teams'
|
|
67
67
|
)
|
|
68
68
|
.version(version, '-v, --version', 'display version number')
|
|
69
69
|
.helpOption('-h, --help', 'display help for command')
|
|
@@ -74,7 +74,7 @@ export class WundrCLI {
|
|
|
74
74
|
║║║║ ║║║║ ║║╠╦╝
|
|
75
75
|
╚╩╝╚═╝╝╚╝═╩╝╩╚═
|
|
76
76
|
The Unified Developer Platform
|
|
77
|
-
|
|
77
|
+
`
|
|
78
78
|
)
|
|
79
79
|
.configureOutput({
|
|
80
80
|
writeOut: str => process.stdout.write(str),
|
|
@@ -208,7 +208,7 @@ The Unified Developer Platform
|
|
|
208
208
|
.option(
|
|
209
209
|
'--layout <type>',
|
|
210
210
|
'TUI layout (dashboard, monitor, debug)',
|
|
211
|
-
'dashboard'
|
|
211
|
+
'dashboard'
|
|
212
212
|
)
|
|
213
213
|
.action(async options => {
|
|
214
214
|
await this.interactiveMode.launchTUI(options.layout);
|