@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,10 @@
1
+ /**
2
+ * Dynamic completion module
3
+ *
4
+ * Provides cache management and completion resolution for
5
+ * kit/cookbook/recipe/variable tab completions.
6
+ */
7
+ export type { DynamicCache, VariableCompletion, CompletionContext } from "./types.js";
8
+ export { DynamicCacheManager } from "./cache.js";
9
+ export { CompletionResolver } from "./resolver.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dynamic completion module
3
+ *
4
+ * Provides cache management and completion resolution for
5
+ * kit/cookbook/recipe/variable tab completions.
6
+ */
7
+ export { DynamicCacheManager } from "./cache.js";
8
+ export { CompletionResolver } from "./resolver.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Completion Resolver
3
+ *
4
+ * Parses the words typed so far, determines the completion context
5
+ * (kit / cookbook / recipe / variable), and returns matching completions
6
+ * from the dynamic cache.
7
+ */
8
+ import type { CompletionContext, DynamicCache } from "./types.js";
9
+ export declare class CompletionResolver {
10
+ private readonly cacheManager;
11
+ private cachedData;
12
+ constructor(cacheDir: string, projectRoot: string);
13
+ /**
14
+ * Get the dynamic cache, loading from disk or rebuilding if stale/missing.
15
+ */
16
+ getCache(): Promise<DynamicCache>;
17
+ /**
18
+ * Parse the typed words into a CompletionContext that describes what level
19
+ * the user is completing at.
20
+ *
21
+ * Words should already have CLI routing prefixes stripped (e.g. "gen", "kit info").
22
+ * Only content-level tokens should remain: kit, cookbook, recipe, variable.
23
+ *
24
+ * @param words - Content-level tokens the user has typed so far
25
+ */
26
+ parseContext(words: string[]): CompletionContext;
27
+ /**
28
+ * Return matching completions for the given context.
29
+ */
30
+ complete(context: CompletionContext): Promise<string[]>;
31
+ /**
32
+ * Return the allowed enum values for a specific flag on a recipe.
33
+ */
34
+ getEnumValues(kit: string, cookbook: string, recipe: string, flagName: string): Promise<string[]>;
35
+ /**
36
+ * Force a cache rebuild, discarding any in-memory cache.
37
+ */
38
+ rebuildCache(): Promise<void>;
39
+ }
40
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAInF,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,UAAU,CAA6B;gBAEnC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAIjD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAevC;;;;;;;;OAQG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAqChD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkD7D;;OAEG;IACG,aAAa,CAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC;IAWpB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAInC"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Completion Resolver
3
+ *
4
+ * Parses the words typed so far, determines the completion context
5
+ * (kit / cookbook / recipe / variable), and returns matching completions
6
+ * from the dynamic cache.
7
+ */
8
+ import createDebug from "debug";
9
+ import { DynamicCacheManager } from "./cache.js";
10
+ const debug = createDebug("hypercli:autocomplete:resolver");
11
+ export class CompletionResolver {
12
+ cacheManager;
13
+ cachedData = null;
14
+ constructor(cacheDir, projectRoot) {
15
+ this.cacheManager = new DynamicCacheManager(cacheDir, projectRoot);
16
+ }
17
+ /**
18
+ * Get the dynamic cache, loading from disk or rebuilding if stale/missing.
19
+ */
20
+ async getCache() {
21
+ if (this.cachedData)
22
+ return this.cachedData;
23
+ const loaded = this.cacheManager.load();
24
+ if (loaded) {
25
+ this.cachedData = loaded;
26
+ return loaded;
27
+ }
28
+ debug("Cache miss — rebuilding");
29
+ const fresh = await this.cacheManager.rebuild();
30
+ this.cachedData = fresh;
31
+ return fresh;
32
+ }
33
+ /**
34
+ * Parse the typed words into a CompletionContext that describes what level
35
+ * the user is completing at.
36
+ *
37
+ * Words should already have CLI routing prefixes stripped (e.g. "gen", "kit info").
38
+ * Only content-level tokens should remain: kit, cookbook, recipe, variable.
39
+ *
40
+ * @param words - Content-level tokens the user has typed so far
41
+ */
42
+ parseContext(words) {
43
+ const segments = [...words];
44
+ if (segments.length === 0) {
45
+ return { level: "kit", prefix: "" };
46
+ }
47
+ // The last word is the incomplete prefix being typed
48
+ const prefix = segments.pop();
49
+ switch (segments.length) {
50
+ case 0:
51
+ // Only one word typed — completing kit names
52
+ return { level: "kit", prefix };
53
+ case 1:
54
+ // kitName <prefix> — completing cookbook names
55
+ return { level: "cookbook", kit: segments[0], prefix };
56
+ case 2:
57
+ // kitName cookbookName <prefix> — completing recipe names
58
+ return { level: "recipe", kit: segments[0], cookbook: segments[1], prefix };
59
+ default: {
60
+ // kitName cookbookName recipeName [args...] <prefix> — completing variables
61
+ // Count non-flag segments after recipe (index 3+) to compute positionalIndex
62
+ const argsAfterRecipe = segments.slice(3);
63
+ const positionalIndex = argsAfterRecipe.filter((s) => !s.startsWith("--")).length;
64
+ return {
65
+ level: "variable",
66
+ kit: segments[0],
67
+ cookbook: segments[1],
68
+ recipe: segments[2],
69
+ prefix,
70
+ positionalIndex,
71
+ };
72
+ }
73
+ }
74
+ }
75
+ /**
76
+ * Return matching completions for the given context.
77
+ */
78
+ async complete(context) {
79
+ const cache = await this.getCache();
80
+ switch (context.level) {
81
+ case "kit":
82
+ return formatEntries(filterByPrefix(cache.kits, context.prefix));
83
+ case "cookbook": {
84
+ const cookbooks = cache.cookbooks[context.kit];
85
+ if (!cookbooks)
86
+ return [];
87
+ return formatEntries(filterByPrefix(cookbooks, context.prefix));
88
+ }
89
+ case "recipe": {
90
+ const key = `${context.kit}:${context.cookbook}`;
91
+ const recipes = cache.recipes[key];
92
+ if (!recipes)
93
+ return [];
94
+ return formatEntries(filterByPrefix(recipes, context.prefix));
95
+ }
96
+ case "variable": {
97
+ const key = `${context.kit}:${context.cookbook}:${context.recipe}`;
98
+ const variables = cache.variables[key];
99
+ if (!variables)
100
+ return [];
101
+ // Complete flag-style variables (--name)
102
+ if (context.prefix.startsWith("--")) {
103
+ const flagPrefix = context.prefix.slice(2);
104
+ return variables
105
+ .filter((v) => v.name.toLowerCase().startsWith(flagPrefix.toLowerCase()))
106
+ .map((v) => (v.description ? `--${v.name}\t${v.description}` : `--${v.name}`));
107
+ }
108
+ // Positional completion: find the variable at the current positional index
109
+ const positionalVars = variables
110
+ .filter((v) => v.position !== undefined)
111
+ .sort((a, b) => a.position - b.position);
112
+ const positionalVar = positionalVars[context.positionalIndex];
113
+ if (positionalVar?.values) {
114
+ return positionalVar.values.filter((val) => val.toLowerCase().startsWith(context.prefix.toLowerCase()));
115
+ }
116
+ return [];
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Return the allowed enum values for a specific flag on a recipe.
122
+ */
123
+ async getEnumValues(kit, cookbook, recipe, flagName) {
124
+ const cache = await this.getCache();
125
+ const key = `${kit}:${cookbook}:${recipe}`;
126
+ const variables = cache.variables[key];
127
+ if (!variables)
128
+ return [];
129
+ const variable = variables.find((v) => v.name === flagName);
130
+ if (!variable?.values)
131
+ return [];
132
+ return variable.values;
133
+ }
134
+ /**
135
+ * Force a cache rebuild, discarding any in-memory cache.
136
+ */
137
+ async rebuildCache() {
138
+ this.cachedData = null;
139
+ await this.cacheManager.rebuild();
140
+ }
141
+ }
142
+ /**
143
+ * Filter entries by name prefix (case-insensitive).
144
+ */
145
+ function filterByPrefix(items, prefix) {
146
+ if (!prefix)
147
+ return items;
148
+ const lower = prefix.toLowerCase();
149
+ return items.filter((item) => item.name.toLowerCase().startsWith(lower));
150
+ }
151
+ /**
152
+ * Format entries as "name\tdescription" lines for shell consumption.
153
+ * The tab separator is recognized by zsh _describe and bash completion.
154
+ * Descriptions are truncated to the first sentence for readability.
155
+ */
156
+ function formatEntries(entries) {
157
+ return entries.map((e) => {
158
+ if (!e.description)
159
+ return e.name;
160
+ const firstSentence = e.description.split(/\.(?:\s|$)|\n/)[0].trim();
161
+ return firstSentence ? `${e.name}\t${firstSentence}` : e.name;
162
+ });
163
+ }
164
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface CompletionEntry {
2
+ name: string;
3
+ description?: string;
4
+ }
5
+ export interface DynamicCache {
6
+ builtAt: string;
7
+ kits: CompletionEntry[];
8
+ cookbooks: Record<string, CompletionEntry[]>;
9
+ recipes: Record<string, CompletionEntry[]>;
10
+ variables: Record<string, VariableCompletion[]>;
11
+ }
12
+ export interface VariableCompletion {
13
+ name: string;
14
+ type: string;
15
+ description?: string;
16
+ values?: string[];
17
+ position?: number;
18
+ }
19
+ export type CompletionContext = {
20
+ level: "kit";
21
+ prefix: string;
22
+ } | {
23
+ level: "cookbook";
24
+ kit: string;
25
+ prefix: string;
26
+ } | {
27
+ level: "recipe";
28
+ kit: string;
29
+ cookbook: string;
30
+ prefix: string;
31
+ } | {
32
+ level: "variable";
33
+ kit: string;
34
+ cookbook: string;
35
+ recipe: string;
36
+ prefix: string;
37
+ positionalIndex: number;
38
+ };
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAC1B;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClE;IACA,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/autocomplete/dynamic/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { AutocompleteBase } from "#autocomplete/base";
2
+ interface CommandMeta {
3
+ description: string;
4
+ flags: Record<string, any>;
5
+ id: string;
6
+ }
7
+ export default class Create extends AutocompleteBase {
8
+ static description: string;
9
+ static hidden: boolean;
10
+ private _commands;
11
+ get bashCommandsWithFlagsList(): string;
12
+ get bashCompletionFunction(): string;
13
+ get bashCompletionFunctionPath(): string;
14
+ get bashFunctionsDir(): string;
15
+ get bashSetupScript(): string;
16
+ get bashSetupScriptPath(): string;
17
+ get commands(): CommandMeta[];
18
+ get pwshCompletionFunctionPath(): string;
19
+ get pwshFunctionsDir(): string;
20
+ get zshCompletionFunctionPath(): string;
21
+ get zshFunctionsDir(): string;
22
+ get zshSetupScript(): string;
23
+ get zshSetupScriptPath(): string;
24
+ run(): Promise<void>;
25
+ private createFiles;
26
+ private ensureDirs;
27
+ private genCmdPublicFlags;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/autocomplete/create.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,UAAU,WAAW;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;CACX;AAaD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,gBAAgB;IACnD,OAAgB,WAAW,SAAgE;IAC3F,OAAgB,MAAM,UAAQ;IAE9B,OAAO,CAAC,SAAS,CAA4B;IAE7C,IAAI,yBAAyB,IAAI,MAAM,CAOtC;IAED,IAAI,sBAAsB,IAAI,MAAM,CAcnC;IAED,IAAI,0BAA0B,IAAI,MAAM,CAEvC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,eAAe,IAAI,MAAM,CAI5B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,QAAQ,IAAI,WAAW,EAAE,CA4B5B;IAED,IAAI,0BAA0B,IAAI,MAAM,CAEvC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,yBAAyB,IAAI,MAAM,CAEtC;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAOZ,WAAW;YAuBX,UAAU;IASxB,OAAO,CAAC,iBAAiB;CAOzB"}
@@ -0,0 +1,141 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import makeDebug from "debug";
4
+ import { AutocompleteBase } from "#autocomplete/base";
5
+ import bashAutocompleteWithSpaces from "#autocomplete/completions/bash";
6
+ import PowerShellComp from "#autocomplete/completions/powershell";
7
+ import ZshCompWithSpaces from "#autocomplete/completions/zsh";
8
+ const debug = makeDebug("autocomplete:create");
9
+ function sanitizeDescription(description) {
10
+ if (description === undefined) {
11
+ return "";
12
+ }
13
+ return description
14
+ .replaceAll(/(["`])/g, "\\\\\\$1")
15
+ .replaceAll(/([[\]])/g, "\\\\$1")
16
+ .split("\n")[0];
17
+ }
18
+ export default class Create extends AutocompleteBase {
19
+ static description = "create autocomplete setup scripts and completion functions";
20
+ static hidden = true;
21
+ _commands;
22
+ get bashCommandsWithFlagsList() {
23
+ return this.commands
24
+ .map((c) => {
25
+ const publicFlags = this.genCmdPublicFlags(c).trim();
26
+ return `${c.id} ${publicFlags}`;
27
+ })
28
+ .join("\n");
29
+ }
30
+ get bashCompletionFunction() {
31
+ const { cliBin } = this;
32
+ return (bashAutocompleteWithSpaces
33
+ // eslint-disable-next-line unicorn/prefer-spread
34
+ .concat(...(this.config.binAliases
35
+ ?.map((alias) => `complete -F _<CLI_BIN>_autocomplete ${alias}`)
36
+ .join("\n") ?? []))
37
+ .replaceAll("<CLI_BIN>", cliBin)
38
+ .replaceAll("<BASH_COMMANDS_WITH_FLAGS_LIST>", this.bashCommandsWithFlagsList));
39
+ }
40
+ get bashCompletionFunctionPath() {
41
+ return path.join(this.bashFunctionsDir, `${this.cliBin}.bash`);
42
+ }
43
+ get bashFunctionsDir() {
44
+ return path.join(this.autocompleteCacheDir, "functions", "bash");
45
+ }
46
+ get bashSetupScript() {
47
+ const setup = path.join(this.bashFunctionsDir, `${this.cliBin}.bash`);
48
+ const bin = this.cliBinEnvVar;
49
+ return `${bin}_AC_BASH_COMPFUNC_PATH=${setup} && test -f \$${bin}_AC_BASH_COMPFUNC_PATH && source \$${bin}_AC_BASH_COMPFUNC_PATH;\n`;
50
+ }
51
+ get bashSetupScriptPath() {
52
+ return path.join(this.autocompleteCacheDir, "bash_setup");
53
+ }
54
+ get commands() {
55
+ if (this._commands)
56
+ return this._commands;
57
+ const cmds = [];
58
+ for (const p of this.config.getPluginsList()) {
59
+ for (const c of p.commands) {
60
+ try {
61
+ if (c.hidden)
62
+ continue;
63
+ const description = sanitizeDescription(c.summary ?? (c.description || ""));
64
+ const { flags } = c;
65
+ cmds.push({ description, flags, id: c.id });
66
+ for (const a of c.aliases) {
67
+ cmds.push({ description, flags, id: a });
68
+ }
69
+ }
70
+ catch (error) {
71
+ debug(`Error creating zsh flag spec for command ${c.id}`);
72
+ debug(error.message);
73
+ this.writeLogFile(error.message);
74
+ }
75
+ }
76
+ }
77
+ this._commands = cmds;
78
+ return this._commands;
79
+ }
80
+ get pwshCompletionFunctionPath() {
81
+ return path.join(this.pwshFunctionsDir, `${this.cliBin}.ps1`);
82
+ }
83
+ get pwshFunctionsDir() {
84
+ return path.join(this.autocompleteCacheDir, "functions", "powershell");
85
+ }
86
+ get zshCompletionFunctionPath() {
87
+ return path.join(this.zshFunctionsDir, `_${this.cliBin}`);
88
+ }
89
+ get zshFunctionsDir() {
90
+ return path.join(this.autocompleteCacheDir, "functions", "zsh");
91
+ }
92
+ get zshSetupScript() {
93
+ return `\nfpath=(\n${this.zshFunctionsDir}\n$fpath\n);\nautoload -Uz compinit;\ncompinit;\n`;
94
+ }
95
+ get zshSetupScriptPath() {
96
+ return path.join(this.autocompleteCacheDir, "zsh_setup");
97
+ }
98
+ async run() {
99
+ await this.parse(Create);
100
+ await this.ensureDirs();
101
+ await this.createFiles();
102
+ }
103
+ async createFiles() {
104
+ await Promise.all([
105
+ writeFile(this.bashSetupScriptPath, this.bashSetupScript),
106
+ writeFile(this.bashCompletionFunctionPath, this.bashCompletionFunction),
107
+ writeFile(this.zshSetupScriptPath, this.zshSetupScript),
108
+ writeFile(this.zshCompletionFunctionPath, new ZshCompWithSpaces(this.config).generate()),
109
+ writeFile(this.pwshCompletionFunctionPath, new PowerShellComp(this.config).generate()),
110
+ ]);
111
+ // Also rebuild dynamic cache for kit/cookbook/recipe completions
112
+ try {
113
+ const { DynamicCacheManager } = await import("#autocomplete/dynamic/cache");
114
+ const projectRoot = this.findHyperRoot();
115
+ if (projectRoot) {
116
+ const cacheManager = new DynamicCacheManager(this.autocompleteCacheDir, projectRoot);
117
+ await cacheManager.rebuild();
118
+ }
119
+ }
120
+ catch (error) {
121
+ debug("Failed to build dynamic cache: %s", error);
122
+ // Don't fail — dynamic cache is optional
123
+ }
124
+ }
125
+ async ensureDirs() {
126
+ await mkdir(this.autocompleteCacheDir, { recursive: true });
127
+ await Promise.all([
128
+ mkdir(this.bashFunctionsDir, { recursive: true }),
129
+ mkdir(this.zshFunctionsDir, { recursive: true }),
130
+ mkdir(this.pwshFunctionsDir, { recursive: true }),
131
+ ]);
132
+ }
133
+ genCmdPublicFlags(command) {
134
+ const flags = command.flags || {};
135
+ return Object.keys(flags)
136
+ .filter((flag) => !flags[flag].hidden)
137
+ .map((flag) => `--${flag}`)
138
+ .join(" ");
139
+ }
140
+ }
141
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/autocomplete/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { AutocompleteBase } from "#autocomplete/base";
2
+ export default class Generate extends AutocompleteBase {
3
+ static hidden: boolean;
4
+ static description: string;
5
+ static strict: boolean;
6
+ static flags: {
7
+ "enum-values": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ /**
11
+ * Strip known CLI command routing prefixes from words so the resolver
12
+ * sees only content-level tokens (kit/cookbook/recipe/variable).
13
+ */
14
+ private stripRoutingPrefix;
15
+ }
16
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/autocomplete/generate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,gBAAgB;IACrD,OAAgB,MAAM,UAAQ;IAC9B,OAAgB,WAAW,SAA4D;IACvF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,KAAK;;MAInB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAiB1B"}
@@ -0,0 +1,59 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AutocompleteBase } from "#autocomplete/base";
3
+ import { CompletionResolver } from "#autocomplete/dynamic/resolver";
4
+ export default class Generate extends AutocompleteBase {
5
+ static hidden = true;
6
+ static description = "Generate dynamic completions (called by shell scripts)";
7
+ static strict = false;
8
+ static flags = {
9
+ "enum-values": Flags.string({
10
+ description: "Get enum values for a specific flag (kit:cookbook:recipe:flag)",
11
+ }),
12
+ };
13
+ async run() {
14
+ const { flags, argv } = await this.parse(Generate);
15
+ const words = argv;
16
+ // Find the project root — look for .hyper directory
17
+ const projectRoot = this.findHyperRoot();
18
+ if (!projectRoot)
19
+ return; // No hyper project — no dynamic completions
20
+ const resolver = new CompletionResolver(this.autocompleteCacheDir, projectRoot);
21
+ // Handle enum value completion
22
+ if (flags["enum-values"]) {
23
+ const parts = flags["enum-values"].split(":");
24
+ if (parts.length === 4) {
25
+ const values = await resolver.getEnumValues(parts[0], parts[1], parts[2], parts[3]);
26
+ for (const v of values)
27
+ this.log(v);
28
+ }
29
+ return;
30
+ }
31
+ // Strip CLI routing prefixes before parsing context
32
+ const stripped = this.stripRoutingPrefix(words);
33
+ const context = resolver.parseContext(stripped);
34
+ const completions = await resolver.complete(context);
35
+ for (const completion of completions) {
36
+ this.log(completion);
37
+ }
38
+ }
39
+ /**
40
+ * Strip known CLI command routing prefixes from words so the resolver
41
+ * sees only content-level tokens (kit/cookbook/recipe/variable).
42
+ */
43
+ stripRoutingPrefix(words) {
44
+ if (words.length === 0)
45
+ return words;
46
+ if (words[0] === "gen") {
47
+ return words.slice(1);
48
+ }
49
+ // "kit <subcommand>" routes — the subcommand is routing, not content
50
+ if (words[0] === "kit" && words.length >= 2) {
51
+ const kitSubcommands = ["info", "install", "update", "list"];
52
+ if (kitSubcommands.includes(words[1])) {
53
+ return words.slice(2);
54
+ }
55
+ }
56
+ return words;
57
+ }
58
+ }
59
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/autocomplete/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,gBAAgB;IACrD,MAAM,CAAU,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAU,WAAW,GAAG,wDAAwD,CAAC;IACvF,MAAM,CAAU,MAAM,GAAG,KAAK,CAAC;IAE/B,MAAM,CAAU,KAAK,GAAG;QACvB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC3B,WAAW,EAAE,gEAAgE;SAC7E,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,GAAG;QACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAgB,CAAC;QAE/B,oDAAoD;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,4CAA4C;QAEtE,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;QAEhF,+BAA+B;QAC/B,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpF,KAAK,MAAM,CAAC,IAAI,MAAM;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACR,CAAC;QAED,oDAAoD;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,KAAe;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAErC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,qEAAqE;QACrE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7D,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { AutocompleteBase } from "#autocomplete/base";
2
+ export default class Index extends AutocompleteBase {
3
+ static args: {
4
+ shell: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
5
+ };
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ "refresh-cache": import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ private printShellInstructions;
13
+ }
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/autocomplete/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,gBAAgB;IAClD,OAAgB,IAAI;;MAMlB;IAEF,OAAgB,WAAW,SAAqD;IAEhF,OAAgB,QAAQ,WAMtB;IAEF,OAAgB,KAAK;;MAKnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAW1B,OAAO,CAAC,sBAAsB;CAiD9B"}