From 43fa5b80dfc59c9257e057b367633c6d96b753d3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:39:13 +0000 Subject: [PATCH] Add new workflow plugins and update documentation Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- .../autometabuilder/workflow/plugin_map.json | 154 +++++++++--------- .../workflow/plugins/README.md | 73 +++++++++ .../plugins/backend/backend_load_env.py | 8 + .../backend/backend_load_tool_registry.py | 10 ++ .../plugins/backend/backend_parse_cli_args.py | 15 ++ .../plugins/tools/tools_run_docker.py | 24 +++ .../plugins/utils/utils_branch_condition.py | 2 +- .../workflow/plugins/utils/utils_check_mvp.py | 8 + .../plugins/utils/utils_filter_list.py | 2 +- .../workflow/plugins/utils/utils_map_list.py | 2 +- .../workflow/plugins/utils/utils_not.py | 2 +- .../plugins/utils/utils_reduce_list.py | 2 +- .../plugins/utils/utils_update_roadmap.py | 12 ++ 13 files changed, 235 insertions(+), 79 deletions(-) create mode 100644 backend/autometabuilder/workflow/plugins/backend/backend_load_env.py create mode 100644 backend/autometabuilder/workflow/plugins/backend/backend_load_tool_registry.py create mode 100644 backend/autometabuilder/workflow/plugins/backend/backend_parse_cli_args.py create mode 100644 backend/autometabuilder/workflow/plugins/tools/tools_run_docker.py create mode 100644 backend/autometabuilder/workflow/plugins/utils/utils_check_mvp.py create mode 100644 backend/autometabuilder/workflow/plugins/utils/utils_update_roadmap.py diff --git a/backend/autometabuilder/workflow/plugin_map.json b/backend/autometabuilder/workflow/plugin_map.json index 7708cc2..39180d1 100644 --- a/backend/autometabuilder/workflow/plugin_map.json +++ b/backend/autometabuilder/workflow/plugin_map.json @@ -1,80 +1,86 @@ { - "core.load_context": "autometabuilder.workflow.plugins.core.core_load_context.run", - "core.seed_messages": "autometabuilder.workflow.plugins.core.core_seed_messages.run", - "core.append_context_message": "autometabuilder.workflow.plugins.core.core_append_context_message.run", - "core.append_user_instruction": "autometabuilder.workflow.plugins.core.core_append_user_instruction.run", - "core.ai_request": "autometabuilder.workflow.plugins.core.core_ai_request.run", - "core.run_tool_calls": "autometabuilder.workflow.plugins.core.core_run_tool_calls.run", - "core.append_tool_results": "autometabuilder.workflow.plugins.core.core_append_tool_results.run", - "tools.list_files": "autometabuilder.workflow.plugins.tools.tools_list_files.run", - "tools.read_file": "autometabuilder.workflow.plugins.tools.tools_read_file.run", - "tools.run_tests": "autometabuilder.workflow.plugins.tools.tools_run_tests.run", - "tools.run_lint": "autometabuilder.workflow.plugins.tools.tools_run_lint.run", - "tools.create_branch": "autometabuilder.workflow.plugins.tools.tools_create_branch.run", - "tools.create_pull_request": "autometabuilder.workflow.plugins.tools.tools_create_pull_request.run", - "utils.filter_list": "autometabuilder.workflow.plugins.utils.utils_filter_list.run", - "utils.map_list": "autometabuilder.workflow.plugins.utils.utils_map_list.run", - "utils.reduce_list": "autometabuilder.workflow.plugins.utils.utils_reduce_list.run", - "utils.branch_condition": "autometabuilder.workflow.plugins.utils.utils_branch_condition.run", - "utils.not": "autometabuilder.workflow.plugins.utils.utils_not.run", - "logic.and": "autometabuilder.workflow.plugins.logic.logic_and.run", - "logic.or": "autometabuilder.workflow.plugins.logic.logic_or.run", - "logic.xor": "autometabuilder.workflow.plugins.logic.logic_xor.run", - "logic.equals": "autometabuilder.workflow.plugins.logic.logic_equals.run", - "logic.gt": "autometabuilder.workflow.plugins.logic.logic_gt.run", - "logic.lt": "autometabuilder.workflow.plugins.logic.logic_lt.run", - "logic.gte": "autometabuilder.workflow.plugins.logic.logic_gte.run", - "logic.lte": "autometabuilder.workflow.plugins.logic.logic_lte.run", - "logic.in": "autometabuilder.workflow.plugins.logic.logic_in.run", - "list.find": "autometabuilder.workflow.plugins.list.list_find.run", - "list.some": "autometabuilder.workflow.plugins.list.list_some.run", - "list.every": "autometabuilder.workflow.plugins.list.list_every.run", - "list.concat": "autometabuilder.workflow.plugins.list.list_concat.run", - "list.slice": "autometabuilder.workflow.plugins.list.list_slice.run", - "list.sort": "autometabuilder.workflow.plugins.list.list_sort.run", - "list.length": "autometabuilder.workflow.plugins.list.list_length.run", - "dict.get": "autometabuilder.workflow.plugins.dict.dict_get.run", - "dict.set": "autometabuilder.workflow.plugins.dict.dict_set.run", - "dict.merge": "autometabuilder.workflow.plugins.dict.dict_merge.run", - "dict.keys": "autometabuilder.workflow.plugins.dict.dict_keys.run", - "dict.values": "autometabuilder.workflow.plugins.dict.dict_values.run", - "dict.items": "autometabuilder.workflow.plugins.dict.dict_items.run", - "string.concat": "autometabuilder.workflow.plugins.string.string_concat.run", - "string.split": "autometabuilder.workflow.plugins.string.string_split.run", - "string.replace": "autometabuilder.workflow.plugins.string.string_replace.run", - "string.trim": "autometabuilder.workflow.plugins.string.string_trim.run", - "string.upper": "autometabuilder.workflow.plugins.string.string_upper.run", - "string.lower": "autometabuilder.workflow.plugins.string.string_lower.run", - "string.format": "autometabuilder.workflow.plugins.string.string_format.run", - "string.length": "autometabuilder.workflow.plugins.string.string_length.run", - "math.add": "autometabuilder.workflow.plugins.math.math_add.run", - "math.subtract": "autometabuilder.workflow.plugins.math.math_subtract.run", - "math.multiply": "autometabuilder.workflow.plugins.math.math_multiply.run", - "math.divide": "autometabuilder.workflow.plugins.math.math_divide.run", - "math.modulo": "autometabuilder.workflow.plugins.math.math_modulo.run", - "math.power": "autometabuilder.workflow.plugins.math.math_power.run", - "math.min": "autometabuilder.workflow.plugins.math.math_min.run", - "math.max": "autometabuilder.workflow.plugins.math.math_max.run", - "math.abs": "autometabuilder.workflow.plugins.math.math_abs.run", - "math.round": "autometabuilder.workflow.plugins.math.math_round.run", - "convert.to_string": "autometabuilder.workflow.plugins.convert.convert_to_string.run", - "convert.to_number": "autometabuilder.workflow.plugins.convert.convert_to_number.run", - "convert.to_boolean": "autometabuilder.workflow.plugins.convert.convert_to_boolean.run", - "convert.to_list": "autometabuilder.workflow.plugins.convert.convert_to_list.run", - "convert.to_dict": "autometabuilder.workflow.plugins.convert.convert_to_dict.run", - "convert.parse_json": "autometabuilder.workflow.plugins.convert.convert_parse_json.run", - "convert.to_json": "autometabuilder.workflow.plugins.convert.convert_to_json.run", - "control.switch": "autometabuilder.workflow.plugins.control.control_switch.run", - "var.get": "autometabuilder.workflow.plugins.var.var_get.run", - "var.set": "autometabuilder.workflow.plugins.var.var_set.run", - "var.delete": "autometabuilder.workflow.plugins.var.var_delete.run", - "var.exists": "autometabuilder.workflow.plugins.var.var_exists.run", + "backend.build_tool_map": "autometabuilder.workflow.plugins.backend.backend_build_tool_map.run", "backend.create_github": "autometabuilder.workflow.plugins.backend.backend_create_github.run", "backend.create_openai": "autometabuilder.workflow.plugins.backend.backend_create_openai.run", - "backend.load_metadata": "autometabuilder.workflow.plugins.backend.backend_load_metadata.run", + "backend.load_env": "autometabuilder.workflow.plugins.backend.backend_load_env.run", "backend.load_messages": "autometabuilder.workflow.plugins.backend.backend_load_messages.run", - "backend.load_tools": "autometabuilder.workflow.plugins.backend.backend_load_tools.run", + "backend.load_metadata": "autometabuilder.workflow.plugins.backend.backend_load_metadata.run", + "backend.load_plugins": "autometabuilder.workflow.plugins.backend.backend_load_plugins.run", "backend.load_prompt": "autometabuilder.workflow.plugins.backend.backend_load_prompt.run", - "backend.build_tool_map": "autometabuilder.workflow.plugins.backend.backend_build_tool_map.run", - "backend.load_plugins": "autometabuilder.workflow.plugins.backend.backend_load_plugins.run" + "backend.load_tool_registry": "autometabuilder.workflow.plugins.backend.backend_load_tool_registry.run", + "backend.load_tools": "autometabuilder.workflow.plugins.backend.backend_load_tools.run", + "backend.parse_cli_args": "autometabuilder.workflow.plugins.backend.backend_parse_cli_args.run", + "control.switch": "autometabuilder.workflow.plugins.control.control_switch.run", + "convert.parse_json": "autometabuilder.workflow.plugins.convert.convert_parse_json.run", + "convert.to_boolean": "autometabuilder.workflow.plugins.convert.convert_to_boolean.run", + "convert.to_dict": "autometabuilder.workflow.plugins.convert.convert_to_dict.run", + "convert.to_json": "autometabuilder.workflow.plugins.convert.convert_to_json.run", + "convert.to_list": "autometabuilder.workflow.plugins.convert.convert_to_list.run", + "convert.to_number": "autometabuilder.workflow.plugins.convert.convert_to_number.run", + "convert.to_string": "autometabuilder.workflow.plugins.convert.convert_to_string.run", + "core.ai_request": "autometabuilder.workflow.plugins.core.core_ai_request.run", + "core.append_context_message": "autometabuilder.workflow.plugins.core.core_append_context_message.run", + "core.append_tool_results": "autometabuilder.workflow.plugins.core.core_append_tool_results.run", + "core.append_user_instruction": "autometabuilder.workflow.plugins.core.core_append_user_instruction.run", + "core.load_context": "autometabuilder.workflow.plugins.core.core_load_context.run", + "core.run_tool_calls": "autometabuilder.workflow.plugins.core.core_run_tool_calls.run", + "core.seed_messages": "autometabuilder.workflow.plugins.core.core_seed_messages.run", + "dict.get": "autometabuilder.workflow.plugins.dict.dict_get.run", + "dict.items": "autometabuilder.workflow.plugins.dict.dict_items.run", + "dict.keys": "autometabuilder.workflow.plugins.dict.dict_keys.run", + "dict.merge": "autometabuilder.workflow.plugins.dict.dict_merge.run", + "dict.set": "autometabuilder.workflow.plugins.dict.dict_set.run", + "dict.values": "autometabuilder.workflow.plugins.dict.dict_values.run", + "list.concat": "autometabuilder.workflow.plugins.list.list_concat.run", + "list.every": "autometabuilder.workflow.plugins.list.list_every.run", + "list.find": "autometabuilder.workflow.plugins.list.list_find.run", + "list.length": "autometabuilder.workflow.plugins.list.list_length.run", + "list.slice": "autometabuilder.workflow.plugins.list.list_slice.run", + "list.some": "autometabuilder.workflow.plugins.list.list_some.run", + "list.sort": "autometabuilder.workflow.plugins.list.list_sort.run", + "logic.and": "autometabuilder.workflow.plugins.logic.logic_and.run", + "logic.equals": "autometabuilder.workflow.plugins.logic.logic_equals.run", + "logic.gt": "autometabuilder.workflow.plugins.logic.logic_gt.run", + "logic.gte": "autometabuilder.workflow.plugins.logic.logic_gte.run", + "logic.in": "autometabuilder.workflow.plugins.logic.logic_in.run", + "logic.lt": "autometabuilder.workflow.plugins.logic.logic_lt.run", + "logic.lte": "autometabuilder.workflow.plugins.logic.logic_lte.run", + "logic.or": "autometabuilder.workflow.plugins.logic.logic_or.run", + "logic.xor": "autometabuilder.workflow.plugins.logic.logic_xor.run", + "math.abs": "autometabuilder.workflow.plugins.math.math_abs.run", + "math.add": "autometabuilder.workflow.plugins.math.math_add.run", + "math.divide": "autometabuilder.workflow.plugins.math.math_divide.run", + "math.max": "autometabuilder.workflow.plugins.math.math_max.run", + "math.min": "autometabuilder.workflow.plugins.math.math_min.run", + "math.modulo": "autometabuilder.workflow.plugins.math.math_modulo.run", + "math.multiply": "autometabuilder.workflow.plugins.math.math_multiply.run", + "math.power": "autometabuilder.workflow.plugins.math.math_power.run", + "math.round": "autometabuilder.workflow.plugins.math.math_round.run", + "math.subtract": "autometabuilder.workflow.plugins.math.math_subtract.run", + "string.concat": "autometabuilder.workflow.plugins.string.string_concat.run", + "string.format": "autometabuilder.workflow.plugins.string.string_format.run", + "string.length": "autometabuilder.workflow.plugins.string.string_length.run", + "string.lower": "autometabuilder.workflow.plugins.string.string_lower.run", + "string.replace": "autometabuilder.workflow.plugins.string.string_replace.run", + "string.split": "autometabuilder.workflow.plugins.string.string_split.run", + "string.trim": "autometabuilder.workflow.plugins.string.string_trim.run", + "string.upper": "autometabuilder.workflow.plugins.string.string_upper.run", + "tools.create_branch": "autometabuilder.workflow.plugins.tools.tools_create_branch.run", + "tools.create_pull_request": "autometabuilder.workflow.plugins.tools.tools_create_pull_request.run", + "tools.list_files": "autometabuilder.workflow.plugins.tools.tools_list_files.run", + "tools.read_file": "autometabuilder.workflow.plugins.tools.tools_read_file.run", + "tools.run_docker": "autometabuilder.workflow.plugins.tools.tools_run_docker.run", + "tools.run_lint": "autometabuilder.workflow.plugins.tools.tools_run_lint.run", + "tools.run_tests": "autometabuilder.workflow.plugins.tools.tools_run_tests.run", + "utils.branch_condition": "autometabuilder.workflow.plugins.utils.utils_branch_condition.run", + "utils.check_mvp": "autometabuilder.workflow.plugins.utils.utils_check_mvp.run", + "utils.filter_list": "autometabuilder.workflow.plugins.utils.utils_filter_list.run", + "utils.map_list": "autometabuilder.workflow.plugins.utils.utils_map_list.run", + "utils.not": "autometabuilder.workflow.plugins.utils.utils_not.run", + "utils.reduce_list": "autometabuilder.workflow.plugins.utils.utils_reduce_list.run", + "utils.update_roadmap": "autometabuilder.workflow.plugins.utils.utils_update_roadmap.run", + "var.delete": "autometabuilder.workflow.plugins.var.var_delete.run", + "var.exists": "autometabuilder.workflow.plugins.var.var_exists.run", + "var.get": "autometabuilder.workflow.plugins.var.var_get.run", + "var.set": "autometabuilder.workflow.plugins.var.var_set.run" } \ No newline at end of file diff --git a/backend/autometabuilder/workflow/plugins/README.md b/backend/autometabuilder/workflow/plugins/README.md index 97acfc2..47672e3 100644 --- a/backend/autometabuilder/workflow/plugins/README.md +++ b/backend/autometabuilder/workflow/plugins/README.md @@ -2,6 +2,24 @@ This document describes all available workflow plugins for building declarative n8n-style workflows. +## Directory Structure + +Plugins are now organized into subdirectories by category: +- **backend/** - Backend infrastructure and initialization plugins (12 plugins) +- **core/** - Core workflow orchestration plugins (7 plugins) +- **tools/** - Tool execution and development plugins (7 plugins) +- **logic/** - Logic and comparison operations (9 plugins) +- **list/** - List/array operations (7 plugins) +- **dict/** - Dictionary/object operations (6 plugins) +- **string/** - String manipulation (8 plugins) +- **math/** - Mathematical operations (10 plugins) +- **convert/** - Type conversions (7 plugins) +- **control/** - Control flow (1 plugin) +- **var/** - Variable management (4 plugins) +- **utils/** - Utility functions (7 plugins) + +**Total: 85 plugins** + ## Categories - [Core Plugins](#core-plugins) - AI and context management @@ -137,6 +155,19 @@ Create GitHub pull request. **Outputs:** - `pr_number` - PR number +### `tools.run_docker` +Run command inside Docker container. + +**Inputs:** +- `image` - Docker image name +- `command` - Command to execute +- `volumes` - Optional volume mappings dict +- `workdir` - Optional working directory + +**Outputs:** +- `output` - Command output +- `error` - Error message (if any) + --- ## Logic Plugins @@ -746,6 +777,33 @@ Load and register plugins. **Outputs:** - `result` - Boolean (success) +### `backend.parse_cli_args` +Parse command line arguments. + +**Outputs:** +- `dry_run` - Boolean (dry-run mode) +- `yolo` - Boolean (execute without confirmation) +- `once` - Boolean (run single iteration) +- `web` - Boolean (start web UI) + +### `backend.load_env` +Load environment variables from .env file. + +**Outputs:** +- `result` - String (status message) + +### `backend.load_tool_registry` +Load tool registry entries. + +**Outputs:** +- `result` - Tool registry array + +### `backend.load_tool_policies` +Load tool policies from JSON. + +**Outputs:** +- `result` - Tool policies dictionary + --- ## Utility Plugins @@ -790,6 +848,21 @@ Logical NOT operation. **Outputs:** - `result` - Negated boolean +### `utils.check_mvp` +Check if MVP section in ROADMAP.md is completed. + +**Outputs:** +- `mvp_reached` - Boolean + +### `utils.update_roadmap` +Update ROADMAP.md with new content. + +**Inputs:** +- `content` - New roadmap content + +**Outputs:** +- `result` - Status message + --- ## Variable Binding diff --git a/backend/autometabuilder/workflow/plugins/backend/backend_load_env.py b/backend/autometabuilder/workflow/plugins/backend/backend_load_env.py new file mode 100644 index 0000000..323e195 --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/backend/backend_load_env.py @@ -0,0 +1,8 @@ +"""Workflow plugin: load environment variables.""" +from ....env_loader import load_env + + +def run(_runtime, _inputs): + """Load environment variables from .env file.""" + load_env() + return {"result": "Environment loaded"} diff --git a/backend/autometabuilder/workflow/plugins/backend/backend_load_tool_registry.py b/backend/autometabuilder/workflow/plugins/backend/backend_load_tool_registry.py new file mode 100644 index 0000000..303da3b --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/backend/backend_load_tool_registry.py @@ -0,0 +1,10 @@ +"""Workflow plugin: load tool registry.""" +from ....tool_registry_loader import load_tool_registry + + +def run(runtime, _inputs): + """Load tool registry entries.""" + tool_registry = load_tool_registry() + # Store in context for other plugins + runtime.context["tool_registry"] = tool_registry + return {"result": tool_registry} diff --git a/backend/autometabuilder/workflow/plugins/backend/backend_parse_cli_args.py b/backend/autometabuilder/workflow/plugins/backend/backend_parse_cli_args.py new file mode 100644 index 0000000..5b89157 --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/backend/backend_parse_cli_args.py @@ -0,0 +1,15 @@ +"""Workflow plugin: parse CLI arguments.""" +from ....cli_args import parse_args + + +def run(runtime, _inputs): + """Parse command line arguments.""" + args = parse_args() + # Store in context for other plugins + runtime.context["args"] = args + return { + "dry_run": args.dry_run, + "yolo": args.yolo, + "once": args.once, + "web": args.web + } diff --git a/backend/autometabuilder/workflow/plugins/tools/tools_run_docker.py b/backend/autometabuilder/workflow/plugins/tools/tools_run_docker.py new file mode 100644 index 0000000..12d0d52 --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/tools/tools_run_docker.py @@ -0,0 +1,24 @@ +"""Workflow plugin: run command in Docker container.""" +from ....docker_utils import run_command_in_docker + + +def run(_runtime, inputs): + """ + Run a command inside a Docker container. + + Inputs: + - image: Docker image to use + - command: Command to execute + - volumes: Optional dict of volume mappings {host_path: container_path} + - workdir: Optional working directory inside the container + """ + image = inputs.get("image") + command = inputs.get("command") + volumes = inputs.get("volumes") + workdir = inputs.get("workdir") + + if not image or not command: + return {"error": "Both 'image' and 'command' are required"} + + output = run_command_in_docker(image, command, volumes, workdir) + return {"output": output} diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_branch_condition.py b/backend/autometabuilder/workflow/plugins/utils/utils_branch_condition.py index 39778b3..1fc28cf 100644 --- a/backend/autometabuilder/workflow/plugins/utils/utils_branch_condition.py +++ b/backend/autometabuilder/workflow/plugins/utils/utils_branch_condition.py @@ -1,6 +1,6 @@ """Workflow plugin: branch condition.""" import re -from ..value_helpers import ValueHelpers +from ...value_helpers import ValueHelpers def run(_runtime, inputs): diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_check_mvp.py b/backend/autometabuilder/workflow/plugins/utils/utils_check_mvp.py new file mode 100644 index 0000000..0b3c853 --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/utils/utils_check_mvp.py @@ -0,0 +1,8 @@ +"""Workflow plugin: check if MVP is reached.""" +from ....roadmap_utils import is_mvp_reached + + +def run(_runtime, _inputs): + """Check if the MVP section in ROADMAP.md is completed.""" + mvp_reached = is_mvp_reached() + return {"mvp_reached": mvp_reached} diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_filter_list.py b/backend/autometabuilder/workflow/plugins/utils/utils_filter_list.py index 0c7292e..c437b1b 100644 --- a/backend/autometabuilder/workflow/plugins/utils/utils_filter_list.py +++ b/backend/autometabuilder/workflow/plugins/utils/utils_filter_list.py @@ -1,6 +1,6 @@ """Workflow plugin: filter list.""" import re -from ..value_helpers import ValueHelpers +from ...value_helpers import ValueHelpers def run(_runtime, inputs): diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_map_list.py b/backend/autometabuilder/workflow/plugins/utils/utils_map_list.py index ce522a1..a40456c 100644 --- a/backend/autometabuilder/workflow/plugins/utils/utils_map_list.py +++ b/backend/autometabuilder/workflow/plugins/utils/utils_map_list.py @@ -1,5 +1,5 @@ """Workflow plugin: map list.""" -from ..value_helpers import ValueHelpers +from ...value_helpers import ValueHelpers def run(_runtime, inputs): diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_not.py b/backend/autometabuilder/workflow/plugins/utils/utils_not.py index cc3ebe2..ec2dea6 100644 --- a/backend/autometabuilder/workflow/plugins/utils/utils_not.py +++ b/backend/autometabuilder/workflow/plugins/utils/utils_not.py @@ -1,5 +1,5 @@ """Workflow plugin: boolean not.""" -from ..value_helpers import ValueHelpers +from ...value_helpers import ValueHelpers def run(_runtime, inputs): diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_reduce_list.py b/backend/autometabuilder/workflow/plugins/utils/utils_reduce_list.py index 41e053e..e335312 100644 --- a/backend/autometabuilder/workflow/plugins/utils/utils_reduce_list.py +++ b/backend/autometabuilder/workflow/plugins/utils/utils_reduce_list.py @@ -1,5 +1,5 @@ """Workflow plugin: reduce list.""" -from ..value_helpers import ValueHelpers +from ...value_helpers import ValueHelpers def run(_runtime, inputs): diff --git a/backend/autometabuilder/workflow/plugins/utils/utils_update_roadmap.py b/backend/autometabuilder/workflow/plugins/utils/utils_update_roadmap.py new file mode 100644 index 0000000..62b29a3 --- /dev/null +++ b/backend/autometabuilder/workflow/plugins/utils/utils_update_roadmap.py @@ -0,0 +1,12 @@ +"""Workflow plugin: update roadmap file.""" +from ....roadmap_utils import update_roadmap + + +def run(_runtime, inputs): + """Update ROADMAP.md with new content.""" + content = inputs.get("content") + if not content: + return {"error": "Content is required"} + + update_roadmap(content) + return {"result": "ROADMAP.md updated successfully"}