6.3 KiB
Calendar Reminder Metadata Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Add metadata.reminder_minutes end-to-end (frontend/backend/AgentScope), fix detail-page field rendering, and enable local system reminders.
Architecture: Keep calendar schema additive via metadata JSON (no new DB columns). Backend validates and persists reminder_minutes; AgentScope tools accept and pass reminder values; frontend parses/edits/displays reminder and schedules local notifications based on event time.
Tech Stack: Flutter, FastAPI, Pydantic v2, AgentScope toolkit, pytest, flutter_test.
Task 1: Backend metadata schema tests first
Files:
- Test:
backend/tests/unit/v1/schedule_items/test_schemas.py - Modify:
backend/src/v1/schedule_items/schemas.py
Step 1: Write failing tests
- Add tests for
reminder_minutesaccepted values (None,0,15,10080) - Add tests for invalid values (
-1,10081)
Step 2: Run tests to verify RED
Run: uv run pytest backend/tests/unit/v1/schedule_items/test_schemas.py -q
Expected: FAIL for missing/invalid field support.
Step 3: Minimal implementation
- Add
reminder_minutes: int | None = Field(default=None, ge=0, le=10080)toScheduleItemMetadata
Step 4: Verify GREEN
Run: uv run pytest backend/tests/unit/v1/schedule_items/test_schemas.py -q
Expected: PASS.
Task 2: Backend service mapping tests first
Files:
- Test:
backend/tests/unit/v1/schedule_items/test_service.py - Modify:
backend/src/v1/schedule_items/service.py
Step 1: Write failing tests
- Assert create/update
extra_metadataincludesreminder_minutes
Step 2: Run RED
Run: uv run pytest backend/tests/unit/v1/schedule_items/test_service.py -q
Step 3: Minimal implementation
- Ensure model_dump path includes new field naturally, no special-case stripping
Step 4: Verify GREEN
Run: uv run pytest backend/tests/unit/v1/schedule_items/test_service.py -q
Task 3: AgentScope custom tool tests first
Files:
- Test:
backend/tests/unit/core/agentscope/test_calendar_tools.py - Modify:
backend/src/core/agentscope/tools/custom/calendar.py
Step 1: Write failing tests
calendar_writemapsreminder_minutesto tool argsreminderMinutes- rejects out-of-range reminder values
Step 2: Run RED
Run: uv run pytest backend/tests/unit/core/agentscope/test_calendar_tools.py -q
Step 3: Minimal implementation
- Add
reminder_minutesparameter and validation incalendar_write - Add mapping into
tool_args
Step 4: Verify GREEN
Run: uv run pytest backend/tests/unit/core/agentscope/test_calendar_tools.py -q
Task 4: CrewAI calendar bridge tests first
Files:
- Test:
backend/tests/unit/core/agent/test_mutate_calendar_event_tool.py - Modify:
backend/src/core/agent/infrastructure/crewai/tools/create_calendar_event_tool.py
Step 1: Write failing tests
- create path maps
reminderMinutes -> metadata.reminder_minutes - update path can patch
reminder_minutes
Step 2: Run RED
Run: uv run pytest backend/tests/unit/core/agent/test_mutate_calendar_event_tool.py -q
Step 3: Minimal implementation
- Extend
_resolve_metadata,_execute_update, and_event_payload
Step 4: Verify GREEN
Run: uv run pytest backend/tests/unit/core/agent/test_mutate_calendar_event_tool.py -q
Task 5: Frontend model/API tests first
Files:
- Test:
apps/test/features/calendar/data/calendar_api_test.dart - Modify:
apps/lib/features/calendar/data/models/schedule_item_model.dart
Step 1: Write failing tests
- parse
metadata.reminder_minutes - serialize
metadata.reminder_minutesin create/update payload
Step 2: Run RED
Run: cd apps && flutter test test/features/calendar/data/calendar_api_test.dart
Step 3: Minimal implementation
- add
reminderMinutesin model + json mapping
Step 4: Verify GREEN
Run: cd apps && flutter test test/features/calendar/data/calendar_api_test.dart
Task 6: Detail UI rendering fix tests first
Files:
- Create/Test:
apps/test/features/calendar/ui/screens/calendar_event_detail_screen_test.dart - Modify:
apps/lib/features/calendar/ui/screens/calendar_event_detail_screen.dart
Step 1: Write failing widget tests
- reminder text for null/0/15
- metadata raw block no longer visible
Step 2: Run RED
Run: cd apps && flutter test test/features/calendar/ui/screens/calendar_event_detail_screen_test.dart
Step 3: Minimal implementation
- remove raw metadata section
- render structured reminder text
Step 4: Verify GREEN
Run: cd apps && flutter test test/features/calendar/ui/screens/calendar_event_detail_screen_test.dart
Task 7: Local notification service integration
Files:
- Create:
apps/lib/core/notifications/local_notification_service.dart - Modify:
apps/lib/core/di/injection.dart - Modify:
apps/lib/main.dart - Modify:
apps/lib/features/calendar/data/services/mock_calendar_service.dart - Modify:
apps/lib/features/calendar/ui/widgets/create_event_sheet.dart
Step 1: Add local notification dependencies
- Update
apps/pubspec.yamlwithflutter_local_notifications
Step 2: Implement scheduling API
- init permissions
- schedule/update/cancel by event id
- vibration enabled for Android notification details
Step 3: Integrate into calendar flow
- create/update/delete hooks call notification service
- startup rebuild for future events
Step 4: Verify manually
- create reminder 1-2 min event and verify system notification + vibration
Task 8: Full verification
Step 1: Backend checks Run:
uv run pytest backend/tests/unit/v1/schedule_items/test_schemas.py -quv run pytest backend/tests/unit/v1/schedule_items/test_service.py -quv run pytest backend/tests/unit/core/agentscope/test_calendar_tools.py -quv run pytest backend/tests/unit/core/agent/test_mutate_calendar_event_tool.py -q
Step 2: Frontend checks Run:
cd apps && flutter test test/features/calendar/data/calendar_api_test.dartcd apps && flutter test test/features/calendar/ui/screens/calendar_event_detail_screen_test.dartcd apps && flutter analyze lib/features/calendar lib/core/notifications
Step 3: Manual verification evidence
- create/update/delete reminder event and capture observed notification behavior.