claude-flow-novice 2.2.4 ā 2.2.5
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/package.json +9 -8
- package/scripts/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/.claude-flow/metrics/performance.json +9 -0
- package/scripts/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/CLEANUP_OPTIMIZATION_REPORT.json +312 -0
- package/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +387 -0
- package/scripts/CLEANUP_QUICK_START.md +268 -0
- package/scripts/CLEANUP_TEST_RESULTS.md +205 -0
- package/scripts/README.md +339 -0
- package/scripts/ace-query.sh +384 -0
- package/scripts/agent-token-analysis.js +430 -0
- package/scripts/auto-setup.js +332 -0
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/build/validate-agents.js +238 -0
- package/scripts/build-index.js +43 -0
- package/scripts/build-orchestrator.js +320 -0
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/ci-validation.js +375 -0
- package/scripts/cleanup-blocking-coordination.sh +420 -0
- package/scripts/cleanup-idle-sessions.sh +59 -0
- package/scripts/collect-build-metrics.js +65 -0
- package/scripts/demo/README.md +79 -0
- package/scripts/demo/autoscaling-demo-simplified.js +963 -0
- package/scripts/demo/comprehensive-dashboard-test.js +693 -0
- package/scripts/demo/confidence-log.js +87 -0
- package/scripts/demo/confidence-report.js +82 -0
- package/scripts/demo/demo-multi-swarm-coordination.js +325 -0
- package/scripts/demo/demo-production-deployment.js +399 -0
- package/scripts/demo/demo-visualization-system.js +149 -0
- package/scripts/demo/performance-analysis.cjs +71 -0
- package/scripts/demo/performance-analysis.js +71 -0
- package/scripts/demo/test-autoscaling-demo.js +314 -0
- package/scripts/dependency-optimizer.js +349 -0
- package/scripts/dependency-security-assessment.js +331 -0
- package/scripts/deploy-sdk.sh +176 -0
- package/scripts/deployment-readiness-report.json +179 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/ecosystem.config.cjs +90 -0
- package/scripts/fix-js-extensions.js +167 -0
- package/scripts/generate-basic-types.js +73 -0
- package/scripts/generate-changelog.js +318 -0
- package/scripts/git-hooks/pre-commit.sh +143 -0
- package/scripts/health-checks.js +634 -0
- package/scripts/hook-wrapper.sh +54 -0
- package/scripts/install/README.md +375 -0
- package/scripts/install/REDIS_SETUP_VALIDATION.json +245 -0
- package/scripts/install/check-prerequisites.js +303 -0
- package/scripts/install/config-wizard.js +606 -0
- package/scripts/install/dependency-checker.js +385 -0
- package/scripts/install/health-check.js +765 -0
- package/scripts/install/install.js +256 -0
- package/scripts/install/installation-benchmark.js +461 -0
- package/scripts/install/quick-install.js +720 -0
- package/scripts/install/quick-start-wizard.js +295 -0
- package/scripts/install/redis-cli.js +289 -0
- package/scripts/install/redis-install-guides.md +407 -0
- package/scripts/install/redis-setup.js +559 -0
- package/scripts/install/redis-test.js +278 -0
- package/scripts/install/service-manager.js +672 -0
- package/scripts/install/setup.js +832 -0
- package/scripts/install/uninstall.js +526 -0
- package/scripts/install/update.js +461 -0
- package/scripts/install-pre-commit-hook.sh +127 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/memory-monitor-coordinator.js +322 -0
- package/scripts/migrate-to-sdk.sh +520 -0
- package/scripts/migration/QUICK-START.md +189 -0
- package/scripts/migration/QUICK-START.md.backup-1760135091363 +189 -0
- package/scripts/migration/README.md +464 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +500 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +500 -0
- package/scripts/migration/UPDATE-PATHS-README.md +464 -0
- package/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +464 -0
- package/scripts/migration/example-patterns.json +19 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/migration/reorganize-workspace.js +504 -0
- package/scripts/migration/test-update-paths.js +359 -0
- package/scripts/migration/update-paths.js +664 -0
- package/scripts/migration/validate-migration.js +647 -0
- package/scripts/monitor-loop.sh +65 -0
- package/scripts/monitor-memory.sh +47 -0
- package/scripts/monitor-migration.js +339 -0
- package/scripts/monitor.py +43 -0
- package/scripts/monitoring/README.md +178 -0
- package/scripts/monitoring/alert-monitor.sh +220 -0
- package/scripts/monitoring/analyze-resources.sh +199 -0
- package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
- package/scripts/monitoring/dynamic-monitor.sh +85 -0
- package/scripts/monitoring/launch-stability-test.sh +184 -0
- package/scripts/monitoring/monitor-test.sh +93 -0
- package/scripts/monitoring/pre-test-validation.sh +208 -0
- package/scripts/monitoring/quick-test-alerting.sh +118 -0
- package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
- package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
- package/scripts/monitoring/resource-monitor.sh +126 -0
- package/scripts/monitoring/stability-monitor.js +429 -0
- package/scripts/monitoring/test-monitor-quick.sh +54 -0
- package/scripts/monitoring/view-alerts.sh +307 -0
- package/scripts/npm-metrics-collector.js +482 -0
- package/scripts/npm-package-validation.cjs +299 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/optimize-package-swarm.js +54 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-monitor.js +644 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/post-deployment-monitoring.js +350 -0
- package/scripts/post-edit-pipeline.js +2091 -0
- package/scripts/post-install-claude-md.js +78 -0
- package/scripts/postinstall.js +79 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/pre-publish-validation.js +429 -0
- package/scripts/redis-lua/cleanup-blocking-coordination.lua +198 -0
- package/scripts/release-announcement.js +425 -0
- package/scripts/release-notification.js +248 -0
- package/scripts/release-rollback.js +376 -0
- package/scripts/release-validation.js +460 -0
- package/scripts/rollback-sdk.sh +66 -0
- package/scripts/run-production-validation.ts +590 -0
- package/scripts/run-stability-validation.sh +687 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/deployment-validation.cjs +279 -0
- package/scripts/security/envelope-encryption-confidence-report.cjs +422 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/install-git-secrets.sh +295 -0
- package/scripts/security/rotate-api-keys.js +469 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/security/security-audit.cjs +538 -0
- package/scripts/security/setup-redis-auth.sh +397 -0
- package/scripts/security/validate-envelope-encryption.cjs +340 -0
- package/scripts/security-scan.js +492 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/performance.json +9 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/switch-api.sh +158 -0
- package/scripts/sync-agents.js +290 -0
- package/scripts/test/50-agent-test.js +625 -0
- package/scripts/test/NEW_STABILITY_TEST_GUIDE.md +407 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/STABILITY_TEST_EXAMPLE.md +347 -0
- package/scripts/test/STABILITY_TEST_README.md +480 -0
- package/scripts/test/agent-worker.js +309 -0
- package/scripts/test/ai-coordination-test.js +650 -0
- package/scripts/test/ai-mesh-coordination-test.js +416 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/cli-agent-coordination-test.js +313 -0
- package/scripts/test/coordinator-multilingual-test.js +396 -0
- package/scripts/test/coordinator-transparency-demo.js +585 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/mesh-coordination-zero-overlap-test.js +740 -0
- package/scripts/test/multilingual-hello-world-test.js +390 -0
- package/scripts/test/quick-multilingual-demo.js +464 -0
- package/scripts/test/real-agent-test.js +312 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/run-stability-test-examples.sh +292 -0
- package/scripts/test/stability-results/stability-metrics.jsonl +83 -0
- package/scripts/test/stability-results/stability-test-report.json +128 -0
- package/scripts/test/stability-results/stability-test.log +1827 -0
- package/scripts/test/stability-test-50-agents.js +734 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/test-cleanup-performance.sh +416 -0
- package/scripts/test-dashboard-auth.cjs +203 -0
- package/scripts/test-docker-deployment.sh +207 -0
- package/scripts/test-npm-package.cjs +167 -0
- package/scripts/test-provider-routing.cjs +226 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-runner.cjs +154 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/validate-agent-hooks.js +506 -0
- package/scripts/validate-changelog.js +241 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/scripts/validate-docker-infrastructure.sh +502 -0
- package/scripts/validate-entry-points.js +300 -0
- package/scripts/validate-stage3-performance.ts +377 -0
- package/scripts/validate-template-bundling.js +180 -0
- package/scripts/validation/README.md +33 -0
- package/scripts/validation/acl-security-validation.cjs +214 -0
- package/scripts/validation/acl-security-validation.js +402 -0
- package/scripts/validation/byzantine-verification.js +407 -0
- package/scripts/validation/final-phase-2-consensus.cjs +219 -0
- package/scripts/validation/final-security-validation.js +791 -0
- package/scripts/validation/final-wasm-validation.cjs +840 -0
- package/scripts/validation/integration-test-analysis.js +105 -0
- package/scripts/validation/phase-0-comprehensive-validation.js +474 -0
- package/scripts/validation/phase-0-consensus-report.js +139 -0
- package/scripts/validation/phase-0-final-report.js +112 -0
- package/scripts/validation/phase-0-redis-consensus-report.js +129 -0
- package/scripts/validation/phase-0-validation-improved.js +490 -0
- package/scripts/validation/phase-0-validation-test.js +65 -0
- package/scripts/validation/phase-1-consensus-report.cjs +342 -0
- package/scripts/validation/phase-1-consensus-validation.cjs +551 -0
- package/scripts/validation/phase-1-consensus-validation.js +551 -0
- package/scripts/validation/phase-2-consensus-report.cjs +186 -0
- package/scripts/validation/phase-2-validation.cjs +171 -0
- package/scripts/validation/phase-2-validation.js +171 -0
- package/scripts/validation/phase-4-consensus-report.js +181 -0
- package/scripts/validation/phase-4-final-validation.js +351 -0
- package/scripts/validation/phase-5-consensus-report.cjs +113 -0
- package/scripts/validation/phase-5-consensus-report.js +113 -0
- package/scripts/validation/security-analysis.js +49 -0
- package/scripts/validation/security-validation.js +492 -0
- package/scripts/validation/simple-security-validation.js +464 -0
- package/scripts/verify-installation.js +112 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/scripts/verify-sdk-phase1.cjs +293 -0
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Configuration Wizard for Claude Flow Novice
|
|
5
|
+
* Interactive setup for first-time users
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, writeFileSync, mkdirSync, readFileSync } from 'fs';
|
|
9
|
+
import { join, dirname } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { createInterface } from 'readline';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import inquirer from 'inquirer';
|
|
14
|
+
import ora from 'ora';
|
|
15
|
+
import boxen from 'boxen';
|
|
16
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
17
|
+
|
|
18
|
+
class ConfigWizard {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.config = {
|
|
21
|
+
basic: {},
|
|
22
|
+
redis: {},
|
|
23
|
+
swarm: {},
|
|
24
|
+
security: {},
|
|
25
|
+
development: {},
|
|
26
|
+
monitoring: {}
|
|
27
|
+
};
|
|
28
|
+
this.spinner = ora();
|
|
29
|
+
this.rl = createInterface({
|
|
30
|
+
input: process.stdin,
|
|
31
|
+
output: process.stdout
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async run() {
|
|
36
|
+
console.log(boxen(
|
|
37
|
+
chalk.cyan.bold('āļø Claude Flow Novice - Configuration Wizard'),
|
|
38
|
+
{
|
|
39
|
+
padding: 1,
|
|
40
|
+
borderColor: 'cyan',
|
|
41
|
+
borderStyle: 'round'
|
|
42
|
+
}
|
|
43
|
+
));
|
|
44
|
+
|
|
45
|
+
console.log(chalk.yellow('\nš Welcome! Let\'s configure your Claude Flow Novice setup.\n'));
|
|
46
|
+
console.log('This wizard will help you configure essential settings for optimal performance.\n');
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
await this.configureBasicSettings();
|
|
50
|
+
await this.configureRedis();
|
|
51
|
+
await this.configureSwarmSettings();
|
|
52
|
+
await this.configureSecurity();
|
|
53
|
+
await this.configureDevelopment();
|
|
54
|
+
await this.configureMonitoring();
|
|
55
|
+
|
|
56
|
+
const confirmed = await this.confirmConfiguration();
|
|
57
|
+
if (confirmed) {
|
|
58
|
+
await this.saveConfiguration();
|
|
59
|
+
await this.generateEnvironmentFiles();
|
|
60
|
+
this.displaySuccessMessage();
|
|
61
|
+
} else {
|
|
62
|
+
console.log(chalk.yellow('Configuration cancelled. No changes were made.'));
|
|
63
|
+
}
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error(chalk.red('Configuration error:'), error.message);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
} finally {
|
|
68
|
+
this.rl.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async configureBasicSettings() {
|
|
73
|
+
console.log(chalk.bold.blue('\nš Basic Configuration'));
|
|
74
|
+
console.log(chalk.gray('Configure basic settings for your environment.\n'));
|
|
75
|
+
|
|
76
|
+
const answers = await inquirer.prompt([
|
|
77
|
+
{
|
|
78
|
+
type: 'input',
|
|
79
|
+
name: 'environment',
|
|
80
|
+
message: 'Environment type:',
|
|
81
|
+
default: 'development',
|
|
82
|
+
choices: ['development', 'staging', 'production'],
|
|
83
|
+
validate: (input) => ['development', 'staging', 'production'].includes(input) || 'Please enter: development, staging, or production'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: 'input',
|
|
87
|
+
name: 'projectName',
|
|
88
|
+
message: 'Project name:',
|
|
89
|
+
default: 'claude-flow-novice-project',
|
|
90
|
+
validate: (input) => input.length > 0 || 'Project name is required'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
type: 'input',
|
|
94
|
+
name: 'projectDescription',
|
|
95
|
+
message: 'Project description:',
|
|
96
|
+
default: 'AI agent orchestration project'
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
type: 'input',
|
|
100
|
+
name: 'author',
|
|
101
|
+
message: 'Author name:',
|
|
102
|
+
default: () => {
|
|
103
|
+
try {
|
|
104
|
+
return require('os').userInfo().username;
|
|
105
|
+
} catch {
|
|
106
|
+
return 'Developer';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'list',
|
|
112
|
+
name: 'logLevel',
|
|
113
|
+
message: 'Logging level:',
|
|
114
|
+
choices: ['error', 'warn', 'info', 'debug'],
|
|
115
|
+
default: 'info'
|
|
116
|
+
}
|
|
117
|
+
]);
|
|
118
|
+
|
|
119
|
+
this.config.basic = answers;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async configureRedis() {
|
|
123
|
+
console.log(chalk.bold.blue('\nš“ Redis Configuration'));
|
|
124
|
+
console.log(chalk.gray('Configure Redis connection settings.\n'));
|
|
125
|
+
|
|
126
|
+
// Check if Redis is available
|
|
127
|
+
let redisAvailable = false;
|
|
128
|
+
try {
|
|
129
|
+
const { execSync } = await import('child_process');
|
|
130
|
+
execSync('redis-cli ping', { encoding: 'utf8', timeout: 2000 });
|
|
131
|
+
redisAvailable = true;
|
|
132
|
+
} catch {
|
|
133
|
+
console.log(chalk.yellow('ā ļø Redis is not running locally.'));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const answers = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: 'confirm',
|
|
139
|
+
name: 'useRedis',
|
|
140
|
+
message: 'Use Redis for state persistence?',
|
|
141
|
+
default: true
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'list',
|
|
145
|
+
name: 'redisType',
|
|
146
|
+
message: 'Redis connection type:',
|
|
147
|
+
choices: ['local', 'remote', 'cloud'],
|
|
148
|
+
default: redisAvailable ? 'local' : 'remote',
|
|
149
|
+
when: (answers) => answers.useRedis
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'input',
|
|
153
|
+
name: 'redisHost',
|
|
154
|
+
message: 'Redis host:',
|
|
155
|
+
default: 'localhost',
|
|
156
|
+
when: (answers) => answers.useRedis && answers.redisType !== 'cloud'
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'input',
|
|
160
|
+
name: 'redisPort',
|
|
161
|
+
message: 'Redis port:',
|
|
162
|
+
default: '6379',
|
|
163
|
+
validate: (input) => !isNaN(input) && input > 0 && input < 65536 || 'Please enter a valid port number',
|
|
164
|
+
when: (answers) => answers.useRedis && answers.redisType !== 'cloud'
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'input',
|
|
168
|
+
name: 'redisPassword',
|
|
169
|
+
message: 'Redis password (leave empty for no password):',
|
|
170
|
+
when: (answers) => answers.useRedis
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
type: 'input',
|
|
174
|
+
name: 'redisUrl',
|
|
175
|
+
message: 'Redis connection URL:',
|
|
176
|
+
when: (answers) => answers.useRedis && answers.redisType === 'cloud',
|
|
177
|
+
validate: (input) => input.startsWith('redis://') || input.startsWith('rediss://') || 'Please enter a valid Redis URL'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'confirm',
|
|
181
|
+
name: 'installRedis',
|
|
182
|
+
message: 'Automatically install Redis locally?',
|
|
183
|
+
default: true,
|
|
184
|
+
when: (answers) => answers.useRedis && answers.redisType === 'local' && !redisAvailable
|
|
185
|
+
}
|
|
186
|
+
]);
|
|
187
|
+
|
|
188
|
+
this.config.redis = answers;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async configureSwarmSettings() {
|
|
192
|
+
console.log(chalk.bold.blue('\nš Swarm Configuration'));
|
|
193
|
+
console.log(chalk.gray('Configure swarm behavior and agent settings.\n'));
|
|
194
|
+
|
|
195
|
+
const answers = await inquirer.prompt([
|
|
196
|
+
{
|
|
197
|
+
type: 'input',
|
|
198
|
+
name: 'maxAgents',
|
|
199
|
+
message: 'Maximum number of agents:',
|
|
200
|
+
default: '10',
|
|
201
|
+
validate: (input) => !isNaN(input) && input > 0 && input <= 100 || 'Please enter a number between 1 and 100'
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: 'list',
|
|
205
|
+
name: 'swarmStrategy',
|
|
206
|
+
message: 'Default swarm strategy:',
|
|
207
|
+
choices: ['development', 'research', 'production', 'testing'],
|
|
208
|
+
default: 'development'
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: 'list',
|
|
212
|
+
name: 'swarmMode',
|
|
213
|
+
message: 'Default swarm mode:',
|
|
214
|
+
choices: ['mesh', 'hierarchical', 'centralized'],
|
|
215
|
+
default: 'mesh'
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
type: 'confirm',
|
|
219
|
+
name: 'enablePersistence',
|
|
220
|
+
message: 'Enable swarm state persistence?',
|
|
221
|
+
default: true
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
type: 'input',
|
|
225
|
+
name: 'consensusThreshold',
|
|
226
|
+
message: 'Consensus threshold (0.0-1.0):',
|
|
227
|
+
default: '0.90',
|
|
228
|
+
validate: (input) => {
|
|
229
|
+
const num = parseFloat(input);
|
|
230
|
+
return !isNaN(num) && num >= 0 && num <= 1 || 'Please enter a number between 0 and 1';
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
type: 'confirm',
|
|
235
|
+
name: 'enableRealTime',
|
|
236
|
+
message: 'Enable real-time monitoring?',
|
|
237
|
+
default: true
|
|
238
|
+
}
|
|
239
|
+
]);
|
|
240
|
+
|
|
241
|
+
this.config.swarm = answers;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
async configureSecurity() {
|
|
245
|
+
console.log(chalk.bold.blue('\nš Security Configuration'));
|
|
246
|
+
console.log(chalk.gray('Configure security settings and permissions.\n'));
|
|
247
|
+
|
|
248
|
+
const answers = await inquirer.prompt([
|
|
249
|
+
{
|
|
250
|
+
type: 'confirm',
|
|
251
|
+
name: 'enableAuth',
|
|
252
|
+
message: 'Enable authentication?',
|
|
253
|
+
default: false
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
type: 'list',
|
|
257
|
+
name: 'authMethod',
|
|
258
|
+
message: 'Authentication method:',
|
|
259
|
+
choices: ['jwt', 'api-key', 'basic', 'oauth'],
|
|
260
|
+
default: 'jwt',
|
|
261
|
+
when: (answers) => answers.enableAuth
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
type: 'input',
|
|
265
|
+
name: 'jwtSecret',
|
|
266
|
+
message: 'JWT secret (leave empty to auto-generate):',
|
|
267
|
+
when: (answers) => answers.enableAuth && answers.authMethod === 'jwt'
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
type: 'confirm',
|
|
271
|
+
name: 'enableRateLimit',
|
|
272
|
+
message: 'Enable rate limiting?',
|
|
273
|
+
default: true
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
type: 'input',
|
|
277
|
+
name: 'rateLimitWindow',
|
|
278
|
+
message: 'Rate limit window (minutes):',
|
|
279
|
+
default: '15',
|
|
280
|
+
validate: (input) => !isNaN(input) && input > 0 || 'Please enter a positive number',
|
|
281
|
+
when: (answers) => answers.enableRateLimit
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
type: 'input',
|
|
285
|
+
name: 'rateLimitMax',
|
|
286
|
+
message: 'Maximum requests per window:',
|
|
287
|
+
default: '100',
|
|
288
|
+
validate: (input) => !isNaN(input) && input > 0 || 'Please enter a positive number',
|
|
289
|
+
when: (answers) => answers.enableRateLimit
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
type: 'confirm',
|
|
293
|
+
name: 'enableCORS',
|
|
294
|
+
message: 'Enable CORS?',
|
|
295
|
+
default: true
|
|
296
|
+
}
|
|
297
|
+
]);
|
|
298
|
+
|
|
299
|
+
// Generate JWT secret if not provided
|
|
300
|
+
if (answers.enableAuth && answers.authMethod === 'jwt' && !answers.jwtSecret) {
|
|
301
|
+
answers.jwtSecret = uuidv4() + uuidv4();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
this.config.security = answers;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
async configureDevelopment() {
|
|
308
|
+
console.log(chalk.bold.blue('\nš ļø Development Configuration'));
|
|
309
|
+
console.log(chalk.gray('Configure development-specific settings.\n'));
|
|
310
|
+
|
|
311
|
+
const answers = await inquirer.prompt([
|
|
312
|
+
{
|
|
313
|
+
type: 'confirm',
|
|
314
|
+
name: 'enableHotReload',
|
|
315
|
+
message: 'Enable hot reloading?',
|
|
316
|
+
default: true
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
type: 'confirm',
|
|
320
|
+
name: 'enableDebugMode',
|
|
321
|
+
message: 'Enable debug mode?',
|
|
322
|
+
default: true
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
type: 'confirm',
|
|
326
|
+
name: 'enableTestMode',
|
|
327
|
+
message: 'Enable test mode?',
|
|
328
|
+
default: false
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
type: 'input',
|
|
332
|
+
name: 'devServerPort',
|
|
333
|
+
message: 'Development server port:',
|
|
334
|
+
default: '3000',
|
|
335
|
+
validate: (input) => !isNaN(input) && input > 0 && input < 65536 || 'Please enter a valid port number'
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
type: 'confirm',
|
|
339
|
+
name: 'enableMockData',
|
|
340
|
+
message: 'Enable mock data for testing?',
|
|
341
|
+
default: false
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
type: 'list',
|
|
345
|
+
name: 'databaseType',
|
|
346
|
+
message: 'Database type:',
|
|
347
|
+
choices: ['sqlite', 'postgresql', 'mysql', 'none'],
|
|
348
|
+
default: 'sqlite'
|
|
349
|
+
}
|
|
350
|
+
]);
|
|
351
|
+
|
|
352
|
+
this.config.development = answers;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
async configureMonitoring() {
|
|
356
|
+
console.log(chalk.bold.blue('\nš Monitoring Configuration'));
|
|
357
|
+
console.log(chalk.gray('Configure monitoring and alerting settings.\n'));
|
|
358
|
+
|
|
359
|
+
const answers = await inquirer.prompt([
|
|
360
|
+
{
|
|
361
|
+
type: 'confirm',
|
|
362
|
+
name: 'enableMetrics',
|
|
363
|
+
message: 'Enable metrics collection?',
|
|
364
|
+
default: true
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
type: 'confirm',
|
|
368
|
+
name: 'enableHealthChecks',
|
|
369
|
+
message: 'Enable health checks?',
|
|
370
|
+
default: true
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
type: 'confirm',
|
|
374
|
+
name: 'enableAlerts',
|
|
375
|
+
message: 'Enable alerts?',
|
|
376
|
+
default: true
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
type: 'input',
|
|
380
|
+
name: 'healthCheckInterval',
|
|
381
|
+
message: 'Health check interval (seconds):',
|
|
382
|
+
default: '30',
|
|
383
|
+
validate: (input) => !isNaN(input) && input > 0 || 'Please enter a positive number',
|
|
384
|
+
when: (answers) => answers.enableHealthChecks
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
type: 'list',
|
|
388
|
+
name: 'logFormat',
|
|
389
|
+
message: 'Log format:',
|
|
390
|
+
choices: ['json', 'text', 'combined'],
|
|
391
|
+
default: 'json'
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
type: 'confirm',
|
|
395
|
+
name: 'enableDashboard',
|
|
396
|
+
message: 'Enable monitoring dashboard?',
|
|
397
|
+
default: true
|
|
398
|
+
}
|
|
399
|
+
]);
|
|
400
|
+
|
|
401
|
+
this.config.monitoring = answers;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async confirmConfiguration() {
|
|
405
|
+
console.log(chalk.bold.blue('\nš Configuration Summary'));
|
|
406
|
+
console.log(chalk.gray('Please review your configuration before saving.\n'));
|
|
407
|
+
|
|
408
|
+
const summary = this.generateSummary();
|
|
409
|
+
console.log(summary);
|
|
410
|
+
|
|
411
|
+
const { confirmed } = await inquirer.prompt([
|
|
412
|
+
{
|
|
413
|
+
type: 'confirm',
|
|
414
|
+
name: 'confirmed',
|
|
415
|
+
message: 'Save this configuration?',
|
|
416
|
+
default: true
|
|
417
|
+
}
|
|
418
|
+
]);
|
|
419
|
+
|
|
420
|
+
return confirmed;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
generateSummary() {
|
|
424
|
+
const sections = [];
|
|
425
|
+
|
|
426
|
+
sections.push(chalk.cyan.bold('Basic Settings:'));
|
|
427
|
+
sections.push(` Environment: ${this.config.basic.environment}`);
|
|
428
|
+
sections.push(` Project: ${this.config.basic.projectName}`);
|
|
429
|
+
sections.push(` Author: ${this.config.basic.author}`);
|
|
430
|
+
sections.push(` Log Level: ${this.config.basic.logLevel}`);
|
|
431
|
+
|
|
432
|
+
sections.push('\n' + chalk.cyan.bold('Redis Settings:'));
|
|
433
|
+
if (this.config.redis.useRedis) {
|
|
434
|
+
sections.push(` Type: ${this.config.redis.redisType}`);
|
|
435
|
+
if (this.config.redis.redisType === 'cloud') {
|
|
436
|
+
sections.push(` URL: ${this.config.redis.redisUrl.replace(/\/\/.*@/, '//***:***@')}`);
|
|
437
|
+
} else {
|
|
438
|
+
sections.push(` Host: ${this.config.redis.redisHost}:${this.config.redis.redisPort}`);
|
|
439
|
+
sections.push(` Password: ${this.config.redis.redisPassword ? '***' : 'None'}`);
|
|
440
|
+
}
|
|
441
|
+
} else {
|
|
442
|
+
sections.push(' Redis: Disabled');
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
sections.push('\n' + chalk.cyan.bold('Swarm Settings:'));
|
|
446
|
+
sections.push(` Max Agents: ${this.config.swarm.maxAgents}`);
|
|
447
|
+
sections.push(` Strategy: ${this.config.swarm.swarmStrategy}`);
|
|
448
|
+
sections.push(` Mode: ${this.config.swarm.swarmMode}`);
|
|
449
|
+
sections.push(` Persistence: ${this.config.swarm.enablePersistence ? 'Enabled' : 'Disabled'}`);
|
|
450
|
+
|
|
451
|
+
sections.push('\n' + chalk.cyan.bold('Security Settings:'));
|
|
452
|
+
sections.push(` Authentication: ${this.config.security.enableAuth ? this.config.security.authMethod : 'Disabled'}`);
|
|
453
|
+
sections.push(` Rate Limiting: ${this.config.security.enableRateLimit ? 'Enabled' : 'Disabled'}`);
|
|
454
|
+
sections.push(` CORS: ${this.config.security.enableCORS ? 'Enabled' : 'Disabled'}`);
|
|
455
|
+
|
|
456
|
+
sections.push('\n' + chalk.cyan.bold('Development Settings:'));
|
|
457
|
+
sections.push(` Hot Reload: ${this.config.development.enableHotReload ? 'Enabled' : 'Disabled'}`);
|
|
458
|
+
sections.push(` Debug Mode: ${this.config.development.enableDebugMode ? 'Enabled' : 'Disabled'}`);
|
|
459
|
+
sections.push(` Dev Server Port: ${this.config.development.devServerPort}`);
|
|
460
|
+
|
|
461
|
+
sections.push('\n' + chalk.cyan.bold('Monitoring Settings:'));
|
|
462
|
+
sections.push(` Metrics: ${this.config.monitoring.enableMetrics ? 'Enabled' : 'Disabled'}`);
|
|
463
|
+
sections.push(` Health Checks: ${this.config.monitoring.enableHealthChecks ? 'Enabled' : 'Disabled'}`);
|
|
464
|
+
sections.push(` Dashboard: ${this.config.monitoring.enableDashboard ? 'Enabled' : 'Disabled'}`);
|
|
465
|
+
|
|
466
|
+
return sections.join('\n');
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
async saveConfiguration() {
|
|
470
|
+
this.spinner.start('Saving configuration...');
|
|
471
|
+
|
|
472
|
+
try {
|
|
473
|
+
// Ensure config directory exists
|
|
474
|
+
const configDir = join(process.cwd(), 'config');
|
|
475
|
+
if (!existsSync(configDir)) {
|
|
476
|
+
mkdirSync(configDir, { recursive: true });
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// Save main configuration
|
|
480
|
+
const configPath = join(configDir, 'claude-flow-config.json');
|
|
481
|
+
writeFileSync(configPath, JSON.stringify(this.config, null, 2));
|
|
482
|
+
|
|
483
|
+
// Save user configuration
|
|
484
|
+
const userConfigPath = join(homedir(), '.claude-flow-novice', 'config.json');
|
|
485
|
+
const userConfigDir = dirname(userConfigPath);
|
|
486
|
+
if (!existsSync(userConfigDir)) {
|
|
487
|
+
mkdirSync(userConfigDir, { recursive: true });
|
|
488
|
+
}
|
|
489
|
+
writeFileSync(userConfigPath, JSON.stringify(this.config, null, 2));
|
|
490
|
+
|
|
491
|
+
this.spinner.succeed('Configuration saved successfully!');
|
|
492
|
+
} catch (error) {
|
|
493
|
+
this.spinner.fail('Failed to save configuration');
|
|
494
|
+
throw error;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
async generateEnvironmentFiles() {
|
|
499
|
+
this.spinner.start('Generating environment files...');
|
|
500
|
+
|
|
501
|
+
try {
|
|
502
|
+
// Generate .env file
|
|
503
|
+
const envContent = this.generateEnvContent();
|
|
504
|
+
writeFileSync(join(process.cwd(), '.env'), envContent);
|
|
505
|
+
|
|
506
|
+
// Generate .env.example file
|
|
507
|
+
const exampleContent = this.generateEnvExampleContent();
|
|
508
|
+
writeFileSync(join(process.cwd(), '.env.example'), exampleContent);
|
|
509
|
+
|
|
510
|
+
this.spinner.succeed('Environment files generated!');
|
|
511
|
+
} catch (error) {
|
|
512
|
+
this.spinner.fail('Failed to generate environment files');
|
|
513
|
+
throw error;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
generateEnvContent() {
|
|
518
|
+
const lines = [
|
|
519
|
+
'# Claude Flow Novice Environment Configuration',
|
|
520
|
+
'# Generated on ' + new Date().toISOString(),
|
|
521
|
+
'',
|
|
522
|
+
`NODE_ENV=${this.config.basic.environment}`,
|
|
523
|
+
`PROJECT_NAME=${this.config.basic.projectName}`,
|
|
524
|
+
`LOG_LEVEL=${this.config.basic.logLevel}`,
|
|
525
|
+
''
|
|
526
|
+
];
|
|
527
|
+
|
|
528
|
+
if (this.config.redis.useRedis) {
|
|
529
|
+
lines.push('# Redis Configuration');
|
|
530
|
+
if (this.config.redis.redisType === 'cloud') {
|
|
531
|
+
lines.push(`REDIS_URL=${this.config.redis.redisUrl}`);
|
|
532
|
+
} else {
|
|
533
|
+
lines.push(`REDIS_HOST=${this.config.redis.redisHost}`);
|
|
534
|
+
lines.push(`REDIS_PORT=${this.config.redis.redisPort}`);
|
|
535
|
+
if (this.config.redis.redisPassword) {
|
|
536
|
+
lines.push(`REDIS_PASSWORD=${this.config.redis.redisPassword}`);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
lines.push('');
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if (this.config.security.enableAuth && this.config.security.jwtSecret) {
|
|
543
|
+
lines.push('# Security Configuration');
|
|
544
|
+
lines.push(`JWT_SECRET=${this.config.security.jwtSecret}`);
|
|
545
|
+
lines.push('');
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
lines.push('# Swarm Configuration');
|
|
549
|
+
lines.push(`MAX_AGENTS=${this.config.swarm.maxAgents}`);
|
|
550
|
+
lines.push(`SWARM_STRATEGY=${this.config.swarm.swarmStrategy}`);
|
|
551
|
+
lines.push(`SWARM_MODE=${this.config.swarm.swarmMode}`);
|
|
552
|
+
lines.push(`CONSENSUS_THRESHOLD=${this.config.swarm.consensusThreshold}`);
|
|
553
|
+
lines.push('');
|
|
554
|
+
|
|
555
|
+
lines.push('# Development Configuration');
|
|
556
|
+
lines.push(`DEV_SERVER_PORT=${this.config.development.devServerPort}`);
|
|
557
|
+
lines.push(`HOT_RELOAD=${this.config.development.enableHotReload}`);
|
|
558
|
+
lines.push(`DEBUG_MODE=${this.config.development.enableDebugMode}`);
|
|
559
|
+
lines.push('');
|
|
560
|
+
|
|
561
|
+
return lines.join('\n');
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
generateEnvExampleContent() {
|
|
565
|
+
return this.generateEnvContent()
|
|
566
|
+
.replace(/=.+$/, '=') // Replace values with empty
|
|
567
|
+
.replace(/JWT_SECRET=.+$/, 'JWT_SECRET=your-jwt-secret-here')
|
|
568
|
+
.replace(/REDIS_PASSWORD=.+$/, 'REDIS_PASSWORD=your-redis-password');
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
displaySuccessMessage() {
|
|
572
|
+
console.log('\n' + boxen(
|
|
573
|
+
chalk.green.bold('š Configuration completed successfully!'),
|
|
574
|
+
{
|
|
575
|
+
padding: 1,
|
|
576
|
+
borderColor: 'green',
|
|
577
|
+
borderStyle: 'round'
|
|
578
|
+
}
|
|
579
|
+
));
|
|
580
|
+
|
|
581
|
+
console.log(chalk.blue('\nš Files created:'));
|
|
582
|
+
console.log(' ⢠config/claude-flow-config.json');
|
|
583
|
+
console.log(' ⢠.env');
|
|
584
|
+
console.log(' ⢠.env.example');
|
|
585
|
+
console.log(' ⢠~/.claude-flow-novice/config.json');
|
|
586
|
+
|
|
587
|
+
console.log(chalk.blue('\nš Next steps:'));
|
|
588
|
+
console.log(' 1. Review the generated configuration files');
|
|
589
|
+
console.log(' 2. Run: npm run setup:install');
|
|
590
|
+
console.log(' 3. Start development: npm run dev');
|
|
591
|
+
|
|
592
|
+
if (this.config.redis.installRedis) {
|
|
593
|
+
console.log(chalk.yellow('\nā ļø Redis will be installed automatically during setup.'));
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
console.log(chalk.gray('\nš” You can re-run this wizard anytime with: npm run config:wizard'));
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Run if executed directly
|
|
601
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
602
|
+
const wizard = new ConfigWizard();
|
|
603
|
+
wizard.run().catch(console.error);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export default ConfigWizard;
|