From 9fab888b87a25dc01de3246853785e3b0f86070b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Delbrayelle?= Date: Mon, 6 Apr 2026 10:19:24 +0200 Subject: [PATCH 1/3] feat: add @PluginProperty group annotations from taxonomy --- .../io/kestra/plugin/scripts/bun/Commands.java | 3 +++ .../java/io/kestra/plugin/scripts/bun/Script.java | 3 ++- .../io/kestra/plugin/scripts/deno/Commands.java | 3 +++ .../io/kestra/plugin/scripts/deno/Script.java | 3 ++- .../io/kestra/plugin/scripts/go/Commands.java | 3 +++ .../kestra/plugin/scripts/go/CommandsTrigger.java | 6 ++++++ .../java/io/kestra/plugin/scripts/go/Script.java | 3 ++- .../kestra/plugin/scripts/go/ScriptTrigger.java | 6 ++++++ .../io/kestra/plugin/scripts/groovy/Commands.java | 3 +++ .../io/kestra/plugin/scripts/groovy/Script.java | 3 +++ .../io/kestra/plugin/scripts/jbang/Commands.java | 3 +++ .../io/kestra/plugin/scripts/jbang/Script.java | 5 +++++ .../io/kestra/plugin/scripts/julia/Commands.java | 3 +++ .../io/kestra/plugin/scripts/julia/Script.java | 3 ++- .../io/kestra/plugin/scripts/lua/Commands.java | 3 +++ .../java/io/kestra/plugin/scripts/lua/Script.java | 3 ++- .../java/io/kestra/core/tasks/scripts/Node.java | 4 ++++ .../io/kestra/plugin/scripts/node/Commands.java | 3 +++ .../plugin/scripts/node/CommandsTrigger.java | 6 ++++++ .../io/kestra/plugin/scripts/node/Script.java | 3 ++- .../kestra/plugin/scripts/node/ScriptTrigger.java | 6 ++++++ .../io/kestra/plugin/scripts/perl/Commands.java | 3 +++ .../io/kestra/plugin/scripts/perl/Script.java | 3 ++- .../io/kestra/plugin/scripts/php/Commands.java | 3 +++ .../java/io/kestra/plugin/scripts/php/Script.java | 3 ++- .../plugin/scripts/powershell/Commands.java | 4 ++++ .../kestra/plugin/scripts/powershell/Script.java | 4 +++- .../java/io/kestra/core/tasks/scripts/Python.java | 11 ++++++----- .../scripts/python/AbstractPythonExecScript.java | 2 ++ .../scripts/python/AbstractPythonTrigger.java | 4 ++++ .../io/kestra/plugin/scripts/python/Commands.java | 2 ++ .../plugin/scripts/python/CommandsTrigger.java | 3 +++ .../io/kestra/plugin/scripts/python/Script.java | 2 +- .../plugin/scripts/python/ScriptTrigger.java | 3 +++ .../python/internals/PythonBasedPlugin.java | 8 ++++---- .../java/io/kestra/plugin/scripts/r/Commands.java | 3 +++ .../java/io/kestra/plugin/scripts/r/Script.java | 3 ++- .../io/kestra/plugin/scripts/ruby/Commands.java | 3 +++ .../plugin/scripts/ruby/CommandsTrigger.java | 6 ++++++ .../io/kestra/plugin/scripts/ruby/Script.java | 3 ++- .../kestra/plugin/scripts/ruby/ScriptTrigger.java | 6 ++++++ .../java/io/kestra/core/tasks/scripts/Bash.java | 2 +- .../io/kestra/plugin/scripts/shell/Commands.java | 3 +++ .../plugin/scripts/shell/CommandsTrigger.java | 6 ++++++ .../io/kestra/plugin/scripts/shell/Script.java | 3 ++- .../plugin/scripts/shell/ScriptTrigger.java | 6 ++++++ .../kestra/core/tasks/scripts/AbstractBash.java | 15 ++++++++++++--- .../kestra/core/tasks/scripts/ScriptOutput.java | 8 ++++++-- .../plugin/scripts/jvm/AbstractJvmScript.java | 2 ++ .../java/io/kestra/plugin/scripts/jvm/Eval.java | 2 ++ .../kestra/plugin/scripts/jvm/FileTransform.java | 4 ++-- 51 files changed, 178 insertions(+), 30 deletions(-) diff --git a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java index b0a562ab..9a4d1802 100644 --- a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java +++ b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java @@ -56,6 +56,7 @@ inputFiles: index.ts: | import { say } from "cowsay"; +import io.kestra.core.models.annotations.PluginProperty; console.log(say({ text: "I love Kestra!" })); beforeCommands: @@ -70,12 +71,14 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "The commands to run." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Script.java b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Script.java index 40560009..8b148ab4 100644 --- a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Script.java +++ b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Script.java @@ -77,13 +77,14 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "The inline script content. This property is intended for the script file's content as a (multiline) string, not a path to a file." ) @NotNull - @PluginProperty(language = MonacoLanguages.JAVASCRIPT) + @PluginProperty(language = MonacoLanguages.JAVASCRIPT, group = "main") protected Property script; @Override diff --git a/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Commands.java b/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Commands.java index 2c6a3668..509f4d35 100644 --- a/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Commands.java +++ b/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Commands.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -55,12 +56,14 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "Commands to execute", description = "List of Deno commands executed in order inside the container; use beforeCommands to install deps and inputFiles to stage sources. Add --allow-* flags as required by your script." ) + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Script.java b/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Script.java index b671001a..e9ee7522 100644 --- a/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Script.java +++ b/plugin-script-deno/src/main/java/io/kestra/plugin/scripts/deno/Script.java @@ -58,6 +58,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -65,7 +66,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java index 22294b03..a1fe78ce 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java @@ -44,6 +44,7 @@ go_script.go: | package main import ( +import io.kestra.core.models.annotations.PluginProperty; "os" "github.com/go-gota/gota/dataframe" "github.com/go-gota/gota/series" @@ -76,6 +77,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -83,6 +85,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/CommandsTrigger.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/CommandsTrigger.java index 2944cae5..5ac5c073 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/CommandsTrigger.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/CommandsTrigger.java @@ -36,6 +36,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -84,6 +85,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -91,6 +93,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Commands executed on each poll (same semantics as the Go Commands task)." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Schema( @@ -106,6 +109,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -113,6 +117,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -123,6 +128,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Script.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Script.java index 17ae9594..aefb60fc 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Script.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Script.java @@ -76,6 +76,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -83,7 +84,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java index c038e9f4..1eb363ac 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java @@ -64,6 +64,7 @@ script: | package main import "os" +import io.kestra.core.models.annotations.PluginProperty; func main() { // This fails with non-zero exit code. os.Exit(1) @@ -91,6 +92,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -100,6 +102,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property script; @Schema( @@ -110,6 +113,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -119,6 +123,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -128,6 +133,7 @@ When true (default), emit only on a transition from not matching to matching. Wh """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java index c866fb3a..f96ebd7b 100644 --- a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java +++ b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java @@ -57,6 +57,7 @@ groovy -e ' @Grab("info.picocli:picocli:4.7.5") import picocli.CommandLine +import io.kestra.core.models.annotations.PluginProperty; @CommandLine.Command(name = "hello") class HelloWorld implements Runnable { @CommandLine.Parameters(paramLabel = "NAME", defaultValue = "Kestra") @@ -76,12 +77,14 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "The commands to run." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java index 53a5215e..b1d70966 100644 --- a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java +++ b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java @@ -61,6 +61,7 @@ - users.json script: | import groovy.json.JsonOutput +import io.kestra.core.models.annotations.PluginProperty; def url = "https://jsonplaceholder.typicode.com/users" def users = new URL(url).text @@ -75,12 +76,14 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "The inline script content. This property is intended for the script file's content as a (multiline) string, not a path to a file." ) @NotNull + @PluginProperty(group = "main") protected Property script; @Override diff --git a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Commands.java b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Commands.java index 857179fb..d49cd46b 100644 --- a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Commands.java +++ b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -53,6 +54,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -60,6 +62,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java index 17235e79..11e14437 100644 --- a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java +++ b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java @@ -71,6 +71,7 @@ public static void main(String[] args) { import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; +import io.kestra.core.models.annotations.PluginProperty; class classpath_example { @@ -110,6 +111,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -117,6 +119,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Schema( @@ -125,6 +128,7 @@ public class Script extends AbstractExecScript implements RunnableTask extension = Property.ofValue(".java"); @Schema( @@ -133,6 +137,7 @@ public class Script extends AbstractExecScript implements RunnableTask quiet = Property.ofValue(true); @Override diff --git a/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Commands.java b/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Commands.java index 9ba16d5e..fe4c48db 100644 --- a/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Commands.java +++ b/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -62,6 +63,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -69,6 +71,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Script.java b/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Script.java index 28b283c8..2197ab81 100644 --- a/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Script.java +++ b/plugin-script-julia/src/main/java/io/kestra/plugin/scripts/julia/Script.java @@ -65,6 +65,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -72,7 +73,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Commands.java b/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Commands.java index 89b0c8a9..5a1bc94d 100644 --- a/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Commands.java +++ b/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Commands.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -49,12 +50,14 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "Commands to execute", description = "List of Lua commands executed in order inside the container; combine with beforeCommands for setup and inputFiles to stage sources." ) + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Script.java b/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Script.java index edab48e3..c987a313 100644 --- a/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Script.java +++ b/plugin-script-lua/src/main/java/io/kestra/plugin/scripts/lua/Script.java @@ -59,6 +59,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -66,7 +67,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-node/src/main/java/io/kestra/core/tasks/scripts/Node.java b/plugin-script-node/src/main/java/io/kestra/core/tasks/scripts/Node.java index 79ffd6f8..f4e34d78 100644 --- a/plugin-script-node/src/main/java/io/kestra/core/tasks/scripts/Node.java +++ b/plugin-script-node/src/main/java/io/kestra/core/tasks/scripts/Node.java @@ -20,6 +20,7 @@ import lombok.experimental.SuperBuilder; import static io.kestra.core.utils.Rethrow.throwSupplier; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -105,6 +106,7 @@ public class Node extends AbstractBash implements RunnableTask nodePath = Property.ofValue("node"); @Builder.Default @@ -112,6 +114,7 @@ public class Node extends AbstractBash implements RunnableTask npmPath = Property.ofValue("npm"); @Schema( @@ -119,6 +122,7 @@ public class Node extends AbstractBash implements RunnableTask> args; @Override diff --git a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Commands.java b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Commands.java index 82ee3e24..9b7f9e06 100644 --- a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Commands.java +++ b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -59,6 +60,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -66,6 +68,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/CommandsTrigger.java b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/CommandsTrigger.java index 31896b55..d52214c3 100644 --- a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/CommandsTrigger.java +++ b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/CommandsTrigger.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -69,6 +70,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -76,6 +78,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Commands executed on each poll." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Schema( @@ -89,6 +92,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -96,6 +100,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -106,6 +111,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Script.java b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Script.java index 6892a78b..a50d59b1 100644 --- a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Script.java +++ b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/Script.java @@ -177,6 +177,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -184,7 +185,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/ScriptTrigger.java b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/ScriptTrigger.java index 6713e5f0..fc31ee4c 100644 --- a/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/ScriptTrigger.java +++ b/plugin-script-node/src/main/java/io/kestra/plugin/scripts/node/ScriptTrigger.java @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -66,6 +67,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Image used by the Script task to run the inline Node.js script; defaults to 'node'." ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -73,6 +75,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Multi-line script executed on each poll." ) @NotNull + @PluginProperty(group = "main") protected Property script; @Schema( @@ -84,6 +87,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -91,6 +95,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -101,6 +106,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Getter(AccessLevel.NONE) diff --git a/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Commands.java b/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Commands.java index f6df34a3..c529264f 100644 --- a/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Commands.java +++ b/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Commands.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -49,12 +50,14 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "Commands to execute", description = "List of Perl commands executed in order inside the container; combine with beforeCommands for CPAN installs and inputFiles to stage scripts." ) + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Script.java b/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Script.java index 2082df4b..0fd5699a 100644 --- a/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Script.java +++ b/plugin-script-perl/src/main/java/io/kestra/plugin/scripts/perl/Script.java @@ -59,6 +59,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -66,7 +67,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Commands.java b/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Commands.java index dc4f60ae..997bbd5b 100644 --- a/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Commands.java +++ b/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -59,6 +60,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -66,6 +68,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Script.java b/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Script.java index 73e6f441..f094c1c7 100644 --- a/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Script.java +++ b/plugin-script-php/src/main/java/io/kestra/plugin/scripts/php/Script.java @@ -62,6 +62,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -69,7 +70,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Commands.java b/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Commands.java index e9e0e369..6beb032a 100644 --- a/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Commands.java +++ b/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Commands.java @@ -18,6 +18,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -57,6 +58,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -64,12 +66,14 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Builder.Default @Schema( title = "Which interpreter to use." ) + @PluginProperty(group = "execution") protected Property> interpreter = Property.ofValue(List.of("pwsh", "-NoProfile", "-NonInteractive", "-Command")); @Override diff --git a/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Script.java b/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Script.java index 9ee00f08..7bf684e1 100644 --- a/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Script.java +++ b/plugin-script-powershell/src/main/java/io/kestra/plugin/scripts/powershell/Script.java @@ -75,6 +75,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -82,13 +83,14 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Builder.Default @Schema( title = "Which interpreter to use." ) + @PluginProperty(group = "execution") protected Property> interpreter = Property.ofValue(List.of("pwsh", "-NoProfile", "-NonInteractive", "-Command")); @Override diff --git a/plugin-script-python/src/main/java/io/kestra/core/tasks/scripts/Python.java b/plugin-script-python/src/main/java/io/kestra/core/tasks/scripts/Python.java index 66d8b9b7..3afa6a3d 100644 --- a/plugin-script-python/src/main/java/io/kestra/core/tasks/scripts/Python.java +++ b/plugin-script-python/src/main/java/io/kestra/core/tasks/scripts/Python.java @@ -111,7 +111,7 @@ public class Python extends AbstractBash implements RunnableTask { title = "The python interpreter to use", description = "Set the python interpreter path to use" ) - @PluginProperty(dynamic = true) + @PluginProperty(dynamic = true, group = "main") @NotNull @NotEmpty private final String pythonPath = "python"; @@ -120,21 +120,21 @@ public class Python extends AbstractBash implements RunnableTask { title = "Python command args", description = "Arguments list to pass to main python script" ) - @PluginProperty(dynamic = true) + @PluginProperty(dynamic = true, group = "advanced") private List args; @Schema( title = "Requirements are python dependencies to add to the python execution process", description = "Python dependencies list to setup in the virtualenv, in the same format than requirements.txt" ) - @PluginProperty(dynamic = true) + @PluginProperty(dynamic = true, group = "advanced") protected List requirements; @Schema( title = "The commands to run", description = "Default command will be launched with `./bin/python main.py {{args}}`" ) - @PluginProperty(dynamic = true) + @PluginProperty(dynamic = true, group = "main") @NotNull @NotEmpty @Builder.Default @@ -146,7 +146,7 @@ public class Python extends AbstractBash implements RunnableTask { "Disabled it if all the requirements is already on the file system.\n" + "If you disabled the virtual env creation, the `requirements` will be ignored." ) - @PluginProperty + @PluginProperty(group = "advanced") @Builder.Default protected Boolean virtualEnv = true; @@ -157,6 +157,7 @@ public class Python extends AbstractBash implements RunnableTask { allowableValues = { "PIP", "UV" } ) @Builder.Default + @PluginProperty(group = "advanced") protected Property packageManager = Property.ofValue(PackageManagerType.PIP); protected String virtualEnvCommand(RunContext runContext, List requirements) throws IllegalVariableEvaluationException { diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonExecScript.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonExecScript.java index 5ddeb696..3d76f6a8 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonExecScript.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonExecScript.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @EqualsAndHashCode @@ -27,6 +28,7 @@ public abstract class AbstractPythonExecScript extends AbstractExecScript implem "If version inference fails, Kestra uses Python " + DEFAULT_PYTHON_VERSION + " for dependency resolution and cache key computation, while the interpreter available in the container may differ. Set `pythonVersion` explicitly or use a versioned Python image tag to avoid mismatches." ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); protected Property> dependencies; diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonTrigger.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonTrigger.java index 6475fc94..d0484f80 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonTrigger.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/AbstractPythonTrigger.java @@ -19,6 +19,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -38,6 +39,7 @@ public abstract class AbstractPythonTrigger extends AbstractTrigger (or substring fallback) against emitted vars (from ::{"outputs":...}::) and failure logs. """ ) + @PluginProperty(group = "advanced") protected Property exitCondition; @Schema( @@ -45,6 +47,7 @@ public abstract class AbstractPythonTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -55,6 +58,7 @@ If true (default), the trigger emits only on a transition from 'not matching' to """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java index 97559d7e..7682b58c 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java @@ -279,6 +279,7 @@ inputFiles: main.py: | import requests +import io.kestra.core.models.annotations.PluginProperty; from kestra import Kestra response = requests.get('https://google.com') @@ -305,6 +306,7 @@ public class Commands extends AbstractPythonExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/CommandsTrigger.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/CommandsTrigger.java index 637196ec..dcf5a8e1 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/CommandsTrigger.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/CommandsTrigger.java @@ -12,6 +12,7 @@ import lombok.experimental.SuperBuilder; import java.util.List; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -61,6 +62,7 @@ public class CommandsTrigger extends AbstractPythonTrigger { "Defaults to '" + DEFAULT_IMAGE + "'." ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -68,6 +70,7 @@ public class CommandsTrigger extends AbstractPythonTrigger { description = "Commands executed on each poll (same semantics as the Python Commands task)." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Script.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Script.java index 7a6c8baa..3748e867 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Script.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Script.java @@ -314,7 +314,7 @@ public class Script extends AbstractPythonExecScript implements RunnableTask script; @Override diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/ScriptTrigger.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/ScriptTrigger.java index 7ae3dad9..766dda98 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/ScriptTrigger.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/ScriptTrigger.java @@ -10,6 +10,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -57,6 +58,7 @@ public class ScriptTrigger extends AbstractPythonTrigger { description = "Image used by the Script task to run the inline Python script; defaults to '" + DEFAULT_IMAGE + "'." ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -64,6 +66,7 @@ public class ScriptTrigger extends AbstractPythonTrigger { description = "Multi-line script executed on each poll." ) @NotNull + @PluginProperty(group = "main") protected Property script; @Override diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/internals/PythonBasedPlugin.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/internals/PythonBasedPlugin.java index bc811e5f..26424218 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/internals/PythonBasedPlugin.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/internals/PythonBasedPlugin.java @@ -22,7 +22,7 @@ public interface PythonBasedPlugin extends Plugin { List of pip-compatible package specifiers (e.g. `pandas==2.0.0`, `requests>=2.28`) installed via the configured package manager before script execution. """ ) - @PluginProperty + @PluginProperty(group = "advanced") Property> getDependencies(); @Schema( @@ -32,14 +32,14 @@ public interface PythonBasedPlugin extends Plugin { "If it cannot determine the version, the task will default to Python " + DEFAULT_PYTHON_VERSION + " for dependency resolution and cache key computation, while the interpreter available in the container may differ.\n" + "Set this property explicitly or use a versioned Python image tag to avoid version mismatches." ) - @PluginProperty + @PluginProperty(group = "advanced") Property getPythonVersion(); @Schema( title = "Enable Python dependency caching", description = "When enabled, Python dependencies will be cached across task executions. This locks dependency versions and speeds up subsequent runs by avoiding redundant installations." ) - @PluginProperty + @PluginProperty(group = "advanced") Property getDependencyCacheEnabled(); @Schema( @@ -49,6 +49,6 @@ public interface PythonBasedPlugin extends Plugin { "UV automatically falls back to PIP if not available.", allowableValues = { "PIP", "UV" } ) - @PluginProperty + @PluginProperty(group = "advanced") Property getPackageManager(); } diff --git a/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Commands.java b/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Commands.java index fa3bdf8c..f8a24d80 100644 --- a/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Commands.java +++ b/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -61,6 +62,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -68,6 +70,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Script.java b/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Script.java index 269b9ff5..df7d06d1 100644 --- a/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Script.java +++ b/plugin-script-r/src/main/java/io/kestra/plugin/scripts/r/Script.java @@ -154,6 +154,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -161,7 +162,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Commands.java b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Commands.java index 55de7986..14885b3f 100644 --- a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Commands.java +++ b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Commands.java @@ -17,6 +17,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -98,6 +99,7 @@ public class Commands extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -105,6 +107,7 @@ public class Commands extends AbstractExecScript implements RunnableTask> commands; @Override diff --git a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/CommandsTrigger.java b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/CommandsTrigger.java index 2d801fbb..47f2a291 100644 --- a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/CommandsTrigger.java +++ b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/CommandsTrigger.java @@ -27,6 +27,7 @@ import java.util.concurrent.TimeoutException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -77,6 +78,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -84,6 +86,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Commands executed on each poll." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Schema( @@ -97,6 +100,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -104,6 +108,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -114,6 +119,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); // Known limitation: in-memory only — resets when the trigger is rehydrated (e.g. after restart), diff --git a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Script.java b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Script.java index 768b877a..cc8962f5 100644 --- a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Script.java +++ b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/Script.java @@ -99,6 +99,7 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -106,7 +107,7 @@ public class Script extends AbstractExecScript implements RunnableTask script; @Override diff --git a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/ScriptTrigger.java b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/ScriptTrigger.java index 2ed8b2d5..8409292b 100644 --- a/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/ScriptTrigger.java +++ b/plugin-script-ruby/src/main/java/io/kestra/plugin/scripts/ruby/ScriptTrigger.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeoutException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -74,6 +75,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Image used by the Script task to run the inline Ruby script; defaults to 'ruby'." ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -81,6 +83,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Multi-line script executed on each poll." ) @NotNull + @PluginProperty(group = "main") protected Property script; @Schema( @@ -92,6 +95,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -99,6 +103,7 @@ public class ScriptTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -109,6 +114,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); // Known limitation: in-memory only — resets when the trigger is rehydrated (e.g. after restart), diff --git a/plugin-script-shell/src/main/java/io/kestra/core/tasks/scripts/Bash.java b/plugin-script-shell/src/main/java/io/kestra/core/tasks/scripts/Bash.java index 6aff6d83..91518901 100644 --- a/plugin-script-shell/src/main/java/io/kestra/core/tasks/scripts/Bash.java +++ b/plugin-script-shell/src/main/java/io/kestra/core/tasks/scripts/Bash.java @@ -168,7 +168,7 @@ public class Bash extends AbstractBash implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "Shell commands to run." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Override diff --git a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/CommandsTrigger.java b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/CommandsTrigger.java index 7257acfe..f45751da 100644 --- a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/CommandsTrigger.java +++ b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/CommandsTrigger.java @@ -25,6 +25,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -72,6 +73,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -79,6 +81,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Commands executed on each poll (same semantics as the Shell Commands task)." ) @NotNull + @PluginProperty(group = "main") protected Property> commands; @Schema( @@ -94,6 +97,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -101,6 +105,7 @@ public class CommandsTrigger extends AbstractTrigger description = "Interval between polling evaluations." ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -111,6 +116,7 @@ public class CommandsTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/Script.java b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/Script.java index a8e39d52..5ee983d8 100644 --- a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/Script.java +++ b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/Script.java @@ -103,13 +103,14 @@ public class Script extends AbstractExecScript implements RunnableTask containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( title = "The inline script content. This property is intended for the script file's content as a (multiline) string, not a path to a file. To run a command from a file such as `bash myscript.sh` or `python myscript.py`, use the `Commands` task instead." ) @NotNull - @PluginProperty(language = MonacoLanguages.SHELL) + @PluginProperty(language = MonacoLanguages.SHELL, group = "main") protected Property script; @Override diff --git a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/ScriptTrigger.java b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/ScriptTrigger.java index c0b6c1f4..982f4e94 100644 --- a/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/ScriptTrigger.java +++ b/plugin-script-shell/src/main/java/io/kestra/plugin/scripts/shell/ScriptTrigger.java @@ -24,6 +24,7 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -75,6 +76,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") protected Property containerImage = Property.ofValue(DEFAULT_IMAGE); @Schema( @@ -84,6 +86,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property script; @Schema( @@ -94,6 +97,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @NotNull + @PluginProperty(group = "main") protected Property exitCondition; @Schema( @@ -103,6 +107,7 @@ public class ScriptTrigger extends AbstractTrigger """ ) @Builder.Default + @PluginProperty(group = "execution") private final Duration interval = Duration.ofSeconds(60); @Schema( @@ -112,6 +117,7 @@ When true (default), emit only on a transition from not matching to matching. Wh """ ) @Builder.Default + @PluginProperty(group = "advanced") protected Property edge = Property.ofValue(true); @Builder.Default diff --git a/plugin-script/src/main/java/io/kestra/core/tasks/scripts/AbstractBash.java b/plugin-script/src/main/java/io/kestra/core/tasks/scripts/AbstractBash.java index 36ec558c..b95331b5 100644 --- a/plugin-script/src/main/java/io/kestra/core/tasks/scripts/AbstractBash.java +++ b/plugin-script/src/main/java/io/kestra/core/tasks/scripts/AbstractBash.java @@ -44,12 +44,13 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface title = "The task runner." ) @NotNull + @PluginProperty(group = "main") protected Property runner = Property.ofValue(RunnerType.PROCESS); @Schema( title = "Docker options when using the `DOCKER` runner." ) - @PluginProperty + @PluginProperty(group = "advanced") protected DockerOptions dockerOptions; @Builder.Default @@ -57,13 +58,14 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface title = "Interpreter to use when launching the process." ) @NotNull + @PluginProperty(group = "main") protected Property interpreter = Property.ofValue("/bin/sh"); @Builder.Default @Schema( title = "Interpreter arguments to be used." ) - @PluginProperty + @PluginProperty(group = "execution") protected String[] interpreterArgs = { "-c" }; @Builder.Default @@ -73,6 +75,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface "Setting this to `true` helps catch cases where a command fails and the script continues to run anyway." ) @NotNull + @PluginProperty(group = "main") protected Property exitOnFailed = Property.ofValue(true); @Schema( @@ -81,6 +84,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface deprecated = true ) @Deprecated + @PluginProperty(group = "advanced") protected Property> files; @Schema( @@ -89,6 +93,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface deprecated = true ) @Deprecated + @PluginProperty(group = "advanced") protected Property> outputsFiles; @Schema( @@ -98,6 +103,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface "If you add a file with `[\"first\"]`, you can use the special var `echo 1 >> {[ outputFiles.first }}`," + " and on other tasks, you can reference it using `{{ outputs.taskId.outputFiles.first }}`." ) + @PluginProperty(group = "destination") protected Property> outputFiles; @Schema( @@ -109,6 +115,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface "You can reference them in other tasks using `{{ outputs.taskId.outputFiles['myDir/file1.txt'] }}`." ) @Deprecated + @PluginProperty(group = "advanced") protected Property> outputDirs; @Schema( @@ -118,7 +125,7 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface "In both cases, you can either specify the file's content inline, or reference a file from Kestra's internal " + "storage by its URI, e.g. a file from an input, output of a previous task, or a [Namespace File](https://kestra.io/docs/developer-guide/namespace-files)." ) - @PluginProperty( + @PluginProperty(group = "source", additionalProperties = String.class, dynamic = true ) @@ -127,12 +134,14 @@ public abstract class AbstractBash extends Task implements OutputFilesInterface @Schema( title = "One or more additional environment variable(s) to add to the task run." ) + @PluginProperty(group = "execution") protected Property> env; @Schema( title = "Not used anymore, will be removed soon" ) @Deprecated + @PluginProperty(group = "advanced") protected Property warningOnStdErr; @Getter(AccessLevel.NONE) diff --git a/plugin-script/src/main/java/io/kestra/core/tasks/scripts/ScriptOutput.java b/plugin-script/src/main/java/io/kestra/core/tasks/scripts/ScriptOutput.java index 8e9739ad..3689fda4 100644 --- a/plugin-script/src/main/java/io/kestra/core/tasks/scripts/ScriptOutput.java +++ b/plugin-script/src/main/java/io/kestra/core/tasks/scripts/ScriptOutput.java @@ -17,22 +17,26 @@ public class ScriptOutput implements io.kestra.core.models.tasks.Output { @Schema( title = "The value extracted from the output of the commands." ) + @PluginProperty(group = "advanced") private final Map vars; @Schema( title = "The standard output line count." ) + @PluginProperty(group = "advanced") private final int stdOutLineCount; @Schema( title = "The standard error line count." ) + @PluginProperty(group = "advanced") private final int stdErrLineCount; @Schema( title = "The exit code of the whole execution." ) @NotNull + @PluginProperty(group = "main") private final int exitCode; @Schema( @@ -41,12 +45,12 @@ public class ScriptOutput implements io.kestra.core.models.tasks.Output { deprecated = true ) @Deprecated - @PluginProperty(additionalProperties = URI.class) + @PluginProperty(additionalProperties = URI.class, group = "advanced") private final Map files; @Schema( title = "The output files' URIs in Kestra's internal storage." ) - @PluginProperty(additionalProperties = URI.class) + @PluginProperty(additionalProperties = URI.class, group = "destination") private final Map outputFiles; } diff --git a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/AbstractJvmScript.java b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/AbstractJvmScript.java index 4608e94c..56289ef6 100644 --- a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/AbstractJvmScript.java +++ b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/AbstractJvmScript.java @@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -22,6 +23,7 @@ public abstract class AbstractJvmScript extends Task { @Schema( title = "A full script." ) + @PluginProperty(group = "processing") protected Property script; protected String generateScript(RunContext runContext) throws IllegalVariableEvaluationException { diff --git a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/Eval.java b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/Eval.java index 2cf592a8..7acd503b 100644 --- a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/Eval.java +++ b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/Eval.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import lombok.experimental.SuperBuilder; +import io.kestra.core.models.annotations.PluginProperty; @SuperBuilder @ToString @@ -30,6 +31,7 @@ public abstract class Eval extends AbstractJvmScript implements RunnableTask> outputs; protected Eval.Output run(RunContext runContext, String engineName) throws Exception { diff --git a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/FileTransform.java b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/FileTransform.java index f92ce0eb..b14ce770 100644 --- a/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/FileTransform.java +++ b/plugin-script/src/main/java/io/kestra/plugin/scripts/jvm/FileTransform.java @@ -47,7 +47,7 @@ public abstract class FileTransform extends AbstractJvmScript implements Runnabl title = "Source rows", description = "Kestra internal storage URI (kestra://...) or rendered JSON map/list to stream into the script." ) - @PluginProperty(dynamic = true) + @PluginProperty(dynamic = true, group = "main") private String from; @Min(2) @@ -55,7 +55,7 @@ public abstract class FileTransform extends AbstractJvmScript implements Runnabl title = "Concurrent transforms", description = "Number of parallel workers; ordering is not preserved when greater than 1." ) - @PluginProperty + @PluginProperty(group = "advanced") private Integer concurrent; @SuppressWarnings("unchecked") From 4adf26edaecd03ffa9edbd752c09a807e968078c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Delbrayelle?= Date: Mon, 6 Apr 2026 11:41:31 +0200 Subject: [PATCH 2/3] fix: move PluginProperty imports out of code example string literals The annotation script incorrectly inserted import statements inside @Example code blocks (TypeScript and Go examples) in bun/Commands.java, go/Commands.java, and go/ScriptTrigger.java. --- .../src/main/java/io/kestra/plugin/scripts/bun/Commands.java | 2 +- .../src/main/java/io/kestra/plugin/scripts/go/Commands.java | 2 +- .../main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java index 9a4d1802..d4d90694 100644 --- a/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java +++ b/plugin-script-bun/src/main/java/io/kestra/plugin/scripts/bun/Commands.java @@ -5,6 +5,7 @@ import io.kestra.core.exceptions.IllegalVariableEvaluationException; import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; import io.kestra.core.models.tasks.runners.TargetOS; @@ -56,7 +57,6 @@ inputFiles: index.ts: | import { say } from "cowsay"; -import io.kestra.core.models.annotations.PluginProperty; console.log(say({ text: "I love Kestra!" })); beforeCommands: diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java index a1fe78ce..6bce5888 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/Commands.java @@ -5,6 +5,7 @@ import io.kestra.core.exceptions.IllegalVariableEvaluationException; import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; import io.kestra.core.models.tasks.runners.TargetOS; @@ -44,7 +45,6 @@ go_script.go: | package main import ( -import io.kestra.core.models.annotations.PluginProperty; "os" "github.com/go-gota/gota/dataframe" "github.com/go-gota/gota/series" diff --git a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java index 1eb363ac..b7121494 100644 --- a/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java +++ b/plugin-script-go/src/main/java/io/kestra/plugin/scripts/go/ScriptTrigger.java @@ -10,6 +10,7 @@ import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.conditions.ConditionContext; import io.kestra.core.models.executions.Execution; import io.kestra.core.models.property.Property; @@ -64,7 +65,6 @@ script: | package main import "os" -import io.kestra.core.models.annotations.PluginProperty; func main() { // This fails with non-zero exit code. os.Exit(1) From 4850f82586a4c3279a400e237eba4824ded3373e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Delbrayelle?= Date: Mon, 6 Apr 2026 12:07:39 +0200 Subject: [PATCH 3/3] fix: move PluginProperty imports out of code example strings (groovy, jbang, python) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same bug as previous fix — import statements were placed inside @Example code blocks in groovy/Commands.java, groovy/Script.java, jbang/Script.java, and python/Commands.java. --- .../src/main/java/io/kestra/plugin/scripts/groovy/Commands.java | 2 +- .../src/main/java/io/kestra/plugin/scripts/groovy/Script.java | 2 +- .../src/main/java/io/kestra/plugin/scripts/jbang/Script.java | 2 +- .../src/main/java/io/kestra/plugin/scripts/python/Commands.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java index f96ebd7b..63deccf8 100644 --- a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java +++ b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Commands.java @@ -5,6 +5,7 @@ import io.kestra.core.exceptions.IllegalVariableEvaluationException; import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; import io.kestra.core.models.tasks.runners.TargetOS; @@ -57,7 +58,6 @@ groovy -e ' @Grab("info.picocli:picocli:4.7.5") import picocli.CommandLine -import io.kestra.core.models.annotations.PluginProperty; @CommandLine.Command(name = "hello") class HelloWorld implements Runnable { @CommandLine.Parameters(paramLabel = "NAME", defaultValue = "Kestra") diff --git a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java index b1d70966..9e05c67d 100644 --- a/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java +++ b/plugin-script-groovy/src/main/java/io/kestra/plugin/scripts/groovy/Script.java @@ -7,6 +7,7 @@ import io.kestra.core.exceptions.IllegalVariableEvaluationException; import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; import io.kestra.core.models.tasks.runners.TargetOS; @@ -61,7 +62,6 @@ - users.json script: | import groovy.json.JsonOutput -import io.kestra.core.models.annotations.PluginProperty; def url = "https://jsonplaceholder.typicode.com/users" def users = new URL(url).text diff --git a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java index 11e14437..a179b334 100644 --- a/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java +++ b/plugin-script-jbang/src/main/java/io/kestra/plugin/scripts/jbang/Script.java @@ -8,6 +8,7 @@ import io.kestra.core.exceptions.IllegalVariableEvaluationException; import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; import io.kestra.core.models.tasks.runners.TargetOS; @@ -71,7 +72,6 @@ public static void main(String[] args) { import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; -import io.kestra.core.models.annotations.PluginProperty; class classpath_example { diff --git a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java index 7682b58c..091c6821 100644 --- a/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java +++ b/plugin-script-python/src/main/java/io/kestra/plugin/scripts/python/Commands.java @@ -8,6 +8,7 @@ import io.kestra.core.models.annotations.Example; import io.kestra.core.models.annotations.Metric; import io.kestra.core.models.annotations.Plugin; +import io.kestra.core.models.annotations.PluginProperty; import io.kestra.core.models.executions.metrics.Counter; import io.kestra.core.models.property.Property; import io.kestra.core.models.tasks.RunnableTask; @@ -279,7 +280,6 @@ inputFiles: main.py: | import requests -import io.kestra.core.models.annotations.PluginProperty; from kestra import Kestra response = requests.get('https://google.com')