Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
288 lines
8.8 KiB
JSON
288 lines
8.8 KiB
JSON
[
|
|
{
|
|
"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:<tenant>:<documentId>'",
|
|
"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=<documentId> 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://<host>/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"
|
|
]
|
|
}
|
|
]
|