# Project Management Specification ## Purpose Organize repositories into projects for grouping related work. ## Requirements ### Requirement: Project Creation The system SHALL allow authenticated users to create new projects and SHALL assign the creator as project owner. #### Scenario: Create project - GIVEN an authenticated user - WHEN they create a project with name and description - THEN a project record is created - AND the user is set as owner #### Scenario: Reject unauthenticated creation - GIVEN a request without a valid authenticated session - WHEN it attempts to create a project - THEN the system responds with unauthorized status ### Requirement: Project Listing The system SHALL list projects owned by the authenticated user, including related repositories and default SSH key metadata. #### Scenario: List projects - GIVEN an authenticated user - WHEN they view the projects page - THEN all their projects are listed with associated repositories #### Scenario: Ownership-scoped listing - GIVEN multiple users with separate projects - WHEN one user requests their project list - THEN only that user's projects are returned ### Requirement: Project Updates The system SHALL support updating project details for project owners only. #### Scenario: Update project - GIVEN a project owner - WHEN they update the name or description - THEN the changes are persisted #### Scenario: Non-owner update denied - GIVEN a user who is not the project owner - WHEN they attempt to update project details - THEN the system responds with forbidden status ### Requirement: Project Deletion The system SHALL support cascading project deletion for project owners. #### Scenario: Delete project - GIVEN a project owner - WHEN they delete a project - THEN all associated repositories are deleted - AND all associated SSH keys are removed - AND the project record is deleted #### Scenario: Non-owner deletion denied - GIVEN a user who is not the project owner - WHEN they attempt to delete the project - THEN the system responds with forbidden status ### Requirement: Default SSH Key The system SHALL allow project owners to set a default SSH key per project and SHALL validate ownership for selected keys. #### Scenario: Set default key - GIVEN a project with SSH keys - WHEN the owner selects a default key - THEN it's used for git operations in that project #### Scenario: Reject foreign key assignment - GIVEN a project owner - WHEN they try setting a default SSH key that does not belong to their allowed scope - THEN the system rejects the request with validation error ## Dependencies - Database models: Project, User, GitRepository, SSHKey - git-repo (for cascading delete) - ssh-keys (for default key) ## Quality Gates - `pytest` must pass - `mypy .` must pass - `ruff check .` must pass - `npm run typecheck` must pass - `npm run lint` must pass