Files
fete/specs/017-watch-event/plan.md
nitrix c450849e4d
All checks were successful
CI / backend-test (push) Successful in 1m0s
CI / frontend-test (push) Successful in 27s
CI / frontend-e2e (push) Successful in 1m30s
CI / build-and-publish (push) Has been skipped
Implement watch-event feature (017) with bookmark in RsvpBar
Add client-side watch/bookmark functionality: users can save events to
localStorage without RSVPing via a bookmark button next to the "I'm attending"
CTA. Watched events appear in the event list with a "Watching" label.
Bookmark is only visible for visitors (not attendees or organizers).

Includes spec, plan, research, tasks, unit tests, and E2E tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:20:57 +01:00

3.2 KiB

Implementation Plan: Watch Event

Branch: 017-watch-event | Date: 2026-03-12 | Spec: spec.md Input: Feature specification from /specs/017-watch-event/spec.md

Summary

Add a bookmark icon to the event detail page (left of event title) that lets users save events to localStorage without RSVPing. Watched events appear in the event list with a "Watching" label. The feature is entirely client-side — no backend changes required.

Technical Context

Language/Version: TypeScript 5.9 (frontend only) Primary Dependencies: Vue 3, Vue Router 5 Storage: localStorage via useEventStorage.ts composable (existing) Testing: Vitest for unit tests, Playwright + MSW for E2E Target Platform: Mobile-first PWA (browser) Project Type: Web application (frontend-only change) Performance Goals: Instant toggle (no network requests) Constraints: No backend involvement, no new dependencies Scale/Scope: 4 modified files, 0 new files

Constitution Check

GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.

Principle Status Notes
I. Privacy by Design PASS No data sent to server. Watch is purely localStorage. No tracking.
II. Test-Driven Methodology PASS Unit tests for composable changes, E2E tests for user stories.
III. API-First Development PASS No API changes needed. Feature is client-side only.
IV. Simplicity & Quality PASS Minimal changes to existing code. No new abstractions.
V. Dependency Discipline PASS No new dependencies introduced.
VI. Accessibility PASS Bookmark icon will use semantic button/ARIA, keyboard-operable.

No violations. Gate passes.

Project Structure

Documentation (this feature)

specs/017-watch-event/
├── plan.md              # This file
├── spec.md              # Feature specification
├── research.md          # Phase 0 output
├── data-model.md        # Phase 1 output
├── quickstart.md        # Phase 1 output
└── tasks.md             # Phase 2 output (/speckit.tasks)

Source Code (files to modify)

frontend/src/
├── composables/
│   ├── useEventStorage.ts        # Add saveWatch(), isStored() methods
│   └── __tests__/
│       └── useEventStorage.spec.ts  # Tests for new methods
├── components/
│   ├── EventCard.vue              # Add 'watcher' role + badge styling
│   ├── EventList.vue              # Update getRole() to return 'watcher', adjust delete flow
│   └── __tests__/
│       ├── EventCard.spec.ts      # Tests for watcher badge
│       └── EventList.spec.ts      # Tests for watcher delete behavior
├── views/
│   ├── EventDetailView.vue        # Add bookmark icon next to title
│   └── __tests__/
│       └── EventDetailView.spec.ts  # Tests for bookmark behavior
└── e2e/
    └── watch-event.spec.ts        # E2E tests for all user stories

Structure Decision: Frontend-only changes. No new files needed — all modifications go into existing components and composables. One new E2E test file.

Complexity Tracking

No constitution violations. No complexity justifications needed.