@hypercli/cli 0.1.1
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 +26 -0
- package/bin/run.js +13 -0
- package/dist/autocomplete/base.d.ts +17 -0
- package/dist/autocomplete/base.d.ts.map +1 -0
- package/dist/autocomplete/base.js +58 -0
- package/dist/autocomplete/base.js.map +1 -0
- package/dist/autocomplete/completions/bash.d.ts +3 -0
- package/dist/autocomplete/completions/bash.d.ts.map +1 -0
- package/dist/autocomplete/completions/bash.js +94 -0
- package/dist/autocomplete/completions/bash.js.map +1 -0
- package/dist/autocomplete/completions/powershell.d.ts +9 -0
- package/dist/autocomplete/completions/powershell.d.ts.map +1 -0
- package/dist/autocomplete/completions/powershell.js +307 -0
- package/dist/autocomplete/completions/powershell.js.map +1 -0
- package/dist/autocomplete/completions/shared.d.ts +19 -0
- package/dist/autocomplete/completions/shared.d.ts.map +1 -0
- package/dist/autocomplete/completions/shared.js +89 -0
- package/dist/autocomplete/completions/shared.js.map +1 -0
- package/dist/autocomplete/completions/types.d.ts +20 -0
- package/dist/autocomplete/completions/types.d.ts.map +1 -0
- package/dist/autocomplete/completions/types.js +2 -0
- package/dist/autocomplete/completions/types.js.map +1 -0
- package/dist/autocomplete/completions/zsh.d.ts +15 -0
- package/dist/autocomplete/completions/zsh.d.ts.map +1 -0
- package/dist/autocomplete/completions/zsh.js +276 -0
- package/dist/autocomplete/completions/zsh.js.map +1 -0
- package/dist/autocomplete/dynamic/cache.d.ts +35 -0
- package/dist/autocomplete/dynamic/cache.d.ts.map +1 -0
- package/dist/autocomplete/dynamic/cache.js +163 -0
- package/dist/autocomplete/dynamic/cache.js.map +1 -0
- package/dist/autocomplete/dynamic/index.d.ts +10 -0
- package/dist/autocomplete/dynamic/index.d.ts.map +1 -0
- package/dist/autocomplete/dynamic/index.js +9 -0
- package/dist/autocomplete/dynamic/index.js.map +1 -0
- package/dist/autocomplete/dynamic/resolver.d.ts +40 -0
- package/dist/autocomplete/dynamic/resolver.d.ts.map +1 -0
- package/dist/autocomplete/dynamic/resolver.js +164 -0
- package/dist/autocomplete/dynamic/resolver.js.map +1 -0
- package/dist/autocomplete/dynamic/types.d.ts +39 -0
- package/dist/autocomplete/dynamic/types.d.ts.map +1 -0
- package/dist/autocomplete/dynamic/types.js +2 -0
- package/dist/autocomplete/dynamic/types.js.map +1 -0
- package/dist/commands/autocomplete/create.d.ts +30 -0
- package/dist/commands/autocomplete/create.d.ts.map +1 -0
- package/dist/commands/autocomplete/create.js +141 -0
- package/dist/commands/autocomplete/create.js.map +1 -0
- package/dist/commands/autocomplete/generate.d.ts +16 -0
- package/dist/commands/autocomplete/generate.d.ts.map +1 -0
- package/dist/commands/autocomplete/generate.js +59 -0
- package/dist/commands/autocomplete/generate.js.map +1 -0
- package/dist/commands/autocomplete/index.d.ts +14 -0
- package/dist/commands/autocomplete/index.d.ts.map +1 -0
- package/dist/commands/autocomplete/index.js +66 -0
- package/dist/commands/autocomplete/index.js.map +1 -0
- package/dist/commands/autocomplete/script.d.ts +12 -0
- package/dist/commands/autocomplete/script.d.ts.map +1 -0
- package/dist/commands/autocomplete/script.js +32 -0
- package/dist/commands/autocomplete/script.js.map +1 -0
- package/dist/commands/config/show.d.ts +12 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +64 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +76 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/help/custom-help.d.ts +14 -0
- package/dist/help/custom-help.d.ts.map +1 -0
- package/dist/help/custom-help.js +110 -0
- package/dist/help/custom-help.js.map +1 -0
- package/dist/help/theme.d.ts +7 -0
- package/dist/help/theme.d.ts.map +1 -0
- package/dist/help/theme.js +50 -0
- package/dist/help/theme.js.map +1 -0
- package/dist/hooks/refresh-cache.d.ts +4 -0
- package/dist/hooks/refresh-cache.d.ts.map +1 -0
- package/dist/hooks/refresh-cache.js +10 -0
- package/dist/hooks/refresh-cache.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/help/config/show.md +27 -0
- package/help/cookbook.md +19 -0
- package/help/recipe.md +32 -0
- package/help/root.md +49 -0
- package/oclif.manifest.json +214 -0
- package/package.json +126 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for shell completion script generators.
|
|
3
|
+
* Contains shared logic for extracting commands and topics from oclif config.
|
|
4
|
+
*/
|
|
5
|
+
export class CompletionScriptBase {
|
|
6
|
+
config;
|
|
7
|
+
commands;
|
|
8
|
+
topics;
|
|
9
|
+
_coTopics;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.topics = this.getTopics();
|
|
13
|
+
this.commands = this.getCommands();
|
|
14
|
+
}
|
|
15
|
+
get coTopics() {
|
|
16
|
+
if (this._coTopics)
|
|
17
|
+
return this._coTopics;
|
|
18
|
+
const coTopics = [];
|
|
19
|
+
for (const topic of this.topics) {
|
|
20
|
+
for (const cmd of this.commands) {
|
|
21
|
+
if (topic.name === cmd.id) {
|
|
22
|
+
coTopics.push(topic.name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this._coTopics = coTopics;
|
|
27
|
+
return this._coTopics;
|
|
28
|
+
}
|
|
29
|
+
getCommands() {
|
|
30
|
+
const cmds = [];
|
|
31
|
+
for (const p of this.config.getPluginsList()) {
|
|
32
|
+
for (const c of p.commands) {
|
|
33
|
+
if (c.hidden)
|
|
34
|
+
continue;
|
|
35
|
+
const summary = this.sanitizeSummary(c.summary ?? c.description);
|
|
36
|
+
const { flags } = c;
|
|
37
|
+
cmds.push({
|
|
38
|
+
flags: flags,
|
|
39
|
+
id: c.id,
|
|
40
|
+
summary,
|
|
41
|
+
});
|
|
42
|
+
for (const a of c.aliases) {
|
|
43
|
+
cmds.push({
|
|
44
|
+
flags: flags,
|
|
45
|
+
id: a,
|
|
46
|
+
summary,
|
|
47
|
+
});
|
|
48
|
+
const split = a.split(":");
|
|
49
|
+
let topic = split[0];
|
|
50
|
+
for (let i = 0; i < split.length - 1; i++) {
|
|
51
|
+
if (!this.topics.some((t) => t.name === topic)) {
|
|
52
|
+
this.topics.push({
|
|
53
|
+
description: `${topic.replaceAll(":", " ")} commands`,
|
|
54
|
+
name: topic,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
topic += `:${split[i + 1]}`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return cmds;
|
|
63
|
+
}
|
|
64
|
+
getTopics() {
|
|
65
|
+
const topics = this.config.topics
|
|
66
|
+
.filter((topic) => {
|
|
67
|
+
const hasChild = this.config.topics.some((subTopic) => subTopic.name.includes(`${topic.name}:`));
|
|
68
|
+
return hasChild;
|
|
69
|
+
})
|
|
70
|
+
.sort((a, b) => {
|
|
71
|
+
if (a.name < b.name)
|
|
72
|
+
return -1;
|
|
73
|
+
if (a.name > b.name)
|
|
74
|
+
return 1;
|
|
75
|
+
return 0;
|
|
76
|
+
})
|
|
77
|
+
.map((t) => {
|
|
78
|
+
const description = t.description
|
|
79
|
+
? this.sanitizeSummary(t.description)
|
|
80
|
+
: `${t.name.replaceAll(":", " ")} commands`;
|
|
81
|
+
return {
|
|
82
|
+
description,
|
|
83
|
+
name: t.name,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
return topics;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/autocomplete/completions/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CommandCompletion {
|
|
2
|
+
id: string;
|
|
3
|
+
summary: string;
|
|
4
|
+
flags: Record<string, FlagCompletion>;
|
|
5
|
+
}
|
|
6
|
+
export interface FlagCompletion {
|
|
7
|
+
name: string;
|
|
8
|
+
type: "option" | "boolean";
|
|
9
|
+
summary?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
char?: string;
|
|
12
|
+
multiple?: boolean;
|
|
13
|
+
options?: string[];
|
|
14
|
+
hidden?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface TopicCompletion {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/completions/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/autocomplete/completions/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CompletionScriptBase } from "./shared.js";
|
|
2
|
+
import type { FlagCompletion } from "./types.js";
|
|
3
|
+
export default class ZshCompWithSpaces extends CompletionScriptBase {
|
|
4
|
+
generate(): string;
|
|
5
|
+
genZshFlagArgumentsBlock(flags: Record<string, FlagCompletion> | undefined, options?: {
|
|
6
|
+
skipFiles?: boolean;
|
|
7
|
+
}): string;
|
|
8
|
+
genZshTopicCompFun(id: string): string;
|
|
9
|
+
genZshValuesBlock(subArgs: {
|
|
10
|
+
id: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
}[]): string;
|
|
13
|
+
sanitizeSummary(summary: string | undefined): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=zsh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zsh.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/completions/zsh.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,oBAAoB;IAClE,QAAQ,IAAI,MAAM;IA4FlB,wBAAwB,CACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,MAAM;IAqDT,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IA4ItC,iBAAiB,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM;IASrE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;CAWpD"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { format } from "node:util";
|
|
2
|
+
import { CompletionScriptBase } from "./shared.js";
|
|
3
|
+
const argTemplate = ' "%s")\n %s\n ;;\n';
|
|
4
|
+
export default class ZshCompWithSpaces extends CompletionScriptBase {
|
|
5
|
+
generate() {
|
|
6
|
+
const firstArgs = [];
|
|
7
|
+
for (const t of this.topics) {
|
|
8
|
+
if (!t.name.includes(":"))
|
|
9
|
+
firstArgs.push({
|
|
10
|
+
id: t.name,
|
|
11
|
+
summary: t.description,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
for (const c of this.commands) {
|
|
15
|
+
if (!firstArgs.some((a) => a.id === c.id) && !c.id.includes(":"))
|
|
16
|
+
firstArgs.push({
|
|
17
|
+
id: c.id,
|
|
18
|
+
summary: c.summary,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const mainArgsCaseBlock = () => {
|
|
22
|
+
let caseBlock = "case $line[1] in\n";
|
|
23
|
+
for (const arg of firstArgs) {
|
|
24
|
+
if (this.coTopics.includes(arg.id)) {
|
|
25
|
+
caseBlock += `${arg.id})\n _${this.config.bin}_${arg.id}\n ;;\n`;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const cmd = this.commands.find((c) => c.id === arg.id);
|
|
29
|
+
if (cmd) {
|
|
30
|
+
if (Object.keys(cmd.flags).length > 0) {
|
|
31
|
+
caseBlock += `${arg.id})\n${this.genZshFlagArgumentsBlock(cmd.flags)} ;; \n`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
caseBlock += `${arg.id})\n _${this.config.bin}_${arg.id}\n ;;\n`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
caseBlock += `*)\n _${this.config.bin}_dynamic \${words[@]:1}\n ;;\n`;
|
|
40
|
+
caseBlock += "esac\n";
|
|
41
|
+
return caseBlock;
|
|
42
|
+
};
|
|
43
|
+
return `#compdef ${this.config.bin}
|
|
44
|
+
${this.config.binAliases?.map((a) => `compdef ${a}=${this.config.bin}`).join("\n") ?? ""}
|
|
45
|
+
|
|
46
|
+
# Dynamic completion helper - calls ${this.config.bin} autocomplete generate for kit/cookbook/recipe completion
|
|
47
|
+
# Output format: "name\tdescription" or just "name" per line
|
|
48
|
+
_${this.config.bin}_dynamic() {
|
|
49
|
+
local -a completions
|
|
50
|
+
local output
|
|
51
|
+
output=$(${this.config.bin} autocomplete generate -- "$@" 2>/dev/null)
|
|
52
|
+
if [[ -n "$output" ]]; then
|
|
53
|
+
while IFS= read -r line; do
|
|
54
|
+
[[ -z "$line" ]] && continue
|
|
55
|
+
# Convert "name\tdescription" to "name:description" for _describe
|
|
56
|
+
if [[ "$line" == *$'\t'* ]]; then
|
|
57
|
+
local name="\${line%% *}"
|
|
58
|
+
local desc="\${line#* }"
|
|
59
|
+
completions+=("\${name}:\${desc}")
|
|
60
|
+
else
|
|
61
|
+
completions+=("\${line}")
|
|
62
|
+
fi
|
|
63
|
+
done <<< "$output"
|
|
64
|
+
_describe "completions" completions
|
|
65
|
+
return 0
|
|
66
|
+
fi
|
|
67
|
+
return 1
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
${this.topics.map((t) => this.genZshTopicCompFun(t.name)).join("\n")}
|
|
71
|
+
|
|
72
|
+
_${this.config.bin}() {
|
|
73
|
+
local context state state_descr line
|
|
74
|
+
typeset -A opt_args
|
|
75
|
+
|
|
76
|
+
_arguments -C "1: :->cmds" "*::arg:->args"
|
|
77
|
+
|
|
78
|
+
case "$state" in
|
|
79
|
+
cmds)
|
|
80
|
+
${this.genZshValuesBlock(firstArgs)}
|
|
81
|
+
_${this.config.bin}_dynamic \${words[@]:1}
|
|
82
|
+
;;
|
|
83
|
+
args)
|
|
84
|
+
${mainArgsCaseBlock()}
|
|
85
|
+
;;
|
|
86
|
+
esac
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_${this.config.bin}
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
genZshFlagArgumentsBlock(flags, options) {
|
|
93
|
+
if (!flags) {
|
|
94
|
+
const filesSpec = options?.skipFiles ? "" : ' "*: :_files';
|
|
95
|
+
return `_arguments -S \\\n --help"[Show help for command]"${filesSpec}`;
|
|
96
|
+
}
|
|
97
|
+
const flagNames = Object.keys(flags);
|
|
98
|
+
let argumentsBlock = "_arguments -S \\\n";
|
|
99
|
+
for (const flagName of flagNames) {
|
|
100
|
+
const f = flags[flagName];
|
|
101
|
+
if (f.hidden)
|
|
102
|
+
continue;
|
|
103
|
+
const flagSummary = this.sanitizeSummary(f.summary ?? f.description);
|
|
104
|
+
let flagSpec = "";
|
|
105
|
+
if (f.type === "option") {
|
|
106
|
+
if (f.char) {
|
|
107
|
+
if (f.multiple) {
|
|
108
|
+
flagSpec += `"*"{-${f.char},--${f.name}}`;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
flagSpec += `"(-${f.char} --${f.name})"{-${f.char},--${f.name}}`;
|
|
112
|
+
}
|
|
113
|
+
flagSpec += `"[${flagSummary}]`;
|
|
114
|
+
flagSpec += f.options ? `:${f.name} options:(${f.options?.join(" ")})"` : ':file:_files"';
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (f.multiple) {
|
|
118
|
+
flagSpec += '"*"';
|
|
119
|
+
}
|
|
120
|
+
flagSpec += `--${f.name}"[${flagSummary}]:`;
|
|
121
|
+
flagSpec += f.options ? `${f.name} options:(${f.options.join(" ")})"` : 'file:_files"';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (f.char) {
|
|
125
|
+
flagSpec += `"(-${f.char} --${f.name})"{-${f.char},--${f.name}}"[${flagSummary}]"`;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
flagSpec += `--${f.name}"[${flagSummary}]"`;
|
|
129
|
+
}
|
|
130
|
+
flagSpec += " \\\n";
|
|
131
|
+
argumentsBlock += flagSpec;
|
|
132
|
+
}
|
|
133
|
+
argumentsBlock += '--help"[Show help for command]"';
|
|
134
|
+
if (!options?.skipFiles) {
|
|
135
|
+
argumentsBlock += ' \\\n"*: :_files"';
|
|
136
|
+
}
|
|
137
|
+
return argumentsBlock;
|
|
138
|
+
}
|
|
139
|
+
genZshTopicCompFun(id) {
|
|
140
|
+
const coTopics = [];
|
|
141
|
+
for (const topic of this.topics) {
|
|
142
|
+
for (const cmd of this.commands) {
|
|
143
|
+
if (topic.name === cmd.id) {
|
|
144
|
+
coTopics.push(topic.name);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const flagArgsTemplate = ' "%s")\n %s\n ;;\n';
|
|
149
|
+
const dynamicBin = `_${this.config.bin}_dynamic`;
|
|
150
|
+
const underscoreSepId = id.replaceAll(":", "_");
|
|
151
|
+
const depth = id.split(":").length;
|
|
152
|
+
const isCotopic = coTopics.includes(id);
|
|
153
|
+
if (isCotopic) {
|
|
154
|
+
const compFuncName = `${this.config.bin}_${underscoreSepId}`;
|
|
155
|
+
const coTopicCompFunc = `_${compFuncName}() {
|
|
156
|
+
_${compFuncName}_flags() {
|
|
157
|
+
local context state state_descr line
|
|
158
|
+
typeset -A opt_args
|
|
159
|
+
|
|
160
|
+
${this.genZshFlagArgumentsBlock(this.commands.find((c) => c.id === id)?.flags)}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
local context state state_descr line
|
|
164
|
+
typeset -A opt_args
|
|
165
|
+
|
|
166
|
+
_arguments -C "1: :->cmds" "*: :->args"
|
|
167
|
+
|
|
168
|
+
case "$state" in
|
|
169
|
+
cmds)
|
|
170
|
+
if [[ "\${words[CURRENT]}" == -* ]]; then
|
|
171
|
+
_${compFuncName}_flags
|
|
172
|
+
else
|
|
173
|
+
%s
|
|
174
|
+
fi
|
|
175
|
+
;;
|
|
176
|
+
args)
|
|
177
|
+
case $line[1] in
|
|
178
|
+
%s
|
|
179
|
+
*)
|
|
180
|
+
_${compFuncName}_flags
|
|
181
|
+
_${this.config.bin}_dynamic ${id.replaceAll(":", " ")} $line[1] \${words[CURRENT]}
|
|
182
|
+
;;
|
|
183
|
+
esac
|
|
184
|
+
;;
|
|
185
|
+
esac
|
|
186
|
+
}
|
|
187
|
+
`;
|
|
188
|
+
const subArgs = [];
|
|
189
|
+
let argsBlock = "";
|
|
190
|
+
for (const t of this.topics.filter((t) => t.name.startsWith(`${id}:`) && t.name.split(":").length === depth + 1)) {
|
|
191
|
+
const subArg = t.name.split(":")[depth];
|
|
192
|
+
subArgs.push({
|
|
193
|
+
id: subArg,
|
|
194
|
+
summary: t.description,
|
|
195
|
+
});
|
|
196
|
+
argsBlock += format(argTemplate, subArg, `_${this.config.bin}_${underscoreSepId}_${subArg}`);
|
|
197
|
+
}
|
|
198
|
+
for (const c of this.commands.filter((c) => c.id.startsWith(`${id}:`) && c.id.split(":").length === depth + 1)) {
|
|
199
|
+
if (coTopics.includes(c.id))
|
|
200
|
+
continue;
|
|
201
|
+
const subArg = c.id.split(":")[depth];
|
|
202
|
+
subArgs.push({
|
|
203
|
+
id: subArg,
|
|
204
|
+
summary: c.summary,
|
|
205
|
+
});
|
|
206
|
+
const flagsBlock = this.genZshFlagArgumentsBlock(c.flags, { skipFiles: true });
|
|
207
|
+
const dynamicCall = `${dynamicBin} ${id.replaceAll(":", " ")} ${subArg} \${words[CURRENT]}`;
|
|
208
|
+
argsBlock += format(flagArgsTemplate, subArg, `${flagsBlock}\n ${dynamicCall}`);
|
|
209
|
+
}
|
|
210
|
+
return format(coTopicCompFunc, this.genZshValuesBlock(subArgs), argsBlock);
|
|
211
|
+
}
|
|
212
|
+
let argsBlock = "";
|
|
213
|
+
const subArgs = [];
|
|
214
|
+
for (const t of this.topics.filter((t) => t.name.startsWith(`${id}:`) && t.name.split(":").length === depth + 1)) {
|
|
215
|
+
const subArg = t.name.split(":")[depth];
|
|
216
|
+
subArgs.push({
|
|
217
|
+
id: subArg,
|
|
218
|
+
summary: t.description,
|
|
219
|
+
});
|
|
220
|
+
argsBlock += format(argTemplate, subArg, `_${this.config.bin}_${underscoreSepId}_${subArg}`);
|
|
221
|
+
}
|
|
222
|
+
for (const c of this.commands.filter((c) => c.id.startsWith(`${id}:`) && c.id.split(":").length === depth + 1)) {
|
|
223
|
+
if (coTopics.includes(c.id))
|
|
224
|
+
continue;
|
|
225
|
+
const subArg = c.id.split(":")[depth];
|
|
226
|
+
subArgs.push({
|
|
227
|
+
id: subArg,
|
|
228
|
+
summary: c.summary,
|
|
229
|
+
});
|
|
230
|
+
const flagsBlock = this.genZshFlagArgumentsBlock(c.flags, { skipFiles: true });
|
|
231
|
+
const dynamicCall = `${dynamicBin} ${id.replaceAll(":", " ")} ${subArg} \${words[CURRENT]}`;
|
|
232
|
+
argsBlock += format(flagArgsTemplate, subArg, `${flagsBlock}\n ${dynamicCall}`);
|
|
233
|
+
}
|
|
234
|
+
const topicCompFunc = `_${this.config.bin}_${underscoreSepId}() {
|
|
235
|
+
local context state state_descr line
|
|
236
|
+
typeset -A opt_args
|
|
237
|
+
|
|
238
|
+
_arguments -C "1: :->cmds" "*::arg:->args"
|
|
239
|
+
|
|
240
|
+
case "$state" in
|
|
241
|
+
cmds)
|
|
242
|
+
%s
|
|
243
|
+
_${this.config.bin}_dynamic ${id.replaceAll(":", " ")} \${words[CURRENT]}
|
|
244
|
+
;;
|
|
245
|
+
args)
|
|
246
|
+
case $line[1] in
|
|
247
|
+
%s
|
|
248
|
+
*)
|
|
249
|
+
_${this.config.bin}_dynamic ${id.replaceAll(":", " ")} $line[1] \${words[CURRENT]}
|
|
250
|
+
;;
|
|
251
|
+
esac
|
|
252
|
+
;;
|
|
253
|
+
esac
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
return format(topicCompFunc, this.genZshValuesBlock(subArgs), argsBlock);
|
|
257
|
+
}
|
|
258
|
+
genZshValuesBlock(subArgs) {
|
|
259
|
+
let valuesBlock = '_values "completions" \\\n';
|
|
260
|
+
for (const subArg of subArgs) {
|
|
261
|
+
valuesBlock += `"${subArg.id}[${subArg.summary}]" \\\n`;
|
|
262
|
+
}
|
|
263
|
+
return valuesBlock;
|
|
264
|
+
}
|
|
265
|
+
sanitizeSummary(summary) {
|
|
266
|
+
if (summary === undefined) {
|
|
267
|
+
return "";
|
|
268
|
+
}
|
|
269
|
+
return summary
|
|
270
|
+
.replace(/<%= config\.bin %>/g, this.config.bin)
|
|
271
|
+
.replaceAll(/(["`])/g, "\\\\\\$1")
|
|
272
|
+
.replaceAll(/([[\]])/g, "\\\\$1")
|
|
273
|
+
.split("\n")[0];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=zsh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zsh.js","sourceRoot":"","sources":["../../../src/autocomplete/completions/zsh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Cache Manager
|
|
3
|
+
*
|
|
4
|
+
* Scans installed kits and builds a JSON cache of all completable
|
|
5
|
+
* kit/cookbook/recipe/variable paths. The cache is invalidated when
|
|
6
|
+
* the kit manifest is newer than the cache file.
|
|
7
|
+
*/
|
|
8
|
+
import type { DynamicCache } from "./types.js";
|
|
9
|
+
export declare class DynamicCacheManager {
|
|
10
|
+
private readonly cacheDir;
|
|
11
|
+
private readonly projectRoot;
|
|
12
|
+
private readonly cachePath;
|
|
13
|
+
private readonly manifestPath;
|
|
14
|
+
constructor(cacheDir: string, projectRoot: string);
|
|
15
|
+
/**
|
|
16
|
+
* Load the cache from disk. Returns null if the cache file is missing
|
|
17
|
+
* or stale (manifest.json has been modified more recently).
|
|
18
|
+
*/
|
|
19
|
+
load(): DynamicCache | null;
|
|
20
|
+
/**
|
|
21
|
+
* Rebuild the cache by scanning all installed kits, their cookbooks,
|
|
22
|
+
* recipes, and recipe variables.
|
|
23
|
+
*/
|
|
24
|
+
rebuild(): Promise<DynamicCache>;
|
|
25
|
+
/**
|
|
26
|
+
* Extract the description from a recipe.yml file.
|
|
27
|
+
*/
|
|
28
|
+
private extractRecipeDescription;
|
|
29
|
+
/**
|
|
30
|
+
* Extract variable definitions from a recipe.yml file.
|
|
31
|
+
* Reads only the `variables` section to avoid loading the full recipe engine.
|
|
32
|
+
*/
|
|
33
|
+
private extractVariables;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAMnE,qBAAa,mBAAmB;IAK9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGpB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM;IAMrC;;;OAGG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IA2B3B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IA0DtC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CA4CxB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Cache Manager
|
|
3
|
+
*
|
|
4
|
+
* Scans installed kits and builds a JSON cache of all completable
|
|
5
|
+
* kit/cookbook/recipe/variable paths. The cache is invalidated when
|
|
6
|
+
* the kit manifest is newer than the cache file.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { discoverCookbooksInKit, discoverKits, discoverRecipesInCookbook, getDefaultKitSearchDirs, } from "@hypercli/core";
|
|
11
|
+
import createDebug from "debug";
|
|
12
|
+
import yaml from "js-yaml";
|
|
13
|
+
const debug = createDebug("hypercli:autocomplete:cache");
|
|
14
|
+
const CACHE_FILENAME = "dynamic-cache.json";
|
|
15
|
+
export class DynamicCacheManager {
|
|
16
|
+
cacheDir;
|
|
17
|
+
projectRoot;
|
|
18
|
+
cachePath;
|
|
19
|
+
manifestPath;
|
|
20
|
+
constructor(cacheDir, projectRoot) {
|
|
21
|
+
this.cacheDir = cacheDir;
|
|
22
|
+
this.projectRoot = projectRoot;
|
|
23
|
+
this.cachePath = path.join(cacheDir, CACHE_FILENAME);
|
|
24
|
+
this.manifestPath = path.join(projectRoot, ".hyper", "kits", "manifest.json");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load the cache from disk. Returns null if the cache file is missing
|
|
28
|
+
* or stale (manifest.json has been modified more recently).
|
|
29
|
+
*/
|
|
30
|
+
load() {
|
|
31
|
+
if (!fs.existsSync(this.cachePath)) {
|
|
32
|
+
debug("Cache file not found: %s", this.cachePath);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// Staleness check: if manifest.json exists and is newer than cache, invalidate
|
|
36
|
+
if (fs.existsSync(this.manifestPath)) {
|
|
37
|
+
const manifestMtime = fs.statSync(this.manifestPath).mtimeMs;
|
|
38
|
+
const cacheMtime = fs.statSync(this.cachePath).mtimeMs;
|
|
39
|
+
if (manifestMtime > cacheMtime) {
|
|
40
|
+
debug("Cache is stale (manifest newer than cache)");
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const raw = fs.readFileSync(this.cachePath, "utf-8");
|
|
46
|
+
const cache = JSON.parse(raw);
|
|
47
|
+
debug("Loaded cache built at %s with %d kits", cache.builtAt, cache.kits.length);
|
|
48
|
+
return cache;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
debug("Failed to read/parse cache: %s", err);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Rebuild the cache by scanning all installed kits, their cookbooks,
|
|
57
|
+
* recipes, and recipe variables.
|
|
58
|
+
*/
|
|
59
|
+
async rebuild() {
|
|
60
|
+
debug("Rebuilding dynamic cache for project: %s", this.projectRoot);
|
|
61
|
+
const searchDirs = getDefaultKitSearchDirs(this.projectRoot);
|
|
62
|
+
const kitsMap = await discoverKits(searchDirs);
|
|
63
|
+
const cache = {
|
|
64
|
+
builtAt: new Date().toISOString(),
|
|
65
|
+
kits: [],
|
|
66
|
+
cookbooks: {},
|
|
67
|
+
recipes: {},
|
|
68
|
+
variables: {},
|
|
69
|
+
};
|
|
70
|
+
for (const [kitName, parsedKit] of kitsMap) {
|
|
71
|
+
cache.kits.push({
|
|
72
|
+
name: kitName,
|
|
73
|
+
description: parsedKit.config.description,
|
|
74
|
+
});
|
|
75
|
+
cache.cookbooks[kitName] = [];
|
|
76
|
+
const cookbookGlobs = parsedKit.config.cookbooks ?? ["./cookbooks/*/cookbook.yml"];
|
|
77
|
+
const cookbooksMap = await discoverCookbooksInKit(parsedKit.dirPath, cookbookGlobs);
|
|
78
|
+
for (const [cookbookName, parsedCookbook] of cookbooksMap) {
|
|
79
|
+
cache.cookbooks[kitName].push({
|
|
80
|
+
name: cookbookName,
|
|
81
|
+
description: parsedCookbook.config.description,
|
|
82
|
+
});
|
|
83
|
+
const recipeKey = `${kitName}:${cookbookName}`;
|
|
84
|
+
cache.recipes[recipeKey] = [];
|
|
85
|
+
const recipeGlobs = parsedCookbook.config.recipes ?? ["./*/recipe.yml"];
|
|
86
|
+
const recipesMap = await discoverRecipesInCookbook(parsedCookbook.dirPath, recipeGlobs);
|
|
87
|
+
for (const [recipeName, recipeYmlPath] of recipesMap) {
|
|
88
|
+
const vars = this.extractVariables(recipeYmlPath);
|
|
89
|
+
const recipeDesc = this.extractRecipeDescription(recipeYmlPath);
|
|
90
|
+
cache.recipes[recipeKey].push({
|
|
91
|
+
name: recipeName,
|
|
92
|
+
description: recipeDesc,
|
|
93
|
+
});
|
|
94
|
+
const varKey = `${kitName}:${cookbookName}:${recipeName}`;
|
|
95
|
+
cache.variables[varKey] = vars;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Ensure cache directory exists and write
|
|
100
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
101
|
+
fs.writeFileSync(this.cachePath, JSON.stringify(cache, null, 2), "utf-8");
|
|
102
|
+
debug("Cache rebuilt: %d kits, written to %s", cache.kits.length, this.cachePath);
|
|
103
|
+
return cache;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract the description from a recipe.yml file.
|
|
107
|
+
*/
|
|
108
|
+
extractRecipeDescription(recipeYmlPath) {
|
|
109
|
+
try {
|
|
110
|
+
const content = fs.readFileSync(recipeYmlPath, "utf-8");
|
|
111
|
+
const parsed = yaml.load(content);
|
|
112
|
+
if (parsed && typeof parsed === "object" && typeof parsed.description === "string") {
|
|
113
|
+
return parsed.description;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignore parse errors — some recipe files have Jig templates in YAML
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Extract variable definitions from a recipe.yml file.
|
|
123
|
+
* Reads only the `variables` section to avoid loading the full recipe engine.
|
|
124
|
+
*/
|
|
125
|
+
extractVariables(recipeYmlPath) {
|
|
126
|
+
try {
|
|
127
|
+
const content = fs.readFileSync(recipeYmlPath, "utf-8");
|
|
128
|
+
const parsed = yaml.load(content);
|
|
129
|
+
if (!parsed || typeof parsed !== "object" || !parsed.variables) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
const vars = parsed.variables;
|
|
133
|
+
const completions = [];
|
|
134
|
+
for (const [name, def] of Object.entries(vars)) {
|
|
135
|
+
if (!def || typeof def !== "object")
|
|
136
|
+
continue;
|
|
137
|
+
const completion = {
|
|
138
|
+
name,
|
|
139
|
+
type: typeof def.type === "string" ? def.type : "string",
|
|
140
|
+
};
|
|
141
|
+
if (typeof def.description === "string") {
|
|
142
|
+
completion.description = def.description;
|
|
143
|
+
}
|
|
144
|
+
if (!completion.description && typeof def.prompt === "string") {
|
|
145
|
+
completion.description = def.prompt;
|
|
146
|
+
}
|
|
147
|
+
if (Array.isArray(def.values)) {
|
|
148
|
+
completion.values = def.values.map(String);
|
|
149
|
+
}
|
|
150
|
+
if (typeof def.position === "number") {
|
|
151
|
+
completion.position = def.position;
|
|
152
|
+
}
|
|
153
|
+
completions.push(completion);
|
|
154
|
+
}
|
|
155
|
+
return completions;
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
debug("Failed to extract variables from %s: %s", recipeYmlPath, err);
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/cache.ts"],"names":[],"mappings":"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"}
|