Merge branch 'feat/home-sso' into main
.gitignore+3 −0.impeccable/config.json+17 −0.impeccable/hook.cache.json+1 −0AGENTS.md+261 −73Makefile+14 −1PRODUCT.md+150 −0README.md+149 −15cmd/calendar/main.go+131 −25docs/superpowers/brainstorms/2026-09-02-calendar-brainstorm.md+1053 −0docs/superpowers/plans/2026-09-07-booking-plan.md+589 −0docs/superpowers/specs/2026-09-02-calendar-design.md+309 −0docs/superpowers/specs/2026-09-02-quick-add-design.md+177 −0docs/superpowers/specs/2026-09-07-booking-design.md+1004 −0go.mod+13 −3go.sum+22 −10internal/calendar/app.go+163 −42internal/calendar/auth.go+283 −0internal/calendar/avail.go+249 −0internal/calendar/avail_describe.go+88 −0internal/calendar/booking_ics.go+51 −0internal/calendar/booking_mail.go+172 −0internal/calendar/booking_public.go+105 −0internal/calendar/clock.go+194 −0internal/calendar/config.go+146 −0internal/calendar/funcs.go+141 −0internal/calendar/handlers.go+94 −8internal/calendar/handlers_booking_form.go+145 −0internal/calendar/handlers_booking_manage.go+236 −0internal/calendar/handlers_booking_public.go+283 −0internal/calendar/handlers_booking_settings.go+72 −0internal/calendar/handlers_booking_util.go+210 −0internal/calendar/handlers_event_delete.go+79 −0internal/calendar/handlers_event_form.go+122 −0internal/calendar/handlers_events.go+270 −0internal/calendar/handlers_jobs.go+260 −0internal/calendar/handlers_jobs_budget.go+49 −0internal/calendar/handlers_misc.go+258 −0internal/calendar/handlers_quick.go+197 −0internal/calendar/handlers_settings.go+58 −0internal/calendar/handlers_views.go+203 −0internal/calendar/home.go+97 −0internal/calendar/home_router_test.go+251 −0internal/calendar/home_security_test.go+43 −0internal/calendar/ics_export.go+230 −0internal/calendar/ics_import.go+269 −0internal/calendar/ics_parse.go+101 −0internal/calendar/logsafe.go+60 −0internal/calendar/logsafe_test.go+44 −0internal/calendar/mail_bounded.go+97 −0internal/calendar/mail_bounded_test.go+48 −0internal/calendar/migrations.go+13 −16internal/calendar/migrations/0001_create_people.sql+4 −0internal/calendar/migrations/0001_init.sql+0 −2internal/calendar/migrations/0002_alter_people.sql+58 −0internal/calendar/migrations/0003_alter_reminders.sql+2 −0internal/calendar/migrations/0004_create_attendees.sql+6 −0internal/calendar/migrations/0005_alter_people.sql+36 −0internal/calendar/migrations/0006_alter_reminder_queues.sql+4 −0internal/calendar/migrations/schema.sql+93 −1internal/calendar/models.go+169 −16internal/calendar/models_attendee.go+37 −0internal/calendar/models_booking.go+187 −0internal/calendar/models_event.go+259 −0internal/calendar/occurrences.go+155 −0internal/calendar/occurrences_step.go+172 −0internal/calendar/pack.go+156 −0internal/calendar/person.go+78 −0internal/calendar/quickadd.go+261 −0internal/calendar/quickadd_range.go+115 −0internal/calendar/quickadd_when.go+224 −0internal/calendar/quickadd_who.go+141 −0internal/calendar/recur.go+296 −0internal/calendar/render.go+140 −26internal/calendar/repeat.go+248 −0internal/calendar/routes.go+185 −0internal/calendar/seal/fingerprint.go+35 −0internal/calendar/seal/seal.go+159 −0internal/calendar/slots.go+182 −0internal/calendar/static/booking.js+103 −0internal/calendar/static/calendar.css+541 −0internal/calendar/static/quickadd.js+151 −0internal/calendar/store.go+102 −0internal/calendar/store_attendee.go+136 −0internal/calendar/store_booking_cancel.go+158 −0internal/calendar/store_booking_confirm.go+185 −0internal/calendar/store_booking_flow.go+244 −0internal/calendar/store_booking_handle.go+140 −0internal/calendar/store_booking_hold_util.go+88 −0internal/calendar/store_booking_mail.go+183 −0internal/calendar/store_booking_page.go+227 −0internal/calendar/store_booking_page_read.go+127 −0internal/calendar/store_booking_read.go+172 −0internal/calendar/store_booking_sweep.go+173 −0internal/calendar/store_calendar.go+239 −0internal/calendar/store_drain.go+291 −0internal/calendar/store_event.go+188 −0internal/calendar/store_event_read.go+68 −0internal/calendar/store_event_write.go+157 −0internal/calendar/store_feed.go+199 −0internal/calendar/store_override.go+252 −0internal/calendar/store_range.go+280 −0internal/calendar/store_reminder.go+256 −0internal/calendar/store_reminder_next.go+86 −0internal/calendar/store_slots.go+94 −0internal/calendar/summary.go+185 −0internal/calendar/templates/_bookingpane.html+25 −0internal/calendar/templates/_chip.html+19 −0internal/calendar/templates/_quickadd.html+50 −0internal/calendar/templates/_quickpane.html+56 −0internal/calendar/templates/agenda.html+42 −0internal/calendar/templates/book_gone.html+11 −0internal/calendar/templates/book_hold.html+22 −0internal/calendar/templates/book_manage.html+27 −0internal/calendar/templates/book_page.html+77 −0internal/calendar/templates/book_sent.html+16 −0internal/calendar/templates/booking_page_form.html+69 −0internal/calendar/templates/booking_pages.html+67 −0internal/calendar/templates/calendars.html+24 −0internal/calendar/templates/day.html+69 −0internal/calendar/templates/errors.html+2 −1internal/calendar/templates/event.html+114 −0internal/calendar/templates/event_delete.html+41 −0internal/calendar/templates/event_form.html+133 −0internal/calendar/templates/home.html+1 −0internal/calendar/templates/import.html+34 −0internal/calendar/templates/import_done.html+41 −0internal/calendar/templates/index.html+0 −3internal/calendar/templates/layout.html+68 −6internal/calendar/templates/mail/cancelled_booker.txt+3 −0internal/calendar/templates/mail/cancelled_host.txt+5 −0internal/calendar/templates/mail/confirmed.txt+9 −0internal/calendar/templates/mail/hold.txt+7 −0internal/calendar/templates/mail/rescheduled_booker.txt+7 −0internal/calendar/templates/mail/rescheduled_host.txt+3 −0internal/calendar/templates/month.html+57 −0internal/calendar/templates/settings.html+61 −0internal/calendar/templates/share.html+52 −0internal/calendar/templates/signin.html+31 −0internal/calendar/templates/week.html+66 −0internal/calendar/testing.go+215 −0internal/calendar/theme.go+106 −0internal/calendar/validate.go+118 −0internal/calendar/viewdata.go+244 −0internal/calendar/viewer.go+29 −0internal/calendar/viewmonth.go+249 −0internal/calendar/zones.go+131 −0internal/calendartest/auth_test.go+146 −0internal/calendartest/avail_test.go+225 −0internal/calendartest/booking_abuse_test.go+106 −0internal/calendartest/booking_flow_test.go+290 −0internal/calendartest/booking_handle_test.go+64 −0internal/calendartest/booking_host_test.go+189 −0internal/calendartest/booking_http_test.go+279 −0internal/calendartest/booking_mail_test.go+238 −0internal/calendartest/booking_review2_test.go+263 −0internal/calendartest/booking_review_test.go+92 −0internal/calendartest/booking_settings_test.go+181 −0internal/calendartest/booking_store_test.go+261 −0internal/calendartest/booking_sweep_test.go+124 −0internal/calendartest/browser_test.go+114 −23internal/calendartest/clock_test.go+128 −0internal/calendartest/delivery_test.go+298 −0internal/calendartest/events_test.go+262 −0internal/calendartest/harness_test.go+47 −27internal/calendartest/ics_test.go+215 −0internal/calendartest/index_test.go+19 −14internal/calendartest/migrate_test.go+70 −0internal/calendartest/occurrence_strict_test.go+154 −0internal/calendartest/occurrence_test.go+265 −0internal/calendartest/playwright_booking_test.go+93 −0internal/calendartest/playwright_test.go+134 −0internal/calendartest/quickadd_http_test.go+200 −0internal/calendartest/quickadd_test.go+285 −0internal/calendartest/recur_engine_test.go+144 −0internal/calendartest/recur_test.go+206 −0internal/calendartest/reminder_test.go+183 −0internal/calendartest/slots_busy_test.go+125 −0internal/calendartest/slots_dst_test.go+105 −0internal/calendartest/slots_test.go+176 −0internal/calendartest/summary_test.go+115 −0internal/calendartest/tick_test.go+65 −0internal/calendartest/zone_test.go+51 −0internal/guardstest/guards_test.go+254 −0package.json+12 −0test/browser/booking.mjs+115 −0test/browser/quickadd.mjs+210 −0
CI passed — run details
.gitignoreLoading diff…
.impeccable/config.jsonLoading diff…
.impeccable/hook.cache.jsonLoading diff…
AGENTS.mdLoading diff…
MakefileLoading diff…
PRODUCT.mdLoading diff…
README.mdLoading diff…
cmd/calendar/main.goLoading diff…
docs/superpowers/brainstorms/2026-09-02-calendar-brainstorm.mdLoading diff…
docs/superpowers/plans/2026-09-07-booking-plan.mdLoading diff…
docs/superpowers/specs/2026-09-02-calendar-design.mdLoading diff…
docs/superpowers/specs/2026-09-02-quick-add-design.mdLoading diff…
docs/superpowers/specs/2026-09-07-booking-design.mdLoading diff…
go.modLoading diff…
go.sumLoading diff…
internal/calendar/app.goLoading diff…
internal/calendar/auth.goLoading diff…
internal/calendar/avail.goLoading diff…
internal/calendar/avail_describe.goLoading diff…
internal/calendar/booking_ics.goLoading diff…
internal/calendar/booking_mail.goLoading diff…
internal/calendar/booking_public.goLoading diff…
internal/calendar/clock.goLoading diff…
internal/calendar/config.goLoading diff…
internal/calendar/funcs.goLoading diff…
internal/calendar/handlers.goLoading diff…
internal/calendar/handlers_booking_form.goLoading diff…
internal/calendar/handlers_booking_manage.goLoading diff…
internal/calendar/handlers_booking_public.goLoading diff…
internal/calendar/handlers_booking_settings.goLoading diff…
internal/calendar/handlers_booking_util.goLoading diff…
internal/calendar/handlers_event_delete.goLoading diff…
internal/calendar/handlers_event_form.goLoading diff…
internal/calendar/handlers_events.goLoading diff…
internal/calendar/handlers_jobs.goLoading diff…
internal/calendar/handlers_jobs_budget.goLoading diff…
internal/calendar/handlers_misc.goLoading diff…
internal/calendar/handlers_quick.goLoading diff…
internal/calendar/handlers_settings.goLoading diff…
internal/calendar/handlers_views.goLoading diff…
internal/calendar/home.goLoading diff…
internal/calendar/home_router_test.goLoading diff…
internal/calendar/home_security_test.goLoading diff…
internal/calendar/ics_export.goLoading diff…
internal/calendar/ics_import.goLoading diff…
internal/calendar/ics_parse.goLoading diff…
internal/calendar/logsafe.goLoading diff…
internal/calendar/logsafe_test.goLoading diff…
internal/calendar/mail_bounded.goLoading diff…
internal/calendar/mail_bounded_test.goLoading diff…
internal/calendar/migrations.goLoading diff…
internal/calendar/migrations/0001_create_people.sqlLoading diff…
internal/calendar/migrations/0001_init.sqlLoading diff…
internal/calendar/migrations/0002_alter_people.sqlLoading diff…
internal/calendar/migrations/0003_alter_reminders.sqlLoading diff…
internal/calendar/migrations/0004_create_attendees.sqlLoading diff…
internal/calendar/migrations/0005_alter_people.sqlLoading diff…
internal/calendar/migrations/0006_alter_reminder_queues.sqlLoading diff…
internal/calendar/migrations/schema.sqlLoading diff…
internal/calendar/models.goLoading diff…
internal/calendar/models_attendee.goLoading diff…
internal/calendar/models_booking.goLoading diff…
internal/calendar/models_event.goLoading diff…
internal/calendar/occurrences.goLoading diff…
internal/calendar/occurrences_step.goLoading diff…
internal/calendar/pack.goLoading diff…
internal/calendar/person.goLoading diff…
internal/calendar/quickadd.goLoading diff…
internal/calendar/quickadd_range.goLoading diff…
internal/calendar/quickadd_when.goLoading diff…
internal/calendar/quickadd_who.goLoading diff…
internal/calendar/recur.goLoading diff…
internal/calendar/render.goLoading diff…
internal/calendar/repeat.goLoading diff…
internal/calendar/routes.goLoading diff…
internal/calendar/seal/fingerprint.goLoading diff…
internal/calendar/seal/seal.goLoading diff…
internal/calendar/slots.goLoading diff…
internal/calendar/static/booking.jsLoading diff…
internal/calendar/static/calendar.cssLoading diff…
internal/calendar/static/quickadd.jsLoading diff…
internal/calendar/store.goLoading diff…
internal/calendar/store_attendee.goLoading diff…
internal/calendar/store_booking_cancel.goLoading diff…
internal/calendar/store_booking_confirm.goLoading diff…
internal/calendar/store_booking_flow.goLoading diff…
internal/calendar/store_booking_handle.goLoading diff…
internal/calendar/store_booking_hold_util.goLoading diff…
internal/calendar/store_booking_mail.goLoading diff…
internal/calendar/store_booking_page.goLoading diff…
internal/calendar/store_booking_page_read.goLoading diff…
internal/calendar/store_booking_read.goLoading diff…
internal/calendar/store_booking_sweep.goLoading diff…
internal/calendar/store_calendar.goLoading diff…
internal/calendar/store_drain.goLoading diff…
internal/calendar/store_event.goLoading diff…
internal/calendar/store_event_read.goLoading diff…
internal/calendar/store_event_write.goLoading diff…
internal/calendar/store_feed.goLoading diff…
internal/calendar/store_override.goLoading diff…
internal/calendar/store_range.goLoading diff…
internal/calendar/store_reminder.goLoading diff…
internal/calendar/store_reminder_next.goLoading diff…
internal/calendar/store_slots.goLoading diff…
internal/calendar/summary.goLoading diff…
internal/calendar/templates/_bookingpane.htmlLoading diff…
internal/calendar/templates/_chip.htmlLoading diff…
internal/calendar/templates/_quickadd.htmlLoading diff…
internal/calendar/templates/_quickpane.htmlLoading diff…
internal/calendar/templates/agenda.htmlLoading diff…
internal/calendar/templates/book_gone.htmlLoading diff…
internal/calendar/templates/book_hold.htmlLoading diff…
internal/calendar/templates/book_manage.htmlLoading diff…
internal/calendar/templates/book_page.htmlLoading diff…
internal/calendar/templates/book_sent.htmlLoading diff…
internal/calendar/templates/booking_page_form.htmlLoading diff…
internal/calendar/templates/booking_pages.htmlLoading diff…
internal/calendar/templates/calendars.htmlLoading diff…
internal/calendar/templates/day.htmlLoading diff…
internal/calendar/templates/errors.htmlLoading diff…
internal/calendar/templates/event.htmlLoading diff…
internal/calendar/templates/event_delete.htmlLoading diff…
internal/calendar/templates/event_form.htmlLoading diff…
internal/calendar/templates/home.htmlLoading diff…
internal/calendar/templates/import.htmlLoading diff…
internal/calendar/templates/import_done.htmlLoading diff…
internal/calendar/templates/index.htmlLoading diff…
internal/calendar/templates/layout.htmlLoading diff…
internal/calendar/templates/mail/cancelled_booker.txtLoading diff…
internal/calendar/templates/mail/cancelled_host.txtLoading diff…
internal/calendar/templates/mail/confirmed.txtLoading diff…
internal/calendar/templates/mail/hold.txtLoading diff…
internal/calendar/templates/mail/rescheduled_booker.txtLoading diff…
internal/calendar/templates/mail/rescheduled_host.txtLoading diff…
internal/calendar/templates/month.htmlLoading diff…
internal/calendar/templates/settings.htmlLoading diff…
internal/calendar/templates/share.htmlLoading diff…
internal/calendar/templates/signin.htmlLoading diff…
internal/calendar/templates/week.htmlLoading diff…
internal/calendar/testing.goLoading diff…
internal/calendar/theme.goLoading diff…
internal/calendar/validate.goLoading diff…
internal/calendar/viewdata.goLoading diff…
internal/calendar/viewer.goLoading diff…
internal/calendar/viewmonth.goLoading diff…
internal/calendar/zones.goLoading diff…
internal/calendartest/auth_test.goLoading diff…
internal/calendartest/avail_test.goLoading diff…
internal/calendartest/booking_abuse_test.goLoading diff…
internal/calendartest/booking_flow_test.goLoading diff…
internal/calendartest/booking_handle_test.goLoading diff…
internal/calendartest/booking_host_test.goLoading diff…
internal/calendartest/booking_http_test.goLoading diff…
internal/calendartest/booking_mail_test.goLoading diff…
internal/calendartest/booking_review2_test.goLoading diff…
internal/calendartest/booking_review_test.goLoading diff…
internal/calendartest/booking_settings_test.goLoading diff…
internal/calendartest/booking_store_test.goLoading diff…
internal/calendartest/booking_sweep_test.goLoading diff…
internal/calendartest/browser_test.goLoading diff…
internal/calendartest/clock_test.goLoading diff…
internal/calendartest/delivery_test.goLoading diff…
internal/calendartest/events_test.goLoading diff…
internal/calendartest/harness_test.goLoading diff…
internal/calendartest/ics_test.goLoading diff…
internal/calendartest/index_test.goLoading diff…
internal/calendartest/migrate_test.goLoading diff…
internal/calendartest/occurrence_strict_test.goLoading diff…
internal/calendartest/occurrence_test.goLoading diff…
internal/calendartest/playwright_booking_test.goLoading diff…
internal/calendartest/playwright_test.goLoading diff…
internal/calendartest/quickadd_http_test.goLoading diff…
internal/calendartest/quickadd_test.goLoading diff…
internal/calendartest/recur_engine_test.goLoading diff…
internal/calendartest/recur_test.goLoading diff…
internal/calendartest/reminder_test.goLoading diff…
internal/calendartest/slots_busy_test.goLoading diff…
internal/calendartest/slots_dst_test.goLoading diff…
internal/calendartest/slots_test.goLoading diff…
internal/calendartest/summary_test.goLoading diff…
internal/calendartest/tick_test.goLoading diff…
internal/calendartest/zone_test.goLoading diff…
internal/guardstest/guards_test.goLoading diff…
package.jsonLoading diff…
test/browser/booking.mjsLoading diff…
test/browser/quickadd.mjsLoading diff…