@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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/bin/run.js +13 -0
  4. package/dist/autocomplete/base.d.ts +17 -0
  5. package/dist/autocomplete/base.d.ts.map +1 -0
  6. package/dist/autocomplete/base.js +58 -0
  7. package/dist/autocomplete/base.js.map +1 -0
  8. package/dist/autocomplete/completions/bash.d.ts +3 -0
  9. package/dist/autocomplete/completions/bash.d.ts.map +1 -0
  10. package/dist/autocomplete/completions/bash.js +94 -0
  11. package/dist/autocomplete/completions/bash.js.map +1 -0
  12. package/dist/autocomplete/completions/powershell.d.ts +9 -0
  13. package/dist/autocomplete/completions/powershell.d.ts.map +1 -0
  14. package/dist/autocomplete/completions/powershell.js +307 -0
  15. package/dist/autocomplete/completions/powershell.js.map +1 -0
  16. package/dist/autocomplete/completions/shared.d.ts +19 -0
  17. package/dist/autocomplete/completions/shared.d.ts.map +1 -0
  18. package/dist/autocomplete/completions/shared.js +89 -0
  19. package/dist/autocomplete/completions/shared.js.map +1 -0
  20. package/dist/autocomplete/completions/types.d.ts +20 -0
  21. package/dist/autocomplete/completions/types.d.ts.map +1 -0
  22. package/dist/autocomplete/completions/types.js +2 -0
  23. package/dist/autocomplete/completions/types.js.map +1 -0
  24. package/dist/autocomplete/completions/zsh.d.ts +15 -0
  25. package/dist/autocomplete/completions/zsh.d.ts.map +1 -0
  26. package/dist/autocomplete/completions/zsh.js +276 -0
  27. package/dist/autocomplete/completions/zsh.js.map +1 -0
  28. package/dist/autocomplete/dynamic/cache.d.ts +35 -0
  29. package/dist/autocomplete/dynamic/cache.d.ts.map +1 -0
  30. package/dist/autocomplete/dynamic/cache.js +163 -0
  31. package/dist/autocomplete/dynamic/cache.js.map +1 -0
  32. package/dist/autocomplete/dynamic/index.d.ts +10 -0
  33. package/dist/autocomplete/dynamic/index.d.ts.map +1 -0
  34. package/dist/autocomplete/dynamic/index.js +9 -0
  35. package/dist/autocomplete/dynamic/index.js.map +1 -0
  36. package/dist/autocomplete/dynamic/resolver.d.ts +40 -0
  37. package/dist/autocomplete/dynamic/resolver.d.ts.map +1 -0
  38. package/dist/autocomplete/dynamic/resolver.js +164 -0
  39. package/dist/autocomplete/dynamic/resolver.js.map +1 -0
  40. package/dist/autocomplete/dynamic/types.d.ts +39 -0
  41. package/dist/autocomplete/dynamic/types.d.ts.map +1 -0
  42. package/dist/autocomplete/dynamic/types.js +2 -0
  43. package/dist/autocomplete/dynamic/types.js.map +1 -0
  44. package/dist/commands/autocomplete/create.d.ts +30 -0
  45. package/dist/commands/autocomplete/create.d.ts.map +1 -0
  46. package/dist/commands/autocomplete/create.js +141 -0
  47. package/dist/commands/autocomplete/create.js.map +1 -0
  48. package/dist/commands/autocomplete/generate.d.ts +16 -0
  49. package/dist/commands/autocomplete/generate.d.ts.map +1 -0
  50. package/dist/commands/autocomplete/generate.js +59 -0
  51. package/dist/commands/autocomplete/generate.js.map +1 -0
  52. package/dist/commands/autocomplete/index.d.ts +14 -0
  53. package/dist/commands/autocomplete/index.d.ts.map +1 -0
  54. package/dist/commands/autocomplete/index.js +66 -0
  55. package/dist/commands/autocomplete/index.js.map +1 -0
  56. package/dist/commands/autocomplete/script.d.ts +12 -0
  57. package/dist/commands/autocomplete/script.d.ts.map +1 -0
  58. package/dist/commands/autocomplete/script.js +32 -0
  59. package/dist/commands/autocomplete/script.js.map +1 -0
  60. package/dist/commands/config/show.d.ts +12 -0
  61. package/dist/commands/config/show.d.ts.map +1 -0
  62. package/dist/commands/config/show.js +64 -0
  63. package/dist/commands/config/show.js.map +1 -0
  64. package/dist/commands/init.d.ts +11 -0
  65. package/dist/commands/init.d.ts.map +1 -0
  66. package/dist/commands/init.js +76 -0
  67. package/dist/commands/init.js.map +1 -0
  68. package/dist/help/custom-help.d.ts +14 -0
  69. package/dist/help/custom-help.d.ts.map +1 -0
  70. package/dist/help/custom-help.js +110 -0
  71. package/dist/help/custom-help.js.map +1 -0
  72. package/dist/help/theme.d.ts +7 -0
  73. package/dist/help/theme.d.ts.map +1 -0
  74. package/dist/help/theme.js +50 -0
  75. package/dist/help/theme.js.map +1 -0
  76. package/dist/hooks/refresh-cache.d.ts +4 -0
  77. package/dist/hooks/refresh-cache.d.ts.map +1 -0
  78. package/dist/hooks/refresh-cache.js +10 -0
  79. package/dist/hooks/refresh-cache.js.map +1 -0
  80. package/dist/index.d.ts +2 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +6 -0
  83. package/dist/index.js.map +1 -0
  84. package/help/config/show.md +27 -0
  85. package/help/cookbook.md +19 -0
  86. package/help/recipe.md +32 -0
  87. package/help/root.md +49 -0
  88. package/oclif.manifest.json +214 -0
  89. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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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"}