@overlordai/command-parser 1.0.54
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/dist/command-parser.d.ts +29 -0
- package/dist/command-parser.d.ts.map +1 -0
- package/dist/command-parser.js +133 -0
- package/dist/command-parser.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +17 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared command parser for all bot adapters (Lark, Slack, etc.).
|
|
3
|
+
*
|
|
4
|
+
* Extracts a structured ParsedCommand from raw user text.
|
|
5
|
+
*/
|
|
6
|
+
export interface ParsedCommand {
|
|
7
|
+
type: 'DEVELOP' | 'CANCEL' | 'RETRY';
|
|
8
|
+
description?: string;
|
|
9
|
+
project?: string;
|
|
10
|
+
worker?: string;
|
|
11
|
+
reviewers?: string[];
|
|
12
|
+
taskId?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class CommandParser {
|
|
15
|
+
/**
|
|
16
|
+
* Parse raw text into a structured command.
|
|
17
|
+
* Returns null if the text is empty or the command is unrecognised.
|
|
18
|
+
*/
|
|
19
|
+
static parse(text: string): ParsedCommand | null;
|
|
20
|
+
private static parseDevelop;
|
|
21
|
+
private static parseCancelOrRetry;
|
|
22
|
+
private static extractTaskId;
|
|
23
|
+
/**
|
|
24
|
+
* Tokenize input text, respecting single and double-quoted strings.
|
|
25
|
+
* Quotes are stripped from the resulting tokens.
|
|
26
|
+
*/
|
|
27
|
+
private static tokenize;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=command-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../src/command-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,qBAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IA2BhD,OAAO,CAAC,MAAM,CAAC,YAAY;IA0D3B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC,OAAO,CAAC,MAAM,CAAC,aAAa;IAU5B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;CAcxB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared command parser for all bot adapters (Lark, Slack, etc.).
|
|
4
|
+
*
|
|
5
|
+
* Extracts a structured ParsedCommand from raw user text.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.CommandParser = void 0;
|
|
9
|
+
const KNOWN_PARAMS = new Set([
|
|
10
|
+
'--project',
|
|
11
|
+
'--on',
|
|
12
|
+
'--machine',
|
|
13
|
+
'--worker',
|
|
14
|
+
'--reviewer',
|
|
15
|
+
]);
|
|
16
|
+
class CommandParser {
|
|
17
|
+
/**
|
|
18
|
+
* Parse raw text into a structured command.
|
|
19
|
+
* Returns null if the text is empty or the command is unrecognised.
|
|
20
|
+
*/
|
|
21
|
+
static parse(text) {
|
|
22
|
+
const trimmed = text.trim();
|
|
23
|
+
if (!trimmed)
|
|
24
|
+
return null;
|
|
25
|
+
const tokens = CommandParser.tokenize(trimmed);
|
|
26
|
+
if (tokens.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const commandName = tokens[0].toLowerCase();
|
|
29
|
+
const rest = tokens.slice(1);
|
|
30
|
+
switch (commandName) {
|
|
31
|
+
case 'develop':
|
|
32
|
+
case 'dev':
|
|
33
|
+
return CommandParser.parseDevelop(rest);
|
|
34
|
+
case 'cancel':
|
|
35
|
+
return CommandParser.parseCancelOrRetry('CANCEL', rest);
|
|
36
|
+
case 'retry':
|
|
37
|
+
return CommandParser.parseCancelOrRetry('RETRY', rest);
|
|
38
|
+
default:
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Sub-parsers
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
static parseDevelop(tokens) {
|
|
46
|
+
let project;
|
|
47
|
+
let worker;
|
|
48
|
+
let reviewers;
|
|
49
|
+
const descriptionParts = [];
|
|
50
|
+
let i = 0;
|
|
51
|
+
while (i < tokens.length) {
|
|
52
|
+
const token = tokens[i];
|
|
53
|
+
if (token === '--project' || token === '--on') {
|
|
54
|
+
i++;
|
|
55
|
+
if (i < tokens.length) {
|
|
56
|
+
project = tokens[i];
|
|
57
|
+
}
|
|
58
|
+
i++;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (token === '--machine' || token === '--worker') {
|
|
62
|
+
i++;
|
|
63
|
+
if (i < tokens.length) {
|
|
64
|
+
worker = tokens[i];
|
|
65
|
+
}
|
|
66
|
+
i++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (token === '--reviewer') {
|
|
70
|
+
i++;
|
|
71
|
+
reviewers = [];
|
|
72
|
+
// Collect values until next --param or end
|
|
73
|
+
while (i < tokens.length && !KNOWN_PARAMS.has(tokens[i])) {
|
|
74
|
+
reviewers.push(tokens[i]);
|
|
75
|
+
i++;
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Everything else is part of the description (including unknown --flags)
|
|
80
|
+
descriptionParts.push(token);
|
|
81
|
+
i++;
|
|
82
|
+
}
|
|
83
|
+
const description = descriptionParts.length > 0
|
|
84
|
+
? descriptionParts.join(' ')
|
|
85
|
+
: undefined;
|
|
86
|
+
const result = { type: 'DEVELOP' };
|
|
87
|
+
if (description)
|
|
88
|
+
result.description = description;
|
|
89
|
+
if (project)
|
|
90
|
+
result.project = project;
|
|
91
|
+
if (worker)
|
|
92
|
+
result.worker = worker;
|
|
93
|
+
if (reviewers && reviewers.length > 0)
|
|
94
|
+
result.reviewers = reviewers;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
static parseCancelOrRetry(type, tokens) {
|
|
98
|
+
const taskId = CommandParser.extractTaskId(tokens);
|
|
99
|
+
if (taskId === undefined)
|
|
100
|
+
return null;
|
|
101
|
+
return { type, taskId };
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Helpers
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
static extractTaskId(tokens) {
|
|
107
|
+
for (const token of tokens) {
|
|
108
|
+
const match = /^#?(\d+)$/.exec(token);
|
|
109
|
+
if (match) {
|
|
110
|
+
return parseInt(match[1], 10);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Tokenize input text, respecting single and double-quoted strings.
|
|
117
|
+
* Quotes are stripped from the resulting tokens.
|
|
118
|
+
*/
|
|
119
|
+
static tokenize(text) {
|
|
120
|
+
const tokens = [];
|
|
121
|
+
const regex = /(?:"([^"]*)")|(?:'([^']*)')|(\S+)/g;
|
|
122
|
+
let match;
|
|
123
|
+
while ((match = regex.exec(text)) !== null) {
|
|
124
|
+
const value = match[1] ?? match[2] ?? match[3];
|
|
125
|
+
if (value !== undefined) {
|
|
126
|
+
tokens.push(value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return tokens;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.CommandParser = CommandParser;
|
|
133
|
+
//# sourceMappingURL=command-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../src/command-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CommandParser = void 0;
|
|
4
|
+
var command_parser_js_1 = require("./command-parser.js");
|
|
5
|
+
Object.defineProperty(exports, "CommandParser", { enumerable: true, get: function () { return command_parser_js_1.CommandParser; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAoD;AAA3C,kHAAA,aAAa,OAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@overlordai/command-parser",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "1.0.54",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"files": ["dist"],
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"lint": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"vitest": "^4.0.18"
|
|
16
|
+
}
|
|
17
|
+
}
|