From b1957c1c8160aba1854411b5e80465518c158f1e Mon Sep 17 00:00:00 2001 From: dahoud Date: Fri, 27 Feb 2026 14:41:07 +0000 Subject: [PATCH] feat(unionflow): ajout Spec-Kit, constitution, mission mutuelles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Config Spec-Kit pour Spec-Driven Development - CONSTITUTION.md + .specify/memory/constitution.md - Commandes Cursor /speckit.*, règles projet - Mission: associations + mutuelles d'épargne et de financement - .gitignore: versionner config spec-kit unionflow Made-with: Cursor --- .gitignore | 18 + unionflow/.cursor/commands/speckit.analyze.md | 187 ++ .../.cursor/commands/speckit.checklist.md | 297 +++ unionflow/.cursor/commands/speckit.clarify.md | 184 ++ .../.cursor/commands/speckit.constitution.md | 84 + .../.cursor/commands/speckit.implement.md | 138 ++ unionflow/.cursor/commands/speckit.plan.md | 96 + unionflow/.cursor/commands/speckit.specify.md | 261 +++ unionflow/.cursor/commands/speckit.tasks.md | 140 ++ .../.cursor/commands/speckit.taskstoissues.md | 33 + unionflow/.cursor/rules/unionflow-backend.mdc | 30 + unionflow/.cursor/rules/unionflow-mobile.mdc | 29 + .../.cursor/rules/unionflow-spec-kit.mdc | 37 + unionflow/.specify/memory/constitution.md | 737 +++++++ .../powershell/check-prerequisites.ps1 | 148 ++ .../.specify/scripts/powershell/common.ps1 | 142 ++ .../scripts/powershell/create-new-feature.ps1 | 289 +++ .../scripts/powershell/setup-plan.ps1 | 61 + .../powershell/update-agent-context.ps1 | 452 ++++ .../.specify/templates/agent-file-template.md | 28 + .../.specify/templates/checklist-template.md | 40 + .../templates/constitution-template.md | 50 + unionflow/.specify/templates/plan-template.md | 104 + unionflow/.specify/templates/spec-template.md | 115 + .../.specify/templates/tasks-template.md | 251 +++ unionflow/CONSTITUTION.md | 737 +++++++ unionflow/LACUNES_MATURITE_PROFESSIONNELLE.md | 195 ++ unionflow/SPEC-KIT.md | 65 + unionflow/lombok.config | 2 + .../specs/000-unionflow-baseline/spec.md | 59 + .../unionflow-client-quarkus-primefaces-freya | 1 + unionflow/unionflow-mobile-apps/.gitignore | 43 + unionflow/unionflow-mobile-apps/README.md | 39 + .../analysis_options.yaml | 28 + .../unionflow-mobile-apps/android/.gitignore | 13 + .../android/app/build.gradle | 55 + .../android/app/proguard-rules.pro | 17 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 74 + .../unionflow_mobile_apps/MainActivity.kt | 29 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../main/res/xml/network_security_config.xml | 17 + .../app/src/profile/AndroidManifest.xml | 7 + .../android/build.gradle | 39 + .../android/gradle.properties | 15 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 25 + .../unionflow-mobile-apps/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../ios/Flutter/Debug.xcconfig | 1 + .../ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 616 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/Info.plist | 56 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../ios/RunnerTests/RunnerTests.swift | 12 + unionflow/unionflow-mobile-apps/l10n.yaml | 4 + .../unionflow-mobile-apps/lib/app/app.dart | 72 + .../lib/app/router/app_router.dart | 37 + .../lib/core/config/environment.dart | 96 + .../lib/core/constants/app_constants.dart | 299 +++ .../lib/core/di/app_di.dart | 120 + .../lib/core/di/injection_container.dart | 15 + .../lib/core/error/error_handler.dart | 192 ++ .../lib/core/error/exceptions.dart | 50 + .../lib/core/error/failures.dart | 71 + .../lib/core/l10n/locale_provider.dart | 102 + .../core/navigation/adaptive_navigation.dart | 561 +++++ .../lib/core/navigation/app_router.dart | 42 + .../navigation/main_navigation_layout.dart | 537 +++++ .../lib/core/network/dio_client.dart | 214 ++ .../lib/core/network/network_info.dart | 19 + .../core/storage/dashboard_cache_manager.dart | 418 ++++ .../lib/core/usecases/usecase.dart | 17 + .../lib/core/utils/logger.dart | 302 +++ .../about/presentation/pages/about_page.dart | 873 ++++++++ .../adhesions/bloc/adhesions_bloc.dart | 121 + .../adhesions/bloc/adhesions_event.dart | 81 + .../adhesions/bloc/adhesions_state.dart | 42 + .../adhesions/data/models/adhesion_model.dart | 139 ++ .../data/models/adhesion_model.g.dart | 69 + .../repositories/adhesion_repository.dart | 178 ++ .../features/adhesions/di/adhesions_di.dart | 16 + .../pages/adhesion_detail_page.dart | 245 ++ .../presentation/pages/adhesions_page.dart | 298 +++ .../pages/adhesions_page_wrapper.dart | 26 + .../widgets/create_adhesion_dialog.dart | 174 ++ .../widgets/paiement_adhesion_dialog.dart | 140 ++ .../widgets/rejet_adhesion_dialog.dart | 82 + .../features/admin/bloc/admin_users_bloc.dart | 89 + .../admin/bloc/admin_users_event.dart | 29 + .../admin/bloc/admin_users_state.dart | 47 + .../admin/data/models/admin_user_model.dart | 66 + .../repositories/admin_user_repository.dart | 85 + .../lib/features/admin/di/admin_di.dart | 15 + .../pages/user_management_detail_page.dart | 153 ++ .../pages/user_management_page.dart | 180 ++ .../datasources/dashboard_cache_manager.dart | 71 + .../datasources/keycloak_auth_service.dart | 419 ++++ .../datasources/keycloak_role_mapper.dart | 344 +++ .../keycloak_webview_auth_service.dart | 682 ++++++ .../data/datasources/permission_engine.dart | 375 ++++ .../data/models/permission_matrix.dart | 212 ++ .../authentication/data/models/user.dart | 359 +++ .../authentication/data/models/user_role.dart | 319 +++ .../presentation/bloc/auth_bloc.dart | 468 ++++ .../pages/keycloak_webview_auth_page.dart | 583 +++++ .../presentation/pages/login_page.dart | 738 +++++++ .../presentation/pages/backup_page.dart | 568 +++++ .../bloc/contributions_bloc.dart | 320 +++ .../bloc/contributions_event.dart | 225 ++ .../bloc/contributions_state.dart | 172 ++ .../data/models/contribution_model.dart | 316 +++ .../data/models/contribution_model.g.dart | 111 + .../repositories/contribution_repository.dart | 172 ++ .../contributions/di/contributions_di.dart | 21 + .../pages/contributions_page.dart | 512 +++++ .../pages/contributions_page_wrapper.dart | 30 + .../widgets/create_contribution_dialog.dart | 256 +++ .../presentation/widgets/payment_dialog.dart | 396 ++++ .../dashboard/config/dashboard_config.dart | 309 +++ .../data/cache/dashboard_cache_manager.dart | 400 ++++ .../dashboard_remote_datasource.dart | 121 + .../data/models/dashboard_stats_model.dart | 216 ++ .../data/models/dashboard_stats_model.g.dart | 123 ++ .../dashboard_repository_impl.dart | 162 ++ .../services/dashboard_export_service.dart | 507 +++++ .../dashboard_notification_service.dart | 392 ++++ .../services/dashboard_offline_service.dart | 498 +++++ .../dashboard_performance_monitor.dart | 526 +++++ .../features/dashboard/di/dashboard_di.dart | 58 + .../domain/entities/dashboard_entity.dart | 230 ++ .../repositories/dashboard_repository.dart | 27 + .../domain/usecases/get_dashboard_data.dart | 120 + .../presentation/bloc/dashboard_bloc.dart | 174 ++ .../presentation/bloc/dashboard_event.dart | 77 + .../presentation/bloc/dashboard_state.dart | 39 + .../pages/advanced_dashboard_page.dart | 483 ++++ .../pages/connected_dashboard_page.dart | 158 ++ .../active_member_dashboard.dart | 275 +++ .../role_dashboards/consultant_dashboard.dart | 767 +++++++ .../role_dashboards/hr_manager_dashboard.dart | 915 ++++++++ .../role_dashboards/moderator_dashboard.dart | 230 ++ .../role_dashboards/org_admin_dashboard.dart | 1082 +++++++++ .../role_dashboards/role_dashboards.dart | 11 + .../simple_member_dashboard.dart | 360 +++ .../super_admin_dashboard.dart | 1082 +++++++++ .../role_dashboards/visitor_dashboard.dart | 554 +++++ .../charts/dashboard_chart_widget.dart | 410 ++++ .../widgets/common/activity_item.dart | 463 ++++ .../widgets/common/section_header.dart | 302 +++ .../widgets/common/stat_card.dart | 292 +++ .../components/cards/performance_card.dart | 260 +++ .../connected_recent_activities.dart | 365 +++ .../connected/connected_stats_card.dart | 203 ++ .../connected/connected_upcoming_events.dart | 420 ++++ .../widgets/dashboard_drawer.dart | 191 ++ .../widgets/dashboard_widgets.dart | 255 +++ .../metrics/real_time_metrics_widget.dart | 439 ++++ .../performance_monitor_widget.dart | 509 +++++ .../navigation/dashboard_navigation.dart | 412 ++++ .../dashboard_notifications_widget.dart | 443 ++++ .../search/dashboard_search_widget.dart | 321 +++ .../settings/theme_selector_widget.dart | 337 +++ .../shortcuts/dashboard_shortcuts_widget.dart | 255 +++ .../presentation/widgets/widgets.dart | 28 + .../features/events/bloc/evenements_bloc.dart | 445 ++++ .../events/bloc/evenements_event.dart | 150 ++ .../events/bloc/evenements_state.dart | 194 ++ .../events/data/models/evenement_model.dart | 348 +++ .../events/data/models/evenement_model.g.dart | 111 + .../evenement_repository_impl.dart | 358 +++ .../lib/features/events/di/evenements_di.dart | 36 + .../presentation/pages/event_detail_page.dart | 411 ++++ .../presentation/pages/events_page.dart | 1259 +++++++++++ .../pages/events_page_connected.dart | 602 +++++ .../pages/events_page_wrapper.dart | 275 +++ .../widgets/create_event_dialog.dart | 428 ++++ .../widgets/edit_event_dialog.dart | 511 +++++ .../widgets/inscription_event_dialog.dart | 320 +++ .../presentation/pages/help_support_page.dart | 1064 +++++++++ .../features/members/bloc/membres_bloc.dart | 419 ++++ .../features/members/bloc/membres_event.dart | 143 ++ .../features/members/bloc/membres_state.dart | 180 ++ .../data/models/membre_complete_model.dart | 329 +++ .../data/models/membre_complete_model.g.dart | 106 + .../members/data/models/membre_model.dart | 69 + .../repositories/membre_repository_impl.dart | 320 +++ .../data/services/membre_search_service.dart | 278 +++ .../lib/features/members/di/membres_di.dart | 45 + .../pages/advanced_search_page.dart | 579 +++++ .../presentation/pages/members_page.dart | 1962 +++++++++++++++++ .../pages/members_page_connected.dart | 956 ++++++++ .../pages/members_page_wrapper.dart | 267 +++ .../widgets/add_member_dialog.dart | 403 ++++ .../widgets/edit_member_dialog.dart | 441 ++++ .../widgets/membre_search_form.dart | 433 ++++ .../widgets/membre_search_results.dart | 380 ++++ .../widgets/search_statistics_card.dart | 416 ++++ .../data/models/notification_model.dart | 95 + .../repositories/notification_repository.dart | 75 + .../notifications/di/notifications_di.dart | 25 + .../presentation/bloc/notifications_bloc.dart | 86 + .../bloc/notifications_event.dart | 33 + .../bloc/notifications_state.dart | 50 + .../pages/notifications_page.dart | 1093 +++++++++ .../pages/notifications_page_wrapper.dart | 20 + .../bloc/organizations_bloc.dart | 521 +++++ .../bloc/organizations_event.dart | 186 ++ .../bloc/organizations_state.dart | 301 +++ .../data/models/organization_model.dart | 434 ++++ .../data/models/organization_model.g.dart | 110 + .../repositories/organization_repository.dart | 296 +++ .../data/services/organization_service.dart | 329 +++ .../organizations/di/organizations_di.dart | 59 + .../pages/create_organization_page.dart | 533 +++++ .../pages/edit_organization_page.dart | 705 ++++++ .../pages/organization_detail_page.dart | 806 +++++++ .../pages/organizations_page.dart | 736 +++++++ .../pages/organizations_page_wrapper.dart | 21 + .../widgets/create_organization_dialog.dart | 403 ++++ .../widgets/edit_organization_dialog.dart | 485 ++++ .../widgets/organization_card.dart | 306 +++ .../widgets/organization_filter_widget.dart | 301 +++ .../widgets/organization_search_bar.dart | 113 + .../widgets/organization_stats_widget.dart | 160 ++ .../data/repositories/profile_repository.dart | 64 + .../lib/features/profile/di/profile_di.dart | 25 + .../presentation/bloc/profile_bloc.dart | 77 + .../presentation/bloc/profile_event.dart | 27 + .../presentation/bloc/profile_state.dart | 52 + .../presentation/pages/profile_page.dart | 1852 ++++++++++++++++ .../pages/profile_page_wrapper.dart | 20 + .../reports/data/models/analytics_model.dart | 108 + .../data/repositories/reports_repository.dart | 122 + .../lib/features/reports/di/reports_di.dart | 25 + .../presentation/bloc/reports_bloc.dart | 43 + .../presentation/bloc/reports_event.dart | 28 + .../presentation/bloc/reports_state.dart | 41 + .../presentation/pages/reports_page.dart | 700 ++++++ .../pages/reports_page_wrapper.dart | 20 + .../presentation/pages/feedback_page.dart | 343 +++ .../pages/language_settings_page.dart | 279 +++ .../pages/privacy_settings_page.dart | 386 ++++ .../pages/system_settings_page.dart | 1478 +++++++++++++ .../solidarity/bloc/solidarity_bloc.dart | 90 + .../solidarity/bloc/solidarity_event.dart | 53 + .../solidarity/bloc/solidarity_state.dart | 38 + .../data/models/demande_aide_model.dart | 96 + .../data/models/demande_aide_model.g.dart | 59 + .../repositories/demande_aide_repository.dart | 113 + .../features/solidarity/di/solidarity_di.dart | 16 + .../pages/demande_aide_detail_page.dart | 179 ++ .../pages/demandes_aide_page.dart | 285 +++ .../pages/demandes_aide_page_wrapper.dart | 26 + .../widgets/create_demande_aide_dialog.dart | 201 ++ .../unionflow-mobile-apps/lib/l10n/app_en.arb | 292 +++ .../unionflow-mobile-apps/lib/l10n/app_fr.arb | 292 +++ unionflow/unionflow-mobile-apps/lib/main.dart | 60 + .../components/buttons/uf_primary_button.dart | 103 + .../buttons/uf_secondary_button.dart | 82 + .../components/cards/uf_card.dart | 158 ++ .../components/cards/uf_info_card.dart | 92 + .../components/cards/uf_metric_card.dart | 76 + .../components/cards/uf_stat_card.dart | 143 ++ .../design_system/components/components.dart | 43 + .../components/inputs/uf_dropdown_tile.dart | 99 + .../components/inputs/uf_switch_tile.dart | 90 + .../design_system/components/uf_app_bar.dart | 60 + .../components/uf_container.dart | 138 ++ .../design_system/components/uf_header.dart | 127 ++ .../components/uf_page_header.dart | 248 +++ .../shared/design_system/dashboard_theme.dart | 246 +++ .../dashboard_theme_manager.dart | 337 +++ .../theme/app_theme_sophisticated.dart | 457 ++++ .../unionflow_design_system.dart | 57 + .../shared/models/membre_search_criteria.dart | 328 +++ .../shared/models/membre_search_result.dart | 269 +++ .../lib/shared/widgets/adaptive_widget.dart | 396 ++++ .../shared/widgets/confirmation_dialog.dart | 292 +++ .../lib/shared/widgets/error_widget.dart | 168 ++ .../lib/shared/widgets/loading_widget.dart | 244 ++ unionflow/unionflow-mobile-apps/pubspec.yaml | 85 + .../features/dashboard/dashboard_test.dart | 268 +++ .../unit/core/error/error_handler_test.dart | 345 +++ unionflow/unionflow-mobile-apps/test_app.bat | 37 + .../unionflow-mobile-apps/web/favicon.png | Bin 0 -> 917 bytes .../web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../unionflow-mobile-apps/web/index.html | 39 + .../unionflow-mobile-apps/web/manifest.json | 35 + unionflow/unionflow-server-api/.gitignore | 143 ++ .../unionflow-server-api/check_coverage.ps1 | 3 + .../unionflow-server-api/check_coverage.py | 15 + .../checkstyle-unionflow.xml | 359 +++ .../unionflow-server-api/effective-api-pom | 488 ++++ unionflow/unionflow-server-api/lombok.config | 2 + .../unionflow-server-api/membre_bytecode.txt | 1436 ++++++++++++ unionflow/unionflow-server-api/methods.txt | 628 ++++++ unionflow/unionflow-server-api/parent-pom.xml | 96 + unionflow/unionflow-server-api/pom.xml | 241 ++ .../script/publish-api.bat | 30 + .../script/publish-api.sh | 32 + .../request/CreateAbonnementRequest.java | 82 + .../request/UpdateAbonnementRequest.java | 77 + .../response/AbonnementResponse.java | 81 + .../admin/request/CreateAuditLogRequest.java | 29 + .../dto/admin/response/AuditLogResponse.java | 33 + .../adresse/request/CreateAdresseRequest.java | 43 + .../adresse/request/UpdateAdresseRequest.java | 36 + .../dto/adresse/response/AdresseResponse.java | 42 + .../api/dto/agricole/CampagneAgricoleDTO.java | 35 + .../dto/analytics/AnalyticsDataResponse.java | 265 +++ .../analytics/DashboardWidgetResponse.java | 350 +++ .../api/dto/analytics/KPITrendResponse.java | 309 +++ .../api/dto/analytics/ReportConfigDTO.java | 333 +++ .../api/dto/ayantdroit/AyantDroitRequest.java | 42 + .../dto/ayantdroit/AyantDroitResponse.java | 40 + .../server/api/dto/base/BaseDTO.java | 164 ++ .../server/api/dto/base/BaseResponse.java | 49 + .../server/api/dto/base/PageResponse.java | 59 + .../CampagneCollecteResponse.java | 45 + .../ContributionCollecteDTO.java | 42 + .../request/CreateCompteComptableRequest.java | 28 + .../CreateEcritureComptableRequest.java | 41 + .../CreateJournalComptableRequest.java | 24 + .../request/CreateLigneEcritureRequest.java | 30 + .../request/UpdateCompteComptableRequest.java | 26 + .../UpdateEcritureComptableRequest.java | 34 + .../UpdateJournalComptableRequest.java | 21 + .../request/UpdateLigneEcritureRequest.java | 24 + .../response/CompteComptableResponse.java | 36 + .../response/EcritureComptableResponse.java | 42 + .../response/JournalComptableResponse.java | 34 + .../response/LigneEcritureResponse.java | 34 + .../request/CreateConfigurationRequest.java | 22 + .../request/UpdateConfigurationRequest.java | 22 + .../response/ConfigurationResponse.java | 34 + .../request/CreateCotisationRequest.java | 62 + .../request/UpdateCotisationRequest.java | 48 + .../response/CotisationResponse.java | 61 + .../response/CotisationSummaryResponse.java | 35 + .../server/api/dto/culte/DonReligieuxDTO.java | 33 + .../dto/dashboard/DashboardDataResponse.java | 122 + .../dto/dashboard/DashboardStatsResponse.java | 98 + .../dto/dashboard/RecentActivityResponse.java | 130 ++ .../dto/dashboard/UpcomingEventResponse.java | 174 ++ .../request/CreateDocumentRequest.java | 26 + .../request/CreatePieceJointeRequest.java | 22 + .../request/UpdateDocumentRequest.java | 18 + .../request/UpdatePieceJointeRequest.java | 17 + .../document/response/DocumentResponse.java | 37 + .../response/PieceJointeResponse.java | 32 + .../request/CreateEvenementRequest.java | 70 + .../request/UpdateEvenementRequest.java | 65 + .../evenement/response/EvenementResponse.java | 205 ++ .../favoris/request/CreateFavoriRequest.java | 26 + .../dto/favoris/response/FavoriResponse.java | 38 + .../request/CreateAdhesionRequest.java | 33 + .../request/UpdateAdhesionRequest.java | 38 + .../finance/response/AdhesionResponse.java | 172 ++ .../CreateFormuleAbonnementRequest.java | 51 + .../UpdateFormuleAbonnementRequest.java | 49 + .../response/FormuleAbonnementResponse.java | 162 ++ .../gouvernance/EchelonOrganigrammeDTO.java | 29 + .../api/dto/membre/MembreSearchCriteria.java | 226 ++ .../api/dto/membre/MembreSearchResultDTO.java | 227 ++ .../membre/request/CreateMembreRequest.java | 49 + .../membre/request/UpdateMembreRequest.java | 26 + .../dto/membre/response/MembreResponse.java | 65 + .../response/MembreSummaryResponse.java | 22 + .../mutuelle/credit/DemandeCreditRequest.java | 49 + .../credit/DemandeCreditResponse.java | 48 + .../mutuelle/credit/EcheanceCreditDTO.java | 44 + .../mutuelle/credit/GarantieDemandeDTO.java | 28 + .../epargne/CompteEpargneRequest.java | 33 + .../epargne/CompteEpargneResponse.java | 42 + .../epargne/TransactionEpargneRequest.java | 37 + .../epargne/TransactionEpargneResponse.java | 38 + .../notification/ActionNotificationDTO.java | 477 ++++ .../PreferenceCanalNotificationDTO.java | 119 + .../PreferenceTypeNotificationDTO.java | 132 ++ .../PreferencesNotificationDTO.java | 636 ++++++ .../request/CreateNotificationRequest.java | 25 + .../CreateTemplateNotificationRequest.java | 22 + .../request/UpdateNotificationRequest.java | 18 + .../UpdateTemplateNotificationRequest.java | 22 + .../response/NotificationResponse.java | 41 + .../TemplateNotificationResponse.java | 33 + .../server/api/dto/ong/ProjetOngDTO.java | 35 + .../request/CreateOrganisationRequest.java | 74 + .../request/UpdateOrganisationRequest.java | 48 + .../response/OrganisationResponse.java | 87 + .../response/OrganisationSummaryResponse.java | 23 + .../api/dto/paiement/WaveBalanceDTO.java | 363 +++ .../dto/paiement/WaveCheckoutSessionDTO.java | 168 ++ .../api/dto/paiement/WaveWebhookDTO.java | 464 ++++ .../request/CreatePaiementRequest.java | 31 + .../paiement/response/PaiementResponse.java | 48 + .../response/PaiementSummaryResponse.java | 24 + .../request/CreateTypeReferenceRequest.java | 56 + .../request/UpdateTypeReferenceRequest.java | 45 + .../response/TypeReferenceResponse.java | 64 + .../registre/AgrementProfessionnelDTO.java | 33 + .../dto/role/request/CreateRoleRequest.java | 20 + .../dto/role/request/UpdateRoleRequest.java | 17 + .../dto/role/response/PermissionResponse.java | 28 + .../api/dto/role/response/RoleResponse.java | 30 + .../dto/solidarite/BeneficiaireAideDTO.java | 71 + .../dto/solidarite/ContactProposantDTO.java | 77 + .../api/dto/solidarite/ContactUrgenceDTO.java | 64 + .../solidarite/CreneauDisponibiliteDTO.java | 139 ++ .../dto/solidarite/CritereSelectionDTO.java | 54 + .../dto/solidarite/HistoriqueStatutDTO.java | 62 + .../api/dto/solidarite/LocalisationDTO.java | 58 + .../dto/solidarite/PieceJustificativeDTO.java | 68 + .../request/CreateCommentaireAideRequest.java | 25 + .../request/CreateDemandeAideRequest.java | 46 + .../request/CreateEvaluationAideRequest.java | 45 + .../request/CreatePropositionAideRequest.java | 25 + .../request/UpdateCommentaireAideRequest.java | 18 + .../request/UpdateDemandeAideRequest.java | 44 + .../request/UpdateEvaluationAideRequest.java | 34 + .../request/UpdatePropositionAideRequest.java | 27 + .../response/CommentaireAideResponse.java | 42 + .../response/DemandeAideResponse.java | 172 ++ .../response/EvaluationAideResponse.java | 126 ++ .../response/PropositionAideResponse.java | 100 + .../request/CreateSuggestionRequest.java | 25 + .../request/UpdateSuggestionRequest.java | 23 + .../response/SuggestionResponse.java | 45 + .../ticket/request/CreateTicketRequest.java | 29 + .../ticket/request/UpdateTicketRequest.java | 24 + .../dto/ticket/response/TicketResponse.java | 52 + .../api/dto/tontine/TontineRequest.java | 49 + .../api/dto/tontine/TontineResponse.java | 46 + .../api/dto/tontine/TourTontineDTO.java | 41 + .../api/dto/vote/CampagneVoteRequest.java | 52 + .../api/dto/vote/CampagneVoteResponse.java | 44 + .../server/api/dto/vote/CandidatDTO.java | 34 + .../server/api/dto/wave/CompteWaveDTO.java | 53 + .../api/dto/wave/TransactionWaveDTO.java | 87 + .../enums/abonnement/StatutAbonnement.java | 26 + .../api/enums/abonnement/StatutFormule.java | 25 + .../enums/abonnement/StatutSouscription.java | 14 + .../api/enums/abonnement/TypeFormule.java | 25 + .../abonnement/TypePeriodeAbonnement.java | 12 + .../agricole/StatutCampagneAgricole.java | 20 + .../api/enums/analytics/FormatExport.java | 257 +++ .../api/enums/analytics/PeriodeAnalyse.java | 226 ++ .../api/enums/analytics/TypeMetrique.java | 187 ++ .../server/api/enums/audit/PorteeAudit.java | 12 + .../api/enums/ayantdroit/LienParente.java | 20 + .../enums/ayantdroit/StatutAyantDroit.java | 20 + .../collectefonds/StatutCampagneCollecte.java | 19 + .../comptabilite/TypeCompteComptable.java | 28 + .../comptabilite/TypeJournalComptable.java | 27 + .../api/enums/culte/TypeDonReligieux.java | 19 + .../api/enums/document/TypeDocument.java | 30 + .../enums/evenement/PrioriteEvenement.java | 159 ++ .../api/enums/evenement/StatutEvenement.java | 233 ++ .../enums/evenement/TypeEvenementMetier.java | 30 + .../api/enums/finance/StatutCotisation.java | 27 + .../formuleabonnement/StatutFormule.java | 21 + .../enums/formuleabonnement/TypeFormule.java | 21 + .../api/enums/gouvernance/NiveauEchelon.java | 18 + .../server/api/enums/membre/LienParente.java | 14 + .../enums/membre/StatutCompteUtilisateur.java | 14 + .../server/api/enums/membre/StatutMembre.java | 29 + .../server/api/enums/module/TypeModule.java | 26 + .../mutuelle/credit/StatutDemandeCredit.java | 26 + .../mutuelle/credit/StatutEcheanceCredit.java | 25 + .../api/enums/mutuelle/credit/TypeCredit.java | 24 + .../enums/mutuelle/credit/TypeGarantie.java | 22 + .../mutuelle/epargne/StatutCompteEpargne.java | 22 + .../mutuelle/epargne/TypeCompteEpargne.java | 22 + .../epargne/TypeTransactionEpargne.java | 26 + .../enums/notification/CanalNotification.java | 467 ++++ .../notification/PrioriteNotification.java | 26 + .../notification/StatutNotification.java | 459 ++++ .../enums/notification/TypeNotification.java | 32 + .../server/api/enums/ong/StatutProjetOng.java | 19 + .../organisation/StatutOrganisation.java | 26 + .../enums/organisation/TypeOrganisation.java | 35 + .../api/enums/paiement/MethodePaiement.java | 39 + .../paiement/StatutIntentionPaiement.java | 15 + .../api/enums/paiement/StatutPaiement.java | 38 + .../api/enums/paiement/StatutSession.java | 26 + .../api/enums/paiement/StatutTraitement.java | 26 + .../api/enums/paiement/TypeEvenement.java | 44 + .../paiement/TypeObjetIntentionPaiement.java | 14 + .../api/enums/registre/StatutAgrement.java | 18 + .../api/enums/solidarite/PrioriteAide.java | 268 +++ .../api/enums/solidarite/StatutAide.java | 298 +++ .../enums/solidarite/StatutEvaluation.java | 21 + .../enums/solidarite/StatutProposition.java | 22 + .../solidarite/StatutValidationEtape.java | 15 + .../server/api/enums/solidarite/TypeAide.java | 515 +++++ .../api/enums/solidarite/TypeEvaluation.java | 22 + .../api/enums/solidarite/TypeWorkflow.java | 13 + .../api/enums/tontine/FrequenceTour.java | 20 + .../api/enums/tontine/StatutTontine.java | 19 + .../server/api/enums/tontine/TypeTontine.java | 17 + .../server/api/enums/vote/ModeScrutin.java | 18 + .../server/api/enums/vote/StatutVote.java | 20 + .../server/api/enums/vote/TypeVote.java | 19 + .../api/enums/wave/StatutCompteWave.java | 26 + .../api/enums/wave/StatutTransactionWave.java | 34 + .../server/api/enums/wave/StatutWebhook.java | 27 + .../api/enums/wave/TypeEvenementWebhook.java | 29 + .../api/enums/wave/TypeTransactionWave.java | 27 + .../service/dashboard/DashboardService.java | 59 + .../api/validation/ValidationConstants.java | 233 ++ .../src/main/java/lombok.config | 2 + .../unionflow/server/api/CompilationTest.java | 138 ++ .../unionflow/server/api/TestDataFactory.java | 244 ++ .../analytics/AnalyticsDataResponseTest.java | 344 +++ .../DashboardWidgetResponseTest.java | 350 +++ .../dto/analytics/KPITrendResponseTest.java | 212 ++ .../dto/analytics/ReportConfigDTOTest.java | 341 +++ .../server/api/dto/base/BaseDTOTest.java | 256 +++ .../server/api/dto/base/PageResponseTest.java | 82 + .../dashboard/DashboardDataResponseTest.java | 444 ++++ .../dashboard/DashboardStatsResponseTest.java | 223 ++ .../dashboard/RecentActivityResponseTest.java | 213 ++ .../dashboard/UpcomingEventResponseTest.java | 381 ++++ .../response/EvenementResponseTest.java | 308 +++ .../response/AdhesionResponseTest.java | 413 ++++ .../FormuleAbonnementResponseTest.java | 331 +++ .../dto/membre/MembreSearchCriteriaTest.java | 367 +++ .../dto/membre/MembreSearchResultDTOTest.java | 243 ++ .../ActionNotificationDTOTest.java | 382 ++++ .../PreferencesNotificationDTOTest.java | 289 +++ .../api/dto/paiement/WaveBalanceDTOTest.java | 199 ++ .../paiement/WaveCheckoutSessionDTOTest.java | 54 + .../api/dto/paiement/WaveWebhookDTOTest.java | 215 ++ .../CreneauDisponibiliteDTOTest.java | 310 +++ .../response/CommentaireAideResponseTest.java | 81 + .../response/DemandeAideResponseTest.java | 404 ++++ .../response/EvaluationAideResponseTest.java | 343 +++ .../response/PropositionAideResponseTest.java | 248 +++ .../api/enums/EnumsRefactoringTest.java | 341 +++ .../abonnement/StatutAbonnementTest.java | 73 + .../enums/abonnement/StatutFormuleTest.java | 70 + .../abonnement/StatutSouscriptionTest.java | 73 + .../api/enums/abonnement/TypeFormuleTest.java | 56 + .../abonnement/TypePeriodeAbonnementTest.java | 67 + .../api/enums/analytics/FormatExportTest.java | 277 +++ .../enums/analytics/PeriodeAnalyseTest.java | 481 ++++ .../api/enums/analytics/TypeMetriqueTest.java | 246 +++ .../api/enums/audit/PorteeAuditTest.java | 67 + .../comptabilite/TypeCompteComptableTest.java | 36 + .../TypeJournalComptableTest.java | 36 + .../api/enums/document/TypeDocumentTest.java | 36 + .../evenement/PrioriteEvenementTest.java | 207 ++ .../enums/evenement/StatutEvenementTest.java | 419 ++++ .../evenement/TypeEvenementMetierTest.java | 68 + .../enums/finance/StatutCotisationTest.java | 76 + .../api/enums/membre/LienParenteTest.java | 73 + .../membre/StatutCompteUtilisateurTest.java | 73 + .../api/enums/membre/StatutMembreTest.java | 84 + .../api/enums/module/TypeModuleTest.java | 84 + .../notification/CanalNotificationTest.java | 424 ++++ .../PrioriteNotificationTest.java | 62 + .../notification/StatutNotificationTest.java | 394 ++++ .../notification/TypeNotificationTest.java | 79 + .../organisation/StatutOrganisationTest.java | 89 + .../organisation/TypeOrganisationTest.java | 104 + .../enums/paiement/MethodePaiementTest.java | 55 + .../paiement/StatutIntentionPaiementTest.java | 74 + .../enums/paiement/StatutPaiementTest.java | 36 + .../api/enums/paiement/StatutSessionTest.java | 54 + .../enums/paiement/StatutTraitementTest.java | 54 + .../api/enums/paiement/TypeEvenementTest.java | 93 + .../TypeObjetIntentionPaiementTest.java | 73 + .../enums/solidarite/PrioriteAideTest.java | 375 ++++ .../api/enums/solidarite/StatutAideTest.java | 341 +++ .../solidarite/StatutEvaluationTest.java | 76 + .../solidarite/StatutPropositionTest.java | 77 + .../solidarite/StatutValidationEtapeTest.java | 76 + .../api/enums/solidarite/TypeAideTest.java | 407 ++++ .../enums/solidarite/TypeEvaluationTest.java | 76 + .../enums/solidarite/TypeWorkflowTest.java | 70 + .../api/enums/wave/StatutCompteWaveTest.java | 36 + .../enums/wave/StatutTransactionWaveTest.java | 36 + .../api/enums/wave/StatutWebhookTest.java | 36 + .../enums/wave/TypeEvenementWebhookTest.java | 36 + .../enums/wave/TypeTransactionWaveTest.java | 36 + .../dashboard/DashboardServiceTest.java | 91 + .../validation/ValidationConstantsTest.java | 207 ++ unionflow/unionflow-server-impl-quarkus | 1 + 631 files changed, 104070 insertions(+) create mode 100644 unionflow/.cursor/commands/speckit.analyze.md create mode 100644 unionflow/.cursor/commands/speckit.checklist.md create mode 100644 unionflow/.cursor/commands/speckit.clarify.md create mode 100644 unionflow/.cursor/commands/speckit.constitution.md create mode 100644 unionflow/.cursor/commands/speckit.implement.md create mode 100644 unionflow/.cursor/commands/speckit.plan.md create mode 100644 unionflow/.cursor/commands/speckit.specify.md create mode 100644 unionflow/.cursor/commands/speckit.tasks.md create mode 100644 unionflow/.cursor/commands/speckit.taskstoissues.md create mode 100644 unionflow/.cursor/rules/unionflow-backend.mdc create mode 100644 unionflow/.cursor/rules/unionflow-mobile.mdc create mode 100644 unionflow/.cursor/rules/unionflow-spec-kit.mdc create mode 100644 unionflow/.specify/memory/constitution.md create mode 100644 unionflow/.specify/scripts/powershell/check-prerequisites.ps1 create mode 100644 unionflow/.specify/scripts/powershell/common.ps1 create mode 100644 unionflow/.specify/scripts/powershell/create-new-feature.ps1 create mode 100644 unionflow/.specify/scripts/powershell/setup-plan.ps1 create mode 100644 unionflow/.specify/scripts/powershell/update-agent-context.ps1 create mode 100644 unionflow/.specify/templates/agent-file-template.md create mode 100644 unionflow/.specify/templates/checklist-template.md create mode 100644 unionflow/.specify/templates/constitution-template.md create mode 100644 unionflow/.specify/templates/plan-template.md create mode 100644 unionflow/.specify/templates/spec-template.md create mode 100644 unionflow/.specify/templates/tasks-template.md create mode 100644 unionflow/CONSTITUTION.md create mode 100644 unionflow/LACUNES_MATURITE_PROFESSIONNELLE.md create mode 100644 unionflow/SPEC-KIT.md create mode 100644 unionflow/lombok.config create mode 100644 unionflow/specs/000-unionflow-baseline/spec.md create mode 160000 unionflow/unionflow-client-quarkus-primefaces-freya create mode 100644 unionflow/unionflow-mobile-apps/.gitignore create mode 100644 unionflow/unionflow-mobile-apps/README.md create mode 100644 unionflow/unionflow-mobile-apps/analysis_options.yaml create mode 100644 unionflow/unionflow-mobile-apps/android/.gitignore create mode 100644 unionflow/unionflow-mobile-apps/android/app/build.gradle create mode 100644 unionflow/unionflow-mobile-apps/android/app/proguard-rules.pro create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/debug/AndroidManifest.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/AndroidManifest.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/kotlin/dev/lions/unionflow_mobile_apps/MainActivity.kt create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/drawable/launch_background.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/values-night/styles.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/values/styles.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/main/res/xml/network_security_config.xml create mode 100644 unionflow/unionflow-mobile-apps/android/app/src/profile/AndroidManifest.xml create mode 100644 unionflow/unionflow-mobile-apps/android/build.gradle create mode 100644 unionflow/unionflow-mobile-apps/android/gradle.properties create mode 100644 unionflow/unionflow-mobile-apps/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 unionflow/unionflow-mobile-apps/android/settings.gradle create mode 100644 unionflow/unionflow-mobile-apps/ios/.gitignore create mode 100644 unionflow/unionflow-mobile-apps/ios/Flutter/AppFrameworkInfo.plist create mode 100644 unionflow/unionflow-mobile-apps/ios/Flutter/Debug.xcconfig create mode 100644 unionflow/unionflow-mobile-apps/ios/Flutter/Release.xcconfig create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcodeproj/project.pbxproj create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/AppDelegate.swift create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Base.lproj/Main.storyboard create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Info.plist create mode 100644 unionflow/unionflow-mobile-apps/ios/Runner/Runner-Bridging-Header.h create mode 100644 unionflow/unionflow-mobile-apps/ios/RunnerTests/RunnerTests.swift create mode 100644 unionflow/unionflow-mobile-apps/l10n.yaml create mode 100644 unionflow/unionflow-mobile-apps/lib/app/app.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/app/router/app_router.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/config/environment.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/constants/app_constants.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/di/app_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/di/injection_container.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/error/error_handler.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/error/exceptions.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/error/failures.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/l10n/locale_provider.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/navigation/adaptive_navigation.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/navigation/app_router.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/navigation/main_navigation_layout.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/network/dio_client.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/network/network_info.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/storage/dashboard_cache_manager.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/usecases/usecase.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/core/utils/logger.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/about/presentation/pages/about_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/bloc/adhesions_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/bloc/adhesions_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/bloc/adhesions_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/data/models/adhesion_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/data/models/adhesion_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/data/repositories/adhesion_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/di/adhesions_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/pages/adhesion_detail_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/pages/adhesions_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/pages/adhesions_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/widgets/create_adhesion_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/widgets/paiement_adhesion_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/adhesions/presentation/widgets/rejet_adhesion_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/bloc/admin_users_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/bloc/admin_users_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/bloc/admin_users_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/data/models/admin_user_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/data/repositories/admin_user_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/di/admin_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/presentation/pages/user_management_detail_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/admin/presentation/pages/user_management_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/datasources/dashboard_cache_manager.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/datasources/keycloak_auth_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/datasources/keycloak_role_mapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/datasources/keycloak_webview_auth_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/datasources/permission_engine.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/models/permission_matrix.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/models/user.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/data/models/user_role.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/presentation/bloc/auth_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/presentation/pages/keycloak_webview_auth_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/authentication/presentation/pages/login_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/backup/presentation/pages/backup_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/bloc/contributions_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/bloc/contributions_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/bloc/contributions_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/data/models/contribution_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/data/models/contribution_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/data/repositories/contribution_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/di/contributions_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/presentation/pages/contributions_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/presentation/pages/contributions_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/presentation/widgets/create_contribution_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/contributions/presentation/widgets/payment_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/config/dashboard_config.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/cache/dashboard_cache_manager.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/datasources/dashboard_remote_datasource.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/models/dashboard_stats_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/models/dashboard_stats_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/repositories/dashboard_repository_impl.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/services/dashboard_export_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/services/dashboard_notification_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/services/dashboard_offline_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/data/services/dashboard_performance_monitor.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/di/dashboard_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/domain/entities/dashboard_entity.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/domain/repositories/dashboard_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/domain/usecases/get_dashboard_data.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/bloc/dashboard_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/bloc/dashboard_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/bloc/dashboard_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/advanced_dashboard_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/connected_dashboard_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/active_member_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/consultant_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/hr_manager_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/moderator_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/org_admin_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/role_dashboards.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/simple_member_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/super_admin_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/pages/role_dashboards/visitor_dashboard.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/charts/dashboard_chart_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/common/activity_item.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/common/section_header.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/common/stat_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/components/cards/performance_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/connected/connected_recent_activities.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/connected/connected_stats_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/connected/connected_upcoming_events.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/dashboard_drawer.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/dashboard_widgets.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/metrics/real_time_metrics_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/monitoring/performance_monitor_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/navigation/dashboard_navigation.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/notifications/dashboard_notifications_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/search/dashboard_search_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/settings/theme_selector_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/shortcuts/dashboard_shortcuts_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/dashboard/presentation/widgets/widgets.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/bloc/evenements_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/bloc/evenements_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/bloc/evenements_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/data/models/evenement_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/data/models/evenement_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/data/repositories/evenement_repository_impl.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/di/evenements_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/pages/event_detail_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/pages/events_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/pages/events_page_connected.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/pages/events_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/widgets/create_event_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/widgets/edit_event_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/events/presentation/widgets/inscription_event_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/help/presentation/pages/help_support_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/bloc/membres_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/bloc/membres_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/bloc/membres_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/data/models/membre_complete_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/data/models/membre_complete_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/data/models/membre_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/data/repositories/membre_repository_impl.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/data/services/membre_search_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/di/membres_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/pages/advanced_search_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/pages/members_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/pages/members_page_connected.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/pages/members_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/widgets/add_member_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/widgets/edit_member_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/widgets/membre_search_form.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/widgets/membre_search_results.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/members/presentation/widgets/search_statistics_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/data/models/notification_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/data/repositories/notification_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/di/notifications_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/presentation/bloc/notifications_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/presentation/bloc/notifications_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/presentation/bloc/notifications_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/presentation/pages/notifications_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/notifications/presentation/pages/notifications_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/bloc/organizations_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/bloc/organizations_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/bloc/organizations_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/data/models/organization_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/data/models/organization_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/data/repositories/organization_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/data/services/organization_service.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/di/organizations_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/pages/create_organization_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/pages/edit_organization_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/pages/organization_detail_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/pages/organizations_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/pages/organizations_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/create_organization_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/edit_organization_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/organization_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/organization_filter_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/organization_search_bar.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/organizations/presentation/widgets/organization_stats_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/data/repositories/profile_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/di/profile_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/presentation/bloc/profile_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/presentation/bloc/profile_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/presentation/bloc/profile_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/presentation/pages/profile_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/profile/presentation/pages/profile_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/data/models/analytics_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/data/repositories/reports_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/di/reports_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/presentation/bloc/reports_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/presentation/bloc/reports_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/presentation/bloc/reports_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/presentation/pages/reports_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/reports/presentation/pages/reports_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/settings/presentation/pages/feedback_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/settings/presentation/pages/language_settings_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/settings/presentation/pages/privacy_settings_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/settings/presentation/pages/system_settings_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/bloc/solidarity_bloc.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/bloc/solidarity_event.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/bloc/solidarity_state.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/data/models/demande_aide_model.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/data/models/demande_aide_model.g.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/data/repositories/demande_aide_repository.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/di/solidarity_di.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/presentation/pages/demande_aide_detail_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/presentation/pages/demandes_aide_page.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/presentation/pages/demandes_aide_page_wrapper.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/features/solidarity/presentation/widgets/create_demande_aide_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/l10n/app_en.arb create mode 100644 unionflow/unionflow-mobile-apps/lib/l10n/app_fr.arb create mode 100644 unionflow/unionflow-mobile-apps/lib/main.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/buttons/uf_primary_button.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/buttons/uf_secondary_button.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/cards/uf_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/cards/uf_info_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/cards/uf_metric_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/cards/uf_stat_card.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/components.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/inputs/uf_dropdown_tile.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/inputs/uf_switch_tile.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/uf_app_bar.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/uf_container.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/uf_header.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/components/uf_page_header.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/dashboard_theme.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/dashboard_theme_manager.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/theme/app_theme_sophisticated.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/design_system/unionflow_design_system.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/models/membre_search_criteria.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/models/membre_search_result.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/widgets/adaptive_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/widgets/confirmation_dialog.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/widgets/error_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/lib/shared/widgets/loading_widget.dart create mode 100644 unionflow/unionflow-mobile-apps/pubspec.yaml create mode 100644 unionflow/unionflow-mobile-apps/test/features/dashboard/dashboard_test.dart create mode 100644 unionflow/unionflow-mobile-apps/test/unit/core/error/error_handler_test.dart create mode 100644 unionflow/unionflow-mobile-apps/test_app.bat create mode 100644 unionflow/unionflow-mobile-apps/web/favicon.png create mode 100644 unionflow/unionflow-mobile-apps/web/icons/Icon-192.png create mode 100644 unionflow/unionflow-mobile-apps/web/icons/Icon-512.png create mode 100644 unionflow/unionflow-mobile-apps/web/icons/Icon-maskable-192.png create mode 100644 unionflow/unionflow-mobile-apps/web/icons/Icon-maskable-512.png create mode 100644 unionflow/unionflow-mobile-apps/web/index.html create mode 100644 unionflow/unionflow-mobile-apps/web/manifest.json create mode 100644 unionflow/unionflow-server-api/.gitignore create mode 100644 unionflow/unionflow-server-api/check_coverage.ps1 create mode 100644 unionflow/unionflow-server-api/check_coverage.py create mode 100644 unionflow/unionflow-server-api/checkstyle-unionflow.xml create mode 100644 unionflow/unionflow-server-api/effective-api-pom create mode 100644 unionflow/unionflow-server-api/lombok.config create mode 100644 unionflow/unionflow-server-api/membre_bytecode.txt create mode 100644 unionflow/unionflow-server-api/methods.txt create mode 100644 unionflow/unionflow-server-api/parent-pom.xml create mode 100644 unionflow/unionflow-server-api/pom.xml create mode 100644 unionflow/unionflow-server-api/script/publish-api.bat create mode 100644 unionflow/unionflow-server-api/script/publish-api.sh create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/abonnement/request/CreateAbonnementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/abonnement/request/UpdateAbonnementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/abonnement/response/AbonnementResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/admin/request/CreateAuditLogRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/admin/response/AuditLogResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/adresse/request/CreateAdresseRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/adresse/request/UpdateAdresseRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/adresse/response/AdresseResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/agricole/CampagneAgricoleDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/analytics/AnalyticsDataResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/analytics/DashboardWidgetResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/analytics/KPITrendResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/analytics/ReportConfigDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ayantdroit/AyantDroitRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ayantdroit/AyantDroitResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/base/BaseDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/base/BaseResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/base/PageResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/collectefonds/CampagneCollecteResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/collectefonds/ContributionCollecteDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/CreateCompteComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/CreateEcritureComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/CreateJournalComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/CreateLigneEcritureRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/UpdateCompteComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/UpdateEcritureComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/UpdateJournalComptableRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/request/UpdateLigneEcritureRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/response/CompteComptableResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/response/EcritureComptableResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/response/JournalComptableResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/comptabilite/response/LigneEcritureResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/config/request/CreateConfigurationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/config/request/UpdateConfigurationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/config/response/ConfigurationResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/cotisation/request/CreateCotisationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/cotisation/request/UpdateCotisationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/cotisation/response/CotisationResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/cotisation/response/CotisationSummaryResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/culte/DonReligieuxDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/dashboard/DashboardDataResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/dashboard/DashboardStatsResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/dashboard/RecentActivityResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/dashboard/UpcomingEventResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/request/CreateDocumentRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/request/CreatePieceJointeRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/request/UpdateDocumentRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/request/UpdatePieceJointeRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/response/DocumentResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/response/PieceJointeResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/evenement/request/CreateEvenementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/evenement/request/UpdateEvenementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/evenement/response/EvenementResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/favoris/request/CreateFavoriRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/favoris/response/FavoriResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/finance/request/CreateAdhesionRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/finance/request/UpdateAdhesionRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/finance/response/AdhesionResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/formuleabonnement/request/CreateFormuleAbonnementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/formuleabonnement/request/UpdateFormuleAbonnementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/formuleabonnement/response/FormuleAbonnementResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/gouvernance/EchelonOrganigrammeDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchCriteria.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/request/CreateMembreRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/request/UpdateMembreRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/response/MembreResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/response/MembreSummaryResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/credit/DemandeCreditRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/credit/DemandeCreditResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/credit/EcheanceCreditDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/credit/GarantieDemandeDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/epargne/CompteEpargneRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/epargne/CompteEpargneResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/epargne/TransactionEpargneRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/mutuelle/epargne/TransactionEpargneResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/ActionNotificationDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/PreferenceCanalNotificationDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/PreferenceTypeNotificationDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/PreferencesNotificationDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/request/CreateNotificationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/request/CreateTemplateNotificationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/request/UpdateNotificationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/request/UpdateTemplateNotificationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/response/NotificationResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/notification/response/TemplateNotificationResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ong/ProjetOngDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/organisation/request/CreateOrganisationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/organisation/request/UpdateOrganisationRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/organisation/response/OrganisationResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/organisation/response/OrganisationSummaryResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/WaveBalanceDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/WaveCheckoutSessionDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/WaveWebhookDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/request/CreatePaiementRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/response/PaiementResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/paiement/response/PaiementSummaryResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/reference/request/CreateTypeReferenceRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/reference/request/UpdateTypeReferenceRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/reference/response/TypeReferenceResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/registre/AgrementProfessionnelDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/role/request/CreateRoleRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/role/request/UpdateRoleRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/role/response/PermissionResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/role/response/RoleResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/BeneficiaireAideDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/ContactProposantDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/ContactUrgenceDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/CreneauDisponibiliteDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/CritereSelectionDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/HistoriqueStatutDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/LocalisationDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/PieceJustificativeDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/CreateCommentaireAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/CreateDemandeAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/CreateEvaluationAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/CreatePropositionAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/UpdateCommentaireAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/UpdateDemandeAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/UpdateEvaluationAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/request/UpdatePropositionAideRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/response/CommentaireAideResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/response/DemandeAideResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/response/EvaluationAideResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/solidarite/response/PropositionAideResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/suggestion/request/CreateSuggestionRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/suggestion/request/UpdateSuggestionRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/suggestion/response/SuggestionResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ticket/request/CreateTicketRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ticket/request/UpdateTicketRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/ticket/response/TicketResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/tontine/TontineRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/tontine/TontineResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/tontine/TourTontineDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/vote/CampagneVoteRequest.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/vote/CampagneVoteResponse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/vote/CandidatDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/wave/CompteWaveDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/wave/TransactionWaveDTO.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/abonnement/StatutAbonnement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/abonnement/StatutFormule.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/abonnement/StatutSouscription.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/abonnement/TypeFormule.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/abonnement/TypePeriodeAbonnement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/agricole/StatutCampagneAgricole.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/analytics/FormatExport.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/analytics/PeriodeAnalyse.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/analytics/TypeMetrique.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/audit/PorteeAudit.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/ayantdroit/LienParente.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/ayantdroit/StatutAyantDroit.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/collectefonds/StatutCampagneCollecte.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/comptabilite/TypeCompteComptable.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/comptabilite/TypeJournalComptable.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/culte/TypeDonReligieux.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/document/TypeDocument.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/evenement/PrioriteEvenement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/evenement/StatutEvenement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/evenement/TypeEvenementMetier.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/finance/StatutCotisation.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/formuleabonnement/StatutFormule.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/formuleabonnement/TypeFormule.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/gouvernance/NiveauEchelon.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/membre/LienParente.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/membre/StatutCompteUtilisateur.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/membre/StatutMembre.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/module/TypeModule.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/credit/StatutDemandeCredit.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/credit/StatutEcheanceCredit.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/credit/TypeCredit.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/credit/TypeGarantie.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/epargne/StatutCompteEpargne.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/epargne/TypeCompteEpargne.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/mutuelle/epargne/TypeTransactionEpargne.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/notification/CanalNotification.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/notification/PrioriteNotification.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/notification/StatutNotification.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/notification/TypeNotification.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/ong/StatutProjetOng.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/organisation/StatutOrganisation.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/organisation/TypeOrganisation.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/MethodePaiement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/StatutIntentionPaiement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/StatutPaiement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/StatutSession.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/StatutTraitement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/TypeEvenement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/paiement/TypeObjetIntentionPaiement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/registre/StatutAgrement.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/PrioriteAide.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/StatutAide.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/StatutEvaluation.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/StatutProposition.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/StatutValidationEtape.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/TypeAide.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/TypeEvaluation.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/solidarite/TypeWorkflow.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/tontine/FrequenceTour.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/tontine/StatutTontine.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/tontine/TypeTontine.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/vote/ModeScrutin.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/vote/StatutVote.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/vote/TypeVote.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/wave/StatutCompteWave.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/wave/StatutTransactionWave.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/wave/StatutWebhook.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/wave/TypeEvenementWebhook.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/enums/wave/TypeTransactionWave.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/service/dashboard/DashboardService.java create mode 100644 unionflow/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/validation/ValidationConstants.java create mode 100644 unionflow/unionflow-server-api/src/main/java/lombok.config create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/CompilationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/TestDataFactory.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/analytics/AnalyticsDataResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/analytics/DashboardWidgetResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/analytics/KPITrendResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/analytics/ReportConfigDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/base/BaseDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/base/PageResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/dashboard/DashboardDataResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/dashboard/DashboardStatsResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/dashboard/RecentActivityResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/dashboard/UpcomingEventResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/evenement/response/EvenementResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/finance/response/AdhesionResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/formuleabonnement/response/FormuleAbonnementResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchCriteriaTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/notification/ActionNotificationDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/notification/PreferencesNotificationDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/paiement/WaveBalanceDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/paiement/WaveCheckoutSessionDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/paiement/WaveWebhookDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/solidarite/CreneauDisponibiliteDTOTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/solidarite/response/CommentaireAideResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/solidarite/response/DemandeAideResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/solidarite/response/EvaluationAideResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/dto/solidarite/response/PropositionAideResponseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/EnumsRefactoringTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/abonnement/StatutAbonnementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/abonnement/StatutFormuleTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/abonnement/StatutSouscriptionTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/abonnement/TypeFormuleTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/abonnement/TypePeriodeAbonnementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/analytics/FormatExportTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/analytics/PeriodeAnalyseTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/analytics/TypeMetriqueTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/audit/PorteeAuditTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/comptabilite/TypeCompteComptableTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/comptabilite/TypeJournalComptableTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/document/TypeDocumentTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/evenement/PrioriteEvenementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/evenement/StatutEvenementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/evenement/TypeEvenementMetierTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/finance/StatutCotisationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/membre/LienParenteTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/membre/StatutCompteUtilisateurTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/membre/StatutMembreTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/module/TypeModuleTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/notification/CanalNotificationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/notification/PrioriteNotificationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/notification/StatutNotificationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/notification/TypeNotificationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/organisation/StatutOrganisationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/organisation/TypeOrganisationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/MethodePaiementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/StatutIntentionPaiementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/StatutPaiementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/StatutSessionTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/StatutTraitementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/TypeEvenementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/paiement/TypeObjetIntentionPaiementTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/PrioriteAideTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/StatutAideTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/StatutEvaluationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/StatutPropositionTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/StatutValidationEtapeTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/TypeAideTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/TypeEvaluationTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/solidarite/TypeWorkflowTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/wave/StatutCompteWaveTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/wave/StatutTransactionWaveTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/wave/StatutWebhookTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/wave/TypeEvenementWebhookTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/enums/wave/TypeTransactionWaveTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/service/dashboard/DashboardServiceTest.java create mode 100644 unionflow/unionflow-server-api/src/test/java/dev/lions/unionflow/server/api/validation/ValidationConstantsTest.java create mode 160000 unionflow/unionflow-server-impl-quarkus diff --git a/.gitignore b/.gitignore index ef34e2c..9c7c99e 100644 --- a/.gitignore +++ b/.gitignore @@ -218,6 +218,13 @@ $RECYCLE.BIN/ **/*password* **/*token* +# Ansible Vault secrets (chiffres ou non) +**/group_vars/*/secrets.yml +**/group_vars/*/vault.yml +**/.vault_pass +**/vault_password +**/ansible-vault-password + # Fichiers de configuration Keycloak avec données sensibles **/*keycloak*realm*.json **/*keycloak*config*.json @@ -392,6 +399,15 @@ replay_pid* **/.cursor/ **/.specify/ +# Unionflow: versionner la config Spec-Kit (constitution, specs, commandes Cursor) +!unionflow/.specify/ +!unionflow/.specify/** +!unionflow/.cursor/ +!unionflow/.cursor/commands/ +!unionflow/.cursor/commands/** +!unionflow/.cursor/rules/ +!unionflow/.cursor/rules/** + # ===== COUVERTURE DE CODE ET TESTS ===== **/coverage/ **/.nyc_output/ @@ -461,6 +477,8 @@ replay_pid* !**/gradle-wrapper.jar !**/.env.example !**/.env.template +!**/secrets.yml.template +!**/vault.yml.template !**/.gitkeep !**/.dockerignore !**/Dockerfile diff --git a/unionflow/.cursor/commands/speckit.analyze.md b/unionflow/.cursor/commands/speckit.analyze.md new file mode 100644 index 0000000..cef64fd --- /dev/null +++ b/unionflow/.cursor/commands/speckit.analyze.md @@ -0,0 +1,187 @@ +--- +description: Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation. +scripts: + sh: scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks + ps: .specify/scripts/powershell/check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks +--- + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Goal + +Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit.tasks` has successfully produced a complete `tasks.md`. + +## Operating Constraints + +**STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually). + +**Constitution Authority**: The project constitution (`/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit.analyze`. + +## Execution Steps + +### 1. Initialize Analysis Context + +Run `{SCRIPT}` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths: + +- SPEC = FEATURE_DIR/spec.md +- PLAN = FEATURE_DIR/plan.md +- TASKS = FEATURE_DIR/tasks.md + +Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command). +For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). + +### 2. Load Artifacts (Progressive Disclosure) + +Load only the minimal necessary context from each artifact: + +**From spec.md:** + +- Overview/Context +- Functional Requirements +- Non-Functional Requirements +- User Stories +- Edge Cases (if present) + +**From plan.md:** + +- Architecture/stack choices +- Data Model references +- Phases +- Technical constraints + +**From tasks.md:** + +- Task IDs +- Descriptions +- Phase grouping +- Parallel markers [P] +- Referenced file paths + +**From constitution:** + +- Load `/memory/constitution.md` for principle validation + +### 3. Build Semantic Models + +Create internal representations (do not include raw artifacts in output): + +- **Requirements inventory**: Each functional + non-functional requirement with a stable key (derive slug based on imperative phrase; e.g., "User can upload file" → `user-can-upload-file`) +- **User story/action inventory**: Discrete user actions with acceptance criteria +- **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases) +- **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements + +### 4. Detection Passes (Token-Efficient Analysis) + +Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary. + +#### A. Duplication Detection + +- Identify near-duplicate requirements +- Mark lower-quality phrasing for consolidation + +#### B. Ambiguity Detection + +- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria +- Flag unresolved placeholders (TODO, TKTK, ???, ``, etc.) + +#### C. Underspecification + +- Requirements with verbs but missing object or measurable outcome +- User stories missing acceptance criteria alignment +- Tasks referencing files or components not defined in spec/plan + +#### D. Constitution Alignment + +- Any requirement or plan element conflicting with a MUST principle +- Missing mandated sections or quality gates from constitution + +#### E. Coverage Gaps + +- Requirements with zero associated tasks +- Tasks with no mapped requirement/story +- Non-functional requirements not reflected in tasks (e.g., performance, security) + +#### F. Inconsistency + +- Terminology drift (same concept named differently across files) +- Data entities referenced in plan but absent in spec (or vice versa) +- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note) +- Conflicting requirements (e.g., one requires Next.js while other specifies Vue) + +### 5. Severity Assignment + +Use this heuristic to prioritize findings: + +- **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality +- **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion +- **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case +- **LOW**: Style/wording improvements, minor redundancy not affecting execution order + +### 6. Produce Compact Analysis Report + +Output a Markdown report (no file writes) with the following structure: + +## Specification Analysis Report + +| ID | Category | Severity | Location(s) | Summary | Recommendation | +|----|----------|----------|-------------|---------|----------------| +| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version | + +(Add one row per finding; generate stable IDs prefixed by category initial.) + +**Coverage Summary Table:** + +| Requirement Key | Has Task? | Task IDs | Notes | +|-----------------|-----------|----------|-------| + +**Constitution Alignment Issues:** (if any) + +**Unmapped Tasks:** (if any) + +**Metrics:** + +- Total Requirements +- Total Tasks +- Coverage % (requirements with >=1 task) +- Ambiguity Count +- Duplication Count +- Critical Issues Count + +### 7. Provide Next Actions + +At end of report, output a concise Next Actions block: + +- If CRITICAL issues exist: Recommend resolving before `/speckit.implement` +- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions +- Provide explicit command suggestions: e.g., "Run /speckit.specify with refinement", "Run /speckit.plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'" + +### 8. Offer Remediation + +Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.) + +## Operating Principles + +### Context Efficiency + +- **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation +- **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis +- **Token-efficient output**: Limit findings table to 50 rows; summarize overflow +- **Deterministic results**: Rerunning without changes should produce consistent IDs and counts + +### Analysis Guidelines + +- **NEVER modify files** (this is read-only analysis) +- **NEVER hallucinate missing sections** (if absent, report them accurately) +- **Prioritize constitution violations** (these are always CRITICAL) +- **Use examples over exhaustive rules** (cite specific instances, not generic patterns) +- **Report zero issues gracefully** (emit success report with coverage statistics) + +## Context + +{ARGS} diff --git a/unionflow/.cursor/commands/speckit.checklist.md b/unionflow/.cursor/commands/speckit.checklist.md new file mode 100644 index 0000000..145a594 --- /dev/null +++ b/unionflow/.cursor/commands/speckit.checklist.md @@ -0,0 +1,297 @@ +--- +description: Generate a custom checklist for the current feature based on user requirements. +scripts: + sh: scripts/bash/check-prerequisites.sh --json + ps: .specify/scripts/powershell/check-prerequisites.ps1 -Json +--- + +## Checklist Purpose: "Unit Tests for English" + +**CRITICAL CONCEPT**: Checklists are **UNIT TESTS FOR REQUIREMENTS WRITING** - they validate the quality, clarity, and completeness of requirements in a given domain. + +**NOT for verification/testing**: + +- ❌ NOT "Verify the button clicks correctly" +- ❌ NOT "Test error handling works" +- ❌ NOT "Confirm the API returns 200" +- ❌ NOT checking if code/implementation matches the spec + +**FOR requirements quality validation**: + +- ✅ "Are visual hierarchy requirements defined for all card types?" (completeness) +- ✅ "Is 'prominent display' quantified with specific sizing/positioning?" (clarity) +- ✅ "Are hover state requirements consistent across all interactive elements?" (consistency) +- ✅ "Are accessibility requirements defined for keyboard navigation?" (coverage) +- ✅ "Does the spec define what happens when logo image fails to load?" (edge cases) + +**Metaphor**: If your spec is code written in English, the checklist is its unit test suite. You're testing whether the requirements are well-written, complete, unambiguous, and ready for implementation - NOT whether the implementation works. + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Execution Steps + +1. **Setup**: Run `{SCRIPT}` from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS list. + - All file paths must be absolute. + - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). + +2. **Clarify intent (dynamic)**: Derive up to THREE initial contextual clarifying questions (no pre-baked catalog). They MUST: + - Be generated from the user's phrasing + extracted signals from spec/plan/tasks + - Only ask about information that materially changes checklist content + - Be skipped individually if already unambiguous in `$ARGUMENTS` + - Prefer precision over breadth + + Generation algorithm: + 1. Extract signals: feature domain keywords (e.g., auth, latency, UX, API), risk indicators ("critical", "must", "compliance"), stakeholder hints ("QA", "review", "security team"), and explicit deliverables ("a11y", "rollback", "contracts"). + 2. Cluster signals into candidate focus areas (max 4) ranked by relevance. + 3. Identify probable audience & timing (author, reviewer, QA, release) if not explicit. + 4. Detect missing dimensions: scope breadth, depth/rigor, risk emphasis, exclusion boundaries, measurable acceptance criteria. + 5. Formulate questions chosen from these archetypes: + - Scope refinement (e.g., "Should this include integration touchpoints with X and Y or stay limited to local module correctness?") + - Risk prioritization (e.g., "Which of these potential risk areas should receive mandatory gating checks?") + - Depth calibration (e.g., "Is this a lightweight pre-commit sanity list or a formal release gate?") + - Audience framing (e.g., "Will this be used by the author only or peers during PR review?") + - Boundary exclusion (e.g., "Should we explicitly exclude performance tuning items this round?") + - Scenario class gap (e.g., "No recovery flows detected—are rollback / partial failure paths in scope?") + + Question formatting rules: + - If presenting options, generate a compact table with columns: Option | Candidate | Why It Matters + - Limit to A–E options maximum; omit table if a free-form answer is clearer + - Never ask the user to restate what they already said + - Avoid speculative categories (no hallucination). If uncertain, ask explicitly: "Confirm whether X belongs in scope." + + Defaults when interaction impossible: + - Depth: Standard + - Audience: Reviewer (PR) if code-related; Author otherwise + - Focus: Top 2 relevance clusters + + Output the questions (label Q1/Q2/Q3). After answers: if ≥2 scenario classes (Alternate / Exception / Recovery / Non-Functional domain) remain unclear, you MAY ask up to TWO more targeted follow‑ups (Q4/Q5) with a one-line justification each (e.g., "Unresolved recovery path risk"). Do not exceed five total questions. Skip escalation if user explicitly declines more. + +3. **Understand user request**: Combine `$ARGUMENTS` + clarifying answers: + - Derive checklist theme (e.g., security, review, deploy, ux) + - Consolidate explicit must-have items mentioned by user + - Map focus selections to category scaffolding + - Infer any missing context from spec/plan/tasks (do NOT hallucinate) + +4. **Load feature context**: Read from FEATURE_DIR: + - spec.md: Feature requirements and scope + - plan.md (if exists): Technical details, dependencies + - tasks.md (if exists): Implementation tasks + + **Context Loading Strategy**: + - Load only necessary portions relevant to active focus areas (avoid full-file dumping) + - Prefer summarizing long sections into concise scenario/requirement bullets + - Use progressive disclosure: add follow-on retrieval only if gaps detected + - If source docs are large, generate interim summary items instead of embedding raw text + +5. **Generate checklist** - Create "Unit Tests for Requirements": + - Create `FEATURE_DIR/checklists/` directory if it doesn't exist + - Generate unique checklist filename: + - Use short, descriptive name based on domain (e.g., `ux.md`, `api.md`, `security.md`) + - Format: `[domain].md` + - If file exists, append to existing file + - Number items sequentially starting from CHK001 + - Each `/speckit.checklist` run creates a NEW file (never overwrites existing checklists) + + **CORE PRINCIPLE - Test the Requirements, Not the Implementation**: + Every checklist item MUST evaluate the REQUIREMENTS THEMSELVES for: + - **Completeness**: Are all necessary requirements present? + - **Clarity**: Are requirements unambiguous and specific? + - **Consistency**: Do requirements align with each other? + - **Measurability**: Can requirements be objectively verified? + - **Coverage**: Are all scenarios/edge cases addressed? + + **Category Structure** - Group items by requirement quality dimensions: + - **Requirement Completeness** (Are all necessary requirements documented?) + - **Requirement Clarity** (Are requirements specific and unambiguous?) + - **Requirement Consistency** (Do requirements align without conflicts?) + - **Acceptance Criteria Quality** (Are success criteria measurable?) + - **Scenario Coverage** (Are all flows/cases addressed?) + - **Edge Case Coverage** (Are boundary conditions defined?) + - **Non-Functional Requirements** (Performance, Security, Accessibility, etc. - are they specified?) + - **Dependencies & Assumptions** (Are they documented and validated?) + - **Ambiguities & Conflicts** (What needs clarification?) + + **HOW TO WRITE CHECKLIST ITEMS - "Unit Tests for English"**: + + ❌ **WRONG** (Testing implementation): + - "Verify landing page displays 3 episode cards" + - "Test hover states work on desktop" + - "Confirm logo click navigates home" + + ✅ **CORRECT** (Testing requirements quality): + - "Are the exact number and layout of featured episodes specified?" [Completeness] + - "Is 'prominent display' quantified with specific sizing/positioning?" [Clarity] + - "Are hover state requirements consistent across all interactive elements?" [Consistency] + - "Are keyboard navigation requirements defined for all interactive UI?" [Coverage] + - "Is the fallback behavior specified when logo image fails to load?" [Edge Cases] + - "Are loading states defined for asynchronous episode data?" [Completeness] + - "Does the spec define visual hierarchy for competing UI elements?" [Clarity] + + **ITEM STRUCTURE**: + Each item should follow this pattern: + - Question format asking about requirement quality + - Focus on what's WRITTEN (or not written) in the spec/plan + - Include quality dimension in brackets [Completeness/Clarity/Consistency/etc.] + - Reference spec section `[Spec §X.Y]` when checking existing requirements + - Use `[Gap]` marker when checking for missing requirements + + **EXAMPLES BY QUALITY DIMENSION**: + + Completeness: + - "Are error handling requirements defined for all API failure modes? [Gap]" + - "Are accessibility requirements specified for all interactive elements? [Completeness]" + - "Are mobile breakpoint requirements defined for responsive layouts? [Gap]" + + Clarity: + - "Is 'fast loading' quantified with specific timing thresholds? [Clarity, Spec §NFR-2]" + - "Are 'related episodes' selection criteria explicitly defined? [Clarity, Spec §FR-5]" + - "Is 'prominent' defined with measurable visual properties? [Ambiguity, Spec §FR-4]" + + Consistency: + - "Do navigation requirements align across all pages? [Consistency, Spec §FR-10]" + - "Are card component requirements consistent between landing and detail pages? [Consistency]" + + Coverage: + - "Are requirements defined for zero-state scenarios (no episodes)? [Coverage, Edge Case]" + - "Are concurrent user interaction scenarios addressed? [Coverage, Gap]" + - "Are requirements specified for partial data loading failures? [Coverage, Exception Flow]" + + Measurability: + - "Are visual hierarchy requirements measurable/testable? [Acceptance Criteria, Spec §FR-1]" + - "Can 'balanced visual weight' be objectively verified? [Measurability, Spec §FR-2]" + + **Scenario Classification & Coverage** (Requirements Quality Focus): + - Check if requirements exist for: Primary, Alternate, Exception/Error, Recovery, Non-Functional scenarios + - For each scenario class, ask: "Are [scenario type] requirements complete, clear, and consistent?" + - If scenario class missing: "Are [scenario type] requirements intentionally excluded or missing? [Gap]" + - Include resilience/rollback when state mutation occurs: "Are rollback requirements defined for migration failures? [Gap]" + + **Traceability Requirements**: + - MINIMUM: ≥80% of items MUST include at least one traceability reference + - Each item should reference: spec section `[Spec §X.Y]`, or use markers: `[Gap]`, `[Ambiguity]`, `[Conflict]`, `[Assumption]` + - If no ID system exists: "Is a requirement & acceptance criteria ID scheme established? [Traceability]" + + **Surface & Resolve Issues** (Requirements Quality Problems): + Ask questions about the requirements themselves: + - Ambiguities: "Is the term 'fast' quantified with specific metrics? [Ambiguity, Spec §NFR-1]" + - Conflicts: "Do navigation requirements conflict between §FR-10 and §FR-10a? [Conflict]" + - Assumptions: "Is the assumption of 'always available podcast API' validated? [Assumption]" + - Dependencies: "Are external podcast API requirements documented? [Dependency, Gap]" + - Missing definitions: "Is 'visual hierarchy' defined with measurable criteria? [Gap]" + + **Content Consolidation**: + - Soft cap: If raw candidate items > 40, prioritize by risk/impact + - Merge near-duplicates checking the same requirement aspect + - If >5 low-impact edge cases, create one item: "Are edge cases X, Y, Z addressed in requirements? [Coverage]" + + **🚫 ABSOLUTELY PROHIBITED** - These make it an implementation test, not a requirements test: + - ❌ Any item starting with "Verify", "Test", "Confirm", "Check" + implementation behavior + - ❌ References to code execution, user actions, system behavior + - ❌ "Displays correctly", "works properly", "functions as expected" + - ❌ "Click", "navigate", "render", "load", "execute" + - ❌ Test cases, test plans, QA procedures + - ❌ Implementation details (frameworks, APIs, algorithms) + + **✅ REQUIRED PATTERNS** - These test requirements quality: + - ✅ "Are [requirement type] defined/specified/documented for [scenario]?" + - ✅ "Is [vague term] quantified/clarified with specific criteria?" + - ✅ "Are requirements consistent between [section A] and [section B]?" + - ✅ "Can [requirement] be objectively measured/verified?" + - ✅ "Are [edge cases/scenarios] addressed in requirements?" + - ✅ "Does the spec define [missing aspect]?" + +6. **Structure Reference**: Generate the checklist following the canonical template in `templates/checklist-template.md` for title, meta section, category headings, and ID formatting. If template is unavailable, use: H1 title, purpose/created meta lines, `##` category sections containing `- [ ] CHK### ` lines with globally incrementing IDs starting at CHK001. + +7. **Report**: Output full path to created checklist, item count, and remind user that each run creates a new file. Summarize: + - Focus areas selected + - Depth level + - Actor/timing + - Any explicit user-specified must-have items incorporated + +**Important**: Each `/speckit.checklist` command invocation creates a checklist file using short, descriptive names unless file already exists. This allows: + +- Multiple checklists of different types (e.g., `ux.md`, `test.md`, `security.md`) +- Simple, memorable filenames that indicate checklist purpose +- Easy identification and navigation in the `checklists/` folder + +To avoid clutter, use descriptive types and clean up obsolete checklists when done. + +## Example Checklist Types & Sample Items + +**UX Requirements Quality:** `ux.md` + +Sample items (testing the requirements, NOT the implementation): + +- "Are visual hierarchy requirements defined with measurable criteria? [Clarity, Spec §FR-1]" +- "Is the number and positioning of UI elements explicitly specified? [Completeness, Spec §FR-1]" +- "Are interaction state requirements (hover, focus, active) consistently defined? [Consistency]" +- "Are accessibility requirements specified for all interactive elements? [Coverage, Gap]" +- "Is fallback behavior defined when images fail to load? [Edge Case, Gap]" +- "Can 'prominent display' be objectively measured? [Measurability, Spec §FR-4]" + +**API Requirements Quality:** `api.md` + +Sample items: + +- "Are error response formats specified for all failure scenarios? [Completeness]" +- "Are rate limiting requirements quantified with specific thresholds? [Clarity]" +- "Are authentication requirements consistent across all endpoints? [Consistency]" +- "Are retry/timeout requirements defined for external dependencies? [Coverage, Gap]" +- "Is versioning strategy documented in requirements? [Gap]" + +**Performance Requirements Quality:** `performance.md` + +Sample items: + +- "Are performance requirements quantified with specific metrics? [Clarity]" +- "Are performance targets defined for all critical user journeys? [Coverage]" +- "Are performance requirements under different load conditions specified? [Completeness]" +- "Can performance requirements be objectively measured? [Measurability]" +- "Are degradation requirements defined for high-load scenarios? [Edge Case, Gap]" + +**Security Requirements Quality:** `security.md` + +Sample items: + +- "Are authentication requirements specified for all protected resources? [Coverage]" +- "Are data protection requirements defined for sensitive information? [Completeness]" +- "Is the threat model documented and requirements aligned to it? [Traceability]" +- "Are security requirements consistent with compliance obligations? [Consistency]" +- "Are security failure/breach response requirements defined? [Gap, Exception Flow]" + +## Anti-Examples: What NOT To Do + +**❌ WRONG - These test implementation, not requirements:** + +```markdown +- [ ] CHK001 - Verify landing page displays 3 episode cards [Spec §FR-001] +- [ ] CHK002 - Test hover states work correctly on desktop [Spec §FR-003] +- [ ] CHK003 - Confirm logo click navigates to home page [Spec §FR-010] +- [ ] CHK004 - Check that related episodes section shows 3-5 items [Spec §FR-005] +``` + +**✅ CORRECT - These test requirements quality:** + +```markdown +- [ ] CHK001 - Are the number and layout of featured episodes explicitly specified? [Completeness, Spec §FR-001] +- [ ] CHK002 - Are hover state requirements consistently defined for all interactive elements? [Consistency, Spec §FR-003] +- [ ] CHK003 - Are navigation requirements clear for all clickable brand elements? [Clarity, Spec §FR-010] +- [ ] CHK004 - Is the selection criteria for related episodes documented? [Gap, Spec §FR-005] +- [ ] CHK005 - Are loading state requirements defined for asynchronous episode data? [Gap] +- [ ] CHK006 - Can "visual hierarchy" requirements be objectively measured? [Measurability, Spec §FR-001] +``` + +**Key Differences:** + +- Wrong: Tests if the system works correctly +- Correct: Tests if the requirements are written correctly +- Wrong: Verification of behavior +- Correct: Validation of requirement quality +- Wrong: "Does it do X?" +- Correct: "Is X clearly specified?" diff --git a/unionflow/.cursor/commands/speckit.clarify.md b/unionflow/.cursor/commands/speckit.clarify.md new file mode 100644 index 0000000..92ce642 --- /dev/null +++ b/unionflow/.cursor/commands/speckit.clarify.md @@ -0,0 +1,184 @@ +--- +description: Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec. +handoffs: + - label: Build Technical Plan + agent: speckit.plan + prompt: Create a plan for the spec. I am building with... +scripts: + sh: scripts/bash/check-prerequisites.sh --json --paths-only + ps: .specify/scripts/powershell/check-prerequisites.ps1 -Json -PathsOnly +--- + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Outline + +Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file. + +Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/speckit.plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases. + +Execution steps: + +1. Run `{SCRIPT}` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields: + - `FEATURE_DIR` + - `FEATURE_SPEC` + - (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.) + - If JSON parsing fails, abort and instruct user to re-run `/speckit.specify` or verify feature branch environment. + - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). + +2. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked). + + Functional Scope & Behavior: + - Core user goals & success criteria + - Explicit out-of-scope declarations + - User roles / personas differentiation + + Domain & Data Model: + - Entities, attributes, relationships + - Identity & uniqueness rules + - Lifecycle/state transitions + - Data volume / scale assumptions + + Interaction & UX Flow: + - Critical user journeys / sequences + - Error/empty/loading states + - Accessibility or localization notes + + Non-Functional Quality Attributes: + - Performance (latency, throughput targets) + - Scalability (horizontal/vertical, limits) + - Reliability & availability (uptime, recovery expectations) + - Observability (logging, metrics, tracing signals) + - Security & privacy (authN/Z, data protection, threat assumptions) + - Compliance / regulatory constraints (if any) + + Integration & External Dependencies: + - External services/APIs and failure modes + - Data import/export formats + - Protocol/versioning assumptions + + Edge Cases & Failure Handling: + - Negative scenarios + - Rate limiting / throttling + - Conflict resolution (e.g., concurrent edits) + + Constraints & Tradeoffs: + - Technical constraints (language, storage, hosting) + - Explicit tradeoffs or rejected alternatives + + Terminology & Consistency: + - Canonical glossary terms + - Avoided synonyms / deprecated terms + + Completion Signals: + - Acceptance criteria testability + - Measurable Definition of Done style indicators + + Misc / Placeholders: + - TODO markers / unresolved decisions + - Ambiguous adjectives ("robust", "intuitive") lacking quantification + + For each category with Partial or Missing status, add a candidate question opportunity unless: + - Clarification would not materially change implementation or validation strategy + - Information is better deferred to planning phase (note internally) + +3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints: + - Maximum of 10 total questions across the whole session. + - Each question must be answerable with EITHER: + - A short multiple‑choice selection (2–5 distinct, mutually exclusive options), OR + - A one-word / short‑phrase answer (explicitly constrain: "Answer in <=5 words"). + - Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation. + - Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved. + - Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness). + - Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests. + - If more than 5 categories remain unresolved, select the top 5 by (Impact * Uncertainty) heuristic. + +4. Sequential questioning loop (interactive): + - Present EXACTLY ONE question at a time. + - For multiple‑choice questions: + - **Analyze all options** and determine the **most suitable option** based on: + - Best practices for the project type + - Common patterns in similar implementations + - Risk reduction (security, performance, maintainability) + - Alignment with any explicit project goals or constraints visible in the spec + - Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice). + - Format as: `**Recommended:** Option [X] - ` + - Then render all options as a Markdown table: + + | Option | Description | + |--------|-------------| + | A |