@lanonasis/cli 1.5.2 ā 2.0.1
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/README.md +12 -3
- package/dist/core/achievements.d.ts +102 -0
- package/dist/core/achievements.js +425 -0
- package/dist/core/architecture.d.ts +145 -0
- package/dist/core/architecture.js +355 -0
- package/dist/core/dashboard.d.ts +71 -0
- package/dist/core/dashboard.js +569 -0
- package/dist/core/error-handler.d.ts +97 -0
- package/dist/core/error-handler.js +380 -0
- package/dist/core/power-mode.d.ts +118 -0
- package/dist/core/power-mode.js +460 -0
- package/dist/core/progress.d.ts +160 -0
- package/dist/core/progress.js +428 -0
- package/dist/core/welcome.d.ts +40 -0
- package/dist/core/welcome.js +466 -0
- package/dist/enhanced-cli.d.ts +15 -0
- package/dist/enhanced-cli.js +296 -0
- package/dist/index-simple.js +11 -3
- package/dist/utils/mcp-client.js +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Welcome and Onboarding Experience
|
|
3
|
+
* Provides first-time user experience and guided setup
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import boxen from 'boxen';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
export class WelcomeExperience {
|
|
10
|
+
stateManager;
|
|
11
|
+
isFirstRun = false;
|
|
12
|
+
constructor(stateManager) {
|
|
13
|
+
this.stateManager = stateManager;
|
|
14
|
+
}
|
|
15
|
+
async show() {
|
|
16
|
+
this.displayWelcomeBanner();
|
|
17
|
+
const choice = await this.showMainMenu();
|
|
18
|
+
await this.handleMenuChoice(choice);
|
|
19
|
+
}
|
|
20
|
+
displayWelcomeBanner() {
|
|
21
|
+
const banner = boxen(chalk.bold.blue('š§ Welcome to Onasis Memory Service\n') +
|
|
22
|
+
chalk.cyan(' Your Knowledge, Amplified'), {
|
|
23
|
+
padding: 2,
|
|
24
|
+
margin: 1,
|
|
25
|
+
borderStyle: 'round',
|
|
26
|
+
borderColor: 'cyan',
|
|
27
|
+
align: 'center'
|
|
28
|
+
});
|
|
29
|
+
console.clear();
|
|
30
|
+
console.log(banner);
|
|
31
|
+
}
|
|
32
|
+
async showMainMenu() {
|
|
33
|
+
const newUserOptions = [
|
|
34
|
+
{
|
|
35
|
+
name: chalk.green.bold('[āµ] Start Interactive Setup') + chalk.gray(' (Recommended)'),
|
|
36
|
+
value: 'setup',
|
|
37
|
+
short: 'Setup'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: '[S] Skip to Main Menu',
|
|
41
|
+
value: 'skip',
|
|
42
|
+
short: 'Skip'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: '[D] Documentation',
|
|
46
|
+
value: 'docs',
|
|
47
|
+
short: 'Docs'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: '[?] What is Onasis?',
|
|
51
|
+
value: 'about',
|
|
52
|
+
short: 'About'
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
const existingUserOptions = [
|
|
56
|
+
{
|
|
57
|
+
name: chalk.bold('[āµ] Continue to Dashboard'),
|
|
58
|
+
value: 'dashboard',
|
|
59
|
+
short: 'Dashboard'
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: '[S] Settings',
|
|
63
|
+
value: 'settings',
|
|
64
|
+
short: 'Settings'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: '[H] Help',
|
|
68
|
+
value: 'help',
|
|
69
|
+
short: 'Help'
|
|
70
|
+
}
|
|
71
|
+
];
|
|
72
|
+
const isAuthenticated = await this.checkAuthentication();
|
|
73
|
+
const choices = isAuthenticated ? existingUserOptions : newUserOptions;
|
|
74
|
+
const { choice } = await inquirer.prompt([
|
|
75
|
+
{
|
|
76
|
+
type: 'list',
|
|
77
|
+
name: 'choice',
|
|
78
|
+
message: isAuthenticated ?
|
|
79
|
+
'Welcome back! What would you like to do?' :
|
|
80
|
+
'New here? Let me guide you through setup',
|
|
81
|
+
choices,
|
|
82
|
+
loop: false
|
|
83
|
+
}
|
|
84
|
+
]);
|
|
85
|
+
return choice;
|
|
86
|
+
}
|
|
87
|
+
async handleMenuChoice(choice) {
|
|
88
|
+
switch (choice) {
|
|
89
|
+
case 'setup':
|
|
90
|
+
await this.startInteractiveSetup();
|
|
91
|
+
break;
|
|
92
|
+
case 'skip':
|
|
93
|
+
case 'dashboard':
|
|
94
|
+
await this.goToDashboard();
|
|
95
|
+
break;
|
|
96
|
+
case 'docs':
|
|
97
|
+
this.showDocumentation();
|
|
98
|
+
break;
|
|
99
|
+
case 'about':
|
|
100
|
+
this.showAbout();
|
|
101
|
+
break;
|
|
102
|
+
case 'settings':
|
|
103
|
+
await this.showSettings();
|
|
104
|
+
break;
|
|
105
|
+
case 'help':
|
|
106
|
+
this.showHelp();
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async startInteractiveSetup() {
|
|
111
|
+
const setup = new InteractiveSetup(this.stateManager);
|
|
112
|
+
await setup.run();
|
|
113
|
+
}
|
|
114
|
+
async goToDashboard() {
|
|
115
|
+
// Navigate to main dashboard
|
|
116
|
+
this.stateManager.pushNavigation({
|
|
117
|
+
name: 'dashboard',
|
|
118
|
+
path: '/dashboard',
|
|
119
|
+
context: {},
|
|
120
|
+
timestamp: new Date()
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
showDocumentation() {
|
|
124
|
+
console.log(boxen(chalk.bold('š Documentation\n\n') +
|
|
125
|
+
'Online Docs: ' + chalk.cyan('https://docs.lanonasis.com/cli\n') +
|
|
126
|
+
'Quick Start: ' + chalk.cyan('https://docs.lanonasis.com/quickstart\n') +
|
|
127
|
+
'API Reference: ' + chalk.cyan('https://api.lanonasis.com/docs\n\n') +
|
|
128
|
+
chalk.dim('Press any key to continue...'), {
|
|
129
|
+
padding: 1,
|
|
130
|
+
borderStyle: 'single',
|
|
131
|
+
borderColor: 'gray'
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
showAbout() {
|
|
135
|
+
console.log(boxen(chalk.bold('š§ About Onasis Memory Service\n\n') +
|
|
136
|
+
'Onasis is an enterprise-grade Memory as a Service platform that:\n\n' +
|
|
137
|
+
' ⢠' + chalk.green('Captures') + ' and organizes your knowledge\n' +
|
|
138
|
+
' ⢠' + chalk.blue('Searches') + ' with AI-powered semantic understanding\n' +
|
|
139
|
+
' ⢠' + chalk.magenta('Integrates') + ' with your existing tools\n' +
|
|
140
|
+
' ⢠' + chalk.yellow('Scales') + ' from personal to enterprise use\n\n' +
|
|
141
|
+
'Built for developers, teams, and organizations who want to\n' +
|
|
142
|
+
'transform information into actionable intelligence.\n\n' +
|
|
143
|
+
chalk.dim('Learn more at lanonasis.com'), {
|
|
144
|
+
padding: 1,
|
|
145
|
+
borderStyle: 'double',
|
|
146
|
+
borderColor: 'cyan'
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
async showSettings() {
|
|
150
|
+
// Settings implementation
|
|
151
|
+
console.log(chalk.yellow('Settings panel coming soon...'));
|
|
152
|
+
}
|
|
153
|
+
showHelp() {
|
|
154
|
+
console.log(chalk.cyan('š” Tip: You can always type "help" for assistance'));
|
|
155
|
+
}
|
|
156
|
+
async checkAuthentication() {
|
|
157
|
+
// Check if user is authenticated
|
|
158
|
+
const context = this.stateManager.getUserContext();
|
|
159
|
+
return !!context.userId;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Interactive Setup Flow
|
|
164
|
+
*/
|
|
165
|
+
export class InteractiveSetup {
|
|
166
|
+
stateManager;
|
|
167
|
+
setupProgress = {
|
|
168
|
+
connection: false,
|
|
169
|
+
authentication: false,
|
|
170
|
+
configuration: false,
|
|
171
|
+
ready: false
|
|
172
|
+
};
|
|
173
|
+
constructor(stateManager) {
|
|
174
|
+
this.stateManager = stateManager;
|
|
175
|
+
}
|
|
176
|
+
async run() {
|
|
177
|
+
console.clear();
|
|
178
|
+
// Show progress header
|
|
179
|
+
this.showProgressHeader();
|
|
180
|
+
// Step 1: Connection Setup
|
|
181
|
+
await this.setupConnection();
|
|
182
|
+
this.setupProgress.connection = true;
|
|
183
|
+
this.showProgressHeader();
|
|
184
|
+
// Step 2: Authentication
|
|
185
|
+
await this.setupAuthentication();
|
|
186
|
+
this.setupProgress.authentication = true;
|
|
187
|
+
this.showProgressHeader();
|
|
188
|
+
// Step 3: Configuration
|
|
189
|
+
await this.setupConfiguration();
|
|
190
|
+
this.setupProgress.configuration = true;
|
|
191
|
+
this.showProgressHeader();
|
|
192
|
+
// Step 4: Complete
|
|
193
|
+
this.setupProgress.ready = true;
|
|
194
|
+
this.showProgressHeader();
|
|
195
|
+
await this.showSetupComplete();
|
|
196
|
+
}
|
|
197
|
+
showProgressHeader() {
|
|
198
|
+
const steps = [
|
|
199
|
+
{ name: 'Connect', done: this.setupProgress.connection },
|
|
200
|
+
{ name: 'Authenticate', done: this.setupProgress.authentication },
|
|
201
|
+
{ name: 'Configure', done: this.setupProgress.configuration },
|
|
202
|
+
{ name: 'Ready!', done: this.setupProgress.ready }
|
|
203
|
+
];
|
|
204
|
+
console.clear();
|
|
205
|
+
console.log(boxen('Setup Progress\n' +
|
|
206
|
+
steps.map((step, i) => {
|
|
207
|
+
const num = `[${i + 1}]`;
|
|
208
|
+
const status = step.done ? chalk.green('ā') : chalk.gray('ā');
|
|
209
|
+
const name = step.done ? chalk.green(step.name) : chalk.gray(step.name);
|
|
210
|
+
return `${num} ${name}`;
|
|
211
|
+
}).join(' ') + '\n' +
|
|
212
|
+
this.renderProgressBar(steps), {
|
|
213
|
+
padding: 1,
|
|
214
|
+
borderStyle: 'single',
|
|
215
|
+
borderColor: 'cyan'
|
|
216
|
+
}));
|
|
217
|
+
console.log();
|
|
218
|
+
}
|
|
219
|
+
renderProgressBar(steps) {
|
|
220
|
+
const completed = steps.filter(s => s.done).length;
|
|
221
|
+
const total = steps.length;
|
|
222
|
+
const percentage = Math.round((completed / total) * 100);
|
|
223
|
+
const barLength = 40;
|
|
224
|
+
const filled = Math.round((completed / total) * barLength);
|
|
225
|
+
const bar = 'ā'.repeat(filled) + 'ā'.repeat(barLength - filled);
|
|
226
|
+
return chalk.cyan(bar) + ' ' + chalk.bold(`${percentage}%`);
|
|
227
|
+
}
|
|
228
|
+
async setupConnection() {
|
|
229
|
+
console.log(chalk.bold.blue('š Step 1: Connection Setup'));
|
|
230
|
+
console.log("Let's connect to your Onasis service\n");
|
|
231
|
+
const { connectionType } = await inquirer.prompt([
|
|
232
|
+
{
|
|
233
|
+
type: 'list',
|
|
234
|
+
name: 'connectionType',
|
|
235
|
+
message: 'Where is your Onasis service hosted?',
|
|
236
|
+
choices: [
|
|
237
|
+
{
|
|
238
|
+
name: 'āļø Cloud (api.lanonasis.com)' + chalk.gray(' ā Recommended for most users'),
|
|
239
|
+
value: 'cloud',
|
|
240
|
+
short: 'Cloud'
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
name: 'š¢ Self-hosted' + chalk.gray(' Enter your server URL'),
|
|
244
|
+
value: 'self-hosted',
|
|
245
|
+
short: 'Self-hosted'
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: 'š» Local development' + chalk.gray(' Use localhost:3000'),
|
|
249
|
+
value: 'local',
|
|
250
|
+
short: 'Local'
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
]);
|
|
255
|
+
let serverUrl = 'https://api.lanonasis.com';
|
|
256
|
+
if (connectionType === 'self-hosted') {
|
|
257
|
+
const { customUrl } = await inquirer.prompt([
|
|
258
|
+
{
|
|
259
|
+
type: 'input',
|
|
260
|
+
name: 'customUrl',
|
|
261
|
+
message: 'Enter your server URL:',
|
|
262
|
+
default: 'https://your-server.com',
|
|
263
|
+
validate: (input) => {
|
|
264
|
+
if (!input.startsWith('http://') && !input.startsWith('https://')) {
|
|
265
|
+
return 'URL must start with http:// or https://';
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
]);
|
|
271
|
+
serverUrl = customUrl;
|
|
272
|
+
}
|
|
273
|
+
else if (connectionType === 'local') {
|
|
274
|
+
serverUrl = 'http://localhost:3000';
|
|
275
|
+
}
|
|
276
|
+
// Test connection
|
|
277
|
+
const spinner = ora('Testing connection...').start();
|
|
278
|
+
await this.simulateDelay(1500);
|
|
279
|
+
spinner.succeed('Connection successful!');
|
|
280
|
+
// Save to state
|
|
281
|
+
this.stateManager.updateUserContext({
|
|
282
|
+
organization: serverUrl
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async setupAuthentication() {
|
|
286
|
+
console.log(chalk.bold.blue('\nš Step 2: Authentication'));
|
|
287
|
+
console.log('Choose how you\'d like to connect:\n');
|
|
288
|
+
const authBox = (title, description, features) => {
|
|
289
|
+
return chalk.bold(title) + '\n' +
|
|
290
|
+
chalk.gray(description) + '\n' +
|
|
291
|
+
features.map(f => chalk.dim(` āŖ ${f}`)).join('\n');
|
|
292
|
+
};
|
|
293
|
+
const { authMethod } = await inquirer.prompt([
|
|
294
|
+
{
|
|
295
|
+
type: 'list',
|
|
296
|
+
name: 'authMethod',
|
|
297
|
+
message: 'Select authentication method:',
|
|
298
|
+
choices: [
|
|
299
|
+
{
|
|
300
|
+
name: authBox('š Vendor Key', 'Secure API access with pk_xxx.sk_xxx format', ['No expiration', 'Ideal for CI/CD', 'Full API access']),
|
|
301
|
+
value: 'vendor',
|
|
302
|
+
short: 'Vendor Key'
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: authBox('š Browser Authentication', 'Sign in via your web browser', ['Most secure', 'SSO support', 'Session-based']),
|
|
306
|
+
value: 'browser',
|
|
307
|
+
short: 'Browser'
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: authBox('š§ Email & Password', 'Traditional authentication', ['Quick setup', 'Familiar flow', 'Manual entry']),
|
|
311
|
+
value: 'email',
|
|
312
|
+
short: 'Email'
|
|
313
|
+
}
|
|
314
|
+
],
|
|
315
|
+
pageSize: 10
|
|
316
|
+
}
|
|
317
|
+
]);
|
|
318
|
+
switch (authMethod) {
|
|
319
|
+
case 'vendor':
|
|
320
|
+
await this.authenticateWithVendorKey();
|
|
321
|
+
break;
|
|
322
|
+
case 'browser':
|
|
323
|
+
await this.authenticateWithBrowser();
|
|
324
|
+
break;
|
|
325
|
+
case 'email':
|
|
326
|
+
await this.authenticateWithEmail();
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
async authenticateWithVendorKey() {
|
|
331
|
+
const { publicKey, secretKey } = await inquirer.prompt([
|
|
332
|
+
{
|
|
333
|
+
type: 'input',
|
|
334
|
+
name: 'publicKey',
|
|
335
|
+
message: 'Enter your Public Key (pk_xxx):',
|
|
336
|
+
validate: (input) => {
|
|
337
|
+
if (!input.startsWith('pk_')) {
|
|
338
|
+
return 'Public key must start with pk_';
|
|
339
|
+
}
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
type: 'password',
|
|
345
|
+
name: 'secretKey',
|
|
346
|
+
message: 'Enter your Secret Key (sk_xxx):',
|
|
347
|
+
mask: '*',
|
|
348
|
+
validate: (input) => {
|
|
349
|
+
if (!input.startsWith('sk_')) {
|
|
350
|
+
return 'Secret key must start with sk_';
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
]);
|
|
356
|
+
const spinner = ora('Authenticating...').start();
|
|
357
|
+
await this.simulateDelay(1000);
|
|
358
|
+
spinner.succeed('Authentication successful!');
|
|
359
|
+
this.stateManager.updateUserContext({
|
|
360
|
+
userId: 'vendor_user',
|
|
361
|
+
email: 'vendor@example.com'
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
async authenticateWithBrowser() {
|
|
365
|
+
console.log(chalk.cyan('\nš Opening browser for authentication...'));
|
|
366
|
+
console.log(chalk.gray('Please complete the login in your browser'));
|
|
367
|
+
const spinner = ora('Waiting for browser authentication...').start();
|
|
368
|
+
await this.simulateDelay(3000);
|
|
369
|
+
spinner.succeed('Browser authentication successful!');
|
|
370
|
+
this.stateManager.updateUserContext({
|
|
371
|
+
userId: 'browser_user',
|
|
372
|
+
email: 'user@example.com'
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
async authenticateWithEmail() {
|
|
376
|
+
const { email, password } = await inquirer.prompt([
|
|
377
|
+
{
|
|
378
|
+
type: 'input',
|
|
379
|
+
name: 'email',
|
|
380
|
+
message: 'Email:',
|
|
381
|
+
validate: (input) => {
|
|
382
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
383
|
+
if (!emailRegex.test(input)) {
|
|
384
|
+
return 'Please enter a valid email address';
|
|
385
|
+
}
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
type: 'password',
|
|
391
|
+
name: 'password',
|
|
392
|
+
message: 'Password:',
|
|
393
|
+
mask: '*'
|
|
394
|
+
}
|
|
395
|
+
]);
|
|
396
|
+
const spinner = ora('Signing in...').start();
|
|
397
|
+
await this.simulateDelay(1000);
|
|
398
|
+
spinner.succeed('Sign in successful!');
|
|
399
|
+
this.stateManager.updateUserContext({
|
|
400
|
+
userId: 'email_user',
|
|
401
|
+
email
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
async setupConfiguration() {
|
|
405
|
+
console.log(chalk.bold.blue('\nāļø Step 3: Configuration'));
|
|
406
|
+
console.log("Let's personalize your experience\n");
|
|
407
|
+
const answers = await inquirer.prompt([
|
|
408
|
+
{
|
|
409
|
+
type: 'list',
|
|
410
|
+
name: 'outputFormat',
|
|
411
|
+
message: 'Preferred output format:',
|
|
412
|
+
choices: [
|
|
413
|
+
{ name: 'Table (formatted)', value: 'table' },
|
|
414
|
+
{ name: 'JSON (structured)', value: 'json' },
|
|
415
|
+
{ name: 'Minimal (compact)', value: 'minimal' }
|
|
416
|
+
],
|
|
417
|
+
default: 'table'
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
type: 'confirm',
|
|
421
|
+
name: 'expertMode',
|
|
422
|
+
message: 'Enable expert mode? (streamlined interface for power users)',
|
|
423
|
+
default: false
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
type: 'confirm',
|
|
427
|
+
name: 'animations',
|
|
428
|
+
message: 'Enable animations and progress indicators?',
|
|
429
|
+
default: true
|
|
430
|
+
}
|
|
431
|
+
]);
|
|
432
|
+
const preferences = {
|
|
433
|
+
outputFormat: answers.outputFormat,
|
|
434
|
+
expertMode: answers.expertMode,
|
|
435
|
+
animations: answers.animations
|
|
436
|
+
};
|
|
437
|
+
// Update preferences
|
|
438
|
+
const currentPrefs = this.stateManager.getPreferences();
|
|
439
|
+
Object.assign(currentPrefs, preferences);
|
|
440
|
+
console.log(chalk.green('\nā Configuration saved!'));
|
|
441
|
+
}
|
|
442
|
+
async showSetupComplete() {
|
|
443
|
+
console.log(boxen(chalk.green.bold('š Setup Complete!\n\n') +
|
|
444
|
+
'Your Onasis CLI is ready to use.\n\n' +
|
|
445
|
+
chalk.bold('Quick Commands:\n') +
|
|
446
|
+
' ' + chalk.cyan('onasis memory create') + ' - Create a new memory\n' +
|
|
447
|
+
' ' + chalk.cyan('onasis search "query"') + ' - Search your memories\n' +
|
|
448
|
+
' ' + chalk.cyan('onasis help') + ' - Show all commands\n\n' +
|
|
449
|
+
chalk.dim('Press Enter to continue to the dashboard...'), {
|
|
450
|
+
padding: 1,
|
|
451
|
+
borderStyle: 'double',
|
|
452
|
+
borderColor: 'green',
|
|
453
|
+
align: 'center'
|
|
454
|
+
}));
|
|
455
|
+
await inquirer.prompt([
|
|
456
|
+
{
|
|
457
|
+
type: 'input',
|
|
458
|
+
name: 'continue',
|
|
459
|
+
message: ''
|
|
460
|
+
}
|
|
461
|
+
]);
|
|
462
|
+
}
|
|
463
|
+
async simulateDelay(ms) {
|
|
464
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
465
|
+
}
|
|
466
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced CLI Entry Point
|
|
4
|
+
* Integrates all the enhanced experience components
|
|
5
|
+
*/
|
|
6
|
+
import { CLIExperienceArchitecture } from './core/architecture.js';
|
|
7
|
+
import { ErrorHandler } from './core/error-handler.js';
|
|
8
|
+
import { AchievementSystem } from './core/achievements.js';
|
|
9
|
+
import { ProgressIndicator } from './core/progress.js';
|
|
10
|
+
declare const architecture: CLIExperienceArchitecture;
|
|
11
|
+
declare const stateManager: import("./core/architecture.js").StateManager;
|
|
12
|
+
declare const errorHandler: ErrorHandler;
|
|
13
|
+
declare const achievementSystem: AchievementSystem;
|
|
14
|
+
declare const progressIndicator: ProgressIndicator;
|
|
15
|
+
export { architecture, stateManager, errorHandler, achievementSystem, progressIndicator };
|