From d0f2a77716108169d67696d2d31cf1c212ed291c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:13:55 +0000 Subject: [PATCH 1/3] Initial plan From 486d5b337424e15734f3d4cf6aa20075442a4bc3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:22:14 +0000 Subject: [PATCH 2/3] Fix FBT001: make boolean positional args keyword-only and remove from suppression list Agent-Logs-Url: https://github.com/GitHubSecurityLab/seclab-taskflow-agent/sessions/8c3fabc6-bff8-433a-9338-a8021e49fc4d Co-authored-by: kevinbackhouse <4358136+kevinbackhouse@users.noreply.github.com> --- pyproject.toml | 1 - src/seclab_taskflow_agent/agent.py | 1 + src/seclab_taskflow_agent/mcp_lifecycle.py | 1 + .../mcp_servers/codeql/jsonrpyc/__init__.py | 1 + src/seclab_taskflow_agent/render_utils.py | 2 +- src/seclab_taskflow_agent/runner.py | 13 +++++++++---- src/seclab_taskflow_agent/session.py | 1 + src/seclab_taskflow_agent/template_utils.py | 2 +- 8 files changed, 15 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f6de0e4..4f28fa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,7 +180,6 @@ ignore = [ "A001", # Variable shadows built-in "A002", # Argument shadows built-in "A004", # Import shadows built-in - "FBT001", # Boolean positional arg "FBT002", # Boolean default value "N801", # Class name casing "N802", # Function name casing diff --git a/src/seclab_taskflow_agent/agent.py b/src/seclab_taskflow_agent/agent.py index a7966f2..0d94d49 100644 --- a/src/seclab_taskflow_agent/agent.py +++ b/src/seclab_taskflow_agent/agent.py @@ -160,6 +160,7 @@ def __init__( name: str = "TaskAgent", instructions: str = "", handoffs: list[Any] | None = None, + *, exclude_from_context: bool = False, mcp_servers: list[Any] | None = None, model: str = DEFAULT_MODEL, diff --git a/src/seclab_taskflow_agent/mcp_lifecycle.py b/src/seclab_taskflow_agent/mcp_lifecycle.py index 117f52a..f2f3ac9 100644 --- a/src/seclab_taskflow_agent/mcp_lifecycle.py +++ b/src/seclab_taskflow_agent/mcp_lifecycle.py @@ -45,6 +45,7 @@ def build_mcp_servers( available_tools: AvailableTools, toolboxes: list[str], blocked_tools: list[str] | None = None, + *, headless: bool = False, ) -> list[MCPServerEntry]: """Build MCP server instances for the given toolboxes. diff --git a/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py b/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py index 8d14d96..07a710d 100644 --- a/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py +++ b/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py @@ -664,6 +664,7 @@ def __init__( rpc: RPC, name: str = "watchdog", interval: float = 0.1, + *, daemon: bool = False, start: bool = True, ) -> None: diff --git a/src/seclab_taskflow_agent/render_utils.py b/src/seclab_taskflow_agent/render_utils.py index 7a01850..9539ecb 100644 --- a/src/seclab_taskflow_agent/render_utils.py +++ b/src/seclab_taskflow_agent/render_utils.py @@ -31,7 +31,7 @@ async def flush_async_output(task_id: str) -> None: await render_model_output(data) -async def render_model_output(data: str, log: bool = True, async_task: bool = False, task_id: str | None = None) -> None: +async def render_model_output(data: str, *, log: bool = True, async_task: bool = False, task_id: str | None = None) -> None: """Print model output to the console, optionally buffering for async tasks.""" async with async_output_lock: if async_task and task_id: diff --git a/src/seclab_taskflow_agent/runner.py b/src/seclab_taskflow_agent/runner.py index 5869385..8de7da3 100644 --- a/src/seclab_taskflow_agent/runner.py +++ b/src/seclab_taskflow_agent/runner.py @@ -161,6 +161,7 @@ def _resolve_task_model( async def _build_prompts_to_run( task_prompt: str, + *, repeat_prompt: bool, last_mcp_tool_results: list[str], available_tools: AvailableTools, @@ -309,7 +310,7 @@ async def deploy_task_agents( model_settings = ModelSettings(**model_params) # Build MCP servers and collect server prompts - entries = build_mcp_servers(available_tools, toolboxes, blocked_tools, headless) + entries = build_mcp_servers(available_tools, toolboxes, blocked_tools, headless=headless) mcp_params = mcp_client_params(available_tools, toolboxes) server_prompts = [sp for _, (_, _, sp, _) in mcp_params.items()] @@ -581,11 +582,15 @@ async def on_handoff_hook(context: RunContextWrapper[TContext], agent: Agent[TCo with TmpEnv(env): prompts_to_run: list[str] = await _build_prompts_to_run( - task_prompt, repeat_prompt, last_mcp_tool_results, - available_tools, global_variables, inputs, + task_prompt, + repeat_prompt=repeat_prompt, + last_mcp_tool_results=last_mcp_tool_results, + available_tools=available_tools, + global_variables=global_variables, + inputs=inputs, ) - async def run_prompts(async_task: bool = False, max_concurrent_tasks: int = 5) -> bool: + async def run_prompts(*, async_task: bool = False, max_concurrent_tasks: int = 5) -> bool: if run: await render_model_output("** 🤖🐚 Executing Shell Task\n") try: diff --git a/src/seclab_taskflow_agent/session.py b/src/seclab_taskflow_agent/session.py index 9b77151..142ac60 100644 --- a/src/seclab_taskflow_agent/session.py +++ b/src/seclab_taskflow_agent/session.py @@ -87,6 +87,7 @@ def record_task( self, index: int, name: str, + *, success: bool, tool_results: list[str] | None = None, ) -> None: diff --git a/src/seclab_taskflow_agent/template_utils.py b/src/seclab_taskflow_agent/template_utils.py index 2f21d4a..1508ea8 100644 --- a/src/seclab_taskflow_agent/template_utils.py +++ b/src/seclab_taskflow_agent/template_utils.py @@ -56,7 +56,7 @@ def get_source( raise jinja2.TemplateNotFound(template) -def env_function(var_name: str, default: Optional[str] = None, required: bool = True) -> str: +def env_function(var_name: str, default: Optional[str] = None, *, required: bool = True) -> str: """Jinja2 function to access environment variables. Args: From e0b8d0dbb8f224b53b8e63b4443a883235440a61 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:23:29 +0000 Subject: [PATCH 3/3] Fix FBT001 in scripts/migrate_to_jinja2.py (missed by initial pass) Agent-Logs-Url: https://github.com/GitHubSecurityLab/seclab-taskflow-agent/sessions/3c237b9a-7f89-4863-9650-2c7b11047490 Co-authored-by: kevinbackhouse <4358136+kevinbackhouse@users.noreply.github.com> --- scripts/migrate_to_jinja2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/migrate_to_jinja2.py b/scripts/migrate_to_jinja2.py index 43844f5..cdc062e 100755 --- a/scripts/migrate_to_jinja2.py +++ b/scripts/migrate_to_jinja2.py @@ -21,7 +21,7 @@ class TemplateMigrator: """Migrates custom template syntax to Jinja2.""" - def __init__(self, dry_run: bool = False): + def __init__(self, *, dry_run: bool = False): self.dry_run = dry_run self.transformations: List[Tuple[str, str]] = [] @@ -133,7 +133,7 @@ def _show_diff(self, original: str, migrated: str): print(f" - {orig}") print(f" + {mig}") - def migrate_directory(self, directory: Path, recursive: bool = True) -> int: + def migrate_directory(self, directory: Path, *, recursive: bool = True) -> int: """Migrate all YAML files in directory. Returns: