diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd084447..050b7103 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -66,7 +66,7 @@ jobs:
working-directory: packages/api
- name: Install CLI dependencies
- run: pnpm install --frozen-lockfile
+ run: pnpm install --frozen-lockfile --ignore-scripts
working-directory: cli
- name: Run CLI unit tests
diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md
deleted file mode 100644
index e5d4a4b6..00000000
--- a/.planning/REQUIREMENTS.md
+++ /dev/null
@@ -1,135 +0,0 @@
-# Requirements: Copy/Move Test Cases Between Projects
-
-**Defined:** 2026-03-20
-**Core Value:** Teams can plan, execute, and track testing across manual and automated workflows in one place — with AI assistance to reduce repetitive work.
-**Issue:** GitHub #79
-
-## v0.17.0 Requirements
-
-Requirements for cross-project test case copy/move. Each maps to roadmap phases.
-
-### Dialog & Selection
-
-- [x] **DLGSEL-01**: User can select one or more test cases and choose "Copy/Move to Project" from context menu
-- [x] **DLGSEL-02**: User can select "Copy/Move to Project" from bulk actions toolbar
-- [ ] **DLGSEL-03**: User can pick a target project from a list filtered to projects they have write access to
-- [ ] **DLGSEL-04**: User can pick a target folder in the destination project via folder picker
-- [ ] **DLGSEL-05**: User can choose between Move (removes from source) or Copy (leaves source unchanged) operation
-- [ ] **DLGSEL-06**: User sees a pre-flight collision check and can resolve naming conflicts before any writes begin
-
-### Data Carry-Over
-
-- [x] **DATA-01**: Copied/moved cases carry over all steps to the target project
-- [x] **DATA-02**: Copied/moved cases carry over custom field values to the target project
-- [x] **DATA-03**: Copied/moved cases carry over tags to the target project
-- [x] **DATA-04**: Copied/moved cases carry over issue links to the target project
-- [x] **DATA-05**: Copied/moved cases carry over attachments by URL reference (no re-upload)
-- [x] **DATA-06**: Moved cases preserve their full version history in the target project
-- [x] **DATA-07**: Copied cases start at version 1 with fresh version history
-- [x] **DATA-08**: Shared step groups are recreated in the target project so steps remain shared
-- [x] **DATA-09**: User is prompted when a shared step group name already exists in the target — reuse existing or create new
-
-### Compatibility
-
-- [x] **COMPAT-01**: User sees a warning if source and target projects use different templates
-- [x] **COMPAT-02**: Admin/Project Admin users can auto-assign missing templates to the target project (enabled by default)
-- [x] **COMPAT-03**: If a test case uses a workflow state not in the target project, user can associate missing states with the target
-- [x] **COMPAT-04**: Non-admin users see a warning that cases with unmatched workflow states will use the target project's default state
-
-### Bulk Operations
-
-- [x] **BULK-01**: Bulk copy/move of 100+ cases is processed asynchronously via BullMQ with progress polling
-- [x] **BULK-02**: User sees a progress indicator during bulk operations
-- [x] **BULK-03**: User can cancel an in-flight bulk operation
-- [x] **BULK-04**: Per-case errors are reported to the user after operation completes
-
-### Entry Points
-
-- [x] **ENTRY-01**: Copy/Move to Project button appears between Create Test Run and Export in the repository toolbar
-- [x] **ENTRY-02**: Copy/Move to Project option appears in the test case context menu (right-click)
-- [x] **ENTRY-03**: Copy/Move to Project appears as an action in the bulk edit modal footer
-
-### Documentation
-
-- [x] **DOCS-01**: User-facing documentation covers copy/move workflow, template/workflow handling, and conflict resolution
-
-### Testing
-
-- [x] **TEST-01**: E2E tests verify copy and move operations end-to-end including data carry-over
-- [x] **TEST-02**: E2E tests verify template compatibility warnings and workflow state mapping
-- [x] **TEST-03**: Unit tests verify the copy/move worker logic including error handling and partial failure recovery
-- [x] **TEST-04**: Unit tests verify shared step group recreation and collision handling
-
-### Folder Tree
-
-- [x] **TREE-01**: User can right-click a folder and choose Copy/Move to copy/move the entire folder tree with all contained cases
-- [x] **TREE-02**: Folder hierarchy is recreated in the target project preserving parent-child structure
-- [x] **TREE-03**: All cases within the folder tree are processed with the same compatibility handling (templates, workflows, collisions)
-- [x] **TREE-04**: User can choose to merge into an existing folder or create the tree fresh in the target
-
-## Future Requirements
-
-None — this is a self-contained feature per issue #79.
-
-## Out of Scope
-
-| Feature | Reason |
-| ------- | ------ |
-| Shared/cross-project test case library | Fundamentally different architecture, out of scope per issue #79 |
-| Per-user template preferences | Not in issue #79 |
-| Cross-project linked case references | Cases linked to cases not in target are dropped |
-| Drag-and-drop cross-project move from TreeView | UX enhancement for v0.17.x |
-| Per-case rename on conflict | Batch strategy (skip/rename/overwrite) is sufficient for v0.17.0 |
-
-## Traceability
-
-Which phases cover which requirements. Updated during roadmap creation.
-
-| Requirement | Phase | Status |
-|-------------|-------|---------|
-| DLGSEL-01 | 31 | Complete |
-| DLGSEL-02 | 31 | Complete |
-| DLGSEL-03 | 30 | Pending |
-| DLGSEL-04 | 30 | Pending |
-| DLGSEL-05 | 30 | Pending |
-| DLGSEL-06 | 30 | Pending |
-| DATA-01 | 28 | Complete |
-| DATA-02 | 28 | Complete |
-| DATA-03 | 28 | Complete |
-| DATA-04 | 28 | Complete |
-| DATA-05 | 28 | Complete |
-| DATA-06 | 28 | Complete |
-| DATA-07 | 28 | Complete |
-| DATA-08 | 28 | Complete |
-| DATA-09 | 28 | Complete |
-| COMPAT-01 | 29 | Complete |
-| COMPAT-02 | 29 | Complete |
-| COMPAT-03 | 29 | Complete |
-| COMPAT-04 | 29 | Complete |
-| BULK-01 | 29 | Complete |
-| BULK-02 | 30 | Complete |
-| BULK-03 | 29 | Complete |
-| BULK-04 | 30 | Complete |
-| ENTRY-01 | 31 | Complete |
-| ENTRY-02 | 31 | Complete |
-| ENTRY-03 | 31 | Complete |
-| DOCS-01 | 32 | Complete |
-| TEST-01 | 32 | Complete |
-| TEST-02 | 32 | Complete |
-| TEST-03 | 32 | Complete |
-| TEST-04 | 32 | Complete |
-| TREE-01 | 33 | Complete |
-| TREE-02 | 33 | Complete |
-| TREE-03 | 33 | Complete |
-| TREE-04 | 33 | Complete |
-
-**Coverage:**
-
-- v0.17.0 requirements: 35 total
-- Mapped to phases: 35
-- Unmapped: 0 ✓
-
----
-
-*Requirements defined: 2026-03-20*
-*Last updated: 2026-03-20 after adding Phase 33 (Folder Tree Copy/Move)*
diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md
index cbf18dd9..7b719e0f 100644
--- a/.planning/ROADMAP.md
+++ b/.planning/ROADMAP.md
@@ -4,9 +4,9 @@
- ✅ **v1.0 AI Bulk Auto-Tagging** - Phases 1-4 (shipped 2026-03-08)
- ✅ **v1.1 ZenStack Upgrade Regression Tests** - Phases 5-8 (shipped 2026-03-17)
-- 📋 **v2.0 Comprehensive Test Coverage** - Phases 9-24 (planned)
+- ✅ **v2.0 Comprehensive Test Coverage** - Phases 9-24 (shipped 2026-03-21)
- ✅ **v2.1 Per-Project Export Template Assignment** - Phases 25-27 (shipped 2026-03-19)
-- 🚧 **v0.17.0 Copy/Move Test Cases Between Projects** - Phases 28-32 (in progress)
+- ✅ **v0.17.0 Copy/Move Test Cases Between Projects** - Phases 28-33 (shipped 2026-03-21)
## Phases
@@ -30,503 +30,53 @@
-### 📋 v2.0 Comprehensive Test Coverage (Phases 9-24)
+
+✅ v2.0 Comprehensive Test Coverage (Phases 9-24) - SHIPPED 2026-03-21
+
+- [x] **Phase 9: Authentication E2E and API Tests** - All auth flows and API token behavior verified
+- [x] **Phase 10: Test Case Repository E2E Tests** - All repository workflows verified end-to-end
+- [x] **Phase 11: Repository Components and Hooks** - Repository UI components and hooks tested
+- [x] **Phase 12: Test Execution E2E Tests** - Test run creation and execution workflows verified
+- [x] **Phase 13: Run Components, Sessions E2E, and Session Components** - Run UI and session workflows verified
+- [x] **Phase 14: Project Management E2E and Components** - Project workflows verified with component coverage
+- [x] **Phase 15: AI Feature E2E and API Tests** - AI features verified with mocked LLM
+- [x] **Phase 16: AI Component Tests** - AI UI components tested with all states
+- [x] **Phase 17: Administration E2E Tests** - All admin workflows verified end-to-end
+- [x] **Phase 18: Administration Component Tests** - Admin UI components tested
+- [x] **Phase 19: Reporting E2E and Component Tests** - Reporting and analytics verified
+- [x] **Phase 20: Search E2E and Component Tests** - Search functionality verified
+- [x] **Phase 21: Integrations E2E, Components, and API Tests** - Integration workflows verified
+- [x] **Phase 22: Custom API Route Tests** - All custom API endpoints verified
+- [x] **Phase 23: General Components** - Shared UI components tested
+- [x] **Phase 24: Hooks, Notifications, and Workers** - Hooks, notifications, and workers tested
-- [x] **Phase 9: Authentication E2E and API Tests** - All auth flows and API token behavior verified (completed 2026-03-19)
-- [ ] **Phase 10: Test Case Repository E2E Tests** - All repository workflows verified end-to-end
-- [ ] **Phase 11: Repository Components and Hooks** - Repository UI components and hooks tested with edge cases
-- [ ] **Phase 12: Test Execution E2E Tests** - Test run creation and execution workflows verified
-- [ ] **Phase 13: Run Components, Sessions E2E, and Session Components** - Run UI components and session workflows verified
-- [ ] **Phase 14: Project Management E2E and Components** - Project workflows verified with component coverage
-- [ ] **Phase 15: AI Feature E2E and API Tests** - AI features verified end-to-end and via API with mocked LLM
-- [ ] **Phase 16: AI Component Tests** - AI UI components tested with all states and mocked data
-- [ ] **Phase 17: Administration E2E Tests** - All admin management workflows verified end-to-end
-- [ ] **Phase 18: Administration Component Tests** - Admin UI components tested with all states
-- [ ] **Phase 19: Reporting E2E and Component Tests** - Reporting and analytics verified with component coverage
-- [ ] **Phase 20: Search E2E and Component Tests** - Search functionality verified end-to-end and via components
-- [ ] **Phase 21: Integrations E2E, Components, and API Tests** - Integration workflows verified across all layers
-- [ ] **Phase 22: Custom API Route Tests** - All custom API endpoints verified with auth and error handling
-- [ ] **Phase 23: General Components** - Shared UI components tested with edge cases and accessibility
-- [ ] **Phase 24: Hooks, Notifications, and Workers** - Custom hooks, notification flows, and workers unit tested
+✅ v2.1 Per-Project Export Template Assignment (Phases 25-27) - SHIPPED 2026-03-19
-- [x] **Phase 25: Default Template Schema** - Project model extended with optional default export template relation (completed 2026-03-19)
-- [x] **Phase 26: Admin Assignment UI** - Admin can assign, unassign, and set a default export template per project (completed 2026-03-19)
-- [x] **Phase 27: Export Dialog Filtering** - Export dialog shows only project-assigned templates with project default pre-selected (completed 2026-03-19)
+- [x] **Phase 25: Default Template Schema** - Project model extended with optional default export template relation
+- [x] **Phase 26: Admin Assignment UI** - Admin can assign, unassign, and set a default export template per project
+- [x] **Phase 27: Export Dialog Filtering** - Export dialog shows only project-assigned templates with project default pre-selected
-### 🚧 v0.17.0 Copy/Move Test Cases Between Projects (Phases 28-32)
+
+✅ v0.17.0 Copy/Move Test Cases Between Projects (Phases 28-33) - SHIPPED 2026-03-21
-**Milestone Goal:** Users can move or copy test cases directly between projects without export/import cycles, with intelligent handling of templates, workflows, and bulk operations.
+- [x] **Phase 28: Queue and Worker** - BullMQ worker processes copy/move jobs with full data carry-over
+- [x] **Phase 29: API Endpoints and Access Control** - Pre-flight checks, compatibility resolution, job management
+- [x] **Phase 30: Dialog UI and Polling** - Multi-step dialog with progress tracking and collision resolution
+- [x] **Phase 31: Entry Points** - Copy/Move wired into context menu, bulk toolbar, repository toolbar
+- [x] **Phase 32: Testing and Documentation** - E2E, unit tests, and user documentation
+- [x] **Phase 33: Folder Tree Copy/Move** - Copy/move entire folder hierarchies with content
-- [x] **Phase 28: Queue and Worker** - BullMQ worker processes copy/move jobs with full data carry-over (completed 2026-03-20)
-- [x] **Phase 29: API Endpoints and Access Control** - Pre-flight checks, compatibility resolution, and job management endpoints (completed 2026-03-20)
-- [x] **Phase 30: Dialog UI and Polling** - Multi-step copy/move dialog with progress tracking and collision resolution (completed 2026-03-20)
-- [x] **Phase 31: Entry Points** - Copy/Move action wired into context menu, bulk toolbar, and repository toolbar (completed 2026-03-20)
-- [x] **Phase 32: Testing and Documentation** - E2E, unit tests, and user documentation covering the full feature (completed 2026-03-20)
+
## Phase Details
-### Phase 9: Authentication E2E and API Tests
-**Goal**: All authentication flows are verified end-to-end and API token behavior is confirmed
-**Depends on**: Phase 8 (v1.1 complete)
-**Requirements**: AUTH-01, AUTH-02, AUTH-03, AUTH-04, AUTH-05, AUTH-06, AUTH-07, AUTH-08
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for sign-in/sign-out with valid credentials and correctly rejects invalid credentials
- 2. E2E test passes for the complete sign-up flow including email verification
- 3. E2E test passes for 2FA (setup, code entry, backup code recovery) with mocked authenticator
- 4. E2E tests pass for magic link, SSO (Google/Microsoft/SAML), and password change with session persistence
- 5. Component tests pass for all auth pages covering error states, and API tests confirm token auth, creation, revocation, and scope enforcement
-**Plans:** 4/4 plans complete
-
-Plans:
-- [ ] 09-01-PLAN.md -- Sign-in/sign-out and sign-up with email verification E2E tests
-- [ ] 09-02-PLAN.md -- 2FA, SSO, magic link, and password change E2E tests
-- [ ] 09-03-PLAN.md -- Auth page component tests (signin, signup, 2FA setup, 2FA verify)
-- [ ] 09-04-PLAN.md -- API token authentication, creation, revocation, and scope tests
-
-### Phase 10: Test Case Repository E2E Tests
-**Goal**: All test case repository workflows are verified end-to-end
-**Depends on**: Phase 9
-**Requirements**: REPO-01, REPO-02, REPO-03, REPO-04, REPO-05, REPO-06, REPO-07, REPO-08, REPO-09, REPO-10
-**Success Criteria** (what must be TRUE):
-
- 1. E2E tests pass for test case CRUD including all custom field types (text, select, date, user, etc.)
- 2. E2E tests pass for folder operations including create, rename, move, delete, and nested hierarchies
- 3. E2E tests pass for bulk operations (multi-select, bulk edit, bulk delete, bulk move to folder)
- 4. E2E tests pass for search/filter (text search, custom field filters, tag filters, state filters) and import/export (CSV, JSON, markdown)
- 5. E2E tests pass for shared steps, version history, tag management, issue linking, and drag-and-drop reordering
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 11: Repository Components and Hooks
-**Goal**: Test case repository UI components and data hooks are fully tested with edge cases
-**Depends on**: Phase 10
-**Requirements**: REPO-11, REPO-12, REPO-13, REPO-14
-**Success Criteria** (what must be TRUE):
-
- 1. Component tests pass for the test case editor covering TipTap rich text, custom fields, steps, and attachment uploads
- 2. Component tests pass for the repository table covering sorting, pagination, column visibility, and view switching
- 3. Component tests pass for folder tree, breadcrumbs, and navigation with empty and nested states
- 4. Hook tests pass for useRepositoryCasesWithFilteredFields, field hooks, and filter hooks with mock data
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 12: Test Execution E2E Tests
-**Goal**: All test run creation and execution workflows are verified end-to-end
-**Depends on**: Phase 10
-**Requirements**: RUN-01, RUN-02, RUN-03, RUN-04, RUN-05, RUN-06
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for the test run creation wizard (name, milestone, configuration group, case selection)
- 2. E2E test passes for step-by-step case execution including result recording, status updates, and attachments
- 3. E2E test passes for bulk status updates and case assignment across multiple cases in a run
- 4. E2E test passes for run completion workflow with status enforcement and multi-configuration test runs
- 5. E2E test passes for test result import via API (JUnit XML format)
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 13: Run Components, Sessions E2E, and Session Components
-**Goal**: Test run UI components and all exploratory session workflows are verified
-**Depends on**: Phase 12
-**Requirements**: RUN-07, RUN-08, RUN-09, RUN-10, SESS-01, SESS-02, SESS-03, SESS-04, SESS-05, SESS-06
-**Success Criteria** (what must be TRUE):
-
- 1. Component tests pass for test run detail view (case list, execution panel, result recording) including TestRunCaseDetails and TestResultHistory
- 2. Component tests pass for MagicSelectButton/Dialog with mocked LLM responses covering success, loading, and error states
- 3. E2E tests pass for session creation with template, configuration, and milestone selection
- 4. E2E tests pass for session execution (add results with status/notes/attachments) and session completion with summary view
- 5. Component and hook tests pass for SessionResultForm, SessionResultsList, CompleteSessionDialog, and session hooks
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 14: Project Management E2E and Components
-**Goal**: All project management workflows are verified end-to-end with component coverage
-**Depends on**: Phase 9
-**Requirements**: PROJ-01, PROJ-02, PROJ-03, PROJ-04, PROJ-05, PROJ-06, PROJ-07, PROJ-08, PROJ-09
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for the 5-step project creation wizard (name, description, template, members, configurations)
- 2. E2E tests pass for project settings (general, integrations, AI models, quickscript, share links)
- 3. E2E tests pass for milestone CRUD (create, edit, nest, complete, cascade delete) and project documentation editor with mocked AI writing assistant
- 4. E2E tests pass for member management (add, remove, role changes) and project overview dashboard (stats, activity, assignments)
- 5. Component and hook tests pass for ProjectCard, ProjectMenu, milestone components, and project permission hooks
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 15: AI Feature E2E and API Tests
-**Goal**: All AI-powered features are verified end-to-end and via API with mocked LLM providers
-**Depends on**: Phase 9
-**Requirements**: AI-01, AI-02, AI-03, AI-04, AI-05, AI-08, AI-09
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for AI test case generation wizard (source input, template, configure, review) with mocked LLM
- 2. E2E test passes for auto-tag flow (configure, analyze, review suggestions, apply) with mocked LLM
- 3. E2E test passes for magic select in test runs and QuickScript generation with mocked LLM
- 4. E2E test passes for writing assistant in TipTap editor with mocked LLM
- 5. API tests pass for all LLM and auto-tag endpoints (generate-test-cases, magic-select, chat, parse-markdown, submit, status, cancel, apply)
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 16: AI Component Tests
-**Goal**: All AI feature UI components are tested with edge cases and mocked data
-**Depends on**: Phase 15
-**Requirements**: AI-06, AI-07
-**Success Criteria** (what must be TRUE):
-
- 1. Component tests pass for AutoTagWizardDialog, AutoTagReviewDialog, AutoTagProgress, and TagChip covering all states (loading, empty, error, success)
- 2. Component tests pass for QuickScript dialog, template selector, and AI preview pane with mocked LLM responses
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 17: Administration E2E Tests
-**Goal**: All admin management workflows are verified end-to-end
-**Depends on**: Phase 9
-**Requirements**: ADM-01, ADM-02, ADM-03, ADM-04, ADM-05, ADM-06, ADM-07, ADM-08, ADM-09, ADM-10, ADM-11
-**Success Criteria** (what must be TRUE):
-
- 1. E2E tests pass for user management (list, edit, deactivate, reset 2FA, revoke API keys) and group management (create, edit, assign users, assign to projects)
- 2. E2E tests pass for role management (create, edit permissions per area) and SSO configuration (add/edit providers, force SSO, email domain restrictions)
- 3. E2E tests pass for workflow management (create, edit, reorder states) and status management (create, edit flags, scope assignment)
- 4. E2E tests pass for configuration management (categories, variants, groups) and audit log (view, filter, CSV export)
- 5. E2E tests pass for Elasticsearch admin (settings, reindex), LLM integration management, and app config management
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 18: Administration Component Tests
-**Goal**: Admin UI components are tested with all states and form interactions
-**Depends on**: Phase 17
-**Requirements**: ADM-12, ADM-13
-**Success Criteria** (what must be TRUE):
-
- 1. Component tests pass for QueueManagement, ElasticsearchAdmin, and audit log viewer covering loading, empty, error, and populated states
- 2. Component tests pass for user edit form, group edit form, and role permissions matrix covering validation and error states
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 19: Reporting E2E and Component Tests
-**Goal**: All reporting and analytics workflows are verified with component coverage
-**Depends on**: Phase 9
-**Requirements**: RPT-01, RPT-02, RPT-03, RPT-04, RPT-05, RPT-06, RPT-07, RPT-08
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for the report builder (create report, select dimensions/metrics, generate chart)
- 2. E2E tests pass for pre-built reports (automation trends, flaky tests, test case health, issue coverage) and report drill-down/filtering
- 3. E2E tests pass for share links (create, access public/password-protected/authenticated) and forecasting (milestone forecast, duration estimates)
- 4. Component tests pass for ReportBuilder, ReportChart, DrillDownDrawer, and ReportFilters with all data states
- 5. Component tests pass for all chart types (donut, gantt, bubble, sunburst, line, bar) and share link components (ShareDialog, PasswordGate, SharedReportViewer)
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 20: Search E2E and Component Tests
-**Goal**: All search functionality is verified end-to-end with component coverage
-**Depends on**: Phase 9
-**Requirements**: SRCH-01, SRCH-02, SRCH-03, SRCH-04, SRCH-05
-**Success Criteria** (what must be TRUE):
-
- 1. E2E test passes for global search (Cmd+K, cross-entity results, result navigation to correct page)
- 2. E2E tests pass for advanced search operators (exact phrase, required/excluded terms, wildcards, field:value syntax)
- 3. E2E test passes for faceted search filters (custom field values, tags, states, date ranges)
- 4. Component tests pass for UnifiedSearch, GlobalSearchSheet, search result components, and FacetedSearchFilters with all data states
- 5. Component tests pass for result display components (CustomFieldDisplay, DateTimeDisplay, UserDisplay) covering all field types
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 21: Integrations E2E, Components, and API Tests
-**Goal**: All third-party integration workflows are verified end-to-end with component and API coverage
-**Depends on**: Phase 9
-**Requirements**: INTG-01, INTG-02, INTG-03, INTG-04, INTG-05, INTG-06
-**Success Criteria** (what must be TRUE):
-
- 1. E2E tests pass for issue tracker setup (Jira, GitHub, Azure DevOps) and issue operations (create, link, sync status) with mocked APIs
- 2. E2E test passes for code repository setup and QuickScript file context with mocked APIs
- 3. Component tests pass for UnifiedIssueManager, CreateIssueDialog, SearchIssuesDialog, and integration configuration forms
- 4. API tests pass for integration endpoints (test-connection, create-issue, search, sync) with mocked external services
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 22: Custom API Route Tests
-**Goal**: All custom API endpoints are verified with correct behavior, auth enforcement, and error handling
-**Depends on**: Phase 9
-**Requirements**: CAPI-01, CAPI-02, CAPI-03, CAPI-04, CAPI-05, CAPI-06, CAPI-07, CAPI-08, CAPI-09, CAPI-10
-**Success Criteria** (what must be TRUE):
-
- 1. API tests pass for project endpoints (cases/bulk-edit, cases/fetch-many, folders/stats) with auth and tenant isolation verified
- 2. API tests pass for test run endpoints (summary, attachments, import, completed, summaries) and session summary endpoint
- 3. API tests pass for milestone endpoints (descendants, forecast, summary) and share link endpoints (access, password-verify, report data)
- 4. API tests pass for all report builder endpoints (all report types, drill-down queries) and admin endpoints (elasticsearch, queues, trash, user management)
- 5. API tests pass for search, tag/issue count aggregation, file upload/download, health, metadata, and OpenAPI documentation endpoints
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 23: General Components
-**Goal**: All shared UI components are tested with full edge case and error state coverage
-**Depends on**: Phase 9
-**Requirements**: COMP-01, COMP-02, COMP-03, COMP-04, COMP-05, COMP-06, COMP-07, COMP-08
-**Success Criteria** (what must be TRUE):
-
- 1. Component tests pass for Header, UserDropdownMenu, and NotificationBell covering all notification states (empty, unread count, loading)
- 2. Component tests pass for comment system (CommentEditor, CommentList, MentionSuggestion) and attachment components (display, upload, preview carousel)
- 3. Component tests pass for DataTable (sorting, filtering, column visibility, row selection) and form components (ConfigurationSelect, FolderSelect, MilestoneSelect, DatePickerField)
- 4. Component tests pass for onboarding dialogs, TipTap editor extensions (image resize, tables, code blocks), and DnD components (drag previews, drag interactions)
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
-
-### Phase 24: Hooks, Notifications, and Workers
-**Goal**: All custom hooks, notification flows, and background workers are unit tested
-**Depends on**: Phase 9
-**Requirements**: HOOK-01, HOOK-02, HOOK-03, HOOK-04, HOOK-05, NOTIF-01, NOTIF-02, NOTIF-03, WORK-01, WORK-02, WORK-03
-**Success Criteria** (what must be TRUE):
-
- 1. Hook tests pass for ZenStack-generated data fetching hooks (useFindMany*, useCreate*, useUpdate*, useDelete*) with mocked data
- 2. Hook tests pass for permission hooks (useProjectPermissions, useUserAccess, role-based hooks) covering all permission states
- 3. Hook tests pass for UI state hooks (useExportData, useReportColumns, filter/sort hooks) and form hooks (useForm integrations, validation)
- 4. Hook tests pass for integration hooks (useAutoTagJob, useIntegration, useLlm) with mocked providers
- 5. Component tests pass for NotificationBell, NotificationContent, and NotificationPreferences; API tests pass for notification dispatch; unit tests pass for emailWorker, repoCacheWorker, and autoTagWorker
-**Plans**: 2 plans
-
-Plans:
-- [ ] 10-01-PLAN.md -- Gap-fill: test case edit/delete and bulk move to folder
-- [ ] 10-02-PLAN.md -- Gap-fill: shared steps CRUD and versioning
+_All phases complete and archived. See `.planning/milestones/` for historical details._
---
-### Phase 25: Default Template Schema
-**Goal**: The Project model exposes an optional default export template so that the application can persist and query per-project default selections
-**Depends on**: Nothing (SCHEMA-01 already complete; this extends it)
-**Requirements**: SCHEMA-02
-**Success Criteria** (what must be TRUE):
-
- 1. The Project model has an optional relation to CaseExportTemplate representing the project's default export template
- 2. Setting and clearing the default template for a project persists correctly in the database
- 3. ZenStack/Prisma generation succeeds and the new relation is queryable via generated hooks
-**Plans**: 1 plan
-
-Plans:
-- [ ] 25-01-PLAN.md -- Add defaultCaseExportTemplate relation to Project model and regenerate
-
-### Phase 26: Admin Assignment UI
-**Goal**: Admins can assign or unassign export templates to a project and designate one as the default, directly from project settings
-**Depends on**: Phase 25
-**Requirements**: ADMIN-01, ADMIN-02
-**Success Criteria** (what must be TRUE):
-
- 1. Admin can navigate to project settings and see a list of all enabled export templates with their assignment status for that project
- 2. Admin can assign an export template to a project and the assignment is reflected immediately in the UI
- 3. Admin can unassign an export template from a project and it no longer appears in the project's assigned list
- 4. Admin can mark one assigned template as the project default, and the selection persists across page reloads
-**Plans**: 2 plans
-
-Plans:
-- [ ] 26-01-PLAN.md -- Update ZenStack access rules for project admin write access
-- [ ] 26-02-PLAN.md -- Build ExportTemplateAssignmentSection and integrate into quickscript page
-
-### Phase 27: Export Dialog Filtering
-**Goal**: The export dialog shows only the templates relevant to the current project, with the project default pre-selected, while gracefully falling back when no assignments exist
-**Depends on**: Phase 26
-**Requirements**: EXPORT-01, EXPORT-02, EXPORT-03
-**Success Criteria** (what must be TRUE):
-
- 1. When a project has assigned templates, the export dialog lists only those templates (not all global templates)
- 2. When a project has a default template set, the export dialog opens with that template pre-selected
- 3. When a project has no assigned templates, the export dialog shows all enabled templates (backward compatible fallback)
-**Plans**: 1 plan
-
-Plans:
-- [ ] 27-01-PLAN.md -- Filter QuickScript dialog templates by project assignment and pre-select project default
-
----
-
-### Phase 28: Queue and Worker
-
-**Goal**: The copy/move BullMQ worker processes jobs end-to-end, carrying over all case data and handling version history correctly, before any API or UI is built on top
-**Depends on**: Phase 27 (v2.1 complete)
-**Requirements**: DATA-01, DATA-02, DATA-03, DATA-04, DATA-05, DATA-06, DATA-07, DATA-08, DATA-09
-**Success Criteria** (what must be TRUE):
-
- 1. A copied case in the target project contains all original steps, custom field values, tags, issue links, and attachment records (pointing to the same S3 URLs)
- 2. A copied case starts at version 1 in the target project with no prior version history
- 3. A moved case in the target project retains its full version history from the source project
- 4. Shared step groups are recreated as proper SharedStepGroups in the target project with all items copied
- 5. When a shared step group name already exists in the target, the worker correctly applies the user-chosen resolution (reuse existing or create new)
-**Plans**: 2 plans
-
-Plans:
-- [ ] 28-01-PLAN.md -- Queue registration and copy/move worker implementation
-- [ ] 28-02-PLAN.md -- Unit tests for copy/move worker processor
-
-### Phase 29: API Endpoints and Access Control
-
-**Goal**: The copy/move API layer enforces permissions, resolves template and workflow compatibility, detects collisions, and manages job lifecycle before any UI is connected
-**Depends on**: Phase 28
-**Requirements**: COMPAT-01, COMPAT-02, COMPAT-03, COMPAT-04, BULK-01, BULK-03
-**Success Criteria** (what must be TRUE):
-
- 1. A user without write access to the target project receives a permission error before any job is enqueued
- 2. A user attempting a move without delete access on the source project receives a permission error
- 3. When source and target use different templates, the API response includes a template mismatch warning; admin users can auto-assign the missing template via the same endpoint
- 4. When cases have workflow states not present in the target, the API response identifies the missing states so they can be associated or mapped to the target default
- 5. A user can cancel an in-flight bulk job via the cancel endpoint, and the worker stops processing subsequent cases
-**Plans**: 3 plans
-
-Plans:
-- [ ] 29-01-PLAN.md -- Shared schemas and preflight endpoint (template/workflow compat + collision detection)
-- [ ] 29-02-PLAN.md -- Status polling and cancel endpoints
-- [ ] 29-03-PLAN.md -- Submit endpoint with admin auto-assign and job enqueue
-
-### Phase 30: Dialog UI and Polling
-
-**Goal**: Users can complete a copy/move operation entirely through the dialog, from target selection through progress tracking to a final summary of outcomes
-**Depends on**: Phase 29
-**Requirements**: DLGSEL-03, DLGSEL-04, DLGSEL-05, DLGSEL-06, BULK-02, BULK-04
-**Success Criteria** (what must be TRUE):
-
- 1. User can select a target project from a picker that shows only projects they have write access to, then pick a target folder within that project
- 2. User can choose Copy or Move and sees a clear description of what each operation does before confirming
- 3. When a pre-flight collision check finds naming conflicts, user sees the list of conflicting case names and chooses a resolution strategy before any writes begin
- 4. During a bulk operation, user sees a live progress indicator showing cases processed out of total
- 5. After operation completes, user sees a per-case summary distinguishing successful copies/moves from cases that failed with their individual error reason
-**Plans**: 2 plans
-
-Plans:
-- [ ] 30-01-PLAN.md -- useCopyMoveJob polling hook, schema notification type, worker notification, and NotificationContent extension
-- [ ] 30-02-PLAN.md -- CopyMoveDialog three-step wizard component with tests and visual verification
-
-### Phase 31: Entry Points
-
-**Goal**: The copy/move dialog is reachable from every UI location where users interact with test cases
-**Depends on**: Phase 30
-**Requirements**: DLGSEL-01, DLGSEL-02, ENTRY-01, ENTRY-02, ENTRY-03
-**Success Criteria** (what must be TRUE):
-
- 1. The repository toolbar shows a "Copy/Move to Project" button positioned between "Create Test Run" and "Export"
- 2. Right-clicking a test case row reveals a "Copy/Move to Project" option in the context menu
- 3. The bulk edit modal footer includes "Copy/Move to Project" as an available bulk action when one or more cases are selected
-**Plans**: 1 plan
-
-Plans:
-- [ ] 31-01-PLAN.md -- Wire CopyMoveDialog into toolbar, context menu, and bulk edit modal
-
-### Phase 32: Testing and Documentation
-
-**Goal**: The copy/move feature is fully verified across critical data-integrity scenarios and documented for users
-**Depends on**: Phase 31
-**Requirements**: TEST-01, TEST-02, TEST-03, TEST-04, DOCS-01
-**Success Criteria** (what must be TRUE):
-
- 1. E2E tests pass for end-to-end copy and move operations including verification that steps, tags, attachments, and field values appear correctly in the target project
- 2. E2E tests pass for template compatibility warning flow and workflow state mapping, covering both admin auto-assign and non-admin warning paths
- 3. Unit tests pass for worker logic covering field option ID remapping across template boundaries, shared step group flattening, and partial failure recovery
- 4. Unit tests pass for shared step group collision handling (reuse vs. create new) and for move version history preservation
- 5. User documentation is published covering the copy/move workflow, how template and workflow conflicts are handled, and how to resolve naming collisions
-**Plans**: 2 plans
-
-Plans:
-- [ ] 32-01-PLAN.md -- E2E API tests for copy/move endpoints (TEST-01, TEST-02) and worker test verification (TEST-03, TEST-04)
-- [ ] 32-02-PLAN.md -- User-facing documentation for copy/move feature (DOCS-01)
-
-### Phase 33: Folder Tree Copy/Move
-
-**Goal**: Users can copy or move an entire folder (with all subfolders and contained test cases) to another project, preserving the folder hierarchy
-**Depends on**: Phase 31
-**Requirements**: TREE-01, TREE-02, TREE-03, TREE-04
-**Success Criteria** (what must be TRUE):
-
- 1. User can right-click a folder in the tree view and choose Copy/Move to open the CopyMoveDialog with all cases from that folder tree pre-selected
- 2. The folder hierarchy is recreated in the target project preserving parent-child structure
- 3. All cases within the folder tree are processed with the same compatibility handling as individual case copy/move
- 4. User can choose to place the copied/moved tree inside an existing folder or at root level in the target
-**Plans**: 2 plans
-
-Plans:
-- [ ] 33-01-PLAN.md -- Worker folder tree recreation, API schema extension, and unit tests
-- [ ] 33-02-PLAN.md -- TreeView context menu entry, CopyMoveDialog folder mode, and wiring
-
----
-
-## Progress
-
-**Execution Order:**
-Phases execute in numeric order: 9 → 10 → 11 → 12 → 13 → 14 → 15 → 16 → 17 → 18 → 19 → 20 → 21 → 22 → 23 → 24 → 25 → 26 → 27 → 28 → 29 → 30 → 31 → 32
-
-| Phase | Milestone | Plans Complete | Status | Completed |
-|-------|-----------|----------------|--------|-----------|
-| 1. Schema Foundation | v1.0 | 1/1 | Complete | 2026-03-08 |
-| 2. Alert Service and Pipeline | v1.0 | 3/3 | Complete | 2026-03-08 |
-| 3. Settings Page UI | v1.0 | 1/1 | Complete | 2026-03-08 |
-| 4. (v1.0 complete) | v1.0 | 0/0 | Complete | 2026-03-08 |
-| 5. CRUD Operations | v1.1 | 4/4 | Complete | 2026-03-17 |
-| 6. Relations and Queries | v1.1 | 2/2 | Complete | 2026-03-17 |
-| 7. Access Control | v1.1 | 2/2 | Complete | 2026-03-17 |
-| 8. Error Handling and Batch Operations | v1.1 | 2/2 | Complete | 2026-03-17 |
-| 9. Authentication E2E and API Tests | v2.0 | 4/4 | Complete | 2026-03-19 |
-| 10. Test Case Repository E2E Tests | v2.0 | 0/2 | Planning complete | - |
-| 11. Repository Components and Hooks | v2.0 | 0/TBD | Not started | - |
-| 12. Test Execution E2E Tests | v2.0 | 0/TBD | Not started | - |
-| 13. Run Components, Sessions E2E, and Session Components | v2.0 | 0/TBD | Not started | - |
-| 14. Project Management E2E and Components | v2.0 | 0/TBD | Not started | - |
-| 15. AI Feature E2E and API Tests | v2.0 | 0/TBD | Not started | - |
-| 16. AI Component Tests | v2.0 | 0/TBD | Not started | - |
-| 17. Administration E2E Tests | v2.0 | 0/TBD | Not started | - |
-| 18. Administration Component Tests | v2.0 | 0/TBD | Not started | - |
-| 19. Reporting E2E and Component Tests | v2.0 | 0/TBD | Not started | - |
-| 20. Search E2E and Component Tests | v2.0 | 0/TBD | Not started | - |
-| 21. Integrations E2E, Components, and API Tests | v2.0 | 0/TBD | Not started | - |
-| 22. Custom API Route Tests | v2.0 | 0/TBD | Not started | - |
-| 23. General Components | v2.0 | 0/TBD | Not started | - |
-| 24. Hooks, Notifications, and Workers | v2.0 | 0/TBD | Not started | - |
-| 25. Default Template Schema | v2.1 | 1/1 | Complete | 2026-03-19 |
-| 26. Admin Assignment UI | v2.1 | 2/2 | Complete | 2026-03-19 |
-| 27. Export Dialog Filtering | v2.1 | 1/1 | Complete | 2026-03-19 |
-| 28. Queue and Worker | v0.17.0 | 2/2 | Complete | 2026-03-20 |
-| 29. API Endpoints and Access Control | v0.17.0 | 3/3 | Complete | 2026-03-20 |
-| 30. Dialog UI and Polling | v0.17.0 | 2/2 | Complete | 2026-03-20 |
-| 31. Entry Points | 1/1 | Complete | 2026-03-20 | - |
-| 32. Testing and Documentation | 2/2 | Complete | 2026-03-20 | - |
-| 33. Folder Tree Copy/Move | 2/2 | Complete | 2026-03-21 | - |
+*Last updated: 2026-03-21 after completing all milestones*
diff --git a/.planning/STATE.md b/.planning/STATE.md
index f541ae64..a115df8b 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -4,33 +4,33 @@ milestone: v2.0
milestone_name: Comprehensive Test Coverage
status: completed
stopped_at: Completed 33-02-PLAN.md (Phase 33 Plan 02 — folder copy/move UI entry point)
-last_updated: "2026-03-21T03:34:32.880Z"
-last_activity: "2026-03-20 — Completed 29-02: status polling and cancel endpoints with multi-tenant isolation"
+last_updated: "2026-03-21T17:18:20.987Z"
+last_activity: 2026-03-21 — All v2.0 phases confirmed complete
progress:
- total_phases: 27
+ total_phases: 25
completed_phases: 23
total_plans: 59
completed_plans: 62
- percent: 24
+ percent: 100
---
# State
## Project Reference
-See: .planning/PROJECT.md (updated 2026-03-20)
+See: .planning/PROJECT.md (updated 2026-03-21)
**Core value:** Teams can plan, execute, and track testing across manual and automated workflows in one place — with AI assistance to reduce repetitive work.
-**Current focus:** v0.17.0 Copy/Move Test Cases Between Projects — Phase 29 in progress
+**Current focus:** v2.0 Comprehensive Test Coverage — All phases complete, running lifecycle
## Current Position
-Phase: 29 of 32 (API Endpoints and Access Control)
-Plan: 02 of 04 (complete)
-Status: Phase 29 plan 02 complete — ready for 29-03
-Last activity: 2026-03-20 — Completed 29-02: status polling and cancel endpoints with multi-tenant isolation
+Phase: 24 of 24 (all complete)
+Plan: All complete
+Status: Running milestone lifecycle (audit → complete → cleanup)
+Last activity: 2026-03-21 — All v2.0 phases confirmed complete
-Progress: [██░░░░░░░░] 24% (v0.17.0 phases — 4 of ~14 plans complete)
+Progress: [██████████] 100% (v2.0 phases — 16 of 16 complete)
## Performance Metrics
diff --git a/testplanit/app/[locale]/projects/repository/[projectId]/Cases.test.tsx b/testplanit/app/[locale]/projects/repository/[projectId]/Cases.test.tsx
index d35e3ad4..4ed64d90 100644
--- a/testplanit/app/[locale]/projects/repository/[projectId]/Cases.test.tsx
+++ b/testplanit/app/[locale]/projects/repository/[projectId]/Cases.test.tsx
@@ -72,6 +72,7 @@ vi.mock("next-auth/react", async (importOriginal) => {
vi.mock("~/lib/hooks", () => ({
useFindManyRepositoryFolders: vi.fn(() => ({ data: [], isLoading: false })),
useCountRepositoryCases: vi.fn(() => ({ data: 0, isLoading: false, refetch: vi.fn() })),
+ useCountProjects: vi.fn(() => ({ data: 0, isLoading: false })),
useFindManyTemplates: vi.fn(() => ({ data: [], isLoading: false })),
useFindUniqueProjects: vi.fn(() => ({ data: null, isLoading: false })),
useFindManyProjectLlmIntegration: vi.fn(() => ({ data: [], isLoading: false })),
diff --git a/testplanit/app/api/repository/copy-move/preflight/route.test.ts b/testplanit/app/api/repository/copy-move/preflight/route.test.ts
index d633c234..e5277274 100644
--- a/testplanit/app/api/repository/copy-move/preflight/route.test.ts
+++ b/testplanit/app/api/repository/copy-move/preflight/route.test.ts
@@ -83,7 +83,7 @@ const baseTargetWorkflowAssignments = [
},
];
-const baseSourceWorkflowStates = [
+const _baseSourceWorkflowStates = [
{ id: 100, name: "Not Started" },
];
diff --git a/testplanit/components/AttachmentsCarousel.test.tsx b/testplanit/components/AttachmentsCarousel.test.tsx
new file mode 100644
index 00000000..2e64fde0
--- /dev/null
+++ b/testplanit/components/AttachmentsCarousel.test.tsx
@@ -0,0 +1,357 @@
+import type { Attachments } from "@prisma/client";
+import { fireEvent, render, screen } from "@testing-library/react";
+import { beforeEach, describe, expect, it, vi } from "vitest";
+import { AttachmentsCarousel } from "./AttachmentsCarousel";
+
+const mockUpdateAttachments = vi.fn();
+
+vi.mock("next-auth/react", () => ({
+ useSession: vi.fn(() => ({
+ data: {
+ user: {
+ preferences: {
+ dateFormat: "MM/DD/YYYY",
+ timeFormat: "HH:mm",
+ timezone: "Etc/UTC",
+ },
+ },
+ },
+ })),
+}));
+
+vi.mock("next-intl", () => ({
+ useTranslations: vi.fn(() => (key: string) => key.split(".").pop() ?? key),
+}));
+
+vi.mock("~/lib/hooks", () => ({
+ useUpdateAttachments: vi.fn(() => ({
+ mutateAsync: mockUpdateAttachments,
+ })),
+}));
+
+vi.mock("~/utils/storageUrl", () => ({
+ getStorageUrlClient: vi.fn((url: string) => `https://storage.example.com/${url}`),
+}));
+
+vi.mock("@/components/AttachmentPreview", () => ({
+ AttachmentPreview: ({ attachment, size }: any) => (
+