Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c63b39f
test(diagnostics): require collaborative editor parity
seonghobae Aug 12, 2026
6be60ab
ci(diagnostics): add collaborative parity TDD lane
seonghobae Aug 12, 2026
cf48a4b
ci(diagnostics): integrate collaborative guidance once
seonghobae Aug 12, 2026
5b57c20
feat(diagnostics): integrate collaborative guidance
github-actions[bot] Aug 12, 2026
a7373f6
ci(diagnostics): revalidate collaborative guidance
seonghobae Aug 12, 2026
d59a2ed
test(diagnostics): cover collaborative guidance default label
seonghobae Aug 12, 2026
b157e32
test(diagnostics): prove collaborative diagnostic boundaries
seonghobae Aug 12, 2026
df1c1c0
test(diagnostics): carry exact standalone acceptance
seonghobae Aug 12, 2026
44bb76f
test(diagnostics): cover collaborative races and awareness
seonghobae Aug 12, 2026
cefaabd
test(diagnostics): require full collaborative convergence
seonghobae Aug 12, 2026
ae4c505
ci(diagnostics): exercise collaborative races
seonghobae Aug 12, 2026
d5f9917
merge: align collaborative diagnostics with exact standalone head
seonghobae Aug 12, 2026
03b34c0
ci(diagnostics): correct collaborative overlap evidence once
seonghobae Aug 12, 2026
440669a
test(diagnostics): inspect installed collaborative generations
seonghobae Aug 12, 2026
30e20cd
ci(diagnostics): remove superseded overlap fixer
seonghobae Aug 12, 2026
bf8b7db
ci(diagnostics): include collaborative boundary suite
seonghobae Aug 12, 2026
106b90b
test(diagnostics): reject unwrapped collaborative action updates
seonghobae Aug 12, 2026
ccf9181
fix(diagnostics): wrap collaborative apply updates in React act
seonghobae Aug 12, 2026
978835a
test(ci): require warning-free collaboration workflow
seonghobae Aug 12, 2026
07845a1
ci(diagnostics): fail closed on collaborative act warnings
seonghobae Aug 12, 2026
7d6f049
merge(diagnostics): restack collaboration on editor actions
seonghobae Aug 13, 2026
1a4aae0
merge(diagnostics): restack collaboration on current editor actions
seonghobae Aug 13, 2026
da7cec7
merge(diagnostics): include current editor action contract repair
seonghobae Aug 13, 2026
824347b
merge(diagnostics): include warning-free dismissal focus assurance
seonghobae Aug 13, 2026
48ed047
merge(diagnostics): include focus-event act repair
seonghobae Aug 13, 2026
e4d1f56
chore(diagnostics): restack collaboration on current editor actions
seonghobae Aug 16, 2026
3eab246
fix(stack): synchronize collaborative diagnostics without regressing …
seonghobae Aug 18, 2026
2aa741f
fix(stack): adopt diagnostics parent focus assurance
seonghobae Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .github/workflows/writing-diagnostics-collaboration-tdd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Writing Diagnostics Collaboration TDD

on:
push:
branches:
- feat/writing-diagnostics-collaboration
workflow_dispatch:

permissions:
contents: read

concurrency:
group: writing-diagnostics-collaboration-tdd-${{ github.ref }}
cancel-in-progress: true

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
collaborative-diagnostics:
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.sha }}
persist-credentials: false
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Run collaborative writing-diagnostic parity tests
run: |
set -euo pipefail
output_file="$(mktemp)"
trap 'rm -f "$output_file"' EXIT
set +e
pnpm exec vitest run \
src/collaboration/CollaborativeCwlEditor.writingDiagnostics.test.tsx \
src/collaboration/CollaborativeCwlEditor.writingDiagnostics.race.test.tsx \
src/collaboration/CollaborativeCwlEditor.writingDiagnostics.coverage.test.tsx \
src/collaboration/CollaborativeCwlEditor.writingDiagnostics.boundary.test.tsx \
--pool=forks \
--maxWorkers=1 2>&1 | tee "$output_file"
test_status=${PIPESTATUS[0]}
set -e
if grep -Fq 'not wrapped in act' "$output_file"; then
echo "::error::Focused collaborative diagnostics emitted a React act warning."
exit 1
fi
exit "$test_status"
- name: Typecheck collaborative writing-diagnostic contracts
run: pnpm typecheck
- name: Run complete production coverage gate
env:
NODE_OPTIONS: --max-old-space-size=6144
run: |
set -euo pipefail
output_file="$(mktemp)"
trap 'rm -f "$output_file"' EXIT
set +e
pnpm coverage 2>&1 | tee "$output_file"
test_status=${PIPESTATUS[0]}
set -e
if grep -Fq 'not wrapped in act' "$output_file"; then
echo "::error::Production coverage emitted a React act warning."
exit 1
fi
exit "$test_status"
- name: Build all package entrypoints
run: pnpm build
- name: Verify isolated packed-package consumers
run: pnpm verify:package
- name: Build demonstration application
run: pnpm build:demo
34 changes: 33 additions & 1 deletion src/collaboration/CollaborativeCwlEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import { applyEditorFormReset } from '../components/editorFormReset.js';
import { editorHtmlToValue } from '../components/editorSerialization.js';
import { useEditorHandle } from '../components/useEditorHandle.js';
import { useLatestRef } from '../components/useLatestRef.js';
import { useWritingDiagnosticsController } from '../components/useWritingDiagnosticsController.js';
import { WritingDiagnosticsPanel } from '../components/WritingDiagnosticsPanel.js';
import type { ClipboardSanitizationError } from '../extensions/SafeClipboard.js';
import { buildExtensions } from '../extensions/kit.js';
import type { CwlEditorHandle } from '../types.js';
Expand Down Expand Up @@ -95,6 +97,11 @@ export const CollaborativeCwlEditor = forwardRef<
ariaErrorMessage,
ariaInvalid,
ariaRequired,
writingDiagnostics,
onWritingDiagnosticAction,
onWritingDiagnosticsError,
writingDiagnosticsLabel,
printWritingDiagnostics,
} = props;

assertCollaborationConfiguration(provider, user);
Expand Down Expand Up @@ -260,7 +267,14 @@ export const CollaborativeCwlEditor = forwardRef<
[collaborationDocument, scopedProvider, normalizedField, presenceEnabled],
);

useEditorHandle(ref, editor, modeRef);
const writingDiagnosticsController = useWritingDiagnosticsController({
editor,
diagnostics: writingDiagnostics,
onAction: onWritingDiagnosticAction,
onError: onWritingDiagnosticsError,
});

useEditorHandle(ref, editor, modeRef, writingDiagnosticsController);

useEffect(() => {
editor?.setEditable(editable);
Expand Down Expand Up @@ -346,6 +360,24 @@ export const CollaborativeCwlEditor = forwardRef<
formFieldDisabled={formFieldDisabled}
onFormReset={editor && onFormReset ? handleFormReset : undefined}
status={status}
writingDiagnosticsPanel={
writingDiagnostics === undefined ? undefined : (
<WritingDiagnosticsPanel
controller={writingDiagnosticsController}
label={writingDiagnosticsLabel ?? 'Writing guidance'}
onApplyDiagnostic={
editable
? (diagnosticId) => {
void writingDiagnosticsController.applyDiagnostic(
diagnosticId,
);
}
: undefined
}
printEnabled={printWritingDiagnostics}
/>
)
}
/>
);
});
Expand Down
Loading
Loading