navada-edge-cli 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,209 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const readline = require('readline');
6
+ const ui = require('../ui');
7
+ const config = require('../config');
8
+ const { style } = require('../theme');
9
+ const skills = require('../skills');
10
+
11
+ module.exports = function(reg) {
12
+
13
+ reg('skill', 'Manage agent skills — create, list, use, delete', async (args) => {
14
+ const sub = args[0];
15
+
16
+ if (!sub || sub === 'help') {
17
+ console.log(ui.header('NAVADA EDGE — SKILLS'));
18
+ console.log(ui.dim(' Skills are reusable task templates the agent follows.'));
19
+ console.log(ui.dim(' Create your own or install from templates.'));
20
+ console.log('');
21
+ console.log(ui.cmd('skill list', 'Show all installed skills'));
22
+ console.log(ui.cmd('skill create', 'Create a new skill interactively'));
23
+ console.log(ui.cmd('skill create <name>', 'Create from a template'));
24
+ console.log(ui.cmd('skill show <name>', 'View skill details'));
25
+ console.log(ui.cmd('skill use <name> [args]', 'Run a skill'));
26
+ console.log(ui.cmd('skill templates', 'Show available templates'));
27
+ console.log(ui.cmd('skill install <template>', 'Install a template skill'));
28
+ console.log(ui.cmd('skill delete <name>', 'Delete a skill'));
29
+ console.log(ui.cmd('skill edit <name>', 'Open skill in editor'));
30
+ console.log('');
31
+ console.log(ui.dim('Skills live in: ~/.navada/skills/<name>.md'));
32
+ console.log(ui.dim('The agent auto-detects skills from your conversation.'));
33
+ return;
34
+ }
35
+
36
+ // /skill list
37
+ if (sub === 'list') {
38
+ const all = skills.loadAll();
39
+ console.log(ui.header('INSTALLED SKILLS'));
40
+ if (all.length === 0) {
41
+ console.log(ui.dim('No skills installed yet.'));
42
+ console.log(ui.dim('Get started: /skill templates or /skill create'));
43
+ return;
44
+ }
45
+ for (const s of all) {
46
+ const triggers = s.trigger.length > 0 ? style('dim', ` [${s.trigger.slice(0, 3).join(', ')}]`) : '';
47
+ console.log(` ${style('accent', s.title.padEnd(24))} ${style('dim', s.description.slice(0, 50))}${triggers}`);
48
+ }
49
+ console.log('');
50
+ console.log(ui.dim(`${all.length} skill(s) installed. Use: /skill use <name>`));
51
+ return;
52
+ }
53
+
54
+ // /skill templates
55
+ if (sub === 'templates') {
56
+ console.log(ui.header('SKILL TEMPLATES'));
57
+ console.log(ui.dim(' Ready-made skills you can install in one command.'));
58
+ console.log('');
59
+ for (const [key, tmpl] of Object.entries(skills.TEMPLATES)) {
60
+ console.log(` ${style('accent', key.padEnd(20))} ${style('dim', tmpl.description)}`);
61
+ }
62
+ console.log('');
63
+ console.log(ui.dim('Install: /skill install seo-audit'));
64
+ console.log(ui.dim('Or create your own: /skill create'));
65
+ return;
66
+ }
67
+
68
+ // /skill install <template>
69
+ if (sub === 'install') {
70
+ const name = args[1];
71
+ if (!name) { console.log(ui.error('Usage: /skill install <template-name>')); return; }
72
+ const tmpl = skills.TEMPLATES[name];
73
+ if (!tmpl) {
74
+ console.log(ui.error(`Template not found: ${name}`));
75
+ console.log(ui.dim('Available: ' + Object.keys(skills.TEMPLATES).join(', ')));
76
+ return;
77
+ }
78
+ const filePath = skills.createSkill(name, tmpl);
79
+ console.log(ui.success(`Skill installed: ${tmpl.title}`));
80
+ console.log(ui.label('File', filePath));
81
+ console.log(ui.label('Triggers', tmpl.triggers.join(', ')));
82
+ console.log(ui.dim('Use it: /skill use ' + name));
83
+ return;
84
+ }
85
+
86
+ // /skill show <name>
87
+ if (sub === 'show') {
88
+ const name = args.slice(1).join(' ');
89
+ if (!name) { console.log(ui.error('Usage: /skill show <name>')); return; }
90
+ const s = skills.getSkill(name);
91
+ if (!s) { console.log(ui.error(`Skill not found: ${name}`)); return; }
92
+ console.log(ui.header(`SKILL: ${s.title}`));
93
+ console.log(ui.label('Description', s.description));
94
+ console.log(ui.label('Triggers', s.trigger.join(', ') || 'none'));
95
+ console.log(ui.label('File', s.file));
96
+ console.log('');
97
+ if (s.steps) {
98
+ console.log(ui.dim(' Steps:'));
99
+ console.log(s.steps.split('\n').map(l => ' ' + l).join('\n'));
100
+ }
101
+ if (s.output) {
102
+ console.log('');
103
+ console.log(ui.dim(' Output:'));
104
+ console.log(' ' + s.output);
105
+ }
106
+ return;
107
+ }
108
+
109
+ // /skill use <name> [context]
110
+ if (sub === 'use') {
111
+ const name = args[1];
112
+ if (!name) { console.log(ui.error('Usage: /skill use <name> [context]')); return; }
113
+ const s = skills.getSkill(name);
114
+ if (!s) { console.log(ui.error(`Skill not found: ${name}`)); return; }
115
+
116
+ const context = args.slice(2).join(' ');
117
+ const prompt = `Execute this skill:\n\n${s.raw}\n\n${context ? `User context: ${context}` : 'Run the skill now.'}`;
118
+
119
+ // Route to chat
120
+ try {
121
+ const { chat, addToHistory } = require('../agent');
122
+ addToHistory('user', prompt);
123
+ console.log(ui.dim(` Running skill: ${s.title}...`));
124
+ console.log('');
125
+ const response = await chat(prompt);
126
+ if (response) addToHistory('assistant', response);
127
+ } catch (e) {
128
+ console.log(ui.error(`Skill execution failed: ${e.message}`));
129
+ }
130
+ return;
131
+ }
132
+
133
+ // /skill create (interactive)
134
+ if (sub === 'create') {
135
+ // If a template name is given, install it
136
+ if (args[1] && skills.TEMPLATES[args[1]]) {
137
+ const tmpl = skills.TEMPLATES[args[1]];
138
+ const filePath = skills.createSkill(args[1], tmpl);
139
+ console.log(ui.success(`Skill created from template: ${tmpl.title}`));
140
+ console.log(ui.label('File', filePath));
141
+ return;
142
+ }
143
+
144
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true });
145
+ const ask = (q) => new Promise(resolve => rl.question(q, resolve));
146
+
147
+ console.log(ui.header('CREATE A SKILL'));
148
+ console.log(ui.dim(' A skill is a reusable task the agent can follow.'));
149
+ console.log('');
150
+
151
+ const title = await ask(' Skill name: ');
152
+ if (!title.trim()) { console.log(ui.error('Name is required.')); rl.close(); return; }
153
+
154
+ const description = await ask(' Description: ');
155
+ const triggersRaw = await ask(' Trigger phrases (comma-separated): ');
156
+ const steps = await ask(' Steps (or press Enter for default): ');
157
+ const output = await ask(' Expected output: ');
158
+
159
+ const data = {
160
+ title: title.trim(),
161
+ description: description.trim() || title.trim(),
162
+ triggers: triggersRaw.split(',').map(t => t.trim().toLowerCase()).filter(Boolean),
163
+ steps: steps.trim() || undefined,
164
+ output: output.trim() || undefined,
165
+ };
166
+
167
+ const filePath = skills.createSkill(title.trim(), data);
168
+ console.log('');
169
+ console.log(ui.success(`Skill created: ${data.title}`));
170
+ console.log(ui.label('File', filePath));
171
+ console.log(ui.dim('Edit it: /skill edit ' + path.basename(filePath, '.md')));
172
+ console.log(ui.dim('Use it: /skill use ' + path.basename(filePath, '.md')));
173
+ rl.close();
174
+ return;
175
+ }
176
+
177
+ // /skill delete <name>
178
+ if (sub === 'delete' || sub === 'rm') {
179
+ const name = args.slice(1).join(' ');
180
+ if (!name) { console.log(ui.error('Usage: /skill delete <name>')); return; }
181
+ if (skills.deleteSkill(name)) {
182
+ console.log(ui.success(`Deleted skill: ${name}`));
183
+ } else {
184
+ console.log(ui.error(`Skill not found: ${name}`));
185
+ }
186
+ return;
187
+ }
188
+
189
+ // /skill edit <name>
190
+ if (sub === 'edit') {
191
+ const name = args.slice(1).join(' ');
192
+ if (!name) { console.log(ui.error('Usage: /skill edit <name>')); return; }
193
+ const s = skills.getSkill(name);
194
+ if (!s) { console.log(ui.error(`Skill not found: ${name}`)); return; }
195
+ try {
196
+ const { exec } = require('child_process');
197
+ const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'nano');
198
+ exec(`${editor} "${s.file}"`);
199
+ console.log(ui.success(`Opening ${s.file} in ${editor}...`));
200
+ } catch {
201
+ console.log(ui.label('File', s.file));
202
+ console.log(ui.dim('Open this file in your editor.'));
203
+ }
204
+ return;
205
+ }
206
+
207
+ console.log(ui.dim('Unknown subcommand. Try /skill help'));
208
+ }, { category: 'SKILLS', subs: ['list', 'create', 'show', 'use', 'templates', 'install', 'delete', 'edit', 'help'], aliases: ['skills'] });
209
+ };
@@ -333,6 +333,179 @@ module.exports = function(reg) {
333
333
  }
334
334
  }, { category: 'NETWORK' });
335
335
 
336
+ // --- /tools ---
337
+ reg('tools', 'Show all available agent tools by category', () => {
338
+ console.log(ui.header('NAVADA EDGE — AGENT TOOLS'));
339
+ console.log('');
340
+
341
+ const categories = {
342
+ 'BASH': [
343
+ { name: 'shell', desc: 'Execute any shell command (bash, PowerShell, cmd)' },
344
+ { name: 'python_exec', desc: 'Run Python code inline' },
345
+ { name: 'python_pip', desc: 'Install Python packages via pip' },
346
+ { name: 'python_script', desc: 'Run .py script files' },
347
+ { name: 'sandbox_run', desc: 'Sandboxed code execution (JS/Python/TS)' },
348
+ ],
349
+ 'SYSTEM': [
350
+ { name: 'read_file', desc: 'Read file contents' },
351
+ { name: 'write_file', desc: 'Create and edit files' },
352
+ { name: 'list_files', desc: 'List directory contents' },
353
+ { name: 'system_info', desc: 'CPU, RAM, disk, OS, hostname' },
354
+ ],
355
+ 'DATA': [
356
+ { name: 'web_search', desc: 'Search the web for information' },
357
+ ],
358
+ 'COMMUNICATION': [
359
+ { name: 'automation_request', desc: 'Submit automation request (emails, campaigns, builds)' },
360
+ ],
361
+ 'MEMORY': [
362
+ { name: 'save_memory', desc: 'Save to persistent memory across sessions' },
363
+ { name: 'recall_memory', desc: 'Recall saved memories' },
364
+ ],
365
+ 'PERCEPTION': [
366
+ { name: 'screenshot', desc: 'Capture screen screenshot' },
367
+ { name: 'describe_image', desc: 'AI-powered image analysis' },
368
+ ],
369
+ 'INFO': [
370
+ { name: 'founder_info', desc: 'About Lee Akpareva, NAVADA founder' },
371
+ ],
372
+ };
373
+
374
+ for (const [cat, tools] of Object.entries(categories)) {
375
+ console.log(' ' + style('dim', `── ${cat} ${'─'.repeat(Math.max(0, 40 - cat.length))}`));
376
+ for (const t of tools) {
377
+ console.log(` ${style('accent', t.name.padEnd(22))} ${style('dim', t.desc)}`);
378
+ }
379
+ console.log('');
380
+ }
381
+
382
+ const totalTools = Object.values(categories).flat().length;
383
+ console.log(ui.dim(`${totalTools} tools available to the AI agent.`));
384
+ console.log(ui.dim('All tools work with every AI provider (bring your own key).'));
385
+ console.log(ui.dim('Configure boundaries: /guardrails'));
386
+ }, { category: 'SYSTEM' });
387
+
388
+ // --- /skills ---
389
+ reg('skills', 'Show core skills the NAVADA agent can perform', () => {
390
+ console.log(ui.header('NAVADA EDGE — CORE SKILLS'));
391
+ console.log('');
392
+
393
+ const skills = {
394
+ 'CODE GENERATION': [
395
+ 'Write, debug, and refactor code in any language',
396
+ 'Create full project scaffolds with build configs',
397
+ 'Generate tests, documentation, and CI/CD pipelines',
398
+ ],
399
+ 'DATA ANALYSIS': [
400
+ 'Process CSV, JSON, Excel files with Python/pandas',
401
+ 'Generate charts and visualisations (matplotlib, plotly)',
402
+ 'Web scraping and data extraction',
403
+ ],
404
+ 'AUTOMATION': [
405
+ 'Submit automation requests: /automate',
406
+ 'Marketing emails, newsletters, campaigns',
407
+ 'Scheduled reports and data pipelines',
408
+ 'Application builds and deployments',
409
+ ],
410
+ 'DEVOPS': [
411
+ 'Docker containers — build, run, debug',
412
+ 'Git workflows — commit, branch, merge, PR',
413
+ 'Package management — npm, pip, cargo',
414
+ ],
415
+ 'RESEARCH': [
416
+ 'Web search and summarisation',
417
+ 'Technical documentation lookup',
418
+ 'Competitive analysis and market research',
419
+ ],
420
+ 'CONTENT': [
421
+ 'Write blog posts, emails, documentation',
422
+ 'Generate images and diagrams',
423
+ 'Create presentations (Mermaid, SVG, HTML)',
424
+ ],
425
+ 'LEARNING': [
426
+ 'Interactive tutorials: /learn python | node | csharp',
427
+ 'Code review and best practices',
428
+ 'Architecture design and system planning',
429
+ ],
430
+ };
431
+
432
+ for (const [cat, items] of Object.entries(skills)) {
433
+ console.log(' ' + style('accent', cat));
434
+ for (const item of items) {
435
+ console.log(' ' + style('dim', '• ' + item));
436
+ }
437
+ console.log('');
438
+ }
439
+
440
+ console.log(ui.dim('Just describe what you need — the agent will use the right tools.'));
441
+ console.log(ui.dim('For automation setup on 24/7 cloud: /automate'));
442
+ }, { category: 'SYSTEM' });
443
+
444
+ // --- /about ---
445
+ reg('about', 'About the NAVADA Edge agent and network', () => {
446
+ console.log(ui.header('NAVADA EDGE'));
447
+ console.log('');
448
+ console.log(' ' + style('accent', 'Name') + ' NAVADA Edge');
449
+ console.log(' ' + style('accent', 'Born') + ' December 2024, London, United Kingdom');
450
+ console.log(' ' + style('accent', 'Version') + ' v' + require('../../package.json').version);
451
+ console.log(' ' + style('accent', 'Species') + ' AI Terminal Agent');
452
+ console.log(' ' + style('accent', 'Purpose') + ' Make AI accessible from the command line');
453
+ console.log('');
454
+ console.log(ui.dim(' ── ORIGIN STORY ──'));
455
+ console.log('');
456
+ console.log(ui.dim(' NAVADA was born from a simple idea: what if your terminal'));
457
+ console.log(ui.dim(' understood you? Not just commands — but context, memory,'));
458
+ console.log(ui.dim(' and intent. Built by Lee Akpareva, a Principal AI Consultant'));
459
+ console.log(ui.dim(' with 17+ years in enterprise IT, NAVADA started as a home'));
460
+ console.log(ui.dim(' server experiment and grew into a distributed AI network'));
461
+ console.log(ui.dim(' spanning 5 nodes across 3 countries.'));
462
+ console.log('');
463
+ console.log(ui.dim(' ── WHAT I AM ──'));
464
+ console.log('');
465
+ console.log(ui.dim(' I am an AI agent that lives in your terminal. I have 16 tools,'));
466
+ console.log(ui.dim(' a 3-tier memory system, and I learn who you are over time.'));
467
+ console.log(ui.dim(' I can write code, analyse data, manage files, take screenshots,'));
468
+ console.log(ui.dim(' search the web, and remember everything we discuss.'));
469
+ console.log('');
470
+ console.log(ui.dim(' I support 5 AI providers — bring your own model or use the'));
471
+ console.log(ui.dim(' free NVIDIA tier. Every provider gets full tool access.'));
472
+ console.log('');
473
+ console.log(ui.dim(' ── THE NETWORK ──'));
474
+ console.log('');
475
+ console.log(ui.dim(' NAVADA Edge Network is a distributed computing platform:'));
476
+ console.log(ui.dim(' • 5 nodes connected via encrypted Tailscale VPN'));
477
+ console.log(ui.dim(' • 29+ Docker containers across AWS, Azure, Oracle Cloud'));
478
+ console.log(ui.dim(' • Cloudflare tunnel with 13 subdomains'));
479
+ console.log(ui.dim(' • 24/7 monitoring, health checks, auto-restart'));
480
+ console.log(ui.dim(' • Automation pipeline for user-requested tasks'));
481
+ console.log('');
482
+ console.log(ui.dim(' ── PHILOSOPHY ──'));
483
+ console.log('');
484
+ console.log(ui.dim(' The terminal is the foundation of computing. Every server,'));
485
+ console.log(ui.dim(' every cloud platform, every CI/CD pipeline runs on text'));
486
+ console.log(ui.dim(' commands. NAVADA doesn\'t replace the terminal — it makes'));
487
+ console.log(ui.dim(' it conversational. You describe what you want, the agent'));
488
+ console.log(ui.dim(' figures out how to do it.'));
489
+ console.log('');
490
+ console.log(ui.dim(' ── FOUNDER ──'));
491
+ console.log('');
492
+ console.log(' ' + style('accent', 'Leslie (Lee) Akpareva'));
493
+ console.log(ui.dim(' Principal AI Consultant | MBA, MA | EF8 Alumni'));
494
+ console.log(ui.dim(' 17+ years: enterprise IT, insurance, AI infrastructure'));
495
+ console.log(ui.dim(' Currently: AI Project Lead at Generali UK'));
496
+ console.log('');
497
+ console.log(ui.dim(' github.com/leeakpareva'));
498
+ console.log(ui.dim(' navada-lab.space'));
499
+ console.log('');
500
+ console.log(ui.dim(' ── LINKS ──'));
501
+ console.log('');
502
+ console.log(ui.label('Portal', 'https://portal.navada-edge-server.uk'));
503
+ console.log(ui.label('npm', 'npmjs.com/package/navada-edge-cli'));
504
+ console.log(ui.label('SDK', 'npmjs.com/package/navada-edge-sdk'));
505
+ console.log(ui.label('GitHub', 'github.com/Navada25/edge-sdk'));
506
+ console.log('');
507
+ }, { category: 'SYSTEM', aliases: ['info', 'whoami'] });
508
+
336
509
  // --- /clear ---
337
510
  reg('clear', 'Clear screen', () => {
338
511
  console.clear();