Feature: Automation Profile CLI guards coverage boost As a developer I want to cover the guards-related branches in automation_profile CLI module So that the uncovered lines 91-97 and 194-204 are exercised Background: Given a fresh automation profile CLI runner for guards coverage # ----------------------------------------------------------------- # Direct unit-level coverage of _guards_dict (lines 91-97) # ----------------------------------------------------------------- Scenario: _guards_dict returns all guard fields when guards are present Given an AutomationGuard with max_tool_calls_per_step 10 and max_total_cost 50.0 When I call _guards_dict with the guard object Then the guards dict should contain key "max_tool_calls_per_step" with value 10 And the guards dict should contain key "max_total_cost" with value 50.0 And the guards dict should contain key "tool_allowlist" And the guards dict should contain key "tool_denylist" And the guards dict should contain key "require_approval_for_writes" And the guards dict should contain key "require_approval_for_apply" Scenario: _guards_dict returns None when guards are None When I call _guards_dict with None Then the guards dict result should be None Scenario: _guards_dict populates allowlist and denylist from guard Given an AutomationGuard with tool_allowlist "read_file,write_file" and tool_denylist "rm_rf" When I call _guards_dict with the guard object Then the guards dict tool_allowlist should be "read_file,write_file" And the guards dict tool_denylist should be "rm_rf" # ----------------------------------------------------------------- # _profile_spec_dict includes guards (lines 91-97 via indirect call) # ----------------------------------------------------------------- Scenario: _profile_spec_dict includes populated guards for profile with guards Given an AutomationProfile with guards having require_approval_for_writes true When I call _profile_spec_dict with the guarded profile Then the profile spec dict guards should not be None And the profile spec dict guards should have "require_approval_for_writes" as true # ----------------------------------------------------------------- # _print_profile rich format with guards (lines 194-204) # ----------------------------------------------------------------- Scenario: Show profile with guards in rich format displays guard details Given a custom guarded profile "acme/guarded" is stored in the repo When I run automation-profile show "acme/guarded" in rich format Then the guards coverage show command should succeed And the guards coverage output should contain "Guards" And the guards coverage output should contain "max_tool_calls_per_step" And the guards coverage output should contain "require_approval_for_writes" And the guards coverage output should contain "require_approval_for_apply" Scenario: Add profile with guards config in rich format displays guard details Given a YAML config file for a guarded profile "acme/newguarded" When I run automation-profile add with the guarded config file Then the guards coverage add command should succeed And the guards coverage output should contain "Guards" And the guards coverage output should contain "max_tool_calls_per_step" And the guards coverage output should contain "tool_allowlist" And the guards coverage output should contain "tool_denylist" Scenario: Show profile with guards in JSON format includes guards data Given a custom guarded profile "acme/guardedjson" is stored in the repo When I run automation-profile show "acme/guardedjson" with format "json" Then the guards coverage show command should succeed And the guards coverage output should contain "max_tool_calls_per_step" And the guards coverage output should contain "require_approval_for_writes" Scenario: Remove guarded profile with --format json includes guards in output Given a custom guarded profile "acme/guardedremove" is stored in the repo When I run automation-profile remove "acme/guardedremove" with --yes and format "json" Then the guards coverage remove command should succeed And the guards coverage output should contain "max_tool_calls_per_step" And the guards coverage output should contain "removed"