@hypercli/gen 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/actions/communication.d.ts +201 -0
- package/dist/actions/communication.d.ts.map +1 -0
- package/dist/actions/communication.js +515 -0
- package/dist/actions/communication.js.map +1 -0
- package/dist/actions/decorator.d.ts +22 -0
- package/dist/actions/decorator.d.ts.map +1 -0
- package/dist/actions/decorator.js +110 -0
- package/dist/actions/decorator.js.map +1 -0
- package/dist/actions/executor.d.ts +85 -0
- package/dist/actions/executor.d.ts.map +1 -0
- package/dist/actions/executor.js +289 -0
- package/dist/actions/executor.js.map +1 -0
- package/dist/actions/index.d.ts +14 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +15 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/parameter-resolver.d.ts +54 -0
- package/dist/actions/parameter-resolver.d.ts.map +1 -0
- package/dist/actions/parameter-resolver.js +300 -0
- package/dist/actions/parameter-resolver.js.map +1 -0
- package/dist/actions/registry.d.ts +78 -0
- package/dist/actions/registry.d.ts.map +1 -0
- package/dist/actions/registry.js +221 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/actions/types.d.ts +109 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +31 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/actions/utils.d.ts +42 -0
- package/dist/actions/utils.d.ts.map +1 -0
- package/dist/actions/utils.js +144 -0
- package/dist/actions/utils.js.map +1 -0
- package/dist/ai/ai-collector.d.ts +52 -0
- package/dist/ai/ai-collector.d.ts.map +1 -0
- package/dist/ai/ai-collector.js +64 -0
- package/dist/ai/ai-collector.js.map +1 -0
- package/dist/ai/ai-config.d.ts +230 -0
- package/dist/ai/ai-config.d.ts.map +1 -0
- package/dist/ai/ai-config.js +8 -0
- package/dist/ai/ai-config.js.map +1 -0
- package/dist/ai/ai-service.d.ts +66 -0
- package/dist/ai/ai-service.d.ts.map +1 -0
- package/dist/ai/ai-service.js +198 -0
- package/dist/ai/ai-service.js.map +1 -0
- package/dist/ai/ai-variable-resolver.d.ts +59 -0
- package/dist/ai/ai-variable-resolver.d.ts.map +1 -0
- package/dist/ai/ai-variable-resolver.js +219 -0
- package/dist/ai/ai-variable-resolver.js.map +1 -0
- package/dist/ai/context-collector.d.ts +30 -0
- package/dist/ai/context-collector.d.ts.map +1 -0
- package/dist/ai/context-collector.js +158 -0
- package/dist/ai/context-collector.js.map +1 -0
- package/dist/ai/cost-tracker.d.ts +41 -0
- package/dist/ai/cost-tracker.d.ts.map +1 -0
- package/dist/ai/cost-tracker.js +131 -0
- package/dist/ai/cost-tracker.js.map +1 -0
- package/dist/ai/env.d.ts +36 -0
- package/dist/ai/env.d.ts.map +1 -0
- package/dist/ai/env.js +100 -0
- package/dist/ai/env.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +25 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/model-router.d.ts +32 -0
- package/dist/ai/model-router.d.ts.map +1 -0
- package/dist/ai/model-router.js +113 -0
- package/dist/ai/model-router.js.map +1 -0
- package/dist/ai/output-validator.d.ts +24 -0
- package/dist/ai/output-validator.d.ts.map +1 -0
- package/dist/ai/output-validator.js +279 -0
- package/dist/ai/output-validator.js.map +1 -0
- package/dist/ai/prompt-assembler.d.ts +30 -0
- package/dist/ai/prompt-assembler.d.ts.map +1 -0
- package/dist/ai/prompt-assembler.js +93 -0
- package/dist/ai/prompt-assembler.js.map +1 -0
- package/dist/ai/prompt-pipeline.d.ts +63 -0
- package/dist/ai/prompt-pipeline.d.ts.map +1 -0
- package/dist/ai/prompt-pipeline.js +119 -0
- package/dist/ai/prompt-pipeline.js.map +1 -0
- package/dist/ai/prompt-template.jig +88 -0
- package/dist/ai/transports/api-transport.d.ts +12 -0
- package/dist/ai/transports/api-transport.d.ts.map +1 -0
- package/dist/ai/transports/api-transport.js +86 -0
- package/dist/ai/transports/api-transport.js.map +1 -0
- package/dist/ai/transports/command-transport.d.ts +20 -0
- package/dist/ai/transports/command-transport.d.ts.map +1 -0
- package/dist/ai/transports/command-transport.js +203 -0
- package/dist/ai/transports/command-transport.js.map +1 -0
- package/dist/ai/transports/index.d.ts +11 -0
- package/dist/ai/transports/index.d.ts.map +1 -0
- package/dist/ai/transports/index.js +10 -0
- package/dist/ai/transports/index.js.map +1 -0
- package/dist/ai/transports/resolve-transport.d.ts +15 -0
- package/dist/ai/transports/resolve-transport.d.ts.map +1 -0
- package/dist/ai/transports/resolve-transport.js +96 -0
- package/dist/ai/transports/resolve-transport.js.map +1 -0
- package/dist/ai/transports/stdout-transport.d.ts +14 -0
- package/dist/ai/transports/stdout-transport.d.ts.map +1 -0
- package/dist/ai/transports/stdout-transport.js +27 -0
- package/dist/ai/transports/stdout-transport.js.map +1 -0
- package/dist/ai/transports/types.d.ts +77 -0
- package/dist/ai/transports/types.d.ts.map +1 -0
- package/dist/ai/transports/types.js +8 -0
- package/dist/ai/transports/types.js.map +1 -0
- package/dist/commands/cookbook/info.d.ts +22 -0
- package/dist/commands/cookbook/info.d.ts.map +1 -0
- package/dist/commands/cookbook/info.js +217 -0
- package/dist/commands/cookbook/info.js.map +1 -0
- package/dist/commands/cookbook/list.d.ts +20 -0
- package/dist/commands/cookbook/list.d.ts.map +1 -0
- package/dist/commands/cookbook/list.js +133 -0
- package/dist/commands/cookbook/list.js.map +1 -0
- package/dist/commands/gen.d.ts +65 -0
- package/dist/commands/gen.d.ts.map +1 -0
- package/dist/commands/gen.js +478 -0
- package/dist/commands/gen.js.map +1 -0
- package/dist/commands/recipe/info.d.ts +18 -0
- package/dist/commands/recipe/info.d.ts.map +1 -0
- package/dist/commands/recipe/info.js +89 -0
- package/dist/commands/recipe/info.js.map +1 -0
- package/dist/commands/recipe/list.d.ts +29 -0
- package/dist/commands/recipe/list.d.ts.map +1 -0
- package/dist/commands/recipe/list.js +215 -0
- package/dist/commands/recipe/list.js.map +1 -0
- package/dist/commands/recipe/run.d.ts +44 -0
- package/dist/commands/recipe/run.d.ts.map +1 -0
- package/dist/commands/recipe/run.js +239 -0
- package/dist/commands/recipe/run.js.map +1 -0
- package/dist/commands/recipe/validate.d.ts +19 -0
- package/dist/commands/recipe/validate.d.ts.map +1 -0
- package/dist/commands/recipe/validate.js +66 -0
- package/dist/commands/recipe/validate.js.map +1 -0
- package/dist/discovery/generator-discovery.d.ts +130 -0
- package/dist/discovery/generator-discovery.d.ts.map +1 -0
- package/dist/discovery/generator-discovery.js +674 -0
- package/dist/discovery/generator-discovery.js.map +1 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +7 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/hooks/command-not-found.d.ts +18 -0
- package/dist/hooks/command-not-found.d.ts.map +1 -0
- package/dist/hooks/command-not-found.js +182 -0
- package/dist/hooks/command-not-found.js.map +1 -0
- package/dist/hooks/suggest.d.ts +13 -0
- package/dist/hooks/suggest.d.ts.map +1 -0
- package/dist/hooks/suggest.js +28 -0
- package/dist/hooks/suggest.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/base-command.d.ts +26 -0
- package/dist/lib/base-command.d.ts.map +1 -0
- package/dist/lib/base-command.js +24 -0
- package/dist/lib/base-command.js.map +1 -0
- package/dist/lib/flags.d.ts +33 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/flags.js +64 -0
- package/dist/lib/flags.js.map +1 -0
- package/dist/ops/add.d.ts +4 -0
- package/dist/ops/add.d.ts.map +1 -0
- package/dist/ops/add.js +85 -0
- package/dist/ops/add.js.map +1 -0
- package/dist/ops/inject.d.ts +4 -0
- package/dist/ops/inject.d.ts.map +1 -0
- package/dist/ops/inject.js +28 -0
- package/dist/ops/inject.js.map +1 -0
- package/dist/ops/injector.d.ts +4 -0
- package/dist/ops/injector.d.ts.map +1 -0
- package/dist/ops/injector.js +68 -0
- package/dist/ops/injector.js.map +1 -0
- package/dist/ops/result.d.ts +3 -0
- package/dist/ops/result.d.ts.map +1 -0
- package/dist/ops/result.js +8 -0
- package/dist/ops/result.js.map +1 -0
- package/dist/prompts/interactive-prompts.d.ts +152 -0
- package/dist/prompts/interactive-prompts.d.ts.map +1 -0
- package/dist/prompts/interactive-prompts.js +574 -0
- package/dist/prompts/interactive-prompts.js.map +1 -0
- package/dist/recipe-engine/group-executor.d.ts +97 -0
- package/dist/recipe-engine/group-executor.d.ts.map +1 -0
- package/dist/recipe-engine/group-executor.js +293 -0
- package/dist/recipe-engine/group-executor.js.map +1 -0
- package/dist/recipe-engine/index.d.ts +112 -0
- package/dist/recipe-engine/index.d.ts.map +1 -0
- package/dist/recipe-engine/index.js +223 -0
- package/dist/recipe-engine/index.js.map +1 -0
- package/dist/recipe-engine/output-evaluator.d.ts +28 -0
- package/dist/recipe-engine/output-evaluator.d.ts.map +1 -0
- package/dist/recipe-engine/output-evaluator.js +78 -0
- package/dist/recipe-engine/output-evaluator.js.map +1 -0
- package/dist/recipe-engine/recipe-engine.d.ts +227 -0
- package/dist/recipe-engine/recipe-engine.d.ts.map +1 -0
- package/dist/recipe-engine/recipe-engine.js +1036 -0
- package/dist/recipe-engine/recipe-engine.js.map +1 -0
- package/dist/recipe-engine/step-executor.d.ts +172 -0
- package/dist/recipe-engine/step-executor.d.ts.map +1 -0
- package/dist/recipe-engine/step-executor.js +802 -0
- package/dist/recipe-engine/step-executor.js.map +1 -0
- package/dist/recipe-engine/tools/action-tool.d.ts +103 -0
- package/dist/recipe-engine/tools/action-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/action-tool.js +473 -0
- package/dist/recipe-engine/tools/action-tool.js.map +1 -0
- package/dist/recipe-engine/tools/ai-tool.d.ts +26 -0
- package/dist/recipe-engine/tools/ai-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/ai-tool.js +233 -0
- package/dist/recipe-engine/tools/ai-tool.js.map +1 -0
- package/dist/recipe-engine/tools/base.d.ts +214 -0
- package/dist/recipe-engine/tools/base.d.ts.map +1 -0
- package/dist/recipe-engine/tools/base.js +397 -0
- package/dist/recipe-engine/tools/base.js.map +1 -0
- package/dist/recipe-engine/tools/codemod-tool.d.ts +130 -0
- package/dist/recipe-engine/tools/codemod-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/codemod-tool.js +786 -0
- package/dist/recipe-engine/tools/codemod-tool.js.map +1 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.js +130 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.js.map +1 -0
- package/dist/recipe-engine/tools/index.d.ts +126 -0
- package/dist/recipe-engine/tools/index.d.ts.map +1 -0
- package/dist/recipe-engine/tools/index.js +290 -0
- package/dist/recipe-engine/tools/index.js.map +1 -0
- package/dist/recipe-engine/tools/install-tool.d.ts +20 -0
- package/dist/recipe-engine/tools/install-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/install-tool.js +194 -0
- package/dist/recipe-engine/tools/install-tool.js.map +1 -0
- package/dist/recipe-engine/tools/parallel-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/parallel-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/parallel-tool.js +134 -0
- package/dist/recipe-engine/tools/parallel-tool.js.map +1 -0
- package/dist/recipe-engine/tools/patch-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/patch-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/patch-tool.js +248 -0
- package/dist/recipe-engine/tools/patch-tool.js.map +1 -0
- package/dist/recipe-engine/tools/prompt-tool.d.ts +25 -0
- package/dist/recipe-engine/tools/prompt-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/prompt-tool.js +162 -0
- package/dist/recipe-engine/tools/prompt-tool.js.map +1 -0
- package/dist/recipe-engine/tools/query-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/query-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/query-tool.js +249 -0
- package/dist/recipe-engine/tools/query-tool.js.map +1 -0
- package/dist/recipe-engine/tools/recipe-tool.d.ts +103 -0
- package/dist/recipe-engine/tools/recipe-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/recipe-tool.js +617 -0
- package/dist/recipe-engine/tools/recipe-tool.js.map +1 -0
- package/dist/recipe-engine/tools/registry.d.ts +151 -0
- package/dist/recipe-engine/tools/registry.d.ts.map +1 -0
- package/dist/recipe-engine/tools/registry.js +244 -0
- package/dist/recipe-engine/tools/registry.js.map +1 -0
- package/dist/recipe-engine/tools/sequence-tool.d.ts +22 -0
- package/dist/recipe-engine/tools/sequence-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/sequence-tool.js +122 -0
- package/dist/recipe-engine/tools/sequence-tool.js.map +1 -0
- package/dist/recipe-engine/tools/shell-tool.d.ts +25 -0
- package/dist/recipe-engine/tools/shell-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/shell-tool.js +149 -0
- package/dist/recipe-engine/tools/shell-tool.js.map +1 -0
- package/dist/recipe-engine/tools/template-tool.d.ts +88 -0
- package/dist/recipe-engine/tools/template-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/template-tool.js +613 -0
- package/dist/recipe-engine/tools/template-tool.js.map +1 -0
- package/dist/recipe-engine/types.d.ts +963 -0
- package/dist/recipe-engine/types.d.ts.map +1 -0
- package/dist/recipe-engine/types.js +94 -0
- package/dist/recipe-engine/types.js.map +1 -0
- package/dist/template-engines/ai-tags.d.ts +26 -0
- package/dist/template-engines/ai-tags.d.ts.map +1 -0
- package/dist/template-engines/ai-tags.js +233 -0
- package/dist/template-engines/ai-tags.js.map +1 -0
- package/dist/template-engines/index.d.ts +8 -0
- package/dist/template-engines/index.d.ts.map +1 -0
- package/dist/template-engines/index.js +8 -0
- package/dist/template-engines/index.js.map +1 -0
- package/dist/template-engines/jig-engine.d.ts +47 -0
- package/dist/template-engines/jig-engine.d.ts.map +1 -0
- package/dist/template-engines/jig-engine.js +173 -0
- package/dist/template-engines/jig-engine.js.map +1 -0
- package/dist/utils/coerce-value.d.ts +7 -0
- package/dist/utils/coerce-value.d.ts.map +1 -0
- package/dist/utils/coerce-value.js +18 -0
- package/dist/utils/coerce-value.js.map +1 -0
- package/dist/utils/diff.d.ts +8 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +10 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/global-packages.d.ts +11 -0
- package/dist/utils/global-packages.d.ts.map +1 -0
- package/dist/utils/global-packages.js +88 -0
- package/dist/utils/global-packages.js.map +1 -0
- package/dist/utils/pager.d.ts +6 -0
- package/dist/utils/pager.d.ts.map +1 -0
- package/dist/utils/pager.js +41 -0
- package/dist/utils/pager.js.map +1 -0
- package/help/cookbook/info.md +35 -0
- package/help/cookbook/list.md +37 -0
- package/help/gen.md +26 -0
- package/help/recipe/run.md +52 -0
- package/help/recipe/validate.md +51 -0
- package/oclif.manifest.json +580 -0
- package/package.json +120 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Tool Implementation for Recipe Step System
|
|
3
|
+
*
|
|
4
|
+
* This tool processes template files using Hypergen's existing template engines,
|
|
5
|
+
* handles frontmatter processing, and generates files to the filesystem.
|
|
6
|
+
* It integrates seamlessly with the Jig template engine while supporting
|
|
7
|
+
* all existing template features like composition and variable substitution.
|
|
8
|
+
*/
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { ErrorCode, ErrorHandler, HypergenError, } from "@hypercli/core";
|
|
11
|
+
import fm from "front-matter";
|
|
12
|
+
import fs from "fs-extra";
|
|
13
|
+
import addOp from "#ops/add";
|
|
14
|
+
import injectOp from "#ops/inject";
|
|
15
|
+
import { isTemplateStep, } from "#recipe-engine/types";
|
|
16
|
+
import { getJig, renderTemplate as jigRenderTemplate } from "#template-engines/index";
|
|
17
|
+
import { Tool } from "./base.js";
|
|
18
|
+
/**
|
|
19
|
+
* Template Tool for processing template files in the Recipe Step System
|
|
20
|
+
*
|
|
21
|
+
* Features:
|
|
22
|
+
* - Integration with the Jig template engine
|
|
23
|
+
* - Frontmatter processing (to:, skip_if:, inject:, unless_exists:, force:)
|
|
24
|
+
* - Template discovery and resolution
|
|
25
|
+
* - Variable substitution and context management
|
|
26
|
+
* - File generation with path resolution
|
|
27
|
+
* - Template composition support
|
|
28
|
+
* - Comprehensive error handling and validation
|
|
29
|
+
*/
|
|
30
|
+
export class TemplateTool extends Tool {
|
|
31
|
+
templateEnginesInitialized = false;
|
|
32
|
+
templateCache = new Map();
|
|
33
|
+
constructor(name = "template-tool", options = {}) {
|
|
34
|
+
super("template", name, options);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize template engines and prepare tool for execution
|
|
38
|
+
*/
|
|
39
|
+
async onInitialize() {
|
|
40
|
+
this.debug("Initializing template engines");
|
|
41
|
+
try {
|
|
42
|
+
// Use getJig() to reuse the existing singleton rather than
|
|
43
|
+
// creating a fresh instance per tool. This preserves any
|
|
44
|
+
// globals/filters registered before recipe execution.
|
|
45
|
+
getJig();
|
|
46
|
+
this.templateEnginesInitialized = true;
|
|
47
|
+
this.registerResource({
|
|
48
|
+
id: "template-cache",
|
|
49
|
+
type: "cache",
|
|
50
|
+
cleanup: () => {
|
|
51
|
+
this.templateCache.clear();
|
|
52
|
+
},
|
|
53
|
+
metadata: { cacheSize: 0 },
|
|
54
|
+
});
|
|
55
|
+
this.debug("Template engines initialized successfully");
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw ErrorHandler.createError(ErrorCode.INTERNAL_ERROR, `Failed to initialize template engines: ${error instanceof Error ? error.message : String(error)}`, { phase: "initialize", cause: error });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate template step configuration
|
|
63
|
+
*/
|
|
64
|
+
async onValidate(step, context) {
|
|
65
|
+
const errors = [];
|
|
66
|
+
const warnings = [];
|
|
67
|
+
const suggestions = [];
|
|
68
|
+
// Validate step is a template step
|
|
69
|
+
if (!isTemplateStep(step)) {
|
|
70
|
+
errors.push("Step is not a valid TemplateStep");
|
|
71
|
+
return { isValid: false, errors, warnings, suggestions };
|
|
72
|
+
}
|
|
73
|
+
// Validate required fields
|
|
74
|
+
if (!step.template) {
|
|
75
|
+
errors.push("Template identifier is required");
|
|
76
|
+
}
|
|
77
|
+
// Validate template exists and is accessible
|
|
78
|
+
if (step.template) {
|
|
79
|
+
try {
|
|
80
|
+
const resolution = await this.resolveTemplate(step.template, context);
|
|
81
|
+
if (!resolution.metadata.exists) {
|
|
82
|
+
errors.push(`Template file not found: ${step.template}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
errors.push(`Template resolution failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Validate output directory
|
|
90
|
+
if (step.outputDir) {
|
|
91
|
+
if (path.isAbsolute(step.outputDir)) {
|
|
92
|
+
warnings.push("Output directory should be relative to project root");
|
|
93
|
+
}
|
|
94
|
+
const outputPath = path.resolve(context.projectRoot, step.outputDir);
|
|
95
|
+
if (!(await fs.pathExists(path.dirname(outputPath)))) {
|
|
96
|
+
warnings.push(`Output directory parent does not exist: ${path.dirname(outputPath)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Validate exclude patterns
|
|
100
|
+
if (step.exclude) {
|
|
101
|
+
for (const pattern of step.exclude) {
|
|
102
|
+
if (typeof pattern !== "string") {
|
|
103
|
+
errors.push("Exclude patterns must be strings");
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Validate template variables
|
|
109
|
+
if (step.templateConfig?.variables) {
|
|
110
|
+
for (const [key, variable] of Object.entries(step.templateConfig.variables)) {
|
|
111
|
+
if (!variable.type) {
|
|
112
|
+
warnings.push(`Template variable '${key}' is missing type definition`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Performance suggestions
|
|
117
|
+
if (step.templateConfig?.composition?.includes?.length &&
|
|
118
|
+
step.templateConfig.composition.includes.length > 10) {
|
|
119
|
+
suggestions.push("Consider reducing template includes for better performance");
|
|
120
|
+
}
|
|
121
|
+
// Estimate execution time based on template complexity
|
|
122
|
+
let estimatedTime = 100; // Base time in ms
|
|
123
|
+
if (step.templateConfig?.composition?.includes) {
|
|
124
|
+
estimatedTime += step.templateConfig.composition.includes.length * 50;
|
|
125
|
+
}
|
|
126
|
+
if (step.exclude?.length) {
|
|
127
|
+
estimatedTime += step.exclude.length * 10;
|
|
128
|
+
}
|
|
129
|
+
const resourceRequirements = {
|
|
130
|
+
memory: 10 * 1024 * 1024, // 10MB base memory
|
|
131
|
+
disk: 1 * 1024 * 1024, // 1MB estimated disk usage
|
|
132
|
+
network: false,
|
|
133
|
+
processes: 1,
|
|
134
|
+
};
|
|
135
|
+
return {
|
|
136
|
+
isValid: errors.length === 0,
|
|
137
|
+
errors,
|
|
138
|
+
warnings,
|
|
139
|
+
suggestions,
|
|
140
|
+
estimatedExecutionTime: estimatedTime,
|
|
141
|
+
resourceRequirements,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Execute the template tool
|
|
146
|
+
*/
|
|
147
|
+
async onExecute(step, context, options) {
|
|
148
|
+
this.debug("Executing template step: %s", step.name);
|
|
149
|
+
const startTime = new Date();
|
|
150
|
+
const filesCreated = [];
|
|
151
|
+
const filesModified = [];
|
|
152
|
+
const filesDeleted = [];
|
|
153
|
+
try {
|
|
154
|
+
// Ensure template engines are initialized
|
|
155
|
+
if (!this.templateEnginesInitialized) {
|
|
156
|
+
await this.onInitialize();
|
|
157
|
+
}
|
|
158
|
+
// Resolve template
|
|
159
|
+
const templateResolution = await this.resolveTemplate(step.template, context);
|
|
160
|
+
this.debug("Template resolved: %s -> %s", step.template, templateResolution.filePath);
|
|
161
|
+
// Process template composition if configured
|
|
162
|
+
const templateFiles = await this.processTemplateComposition(step, context, templateResolution);
|
|
163
|
+
this.debug("Found %d template files to process", templateFiles.length);
|
|
164
|
+
// Render all template files
|
|
165
|
+
const renderedFiles = [];
|
|
166
|
+
for (const templateFile of templateFiles) {
|
|
167
|
+
const rendered = await this.renderTemplateFile(templateFile, step, context);
|
|
168
|
+
renderedFiles.push(rendered);
|
|
169
|
+
}
|
|
170
|
+
// Filter out skipped files
|
|
171
|
+
const filesToGenerate = renderedFiles.filter((file) => !file.shouldSkip);
|
|
172
|
+
const skippedFiles = renderedFiles.filter((file) => file.shouldSkip);
|
|
173
|
+
this.debug("Processing %d files, skipping %d files", filesToGenerate.length, skippedFiles.length);
|
|
174
|
+
// In collect mode (Pass 1), skip all file generation — templates were
|
|
175
|
+
// rendered only to trigger @ai block collection
|
|
176
|
+
if (context.collectMode) {
|
|
177
|
+
this.debug("Collect mode: skipping file generation (Pass 1)");
|
|
178
|
+
const endTime = new Date();
|
|
179
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
180
|
+
return {
|
|
181
|
+
status: "completed",
|
|
182
|
+
stepName: step.name,
|
|
183
|
+
toolType: "template",
|
|
184
|
+
startTime,
|
|
185
|
+
endTime,
|
|
186
|
+
duration,
|
|
187
|
+
retryCount: 0,
|
|
188
|
+
dependenciesSatisfied: true,
|
|
189
|
+
toolResult: {
|
|
190
|
+
templateName: step.template,
|
|
191
|
+
templatePath: templateResolution.filePath,
|
|
192
|
+
engine: templateResolution.engine,
|
|
193
|
+
filesGenerated: [],
|
|
194
|
+
variables: context.variables,
|
|
195
|
+
},
|
|
196
|
+
output: {
|
|
197
|
+
collectMode: true,
|
|
198
|
+
templatesRendered: renderedFiles.length,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// Generate files
|
|
203
|
+
for (const renderedFile of filesToGenerate) {
|
|
204
|
+
const result = await this.generateFile(renderedFile, step, context, options);
|
|
205
|
+
if (result.status === "added" || result.status === "forced") {
|
|
206
|
+
filesCreated.push(renderedFile.targetPath);
|
|
207
|
+
}
|
|
208
|
+
else if (result.status === "injected") {
|
|
209
|
+
filesModified.push(renderedFile.targetPath);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Update cache metadata
|
|
213
|
+
const cacheResource = this.resources.get("template-cache");
|
|
214
|
+
if (cacheResource) {
|
|
215
|
+
cacheResource.metadata.cacheSize = this.templateCache.size;
|
|
216
|
+
}
|
|
217
|
+
const endTime = new Date();
|
|
218
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
219
|
+
// Create tool-specific result
|
|
220
|
+
const templateResult = {
|
|
221
|
+
templateName: step.template,
|
|
222
|
+
templatePath: templateResolution.filePath,
|
|
223
|
+
engine: templateResolution.engine,
|
|
224
|
+
filesGenerated: filesCreated,
|
|
225
|
+
variables: context.variables,
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
status: "completed",
|
|
229
|
+
stepName: step.name,
|
|
230
|
+
toolType: "template",
|
|
231
|
+
startTime,
|
|
232
|
+
endTime,
|
|
233
|
+
duration,
|
|
234
|
+
retryCount: 0,
|
|
235
|
+
dependenciesSatisfied: true,
|
|
236
|
+
toolResult: templateResult,
|
|
237
|
+
filesCreated,
|
|
238
|
+
filesModified,
|
|
239
|
+
filesDeleted,
|
|
240
|
+
output: {
|
|
241
|
+
templateEngine: templateResolution.engine,
|
|
242
|
+
totalFiles: renderedFiles.length,
|
|
243
|
+
generatedFiles: filesToGenerate.length,
|
|
244
|
+
skippedFiles: skippedFiles.length,
|
|
245
|
+
skippedReasons: skippedFiles.map((f) => ({
|
|
246
|
+
path: f.templatePath,
|
|
247
|
+
reason: f.skipReason,
|
|
248
|
+
})),
|
|
249
|
+
},
|
|
250
|
+
metadata: {
|
|
251
|
+
templateResolution: {
|
|
252
|
+
originalTemplate: step.template,
|
|
253
|
+
resolvedPath: templateResolution.filePath,
|
|
254
|
+
engine: templateResolution.engine,
|
|
255
|
+
},
|
|
256
|
+
performance: {
|
|
257
|
+
cacheHits: 0, // Could be enhanced with cache hit tracking
|
|
258
|
+
templateCompileTime: duration,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
const endTime = new Date();
|
|
265
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
266
|
+
return {
|
|
267
|
+
status: "failed",
|
|
268
|
+
stepName: step.name,
|
|
269
|
+
toolType: "template",
|
|
270
|
+
startTime,
|
|
271
|
+
endTime,
|
|
272
|
+
duration,
|
|
273
|
+
retryCount: 0,
|
|
274
|
+
dependenciesSatisfied: true,
|
|
275
|
+
filesCreated,
|
|
276
|
+
filesModified,
|
|
277
|
+
filesDeleted,
|
|
278
|
+
error: {
|
|
279
|
+
message: error instanceof Error ? error.message : String(error),
|
|
280
|
+
code: error instanceof HypergenError ? error.code : "TEMPLATE_EXECUTION_ERROR",
|
|
281
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
282
|
+
cause: error,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Tool-specific cleanup logic
|
|
289
|
+
*/
|
|
290
|
+
async onCleanup() {
|
|
291
|
+
this.debug("Cleaning up template tool resources");
|
|
292
|
+
this.templateCache.clear();
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Resolve template identifier to file path and content
|
|
296
|
+
*/
|
|
297
|
+
async resolveTemplate(templateId, context) {
|
|
298
|
+
// Check cache first
|
|
299
|
+
const cacheKey = `${templateId}:${context.projectRoot}`;
|
|
300
|
+
const cached = this.templateCache.get(cacheKey);
|
|
301
|
+
if (cached?.metadata.exists) {
|
|
302
|
+
return cached;
|
|
303
|
+
}
|
|
304
|
+
let filePath = "";
|
|
305
|
+
let exists = false;
|
|
306
|
+
let extension = "";
|
|
307
|
+
// Try different resolution strategies
|
|
308
|
+
const resolutionPaths = [
|
|
309
|
+
// Absolute path
|
|
310
|
+
templateId,
|
|
311
|
+
// Relative to project root
|
|
312
|
+
path.resolve(context.projectRoot, templateId),
|
|
313
|
+
// Relative to template path if available (recipe directory)
|
|
314
|
+
context.templatePath ? path.resolve(context.templatePath, templateId) : null,
|
|
315
|
+
// With common extensions
|
|
316
|
+
path.resolve(context.projectRoot, `${templateId}.jig`),
|
|
317
|
+
path.resolve(context.projectRoot, `${templateId}.jig.t`),
|
|
318
|
+
].filter(Boolean);
|
|
319
|
+
this.debug("Resolving template: %s", templateId);
|
|
320
|
+
this.debug(" projectRoot: %s", context.projectRoot);
|
|
321
|
+
this.debug(" templatePath: %s", context.templatePath);
|
|
322
|
+
this.debug(" Trying paths: %o", resolutionPaths);
|
|
323
|
+
for (const candidatePath of resolutionPaths) {
|
|
324
|
+
if (await fs.pathExists(candidatePath)) {
|
|
325
|
+
filePath = candidatePath;
|
|
326
|
+
exists = true;
|
|
327
|
+
extension = path.extname(candidatePath);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (!exists) {
|
|
332
|
+
throw ErrorHandler.createError(ErrorCode.TEMPLATE_NOT_FOUND, `Template not found: ${templateId}`, { template: templateId, path: resolutionPaths.join(", ") });
|
|
333
|
+
}
|
|
334
|
+
// Read template content
|
|
335
|
+
let content;
|
|
336
|
+
let stats;
|
|
337
|
+
try {
|
|
338
|
+
content = await fs.readFile(filePath, "utf8");
|
|
339
|
+
stats = await fs.stat(filePath);
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
throw ErrorHandler.createError(ErrorCode.TEMPLATE_EXECUTION_ERROR, `Failed to read template file: ${filePath}`, { template: templateId, path: filePath, cause: error });
|
|
343
|
+
}
|
|
344
|
+
const resolution = {
|
|
345
|
+
filePath: filePath,
|
|
346
|
+
content,
|
|
347
|
+
engine: "jig",
|
|
348
|
+
metadata: {
|
|
349
|
+
exists: true,
|
|
350
|
+
size: stats.size,
|
|
351
|
+
extension,
|
|
352
|
+
lastModified: stats.mtime,
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
// Cache the resolution
|
|
356
|
+
this.templateCache.set(cacheKey, resolution);
|
|
357
|
+
return resolution;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Process template composition (includes, extends)
|
|
361
|
+
*/
|
|
362
|
+
async processTemplateComposition(step, context, baseTemplate) {
|
|
363
|
+
const templateFiles = [baseTemplate.filePath];
|
|
364
|
+
// Process includes if configured
|
|
365
|
+
if (step.templateConfig?.composition?.includes) {
|
|
366
|
+
for (const include of step.templateConfig.composition.includes) {
|
|
367
|
+
// Evaluate condition if present
|
|
368
|
+
if (include.condition && !context.evaluateCondition(include.condition, context.variables)) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
try {
|
|
372
|
+
const includeResolution = await this.resolveTemplate(include.template, context);
|
|
373
|
+
templateFiles.push(includeResolution.filePath);
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
this.logger.warn(`Failed to resolve include template '${include.template}': ${error instanceof Error ? error.message : String(error)}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return templateFiles;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Render a template file with frontmatter processing
|
|
384
|
+
*/
|
|
385
|
+
async renderTemplateFile(templatePath, step, context) {
|
|
386
|
+
this.debug("Rendering template file: %s", templatePath);
|
|
387
|
+
// Read and parse frontmatter
|
|
388
|
+
const templateContent = await fs.readFile(templatePath, "utf8");
|
|
389
|
+
const { attributes, body } = fm(templateContent, {
|
|
390
|
+
allowUnsafe: true,
|
|
391
|
+
});
|
|
392
|
+
// Merge variables for rendering context
|
|
393
|
+
const renderContext = this.buildRenderContext(step, context, attributes);
|
|
394
|
+
// Render frontmatter attributes
|
|
395
|
+
const renderedAttributes = {};
|
|
396
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
397
|
+
renderedAttributes[key] = await this.renderTemplate(value, renderContext, templatePath);
|
|
398
|
+
}
|
|
399
|
+
// Render template body
|
|
400
|
+
const renderedBody = await this.renderTemplate(body, { ...renderContext, attributes: renderedAttributes }, templatePath);
|
|
401
|
+
// Determine if file should be skipped
|
|
402
|
+
const shouldSkip = this.shouldSkipFile(renderedAttributes, renderContext);
|
|
403
|
+
const skipReason = shouldSkip
|
|
404
|
+
? this.getSkipReason(renderedAttributes, renderContext)
|
|
405
|
+
: undefined;
|
|
406
|
+
// Resolve target path
|
|
407
|
+
const outputRoot = step.outputDir
|
|
408
|
+
? path.resolve(context.projectRoot, step.outputDir)
|
|
409
|
+
: context.projectRoot;
|
|
410
|
+
let targetPath;
|
|
411
|
+
if (renderedAttributes.to) {
|
|
412
|
+
targetPath = path.resolve(outputRoot, renderedAttributes.to);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
// Default: mirror the template's relative path from the templates directory,
|
|
416
|
+
// stripping the .jig extension. e.g. templates/.claude/skills/foo/SKILL.md.jig
|
|
417
|
+
// becomes .claude/skills/foo/SKILL.md in the output root.
|
|
418
|
+
const templatesDir = context.templatePath
|
|
419
|
+
? path.resolve(context.templatePath, "templates")
|
|
420
|
+
: path.dirname(templatePath);
|
|
421
|
+
const relativePath = path.relative(templatesDir, templatePath);
|
|
422
|
+
const outputFileName = relativePath.replace(/\.jig$/, "");
|
|
423
|
+
targetPath = path.resolve(outputRoot, outputFileName);
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
templatePath,
|
|
427
|
+
attributes: renderedAttributes,
|
|
428
|
+
body: renderedBody,
|
|
429
|
+
targetPath,
|
|
430
|
+
shouldSkip,
|
|
431
|
+
skipReason,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Render a template string with the appropriate engine
|
|
436
|
+
*/
|
|
437
|
+
async renderTemplate(template, renderContext, filePath) {
|
|
438
|
+
if (typeof template !== "string") {
|
|
439
|
+
return template;
|
|
440
|
+
}
|
|
441
|
+
try {
|
|
442
|
+
this.debug("Rendering with Jig engine");
|
|
443
|
+
return await jigRenderTemplate(template, renderContext);
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
throw ErrorHandler.createError(ErrorCode.TEMPLATE_EXECUTION_ERROR, `Template rendering failed: ${error instanceof Error ? error.message : String(error)}`, { template: filePath, cause: error });
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Build render context by merging step and recipe variables.
|
|
451
|
+
*
|
|
452
|
+
* Helpers are registered as Jig globals (not spread into context),
|
|
453
|
+
* so the context only contains data: variables, step results, and utilities.
|
|
454
|
+
*/
|
|
455
|
+
buildRenderContext(step, context, attributes) {
|
|
456
|
+
// Merge variables: recipe vars < context vars < step vars
|
|
457
|
+
const mergedVars = {
|
|
458
|
+
...context.recipeVariables,
|
|
459
|
+
...context.variables,
|
|
460
|
+
...step.variables,
|
|
461
|
+
};
|
|
462
|
+
return {
|
|
463
|
+
...mergedVars,
|
|
464
|
+
// Recipe-specific context
|
|
465
|
+
recipe: context.recipe,
|
|
466
|
+
step: { name: step.name, description: step.description },
|
|
467
|
+
// Utility functions
|
|
468
|
+
utils: context.utils,
|
|
469
|
+
// Step results for dependency access
|
|
470
|
+
stepResults: context.stepResults ? Object.fromEntries(context.stepResults) : {},
|
|
471
|
+
// 2-pass AI generation state
|
|
472
|
+
answers: context.answers,
|
|
473
|
+
__hypergenCollectMode: context.collectMode || false,
|
|
474
|
+
// provide() helper — allows templates to export values to subsequent steps
|
|
475
|
+
provide: (key, value) => {
|
|
476
|
+
context.variables[key] = value;
|
|
477
|
+
return "";
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Check if file should be skipped based on attributes
|
|
483
|
+
*/
|
|
484
|
+
shouldSkipFile(attributes, context) {
|
|
485
|
+
// Check skip_if condition
|
|
486
|
+
if (attributes.skip_if) {
|
|
487
|
+
if (attributes.skip_if === true || attributes.skip_if === "true") {
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
// If it's an expression, it should have been evaluated during rendering
|
|
491
|
+
if (typeof attributes.skip_if === "string" && attributes.skip_if !== "false") {
|
|
492
|
+
// Try to evaluate as boolean
|
|
493
|
+
try {
|
|
494
|
+
return Boolean(attributes.skip_if);
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Check unless_exists condition
|
|
502
|
+
if (attributes.unless_exists && attributes.to) {
|
|
503
|
+
const targetPath = path.resolve(context.projectRoot || process.cwd(), attributes.to);
|
|
504
|
+
return fs.existsSync(targetPath);
|
|
505
|
+
}
|
|
506
|
+
return false;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Get skip reason for debugging
|
|
510
|
+
*/
|
|
511
|
+
getSkipReason(attributes, context) {
|
|
512
|
+
if (attributes.skip_if) {
|
|
513
|
+
return "skip_if condition evaluated to true";
|
|
514
|
+
}
|
|
515
|
+
if (attributes.unless_exists && attributes.to) {
|
|
516
|
+
return "unless_exists condition: file already exists";
|
|
517
|
+
}
|
|
518
|
+
return "unknown";
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Generate file using existing file operations
|
|
522
|
+
*/
|
|
523
|
+
async generateFile(renderedFile, step, context, options) {
|
|
524
|
+
if (!renderedFile.targetPath) {
|
|
525
|
+
throw ErrorHandler.createError(ErrorCode.TEMPLATE_MISSING_VARIABLES, 'Template file has no target path (missing "to" attribute)', { template: renderedFile.templatePath });
|
|
526
|
+
}
|
|
527
|
+
// Create rendered action for existing ops
|
|
528
|
+
// Ensure `to` attribute is set — it may have been inferred from the template's
|
|
529
|
+
// relative path rather than specified in frontmatter
|
|
530
|
+
const renderedAction = {
|
|
531
|
+
file: renderedFile.templatePath,
|
|
532
|
+
attributes: {
|
|
533
|
+
...renderedFile.attributes,
|
|
534
|
+
to: renderedFile.attributes.to || renderedFile.targetPath,
|
|
535
|
+
force: step.overwrite || renderedFile.attributes.force || false,
|
|
536
|
+
},
|
|
537
|
+
body: renderedFile.body,
|
|
538
|
+
};
|
|
539
|
+
// Create runner config for ops
|
|
540
|
+
const runnerConfig = {
|
|
541
|
+
logger: context.logger || console,
|
|
542
|
+
cwd: step.outputDir ? path.resolve(context.projectRoot, step.outputDir) : context.projectRoot,
|
|
543
|
+
createPrompter: () => ({
|
|
544
|
+
prompt: async (arg) => ({
|
|
545
|
+
overwrite: step.overwrite || false,
|
|
546
|
+
}),
|
|
547
|
+
}),
|
|
548
|
+
};
|
|
549
|
+
// Create args object for ops (includes dry run flag)
|
|
550
|
+
const opArgs = {
|
|
551
|
+
...context.variables,
|
|
552
|
+
dry: options?.dryRun || context.dryRun || false,
|
|
553
|
+
};
|
|
554
|
+
try {
|
|
555
|
+
// Use inject operation if inject attribute is present
|
|
556
|
+
if (renderedFile.attributes.inject) {
|
|
557
|
+
this.debug("Injecting content into file: %s", renderedFile.targetPath);
|
|
558
|
+
const result = await injectOp(renderedAction, opArgs, runnerConfig);
|
|
559
|
+
return { status: result.status || "injected" };
|
|
560
|
+
}
|
|
561
|
+
// Use add operation for file creation
|
|
562
|
+
this.debug("Adding/creating file: %s", renderedFile.targetPath);
|
|
563
|
+
const result = await addOp(renderedAction, opArgs, runnerConfig);
|
|
564
|
+
return { status: result.status || "added" };
|
|
565
|
+
}
|
|
566
|
+
catch (error) {
|
|
567
|
+
// For testing purposes, if it's a simple write operation, try direct file write
|
|
568
|
+
if (options?.dryRun || context.dryRun) {
|
|
569
|
+
return { status: "added" };
|
|
570
|
+
}
|
|
571
|
+
throw ErrorHandler.createError(ErrorCode.TEMPLATE_EXECUTION_ERROR, `Failed to generate file: ${renderedFile.targetPath}. Error: ${error instanceof Error ? error.message : String(error)}`, {
|
|
572
|
+
template: renderedFile.templatePath,
|
|
573
|
+
path: renderedFile.targetPath,
|
|
574
|
+
cause: error,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Template Tool Factory
|
|
581
|
+
*/
|
|
582
|
+
export class TemplateToolFactory {
|
|
583
|
+
create(name = "template-tool", options = {}) {
|
|
584
|
+
return new TemplateTool(name, options);
|
|
585
|
+
}
|
|
586
|
+
getToolType() {
|
|
587
|
+
return "template";
|
|
588
|
+
}
|
|
589
|
+
validateConfig(config) {
|
|
590
|
+
const errors = [];
|
|
591
|
+
const warnings = [];
|
|
592
|
+
const suggestions = [];
|
|
593
|
+
// Validate template engine configuration
|
|
594
|
+
if (config.templateEngineConfig) {
|
|
595
|
+
if (typeof config.templateEngineConfig !== "object") {
|
|
596
|
+
errors.push("templateEngineConfig must be an object");
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// Validate cache settings
|
|
600
|
+
if (config.cacheEnabled !== undefined && typeof config.cacheEnabled !== "boolean") {
|
|
601
|
+
warnings.push("cacheEnabled should be a boolean");
|
|
602
|
+
}
|
|
603
|
+
return {
|
|
604
|
+
isValid: errors.length === 0,
|
|
605
|
+
errors,
|
|
606
|
+
warnings,
|
|
607
|
+
suggestions,
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
// Export default instance
|
|
612
|
+
export const templateToolFactory = new TemplateToolFactory();
|
|
613
|
+
//# sourceMappingURL=template-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-tool.js","sourceRoot":"","sources":["../../../src/recipe-engine/tools/template-tool.ts"],"names":[],"mappings":"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"}
|