@hypercli/kit 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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/base-command.d.ts +58 -0
  4. package/dist/base-command.d.ts.map +1 -0
  5. package/dist/base-command.js +131 -0
  6. package/dist/base-command.js.map +1 -0
  7. package/dist/commands/cookbook/info.d.ts +24 -0
  8. package/dist/commands/cookbook/info.d.ts.map +1 -0
  9. package/dist/commands/cookbook/info.js +142 -0
  10. package/dist/commands/cookbook/info.js.map +1 -0
  11. package/dist/commands/cookbook/list.d.ts +18 -0
  12. package/dist/commands/cookbook/list.d.ts.map +1 -0
  13. package/dist/commands/cookbook/list.js +81 -0
  14. package/dist/commands/cookbook/list.js.map +1 -0
  15. package/dist/commands/kit/info.d.ts +23 -0
  16. package/dist/commands/kit/info.d.ts.map +1 -0
  17. package/dist/commands/kit/info.js +136 -0
  18. package/dist/commands/kit/info.js.map +1 -0
  19. package/dist/commands/kit/install.d.ts +49 -0
  20. package/dist/commands/kit/install.d.ts.map +1 -0
  21. package/dist/commands/kit/install.js +352 -0
  22. package/dist/commands/kit/install.js.map +1 -0
  23. package/dist/commands/kit/list.d.ts +15 -0
  24. package/dist/commands/kit/list.d.ts.map +1 -0
  25. package/dist/commands/kit/list.js +93 -0
  26. package/dist/commands/kit/list.js.map +1 -0
  27. package/dist/commands/kit/uninstall.d.ts +19 -0
  28. package/dist/commands/kit/uninstall.d.ts.map +1 -0
  29. package/dist/commands/kit/uninstall.js +79 -0
  30. package/dist/commands/kit/uninstall.js.map +1 -0
  31. package/dist/commands/kit/update.d.ts +21 -0
  32. package/dist/commands/kit/update.d.ts.map +1 -0
  33. package/dist/commands/kit/update.js +197 -0
  34. package/dist/commands/kit/update.js.map +1 -0
  35. package/dist/commands/recipe/info.d.ts +24 -0
  36. package/dist/commands/recipe/info.d.ts.map +1 -0
  37. package/dist/commands/recipe/info.js +149 -0
  38. package/dist/commands/recipe/info.js.map +1 -0
  39. package/dist/commands/recipe/list.d.ts +18 -0
  40. package/dist/commands/recipe/list.d.ts.map +1 -0
  41. package/dist/commands/recipe/list.js +104 -0
  42. package/dist/commands/recipe/list.js.map +1 -0
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +7 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/flags.d.ts +14 -0
  48. package/dist/lib/flags.d.ts.map +1 -0
  49. package/dist/lib/flags.js +30 -0
  50. package/dist/lib/flags.js.map +1 -0
  51. package/dist/manifest.d.ts +105 -0
  52. package/dist/manifest.d.ts.map +1 -0
  53. package/dist/manifest.js +115 -0
  54. package/dist/manifest.js.map +1 -0
  55. package/dist/source-resolver.d.ts +62 -0
  56. package/dist/source-resolver.d.ts.map +1 -0
  57. package/dist/source-resolver.js +187 -0
  58. package/dist/source-resolver.js.map +1 -0
  59. package/dist/utils/find-project-root.d.ts +32 -0
  60. package/dist/utils/find-project-root.d.ts.map +1 -0
  61. package/dist/utils/find-project-root.js +135 -0
  62. package/dist/utils/find-project-root.js.map +1 -0
  63. package/help/kit/info.md +41 -0
  64. package/help/kit/install.md +52 -0
  65. package/help/kit/list.md +25 -0
  66. package/help/kit/uninstall.md +38 -0
  67. package/help/kit/update.md +35 -0
  68. package/help/kit.md +36 -0
  69. package/oclif.manifest.json +587 -0
  70. package/package.json +92 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * List installed kits
3
+ */
4
+ import { existsSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { discoverCookbooksInKit, discoverRecipesInCookbook, parseKitFile, } from "@hypercli/core";
7
+ import { c, indent, msg, s, table } from "@hypercli/ui";
8
+ import { BaseCommand } from "#base-command";
9
+ import { outputFlags } from "#lib/flags";
10
+ import { listInstalledKits } from "#manifest";
11
+ export default class KitList extends BaseCommand {
12
+ static description = "List installed kits";
13
+ static examples = ["<%= config.bin %> kit list", "<%= config.bin %> kit list --json"];
14
+ static flags = {
15
+ ...BaseCommand.baseFlags,
16
+ ...outputFlags,
17
+ };
18
+ async run() {
19
+ const { flags } = await this.parse(KitList);
20
+ await this.resolveEffectiveCwd(flags);
21
+ const projectRoot = flags.cwd;
22
+ const entries = listInstalledKits(projectRoot);
23
+ if (entries.length === 0) {
24
+ this.log(msg.info("No kits installed."));
25
+ this.log(`\n Run ${c.command("hyper kit install <source>")} to add one.\n`);
26
+ return;
27
+ }
28
+ // Load kit.yml for each kit and discover cookbooks with their recipes
29
+ const kitsDir = join(projectRoot, ".hyper", "kits");
30
+ const kits = await Promise.all(entries.map(async (entry) => {
31
+ const kitDir = join(kitsDir, entry.name);
32
+ const kitYml = join(kitDir, "kit.yml");
33
+ let parsed;
34
+ const cookbooks = [];
35
+ if (existsSync(kitYml)) {
36
+ parsed = await parseKitFile(kitYml);
37
+ if (parsed.isValid) {
38
+ const config = parsed.config;
39
+ if (config.cookbooks?.length) {
40
+ const discovered = await discoverCookbooksInKit(kitDir, config.cookbooks);
41
+ for (const [name, cb] of discovered) {
42
+ const recipeGlobs = cb.config.recipes ?? ["./*/recipe.yml"];
43
+ const recipes = await discoverRecipesInCookbook(cb.dirPath, recipeGlobs);
44
+ cookbooks.push({ name, recipes: [...recipes.keys()] });
45
+ }
46
+ }
47
+ }
48
+ }
49
+ return { manifest: entry, parsed, cookbooks };
50
+ }));
51
+ if (flags.json) {
52
+ this.log(JSON.stringify(kits.map((k) => ({
53
+ ...k.manifest,
54
+ ...k.parsed?.config,
55
+ cookbooks: k.cookbooks,
56
+ })), null, 2));
57
+ return;
58
+ }
59
+ this.log("");
60
+ this.log(s.header("Installed Kits", kits.length));
61
+ this.log("");
62
+ for (const kit of kits) {
63
+ const { manifest, parsed, cookbooks } = kit;
64
+ const config = parsed?.config;
65
+ const version = config?.version ?? manifest.version;
66
+ const name = c.kit(manifest.name);
67
+ const ver = version ? ` ${c.version(version)}` : "";
68
+ this.log(s.listItem(`${name}${ver}`));
69
+ const description = config?.description?.trim() ?? "";
70
+ if (description) {
71
+ this.log("");
72
+ this.log(indent(c.muted(description), 2));
73
+ }
74
+ if (cookbooks.length > 0) {
75
+ this.log("");
76
+ const tbl = table({
77
+ columns: [
78
+ { key: "cookbook", header: "Cookbook" },
79
+ { key: "recipes", header: "Recipes" },
80
+ ],
81
+ data: cookbooks.map((cb) => ({
82
+ cookbook: c.cookbook(cb.name),
83
+ recipes: cb.recipes.map((r) => c.recipe(r)).join(c.muted(", ")),
84
+ })),
85
+ variant: "borderless",
86
+ });
87
+ this.log(indent(tbl, 2));
88
+ }
89
+ this.log("");
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/kit/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Uninstall/remove a kit
3
+ */
4
+ import { BaseCommand } from "#base-command";
5
+ export default class KitUninstall extends BaseCommand<typeof KitUninstall> {
6
+ static description: string;
7
+ static aliases: string[];
8
+ static examples: string[];
9
+ static flags: {
10
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ cwd: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ };
14
+ static args: {
15
+ kit: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/kit/uninstall.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW,CAAC,OAAO,YAAY,CAAC;IACzE,OAAgB,WAAW,SAA6B;IAExD,OAAgB,OAAO,WAAkB;IAEzC,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;MAOnB;IAEF,OAAgB,IAAI;;MAKlB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkD1B"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Uninstall/remove a kit
3
+ */
4
+ import { existsSync, rmSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { c, msg, s } from "@hypercli/ui";
7
+ import { Args, Flags } from "@oclif/core";
8
+ import { BaseCommand } from "#base-command";
9
+ import { getKitFromManifest, removeKitFromManifest } from "#manifest";
10
+ export default class KitUninstall extends BaseCommand {
11
+ static description = "Remove an installed kit";
12
+ static aliases = ["kit:remove"];
13
+ static examples = [
14
+ "<%= config.bin %> kit uninstall starlight",
15
+ "<%= config.bin %> kit uninstall starlight --force",
16
+ ];
17
+ static flags = {
18
+ ...BaseCommand.baseFlags,
19
+ force: Flags.boolean({
20
+ char: "f",
21
+ description: "Skip confirmation prompt",
22
+ default: false,
23
+ }),
24
+ };
25
+ static args = {
26
+ kit: Args.string({
27
+ description: "Name of the kit to uninstall",
28
+ required: true,
29
+ }),
30
+ };
31
+ async run() {
32
+ const { args, flags } = await this.parse(KitUninstall);
33
+ await this.resolveEffectiveCwd(flags);
34
+ const projectRoot = flags.cwd;
35
+ const kitName = args.kit;
36
+ const entry = getKitFromManifest(projectRoot, kitName);
37
+ if (!entry) {
38
+ this.log(msg.error(`Kit not found: ${kitName}`));
39
+ this.log(`\n Run ${c.command("hyper kit list")} to see installed kits.\n`);
40
+ this.exit(1);
41
+ }
42
+ // Confirmation unless --force
43
+ if (!flags.force) {
44
+ const { confirm } = await import("@clack/prompts");
45
+ const confirmed = await confirm({
46
+ message: `Remove kit ${c.kit(kitName)}?`,
47
+ });
48
+ if (!confirmed || typeof confirmed === "symbol") {
49
+ this.log(s.info("Cancelled."));
50
+ return;
51
+ }
52
+ }
53
+ // Remove based on type
54
+ if (entry.type === "npm" || entry.type === "jsr") {
55
+ // Package manager removal
56
+ const pm = this.detectPackageManager();
57
+ const removeCmd = pm === "yarn" ? "remove" : "uninstall";
58
+ const cmd = `${pm} ${removeCmd} ${entry.source}`;
59
+ this.log(s.info(`Running: ${cmd}`));
60
+ const { execSync } = await import("node:child_process");
61
+ try {
62
+ execSync(cmd, { cwd: projectRoot, stdio: "inherit" });
63
+ }
64
+ catch {
65
+ this.log(msg.error(`Failed to run: ${cmd}`));
66
+ }
67
+ }
68
+ else {
69
+ // Local/git/github — remove directory
70
+ const kitDir = join(projectRoot, ".hyper", "kits", kitName);
71
+ if (existsSync(kitDir)) {
72
+ rmSync(kitDir, { recursive: true, force: true });
73
+ }
74
+ }
75
+ removeKitFromManifest(projectRoot, kitName);
76
+ this.log(s.success(`Kit ${c.kit(kitName)} has been removed.`));
77
+ }
78
+ }
79
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/kit/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Update installed kits by re-fetching from their recorded source
3
+ */
4
+ import { BaseCommand } from "#base-command";
5
+ export default class KitUpdate extends BaseCommand<typeof KitUpdate> {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ cwd: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ static args: {
14
+ kit: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
15
+ };
16
+ run(): Promise<void>;
17
+ private updateKit;
18
+ private cloneFromGitHost;
19
+ private cloneFromGitUrl;
20
+ }
21
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/kit/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW,CAAC,OAAO,SAAS,CAAC;IACnE,OAAgB,WAAW,SAAsD;IAEjF,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;MAMnB;IAEF,OAAgB,IAAI;;MAKlB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAmDZ,SAAS;YAmHT,gBAAgB;YA6BhB,eAAe;CAW7B"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Update installed kits by re-fetching from their recorded source
3
+ */
4
+ import { existsSync, rmSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { Args, Flags } from "@oclif/core";
7
+ import { downloadTemplate } from "giget";
8
+ import { BaseCommand } from "#base-command";
9
+ import { addKitToManifest, extractPackageVersion, loadManifest, } from "#manifest";
10
+ import { resolveKitSource } from "#source-resolver";
11
+ export default class KitUpdate extends BaseCommand {
12
+ static description = "Update installed kits from their original source";
13
+ static examples = [
14
+ "<%= config.bin %> kit update nextjs",
15
+ "<%= config.bin %> kit update --all",
16
+ ];
17
+ static flags = {
18
+ ...BaseCommand.baseFlags,
19
+ all: Flags.boolean({
20
+ description: "Update all installed kits",
21
+ default: false,
22
+ }),
23
+ };
24
+ static args = {
25
+ kit: Args.string({
26
+ description: "Name of the kit to update",
27
+ required: false,
28
+ }),
29
+ };
30
+ async run() {
31
+ const { args, flags } = await this.parse(KitUpdate);
32
+ await this.resolveEffectiveCwd(flags);
33
+ if (!args.kit && !flags.all) {
34
+ this.error("Specify a kit name or use --all to update all kits.\n" +
35
+ "Usage: hypergen kit update <kit-name>\n" +
36
+ " hypergen kit update --all");
37
+ }
38
+ const projectRoot = flags.cwd;
39
+ const manifest = loadManifest(projectRoot);
40
+ if (Object.keys(manifest.kits).length === 0) {
41
+ this.log("No kits installed. Install one with: hypergen kit install <source>");
42
+ return;
43
+ }
44
+ if (flags.all) {
45
+ const kitNames = Object.keys(manifest.kits);
46
+ this.log(`Updating ${kitNames.length} kit(s)...`);
47
+ let succeeded = 0;
48
+ let failed = 0;
49
+ for (const kitName of kitNames) {
50
+ try {
51
+ await this.updateKit(projectRoot, kitName, manifest.kits[kitName]);
52
+ succeeded++;
53
+ }
54
+ catch (error) {
55
+ this.warn(`Failed to update ${kitName}: ${error.message}`);
56
+ failed++;
57
+ }
58
+ }
59
+ this.log(`\n${succeeded} updated, ${failed} failed`);
60
+ }
61
+ else {
62
+ const kitName = args.kit;
63
+ const entry = manifest.kits[kitName];
64
+ if (!entry) {
65
+ const available = Object.keys(manifest.kits).join(", ");
66
+ this.error(`Kit not found: ${kitName}\n` + `Installed kits: ${available || "(none)"}`);
67
+ }
68
+ await this.updateKit(projectRoot, kitName, entry);
69
+ }
70
+ }
71
+ async updateKit(projectRoot, kitName, entry) {
72
+ this.log(`\nUpdating kit: ${kitName}`);
73
+ this.log(` Source: ${entry.source} (${entry.type})`);
74
+ if (entry.type === "npm" || entry.type === "jsr") {
75
+ this.log(" npm/JSR kits are updated through your package manager.");
76
+ this.log(` Run: bun update ${entry.source}`);
77
+ return;
78
+ }
79
+ const kitsDir = join(projectRoot, ".hyper", "kits");
80
+ const targetDir = join(kitsDir, kitName);
81
+ // Remove existing kit directory
82
+ if (existsSync(targetDir)) {
83
+ rmSync(targetDir, { recursive: true, force: true });
84
+ }
85
+ // Re-install from original source
86
+ const resolved = resolveKitSource(entry.source);
87
+ let commit;
88
+ let branch = entry.branch;
89
+ let tag = entry.tag;
90
+ switch (resolved.type) {
91
+ case "github":
92
+ case "gitlab":
93
+ case "bitbucket": {
94
+ const gitInfo = await this.cloneFromGitHost(resolved, targetDir);
95
+ commit = gitInfo.commit;
96
+ branch = gitInfo.branch || branch;
97
+ tag = gitInfo.tag || tag;
98
+ break;
99
+ }
100
+ case "git": {
101
+ await this.cloneFromGitUrl(resolved.source, targetDir);
102
+ break;
103
+ }
104
+ case "local": {
105
+ const { cpSync } = await import("node:fs");
106
+ const { basename, isAbsolute, resolve } = await import("node:path");
107
+ const absoluteSource = isAbsolute(resolved.source)
108
+ ? resolved.source
109
+ : resolve(this.flags.cwd, resolved.source);
110
+ if (!existsSync(absoluteSource)) {
111
+ throw new Error(`Source path does not exist: ${absoluteSource}`);
112
+ }
113
+ cpSync(absoluteSource, targetDir, {
114
+ recursive: true,
115
+ filter: (source) => {
116
+ const name = basename(source);
117
+ return !["node_modules", ".git", "dist", "build", ".DS_Store"].includes(name);
118
+ },
119
+ });
120
+ break;
121
+ }
122
+ case "url": {
123
+ const { mkdirSync } = await import("node:fs");
124
+ const { execSync } = await import("node:child_process");
125
+ mkdirSync(targetDir, { recursive: true });
126
+ if (resolved.source.endsWith(".tar.gz") || resolved.source.endsWith(".tgz")) {
127
+ execSync(`curl -L "${resolved.source}" | tar xz -C "${targetDir}" --strip-components=1`, {
128
+ stdio: "inherit",
129
+ });
130
+ }
131
+ else if (resolved.source.endsWith(".zip")) {
132
+ const tempZip = join(targetDir, "temp.zip");
133
+ execSync(`curl -L -o "${tempZip}" "${resolved.source}" && unzip -q "${tempZip}" -d "${targetDir}" && rm "${tempZip}"`, {
134
+ stdio: "inherit",
135
+ });
136
+ }
137
+ else {
138
+ throw new Error("Unsupported archive format. Only .tar.gz, .tgz, and .zip are supported.");
139
+ }
140
+ break;
141
+ }
142
+ default:
143
+ throw new Error(`Unsupported source type for update: ${resolved.type}`);
144
+ }
145
+ // Extract new version
146
+ const version = extractPackageVersion(targetDir);
147
+ // Update manifest with new metadata
148
+ const updatedEntry = {
149
+ ...entry,
150
+ installedAt: new Date().toISOString(),
151
+ commit,
152
+ version,
153
+ branch,
154
+ tag,
155
+ };
156
+ addKitToManifest(projectRoot, updatedEntry);
157
+ const versionInfo = version ? ` (v${version})` : "";
158
+ const prevVersion = entry.version ? ` (was v${entry.version})` : "";
159
+ this.log(` ✓ Updated${versionInfo}${prevVersion}`);
160
+ }
161
+ async cloneFromGitHost(resolved, targetDir) {
162
+ let branch;
163
+ let tag;
164
+ const branchMatch = resolved.source.match(/#([^/]+)$/);
165
+ const tagMatch = resolved.source.match(/@([^/]+)$/);
166
+ if (branchMatch) {
167
+ branch = branchMatch[1];
168
+ }
169
+ else if (tagMatch) {
170
+ tag = tagMatch[1];
171
+ }
172
+ try {
173
+ await downloadTemplate(resolved.source, {
174
+ dir: targetDir,
175
+ force: true,
176
+ offline: false,
177
+ });
178
+ }
179
+ catch (error) {
180
+ throw new Error(`Failed to download from git host: ${error.message}`);
181
+ }
182
+ return { branch, tag };
183
+ }
184
+ async cloneFromGitUrl(gitUrl, targetDir) {
185
+ try {
186
+ await downloadTemplate(gitUrl, {
187
+ dir: targetDir,
188
+ force: true,
189
+ offline: false,
190
+ });
191
+ }
192
+ catch (error) {
193
+ throw new Error(`Failed to download from git URL: ${error.message}`);
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/kit/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Show detailed information about a recipe
3
+ */
4
+ import { BaseCommand } from "#base-command";
5
+ export default class RecipeInfo extends BaseCommand<typeof RecipeInfo> {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ variables: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ source: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ steps: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ recipes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ cwd: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ static strict: boolean;
18
+ static args: {
19
+ name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
20
+ };
21
+ run(): Promise<void>;
22
+ private displayRecipeInfo;
23
+ }
24
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/commands/recipe/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW,CAAC,OAAO,UAAU,CAAC;IACrE,OAAgB,WAAW,SAA8C;IAEzE,OAAgB,QAAQ,WAMtB;IAEF,OAAgB,KAAK;;;;;;;;MAGnB;IAGF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,IAAI;;MAKlB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAkE1B,OAAO,CAAC,iBAAiB;CAyDzB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Show detailed information about a recipe
3
+ */
4
+ import { readFileSync } from "node:fs";
5
+ import { formatVariable } from "@hypercli/core";
6
+ import { c, indent, markdown, msg, s } from "@hypercli/ui";
7
+ import { Args } from "@oclif/core";
8
+ import yaml from "js-yaml";
9
+ import { BaseCommand } from "#base-command";
10
+ import { infoFlags } from "#lib/flags";
11
+ export default class RecipeInfo extends BaseCommand {
12
+ static description = "Show detailed information about a recipe";
13
+ static examples = [
14
+ "<%= config.bin %> recipe info crud",
15
+ "<%= config.bin %> recipe info starlight crud",
16
+ "<%= config.bin %> recipe info starlight docs crud",
17
+ "<%= config.bin %> recipe info crud --steps",
18
+ "<%= config.bin %> recipe info crud --json",
19
+ ];
20
+ static flags = {
21
+ ...BaseCommand.baseFlags,
22
+ ...infoFlags,
23
+ };
24
+ // Allow variable positional args: [kit] [cookbook] <recipe>
25
+ static strict = false;
26
+ static args = {
27
+ name: Args.string({
28
+ description: "Recipe name (optionally preceded by kit and/or cookbook names)",
29
+ required: true,
30
+ }),
31
+ };
32
+ async run() {
33
+ const { argv, flags } = await this.parse(RecipeInfo);
34
+ await this.resolveEffectiveCwd(flags);
35
+ const positionalArgs = argv;
36
+ let kitFilter;
37
+ let cookbookFilter;
38
+ let recipeName;
39
+ if (positionalArgs.length >= 3) {
40
+ kitFilter = positionalArgs[0];
41
+ cookbookFilter = positionalArgs[1];
42
+ recipeName = positionalArgs[2];
43
+ }
44
+ else if (positionalArgs.length === 2) {
45
+ kitFilter = positionalArgs[0];
46
+ recipeName = positionalArgs[1];
47
+ }
48
+ else {
49
+ recipeName = positionalArgs[0];
50
+ }
51
+ const kits = await this.discoverKitTree(flags.cwd);
52
+ // Find matching recipes
53
+ const matches = [];
54
+ for (const kit of kits) {
55
+ if (kitFilter && kit.manifest.name !== kitFilter)
56
+ continue;
57
+ for (const cb of kit.cookbooks) {
58
+ if (cookbookFilter && cb.name !== cookbookFilter)
59
+ continue;
60
+ for (const recipe of cb.recipes) {
61
+ if (recipe.name === recipeName) {
62
+ let parsed = {};
63
+ try {
64
+ const content = readFileSync(recipe.path, "utf-8");
65
+ parsed = yaml.load(content) ?? {};
66
+ }
67
+ catch {
68
+ // ignore
69
+ }
70
+ matches.push({ kit, cookbook: cb, recipe, parsed });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ if (matches.length === 0) {
76
+ this.log(msg.error(`Recipe not found: ${recipeName}`));
77
+ this.log(`\n Run ${c.command("hyper recipe list")} to see available recipes.\n`);
78
+ this.exit(1);
79
+ }
80
+ if (flags.json) {
81
+ const output = matches.map((m) => ({
82
+ name: m.recipe.name,
83
+ kit: m.kit.manifest.name,
84
+ cookbook: m.cookbook.name,
85
+ path: m.recipe.path,
86
+ ...m.parsed,
87
+ }));
88
+ this.log(JSON.stringify(output.length === 1 ? output[0] : output, null, 2));
89
+ return;
90
+ }
91
+ for (const match of matches) {
92
+ this.displayRecipeInfo(match, flags);
93
+ }
94
+ }
95
+ displayRecipeInfo(match, flags) {
96
+ const { kit, cookbook, recipe, parsed } = match;
97
+ this.log("");
98
+ this.log(markdown(`# Recipe: ${recipe.name}`));
99
+ this.log(s.keyValue("kit", c.kit(kit.manifest.name), 2));
100
+ this.log(s.keyValue("cookbook", c.cookbook(cookbook.name), 2));
101
+ if (parsed.version)
102
+ this.log(s.keyValue("version", c.version(parsed.version), 2));
103
+ if (parsed.description) {
104
+ this.log("");
105
+ this.log(indent(c.muted(parsed.description), 2));
106
+ }
107
+ // Source (additive)
108
+ if (flags.source) {
109
+ this.log("");
110
+ this.log(s.header("Source"));
111
+ this.log(s.keyValue(" path", s.path(recipe.path)));
112
+ }
113
+ // Variables — shown by default with full details
114
+ const variables = parsed.variables ? Object.entries(parsed.variables) : [];
115
+ if (variables.length > 0) {
116
+ this.log("");
117
+ this.log(s.header("Variables", variables.length));
118
+ for (const [key, variable] of variables) {
119
+ const v = formatVariable(key, variable);
120
+ let line = ` ${c.property(v.name)}`;
121
+ if (v.type)
122
+ line += c.muted(` (${v.type})`);
123
+ if (v.required)
124
+ line += c.required(" *required*");
125
+ if (v.defaultValue !== undefined)
126
+ line += c.default(v.defaultValue);
127
+ this.log(line);
128
+ if (v.description)
129
+ this.log(s.description(v.description, 4));
130
+ if (v.enumValues) {
131
+ this.log(s.description(`options: ${v.enumValues.join(", ")}`, 4));
132
+ }
133
+ }
134
+ }
135
+ // Steps — shown by default
136
+ if (Array.isArray(parsed.steps) && parsed.steps.length > 0) {
137
+ this.log("");
138
+ this.log(s.header("Steps", parsed.steps.length));
139
+ for (let i = 0; i < parsed.steps.length; i++) {
140
+ const step = parsed.steps[i];
141
+ const name = step.name || `Step ${i + 1}`;
142
+ const tool = step.tool ? c.muted(` [${step.tool}]`) : "";
143
+ this.log(` ${c.muted(`${i + 1}.`)} ${name}${tool}`);
144
+ }
145
+ }
146
+ this.log("");
147
+ }
148
+ }
149
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/recipe/info.ts"],"names":[],"mappings":"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"}