## MODIFIED Requirements

### Requirement: Tool Type Model
The system SHALL provide a `ToolType` model to store tool definitions.

#### Scenario: Model structure
- GIVEN a tool type definition
- THEN the model SHALL have:
  - `id`: UUID primary key
  - `name`: unique string (e.g., "code-server")
  - `display_name`: human-readable string (e.g., "VS Code Server")
  - `description`: optional text
  - `category`: string (e.g., "editor", "notebook")
  - `interface_type`: single string — "web" or "terminal"
  - `requires_port`: boolean indicating if port/tunnel configuration is needed
  - `compose_template`: Docker Compose YAML string
  - `dockerfile_template`: Dockerfile string
  - `definition_type`: string — "compose" or "dockerfile"
  - `required_variables`: list of required template variables
  - `is_builtin`: boolean flag for system-defined types
  - `created_at`/`updated_at`: timestamps

### Requirement: CRUD API Endpoints
The system SHALL provide REST API endpoints for tool type management.

#### Scenario: Create tool type
- GIVEN an admin user
- WHEN they POST /api/tool-types with valid data
- THEN the system creates a new tool type
- AND validates `interface_type` is "web" or "terminal"
- AND validates `requires_port` is boolean
- AND validates the compose template YAML (if definition_type is "compose")
- AND validates all required variables are present in template
- AND returns 201 Created with the new tool type

#### Scenario: Update tool type
- GIVEN an admin user
- WHEN they PUT /api/tool-types/{id} with valid data
- THEN the system updates the tool type
- AND validates `interface_type` is "web" or "terminal" if provided
- AND re-validates the compose template
- AND returns 200 OK with updated tool type

## REMOVED Requirements

### Requirement: Multiple interfaces support
**Reason**: Tool types now use a single `interface_type` instead of an array of interfaces. No tool legitimately needs both web and terminal interfaces simultaneously.
**Migration**: Use `interface_type` field (string) instead of `interfaces` array. Set to "web" or "terminal".

## ADDED Requirements

### Requirement: Port requirement indication
The system SHALL allow tool types to indicate whether they require port configuration.

#### Scenario: Web tool requires port
- GIVEN a tool type with `interface_type` = "web"
- WHEN the tool type is created or updated
- THEN `requires_port` SHALL default to true
- AND port-related configuration is shown in the UI

#### Scenario: Terminal tool does not require port
- GIVEN a tool type with `interface_type` = "terminal"
- WHEN the tool type is created or updated
- THEN `requires_port` SHALL default to false
- AND port-related configuration is hidden in the UI

### Requirement: Single interface validation
The system SHALL enforce that each tool type has exactly one interface type.

#### Scenario: Invalid interface type
- GIVEN a tool type creation request with `interface_type` = "invalid"
- WHEN the request is processed
- THEN the system returns 400 Bad Request
- AND the error message indicates valid values are "web" or "terminal"

#### Scenario: Missing interface type
- GIVEN a tool type creation request without `interface_type`
- WHEN the request is processed
- THEN the system returns 400 Bad Request
- AND the error message indicates interface_type is required