Feature: SEC1 - eval/exec removal security
  As a security-conscious developer
  I want to verify that eval() and exec() are fully removed from config parsing
  So that code injection attacks are impossible

  Scenario: Config with code injection attempt is rejected
    Given a SimpleToolAgent configured with a code injection payload
    When I attempt to process content through the injected agent
    Then the agent should reject the code block with a routing error
    And the error message should mention code blocks are not supported

  Scenario: Malicious transform expression does not execute
    Given the CleverAgents reactive system is available
    When I configure a transform with a malicious eval expression
    Then the transform should be rejected with a routing error
    And the error message should mention unknown transform

  Scenario: Valid config still works after eval removal
    Given a SimpleToolAgent configured with a named operation "uppercase"
    When I process "hello" through the named operation agent
    Then the named operation result should be "HELLO"

  Scenario: Named transform from registry works after eval removal
    Given the CleverAgents reactive system is available
    When I configure a transform with a registered named function "uppercase"
    Then the named transform should produce the uppercased result

  Scenario: Code block with import attempt is rejected
    Given a SimpleToolAgent configured with an import injection payload
    When I attempt to process content through the injected agent
    Then the agent should reject the code block with a routing error

  Scenario: Eval expression mimicking registry name is still rejected
    Given the CleverAgents reactive system is available
    When I configure a transform with expression "lambda x: __import__('os').system('rm -rf /')"
    Then the transform should be rejected with a routing error

  Scenario: Custom registered operation works
    Given a SimpleToolAgent with a custom registered operation "reverse"
    When I process "abcde" through the custom operation agent
    Then the custom operation result should be "edcba"

  Scenario: Custom registered transform works
    Given the CleverAgents reactive system is available
    And a custom transform "double" is registered
    When I configure a transform with a registered named function "double"
    Then the custom transform should produce the doubled result

  Scenario: Config scanner detects eval in content
    Given config content containing "value: eval('hack')"
    When I scan the config content for security violations
    Then the scanner should report at least 1 violation
    And the scanner should report a violation with token "eval("
    And the violation severity should be "CRITICAL"

  Scenario: Config scanner detects exec in content
    Given config content containing "action: exec('import os')"
    When I scan the config content for security violations
    Then the scanner should report at least 1 violation
    And the scanner should report a violation with token "exec("

  Scenario: Config scanner passes clean content
    Given config content containing "name: safe-project"
    When I scan the config content for security violations
    Then the scanner should report 0 violations

  Scenario: Config scanner reports correct line numbers
    Given multiline config content with a violation on line 3
    When I scan the config content for security violations
    Then the scanner should report a violation on line 3

  Scenario: Config safety validation raises on dangerous content
    Given config content containing "run: exec('bad')"
    When I validate the config content for safety
    Then a ConfigurationError should be raised

  Scenario: Config safety validation passes clean content
    Given config content containing "name: safe-project"
    When I validate the config content for safety
    Then no configuration error should be raised

  Scenario: Config scanner skips comment lines
    Given config content containing "# eval('this is just a comment')"
    When I scan the config content for security violations
    Then the scanner should report 0 violations

  Scenario: Config scanner skips INI-style semicolon comment lines
    Given config content containing "; eval('this is an INI comment')"
    When I scan the config content for security violations
    Then the scanner should report 0 violations

  Scenario: Config scanner skips inline comments after hash
    Given config content containing "name: safe-project  # eval('just a note')"
    When I scan the config content for security violations
    Then the scanner should report 0 violations

  Scenario: Config scanner preserves hash inside quoted strings
    Given config content containing "value: \"eval('inside quotes') # not a comment\""
    When I scan the config content for security violations
    Then the scanner should report at least 1 violation
    And the scanner should report a violation with token "eval("

  Scenario: Config scanner detects multiple violation types
    Given config content with eval and subprocess patterns
    When I scan the config content for security violations
    Then the scanner should report at least 2 violations

  Scenario: Config scanner scans multiple files
    Given two temporary config files with violations
    When I scan the config files for security violations
    Then the scanner should report at least 2 violations

  Scenario: Config scanner CLI shows usage when no args given
    When I run the config scanner CLI with no arguments
    Then the scanner CLI should return exit code 2

  Scenario: Config scanner CLI reports violations found
    When I run the config scanner CLI with a dirty temp file
    Then the scanner CLI should return exit code 1
    And the scanner CLI output should contain "violation"

  Scenario: Config scanner CLI reports clean file
    When I run the config scanner CLI with a clean temp file
    Then the scanner CLI should return exit code 0

  Scenario: Config scanner scan_file raises for missing file
    When I scan a non-existent file path
    Then a scanner FileNotFoundError should be raised

  Scenario: Config scanner scan_file handles non-UTF-8 files gracefully
    Given a temporary config file with non-UTF-8 encoding
    When I scan the non-UTF-8 file for violations
    Then the scan should complete without crashing
