diff --git a/packages/backend/src/services/CommandService.js b/packages/backend/src/services/CommandService.js index b7891979..c4824f18 100644 --- a/packages/backend/src/services/CommandService.js +++ b/packages/backend/src/services/CommandService.js @@ -23,6 +23,10 @@ class Command { this.spec_ = spec; } + get id() { + return this.spec_.id; + } + async execute(args, log) { log = log ?? console; const { id, name, description, handler } = this.spec_; @@ -79,8 +83,12 @@ class CommandService extends BaseService { const args = text.split(/\s+/); await this.executeCommand(args, log); } + + get commandNames() { + return this.commands_.map(command => command.id); + } } module.exports = { CommandService -}; \ No newline at end of file +}; diff --git a/packages/backend/src/services/DevConsoleService.js b/packages/backend/src/services/DevConsoleService.js index ea17071f..f14fcc94 100644 --- a/packages/backend/src/services/DevConsoleService.js +++ b/packages/backend/src/services/DevConsoleService.js @@ -131,6 +131,16 @@ class DevConsoleService extends BaseService { output: process.stdout, prompt: 'puter> ', terminal: true, + completer: line => { + // We only complete service and command names + if ( line.includes(' ') ) + return; + + const results = commands.commandNames + .filter(name => name.startsWith(line)) + .map(name => `${name} `); // Add a space after to make typing arguments more convenient + return [ results, line ]; + }, }); rl.on('line', async (input) => { this._before_cmd();