Skip to content

feat(auth): add Google and Apple sign-in alongside the email code - #43

Merged
JFrusher merged 11 commits into
mainfrom
claude/elegant-carson-5o5558
Oct 3, 2026
Merged

JFrusher merged 11 commits into
mainfrom
claude/elegant-carson-5o5558

Conversation

@JFrusher

@JFrusher JFrusher commented Oct 3, 2026

Copy link
Copy Markdown
Owner
  • Login page: Continue with Google / Apple above an OR divider, with
    redirecting, error and back-button states.
  • /auth/callback: a provider's ?error= return (cancelled, refused) is now
    reported as signin=failed instead of landing silently.
  • SELF-HOSTING: Supabase, Google Cloud and Apple Developer setup steps.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam

claude added 9 commits October 3, 2026 11:22
- Login page: Continue with Google / Apple above an OR divider, with
  redirecting, error and back-button states.
- /auth/callback: a provider's ?error= return (cancelled, refused) is now
  reported as signin=failed instead of landing silently.
- SELF-HOSTING: Supabase, Google Cloud and Apple Developer setup steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
Every name, identifier, file and doc moves from Trousseau to Knotwork,
with nothing a person already has left behind:

- Device storage: every IndexedDB and localStorage key moves from
  trousseau.* to knotwork.* on first load (migrateKeys, now a prefix move
  that also covers the older tableaux.suite.* keys).
- Documents: kind "trousseau" — in every exported file, device copy and
  synced document — reads as "knotwork"; the next save writes the new name.
- Privacy policy: sign-in is a code, and Google or Apple can pass the
  account's name; text, effective date and digest updated.

Left on the old name until they are renamed outside the repo: the Vercel
URL (trousseau-suite.vercel.app) and the GitHub repo URL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
…typecheck

The dependency bump to Vitest 5 left poolOptions and esbuild.jsx in
vitest.config.ts. Both are gone from the types, so next build stopped at
'Failed to type check' (reproduced on main). maxWorkers: 1 is v4's
replacement for singleFork; oxc.jsx replaces the ignored esbuild.jsx.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
…ready pins

The override holds playwright-core at 1.56.1 (the installed browser build);
the Dependabot bump moved @playwright/test to 1.63.0, which cannot load
1.56's internals (ERR_PACKAGE_PATH_NOT_EXPORTED: ./lib/coreBundle), so
'playwright test' and the marketing pipeline crashed on start. One version
everywhere, including next's optional peer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
The typecheck job runs npm ci then tsc, but @jfrusher/knotwork's types
live in the gitignored dist/, which nothing in that job builds — so every
import of it failed (79 x TS2307, plus TS18047/TS7006 knock-ons from the
resulting any). Reproduced locally from a clean dist/. The suite's build
script already builds the root first; typecheck now does the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
Full pipeline rerun (stills, three clips, composed images). The raw
screenshots came out byte-identical; the framed images and clips, which
carry the name, are updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
An empty wedding opened on 'This wedding', six 'No … yet' cards and a
disabled download, with the example wedding ~1,400px down on a phone.
Until anything is in the wedding, / now shows a welcome instead: what
Knotwork does, three ways in (set up your own, explore the example with
the guided tour, bring a guest list or a saved file), sign-in for a
returning visitor where accounts exist, the promises, and every tool.

The example had no way back out short of clearing the browser. It is now
marked, and the dashboard says so with 'Start your own wedding', which
keeps the example in Data and can be undone. SetupPrompt is folded into
the welcome.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
… a code

Since the email link became a six-digit code (030e098), the code is
verified in the browser and never passed through /auth/callback — the
only place a first sign-in starts the couple's wedding — and with no
`next` it went to /weddings, the planners' page. A new couple got no
wedding and 'None yet. Start one for a client'.

The login page now finishes every sign-in through the callback, which,
given no code to exchange, takes the session the browser already holds.
The callback's GET tests now really mock the server client (the old
vi.doMock ran after the static import, so it never applied).

Also on the way to an invite: say to use the invited address, and with
Apple to choose Share My Email — a hidden relay address never matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
They were the only jobs on v4, which runs on the deprecated Node 20
runtime and warned on every run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
Copilot AI balanced review requested due to automatic review settings October 3, 2026 12:48
@vercel

vercel Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
trousseau-suite Ready Ready Preview Oct 3, 2026 1:21pm UTC

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Unresolved privacy, cross-wedding data, hydration, calendar-compatibility and error-handling issues block approval.

Review effort: Balanced
Findings: 4 High severity · 1 Medium severity · 2 Low severity

Open (7)
What changed in this PR

Updates social sign-in and authentication callbacks, rebrands the application and shared contract as Knotwork, and introduces welcome and example-wedding flows.

Changes:

  • Handles provider failures and browser-verified email sign-ins.
  • Renames branding, package APIs, storage keys, fixtures and exports.
  • Updates onboarding, tests, tooling and documentation.
File Reviewed changes and findings
verify/​tsconfig.json Updates the contract-package alias.
verify/​consumer.ts Verifies renamed public exports.
suite/​vitest.config.ts Updates JSX transforms and worker settings.
suite/​README.md Documents Knotwork and legacy compatibility.
suite/​public/​fixtures/​example-wedding.knotwork.json Updates the example document kind.
suite/​package.json Updates dependencies and typecheck preparation.
suite/​lib/​tour/​useTour.tsx Renames store access and tour storage.
suite/​lib/​tour/​useTour.test.tsx Updates tour-test imports.
suite/​lib/​tour/​steps.ts Updates tour branding.
suite/​lib/​tour/​steps.test.ts Uses the renamed fixture.
suite/​lib/​tour/​exampleWedding.fixture.test.ts Updates fixture references.
suite/​lib/​suppliers/​links.ts Uses renamed contract and store types.
suite/​lib/​suppliers/​links.test.ts Updates supplier-link test references.
suite/​lib/​suppliers/​callSheet.ts Uses the renamed document type.
suite/​lib/​suppliers/​callSheet.test.ts Uses the renamed fixture.
suite/​lib/​store/​StoreHydrator.tsx Uses the renamed shared store.
suite/​lib/​store/​StoreHydrator.test.tsx Updates hydration-test references.
suite/​lib/​store/​saveState.ts Uses the renamed state type.
suite/​lib/​store/​removeFromDevice.test.ts Updates storage-key expectations.
suite/​lib/​store/​persistFailure.test.ts Updates persistence-test imports.
suite/​lib/​store/​openWedding.ts Renames wedding-switch storage keys. Critical (2 votes): await legacy-key migration before the first readLink; direct opening can otherwise load wedding A into selected wedding B and upload A into B.
suite/​lib/​store/​history.test.ts Updates history-test imports.
suite/​lib/​store/​copies.ts Renames saved-copy storage.
suite/​lib/​share/​guestLink.test.ts Updates guest-link test imports.
suite/​lib/​setup/​draft.test.ts Uses renamed document helpers.
suite/​lib/​sentry/​scrub.test.ts Updates synthetic URL branding.
suite/​lib/​sentry/​build.ts Renames Sentry releases.
suite/​lib/​seating/​normalise.ts Updates store access and commentary.
suite/​lib/​palette/​search.ts Uses the renamed document type.
suite/​lib/​palette/​search.test.ts Uses the renamed fixture.
suite/​lib/​pageCounts.test.ts Updates synthetic analytics URLs.
suite/​lib/​model/​weddingState.ts Imports the renamed contract.
suite/​lib/​model/​weddingState.test.ts Uses the renamed fixture.
suite/​lib/​model/​types.ts Updates contract documentation.
suite/​lib/​model/​toolbox.ts Uses the renamed document type.
suite/​lib/​model/​toolbox.test.ts Uses renamed document helpers.
suite/​lib/​model/​slices.test.ts Uses renamed document helpers.
suite/​lib/​model/​selectors.test.ts Uses renamed document helpers.
suite/​lib/​model/​roundTrip.test.ts Updates round-trip test references.
suite/​lib/​model/​readiness.ts Uses the renamed document type.
suite/​lib/​model/​readiness.test.ts Uses renamed document helpers.
suite/​lib/​model/​promote.ts Updates file-format commentary.
suite/​lib/​model/​promote.test.ts Updates document-kind fixtures.
suite/​lib/​model/​partners.ts Imports the renamed event type.
suite/​lib/​model/​overview.test.ts Uses the renamed fixture.
suite/​lib/​model/​content.ts Imports the renamed contract.
suite/​lib/​model/​content.test.ts Uses the renamed empty-document helper.
suite/​lib/​library/​items.ts Imports the renamed contract.
suite/​lib/​library/​items.test.ts Uses the renamed fixture.
suite/​lib/​legal.ts Updates branding and sign-in privacy disclosures.
suite/​lib/​guests/​list.ts Uses the renamed document type.
suite/​lib/​guests/​list.test.ts Imports the renamed contract.
suite/​lib/​export/​weddingPack.ts Updates PDF producer branding.
suite/​lib/​ensemble/​propose.ts Imports the renamed event type.
suite/​lib/​ensemble/​exports.ts Imports the renamed event type.
suite/​lib/​documents/​parts.ts Imports the renamed contract.
suite/​lib/​documents/​parts.test.ts Uses the renamed fixture.
suite/​lib/​documents/​mergeCloudDocument.ts Imports the renamed contract.
suite/​lib/​documents/​mergeCloudDocument.test.ts Updates contract imports.
suite/​lib/​documents/​handlers.ts Updates export filename extensions.
suite/​lib/​documents/​handlers.test.ts Verifies renamed export filenames.
suite/​lib/​documents/​describe.ts Imports renamed contract types.
suite/​lib/​documents/​cloudSync.ts Renames cloud-link storage.
suite/​lib/​design/​tokens.css Updates branding commentary.
suite/​lib/​data/​guestImport.ts Imports the renamed event type.
suite/​lib/​ceremony/​rows.ts Imports the renamed event type.
suite/​lib/​ceremony/​rows.test.ts Uses the renamed fixture.
suite/​lib/​ceremony/​render/​pdf/​orderOfService.ts Imports the renamed event type.
suite/​lib/​cast/​resolve.ts Imports the renamed event type.
suite/​lib/​boxes/​view.ts Imports the renamed document type.
suite/​lib/​boxes/​view.test.ts Imports the renamed contract.
suite/​lib/​boxes/​rows.test.ts Uses the renamed fixture.
suite/​lib/​binder/​binder.ts Renames document types and shot storage.
suite/​lib/​binder/​binder.test.ts Uses the renamed fixture.
suite/​lib/​bar/​sum.ts Uses the renamed document type.
suite/​lib/​bar/​rows.test.ts Uses the renamed fixture.
suite/​fixtures/​.gitignore Changes export exclusions. Critical (3 votes): retain the legacy .trousseau.json rule alongside the new extension to protect private guest-data exports.
suite/​e2e/​welcome.spec.ts Covers welcome, example and undo flows.
suite/​e2e/​wedding.ts Updates fixture and IndexedDB helpers.
suite/​e2e/​sync-history.spec.ts Uses the renamed fixture.
suite/​e2e/​blog.spec.ts Verifies updated blog branding.
suite/​e2e/​a11y.spec.ts Seeds a wedding before testing tour focus.
suite/​components/​shell/​WhenDocumentReady.tsx Uses the renamed shared store.
suite/​components/​shell/​WhenDocumentReady.test.tsx Updates readiness-test references.
suite/​components/​shell/​WeddingMenu.tsx Updates store access and fallback branding.
suite/​components/​shell/​WeddingChoice.tsx Uses the renamed shared store.
suite/​components/​shell/​ToolUndo.tsx Uses the renamed undo store.
suite/​components/​shell/​ToolsPanel.tsx Uses the renamed shared store.
suite/​components/​shell/​SyncHistory.tsx Uses the renamed shared store.
suite/​components/​shell/​SupplierLinkKeeper.tsx Subscribes to the renamed store.
suite/​components/​shell/​SetupPrompt.tsx Removes the superseded setup prompt.
suite/​components/​shell/​ReportUnhandled.tsx Updates diagnostic branding.
suite/​components/​shell/​Overview.tsx Uses the renamed shared store.
suite/​components/​shell/​LiveWedding.tsx Uses the renamed live-sync store.
suite/​components/​shell/​LiveWedding.test.tsx Updates live-sync test references.
suite/​components/​shell/​LandscapeGate.tsx Updates branding commentary.
suite/​components/​shell/​KeptCopies.tsx Uses the renamed shared store.
suite/​components/​shell/​Header.tsx Uses the renamed shared store.
suite/​components/​shell/​GuestLinkPanel.tsx Uses the renamed shared store.
suite/​components/​shell/​GuestLinkPanel.test.tsx Updates panel-test references.
suite/​components/​shell/​GuestLinkKeeper.tsx Subscribes to the renamed store.
suite/​components/​shell/​guestImportPanel.ts Updates import-target contract references.
suite/​components/​shell/​GuestImport.tsx Uses the renamed shared store.
suite/​components/​shell/​FrontPage.tsx Selects welcome or dashboard content. Critical (1 vote): calculate emptiness only when the store is ready; summarising unreadable raw data after hydration failure throws before the dashboard fallback.
suite/​components/​shell/​FrontPage.test.tsx Tests loading and empty-wedding selection.
suite/​components/​shell/​Footer.tsx Updates footer branding.
suite/​components/​shell/​ExampleBanner.tsx Adds an example-wedding exit action. Moderate (1 vote): catch and display backup/storage failures from startYourOwnWedding, preserving the example instead of discarding the rejected promise.
suite/​components/​shell/​DataManager.tsx Uses renamed contract and store imports.
suite/​components/​shell/​DataButton.tsx Uses the renamed shared store.
suite/​components/​shell/​Countdown.tsx Updates store access and branding.
suite/​components/​shell/​CommandPalette.tsx Uses the renamed shared store.
suite/​components/​money/​MoneyPage.tsx Uses the renamed shared store.
suite/​components/​library/​LibraryPage.tsx Updates contract and store references.
suite/​components/​ensemble/​ShotList.tsx Imports the renamed event type.
suite/​components/​ensemble/​ShotInspector.tsx Imports the renamed event type.
suite/​components/​ensemble/​PrintPanel.tsx Updates event imports and print branding.
suite/​components/​ensemble/​CastPanel.tsx Imports the renamed event type.
suite/​components/​checklist/​ChecklistPage.tsx Uses the renamed shared store.
suite/​components/​ceremony/​CeremonyBoard.tsx Updates imports and print branding.
suite/​components/​cast/​MemberPicker.tsx Imports the renamed event type.
suite/​components/​boxes/​BoxesBoard.tsx Updates store access and print branding.
suite/​components/​binder/​Binder.tsx Uses the renamed shared store.
suite/​components/​bar/​BarBoard.tsx Updates store access and print branding.
suite/​apps/​tableaux/​test/​openPlan.ts Updates shared-document test setup.
suite/​apps/​tableaux/​store/​useStore.ts Uses the renamed shared store.
suite/​apps/​tableaux/​store/​sliceBridge.ts Updates the shared-store bridge.
suite/​apps/​tableaux/​store/​seatSwap.test.js Updates undo-store references.
suite/​apps/​tableaux/​store/​roomSpaces.test.js Updates undo-store references.
suite/​apps/​tableaux/​store/​removeGuest.test.js Updates undo-store references.
suite/​apps/​tableaux/​store/​plan.ts Imports the renamed event contract.
suite/​apps/​tableaux/​store/​persistRoundtrip.test.js Updates undo-store references.
suite/​apps/​tableaux/​store/​live.test.js Updates store and fixture references.
suite/​apps/​tableaux/​store/​addGuest.test.js Updates undo-store references.
suite/​apps/​tableaux/​hooks/​useKeyboardShortcuts.ts Uses the renamed undo store.
suite/​apps/​plaque/​ui/​panels/​DataPanel.tsx Reads guests from the renamed store.
suite/​apps/​plaque/​state/​useKeyboard.ts Uses the renamed undo store.
suite/​apps/​plaque/​state/​syncAssets.ts Uses the renamed shared store.
suite/​apps/​plaque/​state/​store.ts Updates shared-store integration.
suite/​apps/​plaque/​state/​store.test.ts Updates shared-store test setup.
suite/​apps/​plaque/​state/​sliceBridge.ts Updates the shared-store bridge.
suite/​apps/​plaque/​state/​live.test.ts Updates shared-store test references.
suite/​apps/​plaque/​state/​fromRoom.ts Reads the renamed shared store.
suite/​apps/​plaque/​state/​fromRoom.test.ts Updates room-import test references.
suite/​apps/​plaque/​App.tsx Reads renamed persistence-error state.
suite/​apps/​cadence/​ui/​panels/​InspectorPanel.tsx Uses the renamed shared store.
suite/​apps/​cadence/​ui/​panels/​DayPanel.tsx Reads the renamed event store.
suite/​apps/​cadence/​ui/​panels/​CeremonyCues.tsx Uses the renamed shared store.
suite/​apps/​cadence/​ui/​ExportBar.tsx Reads the renamed wedding-date store.
suite/​apps/​cadence/​state/​useKeyboard.ts Uses the renamed undo store.
suite/​apps/​cadence/​state/​testing.ts Updates shared-document test setup.
suite/​apps/​cadence/​state/​syncAssets.ts Uses the renamed shared store.
suite/​apps/​cadence/​state/​store.ts Updates shared-store and document references.
suite/​apps/​cadence/​state/​store.test.ts Updates history-store references.
suite/​apps/​cadence/​state/​sliceBridge.ts Updates the shared-store bridge.
suite/​apps/​cadence/​render/​screen/​useDragBlock.test.ts Updates undo-store references.
suite/​apps/​cadence/​render/​ics/​calendar.ts Changes calendar branding and UIDs. Moderate (3 votes): preserve the stable @trousseau UID suffix and update its test; changing event identities creates duplicates and stale timings on re-import. Display branding can change in PRODID.
suite/​apps/​cadence/​render/​ics/​calendar.test.ts Updates calendar UID expectations.
suite/​apps/​brigade/​ui/​panels/​SupplierLinkField.tsx Uses the renamed shared store.
suite/​apps/​brigade/​ui/​panels/​SupplierLinkField.test.tsx Updates supplier-panel test references.
suite/​apps/​brigade/​ui/​panels/​CrewPanel.tsx Reads guests from the renamed store.
suite/​apps/​brigade/​state/​store.ts Updates document and store references.
suite/​apps/​brigade/​state/​store.test.ts Updates shared-document test setup.
suite/​apps/​brigade/​state/​sliceBridge.ts Uses the renamed document type.
suite/​apps/​brigade/​state/​live.test.ts Updates store and fixture references.
suite/​app/​support/​page.tsx Updates support-page branding.
suite/​app/​opengraph-image.tsx Updates social-image branding.
suite/​app/​open/​[wedding]/​page.tsx Updates opening-page branding.
suite/​app/​not-found.tsx Updates metadata and commentary branding.
suite/​app/​legal.tsx Updates legal-page branding.
suite/​app/​layout.tsx Updates application metadata.
suite/​app/​globals.css Updates branding commentary.
suite/​app/​global-error.tsx Updates fatal-error branding.
suite/​app/​error.tsx Updates diagnostic branding.
suite/​app/​blog/​share/​page.tsx Updates email-subject branding.
suite/​app/​blog/​page.tsx Updates blog-page branding.
suite/​app/​blog/​[slug]/​page.tsx Updates structured-data organization branding.
suite/​app/​auth/​callback/​route.ts Handles provider errors and existing browser sessions.
suite/​app/​auth/​callback/​route.test.ts Tests callback refusals and session completion.
suite/​app/​api/​documents/​export/​route.ts Updates export-format commentary.
suite/​app/​api/​documents/​export/​route.test.ts Verifies renamed attachment filenames.
suite/​app/​api/​cron/​sweep/​route.ts Updates retention-log branding.
suite/​app/​(app)/​weddings/​page.tsx Updates store access and branding.
suite/​app/​(app)/​page.tsx Integrates welcome and example-banner components.
suite/​app/​(app)/​invite/​[token]/​page.tsx Updates invitation-page branding.
suite/​app/​(app)/​account/​page.tsx Updates store access and export branding.
src/​preservation.test.ts Verifies renamed schema preservation.
src/​index.ts Exports renamed public contract symbols.
src/​envelope.test.ts Tests renamed helpers and legacy document compatibility.
scripts/​validate-wedding.test.mjs Updates fixture commentary.
scripts/​validate-wedding.mjs Updates default paths and validator wording.
scripts/​sync.mjs Uses renamed canonical-data paths.
scratch/​docs/​SETUP.md Updates runbook branding and paths.
ROADMAP.md Updates product and contract names.
package.json Renames the package and data-script paths.
marketing/​copy/​hacker-news.md Updates product and package names.
marketing/​assets/​README.md Updates asset-documentation branding.
marketing/​assets/​pipeline/​phone.py Updates rendered-caption branding.
marketing/​assets/​pipeline/​lib.mjs Updates fixture and storage references.
LICENSE Updates product and package names.
docs/​superpowers/​specs/​2026-09-29-database-review.md Retitles the specification.
docs/​superpowers/​specs/​2026-09-28-expansion-master-plan.md Updates product and storage references.
docs/​superpowers/​specs/​2026-09-08-brigade-vendors-budget-tasks-design.md Retitles the specification.
docs/​superpowers/​specs/​2026-09-07-guided-tour-design.md Updates product and fixture references.
docs/​superpowers/​specs/​2026-09-04-ensemble-group-shots.md Updates store and contract references.
docs/​superpowers/​specs/​2026-09-02-tableaux-migration-design.md Updates specification names and references.
docs/​superpowers/​specs/​2026-09-02-onboarding-billing-legal-design.md Updates product and package references.
docs/​superpowers/​specs/​2026-09-02-multitenant-storage-design.md Updates product and architecture references.
docs/​superpowers/​specs/​2026-09-02-multitenant-mechanics-design.md Updates product and file-format references.
docs/​superpowers/​specs/​2026-09-02-identity-accounts-design.md Updates product and architecture references.
docs/​superpowers/​plans/​2026-09-29-toolbox.md Updates the schema reference.
docs/​superpowers/​plans/​2026-09-08-brigade-vendors-budget-tasks.md Updates contract examples.
docs/​DATA.md Updates canonical paths and setup instructions. Nit (3 votes): align cd Knotwork with the clone command, which creates Trousseau unless given an explicit destination.
docs/​BUILDING-A-TOOL.md Updates contributor contract and fixture references.
data/​wedding.knotwork.json.dvc Retargets the canonical DVC output.
data/​.gitignore Changes the canonical-data exclusion. Critical (3 votes): retain wedding.trousseau.json; existing private canonical files remain locally and can otherwise be staged by git add ..
CONTRIBUTING.md Updates package references and setup instructions. Nit (3 votes): align cd Knotwork with the actual Trousseau clone directory or explicitly name the clone destination.
.gitignore Changes root export exclusions. Critical (3 votes): retain the legacy .trousseau.json rule alongside the new rule so supported private backups cannot be staged accidentally.
.github/​workflows/​ci.yml Updates checkout and Node setup actions.
.githooks/​pre-commit Validates the renamed canonical file.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread data/.gitignore
Comment thread suite/components/shell/FrontPage.tsx Outdated
Comment thread suite/fixtures/.gitignore
Comment thread suite/lib/store/openWedding.ts
Comment thread suite/apps/cadence/render/ics/calendar.ts Outdated
Comment thread CONTRIBUTING.md
Comment thread docs/DATA.md Outdated
- .gitignore, data/.gitignore, suite/fixtures/.gitignore: keep ignoring
  the .trousseau.json names too — real weddings under the old name are
  still on existing checkouts and in old backups.
- FrontPage: decide 'empty' only once the store is ready; an unreadable
  wedding is kept as found and summarising it threw, crashing the page.
- openWedding: migrate the old keys first. /open runs before the store,
  so on an unmigrated device it read no link and skipped the swap.
- Calendar: keep the @trousseau UID suffix; a UID is identity, and
  changing it made re-imported events duplicates. PRODID says Knotwork.
- ExampleBanner: show why 'Start your own' failed instead of nothing.
- Clone instructions name the Knotwork folder, so 'cd Knotwork' works
  (seven places, not just the two flagged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam
CodeQL (js/polynomial-redos, high) flagged /^-+|-+$/ in
suggestedFilename: on its own it is quadratic on a long inner run of
dashes (measured 105ms, 414ms, 1758ms at 10k/20k/40k). The preceding
/[^a-z0-9]+/ -> '-' already collapses every run to one dash, so the
output is unchanged with /^-|-$/ — the form Cadence and Brigade already
use. Same change in bundle.mjs and Tableaux's download slug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ns6xSyytpwWuhH7vCJ8Dam

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Provider failures remain invisible on /weddings, and ceremony-order-only edits incorrectly hide the dashboard.

Review effort: Balanced
Findings: None

Resolved since last review (7)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Render cancelled sign-in failure on the weddings page

suite/​app/​auth/​callback/​route.ts:66

[P2] Cancelled provider sign-ins targeting /weddings still return silently: the callback sends /weddings?signin=failed, but WeddingsPage neither reads signin nor renders SignInFailed, so planners only see the ordinary sign-in prompt. Render a failure notice on that destination and test the displayed result, not just the redirect URL.

@JFrusher
JFrusher merged commit 6f60493 into main Oct 3, 2026
10 checks passed
@JFrusher
JFrusher deleted the claude/elegant-carson-5o5558 branch October 3, 2026 13:27

This branch was successfully deployed

1 active deployment
Preview — fb70335c Deployed Oct 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants