Skip to content

Comments

Entrega2 JVC - Meditation builder#116

Open
javixtc wants to merge 103 commits intoLIDR-academy:mainfrom
javixtc:feature-entrega2-JVC
Open

Entrega2 JVC - Meditation builder#116
javixtc wants to merge 103 commits intoLIDR-academy:mainfrom
javixtc:feature-entrega2-JVC

Conversation

@javixtc
Copy link

@javixtc javixtc commented Feb 23, 2026

Código funcional (US's 2, 3 y 4) para el MVP (US1 [manejo y creación de usuarios con SSO y Cognito] para siguientes mejoras)

  • US2: seleccionar texto (escrito o enhance con OpenAI) + imagen (local o creación con OpenAI) + música (biblioteca local)
  • US3: generar podcast/vídeo (google TTS + fmpeg) y guardar en S3 + postgreSQL
  • US4: lista y preview de las meditaciones del usuario

Javier Vidal and others added 30 commits January 20, 2026 19:35
… vs video) based on image presence

Added User Story 2 (P1): Output Type Indication

- System indicates podcast when no image selected

- System indicates video when image is selected

- Added 4 new functional requirements (FR-016 to FR-019)

- Added 3 new success criteria (SC-011 to SC-013)

- Updated Key Entities to reflect output type derivation

- Added edge cases for output type transitions

- Clarified Out of Scope: podcast/video generation deferred to future US

- Maintained strict business focus without technical details
Complete vertical pipeline following Constitution 2.0.0

Pipeline: BDD  API  Domain  Application  Infra  Controllers  Frontend  Contracts  E2E  CI/CD

Each phase includes exact locations, artifacts, criteria, prohibitions, and gates

Coverage minimums: Domain 90%, App 80%, Controllers 80%, FE 70%

Estimated effort: 8-10 developer days
- Phase 1: Created all project directories with .gitkeep files
  - Backend: domain, application, infrastructure packages
  - Tests: BDD, contracts, e2e structures
  - Frontend: api, components, pages, hooks, state directories

- Phase 2: BDD First (YELLOW state achieved)
  - compose-content.feature: 8 consolidated scenarios
  - ComposeContentSteps.java: All step definitions with PendingException
  - ComposeContentBDDTest.java: JUnit Platform runner
  - Tests run: 8, Errors: 8 (PendingException - YELLOW )
  - Verified all scenarios execute and show PENDING status

- Fixed pom.xml testSourceDirectory (Maven standard)
- Commented cucumber-spring dependency (not needed for YELLOW phase)

Next: Phase 3 - API First (OpenAPI definition)
- Created complete OpenAPI 3.0.3 specification
- File: compose-content.yaml (650+ lines)
- 11 operations covering 8 core capabilities:
  1. createComposition  Scenario 1 (Access Builder)
  2. updateText  Scenario 2 (Manual Text Entry)
  3. generateText  Scenario 3 (AI Text Gen/Enhancement)
  4. generateImage  Scenario 4 (AI Image Generation)
  5. getOutputType  Scenarios 5 & 6 (Output Type)
  6. previewMusic  Scenario 7 (Music Preview)
  7. previewImage  Scenario 8 (Image Preview)
  + selectMusic, setImage, removeImage, getComposition

- Request/Response schemas: 11 DTOs defined
- Error handling: 400, 404, 429, 503, 500 responses
- All operationIds aligned with use case names
- Capabilities mapped to BDD scenarios in comments
- YAML structure validated (openapi 3.0.3 compliant)

- Added comprehensive .gitignore:
  - Maven target/ directory excluded
  - Node modules, build artifacts excluded
  - Test reports, coverage excluded
  - IDE files, OS temp files excluded

Next: Phase 4 - Domain Layer (Value Objects, Entities, Ports)
…(T015-T025)

**Value Objects Created** (Immutable, TDD):
- TextContent: Meditation text with preservation invariant (10k char max)
  - 10 unit tests: validation, immutability, value equality
- OutputType: PODCAST vs VIDEO enum
  - 5 unit tests: enum values, valueOf
- MusicReference: Optional music catalog reference
  - 6 unit tests: validation, value equality
- ImageReference: Optional image reference (manual/AI)
  - 7 unit tests: validation, value equality

**Aggregate Root Created**:
- MeditationComposition: Core domain entity
  - Business logic: getOutputType() (image == null  PODCAST, else  VIDEO)
  - 15 unit tests: creation, updates, output type derivation
  - Enforces invariants: ID required, TextContent mandatory

**Inbound Ports (Use Cases)**:
- ComposeContentUseCase: 7 methods (create, update, select, set, remove, get)
- GenerateTextUseCase: generateText(), enhanceText()
- GenerateImageUseCase: generateImage()

**Outbound Ports (External Services)**:
- MediaCatalogPort: music/image catalog access (preview, validation)
- TextGenerationPort: AI text generation service
- ImageGenerationPort: AI image generation service

**Tests Summary**:
- 43 domain unit tests PASSING (100% coverage)
- Zero framework dependencies (pure Java)
- DDD invariants enforced
- BDD still YELLOW (8 scenarios pending - expected)

**Fixed**:
- .gitignore: Changed 'out/' to '/out/' (excluded IntelliJ root, not ports/out/)

Next: Phase 5 - Application Layer (Use Case Services)
**Patrón aplicado:** Siguiendo MeditationComposition.java

**Value Objects refactorizados:**
 TextContent.java: final class  record
 MusicReference.java: final class  record
 ImageReference.java: final class  record

**Cambios implementados:**
- Constructor compacto con validación (Objects.requireNonNull)
- Eliminados getters manuales (getValue()  value() auto-generado)
- Eliminados equals/hashCode/toString (auto-generados por record)
- Inmutabilidad garantizada por record
- Validaciones preservadas en constructor canónico compacto
- TextContent mantiene helper method length()

**Tests actualizados:**
- TextContentTest: 10 tests adaptados a record accessor value()
- MusicReferenceTest: 6 tests adaptados
- ImageReferenceTest: 7 tests adaptados
- MeditationCompositionTest: 18 tests reescritos para API inmutable
  - Uso de factory methods create()
  - Tests de Clock injection
  - Tests de inmutabilidad (withX retorna nuevas instancias)
  - Tests de timestamps (createdAt/updatedAt)
  - Tests de Optional accessors
  - Tests de operaciones encadenadas

**Diferencias con old API:**
- getValue()  value() (convención records)
- NullPointerException esperada (Objects.requireNonNull)
- Immutable API: withText(), withMusic(), withImage() retornan nuevas instancias

**Tests Summary:**
- 46 domain tests PASSING (100% coverage)
- OutputTypeTest: 5 tests
- ImageReferenceTest: 7 tests
- MeditationCompositionTest: 18 tests
- MusicReferenceTest: 6 tests
- TextContentTest: 10 tests
- BDD: 8 scenarios YELLOW (pending - esperado)

Next: FASE 2 - Actualizar ComposeContentUseCase a UUID
**Breaking Change:** Port signature actualizado

**Cambios:**
 ComposeContentUseCase.java: String compositionId  UUID compositionId
  - updateText(UUID, ...)
  - selectMusic(UUID, ...)
  - setImage(UUID, ...)
  - removeImage(UUID)
  - getOutputType(UUID)
  - getComposition(UUID)
  - CompositionNotFoundException(UUID) constructor

**Justificación:**
- Alineado con MeditationComposition record (usa UUID id)
- Tipo seguro evita errores de casting
- Mejor semántica de dominio (UUID es identifier, String es text)

**Impacto:**
 Application Layer (Phase 5): servicios deben actualizar firmas
 Infrastructure Controllers (Phase 7): parsear UUID de path params
 DTOs (Phase 7): mapear String  UUID
 OpenAPI (ya tiene format: uuid): sin cambios necesarios

**Compilación:**  BUILD SUCCESS

Next: Phase 5 - Application Layer (ComposeContentService implementation)
…opilot

- Crear java21-best-practices.md con patrones obligatorios:

  - Records para Value Objects y Entities

  - UUID para identificadores (no String)

  - Clock injection para timestamps determinísticos

  - API inmutable con métodos withX()

  - Optional accessors para campos nullable

  - Validación en compact constructor

- Actualizar engineering-guidelines.md con referencia

- Actualizar backend.instructions.md con reglas de dominio

- Actualizar copilot-instructions.md con jerarquía de fuentes
- Translate java21-best-practices.md to English
- Translate copilot-instructions.md to English
- Translate engineering-guidelines.md to English

All instruction files are now in English for consistency
…on content composition

- Implemented ComposeContentService to orchestrate composition operations.
- Created GenerateTextService for AI text generation and enhancement.
- Developed GenerateImageService for AI image generation.
- Added TextLengthValidator to enforce text length constraints.
- Introduced ValidationResult class for validation outcomes.
- Created domain exceptions: CompositionNotFoundException and MusicNotFoundException.
- Defined CompositionRepositoryPort for composition persistence operations.
- Added unit tests for ComposeContentService, GenerateTextService, GenerateImageService, and TextLengthValidator.
- Add AiTextMapper for mapping between domain model and AI text service DTOs.
- Implement ImageGenerationAiAdapter with integration tests using WireMock.
- Create MediaCatalogAdapter with integration tests for media catalog service.
- Add TextGenerationAiAdapter with integration tests for AI text generation service.
- Implement unit tests for AiImageMapper and AiTextMapper to validate mapping logic.
- Update tasks in project specification to reflect completed implementations.
…sition API

- Introduced CompositionResponse, CreateCompositionRequest, ErrorResponse, GenerateTextRequest, ImagePreviewResponse, ImageReferenceResponse, MusicPreviewResponse, OutputTypeResponse, SelectMusicRequest, SetImageRequest, TextContentResponse, and UpdateTextRequest DTOs for handling API requests and responses.
- Implemented CompositionDtoMapper for converting between domain models and DTOs.
- Created unit tests for CompositionDtoMapper to ensure correct mapping between domain and DTOs.
- Developed integration tests for MeditationBuilderController to validate API endpoints and request handling.
…d image generation capabilities

- Added components for text editing, music selection, and image preview.
- Created hooks for managing compositions, generating text and images.
- Integrated Zustand for local state management in the Meditation Builder.
- Established a responsive layout for the Meditation Builder page.
- Implemented error handling for AI generation processes.
- Added tests for Zustand store functionality.
- Configured TypeScript and Vite for the project.
Javier Vidal added 29 commits February 13, 2026 08:50
Fixes:
- Removed ErrorResponse export conflict between Composition and Generation BCs
- Added @ts-nocheck to auto-generated OpenAPI files (94  0 warnings)
- Fixed GenerationStatus enum values (Success  Completed, etc.)
- Removed unused React imports (JSX automatic transform)
- Removed unused variable in MeditationBuilderPage

Build status:  PASSING
Tests status:  52/52 PASSING (Generation components)

Technical changes:
1. Created postprocess-openapi.mjs script to add @ts-nocheck headers
2. Updated package.json to run post-processing after API generation
3. Corrected GenerationStatus values:
   - Success  Completed
   - ValidationError/ProcessingTimeoutError/ExternalServiceError  Failed/Timeout
4. Removed React imports (not needed with new JSX transform)
- Updated S3MediaStorageAdapterTest to use UploadRequest for media uploads and validate parameters.
- Refactored GoogleTtsAdapterTest to remove unused metrics and simplify voice synthesis tests.
- Removed unused delete meditation test from PostgresContentRepositoryTest.
- Modified SubtitleSyncServiceTest to accept audio path and narration text, improving validation checks.
- Updated MeditationBuilderControllerTest to use SpringBootTest for better integration testing without JPA conflicts.
- Created WebMvcTestConfig to exclude JPA auto-configuration for controller tests.
- Enhanced ObservabilityIntegrationTest to mock JpaMeditationOutputRepository and validate metrics.
- Added application-webmvctest.properties to exclude DataSource auto-configuration in tests.
- Updated frontend generation client to include composition ID in requests.
- Refactored GenerateMeditationButton and OutputTypeIndicator components to handle click events and loading states.
- Modified useGenerateMeditation hook to accept composition ID in generation requests.
- Updated MeditationBuilderPage to integrate new generation logic and improve user experience during content creation.
…e copy

- Added FFmpeg command execution for audio rendering in FfmpegAudioRendererAdapter.
- Implemented video rendering with FFmpeg in FfmpegVideoRendererAdapter.
- Enhanced S3MediaStorageAdapter to upload media files to AWS S3 using AWS SDK v2.
- Created GoogleTtsAdapter to generate dummy TTS files for testing.
- Updated application-local.yml for PostgreSQL configuration and AWS S3 LocalStack support.
- Created database migration script for meditation_output table with indexes.
- Added OpenAPI specification for retrieving meditation generation status.
- Implemented unit tests for S3MediaStorageAdapter with LocalStack.
- Added frontend API functions for polling meditation generation status and uploading files.
- Updated MeditationBuilderPage to handle file uploads and integrate with generation workflow.
- Enhanced MusicSelectorButton and ImageSelectorButton components for better UX.
- Added FFmpeg setup documentation for local and Docker installations.
- Implemented manual installation guide for Windows users.
- Created a batch script for quick FFmpeg installation on Windows.
- Enhanced GenerateMeditationContentService to support base64 image data URIs.
- Introduced FfmpegConfig class for managing FFmpeg configuration properties.
- Updated FfmpegAudioRendererAdapter and FfmpegVideoRendererAdapter to utilize FfmpegConfig.
- Improved error handling and logging in FFmpeg adapters.
- Added silent audio generation in GoogleTtsAdapter using FFmpeg.
- Updated PostgresContentRepository to log media URL lengths before saving.
- Modified application-local.yml to include FFmpeg configuration.
- Updated unit tests for FFmpeg adapters to use FfmpegConfig.
- Added duration_seconds field to MeditationOutputEntity with getter and setter methods.
- Updated MeditationOutputMapper to handle duration_seconds during entity mapping.
- Introduced AudioMetadataService to analyze audio file metadata using FFprobe, extracting duration.
- Integrated AudioMetadataService into SubtitleSyncService for accurate subtitle timing based on actual audio duration.
- Updated application configuration for Google Cloud Text-to-Speech and FFmpeg settings.
- Created Flyway migration script to add duration_seconds column to the meditation_output table.
- Enhanced frontend components to display audio duration in the generation result.
- Refactored MeditationBuilderPage to calculate estimated duration based on text and selected music.
- Updated tests to cover new functionality and ensure proper integration of audio metadata analysis.
…ation audio/video generation specs

- Changed test status to "failed" and listed failed tests in `.last-run.json`.
- Updated acceptance criteria in `tasks.md` to indicate completion for various tasks related to Docker setup, LocalStack, and testing scenarios.
-  T001: Playback BC structure created (backend + frontend directories)
-  T002: Database infrastructure verified (US3 PostgreSQL schema, table, indexes)
-  All tests passing (0 failures, 0 errors)
-  Compilation successful

Artifacts:
- Backend: com.hexagonal.playback.* directory structure
- Frontend: src/{components,hooks,state}/playback directories
- Database: verification script documenting US3 table reuse
- Tasks: T001, T002 marked as complete [x]
-  T003: BDD Feature Definition
  - Created Cucumber feature with 2 business scenarios
  - Scenario 1: List user meditations with state
  - Scenario 2: Play completed meditation
  - Steps in Spanish, business language only
  - States: En cola, Generando, Completada, Fallida

-  T004: OpenAPI Specification
  - Capability 1: List User Meditations (GET /playback/meditations)
  - Capability 2: Play Completed Meditation (GET /playback/meditations/{id})
  - Complete schemas: MeditationListResponse, PlaybackInfoResponse, MediaUrls
  - Error responses: 404 Not Found, 409 Not Playable
  - Derived from BDD scenarios

-  Compilation successful

Artifacts:
- backend/src/test/resources/features/playback/list-play-meditations.feature
- backend/src/main/resources/openapi/playback/list-play-meditations.yaml
- Tasks: T003, T004 marked as complete [x]
-  T005: Domain Models & VOs (TDD cycle)
  - ProcessingState enum (4 states: PENDING, PROCESSING, COMPLETED, FAILED)
  - Spanish labels: 'En cola', 'Generando', 'Completada', 'Fallida'
  - MediaUrls VO (validation: at least one URL required)
  - Meditation aggregate root (business rules enforced)
    * COMPLETED state requires mediaUrls
    * createdAt cannot be future
    * isPlayable() only true for COMPLETED
    * equality based on ID (DDD pattern)

-  T006: Domain Exceptions
  - MeditationNotFoundException (404 mapping)
  - MeditationNotPlayableException (409 mapping, Spanish user message)

-  All 54 tests passing
  * ProcessingStateTest: 12 tests
  * MediaUrlsTest: 13 tests
  * MeditationTest: 20 tests
  * MeditationNotFoundExceptionTest: 3 tests
  * MeditationNotPlayableExceptionTest: 6 tests

-  Zero Spring dependencies in domain
-  Java 21 records for immutability
-  Clock injection for testable time validation

Artifacts:
- backend/src/main/java/com/hexagonal/playback/domain/model/
- backend/src/main/java/com/hexagonal/playback/domain/exception/
- backend/src/test/java/com/hexagonal/playback/domain/
- specs/003-list-play-meditations/tasks.md (T005, T006 marked as [x])
-  T007: Domain Ports (In & Out)
  - ListMeditationsUseCase: input userId  output List<Meditation>
  - GetPlaybackInfoUseCase: input meditationId + userId  output Meditation
  - MeditationRepositoryPort: findAllByUserId, findByIdAndUserId
  - Pure interfaces, zero implementation

-  T008: Application Services & Validators (TDD cycle)
  - ListMeditationsService: Orchestrates repository port (delegates ordering to infra)
  - GetPlaybackInfoService: Validates meditation exists + belongs to user + delegates playability check
  - PlaybackValidator: Enforces COMPLETED-only rule (throws MeditationNotPlayableException)
  - Zero business logic in application layer (delegated to domain)

-  All 18 tests passing
  * ListMeditationsServiceTest: 5 tests
  * GetPlaybackInfoServiceTest: 7 tests
  * PlaybackValidatorTest: 6 tests

-  Mocked dependencies (MeditationRepositoryPort)
-  Fixed MeditationNotPlayableException.getUserMessage() to include state label

Artifacts:
- backend/src/main/java/com/hexagonal/playback/domain/ports/in/
- backend/src/main/java/com/hexagonal/playback/domain/ports/out/
- backend/src/main/java/com/hexagonal/playback/application/service/
- backend/src/test/java/com/hexagonal/playback/application/service/
- backend/src/main/java/com/hexagonal/playback/domain/exception/MeditationNotPlayableException.java (fixed getUserMessage)
- specs/003-list-play-meditations/tasks.md (T007, T008 marked as [x])
-  T009: PostgreSQL Persistence Layer
  - MeditationEntity maps to generation.meditations table
  - PostgreSqlMeditationRepository (Spring Data JPA)
  - EntityToDomainMapper (DB status  ProcessingState)
  - PostgreSqlMeditationRepositoryAdapter (implements MeditationRepositoryPort)
  - Integration tests with Testcontainers PostgreSQL (14/14 PASS)
-  State mapping: TIMEOUT  FAILED in Playback BC
-  **Architectural Decision**: Removed temporal validation from Playback BC Meditation
  - Rationale: Read-only BC consuming validated data from Generation BC
  - Trade-off: Less defensive programming, appropriate for read-only context
-  Domain exception improvements: State-specific Spanish user messages
-  All tests passing: Infrastructure (14), Domain (53), Application (18)
 T010: REST Controllers & DTOs (MockMvc tests: 8/8 PASS)

**REST Controller** (PlaybackController):
- GET /api/v1/playback/meditations
  - Lists user meditations ordered by createdAt DESC
  - Returns stateLabel (Spanish) + mediaUrls (nullable)
- GET /api/v1/playback/meditations/{id}
  - Returns playback info for COMPLETED meditations
  - Throws 404 if not found, 409 if not playable

**DTOs** (5 records):
- MeditationListResponseDto - meditation list wrapper
- MeditationItemDto - single meditation with state label
- PlaybackInfoResponseDto - playback info with media URLs
- MediaUrlsDto - audio/video/subtitles URLs (@JsonInclude NON_NULL)
- ErrorResponseDto - standardized error format

**DtoMapper** (@component):
- Domain Meditation  DTOs translation
- ProcessingState  Spanish labels:
  - PENDING  'En cola'
  - PROCESSING  'Generando'
  - COMPLETED  'Completada'
  - FAILED  'Fallida'

**Exception Handling**:
- PlaybackExceptionHandler (@RestControllerAdvice)
  - MeditationNotFoundException  404 Not Found
  - MeditationNotPlayableException  409 Conflict
  - Uses Clock bean for timestamps
- PlaybackConfig: @bean Clock (systemUTC)

**Testing** (PlaybackControllerTest - 8/8 GREEN):
- MockMvc integration tests with @WebMvcTest
- Excludes GlobalExceptionHandler (catch-all conflicts)
- Tests: list meditations, playback info, 404/409 responses, state labels
- X-User-Id header authentication (temporary until US1 JWT)

**Technical Decisions**:
1.  Temporary authentication: X-User-Id header instead of JWT (blocked by US1)
2. Excluded GlobalExceptionHandler in tests to avoid catch-all exception conflict
3. Removed basePackages from PlaybackExceptionHandler for test compatibility
4. @JsonInclude(NON_NULL) on mediaUrls/subtitlesUrl (optional fields)

**Test Results**:
- PlaybackControllerTest: 8/8 PASS
- All previous phases: Domain (53), Application (18), Infrastructure (14)
- Total unit tests: 93 GREEN
 T011: React UI Components
- Generated OpenAPI TypeScript client (typescript-fetch)
- Components: StateLabel, MeditationCard, MeditationList, MeditationPlayer
- Spanish labels + state-based styling
- Accessibility: ARIA labels, semantic HTML
- Play button disabled for non-COMPLETED meditations

 T012: State Management
- React Query hooks: useMeditationList, usePlaybackInfo
- Zustand store: playerStore (UI state)
- Server-state (React Query) vs UI-state (Zustand) separation
- Error handling: 404/409 responses with Spanish messages

 T013: Page & Routing
- MeditationLibraryPage: Full integration
- React Router v6: /library route + navigation
- QueryClientProvider setup
- Type-safe imports with vite-env.d.ts

Build:  SUCCESS (npm run build)
Dependencies: react-router-dom@^6 added

Tech Stack:
- React 18, TypeScript 5.3
- TanStack React Query 5.17
- Zustand 4.4
- React Router 6
- Vite 5
- Updated test results to reflect successful test run.
- Added E2E tests for meditation library listing, playback flow, and error handling.
- Verified that meditations are listed with correct state labels and playback functionality.
- Ensured error handling for playback failures is correctly displayed to users.
- Marked implementation tasks as complete in project documentation.
…ties

- Updated AiTextRequest to use new property accessors for model and parameters.
- Changed OpenAI API key in application-local.yml and application.yml for testing.
- Modified GenerateMeditationContentServiceTest to verify background image handling.
- Adjusted MeditationOutputTest to replace Optional checks with null checks for media URLs and image references.
- Updated GenerateMeditationContractTest and MeditationGenerationControllerTest to use fixed timestamps for consistency.
- Refactored integration tests for ImageGenerationAiAdapter and TextGenerationAiAdapter to use new OpenAiProperties structure.
- Updated PlaybackInfoServiceTest, ListMeditationsServiceTest, and PlaybackValidatorTest to use fixed timestamps for testing.
- Adjusted PostgreSqlMeditationRepositoryAdapterIT to use fixed timestamps for all insertions and checks.
@coderabbitai
Copy link

coderabbitai bot commented Feb 23, 2026

Important

Review skipped

Too many files!

This PR contains 291 files, which is 141 over the limit of 150.

📥 Commits

Reviewing files that changed from the base of the PR and between 5d918c5 and 2a7da23.

⛔ Files ignored due to path filters (9)
  • backend/calm-piano-02.mp3 is excluded by !**/*.mp3
  • backend/image-catalog/forest-01.jpg is excluded by !**/*.jpg
  • backend/meditation-music-03.mp3 is excluded by !**/*.mp3
  • backend/music-catalog/ambient-01.mp3 is excluded by !**/*.mp3
  • backend/music-catalog/zen-02.mp3 is excluded by !**/*.mp3
  • backend/nature-sounds-01.mp3 is excluded by !**/*.mp3
  • backend/package-lock.json is excluded by !**/package-lock.json
  • backend/peaceful-landscape.jpg is excluded by !**/*.jpg
  • frontend/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (291)
  • .dockerignore
  • .github/agents/speckit.analyze.agent.md
  • .github/agents/speckit.checklist.agent.md
  • .github/agents/speckit.clarify.agent.md
  • .github/agents/speckit.constitution.agent.md
  • .github/agents/speckit.implement.agent.md
  • .github/agents/speckit.plan.agent.md
  • .github/agents/speckit.specify.agent.md
  • .github/agents/speckit.tasks.agent.md
  • .github/agents/speckit.taskstoissues.agent.md
  • .github/copilot-instructions.md
  • .github/prompts/speckit.analyze.prompt.md
  • .github/prompts/speckit.checklist.prompt.md
  • .github/prompts/speckit.clarify.prompt.md
  • .github/prompts/speckit.constitution.prompt.md
  • .github/prompts/speckit.implement.prompt.md
  • .github/prompts/speckit.plan.prompt.md
  • .github/prompts/speckit.specify.prompt.md
  • .github/prompts/speckit.tasks.prompt.md
  • .github/prompts/speckit.taskstoissues.prompt.md
  • .github/workflows/README.md
  • .github/workflows/backend-ci.yml
  • .github/workflows/frontend-ci.yml
  • .gitignore
  • .specify/instructions/backend.instructions.md
  • .specify/instructions/delivery-playbook-backend.md
  • .specify/instructions/delivery-playbook-frontend.md
  • .specify/instructions/engineering-guidelines.md
  • .specify/instructions/hexagonal-architecture-guide.md
  • .specify/instructions/java21-best-practices.md
  • .specify/instructions/testing.instructions.md
  • .specify/memory/constitution.md
  • .specify/scripts/powershell/check-prerequisites.ps1
  • .specify/scripts/powershell/common.ps1
  • .specify/scripts/powershell/create-new-feature.ps1
  • .specify/scripts/powershell/setup-plan.ps1
  • .specify/scripts/powershell/update-agent-context.ps1
  • .specify/templates/agent-file-template.md
  • .specify/templates/checklist-template.md
  • .specify/templates/plan-template.md
  • .specify/templates/spec-template.md
  • .specify/templates/tasks-template.md
  • .vscode/settings.json
  • backend/Dockerfile
  • backend/FFMPEG-SETUP.md
  • backend/GOOGLE-TTS-QUICKSTART.md
  • backend/GOOGLE-TTS-SETUP.md
  • backend/IMPLEMENTATION-SUMMARY.md
  • backend/INSTALL-FFMPEG-MANUAL.md
  • backend/LOCALSTACK-SETUP.md
  • backend/PHASE4_ERRORS.md
  • backend/SPEECH-MUSIC-SYNC.md
  • backend/create-s3-bucket.ps1
  • backend/docker-compose.yml
  • backend/init-localstack.sh
  • backend/install-ffmpeg.bat
  • backend/mass-populate-s3.sh
  • backend/music-catalog/music-123
  • backend/policy.json
  • backend/pom.xml
  • backend/restore-s3.ps1
  • backend/setup-google-tts.ps1
  • backend/src/main/java/com/hexagonal/meditation/generation/application/service/GenerateMeditationContentService.java
  • backend/src/main/java/com/hexagonal/meditation/generation/application/service/IdempotencyKeyGenerator.java
  • backend/src/main/java/com/hexagonal/meditation/generation/application/validator/TextLengthEstimator.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/enums/GenerationStatus.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/enums/MediaType.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/exception/GenerationTimeoutException.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/exception/InvalidContentException.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/model/GeneratedMeditationContent.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/model/MediaReference.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/model/MeditationOutput.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/model/NarrationScript.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/model/SubtitleSegment.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/in/GenerateMeditationContentUseCase.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/AudioRenderingPort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/ContentRepositoryPort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/MediaStoragePort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/SubtitleSyncPort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/VideoRenderingPort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/domain/ports/out/VoiceSynthesisPort.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/config/FfmpegConfig.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/config/GenerationConfig.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/config/GoogleCloudTtsConfig.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/config/S3Config.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/controller/FileUploadController.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/controller/MeditationGenerationController.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/dto/GenerateMeditationRequest.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/dto/GenerationResponse.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/dto/UploadFileResponse.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/in/rest/mapper/MeditationOutputDtoMapper.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/ffmpeg/FfmpegAudioRendererAdapter.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/ffmpeg/FfmpegVideoRendererAdapter.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/storage/S3MediaStorageAdapter.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/tts/GoogleTtsAdapter.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/persistence/PostgresContentRepository.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/persistence/entity/MeditationOutputEntity.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/persistence/mapper/MeditationOutputMapper.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/persistence/repository/JpaMeditationOutputRepository.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/service/audio/AudioMetadataService.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/service/file/TempFileManager.java
  • backend/src/main/java/com/hexagonal/meditation/generation/infrastructure/out/service/subtitle/SubtitleSyncService.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/MeditationBuilderApplication.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/mapper/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/service/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/service/ComposeContentService.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/service/GenerateImageService.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/service/GenerateTextService.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/validator/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/validator/TextLengthValidator.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/application/validator/ValidationResult.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/enums/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/enums/OutputType.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/CompositionNotFoundException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/ImageGenerationException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/ImageGenerationServiceException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/MusicNotFoundException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/TextGenerationException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/exception/TextGenerationServiceException.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/model/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/model/ImageReference.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/model/MeditationComposition.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/model/MusicReference.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/model/TextContent.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/in/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/in/ComposeContentUseCase.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/in/GenerateImageUseCase.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/in/GenerateTextUseCase.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/out/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/out/CompositionRepositoryPort.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/out/ImageGenerationPort.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/out/MediaCatalogPort.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/domain/ports/out/TextGenerationPort.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/AiProperties.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/AiTextRequestInitializer.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/ClockConfig.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/InfrastructureConfig.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/MediaCatalogProperties.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/ObservabilityConfig.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/OpenAiProperties.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/PersistenceConfig.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/RetryProperties.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/config/WebConfig.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/controller/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/controller/GlobalExceptionHandler.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/controller/MeditationBuilderController.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/CompositionResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/CreateCompositionRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/ErrorResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/GenerateTextRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/ImagePreviewResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/ImageReferenceResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/MusicPreviewResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/OutputTypeResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/SelectMusicRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/SetImageRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/TextContentResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/dto/UpdateTextRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/mapper/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/mapper/CompositionDtoMapper.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/persistence/InMemoryCompositionRepository.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/.gitkeep
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/ImageGenerationAiAdapter.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/MediaCatalogAdapter.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/TextGenerationAiAdapter.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/dto/AiImageRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/dto/AiImageResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/dto/AiTextRequest.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/dto/AiTextResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/dto/MediaCatalogResponse.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/mapper/AiImageMapper.java
  • backend/src/main/java/com/hexagonal/meditationbuilder/infrastructure/out/service/mapper/AiTextMapper.java
  • backend/src/main/java/com/hexagonal/playback/application/service/GetPlaybackInfoService.java
  • backend/src/main/java/com/hexagonal/playback/application/service/ListMeditationsService.java
  • backend/src/main/java/com/hexagonal/playback/application/service/PlaybackValidator.java
  • backend/src/main/java/com/hexagonal/playback/domain/exception/MeditationNotFoundException.java
  • backend/src/main/java/com/hexagonal/playback/domain/exception/MeditationNotPlayableException.java
  • backend/src/main/java/com/hexagonal/playback/domain/model/MediaUrls.java
  • backend/src/main/java/com/hexagonal/playback/domain/model/Meditation.java
  • backend/src/main/java/com/hexagonal/playback/domain/model/ProcessingState.java
  • backend/src/main/java/com/hexagonal/playback/domain/ports/in/GetPlaybackInfoUseCase.java
  • backend/src/main/java/com/hexagonal/playback/domain/ports/in/ListMeditationsUseCase.java
  • backend/src/main/java/com/hexagonal/playback/domain/ports/out/MeditationRepositoryPort.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/config/PlaybackConfig.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/controller/PlaybackController.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/dto/ErrorResponseDto.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/dto/MediaUrlsDto.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/dto/MeditationItemDto.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/dto/MeditationListResponseDto.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/dto/PlaybackInfoResponseDto.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/exception/PlaybackExceptionHandler.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/in/rest/mapper/DtoMapper.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/out/persistence/EntityToDomainMapper.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/out/persistence/MeditationEntity.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/out/persistence/PostgreSqlMeditationRepository.java
  • backend/src/main/java/com/hexagonal/playback/infrastructure/out/persistence/PostgreSqlMeditationRepositoryAdapter.java
  • backend/src/main/resources/application-local.yml
  • backend/src/main/resources/application-local.yml.example
  • backend/src/main/resources/application.yml
  • backend/src/main/resources/db/migration/V001__create_meditation_output_table.sql
  • backend/src/main/resources/db/migration/V002__add_duration_seconds_to_meditation_output.sql
  • backend/src/main/resources/db/migration/V003__seed_playback_demo_data.sql
  • backend/src/main/resources/openapi/generation/generate-meditation.yaml
  • backend/src/main/resources/openapi/meditationbuilder/.gitkeep
  • backend/src/main/resources/openapi/meditationbuilder/compose-content.yaml
  • backend/src/main/resources/openapi/playback/list-play-meditations.yaml
  • backend/src/test/contracts/.gitkeep
  • backend/src/test/e2e/.gitkeep
  • backend/src/test/java/com/hexagonal/meditation/generation/application/service/GenerateMeditationContentServiceTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/application/service/IdempotencyKeyGeneratorTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/application/validator/TextLengthEstimatorTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/bdd/CucumberSpringConfiguration.java
  • backend/src/test/java/com/hexagonal/meditation/generation/bdd/GenerateMeditationBDDTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/bdd/steps/GenerateMeditationSteps.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/enums/GenerationStatusTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/enums/MediaTypeTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/model/MediaReferenceTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/model/MeditationOutputTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/model/NarrationScriptTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/domain/model/SubtitleSegmentTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/e2e/GenerateMeditationE2ETest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/in/rest/controller/GenerateMeditationContractTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/in/rest/controller/MeditationGenerationControllerTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/in/rest/mapper/MeditationOutputDtoMapperTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/ffmpeg/FfmpegAudioRendererAdapterTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/ffmpeg/FfmpegVideoRendererAdapterTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/storage/S3MediaStorageAdapterIntegrationTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/storage/S3MediaStorageAdapterTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/adapter/tts/GoogleTtsAdapterTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/persistence/PostgresContentRepositoryTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/service/file/TempFileManagerTest.java
  • backend/src/test/java/com/hexagonal/meditation/generation/infrastructure/out/service/subtitle/SubtitleSyncServiceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/application/service/ComposeContentServiceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/application/service/GenerateImageServiceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/application/service/GenerateTextServiceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/application/validator/TextLengthValidatorTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/bdd/ComposeContentBDDTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/bdd/CompositionCucumberSpringConfiguration.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/bdd/steps/ComposeContentSteps.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/domain/enums/OutputTypeTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/domain/model/ImageReferenceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/domain/model/MeditationCompositionTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/domain/model/MusicReferenceTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/domain/model/TextContentTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/e2e/AiGenerationE2ETest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/e2e/ManualCompositionE2ETest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/controller/MeditationBuilderControllerTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/in/rest/mapper/CompositionDtoMapperTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/out/service/ImageGenerationAiAdapterIntegrationTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/out/service/MediaCatalogAdapterIntegrationTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/out/service/TextGenerationAiAdapterIntegrationTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/out/service/mapper/AiImageMapperTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/infrastructure/out/service/mapper/AiTextMapperTest.java
  • backend/src/test/java/com/hexagonal/meditationbuilder/observability/ObservabilityIntegrationTest.java
  • backend/src/test/java/com/hexagonal/playback/application/service/GetPlaybackInfoServiceTest.java
  • backend/src/test/java/com/hexagonal/playback/application/service/ListMeditationsServiceTest.java
  • backend/src/test/java/com/hexagonal/playback/application/service/PlaybackValidatorTest.java
  • backend/src/test/java/com/hexagonal/playback/bdd/PlaybackBDDTest.java
  • backend/src/test/java/com/hexagonal/playback/bdd/PlaybackCucumberSpringConfiguration.java
  • backend/src/test/java/com/hexagonal/playback/bdd/steps/PlaybackSteps.java
  • backend/src/test/java/com/hexagonal/playback/domain/exception/MeditationNotFoundExceptionTest.java
  • backend/src/test/java/com/hexagonal/playback/domain/exception/MeditationNotPlayableExceptionTest.java
  • backend/src/test/java/com/hexagonal/playback/domain/model/MediaUrlsTest.java
  • backend/src/test/java/com/hexagonal/playback/domain/model/MeditationTest.java
  • backend/src/test/java/com/hexagonal/playback/domain/model/ProcessingStateTest.java
  • backend/src/test/java/com/hexagonal/playback/infrastructure/in/rest/controller/PlaybackContractTest.java
  • backend/src/test/java/com/hexagonal/playback/infrastructure/in/rest/controller/PlaybackControllerTest.java
  • backend/src/test/java/com/hexagonal/playback/infrastructure/out/persistence/PostgreSqlMeditationRepositoryAdapterIT.java
  • backend/src/test/resources/application-test.yml
  • backend/src/test/resources/application-webmvctest.properties
  • backend/src/test/resources/cucumber.properties
  • backend/src/test/resources/features/generation/generate-meditation.feature
  • backend/src/test/resources/features/playback/list-play-meditations.feature
  • backend/src/test/resources/meditationbuilder/compose-content.feature
  • docs/01-PRD-design-document.md
  • docs/02.User-Stories.md
  • docs/03.Backlog-tickets.md
  • docs/04.US1-TIckets.md
  • docs/05.US2-TIckets.md
  • docs/06.US3-TIckets.md
  • docs/07.US4-TIckets.md
  • docs/api/playback.md
  • frontend/.gitignore
  • frontend/index.html
  • frontend/openapitools.json
  • frontend/package.json
  • frontend/playwright-report/index.html
  • frontend/playwright-report/junit.xml
  • frontend/playwright.config.ts
  • frontend/scripts/postprocess-openapi.mjs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant