@crafter/cli-tree 0.1.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.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/archaeology/cache.d.ts +11 -0
- package/dist/archaeology/delegate.d.ts +43 -0
- package/dist/archaeology/index.d.ts +12 -0
- package/dist/archaeology/index.js +61 -0
- package/dist/archaeology/index.js.map +9 -0
- package/dist/archaeology/llm.d.ts +1 -0
- package/dist/archaeology/merge.d.ts +3 -0
- package/dist/archaeology/orchestrator.d.ts +25 -0
- package/dist/archaeology/prompts.d.ts +13 -0
- package/dist/archaeology/types.d.ts +101 -0
- package/dist/archaeology/validate.d.ts +18 -0
- package/dist/chunk-57gtsvhb.js +434 -0
- package/dist/chunk-57gtsvhb.js.map +16 -0
- package/dist/chunk-5aahbfr2.js +293 -0
- package/dist/chunk-5aahbfr2.js.map +10 -0
- package/dist/chunk-pkfpaae1.js +678 -0
- package/dist/chunk-pkfpaae1.js.map +15 -0
- package/dist/chunk-q4se2rwe.js +181 -0
- package/dist/chunk-q4se2rwe.js.map +14 -0
- package/dist/chunk-v5w3w6bd.js +168 -0
- package/dist/chunk-v5w3w6bd.js.map +11 -0
- package/dist/chunk-ykze151b.js +770 -0
- package/dist/chunk-ykze151b.js.map +16 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +433 -0
- package/dist/cli.js.map +10 -0
- package/dist/encoders/ansi.d.ts +2 -0
- package/dist/encoders/html.d.ts +10 -0
- package/dist/encoders/string.d.ts +2 -0
- package/dist/flow/encode.d.ts +5 -0
- package/dist/flow/index.d.ts +8 -0
- package/dist/flow/index.js +25 -0
- package/dist/flow/index.js.map +9 -0
- package/dist/flow/layout.d.ts +30 -0
- package/dist/flow/parse.d.ts +2 -0
- package/dist/flow/render.d.ts +3 -0
- package/dist/flow/types.d.ts +42 -0
- package/dist/flow/validate.d.ts +3 -0
- package/dist/flow/yaml.d.ts +4 -0
- package/dist/grid.d.ts +14 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +9 -0
- package/dist/miner/history.d.ts +6 -0
- package/dist/miner/index.d.ts +18 -0
- package/dist/miner/index.js +38 -0
- package/dist/miner/index.js.map +9 -0
- package/dist/miner/sessions.d.ts +3 -0
- package/dist/miner/stats.d.ts +2 -0
- package/dist/miner/suggest.d.ts +11 -0
- package/dist/miner/transitions.d.ts +6 -0
- package/dist/miner/types.d.ts +46 -0
- package/dist/miner/workflows.d.ts +11 -0
- package/dist/parse.d.ts +3 -0
- package/dist/render.d.ts +3 -0
- package/dist/types.d.ts +39 -0
- package/package.json +85 -0
- package/skill/SKILL.md +263 -0
- package/skill/evals/evals.json +26 -0
- package/skill/install.sh +38 -0
- package/skill/references/archaeology-guide.md +157 -0
- package/skill/references/skill-template.md +120 -0
- package/src/archaeology/cache.ts +107 -0
- package/src/archaeology/delegate.ts +113 -0
- package/src/archaeology/index.ts +48 -0
- package/src/archaeology/llm.ts +10 -0
- package/src/archaeology/merge.ts +155 -0
- package/src/archaeology/orchestrator.ts +185 -0
- package/src/archaeology/prompts.ts +178 -0
- package/src/archaeology/types.ts +139 -0
- package/src/archaeology/validate.ts +157 -0
- package/src/cli.ts +451 -0
- package/src/encoders/ansi.ts +32 -0
- package/src/encoders/html.ts +78 -0
- package/src/encoders/string.ts +20 -0
- package/src/flow/encode.ts +21 -0
- package/src/flow/index.ts +15 -0
- package/src/flow/layout.ts +150 -0
- package/src/flow/parse.ts +100 -0
- package/src/flow/render.ts +186 -0
- package/src/flow/types.ts +45 -0
- package/src/flow/validate.ts +111 -0
- package/src/flow/yaml.ts +235 -0
- package/src/grid.ts +59 -0
- package/src/index.ts +24 -0
- package/src/miner/history.ts +156 -0
- package/src/miner/index.ts +76 -0
- package/src/miner/sessions.ts +39 -0
- package/src/miner/stats.ts +43 -0
- package/src/miner/suggest.ts +101 -0
- package/src/miner/transitions.ts +62 -0
- package/src/miner/types.ts +45 -0
- package/src/miner/workflows.ts +96 -0
- package/src/parse.ts +321 -0
- package/src/render.ts +182 -0
- package/src/types.ts +62 -0
- package/workflows/docker-deploy.yml +42 -0
- package/workflows/docker-parallel.yml +36 -0
- package/workflows/gh-issue-to-pr.yml +48 -0
- package/workflows/git-pr-flow.yml +36 -0
- package/workflows/kubectl-rollout.yml +37 -0
- package/workflows/npm-publish.yml +42 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// src/parse.ts
|
|
2
|
+
function parseHelp(name, helpText) {
|
|
3
|
+
const lines = helpText.split(`
|
|
4
|
+
`);
|
|
5
|
+
const node = { name };
|
|
6
|
+
const descLine = findDescription(lines);
|
|
7
|
+
if (descLine)
|
|
8
|
+
node.description = descLine;
|
|
9
|
+
node.subcommands = parseCommands(lines);
|
|
10
|
+
node.flags = parseFlags(lines);
|
|
11
|
+
node.args = parseUsageArgs(lines);
|
|
12
|
+
if (node.subcommands.length === 0)
|
|
13
|
+
delete node.subcommands;
|
|
14
|
+
if (node.flags.length === 0)
|
|
15
|
+
delete node.flags;
|
|
16
|
+
if (node.args.length === 0)
|
|
17
|
+
delete node.args;
|
|
18
|
+
return node;
|
|
19
|
+
}
|
|
20
|
+
function findDescription(lines) {
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
const trimmed = line.trim();
|
|
23
|
+
if (!trimmed)
|
|
24
|
+
continue;
|
|
25
|
+
if (/^(usage|commands|flags|options|available|management|version|\$|the commands)/i.test(trimmed))
|
|
26
|
+
continue;
|
|
27
|
+
if (/^[-\s]/.test(trimmed))
|
|
28
|
+
continue;
|
|
29
|
+
if (/^(USAGE|CORE|GITHUB|ADDITIONAL|HELP|EXTENSION)/i.test(trimmed))
|
|
30
|
+
continue;
|
|
31
|
+
if (trimmed.length > 10 && trimmed.length < 200 && !trimmed.startsWith("--") && !trimmed.startsWith("{")) {
|
|
32
|
+
return trimmed.replace(/[.:]+$/, "").trim();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
function parseCommands(lines) {
|
|
38
|
+
const commands = [];
|
|
39
|
+
const seen = new Set;
|
|
40
|
+
let inSection = false;
|
|
41
|
+
for (let i = 0;i < lines.length; i++) {
|
|
42
|
+
const line = lines[i];
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (isCommandSectionHeader(trimmed)) {
|
|
45
|
+
inSection = true;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (isNpmAllCommands(trimmed)) {
|
|
49
|
+
parseNpmCommandList(lines, i, commands, seen);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (isGoCommandLine(line)) {
|
|
53
|
+
const match = line.match(/^\t(\S+)\s{2,}(.+)/);
|
|
54
|
+
if (match && !seen.has(match[1])) {
|
|
55
|
+
seen.add(match[1]);
|
|
56
|
+
commands.push({ name: match[1], description: match[2].trim() });
|
|
57
|
+
}
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (inSection) {
|
|
61
|
+
if (!trimmed) {
|
|
62
|
+
inSection = false;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (isNonCommandSection(trimmed)) {
|
|
66
|
+
inSection = false;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const cmd = parseCommandLine(trimmed);
|
|
70
|
+
if (cmd && !seen.has(cmd.name)) {
|
|
71
|
+
seen.add(cmd.name);
|
|
72
|
+
commands.push(cmd);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return commands;
|
|
77
|
+
}
|
|
78
|
+
function isCommandSectionHeader(line) {
|
|
79
|
+
const cleaned = line.replace(/[:\s]+$/, "").toLowerCase();
|
|
80
|
+
return /^(commands|common commands|management commands|available commands|subcommands|core commands|github actions commands|additional commands|extension commands|help commands|alias commands)/.test(cleaned) || /^(basic commands|deploy commands|cluster management|troubleshooting|advanced commands|settings commands|configuration|manage your dependencies|review your dependencies|run your scripts|other)/.test(cleaned) || /^(start a working area|work on the current change|examine the history|grow.*mark.*tweak|collaborate|ancillary commands|interacting with others|low-level commands)/i.test(cleaned);
|
|
81
|
+
}
|
|
82
|
+
function isNonCommandSection(line) {
|
|
83
|
+
const cleaned = line.replace(/[:\s]+$/, "").toLowerCase();
|
|
84
|
+
return /^(flags|options|usage|examples|environment|learn more|global|see '|find more|use "|\$|additional help|inherited)/.test(cleaned);
|
|
85
|
+
}
|
|
86
|
+
function parseCommandLine(line) {
|
|
87
|
+
let match = line.match(/^(?:(\w{1,4}),\s+)?(\S+?)[:,]?\s{2,}(.+)/);
|
|
88
|
+
if (match) {
|
|
89
|
+
const alias = match[1];
|
|
90
|
+
const name = match[2].replace(/[*:,]+$/, "");
|
|
91
|
+
const desc = match[3].trim();
|
|
92
|
+
if (name.startsWith("-") || name.length === 0)
|
|
93
|
+
return null;
|
|
94
|
+
const node = { name, description: desc };
|
|
95
|
+
if (alias)
|
|
96
|
+
node.aliases = [alias];
|
|
97
|
+
return node;
|
|
98
|
+
}
|
|
99
|
+
match = line.match(/^(\S+)\s{2,}(.+)/);
|
|
100
|
+
if (match) {
|
|
101
|
+
const name = match[1].replace(/[*:,]+$/, "");
|
|
102
|
+
if (name.startsWith("-") || name.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
return { name, description: match[2].trim() };
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function isGoCommandLine(line) {
|
|
109
|
+
return /^\t\S+\s{2,}/.test(line);
|
|
110
|
+
}
|
|
111
|
+
function isNpmAllCommands(line) {
|
|
112
|
+
return /^all commands/i.test(line.trim().replace(":", ""));
|
|
113
|
+
}
|
|
114
|
+
function parseNpmCommandList(lines, startIdx, commands, seen) {
|
|
115
|
+
let foundAny = false;
|
|
116
|
+
for (let i = startIdx + 1;i < lines.length; i++) {
|
|
117
|
+
const line = lines[i].trim();
|
|
118
|
+
if (!line) {
|
|
119
|
+
if (foundAny)
|
|
120
|
+
break;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (/^specify|^more|^configuration|^npm@|^or on/i.test(line))
|
|
124
|
+
break;
|
|
125
|
+
const names = line.split(/[,\s]+/).filter((n) => n.length > 0 && !n.startsWith("-") && /^[a-z]/.test(n));
|
|
126
|
+
for (const name of names) {
|
|
127
|
+
if (!seen.has(name)) {
|
|
128
|
+
seen.add(name);
|
|
129
|
+
commands.push({ name });
|
|
130
|
+
foundAny = true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function parseFlags(lines) {
|
|
136
|
+
const flags = [];
|
|
137
|
+
const seen = new Set;
|
|
138
|
+
let inFlagSection = false;
|
|
139
|
+
for (let i = 0;i < lines.length; i++) {
|
|
140
|
+
const line = lines[i];
|
|
141
|
+
const trimmed = line.trim();
|
|
142
|
+
if (/^(flags|options|global flags|global options)/i.test(trimmed.replace(/[:\s]+$/, ""))) {
|
|
143
|
+
inFlagSection = true;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (inFlagSection) {
|
|
147
|
+
if (!trimmed) {
|
|
148
|
+
if (i + 1 < lines.length) {
|
|
149
|
+
const next = lines[i + 1]?.trim() ?? "";
|
|
150
|
+
if (next && !next.startsWith("-") && !/^\s/.test(lines[i + 1] ?? "")) {
|
|
151
|
+
inFlagSection = false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (isCommandSectionHeader(trimmed) || isNonCommandSection(trimmed)) {
|
|
157
|
+
if (!/^(flags|options|global)/i.test(trimmed.replace(/[:\s]+$/, ""))) {
|
|
158
|
+
inFlagSection = false;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const flag = parseFlagLine(trimmed);
|
|
163
|
+
if (flag && !seen.has(flag.name)) {
|
|
164
|
+
seen.add(flag.name);
|
|
165
|
+
flags.push(flag);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return flags;
|
|
170
|
+
}
|
|
171
|
+
function parseFlagLine(line) {
|
|
172
|
+
let match = line.match(/^\s*(-(\w),\s+)?--(\S+?)(?:=<([^>]+)>|[= ]<([^>]+)>|\s+<([^>]+)>)?\s{2,}(.*)/);
|
|
173
|
+
if (match) {
|
|
174
|
+
const short = match[2];
|
|
175
|
+
const name = match[3].replace(/[=,]+$/, "");
|
|
176
|
+
const valHint = match[4] || match[5] || match[6];
|
|
177
|
+
const desc = match[7]?.trim();
|
|
178
|
+
return buildFlag(name, short, valHint, desc);
|
|
179
|
+
}
|
|
180
|
+
match = line.match(/^\s*(-(\w),\s+)?--([\w-]+)\s*(.*)/);
|
|
181
|
+
if (match) {
|
|
182
|
+
const short = match[2];
|
|
183
|
+
const name = match[3];
|
|
184
|
+
const rest = match[4]?.trim() ?? "";
|
|
185
|
+
const flag = { name, type: "boolean" };
|
|
186
|
+
if (short)
|
|
187
|
+
flag.short = short;
|
|
188
|
+
if (rest)
|
|
189
|
+
flag.description = rest;
|
|
190
|
+
return flag;
|
|
191
|
+
}
|
|
192
|
+
match = line.match(/^\s*-(\w),\s+--?([\w-]+)\s*(.*)/);
|
|
193
|
+
if (match) {
|
|
194
|
+
const short = match[1];
|
|
195
|
+
const name = match[2];
|
|
196
|
+
const rest = match[3]?.trim() ?? "";
|
|
197
|
+
const flag = { name, type: "boolean" };
|
|
198
|
+
if (short)
|
|
199
|
+
flag.short = short;
|
|
200
|
+
if (rest)
|
|
201
|
+
flag.description = rest;
|
|
202
|
+
return flag;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
function buildFlag(name, short, valHint, desc) {
|
|
207
|
+
let type = "boolean";
|
|
208
|
+
if (valHint) {
|
|
209
|
+
if (/^(num|int|count)/i.test(valHint))
|
|
210
|
+
type = "number";
|
|
211
|
+
else
|
|
212
|
+
type = "string";
|
|
213
|
+
}
|
|
214
|
+
const flag = { name, type };
|
|
215
|
+
if (short)
|
|
216
|
+
flag.short = short;
|
|
217
|
+
if (desc)
|
|
218
|
+
flag.description = desc;
|
|
219
|
+
return flag;
|
|
220
|
+
}
|
|
221
|
+
function parseUsageArgs(lines) {
|
|
222
|
+
const args = [];
|
|
223
|
+
for (const line of lines) {
|
|
224
|
+
if (!/^usage/i.test(line.trim()))
|
|
225
|
+
continue;
|
|
226
|
+
const argMatches = line.matchAll(/<(\w+(?:\.\.\.)?)>|\[(\w+(?:\.\.\.)?)\]/g);
|
|
227
|
+
for (const m of argMatches) {
|
|
228
|
+
if (m[1]) {
|
|
229
|
+
const name = m[1].replace("...", "");
|
|
230
|
+
const variadic = m[1].endsWith("...");
|
|
231
|
+
if (!isKnownPlaceholder(name)) {
|
|
232
|
+
args.push({ name, required: true, variadic });
|
|
233
|
+
}
|
|
234
|
+
} else if (m[2]) {
|
|
235
|
+
const name = m[2].replace("...", "");
|
|
236
|
+
const variadic = m[2].endsWith("...");
|
|
237
|
+
if (!isKnownPlaceholder(name)) {
|
|
238
|
+
args.push({ name, required: false, variadic });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return args;
|
|
244
|
+
}
|
|
245
|
+
function isKnownPlaceholder(name) {
|
|
246
|
+
return /^(path|name|value|envvar|val)$/i.test(name);
|
|
247
|
+
}
|
|
248
|
+
async function parseHelpRecursive(binary, args = [], maxDepth = 3, depth = 0) {
|
|
249
|
+
const helpText = await runHelp(binary, args);
|
|
250
|
+
const name = args.length > 0 ? args[args.length - 1] : binary;
|
|
251
|
+
const node = parseHelp(name, helpText);
|
|
252
|
+
if (depth >= maxDepth)
|
|
253
|
+
return node;
|
|
254
|
+
if (node.subcommands) {
|
|
255
|
+
const resolved = [];
|
|
256
|
+
for (const sub of node.subcommands) {
|
|
257
|
+
try {
|
|
258
|
+
const child = await parseHelpRecursive(binary, [...args, sub.name], maxDepth, depth + 1);
|
|
259
|
+
if (sub.description && !child.description)
|
|
260
|
+
child.description = sub.description;
|
|
261
|
+
if (sub.aliases)
|
|
262
|
+
child.aliases = sub.aliases;
|
|
263
|
+
resolved.push(child);
|
|
264
|
+
} catch {
|
|
265
|
+
resolved.push(sub);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
node.subcommands = resolved;
|
|
269
|
+
}
|
|
270
|
+
return node;
|
|
271
|
+
}
|
|
272
|
+
async function runHelp(binary, args) {
|
|
273
|
+
const proc = Bun.spawn([binary, ...args, "--help"], {
|
|
274
|
+
stdout: "pipe",
|
|
275
|
+
stderr: "pipe"
|
|
276
|
+
});
|
|
277
|
+
const timeout = setTimeout(() => proc.kill(), 5000);
|
|
278
|
+
const [stdout, stderr] = await Promise.all([
|
|
279
|
+
new Response(proc.stdout).text(),
|
|
280
|
+
new Response(proc.stderr).text()
|
|
281
|
+
]);
|
|
282
|
+
clearTimeout(timeout);
|
|
283
|
+
await proc.exited;
|
|
284
|
+
const output = stdout || stderr;
|
|
285
|
+
if (!output.trim()) {
|
|
286
|
+
throw new Error(`No help output from: ${binary} ${args.join(" ")} --help`);
|
|
287
|
+
}
|
|
288
|
+
return output;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export { parseHelp, parseHelpRecursive };
|
|
292
|
+
|
|
293
|
+
//# debugId=BE9B7CC49D51D66764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/parse.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { CLINode, Flag, Arg } from \"./types\";\n\nexport function parseHelp(name: string, helpText: string): CLINode {\n\tconst lines = helpText.split(\"\\n\");\n\tconst node: CLINode = { name };\n\n\tconst descLine = findDescription(lines);\n\tif (descLine) node.description = descLine;\n\n\tnode.subcommands = parseCommands(lines);\n\tnode.flags = parseFlags(lines);\n\tnode.args = parseUsageArgs(lines);\n\n\tif (node.subcommands.length === 0) delete node.subcommands;\n\tif (node.flags.length === 0) delete node.flags;\n\tif (node.args.length === 0) delete node.args;\n\n\treturn node;\n}\n\nfunction findDescription(lines: string[]): string | undefined {\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) continue;\n\t\tif (/^(usage|commands|flags|options|available|management|version|\\$|the commands)/i.test(trimmed)) continue;\n\t\tif (/^[-\\s]/.test(trimmed)) continue;\n\t\tif (/^(USAGE|CORE|GITHUB|ADDITIONAL|HELP|EXTENSION)/i.test(trimmed)) continue;\n\t\tif (trimmed.length > 10 && trimmed.length < 200 && !trimmed.startsWith(\"--\") && !trimmed.startsWith(\"{\")) {\n\t\t\treturn trimmed.replace(/[.:]+$/, \"\").trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction parseCommands(lines: string[]): CLINode[] {\n\tconst commands: CLINode[] = [];\n\tconst seen = new Set<string>();\n\tlet inSection = false;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i]!;\n\t\tconst trimmed = line.trim();\n\n\t\tif (isCommandSectionHeader(trimmed)) {\n\t\t\tinSection = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isNpmAllCommands(trimmed)) {\n\t\t\tparseNpmCommandList(lines, i, commands, seen);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isGoCommandLine(line)) {\n\t\t\tconst match = line.match(/^\\t(\\S+)\\s{2,}(.+)/);\n\t\t\tif (match && !seen.has(match[1]!)) {\n\t\t\t\tseen.add(match[1]!);\n\t\t\t\tcommands.push({ name: match[1]!, description: match[2]!.trim() });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inSection) {\n\t\t\tif (!trimmed) {\n\t\t\t\tinSection = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isNonCommandSection(trimmed)) {\n\t\t\t\tinSection = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst cmd = parseCommandLine(trimmed);\n\t\t\tif (cmd && !seen.has(cmd.name)) {\n\t\t\t\tseen.add(cmd.name);\n\t\t\t\tcommands.push(cmd);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn commands;\n}\n\nfunction isCommandSectionHeader(line: string): boolean {\n\tconst cleaned = line.replace(/[:\\s]+$/, \"\").toLowerCase();\n\treturn /^(commands|common commands|management commands|available commands|subcommands|core commands|github actions commands|additional commands|extension commands|help commands|alias commands)/.test(cleaned)\n\t\t|| /^(basic commands|deploy commands|cluster management|troubleshooting|advanced commands|settings commands|configuration|manage your dependencies|review your dependencies|run your scripts|other)/.test(cleaned)\n\t\t|| /^(start a working area|work on the current change|examine the history|grow.*mark.*tweak|collaborate|ancillary commands|interacting with others|low-level commands)/i.test(cleaned);\n}\n\nfunction isNonCommandSection(line: string): boolean {\n\tconst cleaned = line.replace(/[:\\s]+$/, \"\").toLowerCase();\n\treturn /^(flags|options|usage|examples|environment|learn more|global|see '|find more|use \"|\\$|additional help|inherited)/.test(cleaned);\n}\n\nfunction parseCommandLine(line: string): CLINode | null {\n\tlet match = line.match(/^(?:(\\w{1,4}),\\s+)?(\\S+?)[:,]?\\s{2,}(.+)/);\n\tif (match) {\n\t\tconst alias = match[1];\n\t\tconst name = match[2]!.replace(/[*:,]+$/, \"\");\n\t\tconst desc = match[3]!.trim();\n\t\tif (name.startsWith(\"-\") || name.length === 0) return null;\n\t\tconst node: CLINode = { name, description: desc };\n\t\tif (alias) node.aliases = [alias];\n\t\treturn node;\n\t}\n\n\tmatch = line.match(/^(\\S+)\\s{2,}(.+)/);\n\tif (match) {\n\t\tconst name = match[1]!.replace(/[*:,]+$/, \"\");\n\t\tif (name.startsWith(\"-\") || name.length === 0) return null;\n\t\treturn { name, description: match[2]!.trim() };\n\t}\n\n\treturn null;\n}\n\nfunction isGoCommandLine(line: string): boolean {\n\treturn /^\\t\\S+\\s{2,}/.test(line);\n}\n\nfunction isNpmAllCommands(line: string): boolean {\n\treturn /^all commands/i.test(line.trim().replace(\":\", \"\"));\n}\n\nfunction parseNpmCommandList(lines: string[], startIdx: number, commands: CLINode[], seen: Set<string>) {\n\tlet foundAny = false;\n\tfor (let i = startIdx + 1; i < lines.length; i++) {\n\t\tconst line = lines[i]!.trim();\n\t\tif (!line) {\n\t\t\tif (foundAny) break;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/^specify|^more|^configuration|^npm@|^or on/i.test(line)) break;\n\t\tconst names = line.split(/[,\\s]+/).filter(n => n.length > 0 && !n.startsWith(\"-\") && /^[a-z]/.test(n));\n\t\tfor (const name of names) {\n\t\t\tif (!seen.has(name)) {\n\t\t\t\tseen.add(name);\n\t\t\t\tcommands.push({ name });\n\t\t\t\tfoundAny = true;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parseFlags(lines: string[]): Flag[] {\n\tconst flags: Flag[] = [];\n\tconst seen = new Set<string>();\n\tlet inFlagSection = false;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i]!;\n\t\tconst trimmed = line.trim();\n\n\t\tif (/^(flags|options|global flags|global options)/i.test(trimmed.replace(/[:\\s]+$/, \"\"))) {\n\t\t\tinFlagSection = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inFlagSection) {\n\t\t\tif (!trimmed) {\n\t\t\t\tif (i + 1 < lines.length) {\n\t\t\t\t\tconst next = lines[i + 1]?.trim() ?? \"\";\n\t\t\t\t\tif (next && !next.startsWith(\"-\") && !/^\\s/.test(lines[i + 1] ?? \"\")) {\n\t\t\t\t\t\tinFlagSection = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isCommandSectionHeader(trimmed) || isNonCommandSection(trimmed)) {\n\t\t\t\tif (!/^(flags|options|global)/i.test(trimmed.replace(/[:\\s]+$/, \"\"))) {\n\t\t\t\t\tinFlagSection = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst flag = parseFlagLine(trimmed);\n\t\t\tif (flag && !seen.has(flag.name)) {\n\t\t\t\tseen.add(flag.name);\n\t\t\t\tflags.push(flag);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn flags;\n}\n\nfunction parseFlagLine(line: string): Flag | null {\n\tlet match = line.match(/^\\s*(-(\\w),\\s+)?--(\\S+?)(?:=<([^>]+)>|[= ]<([^>]+)>|\\s+<([^>]+)>)?\\s{2,}(.*)/);\n\tif (match) {\n\t\tconst short = match[2];\n\t\tconst name = match[3]!.replace(/[=,]+$/, \"\");\n\t\tconst valHint = match[4] || match[5] || match[6];\n\t\tconst desc = match[7]?.trim();\n\t\treturn buildFlag(name, short, valHint, desc);\n\t}\n\n\tmatch = line.match(/^\\s*(-(\\w),\\s+)?--([\\w-]+)\\s*(.*)/);\n\tif (match) {\n\t\tconst short = match[2];\n\t\tconst name = match[3]!;\n\t\tconst rest = match[4]?.trim() ?? \"\";\n\t\tconst flag: Flag = { name, type: \"boolean\" };\n\t\tif (short) flag.short = short;\n\t\tif (rest) flag.description = rest;\n\t\treturn flag;\n\t}\n\n\tmatch = line.match(/^\\s*-(\\w),\\s+--?([\\w-]+)\\s*(.*)/);\n\tif (match) {\n\t\tconst short = match[1];\n\t\tconst name = match[2]!;\n\t\tconst rest = match[3]?.trim() ?? \"\";\n\t\tconst flag: Flag = { name, type: \"boolean\" };\n\t\tif (short) flag.short = short;\n\t\tif (rest) flag.description = rest;\n\t\treturn flag;\n\t}\n\n\treturn null;\n}\n\nfunction buildFlag(name: string, short?: string, valHint?: string, desc?: string): Flag {\n\tlet type: Flag[\"type\"] = \"boolean\";\n\tif (valHint) {\n\t\tif (/^(num|int|count)/i.test(valHint)) type = \"number\";\n\t\telse type = \"string\";\n\t}\n\n\tconst flag: Flag = { name, type };\n\tif (short) flag.short = short;\n\tif (desc) flag.description = desc;\n\treturn flag;\n}\n\nfunction parseUsageArgs(lines: string[]): Arg[] {\n\tconst args: Arg[] = [];\n\n\tfor (const line of lines) {\n\t\tif (!/^usage/i.test(line.trim())) continue;\n\n\t\tconst argMatches = line.matchAll(/<(\\w+(?:\\.\\.\\.)?)>|\\[(\\w+(?:\\.\\.\\.)?)\\]/g);\n\t\tfor (const m of argMatches) {\n\t\t\tif (m[1]) {\n\t\t\t\tconst name = m[1].replace(\"...\", \"\");\n\t\t\t\tconst variadic = m[1].endsWith(\"...\");\n\t\t\t\tif (!isKnownPlaceholder(name)) {\n\t\t\t\t\targs.push({ name, required: true, variadic });\n\t\t\t\t}\n\t\t\t} else if (m[2]) {\n\t\t\t\tconst name = m[2].replace(\"...\", \"\");\n\t\t\t\tconst variadic = m[2].endsWith(\"...\");\n\t\t\t\tif (!isKnownPlaceholder(name)) {\n\t\t\t\t\targs.push({ name, required: false, variadic });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn args;\n}\n\nfunction isKnownPlaceholder(name: string): boolean {\n\treturn /^(path|name|value|envvar|val)$/i.test(name);\n}\n\nexport async function parseHelpRecursive(\n\tbinary: string,\n\targs: string[] = [],\n\tmaxDepth = 3,\n\tdepth = 0,\n): Promise<CLINode> {\n\tconst helpText = await runHelp(binary, args);\n\tconst name = args.length > 0 ? args[args.length - 1]! : binary;\n\tconst node = parseHelp(name, helpText);\n\n\tif (depth >= maxDepth) return node;\n\n\tif (node.subcommands) {\n\t\tconst resolved: CLINode[] = [];\n\t\tfor (const sub of node.subcommands) {\n\t\t\ttry {\n\t\t\t\tconst child = await parseHelpRecursive(binary, [...args, sub.name], maxDepth, depth + 1);\n\t\t\t\tif (sub.description && !child.description) child.description = sub.description;\n\t\t\t\tif (sub.aliases) child.aliases = sub.aliases;\n\t\t\t\tresolved.push(child);\n\t\t\t} catch {\n\t\t\t\tresolved.push(sub);\n\t\t\t}\n\t\t}\n\t\tnode.subcommands = resolved;\n\t}\n\n\treturn node;\n}\n\nasync function runHelp(binary: string, args: string[]): Promise<string> {\n\tconst proc = Bun.spawn([binary, ...args, \"--help\"], {\n\t\tstdout: \"pipe\",\n\t\tstderr: \"pipe\",\n\t});\n\n\tconst timeout = setTimeout(() => proc.kill(), 5000);\n\n\tconst [stdout, stderr] = await Promise.all([\n\t\tnew Response(proc.stdout).text(),\n\t\tnew Response(proc.stderr).text(),\n\t]);\n\n\tclearTimeout(timeout);\n\tawait proc.exited;\n\n\tconst output = stdout || stderr;\n\tif (!output.trim()) {\n\t\tthrow new Error(`No help output from: ${binary} ${args.join(\" \")} --help`);\n\t}\n\n\treturn output;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "BE9B7CC49D51D66764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|