@forgehive/runner 0.1.3 → 0.1.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/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @forgehive/runner
2
+
3
+ A task runner library for managing and executing tasks with proper type safety and error handling.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @forgehive/runner
9
+ ```
10
+
11
+ ## Overview
12
+
13
+ The `@forgehive/runner` package provides a way to manage and execute tasks with:
14
+
15
+ - Type-safe task execution
16
+ - Custom argument parsing
17
+ - Task description and schema inspection
18
+ - Error handling
19
+
20
+ ## Basic Usage
21
+
22
+ Here's a simple example of using the runner:
23
+
24
+ ```typescript
25
+ import { Runner } from '@forgehive/runner';
26
+ import { Task, Schema } from '@forgehive/task';
27
+
28
+ // Create a runner
29
+ const runner = new Runner();
30
+
31
+ // Create a task
32
+ const task = new Task(({ name }: { name: string }) => {
33
+ return `Hello, ${name}!`;
34
+ });
35
+
36
+ // Load the task
37
+ runner.load('greet', task);
38
+
39
+ // Run the task
40
+ const result = await runner.run('greet', { name: 'John' });
41
+ console.log(result); // "Hello, John!"
42
+ ```
43
+
44
+ ## Custom Argument Parsing
45
+
46
+ You can provide custom argument parsing:
47
+
48
+ ```typescript
49
+ interface CustomArgs {
50
+ task: string;
51
+ args: {
52
+ name: string;
53
+ age: number;
54
+ };
55
+ }
56
+
57
+ const runner = new Runner<CustomArgs>((data) => ({
58
+ taskName: data.task,
59
+ args: data.args
60
+ }));
61
+
62
+ // Now the runner expects data in this format
63
+ await runner.run('greet', { name: 'John', age: 30 });
64
+ ```
65
+
66
+ ## Task Description
67
+
68
+ You can inspect task details:
69
+
70
+ ```typescript
71
+ const runner = new Runner();
72
+ const task = new Task(({ name }: { name: string }) => {
73
+ return `Hello, ${name}!`;
74
+ });
75
+ task.setDescription('A greeting task');
76
+
77
+ runner.load('greet', task);
78
+
79
+ // Get task details
80
+ const details = runner.describe();
81
+ console.log(details);
82
+ // {
83
+ // greet: {
84
+ // name: 'greet',
85
+ // description: 'A greeting task',
86
+ // schema: { ... }
87
+ // }
88
+ // }
89
+ ```
90
+
91
+ ## API Reference
92
+
93
+ ### `Runner` Class
94
+
95
+ - `constructor(parseArgumentsFn?)`: Creates a new runner with optional custom argument parsing
96
+ - `load(name: string, task: TaskInstanceType)`: Loads a task with the given name
97
+ - `run(name: string, args: unknown)`: Runs a task with the given arguments
98
+ - `getTask(name: string)`: Gets a task by name
99
+ - `getTasks()`: Gets all loaded tasks
100
+ - `getTaskList()`: Gets list of task names
101
+ - `describe()`: Returns details about all loaded tasks
102
+ - `setHandler(handlerFn)`: Sets a custom handler for task execution
103
+
104
+ ### Types
105
+
106
+ - `RunnerParsedArguments`: Base interface for parsed arguments
107
+ - `TaskRecord`: Record type for task data
108
+
109
+ ## License
110
+
111
+ MIT
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { TaskInstanceType, BaseFunction } from '@forgehive/task';
2
+ import { type SchemaDescription } from '@forgehive/schema';
2
3
  type TaskRecord<T extends TaskInstanceType = TaskInstanceType> = {
3
4
  task: T;
4
5
  };
@@ -23,7 +24,11 @@ export declare class Runner<InputType = unknown, ParseResult extends RunnerParse
23
24
  * @returns Output data
24
25
  */
25
26
  private defaultHandler;
26
- describe(): void;
27
+ describe(): Record<string, {
28
+ name: string;
29
+ description?: string;
30
+ schema?: SchemaDescription;
31
+ }>;
27
32
  load<T extends BaseFunction>(name: string, task: TaskInstanceType<T>): void;
28
33
  getTask<T extends BaseFunction = BaseFunction>(name: string): TaskInstanceType<T> | undefined;
29
34
  getTasks(): Tasks;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEhE,KAAK,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IAC/D,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAGvC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,MAAM,CAAC,SAAS,GAAG,OAAO,EAAE,WAAW,SAAS,qBAAqB,GAAG,qBAAqB;IACjG,MAAM,EAAE,KAAK,CAAA;IACb,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW,CAAA;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;gBAEzC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW;IAsB/D;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIlE;;;;OAIG;YACW,cAAc;IAM5B,QAAQ,IAAI,IAAI;IAQhB,IAAI,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3E,OAAO,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS;IAU7F,QAAQ,IAAI,KAAK;IAIjB,WAAW,IAAI,MAAM,EAAE;IAIjB,GAAG,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAC7E,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAgBvB;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,KAAK,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IAC/D,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAGvC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,MAAM,CAAC,SAAS,GAAG,OAAO,EAAE,WAAW,SAAS,qBAAqB,GAAG,qBAAqB;IACjG,MAAM,EAAE,KAAK,CAAA;IACb,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW,CAAA;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;gBAEzC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW;IAsB/D;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIlE;;;;OAIG;YACW,cAAc;IAM5B,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAe9F,IAAI,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3E,OAAO,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS;IAU7F,QAAQ,IAAI,KAAK;IAIjB,WAAW,IAAI,MAAM,EAAE;IAIjB,GAAG,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAC7E,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAgBvB;AAED,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -39,11 +39,16 @@ class Runner {
39
39
  return res;
40
40
  }
41
41
  describe() {
42
- const listItems = this.getTaskList();
43
- console.log('Available tasks:');
44
- listItems.forEach(taskName => {
45
- console.log(`- ${taskName}`);
46
- });
42
+ const tasks = this._tasks;
43
+ const result = {};
44
+ for (const [name, { task }] of Object.entries(tasks)) {
45
+ result[name] = {
46
+ name,
47
+ description: task.getDescription(),
48
+ schema: task.describe()
49
+ };
50
+ }
51
+ return result;
47
52
  }
48
53
  load(name, task) {
49
54
  this._tasks[name] = { task };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAeA,MAAa,MAAM;IAKjB,YAAY,gBAAmD;QAC7D,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,iEAAiE;QACjE,IAAI,CAAC,cAAc,GAAG,gBAAgB,IAAI,CAAC,CAAC,IAAe,EAAe,EAAE;YAC1E,6DAA6D;YAC7D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACzE,OAAO;oBACL,8DAA8D;oBAC9D,QAAQ,EAAE,MAAM,CAAE,IAAY,CAAC,IAAI,CAAC;oBACpC,8DAA8D;oBAC9D,IAAI,EAAG,IAAY,CAAC,IAAI;iBACC,CAAA;YAC7B,CAAC;YAED,8DAA8D;YAC9D,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACrF,CAAC,CAAC,CAAA;QAEF,sBAAsB;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,SAAgD;QACzD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;IAC1B,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAAC,IAAe;QAC1C,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC1C,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,QAAQ;QACN,MAAM,SAAS,GAAa,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC/B,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAyB,IAAY,EAAE,IAAyB;QAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO,CAAwC,IAAY;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElC,OAAO,IAA2B,CAAA;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,IAAO;QAEP,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEhC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAA;QAC3C,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;QAEvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAA;QAC3C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,OAAO,OAAqB,CAAA;IAC9B,CAAC;CACF;AA/FD,wBA+FC;AAED,kBAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=describe.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.test.d.ts","sourceRoot":"","sources":["../../src/test/describe.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../index");
4
+ const task_1 = require("@forgehive/task");
5
+ describe('Runner describe', () => {
6
+ it('should return task details including name, description and schema', () => {
7
+ const runner = new index_1.Runner();
8
+ const schema = new task_1.Schema({
9
+ value: task_1.Schema.number()
10
+ });
11
+ const task = new task_1.Task(({ value }) => {
12
+ return value;
13
+ }, {
14
+ schema
15
+ });
16
+ task.setDescription('A test task that processes numbers');
17
+ runner.load('testTask', task);
18
+ const result = runner.describe();
19
+ expect(result).toEqual({
20
+ testTask: {
21
+ name: 'testTask',
22
+ description: 'A test task that processes numbers',
23
+ schema: {
24
+ value: {
25
+ type: 'number'
26
+ }
27
+ }
28
+ }
29
+ });
30
+ });
31
+ it('should handle tasks without description or schema', () => {
32
+ const runner = new index_1.Runner();
33
+ const task = new task_1.Task(() => {
34
+ return 'test';
35
+ });
36
+ runner.load('simpleTask', task);
37
+ const result = runner.describe();
38
+ expect(result).toEqual({
39
+ simpleTask: {
40
+ name: 'simpleTask',
41
+ description: undefined,
42
+ schema: {}
43
+ }
44
+ });
45
+ });
46
+ it('should handle multiple tasks with task: prefix', () => {
47
+ const runner = new index_1.Runner();
48
+ const runTask = (0, task_1.createTask)(new task_1.Schema({
49
+ descriptorName: task_1.Schema.string(),
50
+ args: task_1.Schema.mixedRecord()
51
+ }), {}, async () => 'running');
52
+ runTask.setDescription('Executes the task');
53
+ const createTaskInstance = (0, task_1.createTask)(new task_1.Schema({
54
+ descriptorName: task_1.Schema.string()
55
+ }), {}, async ({ descriptorName }) => {
56
+ return descriptorName;
57
+ });
58
+ createTaskInstance.setDescription('Creates a new task');
59
+ runner.load('task:run', runTask);
60
+ runner.load('task:create', createTaskInstance);
61
+ const result = runner.describe();
62
+ expect(result).toEqual({
63
+ 'task:run': {
64
+ name: 'task:run',
65
+ description: 'Executes the task',
66
+ schema: {
67
+ descriptorName: {
68
+ type: 'string'
69
+ },
70
+ args: {
71
+ type: 'mixedRecord'
72
+ }
73
+ }
74
+ },
75
+ 'task:create': {
76
+ name: 'task:create',
77
+ description: 'Creates a new task',
78
+ schema: {
79
+ descriptorName: {
80
+ type: 'string'
81
+ }
82
+ }
83
+ }
84
+ });
85
+ });
86
+ });
87
+ //# sourceMappingURL=describe.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.test.js","sourceRoot":"","sources":["../../src/test/describe.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgehive/runner",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -8,13 +8,13 @@
8
8
  "publishConfig": {
9
9
  "access": "public",
10
10
  "dependencies": {
11
- "@forgehive/schema": "^0.1.0",
12
- "@forgehive/task": "^0.1.1"
11
+ "@forgehive/schema": "^0.1.4",
12
+ "@forgehive/task": "^0.1.5"
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@forgehive/task": "0.1.3",
17
- "@forgehive/schema": "0.1.3"
16
+ "@forgehive/task": "0.1.5",
17
+ "@forgehive/schema": "0.1.4"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/jest": "^29.5.12",
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-console */
2
2
  import { TaskInstanceType, BaseFunction } from '@forgehive/task'
3
+ import { type SchemaDescription } from '@forgehive/schema'
3
4
 
4
5
  type TaskRecord<T extends TaskInstanceType = TaskInstanceType> = {
5
6
  task: T
@@ -59,12 +60,19 @@ export class Runner<InputType = unknown, ParseResult extends RunnerParsedArgumen
59
60
  return res
60
61
  }
61
62
 
62
- describe(): void {
63
- const listItems: string[] = this.getTaskList()
64
- console.log('Available tasks:')
65
- listItems.forEach(taskName => {
66
- console.log(`- ${taskName}`)
67
- })
63
+ describe(): Record<string, { name: string; description?: string; schema?: SchemaDescription }> {
64
+ const tasks = this._tasks
65
+ const result: Record<string, { name: string; description?: string; schema?: SchemaDescription }> = {}
66
+
67
+ for (const [name, { task }] of Object.entries(tasks)) {
68
+ result[name] = {
69
+ name,
70
+ description: task.getDescription(),
71
+ schema: task.describe()
72
+ }
73
+ }
74
+
75
+ return result
68
76
  }
69
77
 
70
78
  load<T extends BaseFunction>(name: string, task: TaskInstanceType<T>): void {
@@ -0,0 +1,106 @@
1
+ import { Runner } from '../index'
2
+ import { Task, Schema, createTask } from '@forgehive/task'
3
+
4
+ describe('Runner describe', () => {
5
+ it('should return task details including name, description and schema', () => {
6
+ const runner = new Runner()
7
+ const schema = new Schema({
8
+ value: Schema.number()
9
+ })
10
+
11
+ const task = new Task(({ value }: { value: number }) => {
12
+ return value
13
+ }, {
14
+ schema
15
+ })
16
+
17
+ task.setDescription('A test task that processes numbers')
18
+
19
+ runner.load('testTask', task)
20
+ const result = runner.describe()
21
+
22
+ expect(result).toEqual({
23
+ testTask: {
24
+ name: 'testTask',
25
+ description: 'A test task that processes numbers',
26
+ schema: {
27
+ value: {
28
+ type: 'number'
29
+ }
30
+ }
31
+ }
32
+ })
33
+ })
34
+
35
+ it('should handle tasks without description or schema', () => {
36
+ const runner = new Runner()
37
+ const task = new Task(() => {
38
+ return 'test'
39
+ })
40
+
41
+ runner.load('simpleTask', task)
42
+ const result = runner.describe()
43
+
44
+ expect(result).toEqual({
45
+ simpleTask: {
46
+ name: 'simpleTask',
47
+ description: undefined,
48
+ schema: {}
49
+ }
50
+ })
51
+ })
52
+
53
+ it('should handle multiple tasks with task: prefix', () => {
54
+ const runner = new Runner()
55
+
56
+ const runTask = createTask(
57
+ new Schema({
58
+ descriptorName: Schema.string(),
59
+ args: Schema.mixedRecord()
60
+ }),
61
+ {},
62
+ async () => 'running'
63
+ )
64
+ runTask.setDescription('Executes the task')
65
+
66
+ const createTaskInstance = createTask(
67
+ new Schema({
68
+ descriptorName: Schema.string()
69
+ }),
70
+ {},
71
+ async ({ descriptorName }) => {
72
+ return descriptorName
73
+ }
74
+ )
75
+ createTaskInstance.setDescription('Creates a new task')
76
+
77
+ runner.load('task:run', runTask)
78
+ runner.load('task:create', createTaskInstance)
79
+
80
+ const result = runner.describe()
81
+
82
+ expect(result).toEqual({
83
+ 'task:run': {
84
+ name: 'task:run',
85
+ description: 'Executes the task',
86
+ schema: {
87
+ descriptorName: {
88
+ type: 'string'
89
+ },
90
+ args: {
91
+ type: 'mixedRecord'
92
+ }
93
+ }
94
+ },
95
+ 'task:create': {
96
+ name: 'task:create',
97
+ description: 'Creates a new task',
98
+ schema: {
99
+ descriptorName: {
100
+ type: 'string'
101
+ }
102
+ }
103
+ }
104
+ })
105
+ })
106
+ })