[ { "id": "F001", "description": "Add 'collaborative_editing' feature flag to DEFAULT_BOOLEAN_FLAGS with default value false", "implemented": true, "prdRefs": [ "F-P1-01" ] }, { "id": "F002", "description": "Add v3 collab packages to server/package.json: @tiptap/extension-collaboration@^3.12.0, @tiptap/extension-collaboration-caret@^3.0.0, @tiptap/y-tiptap@^3.0.2", "implemented": true, "prdRefs": [ "F-P1-05" ] }, { "id": "F003", "description": "Create CollaborativeEditor component in packages/documents/src/components/ that initializes TipTap with Collaboration + CollaborationCaret extensions bound to a Y.js document via @tiptap/y-tiptap", "implemented": true, "prdRefs": [ "F-P1-04", "F-P1-05" ] }, { "id": "F004", "description": "CollaborativeEditor connects to Hocuspocus using HocuspocusProvider with room name format 'document::'", "implemented": true, "prdRefs": [ "F-P1-04" ] }, { "id": "F005", "description": "CollaborativeEditor includes existing EditorToolbar (BubbleMenu) with all formatting options from PR #1898", "implemented": true, "prdRefs": [ "F-P1-13" ] }, { "id": "F006", "description": "Collaboration cursors display user name and distinct color via awareness protocol", "implemented": true, "prdRefs": [ "F-P1-06" ] }, { "id": "F007", "description": "Presence bar component above editor showing avatars/names of all connected users", "implemented": true, "prdRefs": [ "F-P1-07" ] }, { "id": "F008", "description": "Connection status indicator component (connected / syncing / disconnected)", "implemented": true, "prdRefs": [ "F-P1-08" ] }, { "id": "F009", "description": "Auto-save status indicator replacing manual save button ('All changes saved' / 'Saving...' / 'Offline')", "implemented": true, "prdRefs": [ "F-P1-09" ] }, { "id": "F010", "description": "Markdown paste handling works in collaborative mode (same detection + conversion as current DocumentEditor)", "implemented": true, "prdRefs": [ "F-P1-14" ] }, { "id": "F011", "description": "Add onConnect hook to Hocuspocus server.js that validates tenant segment in document room names matches connecting user's tenant", "implemented": true, "prdRefs": [ "F-P1-12" ] }, { "id": "F012", "description": "Hocuspocus onConnect allows non-document rooms (notifications:*) to pass through unchanged", "implemented": true, "prdRefs": [ "F-P1-12" ] }, { "id": "F013", "description": "Content persists to Hocuspocus PostgreSQL database via existing Database extension", "implemented": true, "prdRefs": [ "F-P1-10" ] }, { "id": "F014", "description": "Create server action syncCollabSnapshot(documentId) that reads Y.js state, converts to TipTap JSON, writes to document_block_content", "implemented": true, "prdRefs": [ "F-P1-11" ] }, { "id": "F015", "description": "Create /msp/collab-test/page.tsx route gated by collaborative_editing feature flag \u2014 shows 'Feature not available' when disabled", "implemented": true, "prdRefs": [ "F-P1-01", "F-P1-03" ] }, { "id": "F016", "description": "Test page: 'Create New Document' button that creates a document via createBlockDocument and opens it in the collaborative editor", "implemented": true, "prdRefs": [ "F-P1-02" ] }, { "id": "F017", "description": "Test page: URL parameter ?doc= opens an existing document directly in the collaborative editor", "implemented": true, "prdRefs": [ "F-P1-03" ] }, { "id": "F018", "description": "Test page: 'Snapshot to DB' button that calls syncCollabSnapshot and shows success/error feedback", "implemented": true, "prdRefs": [ "F-P1-11" ] }, { "id": "F019", "description": "Test page: debug panel (collapsible) showing connection status, connected users count, room name, Y.js sync state", "implemented": true, "prdRefs": [ "F-P1-03" ] }, { "id": "F020", "description": "CollaborativeEditor initializes Y.js document from existing document_block_content.block_data when the Hocuspocus document is empty (first connection for a document)", "implemented": true, "prdRefs": [ "F-P2-02" ] }, { "id": "F021", "description": "Export CollaborativeEditor from packages/documents/src/components/index.ts", "implemented": true, "prdRefs": [ "F-P1-04" ] }, { "id": "F022", "description": "CollaborativeEditor CSS: cursor label styling, presence bar styling, status indicator styling \u2014 using existing design tokens (--color-* CSS vars)", "implemented": true, "prdRefs": [ "F-P1-06", "F-P1-07", "F-P1-08" ] }, { "id": "F023", "description": "CollaborativeEditor includes Emoticon extension from @alga-psa/ui/editor for text-emoticon-to-emoji conversion", "implemented": true, "prdRefs": [ "F-P1-15" ] }, { "id": "F024", "description": "CollaborativeEditor includes Link extension with config matching DocumentEditor: openOnClick: false, autolink: true, linkOnPaste: true, target: '_blank', rel: 'noopener noreferrer'", "implemented": true, "prdRefs": [ "F-P1-16" ] }, { "id": "F025", "description": "EmojiSuggestionExtension: ProseMirror plugin detects ':query' (2+ chars) and emits state changes; EmojiSuggestionPopup: React component shows grid of matching emoji from emoji-mart with keyboard navigation (arrows, Enter, Escape)", "implemented": true, "prdRefs": [ "F-P1-17" ] }, { "id": "F026", "description": "CollaborativeEditor integrates EmojiSuggestionExtension and EmojiSuggestionPopup for ':query' emoji picker grid", "implemented": true, "prdRefs": [ "F-P1-17" ] }, { "id": "F027", "description": "MentionNode: Tiptap Node extension (inline, atom) that renders mention badges with userId/username/displayName attributes, matching BlockNote Mention styling", "implemented": true, "prdRefs": [ "F-P1-18" ] }, { "id": "F028", "description": "MentionSuggestionExtension: ProseMirror plugin detects '@query' and emits state changes; MentionSuggestionPopup: React component shows searchable user list with @everyone option, keyboard navigation (arrows, Enter/Tab, Escape)", "implemented": true, "prdRefs": [ "F-P1-18" ] }, { "id": "F029", "description": "CollaborativeEditor accepts optional searchMentions prop and integrates MentionNode + MentionSuggestionExtension + MentionSuggestionPopup; Collab test page passes searchUsersForMentions", "implemented": true, "prdRefs": [ "F-P1-18" ] }, { "id": "F030", "description": "yjs-config.ts getHocuspocusUrl() derives WebSocket URL from window.location in browser (wss:///hocuspocus), falls back to NEXT_PUBLIC_HOCUSPOCUS_URL env var or ws://localhost:1234", "implemented": true, "prdRefs": [ "F-P1-19" ] }, { "id": "F031", "description": "RichTextViewer: sanitizeBlocks() validates block types and coerces non-string .text fields; extractTextFromProseMirror() handles Tiptap JSON {type:'doc'} format; RichTextErrorBoundary catches render crashes with plain-text fallback", "implemented": true, "prdRefs": [ "F-P1-20" ] }, { "id": "F032", "description": "TextEditor isTextContent guard checks typeof content.text === 'string' to prevent .trim() crash on non-string text fields in old documents", "implemented": true, "prdRefs": [ "F-P1-20" ] }, { "id": "F033", "description": "resolveEveryoneMention checks for @everyone once and does a single DB query instead of looping; mention handlers early-exit when no new mentions found; notifications created in parallel via Promise.all", "implemented": true, "prdRefs": [ "F-P1-21" ] }, { "id": "F034", "description": "EmojiSuggestion and MentionSuggestion exports added to @alga-psa/ui/editor index.ts (EmojiSuggestionExtension, EmojiSuggestionPopup, EmojiSuggestionState, MentionNode, MentionSuggestionExtension, MentionSuggestionPopup, MentionSuggestionState, MentionSuggestionUser)", "implemented": true, "prdRefs": [ "F-P1-17", "F-P1-18" ] }, { "id": "F035", "description": "Phase 2 cleanup: Audit and delete DocumentEditor.jsx, BlockEditor.jsx, and DocumentEditor.tsx after confirming zero remaining imports. Verify comments (TextEditor) and read-only display (RichTextViewer) are unaffected.", "implemented": false, "prdRefs": [ "F-P2-01" ] } ]