Skip to content

기본 단축키 해석을 정본 키맵과 chord로 통일한다 #733

Closed

Description

@developer-1px

Goal Anchor

  • Outcome: 같은 기본 단축키 입력이 Web·Affordance·Composer 중 어느 경로를 통과하느냐에 따라 달라지지 않도록 공통 키 해석을 정본에서 소비한다.
  • Done: 삭제·전체 선택·Undo/Redo의 기본 수정키 판정을 정본 API로 연결한다. 실제 React/Host 입력에서도 수정키가 보존되며, 관련 공개 API·owner 문서·Usage·source registration과 회귀 검증을 갖춘다.
  • Don't: Core의 여섯 멤버나 공개 편집 명령 종류를 늘리지 않는다. 제품별 키맵, Composer 제출·줄바꿈 정책, 전체 선택의 명시적 preserve/toggle 및 생략 시 기존 toggle 계약을 유지한다. 텍스트 단어 삭제와 구조적 삭제를 통합하지 않는다. Annotation·Gesture·Profile 동결·merge는 포함하지 않는다.

승인과 근거

사용자가 #725 건강도 감사의 실행에 “진행하자”, 첫 단계 #731 / #732 이후 “좋아 다음”으로 후속 실행을 요청했다. 이번 이슈는 감사 2단계 중 기본 단축키 해석을 소유한다.

현재 Web resolver는 수정키를 모두 포함한 chord를 조회한다. 반면 deleteAffordance는 key만 검사하고 selectAllAffordance는 Alt/Shift를 읽지 않는다. Composer React는 Alt를 버린 뒤 composerInteractionFromKeyStroke가 별도 Mod+Z 규칙을 적용한다. 그 결과 Mod+Alt+Z가 Composer에서 Undo로, Mod+Backspace가 Affordance에서 구조적 삭제로 처리될 수 있다.

Web 기본 명령에는 전체 선택이 없으므로 지원 명령 집합까지 같다고 가정하지 않는다. 공통화 대상은 키 입력 해석과 이미 중복된 기본 규칙이며, 전체 선택의 반복 정책과 Composer 제출 정책은 각각의 owner에 남긴다.

범위와 완료 증거

  • Web keyboard의 정본 chord/resolver, Affordance의 삭제·전체 선택, Composer 키 입력 API와 React 입력 연결을 추적한다.
  • 기존 부분 입력 호출은 계속 지원하면서 실제 입력에 있는 수정키를 버리지 않는다.
  • Meta/Control, Shift, Alt 조합의 양성·음성 사례와 실제 소비자 경로에서 문서·History 및 이벤트 처리 여부를 검증한다.
  • 공개 API 문서·기존 Usage·source registration을 연결하고 영향 패키지 및 site 검사를 수행한다.
  • #589가 소유한 Annotation Host 정리는 별도로 유지한다. JSON 주소와 값 검증을 Core 정본으로 통일한다 #732 주소·JSON 검증과 독립적으로 최신 main에서 작업한다.

Activity

  1. self-assigned this
    on Sep 8, 2026
  2. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    Goal Anchor

    • Outcome: 같은 기본 단축키 입력이 Web·Affordance·Composer 중 어느 경로를 통과하느냐에 따라 달라지지 않도록 공통 키 해석을 정본에서 소비한다.
    • Done: 삭제·전체 선택·Undo/Redo의 기본 수정키 판정을 정본 API로 연결한다. 실제 React/Host 입력에서도 수정키가 보존되며, 관련 공개 API·owner 문서·Usage·source registration과 회귀 검증을 갖춘다.
    • Don't: Core의 여섯 멤버나 공개 편집 명령 종류를 늘리지 않는다. 제품별 키맵, Composer 제출·줄바꿈 정책, 전체 선택의 명시적 preserve/toggle 및 생략 시 기존 toggle 계약을 유지한다. 텍스트 단어 삭제와 구조적 삭제를 통합하지 않는다. Annotation·Gesture·Profile 동결·merge는 포함하지 않는다.

    작업 계획

    Web keyboard — 기존 chord 정규화와 기본 키맵
    ├─ Affordance delete — 기본 resolver의 delete만 소비
    ├─ Affordance select-all — chord 판정 + 기존 반복 정책
    └─ Composer interaction — 기본 resolver의 history만 소비
       └─ Composer React — Alt를 포함한 실제 입력 전달
    
    • Web의 공개 명령 union은 확장하지 않는다. 전체 선택은 Affordance가 가진 별도 의미이며 Web의 chord 정규화만 필요하다.
    • Composer의 공개 composerInteractionFromKeyStroke는 이미 키 입력을 받는 호환 경계다. 이를 유지하려고 새 resolver를 만들지 않고 이 파일에서 Web의 순수 resolver를 소비한다. Composer → Web의 직접 peer dependency가 추가되지만 model/schema/commands에는 Web 입력을 들이지 않으며 DOM 객체도 필요하지 않다.
    • deleteAffordance의 생략 가능한 key, selectAllAffordance의 기존 부분 입력, Composer의 commandKey 입력을 유지한다. 추가 수정키는 선택 필드로 전달한다.
    • 먼저 수정키 조합으로 실패를 재현하고, 패키지 의미 검증과 실제 Composer React·Canvas·구조 editor 경로를 확인한다. 기존 키맵 재정의와 반복 선택·제출 정책도 유지 검증한다.
    • owner README/API reference, 기존 Usage와 source registration, workspace graph·typecheck·build·site 검사를 마친다.

    Annotation Host의 수동 키 처리에는 #589가 열려 있어 이번에는 변경하지 않는다. Rich Text Web은 이미 Web resolver를 소비한다. 전체 editor의 지원 행동표와 Profile 동결도 후속 범위다.

  3. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    구현 경계와 1차 검증 기록

    이전
    ├─ Web: 수정키 전체 → chord → 기본 키맵
    ├─ deleteAffordance: key만으로 삭제 판정
    ├─ selectAllAffordance: Mod와 A만 검사
    └─ Composer React: Alt 제거 → Composer의 별도 Mod+Z 판정
    
    현재
    Web의 chord 해석 / 기본 키맵
    ├─ deleteAffordance → 기본 resolver의 delete만 소비
    ├─ selectAllAffordance → chord 해석을 소비, 반복 정책은 유지
    └─ Composer interaction → 기본 resolver의 Undo/Redo만 소비
       └─ Composer React → Alt를 포함한 입력 전달
    

    무엇을 최소화했는가

    새 public 함수·명령 종류·Profile registry는 추가하지 않았다. 같은 규칙의 소유자를 모으는 데 필요한 것은 이미 있는 API의 소비였다. 단축키가 같아야 한다는 규칙을 모든 기능에 강제하지도 않았다. select-all의 반복 정책과 Composer의 Enter 정책은 기본 chord 해석과 별개의 의미이므로 기존 owner에 남겼다. Web의 defaults: false를 사용한 명시적 Alt chord 재정의도 계속 가능하다.

    호환성의 비용

    Composer의 기존 공개 키 입력 함수를 삭제하지 않으면서 중복 판정을 없애기 위해 Composer → Web peer dependency를 추가했다. 순수 resolver를 소비하는 파일은 interaction.ts 한 곳이다. model/schema/commands에는 Web 입력 지식을 추가하지 않았다. 패키지 단위 의존이 늘어난 사실은 숨길 수 없으며, 이것만으로 Domain/Adapter 하이라키가 완전히 정리되었다고 주장하지 않는다. 기존 공개 표면을 보존하는 현재 변경의 비용으로 README·manifest·project reference에 명시했다.

    테스트가 드러낸 경계

    • 변경 전 Affordance 수정키 조합 15개, Composer 2개, 실제 Composer React 2개에서 실패를 재현했다.
    • 변경 후 Web 63 / Affordance 95 / Composer 17 / Composer React 4 tests, 각 typecheck/build가 통과했다.
    • 실제 Canvas·Document·Composer Usage 경로에서 modified chord의 미처리, 정상 삭제/Undo/Redo, 반복 전체 선택, native input의 전체 선택 소유권을 확인했다.
    • 브라우저의 KeyboardEvent 속성은 객체 펼침으로 복사되지 않을 수 있다. 부분 입력 기본값을 채울 때 각 필드를 직접 읽도록 하고 실제 KeyboardEvent 인스턴스 검증도 추가했다.
    • source registration은 기존 Web keyboard·Affordance select·Composer interaction 구현으로 연결된다. 공개 export 수는 기존 1,033개 그대로다. workspace 29개 graph, docs 검사도 통과했다.

    사이트 전체 실행은 변경 관련 테스트를 포함해 140개가 통과했으나, 기존 docs-route의 2개 테스트가 5초 제한으로 실패했다. 이 결과를 전체 통과로 표시하지 않고 실행 부하를 줄여 원인을 확인 중이다. 남은 검증은 site 전체 typecheck·build/HTTP와 최종 diff/PR 연계다.

    Annotation의 수동 키 처리는 #589의 기존 소유권에 남아 있다. 이번 수정의 완료를 전체 editor나 Profile의 완전한 적합성으로 확대하지 않는다.

  4. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    PR #734를 열었다. 현재 head는 62decf587e4d0e4a648fb5d3d512f0090821ad09이며 이슈 본문·PR 본문·원격 head·실제 diff 20개 파일의 양방향 대응을 확인했다. #733만 연결·종결 대상으로 지정되어 있다. merge는 수행하지 않았다.

    완료 증거:

    • 기본 삭제·전체 선택·Undo/Redo가 정본 chord/resolver를 소비한다. Meta/Control/Alt/Shift, 부분 입력, native KeyboardEvent, 실제 Canvas·Document·Composer 경로를 검증했다.
    • 기존 반복 전체 선택·제출 정책과 명시적 사용자 키맵을 유지한다. Core 및 public 명령 종류를 늘리지 않았다.
    • 영향 패키지 179 tests와 typecheck/build, site 전체 typecheck/guard, root build, docs/API, workspace graph, site build·static·HTTP 검사가 통과했다.
    • source registration과 API 문서를 연결했다. Composer peer dependency 비용과 보존한 경계는 구현 기록에 설명했다.

    남은 검증:

    • 로컬 Site 전체 실행은 실행별로 기존 문서·App shell·A2UI 시간 제한/화면 대기 실패가 달랐다. 최근 전체 실행은 138/142 통과다. docs-route는 이후 코드 수정 없이 기본 제한으로 현재 브랜치와 #732에서 각각 3/3 통과했다. 전체 통과로 소급해서 표시하지 않는다.
    • 현재 head의 CI Plan은 통과했으며 Package·Site·External kit은 진행 중이다.
    • 기존 Chrome에 검증 화면 열기를 요청했지만 해당 탭을 자동 제어 연결에서 찾지 못했다. 실제 Chrome 조작 결과는 미확인이고 jsdom/HTTP 증거와 구분한다.

    작업 상태는 pr-open이다. Annotation #589, 전체 editor 적합성 표, Gesture 및 Profile 동결은 기존 후속 범위로 남는다.

  5. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    CI 후속 증거: 62decf58에서 Verify site가 통과했다. 이 단계는 전체 site typecheck·unit tests·build·static·HTTP 검사를 &&로 연결해 실행한다. 로컬에서 불안정했던 전체 사이트 실행은 CI에서 통과한 상태이며, External kit도 통과했다.

    현재 head의 CI에서 Package 전체 검사와 browser behavior 검증은 아직 진행 중이다. PR 본문에 이 구분을 반영했다. pr-open 상태와 merge 미수행은 유지한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions