Prevents future regressions where controllers bypass the application layer
and access repositories directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The EventController was directly accessing RsvpRepository (an outbound port)
to count attendees, bypassing the application layer. Introduce a dedicated
inbound port and implement it in RsvpService. Remove the now-unused Clock
dependency from RsvpService.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce typed token value objects (EventToken, OrganizerToken,
RsvpToken) and refactor all existing Event code to use them.
Add POST /events/{token}/rsvps endpoint that persists an RSVP and
returns an rsvpToken. Populate attendeeCount in GET /events/{token}
from a real count query instead of hardcoded 0.
Includes: OpenAPI spec, Liquibase migration (rsvps table with
ON DELETE CASCADE), domain model, hexagonal ports/adapters,
service layer, and full test coverage (unit + integration).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spec, research decisions, implementation plan, data model,
API contract, and task breakdown for the RSVP feature.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Encodes the workflow for creating PRs, monitoring CI status via
Actions API (cross-referencing head SHA), and merging when green.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The hook used --noEmit which is less strict than CI's --build,
causing type errors to slip through.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add missing timezone field to CreateEventResponse mock
- Fix createTestRouter signature to accept optional token parameter
- Add non-null assertion for dateField element access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New view fetches event via openapi-fetch, formats date/time with
Intl.DateTimeFormat. Skeleton shimmer during loading (CSS-only).
Create form now sends auto-detected timezone.
Unit tests for all five view states, E2E tests with MSW mocks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Domain: add timezone field to Event and CreateEventCommand.
Ports: new GetEventUseCase inbound port.
Service: implement getByEventToken, validate IANA timezone on create.
Controller: map to GetEventResponse, compute expired flag via Clock.
Persistence: timezone column in JPA entity and mapping.
Tests: integration tests use DTOs + ObjectMapper instead of inline JSON,
GET tests seed DB directly via JpaRepository for isolation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenAPI: new GetEventResponse schema, timezone on Create request/response.
Liquibase: add timezone VARCHAR(64) NOT NULL DEFAULT 'UTC' column.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spec, research, data model, API contract, implementation plan, and
task breakdown for the public event detail page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Node 25 localStorage warning from MSW broke vue-tsc type-check
because the override signature was incompatible with the Signals type.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Human-readable reference for the clarify → plan → tasks → analyze → implement
loop and the file structure it produces.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move cross-cutting docs (personas, design system, implementation phases,
Ideen.md) to .specify/memory/
- Move cross-cutting research and plans to .specify/memory/research/ and
.specify/memory/plans/
- Extract 5 setup tasks from spec/setup-tasks.md into individual
specs/001-005/spec.md files with spec-kit template format
- Extract 20 user stories from spec/userstories.md into individual
specs/006-026/spec.md files with spec-kit template format
- Relocate feature-specific research and plan docs into specs/[feature]/
- Add spec-kit constitution, templates, scripts, and slash commands
- Slim down CLAUDE.md to Claude-Code-specific config, delegate principles
to .specify/memory/constitution.md
- Update ralph.sh with stream-json output and per-iteration logging
- Delete old spec/ and docs/agents/ directories
- Gitignore Ralph iteration JSONL logs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Runs Playwright E2E tests with Chromium after checkout.
Uploads HTML report as artifact on failure.
build-and-publish now requires all three test jobs.
Research reports on datetime handling, RFC 9457, font selection.
Implementation plans for US-1 create event and post-review fixes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Post-creation confirmation page showing shareable event URL with
copy-to-clipboard and fallback feedback on failure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Form with client-side validation, server error handling, aria-invalid/
aria-describedby for a11y, localStorage persistence via useEventStorage
composable. Routes for /create and /events/:token.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
EventController for POST /events, GlobalExceptionHandler mapping
validation and business exceptions to problem+json responses.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JPA entity, repository, persistence adapter for events. Liquibase
changelog creates the events table with BIGSERIAL ID and UUID tokens.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Event entity, CreateEventCommand, ports (CreateEventUseCase,
EventRepository), and EventService with Clock injection for
deterministic testing. Expiry date must be in the future.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Define CreateEventRequest, CreateEventResponse, ProblemDetail, and
ValidationProblemDetail schemas. RFC 9457 problem details for errors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>