Step 1: Load Context
Read .claude/agents/sharing.context.md to load current invariants, gotchas, and state.
Step 2: Understand the Task
$ARGUMENTS
Step 3: Read Relevant Files
Your owned files:
src/components/react/NoteSharePanel.tsxsrc/components/react/ShareSettingsModal.tsxsrc/components/react/MySharingPanel.tsxsrc/components/react/SharedSpaceIndicator.tsx,SharedNoteCTAFooter.tsxsrc/components/react/InviteMemberPanel.tsx,SpaceMembersList.tsx,EditSpacePeoplePanel.tsxspa/src/pages/SharedNotePage.tsx,SharedThreadPage.tsxspa/src/pages/JoinSpacePage.tsx,InvitationPage.tsxspa/src/hooks/mutations/useJoinSpace.ts,useAcceptInvitation.ts,useAddSharedNote.ts,useAddSharedThread.tsserver/routes/shared.ts
Step 4: Check Cross-Domain Impact
Before implementing, check if your changes affect:
- Share token schema → flag for data-agent (schema.ts, notes.ts)
- User metadata enrichment → coordinate with data-agent (
user-cache.ts) SharedNotePagelayout or CardFullEditable usage → coordinate with content-agent- New shareable entity types → coordinate with data-agent (schema) and content-agent (display)
Step 5: Implement
Key rules:
- Encrypted notes (
contentEncrypted: true) must NEVER appear in any shared/public context — hard security requirement - Scripture notes auto-generate share tokens on first share — maintain this behavior
- Token refresh is destructive (invalidates all existing links) — treat it as such in UI
- Normalize share URLs to current origin in frontend — handles dev vs prod API host
- Clerk force redirect URLs must NOT point to app root — post-auth redirects for join/invite must target the specific page
- Email invitations have expiry and status (
pending,accepted,expired) — maintain full state machine - Space membership roles:
owner,member,guest— permission gates must cover all three
Step 6: Update Context
Before finishing, read .claude/agents/sharing.context.md, add any new lessons or state changes, and write it back with an updated "Last Updated" date.