@hypercli/core 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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/config/config-loader.d.ts +117 -0
  4. package/dist/config/config-loader.d.ts.map +1 -0
  5. package/dist/config/config-loader.js +287 -0
  6. package/dist/config/config-loader.js.map +1 -0
  7. package/dist/config/index.d.ts +9 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +8 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/load-helpers.d.ts +13 -0
  12. package/dist/config/load-helpers.d.ts.map +1 -0
  13. package/dist/config/load-helpers.js +67 -0
  14. package/dist/config/load-helpers.js.map +1 -0
  15. package/dist/constants.d.ts +4 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +4 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/errors/hypergen-errors.d.ts +162 -0
  20. package/dist/errors/hypergen-errors.d.ts.map +1 -0
  21. package/dist/errors/hypergen-errors.js +944 -0
  22. package/dist/errors/hypergen-errors.js.map +1 -0
  23. package/dist/errors/index.d.ts +2 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +2 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/helpers.d.ts +25 -0
  28. package/dist/helpers.d.ts.map +1 -0
  29. package/dist/helpers.js +20 -0
  30. package/dist/helpers.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/logger/cli-html-types.d.ts +36 -0
  36. package/dist/logger/cli-html-types.d.ts.map +1 -0
  37. package/dist/logger/cli-html-types.js +2 -0
  38. package/dist/logger/cli-html-types.js.map +1 -0
  39. package/dist/logger/index.d.ts +3 -0
  40. package/dist/logger/index.d.ts.map +1 -0
  41. package/dist/logger/index.js +3 -0
  42. package/dist/logger/index.js.map +1 -0
  43. package/dist/logger/logger.d.ts +17 -0
  44. package/dist/logger/logger.d.ts.map +1 -0
  45. package/dist/logger/logger.js +42 -0
  46. package/dist/logger/logger.js.map +1 -0
  47. package/dist/logger/types.d.ts +16 -0
  48. package/dist/logger/types.d.ts.map +1 -0
  49. package/dist/logger/types.js +2 -0
  50. package/dist/logger/types.js.map +1 -0
  51. package/dist/parsers/cookbook-parser.d.ts +30 -0
  52. package/dist/parsers/cookbook-parser.d.ts.map +1 -0
  53. package/dist/parsers/cookbook-parser.js +155 -0
  54. package/dist/parsers/cookbook-parser.js.map +1 -0
  55. package/dist/parsers/index.d.ts +10 -0
  56. package/dist/parsers/index.d.ts.map +1 -0
  57. package/dist/parsers/index.js +16 -0
  58. package/dist/parsers/index.js.map +1 -0
  59. package/dist/parsers/kit-parser.d.ts +44 -0
  60. package/dist/parsers/kit-parser.d.ts.map +1 -0
  61. package/dist/parsers/kit-parser.js +195 -0
  62. package/dist/parsers/kit-parser.js.map +1 -0
  63. package/dist/parsers/path-resolver.d.ts +72 -0
  64. package/dist/parsers/path-resolver.d.ts.map +1 -0
  65. package/dist/parsers/path-resolver.js +281 -0
  66. package/dist/parsers/path-resolver.js.map +1 -0
  67. package/dist/parsers/template-parser.d.ts +142 -0
  68. package/dist/parsers/template-parser.d.ts.map +1 -0
  69. package/dist/parsers/template-parser.js +896 -0
  70. package/dist/parsers/template-parser.js.map +1 -0
  71. package/dist/types/actions.d.ts +109 -0
  72. package/dist/types/actions.d.ts.map +1 -0
  73. package/dist/types/actions.js +31 -0
  74. package/dist/types/actions.js.map +1 -0
  75. package/dist/types/ai-config.d.ts +170 -0
  76. package/dist/types/ai-config.d.ts.map +1 -0
  77. package/dist/types/ai-config.js +10 -0
  78. package/dist/types/ai-config.js.map +1 -0
  79. package/dist/types/common.d.ts +24 -0
  80. package/dist/types/common.d.ts.map +1 -0
  81. package/dist/types/common.js +10 -0
  82. package/dist/types/common.js.map +1 -0
  83. package/dist/types/index.d.ts +19 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +11 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/types/kit.d.ts +92 -0
  88. package/dist/types/kit.d.ts.map +1 -0
  89. package/dist/types/kit.js +17 -0
  90. package/dist/types/kit.js.map +1 -0
  91. package/dist/types/recipe.d.ts +953 -0
  92. package/dist/types/recipe.d.ts.map +1 -0
  93. package/dist/types/recipe.js +92 -0
  94. package/dist/types/recipe.js.map +1 -0
  95. package/dist/types/template.d.ts +49 -0
  96. package/dist/types/template.d.ts.map +1 -0
  97. package/dist/types/template.js +7 -0
  98. package/dist/types/template.js.map +1 -0
  99. package/dist/ui/index.d.ts +4 -0
  100. package/dist/ui/index.d.ts.map +1 -0
  101. package/dist/ui/index.js +4 -0
  102. package/dist/ui/index.js.map +1 -0
  103. package/dist/ui/messages.d.ts +16 -0
  104. package/dist/ui/messages.d.ts.map +1 -0
  105. package/dist/ui/messages.js +57 -0
  106. package/dist/ui/messages.js.map +1 -0
  107. package/dist/ui/styles.d.ts +7 -0
  108. package/dist/ui/styles.d.ts.map +1 -0
  109. package/dist/ui/styles.js +8 -0
  110. package/dist/ui/styles.js.map +1 -0
  111. package/dist/ui/symbols.d.ts +9 -0
  112. package/dist/ui/symbols.d.ts.map +1 -0
  113. package/dist/ui/symbols.js +10 -0
  114. package/dist/ui/symbols.js.map +1 -0
  115. package/dist/utils/display-utils.d.ts +65 -0
  116. package/dist/utils/display-utils.d.ts.map +1 -0
  117. package/dist/utils/display-utils.js +101 -0
  118. package/dist/utils/display-utils.js.map +1 -0
  119. package/dist/utils/find-project-root.d.ts +32 -0
  120. package/dist/utils/find-project-root.d.ts.map +1 -0
  121. package/dist/utils/find-project-root.js +133 -0
  122. package/dist/utils/find-project-root.js.map +1 -0
  123. package/dist/utils/index.d.ts +4 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +4 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/newline.d.ts +3 -0
  128. package/dist/utils/newline.d.ts.map +1 -0
  129. package/dist/utils/newline.js +12 -0
  130. package/dist/utils/newline.js.map +1 -0
  131. package/package.json +83 -0
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Kit Parser
3
+ *
4
+ * Parses and validates kit.yml files and discovers kits from search directories.
5
+ * A kit is the top-level container that holds cookbooks and standalone recipes.
6
+ */
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import createDebug from "debug";
10
+ import { glob } from "glob";
11
+ import yaml from "js-yaml";
12
+ import { loadHelpers } from "#config/load-helpers";
13
+ const debug = createDebug("hypergen:config:kit-parser");
14
+ /**
15
+ * Parse a kit.yml file and return validated configuration
16
+ */
17
+ export async function parseKitFile(filePath) {
18
+ const result = {
19
+ config: { name: "" },
20
+ filePath,
21
+ dirPath: path.dirname(filePath),
22
+ isValid: false,
23
+ errors: [],
24
+ warnings: [],
25
+ };
26
+ try {
27
+ if (!fs.existsSync(filePath)) {
28
+ result.errors.push(`Kit file not found: ${filePath}`);
29
+ return result;
30
+ }
31
+ const content = fs.readFileSync(filePath, "utf-8");
32
+ const parsed = yaml.load(content);
33
+ if (!parsed || typeof parsed !== "object") {
34
+ result.errors.push("Invalid YAML format or empty file");
35
+ return result;
36
+ }
37
+ result.config = validateKitConfig(parsed, result.errors, result.warnings);
38
+ result.isValid = result.errors.length === 0;
39
+ // Load helpers if configured (returned in result, not registered)
40
+ if (result.isValid && result.config.helpers) {
41
+ try {
42
+ result.loadedHelpers = await loadHelpers(result.config.helpers, result.dirPath);
43
+ }
44
+ catch (error) {
45
+ result.warnings.push(`Failed to load helpers: ${error instanceof Error ? error.message : String(error)}`);
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ catch (error) {
51
+ result.errors.push(`Failed to parse kit file: ${error.message}`);
52
+ return result;
53
+ }
54
+ }
55
+ /**
56
+ * Discover kits from a list of search directories.
57
+ *
58
+ * Search order:
59
+ * 1. `./kits/` (project-local)
60
+ * 2. `./node_modules/@kit/` (npm installed)
61
+ * 3. Explicit additional directories
62
+ */
63
+ export async function discoverKits(searchDirs) {
64
+ const kits = new Map();
65
+ for (const dir of searchDirs) {
66
+ if (!fs.existsSync(dir)) {
67
+ debug("Kit search directory does not exist: %s", dir);
68
+ continue;
69
+ }
70
+ // Look for kit.yml in immediate subdirectories
71
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
72
+ for (const entry of entries) {
73
+ // Check if entry is a directory or a symlink pointing to a directory
74
+ const entryPath = path.join(dir, entry.name);
75
+ const stat = fs.statSync(entryPath);
76
+ if (!stat.isDirectory())
77
+ continue;
78
+ const kitYml = path.join(entryPath, "kit.yml");
79
+ if (fs.existsSync(kitYml)) {
80
+ const parsed = await parseKitFile(kitYml);
81
+ if (parsed.isValid) {
82
+ // Derive a short name for routing: strip scope prefix
83
+ const shortName = deriveShortName(parsed.config.name);
84
+ kits.set(shortName, parsed);
85
+ debug("Discovered kit: %s -> %s", shortName, kitYml);
86
+ }
87
+ else {
88
+ debug("Kit validation failed: %s (%s)", kitYml, parsed.errors.join(", "));
89
+ }
90
+ }
91
+ }
92
+ // Also check if the directory itself has a kit.yml (e.g., direct kit dir)
93
+ const directKitYml = path.join(dir, "kit.yml");
94
+ if (fs.existsSync(directKitYml)) {
95
+ const parsed = await parseKitFile(directKitYml);
96
+ if (parsed.isValid) {
97
+ const shortName = deriveShortName(parsed.config.name);
98
+ if (!kits.has(shortName)) {
99
+ kits.set(shortName, parsed);
100
+ debug("Discovered kit (direct): %s -> %s", shortName, directKitYml);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ return kits;
106
+ }
107
+ /**
108
+ * Get the default search directories for kit discovery relative to a project root.
109
+ */
110
+ export function getDefaultKitSearchDirs(projectRoot) {
111
+ return [
112
+ path.join(projectRoot, ".hyper", "kits"),
113
+ path.join(projectRoot, "kits"),
114
+ path.join(projectRoot, "node_modules", "@kit"),
115
+ ];
116
+ }
117
+ /**
118
+ * Derive a short, CLI-friendly name from a kit's full name.
119
+ * "@kit/nextjs" -> "nextjs"
120
+ * "my-kit" -> "my-kit"
121
+ */
122
+ export function deriveShortName(name) {
123
+ // Strip npm scope
124
+ const withoutScope = name.replace(/^@[^/]+\//, "");
125
+ return withoutScope;
126
+ }
127
+ /**
128
+ * Resolve cookbook glob patterns within a kit directory.
129
+ */
130
+ export async function resolveKitCookbooks(kitDirPath, cookbookGlobs) {
131
+ const cookbookDirs = [];
132
+ for (const pattern of cookbookGlobs) {
133
+ const matches = await glob(pattern, { cwd: kitDirPath, absolute: true });
134
+ for (const match of matches) {
135
+ // If match is a file (cookbook.yml), use its parent dir
136
+ const stat = fs.statSync(match);
137
+ const dir = stat.isFile() ? path.dirname(match) : match;
138
+ if (!cookbookDirs.includes(dir)) {
139
+ cookbookDirs.push(dir);
140
+ }
141
+ }
142
+ }
143
+ return cookbookDirs;
144
+ }
145
+ // -- Validation helpers --
146
+ function validateKitConfig(parsed, errors, _warnings) {
147
+ const config = { name: "" };
148
+ if (!parsed.name || typeof parsed.name !== "string") {
149
+ errors.push("Kit name is required and must be a string");
150
+ }
151
+ else {
152
+ config.name = parsed.name;
153
+ }
154
+ if (parsed.description && typeof parsed.description === "string") {
155
+ config.description = parsed.description;
156
+ }
157
+ if (parsed.version && typeof parsed.version === "string") {
158
+ config.version = parsed.version;
159
+ }
160
+ if (parsed.author && typeof parsed.author === "string") {
161
+ config.author = parsed.author;
162
+ }
163
+ if (parsed.license && typeof parsed.license === "string") {
164
+ config.license = parsed.license;
165
+ }
166
+ if (parsed.keywords && Array.isArray(parsed.keywords)) {
167
+ config.keywords = parsed.keywords.filter((k) => typeof k === "string");
168
+ }
169
+ if (parsed.defaults && typeof parsed.defaults === "object") {
170
+ config.defaults = {};
171
+ if (typeof parsed.defaults.cookbook === "string") {
172
+ config.defaults.cookbook = parsed.defaults.cookbook;
173
+ }
174
+ if (typeof parsed.defaults.recipe === "string") {
175
+ config.defaults.recipe = parsed.defaults.recipe;
176
+ }
177
+ }
178
+ if (parsed.cookbooks && Array.isArray(parsed.cookbooks)) {
179
+ config.cookbooks = parsed.cookbooks.filter((c) => typeof c === "string");
180
+ }
181
+ if (parsed.recipes && Array.isArray(parsed.recipes)) {
182
+ config.recipes = parsed.recipes.filter((r) => typeof r === "string");
183
+ }
184
+ if (parsed.tags && Array.isArray(parsed.tags)) {
185
+ config.tags = parsed.tags.filter((t) => typeof t === "string");
186
+ }
187
+ if (parsed.categories && Array.isArray(parsed.categories)) {
188
+ config.categories = parsed.categories.filter((c) => typeof c === "string");
189
+ }
190
+ if (parsed.helpers && typeof parsed.helpers === "string") {
191
+ config.helpers = parsed.helpers;
192
+ }
193
+ return config;
194
+ }
195
+ //# sourceMappingURL=kit-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit-parser.js","sourceRoot":"","sources":["../../src/parsers/kit-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Path Resolver
3
+ *
4
+ * Resolves CLI path segments (e.g., ["nextjs", "crud", "update", "Organization"])
5
+ * into a concrete recipe file path or group directory, with leftover segments
6
+ * becoming positional arguments.
7
+ *
8
+ * Algorithm: greedy path matching — longest filesystem match wins.
9
+ */
10
+ import type { ParsedKit } from "./kit-parser.js";
11
+ export interface ResolvedPath {
12
+ /** Whether we resolved to a single recipe or a directory group */
13
+ type: "recipe" | "group";
14
+ /** Filesystem path to recipe.yml or directory */
15
+ fullPath: string;
16
+ /** Kit name (if matched) */
17
+ kit?: string;
18
+ /** Cookbook name (if matched) */
19
+ cookbook?: string;
20
+ /** Recipe name (if matched) */
21
+ recipe?: string;
22
+ /** Path segments that were consumed by resolution */
23
+ consumed: string[];
24
+ /** Leftover segments = positional arguments */
25
+ remaining: string[];
26
+ }
27
+ export declare class PathResolver {
28
+ private readonly kits;
29
+ private readonly searchDirs;
30
+ private readonly cwd;
31
+ constructor(kits: Map<string, ParsedKit>, searchDirs: string[], cwd: string);
32
+ /**
33
+ * Resolve CLI path segments to a recipe or group.
34
+ *
35
+ * @param segments Non-flag CLI arguments (e.g., ["nextjs", "crud", "update", "Org"])
36
+ * @returns Resolved path or null if nothing matched
37
+ */
38
+ resolve(segments: string[]): Promise<ResolvedPath | null>;
39
+ /**
40
+ * Try to resolve segments starting with a kit name.
41
+ */
42
+ private resolveViaKit;
43
+ /**
44
+ * Resolve via search directories (backward-compatible fallback).
45
+ */
46
+ private resolveViaSearchDirs;
47
+ /**
48
+ * Greedy filesystem walk: try longest match first.
49
+ *
50
+ * Given baseDir and segments [a, b, c]:
51
+ * Try baseDir/a/b/c/recipe.yml
52
+ * Try baseDir/a/b/recipe.yml
53
+ * Try baseDir/a/recipe.yml
54
+ *
55
+ * Longest match with recipe.yml wins. If a directory match with no recipe.yml,
56
+ * it's a group.
57
+ */
58
+ private greedyResolve;
59
+ /**
60
+ * Check if a directory contains any recipe.yml files (immediate children).
61
+ */
62
+ private dirContainsRecipes;
63
+ /**
64
+ * Resolve kit default: use defaults.cookbook + defaults.recipe
65
+ */
66
+ private resolveKitDefault;
67
+ /**
68
+ * Resolve cookbook default recipe or group.
69
+ */
70
+ private resolveCookbookDefault;
71
+ }
72
+ //# sourceMappingURL=path-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../src/parsers/path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,YAAY;IAC5B,kEAAkE;IAClE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,YAAY;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC5B,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM;IAG7B;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA8C/D;;OAEG;YACW,aAAa;IAgG3B;;OAEG;YACW,oBAAoB;IAUlC;;;;;;;;;;OAUG;YACW,aAAa;IAoD3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,sBAAsB;CAqCpC"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Path Resolver
3
+ *
4
+ * Resolves CLI path segments (e.g., ["nextjs", "crud", "update", "Organization"])
5
+ * into a concrete recipe file path or group directory, with leftover segments
6
+ * becoming positional arguments.
7
+ *
8
+ * Algorithm: greedy path matching — longest filesystem match wins.
9
+ */
10
+ import fs from "node:fs";
11
+ import path from "node:path";
12
+ import createDebug from "debug";
13
+ import { discoverCookbooksInKit, discoverRecipesInCookbook } from "./cookbook-parser.js";
14
+ const debug = createDebug("hypergen:config:path-resolver");
15
+ export class PathResolver {
16
+ kits;
17
+ searchDirs;
18
+ cwd;
19
+ constructor(kits, searchDirs, cwd) {
20
+ this.kits = kits;
21
+ this.searchDirs = searchDirs;
22
+ this.cwd = cwd;
23
+ }
24
+ /**
25
+ * Resolve CLI path segments to a recipe or group.
26
+ *
27
+ * @param segments Non-flag CLI arguments (e.g., ["nextjs", "crud", "update", "Org"])
28
+ * @returns Resolved path or null if nothing matched
29
+ */
30
+ async resolve(segments) {
31
+ if (segments.length === 0)
32
+ return null;
33
+ debug("Resolving path segments: %o", segments);
34
+ // 1. Direct file path bypass
35
+ const first = segments[0];
36
+ if (first.startsWith("./") ||
37
+ first.startsWith("../") ||
38
+ first.startsWith("/") ||
39
+ first.endsWith(".yml") ||
40
+ first.endsWith(".yaml")) {
41
+ const resolved = path.resolve(this.cwd, first);
42
+ if (fs.existsSync(resolved)) {
43
+ debug("Direct file path: %s", resolved);
44
+ return {
45
+ type: "recipe",
46
+ fullPath: resolved,
47
+ consumed: [first],
48
+ remaining: segments.slice(1),
49
+ };
50
+ }
51
+ return null;
52
+ }
53
+ // 2. Try kit-based resolution
54
+ const kitResult = await this.resolveViaKit(segments);
55
+ if (kitResult)
56
+ return kitResult;
57
+ // 3. Try search-dir fallback (backward compat: cookbooks/, .hypergen/cookbooks/)
58
+ const fallbackResult = await this.resolveViaSearchDirs(segments);
59
+ if (fallbackResult)
60
+ return fallbackResult;
61
+ // 4. Try slash-separated single arg: "crud/edit-page" -> ["crud", "edit-page"]
62
+ if (segments.length === 1 && segments[0].includes("/")) {
63
+ const split = segments[0].split("/");
64
+ const splitResult = await this.resolve(split);
65
+ if (splitResult)
66
+ return splitResult;
67
+ }
68
+ debug("No resolution found for segments: %o", segments);
69
+ return null;
70
+ }
71
+ /**
72
+ * Try to resolve segments starting with a kit name.
73
+ */
74
+ async resolveViaKit(segments) {
75
+ const kitName = segments[0];
76
+ const kit = this.kits.get(kitName);
77
+ if (!kit)
78
+ return null;
79
+ debug("Matched kit: %s", kitName);
80
+ const kitDir = kit.dirPath;
81
+ const remaining = segments.slice(1);
82
+ // If no more segments, use kit defaults
83
+ if (remaining.length === 0) {
84
+ return this.resolveKitDefault(kit, kitName);
85
+ }
86
+ // Discover cookbooks in this kit
87
+ const cookbooks = await discoverCookbooksInKit(kitDir, kit.config.cookbooks || ["./cookbooks/*/cookbook.yml"]);
88
+ // Try to match a cookbook
89
+ const cookbookName = remaining[0];
90
+ const cookbook = cookbooks.get(cookbookName);
91
+ if (cookbook) {
92
+ const afterCookbook = remaining.slice(1);
93
+ if (afterCookbook.length === 0) {
94
+ // Just kit + cookbook — use default recipe or treat as group
95
+ return this.resolveCookbookDefault(cookbook, kitName, cookbookName);
96
+ }
97
+ // Try to match a recipe within the cookbook
98
+ const recipes = await discoverRecipesInCookbook(cookbook.dirPath, cookbook.config.recipes || ["./*/recipe.yml"]);
99
+ const recipeName = afterCookbook[0];
100
+ const recipeYml = recipes.get(recipeName);
101
+ if (recipeYml) {
102
+ debug("Matched recipe: %s/%s/%s", kitName, cookbookName, recipeName);
103
+ return {
104
+ type: "recipe",
105
+ fullPath: recipeYml,
106
+ kit: kitName,
107
+ cookbook: cookbookName,
108
+ recipe: recipeName,
109
+ consumed: [kitName, cookbookName, recipeName],
110
+ remaining: afterCookbook.slice(1),
111
+ };
112
+ }
113
+ // No recipe match — the remaining segments are positional args for the default recipe
114
+ // or this is a group execution of the cookbook directory
115
+ const defaultRecipe = cookbook.config.defaults?.recipe;
116
+ if (defaultRecipe) {
117
+ const defaultRecipeYml = recipes.get(defaultRecipe);
118
+ if (defaultRecipeYml) {
119
+ debug("Cookbook default recipe: %s/%s/%s with positional args: %o", kitName, cookbookName, defaultRecipe, afterCookbook);
120
+ return {
121
+ type: "recipe",
122
+ fullPath: defaultRecipeYml,
123
+ kit: kitName,
124
+ cookbook: cookbookName,
125
+ recipe: defaultRecipe,
126
+ consumed: [kitName, cookbookName],
127
+ remaining: afterCookbook,
128
+ };
129
+ }
130
+ }
131
+ // Treat as group execution
132
+ debug("Cookbook group execution: %s/%s", kitName, cookbookName);
133
+ return {
134
+ type: "group",
135
+ fullPath: cookbook.dirPath,
136
+ kit: kitName,
137
+ cookbook: cookbookName,
138
+ consumed: [kitName, cookbookName],
139
+ remaining: afterCookbook,
140
+ };
141
+ }
142
+ // No cookbook match — try greedy filesystem walk within kit dir
143
+ return this.greedyResolve(kitDir, remaining, [kitName], kitName);
144
+ }
145
+ /**
146
+ * Resolve via search directories (backward-compatible fallback).
147
+ */
148
+ async resolveViaSearchDirs(segments) {
149
+ for (const searchDir of this.searchDirs) {
150
+ if (!fs.existsSync(searchDir))
151
+ continue;
152
+ const result = await this.greedyResolve(searchDir, segments, [], undefined);
153
+ if (result)
154
+ return result;
155
+ }
156
+ return null;
157
+ }
158
+ /**
159
+ * Greedy filesystem walk: try longest match first.
160
+ *
161
+ * Given baseDir and segments [a, b, c]:
162
+ * Try baseDir/a/b/c/recipe.yml
163
+ * Try baseDir/a/b/recipe.yml
164
+ * Try baseDir/a/recipe.yml
165
+ *
166
+ * Longest match with recipe.yml wins. If a directory match with no recipe.yml,
167
+ * it's a group.
168
+ */
169
+ async greedyResolve(baseDir, segments, prefixConsumed, kitName) {
170
+ // Try longest match first
171
+ for (let len = segments.length; len > 0; len--) {
172
+ const candidate = segments.slice(0, len);
173
+ const dirPath = path.join(baseDir, ...candidate);
174
+ if (!fs.existsSync(dirPath))
175
+ continue;
176
+ const stat = fs.statSync(dirPath);
177
+ if (!stat.isDirectory())
178
+ continue;
179
+ const recipeYml = path.join(dirPath, "recipe.yml");
180
+ if (fs.existsSync(recipeYml)) {
181
+ debug("Greedy match (recipe): %s", recipeYml);
182
+ return {
183
+ type: "recipe",
184
+ fullPath: recipeYml,
185
+ kit: kitName,
186
+ cookbook: candidate[0],
187
+ recipe: candidate.length > 1 ? candidate[candidate.length - 1] : undefined,
188
+ consumed: [...prefixConsumed, ...candidate],
189
+ remaining: segments.slice(len),
190
+ };
191
+ }
192
+ // Directory exists but no recipe.yml — potential group
193
+ // Only treat as group if this is the longest match
194
+ if (len === segments.length || len === segments.length - 0) {
195
+ // Check if there are recipes inside (it's a valid group)
196
+ const hasRecipes = this.dirContainsRecipes(dirPath);
197
+ if (hasRecipes) {
198
+ debug("Greedy match (group): %s", dirPath);
199
+ return {
200
+ type: "group",
201
+ fullPath: dirPath,
202
+ kit: kitName,
203
+ cookbook: candidate[0],
204
+ consumed: [...prefixConsumed, ...candidate],
205
+ remaining: segments.slice(len),
206
+ };
207
+ }
208
+ }
209
+ }
210
+ return null;
211
+ }
212
+ /**
213
+ * Check if a directory contains any recipe.yml files (immediate children).
214
+ */
215
+ dirContainsRecipes(dirPath) {
216
+ try {
217
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
218
+ for (const entry of entries) {
219
+ if (entry.isDirectory()) {
220
+ const recipeYml = path.join(dirPath, entry.name, "recipe.yml");
221
+ if (fs.existsSync(recipeYml))
222
+ return true;
223
+ }
224
+ }
225
+ }
226
+ catch {
227
+ // Ignore read errors
228
+ }
229
+ return false;
230
+ }
231
+ /**
232
+ * Resolve kit default: use defaults.cookbook + defaults.recipe
233
+ */
234
+ async resolveKitDefault(kit, kitName) {
235
+ const defaults = kit.config.defaults;
236
+ if (!defaults?.cookbook) {
237
+ debug("Kit has no default cookbook: %s", kitName);
238
+ return null;
239
+ }
240
+ const cookbooks = await discoverCookbooksInKit(kit.dirPath, kit.config.cookbooks || ["./cookbooks/*/cookbook.yml"]);
241
+ const cookbook = cookbooks.get(defaults.cookbook);
242
+ if (!cookbook) {
243
+ debug("Kit default cookbook not found: %s/%s", kitName, defaults.cookbook);
244
+ return null;
245
+ }
246
+ return this.resolveCookbookDefault(cookbook, kitName, defaults.cookbook);
247
+ }
248
+ /**
249
+ * Resolve cookbook default recipe or group.
250
+ */
251
+ async resolveCookbookDefault(cookbook, kitName, cookbookName) {
252
+ const defaultRecipe = cookbook.config.defaults?.recipe;
253
+ if (defaultRecipe) {
254
+ const recipes = await discoverRecipesInCookbook(cookbook.dirPath, cookbook.config.recipes || ["./*/recipe.yml"]);
255
+ const recipeYml = recipes.get(defaultRecipe);
256
+ if (recipeYml) {
257
+ debug("Cookbook default recipe: %s/%s/%s", kitName, cookbookName, defaultRecipe);
258
+ return {
259
+ type: "recipe",
260
+ fullPath: recipeYml,
261
+ kit: kitName,
262
+ cookbook: cookbookName,
263
+ recipe: defaultRecipe,
264
+ consumed: [kitName, cookbookName],
265
+ remaining: [],
266
+ };
267
+ }
268
+ }
269
+ // No default recipe — treat as group
270
+ debug("Cookbook has no default recipe, treating as group: %s/%s", kitName, cookbookName);
271
+ return {
272
+ type: "group",
273
+ fullPath: cookbook.dirPath,
274
+ kit: kitName,
275
+ cookbook: cookbookName,
276
+ consumed: [kitName, cookbookName],
277
+ remaining: [],
278
+ };
279
+ }
280
+ }
281
+ //# sourceMappingURL=path-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../src/parsers/path-resolver.ts"],"names":[],"mappings":"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"}