@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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Tool Implementation for Recipe Step System
|
|
3
|
+
*
|
|
4
|
+
* This tool executes shell commands as part of the recipe execution pipeline.
|
|
5
|
+
* It integrates with the existing shell operations in src/ops/shell.ts.
|
|
6
|
+
*/
|
|
7
|
+
import { renderTemplate } from "#template-engines/jig-engine";
|
|
8
|
+
import { Tool } from "./base.js";
|
|
9
|
+
export class ShellTool extends Tool {
|
|
10
|
+
constructor(name = "shell-tool", options = {}) {
|
|
11
|
+
super("shell", name, options);
|
|
12
|
+
}
|
|
13
|
+
async onValidate(step, context) {
|
|
14
|
+
const errors = [];
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const suggestions = [];
|
|
17
|
+
if (!step.command) {
|
|
18
|
+
errors.push("Shell command is required");
|
|
19
|
+
}
|
|
20
|
+
if (step.cwd && typeof step.cwd !== "string") {
|
|
21
|
+
errors.push("Working directory (cwd) must be a string");
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
isValid: errors.length === 0,
|
|
25
|
+
errors,
|
|
26
|
+
warnings,
|
|
27
|
+
suggestions,
|
|
28
|
+
estimatedExecutionTime: 1000,
|
|
29
|
+
resourceRequirements: {
|
|
30
|
+
memory: 10 * 1024 * 1024,
|
|
31
|
+
disk: 0,
|
|
32
|
+
network: true, // Optimistically assume network might be used
|
|
33
|
+
processes: 1,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async onExecute(step, context, options) {
|
|
38
|
+
const startTime = new Date();
|
|
39
|
+
this.debug("Executing shell command: %s", step.command);
|
|
40
|
+
try {
|
|
41
|
+
// Render command through Jig to support @if/@elseif/@end tags and {{ variable }} interpolation
|
|
42
|
+
const renderContext = this.buildRenderContext(step, context);
|
|
43
|
+
const command = await renderTemplate(step.command, renderContext);
|
|
44
|
+
const cwd = step.cwd ? await renderTemplate(step.cwd, renderContext) : context.projectRoot;
|
|
45
|
+
// shell() returns a Promise<ActionResult> (which is { status: string })
|
|
46
|
+
// but also executes the command. The current shell op implementation seems to be
|
|
47
|
+
// specific to the legacy action system. We might need to adapt it or use simple exec.
|
|
48
|
+
// However, for now let's use it as requested.
|
|
49
|
+
// NOTE: The current ops/shell.ts implementation is tied to legacy ops.
|
|
50
|
+
// It returns a function runner format. Since we want standard behavior, we might
|
|
51
|
+
// rely on node's child_process directly if ops/shell is too specific, but let's try to reuse.
|
|
52
|
+
// Wait, looking at ops/shell.ts, it uses `exec` from context.
|
|
53
|
+
// We need to provide that context.
|
|
54
|
+
// For now, let's implement a direct execution to be safe and avoid legacy baggage,
|
|
55
|
+
// enabling full control over the step result.
|
|
56
|
+
const { exec } = await import("node:child_process");
|
|
57
|
+
const { promisify } = await import("node:util");
|
|
58
|
+
const execAsync = promisify(exec);
|
|
59
|
+
// Strip CLAUDECODE env var to prevent "nested session" errors when
|
|
60
|
+
// running inside Claude Code (the env var makes child processes think
|
|
61
|
+
// they're inside a Claude session and refuse to run).
|
|
62
|
+
const { CLAUDECODE, ...cleanEnv } = process.env;
|
|
63
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
64
|
+
cwd,
|
|
65
|
+
env: { ...cleanEnv, ...step.env },
|
|
66
|
+
});
|
|
67
|
+
const endTime = new Date();
|
|
68
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
69
|
+
return {
|
|
70
|
+
status: "completed",
|
|
71
|
+
stepName: step.name,
|
|
72
|
+
toolType: "shell",
|
|
73
|
+
startTime,
|
|
74
|
+
endTime,
|
|
75
|
+
duration,
|
|
76
|
+
retryCount: 0,
|
|
77
|
+
dependenciesSatisfied: true,
|
|
78
|
+
toolResult: {
|
|
79
|
+
exitCode: 0,
|
|
80
|
+
stdout: stdout.toString(),
|
|
81
|
+
stderr: stderr.toString(),
|
|
82
|
+
},
|
|
83
|
+
output: {
|
|
84
|
+
stdout: stdout.toString(),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const endTime = new Date();
|
|
90
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
91
|
+
return {
|
|
92
|
+
status: "failed",
|
|
93
|
+
stepName: step.name,
|
|
94
|
+
toolType: "shell",
|
|
95
|
+
startTime,
|
|
96
|
+
endTime,
|
|
97
|
+
duration,
|
|
98
|
+
retryCount: 0,
|
|
99
|
+
dependenciesSatisfied: true,
|
|
100
|
+
error: {
|
|
101
|
+
message: error.message,
|
|
102
|
+
code: "SHELL_EXECUTION_ERROR",
|
|
103
|
+
cause: error,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build render context by merging step and recipe variables.
|
|
110
|
+
* This matches the pattern used in template-tool.ts for consistency.
|
|
111
|
+
*/
|
|
112
|
+
buildRenderContext(step, context) {
|
|
113
|
+
// Merge variables: recipe vars < context vars < step vars
|
|
114
|
+
const mergedVars = {
|
|
115
|
+
...context.recipeVariables,
|
|
116
|
+
...context.variables,
|
|
117
|
+
...step.variables,
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
...mergedVars,
|
|
121
|
+
// Recipe-specific context
|
|
122
|
+
recipe: context.recipe,
|
|
123
|
+
step: { name: step.name, description: step.description },
|
|
124
|
+
// Utility functions
|
|
125
|
+
utils: context.utils,
|
|
126
|
+
// Step results for dependency access
|
|
127
|
+
stepResults: context.stepResults ? Object.fromEntries(context.stepResults) : {},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export class ShellToolFactory {
|
|
132
|
+
create(name = "shell-tool", options = {}) {
|
|
133
|
+
return new ShellTool(name, options);
|
|
134
|
+
}
|
|
135
|
+
getToolType() {
|
|
136
|
+
return "shell";
|
|
137
|
+
}
|
|
138
|
+
validateConfig(config) {
|
|
139
|
+
// Shell tool setup config is usually empty, but we can validate options if any
|
|
140
|
+
return {
|
|
141
|
+
isValid: true,
|
|
142
|
+
errors: [],
|
|
143
|
+
warnings: [],
|
|
144
|
+
suggestions: [],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export const shellToolFactory = new ShellToolFactory();
|
|
149
|
+
//# sourceMappingURL=shell-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-tool.js","sourceRoot":"","sources":["../../../src/recipe-engine/tools/shell-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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 { type StepContext, type StepExecutionOptions, type StepResult, type TemplateStep } from "#recipe-engine/types";
|
|
10
|
+
import { Tool, type ToolValidationResult } from "./base.js";
|
|
11
|
+
/**
|
|
12
|
+
* Template Tool for processing template files in the Recipe Step System
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Integration with the Jig template engine
|
|
16
|
+
* - Frontmatter processing (to:, skip_if:, inject:, unless_exists:, force:)
|
|
17
|
+
* - Template discovery and resolution
|
|
18
|
+
* - Variable substitution and context management
|
|
19
|
+
* - File generation with path resolution
|
|
20
|
+
* - Template composition support
|
|
21
|
+
* - Comprehensive error handling and validation
|
|
22
|
+
*/
|
|
23
|
+
export declare class TemplateTool extends Tool<TemplateStep> {
|
|
24
|
+
private templateEnginesInitialized;
|
|
25
|
+
private templateCache;
|
|
26
|
+
constructor(name?: string, options?: Record<string, any>);
|
|
27
|
+
/**
|
|
28
|
+
* Initialize template engines and prepare tool for execution
|
|
29
|
+
*/
|
|
30
|
+
protected onInitialize(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Validate template step configuration
|
|
33
|
+
*/
|
|
34
|
+
protected onValidate(step: TemplateStep, context: StepContext): Promise<ToolValidationResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Execute the template tool
|
|
37
|
+
*/
|
|
38
|
+
protected onExecute(step: TemplateStep, context: StepContext, options?: StepExecutionOptions): Promise<StepResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Tool-specific cleanup logic
|
|
41
|
+
*/
|
|
42
|
+
protected onCleanup(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Resolve template identifier to file path and content
|
|
45
|
+
*/
|
|
46
|
+
private resolveTemplate;
|
|
47
|
+
/**
|
|
48
|
+
* Process template composition (includes, extends)
|
|
49
|
+
*/
|
|
50
|
+
private processTemplateComposition;
|
|
51
|
+
/**
|
|
52
|
+
* Render a template file with frontmatter processing
|
|
53
|
+
*/
|
|
54
|
+
private renderTemplateFile;
|
|
55
|
+
/**
|
|
56
|
+
* Render a template string with the appropriate engine
|
|
57
|
+
*/
|
|
58
|
+
private renderTemplate;
|
|
59
|
+
/**
|
|
60
|
+
* Build render context by merging step and recipe variables.
|
|
61
|
+
*
|
|
62
|
+
* Helpers are registered as Jig globals (not spread into context),
|
|
63
|
+
* so the context only contains data: variables, step results, and utilities.
|
|
64
|
+
*/
|
|
65
|
+
private buildRenderContext;
|
|
66
|
+
/**
|
|
67
|
+
* Check if file should be skipped based on attributes
|
|
68
|
+
*/
|
|
69
|
+
private shouldSkipFile;
|
|
70
|
+
/**
|
|
71
|
+
* Get skip reason for debugging
|
|
72
|
+
*/
|
|
73
|
+
private getSkipReason;
|
|
74
|
+
/**
|
|
75
|
+
* Generate file using existing file operations
|
|
76
|
+
*/
|
|
77
|
+
private generateFile;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Template Tool Factory
|
|
81
|
+
*/
|
|
82
|
+
export declare class TemplateToolFactory {
|
|
83
|
+
create(name?: string, options?: Record<string, any>): TemplateTool;
|
|
84
|
+
getToolType(): "template";
|
|
85
|
+
validateConfig(config: Record<string, any>): ToolValidationResult;
|
|
86
|
+
}
|
|
87
|
+
export declare const templateToolFactory: TemplateToolFactory;
|
|
88
|
+
//# sourceMappingURL=template-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-tool.d.ts","sourceRoot":"","sources":["../../../src/recipe-engine/tools/template-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAEf,KAAK,YAAY,EAEjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAC;AA+C5D;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,SAAQ,IAAI,CAAC,YAAY,CAAC;IACnD,OAAO,CAAC,0BAA0B,CAAS;IAC3C,OAAO,CAAC,aAAa,CAAyC;gBAElD,IAAI,SAAkB,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAIrE;;OAEG;cACsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BtD;;OAEG;cACa,UAAU,CACzB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC;IA+FhC;;OAEG;cACa,SAAS,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,CAAC;IAmKtB;;OAEG;cACsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnD;;OAEG;YACW,eAAe;IAkF7B;;OAEG;YACW,0BAA0B;IA6BxC;;OAEG;YACW,kBAAkB;IAiEhC;;OAEG;YACW,cAAc;IAqB5B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,cAAc;IA2BtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;YACW,YAAY;CAwE1B;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC/B,MAAM,CAAC,IAAI,SAAkB,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,YAAY;IAI/E,WAAW,IAAI,UAAU;IAIzB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,oBAAoB;CAwBjE;AAGD,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|