feat(accessibility): expose toolbar shortcuts to assistive technology - #73
feat(accessibility): expose toolbar shortcuts to assistive technology#73seonghobae wants to merge 40 commits into
Conversation
|
Warning Review limit reached
Next review available in: 5 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthrough툴바가 Bold, Italic, Link, Undo, Redo 단축키를 Changes툴바 단축키 접근성
Estimated code review effort: 2 (Simple) | ~10 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Exact-current-head read-only review request after all direct repository gates completed successfully. Head: @opencode-agent review Review only. Do not modify the branch, create or dispatch repair writers, create write-capable workflows, reuse predecessor/stale/synthetic-merge evidence, or synthesize author approval. Verify the exact WAI-ARIA shortcut grammar and existing-command mapping, native toolbar semantics, documentation/doctoring consistency, host ownership boundary, and current repository-policy gates. Submit a formal verdict only against exact head |
|
Exact-current-head review request for @coderabbitai review Review only. Do not update this branch, create repair workflows, invoke write-capable agents, reuse predecessor-head evidence, or synthesize author approval. Submit findings/verdicts only against this exact unchanged head. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
head_expected='ae8448d10b874fb0006d77667afb32a102c82e61'
base_expected='ca49a3249403be88ba3cb7c9589b3652f820e17c'
printf '%s\n' '== checked-out commit =='
git rev-parse HEAD
printf '%s\n' '== expected commits present =='
git cat-file -t "$head_expected"
git cat-file -t "$base_expected"
printf '%s\n' '== ancestry =='
git merge-base --is-ancestor "$base_expected" "$head_expected" && echo "base is ancestor of head"
printf '%s\n' '== range changed files =='
git diff --name-status "$base_expected..$head_expected"
printf '%s\n' '== range summary =='
git diff --stat "$base_expected..$head_expected"
printf '%s\n' '== aria-keyshortcuts changes =='
git diff --unified=80 "$base_expected..$head_expected" -- ':!package-lock.json' | rg -n -C 12 'aria-keyshortcuts|ariaKeyShortcuts|keyshortcuts|Control\+|Meta\+' || true
printf '%s\n' '== candidate source/test/documentation files =='
fd -t f . | rg -i '(toolbar|button|accessib|aria|shortcut|doctor|changelog|readme|contribut)'
printf '%s\n' '== structural outline of TypeScript/TSX candidates =='
fd -t f -e ts -e tsx . | xargs -r ast-grep outline --items all --type class,function --match 'Toolbar|Button|toolbar|button' 2>/dev/null || true
printf '%s\n' '== PR metadata/checks =='
gh pr view 73 --repo ContextualWisdomLab/inkspan --json number,headRefOid,baseRefOid,state,isDraft,mergeStateStatus,reviewDecision,statusCheckRollupLength of output: 44391 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Toolbar implementation =='
nl -ba src/components/Toolbar.tsx | sed -n '1,760p'
printf '%s\n' '== Existing toolbar semantic tests =='
nl -ba src/components/Toolbar.test.tsx | sed -n '1,820p'
printf '%s\n' '== Added accessibility test =='
nl -ba src/toolbarShortcutAccessibility.test.tsx | sed -n '1,220p'
printf '%s\n' '== Added documentation contract test =='
nl -ba src/toolbarShortcutDocumentation.test.ts | sed -n '1,180p'
printf '%s\n' '== Editor extension configuration and keyboard shortcut definitions =='
ast-grep outline src --items all --type function,class --match 'extensions|Shortcut|shortcut|Keyboard|keyboard' 2>/dev/null || true
rg -n -i -C 5 'addKeyboardShortcuts|keyboardShortcuts|Control[-+]?[bikz]|Meta[-+]?[bikz]|Mod[-+]?[bikz]|toggleBold|toggleItalic|setLink|\.undo\(\)|\.redo\(\)' src package.json
printf '%s\n' '== Dependency versions relevant to editor commands =='
node -e 'const p=require("./package.json"); console.log(JSON.stringify({dependencies:p.dependencies,devDependencies:p.devDependencies},null,2))' 2>/dev/null || cat package.json
printf '%s\n' '== Documentation with line numbers =='
nl -ba docs/accessibility.md | sed -n '145,235p'
nl -ba docs/doctoring/toolbar-shortcut-discoverability.md | sed -n '1,140p'
nl -ba CHANGELOG.md | sed -n '1,35p'
printf '%s\n' '== Exact PR review and required-check metadata =='
gh api repos/ContextualWisdomLab/inkspan/pulls/73/reviews --paginate \
--jq '.[] | {user: .user.login, state, commit_id, submitted_at, body}'
gh api repos/ContextualWisdomLab/inkspan/branches/main/protection --jq '{required_status_checks,required_pull_request_reviews,required_linear_history,required_conversation_resolution}' || trueLength of output: 2117 🏁 Script executed: #!/bin/bash
set -euo pipefail
show_lines() {
local file="$1"
local start="$2"
local end="$3"
awk -v start="$start" -v end="$end" \
'NR >= start && NR <= end { printf "%6d\t%s\n", NR, $0 }' "$file"
}
printf '%s\n' '== Toolbar implementation =='
show_lines src/components/Toolbar.tsx 1 760
printf '%s\n' '== Existing toolbar semantic tests =='
show_lines src/components/Toolbar.test.tsx 1 820
printf '%s\n' '== Added accessibility test =='
show_lines src/toolbarShortcutAccessibility.test.tsx 1 220
printf '%s\n' '== Added documentation contract test =='
show_lines src/toolbarShortcutDocumentation.test.ts 1 180
printf '%s\n' '== Editor extension configuration and keyboard shortcut definitions =='
ast-grep outline src --items all --type function,class --match 'extensions|Shortcut|shortcut|Keyboard|keyboard' 2>/dev/null || true
rg -n -i -C 5 'addKeyboardShortcuts|keyboardShortcuts|Control[-+]?[bikz]|Meta[-+]?[bikz]|Mod[-+]?[bikz]|toggleBold|toggleItalic|setLink|\.undo\(\)|\.redo\(\)' src package.json || true
printf '%s\n' '== Package editor dependencies =='
rg -n -C 2 '"`@tiptap/`|prosemirror|tiptap' package.json
printf '%s\n' '== Documentation =='
show_lines docs/accessibility.md 145 235
show_lines docs/doctoring/toolbar-shortcut-discoverability.md 1 140
show_lines CHANGELOG.md 1 35
printf '%s\n' '== Exact PR review metadata =='
gh api repos/ContextualWisdomLab/inkspan/pulls/73/reviews --paginate \
--jq '.[] | {user: .user.login, state, commit_id, submitted_at, body}'
printf '%s\n' '== Main branch protection =='
gh api repos/ContextualWisdomLab/inkspan/branches/main/protection \
--jq '{required_status_checks,required_pull_request_reviews,required_linear_history,required_conversation_resolution}' || trueLength of output: 71201 🏁 Script executed: #!/bin/bash
set -euo pipefail
head_expected='ae8448d10b874fb0006d77667afb32a102c82e61'
base_expected='ca49a3249403be88ba3cb7c9589b3652f820e17c'
printf '%s\n' '== exact current checkout and range =='
git rev-parse HEAD
git diff --exit-code "$head_expected" -- || true
git merge-base --is-ancestor "$base_expected" HEAD && echo 'requested base is an ancestor of current checkout'
printf '%s\n' '== stated lineage commit ancestry =='
for commit in \
303149b4d3e586ba32c1306d1a7d98542142d9d3 \
29d8c156e40eb0975687ee83053bedf3de7d77a5 \
513dcdc26a5cbaef333cf822a2e191f43a3eda70
do
git cat-file -e "${commit}^{commit}"
if git merge-base --is-ancestor "$commit" "$head_expected"; then
echo "$commit is an ancestor of the reviewed head"
else
echo "$commit is NOT an ancestor of the reviewed head"
fi
done
printf '%s\n' '== EditorFrame link-shortcut implementation =='
awk 'NR >= 1 && NR <= 105 { printf "%6d\t%s\n", NR, $0 }' src/components/EditorFrame.tsx
printf '%s\n' '== Extension composition =='
awk 'NR >= 1 && NR <= 260 { printf "%6d\t%s\n", NR, $0 }' src/extensions/kit.ts
printf '%s\n' '== repository workflow and policy candidates =='
fd -t f .github . 2>/dev/null | rg '(^|/)(workflows|CODEOWNERS|policy|contribut|pull_request|review)' || true
printf '%s\n' '== workflow assertions for exact head, review, and coverage =='
rg -n -i -C 3 'exact.?head|head\.sha|github\.event\.pull_request\.head\.sha|approval|review|coverage|100%' .github src/workflowExactHead.test.ts 2>/dev/null || true
printf '%s\n' '== head-bound GitHub check suites =='
gh api "repos/ContextualWisdomLab/inkspan/commits/$head_expected/check-suites" --paginate \
--jq '.check_suites[] | {app: .app.slug, conclusion, head_sha, status, workflow_run: .workflow_run.id}' || trueLength of output: 16394 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='ae8448d10b874fb0006d77667afb32a102c82e61'
printf '%s\n' '== Failed GitHub Actions check runs on exact head =='
gh api "repos/$repo/commits/$head/check-runs?status=completed&per_page=100" \
--jq '.check_runs[]
| select(.app.slug == "github-actions" and .conclusion == "failure")
| {name, conclusion, details_url, started_at, completed_at, output}'
printf '%s\n' '== All GitHub Actions workflow runs filtered to exact head =='
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
--jq '.workflow_runs[]
| {id, name, event, status, conclusion, head_sha, html_url, created_at, updated_at}'
printf '%s\n' '== Required status checks from public repository rulesets, if accessible =='
gh api "repos/$repo/rulesets?includes_parents=true" \
--jq '.[] | {name, enforcement, target, conditions, rules}' || true
printf '%s\n' '== Current PR commit statuses =='
gh api "repos/$repo/commits/$head/status" \
--jq '{state, statuses: [.statuses[] | {context, state, target_url, description}]}' || trueLength of output: 4872
I verified these items:
I did not synthesize approval. GitHub API access did not provide branch-protection details, and it returned no submitted PR reviews. Therefore, I cannot independently confirm a qualifying non-author approval or the full protected-rule state.
|
|
@coderabbitai review Fresh exact-current-head review request for |
|
|
|
Exact-current-head independent review request for A corrective test-first review found and removed a false accessibility claim: the configured Tiptap Link extension has no built-in keyboard shortcut, so Inkspan must not advertise Exact-head gates are complete and successful: CI @opencode-agent review Review only. Do not modify this branch, dispatch a repair writer, create a write-capable workflow, reuse predecessor-head or synthetic-merge evidence, or synthesize author approval. Submit findings or a formal verdict only against this unchanged exact head. |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/doctoring/toolbar-shortcut-discoverability.md`:
- Line 63: Update the retrieval dates in the Tiptap and corresponding second
bibliography entries from August 8, 2026 to the actual review date, August 7,
2026.
In `@src/components/Toolbar.tsx`:
- Around line 383-390: Update the Redo ToolbarButton near the existing “Redo
(Ctrl/Cmd+Shift+Z)” configuration to include Control+Y and Meta+Y in
keyShortcuts alongside the current shortcuts. Reflect the same Ctrl/Cmd+Y
alternative in the Redo title, related tests, and documentation.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 333707e3-3834-437b-a219-05bfa0040efb
📒 Files selected for processing (6)
CHANGELOG.mddocs/accessibility.mddocs/doctoring/toolbar-shortcut-discoverability.mdsrc/components/Toolbar.tsxsrc/toolbarShortcutAccessibility.test.tsxsrc/toolbarShortcutDocumentation.test.ts
|
Exact-current-head review request for @coderabbitai review Review only. Do not modify this branch, dispatch repair writers, create write-capable workflows, reuse predecessor-head or synthetic-merge evidence, or synthesize author approval. Submit findings or a formal verdict only against this unchanged exact head, including the corrected |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='df7696a5ad70fe0dfedbda7123904e7559be8975'
base='ca49a3249403be88ba3cb7c9589b3652f820e17c'
echo '== exact checkout and ancestry =='
git rev-parse HEAD
git cat-file -t "$head"
git cat-file -t "$base"
git merge-base --is-ancestor "$base" "$head" && echo 'base is ancestor of requested head'
git diff --exit-code "$head" -- && echo 'checkout matches requested head'
echo '== changed files and diff summary =='
git diff --name-status "$base..$head"
git diff --stat "$base..$head"
echo '== shortcut, redo, and retrieval-date diff =='
git diff --unified=50 "$base..$head" -- \
src/components/Toolbar.tsx \
src/toolbarShortcutAccessibility.test.tsx \
src/toolbarShortcutDocumentation.test.ts \
docs/accessibility.md \
docs/doctoring/toolbar-shortcut-discoverability.md \
CHANGELOG.md \
README.md \
| rg -n -C 12 'aria-keyshortcuts|Control\+|Meta\+|redo|Redo|2026-08-08|retriev' || true
echo '== candidate files =='
fd -t f . | rg '(^|/)(Toolbar|EditorFrame|kit|toolbarShortcutAccessibility|toolbarShortcutDocumentation)\.(ts|tsx)$|(^|/)(accessibility|toolbar-shortcut-discoverability)\.md$|(^|/)CHANGELOG\.md$|(^|/)README\.md$'
echo '== source/test outlines =='
for f in \
src/components/Toolbar.tsx \
src/components/EditorFrame.tsx \
src/extensions/kit.ts \
src/toolbarShortcutAccessibility.test.tsx \
src/toolbarShortcutDocumentation.test.ts
do
if [ -f "$f" ]; then
echo "-- $f"
ast-grep outline "$f" --items all 2>/dev/null || true
fi
done
echo '== exact implementation and command mapping =='
rg -n -i -C 6 \
'aria-keyshortcuts|keyShortcuts|Control\+(B|I|Z|Shift\+Z|Y)|Meta\+(B|I|Z|Shift\+Z|Y)|toggleBold|toggleItalic|\.undo\(\)|\.redo\(\)|addKeyboardShortcuts|keyboardShortcut' \
src
echo '== relevant documents =='
for f in docs/accessibility.md docs/doctoring/toolbar-shortcut-discoverability.md CHANGELOG.md README.md; do
if [ -f "$f" ]; then
echo "-- $f"
rg -n -i -C 4 'aria-keyshortcuts|Control\+|Meta\+|redo|link|2026-08-08|retriev|WAI-ARIA|Tiptap' "$f" || true
fi
done
echo '== requested head checks and workflow runs =='
gh api "repos/$repo/commits/$head/check-runs?status=completed&per_page=100" \
--jq '.check_runs[] | {name, app: .app.slug, conclusion, head_sha, details_url}' || true
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
--jq '.workflow_runs[] | {id, name, event, status, conclusion, head_sha, html_url}' || true
echo '== pull request and accessible policy/review state =='
gh pr view 73 --repo "$repo" \
--json number,headRefOid,baseRefOid,state,isDraft,mergeStateStatus,reviewDecision,statusCheckRollup
gh api "repos/$repo/pulls/73/reviews" --paginate \
--jq '.[] | {user: .user.login, state, commit_id, submitted_at}' || true
gh api "repos/$repo/branches/main/protection" \
--jq '{required_status_checks,required_pull_request_reviews,required_linear_history,required_conversation_resolution}' || true
gh api "repos/$repo/rulesets?includes_parents=true" \
--jq '.[] | {name, enforcement, target, conditions, rules}' || trueLength of output: 115340 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='df7696a5ad70fe0dfedbda7123904e7559be8975'
echo '== exact relevant source =='
for f in src/extensions/kit.ts src/extensions/SafeLink.ts src/components/EditorFrame.tsx package.json; do
if [ -f "$f" ]; then
echo "-- $f"
nl -ba "$f" | sed -n '1,300p'
fi
done
echo '== shortcut definitions in extension sources =='
rg -n -i -C 6 \
'addKeyboardShortcuts|keyboardShortcut|History|UndoRedo|Collaboration|disableHistory|SafeLink|Control[-+]?Y|Meta[-+]?Y|Mod[-+]?Y|Shift[-+]?Control[-+]?Z|Shift[-+]?Meta[-+]?Z' \
src package.json
echo '== lineage on the requested head =='
for commit in \
57f5ef8e21f8351fa04c122e700b43777c9ea57e \
e89f51e87e84552247c7080aa61800c7da813e40 \
9c8a6b0c0332c4f6a3bd0c5e373be87eb79ac50b \
a6c472e9b2aa3ec0f4cbf9663613243ed410faab \
11439733245d76c6dc3b58f4fb9bf2105ac94b43 \
bc634bf2f3237e58156ad68691b140ab90718992 \
52d38471cbc24be5792d7a32bf2319a039668622 \
877ee37ecb1d97fa447db77869f2193530e45a31
do
git cat-file -e "${commit}^{commit}"
git merge-base --is-ancestor "$commit" "$head" && echo "$commit: ancestor" || echo "$commit: NOT ancestor"
git show -s --format='%H%n%aI%n%cI%n%s' "$commit"
done
echo '== retrieval-date lines and last modifying commits =='
for f in docs/doctoring/toolbar-shortcut-discoverability.md docs/accessibility.md; do
echo "-- $f"
nl -ba "$f" | sed -n '1,110p'
git blame -L 74,84 --date=iso-strict "$head" -- docs/doctoring/toolbar-shortcut-discoverability.md 2>/dev/null || true
done
echo '== current exact-head workflow and PR state =='
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
--jq '.workflow_runs[] | select(.id == 31227151651 or .name | test("Strix|CI|Security Scan|SAST Semgrep")) | {id,name,status,conclusion,head_sha,updated_at,html_url}' || true
gh pr view 73 --repo "$repo" \
--json headRefOid,baseRefOid,mergeStateStatus,reviewDecision,statusCheckRollupLength of output: 2364 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='df7696a5ad70fe0dfedbda7123904e7559be8975'
show_lines() {
local file="$1"
local first="$2"
local last="$3"
awk -v first="$first" -v last="$last" \
'NR >= first && NR <= last { printf "%6d\t%s\n", NR, $0 }' "$file"
}
echo '== exact relevant source =='
for f in src/extensions/kit.ts src/extensions/SafeLink.ts src/components/EditorFrame.tsx package.json; do
if [ -f "$f" ]; then
echo "-- $f"
show_lines "$f" 1 300
fi
done
echo '== shortcut definitions in extension sources =='
rg -n -i -C 6 \
'addKeyboardShortcuts|keyboardShortcut|History|UndoRedo|Collaboration|disableHistory|SafeLink|Control[-+]?Y|Meta[-+]?Y|Mod[-+]?Y|Shift[-+]?Control[-+]?Z|Shift[-+]?Meta[-+]?Z' \
src package.json || true
echo '== lineage on the requested head =='
for commit in \
57f5ef8e21f8351fa04c122e700b43777c9ea57e \
e89f51e87e84552247c7080aa61800c7da813e40 \
9c8a6b0c0332c4f6a3bd0c5e373be87eb79ac50b \
a6c472e9b2aa3ec0f4cbf9663613243ed410faab \
11439733245d76c6dc3b58f4fb9bf2105ac94b43 \
bc634bf2f3237e58156ad68691b140ab90718992 \
52d38471cbc24be5792d7a32bf2319a039668622 \
877ee37ecb1d97fa447db77869f2193530e45a31
do
git cat-file -e "${commit}^{commit}"
git merge-base --is-ancestor "$commit" "$head" && echo "$commit: ancestor" || echo "$commit: NOT ancestor"
git show -s --format='%H%n%aI%n%cI%n%s' "$commit"
done
echo '== retrieval-date evidence and provenance =='
show_lines docs/doctoring/toolbar-shortcut-discoverability.md 70 90
git blame -L 74,84 --date=iso-strict "$head" -- \
docs/doctoring/toolbar-shortcut-discoverability.md || true
echo '== current exact-head workflow and PR state =='
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
--jq '.workflow_runs[]
| select(.id == 31227151651 or (.name | test("^(CI|Security Scan|SAST Semgrep)$")))
| {id,name,status,conclusion,head_sha,updated_at,html_url}' || true
gh pr view 73 --repo "$repo" \
--json headRefOid,baseRefOid,mergeStateStatus,reviewDecision,statusCheckRollupLength of output: 170066
I also verified that:
I did not synthesize approval. You are interacting with an AI system. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/doctoring/toolbar-shortcut-discoverability.md`:
- Line 14: Update the documentation to match the current link shortcut contract:
acknowledge Control+K/Meta+K handling in EditorFrame and its exposure through
Toolbar metadata and accessibility tests, and revise the decision, RED/GREEN
history, rollback scope, and button-count references accordingly. Keep one
consistent contract across this record and the referenced documentation; do not
claim link shortcuts are unimplemented or metadata is removed.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 1d864dbf-5c34-4bd6-828f-5fc61cb91782
📒 Files selected for processing (7)
CHANGELOG.mdREADME.mddocs/accessibility.mddocs/doctoring/toolbar-shortcut-discoverability.mdsrc/components/Toolbar.tsxsrc/toolbarShortcutAccessibility.test.tsxsrc/toolbarShortcutDocumentation.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- CHANGELOG.md
- src/toolbarShortcutDocumentation.test.ts
|
Exact-current-head review request for @coderabbitai review Please review this exact unchanged head only. Do not change the branch. Verify the |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='e23358b435191b1a8285910b00f980b450972f5c'
base='ca49a3249403be88ba3cb7c9589b3652f820e17c'
echo '== Exact checkout and ancestry =='
git rev-parse HEAD
git cat-file -t "$head"
git cat-file -t "$base"
git merge-base --is-ancestor "$base" "$head" && echo 'base is an ancestor of requested head'
git diff --exit-code "$head" -- && echo 'checkout matches requested head'
echo '== Changed files =='
git diff --name-status "$base..$head"
git diff --stat "$base..$head"
echo '== Changed shortcut-related content =='
git diff --unified=60 "$base..$head" -- \
src/components/EditorFrame.tsx \
src/components/Toolbar.tsx \
src/toolbarShortcutAccessibility.test.tsx \
src/toolbarShortcutDocumentation.test.ts \
docs/accessibility.md \
docs/doctoring/toolbar-shortcut-discoverability.md \
CHANGELOG.md \
README.md \
| rg -n -C 10 'aria-keyshortcuts|keyShortcuts|Control\+|Meta\+|Ctrl|Cmd|redo|Redo|link|Link|host|ownership' || true
echo '== Candidate file map =='
fd -t f . | rg '(^|/)(EditorFrame|Toolbar|toolbarShortcutAccessibility|toolbarShortcutDocumentation|kit|SafeLink)\.(ts|tsx)$|(^|/)(accessibility|toolbar-shortcut-discoverability)\.md$|(^|/)CHANGELOG\.md$|(^|/)README\.md$'
echo '== Source and test outlines =='
for f in \
src/components/EditorFrame.tsx \
src/components/Toolbar.tsx \
src/extensions/kit.ts \
src/extensions/SafeLink.ts \
src/toolbarShortcutAccessibility.test.tsx \
src/toolbarShortcutDocumentation.test.ts \
src/components/Toolbar.test.tsx
do
if [ -f "$f" ]; then
echo "-- $f"
ast-grep outline "$f" --items all 2>/dev/null || true
fi
done
echo '== Keyboard mapping and aria metadata references =='
rg -n -i -C 8 \
'addKeyboardShortcuts|keyboardShortcut|event\.(ctrlKey|metaKey)|key\s*===?\s*["'\'']k["'\'']|keyShortcuts|aria-keyshortcuts|Control\+(B|I|K|Z|Shift\+Z|Y)|Meta\+(B|I|K|Z|Shift\+Z|Y)|toggleBold|toggleItalic|setLink|unsetLink|\.undo\(\)|\.redo\(\)' \
src
echo '== Documentation and changelog references =='
for f in docs/accessibility.md docs/doctoring/toolbar-shortcut-discoverability.md CHANGELOG.md README.md; do
if [ -f "$f" ]; then
echo "-- $f"
nl -ba "$f" | rg -n -C 5 'aria-keyshortcuts|Control\+|Meta\+|Ctrl|Cmd|redo|Redo|link|Link|host|ownership|WAI-ARIA' || true
fi
done
echo '== Exact-head checks and PR state =='
gh api "repos/$repo/commits/$head/check-runs?status=completed&per_page=100" \
--jq '.check_runs[] | {name, app: .app.slug, conclusion, head_sha, details_url}' || true
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
--jq '.workflow_runs[] | {id, name, event, status, conclusion, head_sha, html_url}' || true
gh pr view 73 --repo "$repo" \
--json number,headRefOid,baseRefOid,state,isDraft,mergeStateStatus,reviewDecision,statusCheckRollup
gh api "repos/$repo/pulls/73/reviews" --paginate \
--jq '.[] | {user: .user.login, state, commit_id, submitted_at}' || true
gh api "repos/$repo/branches/main/protection" \
--jq '{required_status_checks,required_pull_request_reviews,required_linear_history,required_conversation_resolution}' || true
gh api "repos/$repo/rulesets?includes_parents=true" \
--jq '.[] | {name, enforcement, target, conditions, rules}' || trueLength of output: 110934 🏁 Script executed: #!/bin/bash
set -euo pipefail
show_lines() {
local file="$1"
local first="$2"
local last="$3"
echo "-- $file, Lines $first-$last"
awk -v first="$first" -v last="$last" \
'NR >= first && NR <= last { printf "%6d\t%s\n", NR, $0 }' "$file"
}
echo '== EditorFrame shortcut handler and wiring =='
show_lines src/components/EditorFrame.tsx 1 125
echo '== Extension composition and history configuration =='
show_lines src/extensions/kit.ts 1 180
show_lines src/extensions/SafeLink.ts 120 210
echo '== Existing editor-surface Ctrl/Cmd+K tests =='
show_lines src/components/CwlEditor.test.tsx 225 325
echo '== Added shortcut tests =='
show_lines src/toolbarShortcutAccessibility.test.tsx 1 110
show_lines src/toolbarShortcutDocumentation.test.ts 1 110
echo '== Existing toolbar semantic tests around interaction and roving focus =='
rg -n -C 8 \
'roving|tabindex|ArrowRight|ArrowLeft|Home|End|disabled|aria-pressed|link button|Redo|Undo' \
src/components/Toolbar.test.tsx
echo '== Exact changed documentation =='
show_lines docs/accessibility.md 250 335
show_lines docs/doctoring/toolbar-shortcut-discoverability.md 1 120
show_lines CHANGELOG.md 1 30
show_lines README.md 250 310
echo '== Commit lineage for link correction =='
git log --format='%H%n%s%n' \
--ancestry-path ca49a3249403be88ba3cb7c9589b3652f820e17c..e23358b435191b1a8285910b00f980b450972f5c \
-- src/components/Toolbar.tsx \
src/components/EditorFrame.tsx \
src/components/CwlEditor.test.tsx \
docs/accessibility.md \
docs/doctoring/toolbar-shortcut-discoverability.md \
CHANGELOG.md
echo '== Current exact-head state after inspection =='
git rev-parse HEAD
gh api "repos/ContextualWisdomLab/inkspan/actions/runs?head_sha=e23358b435191b1a8285910b00f980b450972f5c&per_page=100" \
--jq '.workflow_runs[]
| select(.name == "CI" or .name == "Security Scan" or .name == "SAST Semgrep" or .name == "Strix Security Scan ContextualWisdomLab/inkspan#73@e23358b435191b1a8285910b00f980b450972f5c")
| {id, name, status, conclusion, head_sha, html_url}' || trueLength of output: 49056
I verified the following items:
I did not synthesize approval. At review time, the exact-head Strix Security Scan was still in progress, the PR merge state was You are interacting with an AI system. |
|
@strix review Fresh read-only Strix review requested for exact head |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/doctoring/toolbar-shortcut-discoverability.md`:
- Line 64: Update the product-name spelling in the referenced documentation
paragraph from “TipTap” to “Tiptap” so it matches the terminology used
throughout the rest of the public document.
In `@src/toolbarShortcutDocumentation.test.ts`:
- Around line 32-34: README.md와 toolbarShortcutDocumentation 테스트의 기대 문자열을 동일하게
맞추세요. 테스트의 toContain 검증이 통과하도록 기존 문서 문구를 확인하고, 정해진 문구가 없다면 initial content,
toolbar, Ctrl/Cmd+K commands, pasted/autolinked URLs 범위를 포함한 문장을 README.md에
추가하세요.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e006e9eb-85c2-4cd6-8b4f-c2b4873610f6
📒 Files selected for processing (3)
CHANGELOG.mddocs/doctoring/toolbar-shortcut-discoverability.mdsrc/toolbarShortcutDocumentation.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- CHANGELOG.md
|
Exact-current-head read-only review request for |
|
Superseded by #77 after protected |
Buyer-visible gap
Inkspan's built-in toolbar visually advertised editor shortcuts but did not expose all shipped shortcuts programmatically. Exact-head review also showed that shortcut truth must be established across the complete editor surface, not only from Tiptap extension-local keymaps.
Bounded repair
aria-keyshortcutsusing normativeControlandMetatokens;Control+B Meta+B, italicControl+I Meta+I, link editingControl+K Meta+K, undoControl+Z Meta+Z, and redoControl+Shift+Z Meta+Shift+Z Control+Y Meta+Y;aria-pressed, roving focus, SafeLink validation, existing prompt-driven link behavior, existing Tiptap undo/redo commands, and host-owned shortcut-conflict policy;Tiptap's Link extension has no default shortcut, but Inkspan already implements
Ctrl/Cmd+KinEditorFrame. The toolbar exposes the actual repository-level shipped binding rather than inferring absence from the extension alone.Test-first and review lineage
Protected base and latest live
main:ca49a3249403be88ba3cb7c9589b3652f820e17cat the latest refetch.303149b4d3e586ba32c1306d1a7d98542142d9d3and GREEN29d8c156e40eb0975687ee83053bedf3de7d77a5establishedaria-keyshortcuts.11439733245d76c6dc3b58f4fb9bf2105ac94b43and GREENbc634bf2f3237e58156ad68691b140ab90718992added the already-shippedCtrl/Cmd+Yalternative.EditorFrameCtrl/Cmd+Kpath. Link RED8790b4e50bced266b38763c6301097aaeb775e4band production19f4d99ab1d9a548b6a843806e9c3926f4ec0f75restored truthful metadata.920fdb25c21022186acdf9782da6a16bb160a41drestored one unrelated delete-row line changed by an earlier full-file edit.e23358b435191b1a8285910b00f980b450972f5cestablished accessibility, doctoring, README, and changelog traceability.c847a21a61ca11d8e3934aebc63420b3826b4840corrected that bounded documentation contract.TipTapvsTiptap). Test-first commitba8256deed6c925b4f6bdab303d76bed4738fbd6made the exact terminology contractual; exact current heade56c0e2ef43d3389fd84ac6e81abba9844cc5b89corrected the one public paragraph. The associated inline thread is resolved.Standards and ownership evidence
The doctoring record uses W3C WAI-ARIA 1.2, the ARIA Authoring Practices toolbar pattern, and official Tiptap Link, Undo/Redo, and Collaboration documentation with APA 7th references.
aria-keyshortcutsis descriptive metadata for commands Inkspan already implements; it creates no authorization or keyboard behavior.Inkspan owns editor presentation and deterministic conversion surfaces only. Hosts own transport, authorization, tenant isolation, persistence, credentials, migration, retention, audit storage, collaboration-provider lifecycle, and model-use policy.
Exact current-head evidence
Exact current head:
e56c0e2ef43d3389fd84ac6e81abba9844cc5b89.Direct current-head repository gates are terminal-success:
31313746437: success.31313746406: success.31313746423: success.5231682472; no response is counted until anchored to this unchanged SHA.No queued, pending, cancelled, skipped-required, predecessor-head, stale-head, status-only, author-only, comment-only, or synthetic-merge evidence is counted as acceptance.
Remaining merge gate
The implementation is Ready for Review and direct exact-head CI/security/SAST are green. Merge remains prohibited until this unchanged exact head has any actually required current-head automated/human review with zero valid unresolved findings, a qualifying independent non-author formal approval where repository policy requires it, and branch-protection/repository-policy acceptance without bypass. No package version is bumped and no release is attempted in this PR.