V13-FE-006: consolidate approved UI and contract hardening
deploy / deploy (push) Successful in 1m52s
deploy / notify (push) Successful in 1s

This commit is contained in:
2026-08-13 02:41:00 +09:00
parent d79edae546
commit 3f293d8aa8
1278 changed files with 14384 additions and 1664 deletions
@@ -0,0 +1,92 @@
import type { KbxComponentManifestEntry } from '@kbx/contracts'
// v55 compatibility-version: '1.2.0' — KbxExcelImport six-stage baseline before v56 focus lifecycle hardening.
export const kbxComponentManifest: KbxComponentManifestEntry[] = [
{ name: 'KbxButton', category: 'primitive', purpose: '표준 업무 명령 버튼', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxTextField', category: 'primitive', purpose: '표준 문자열 입력', owner: 'KBX', version:'1.1.0' },
{ name: 'KbxDateField', category: 'primitive', purpose: '키보드 직접입력을 포함한 날짜 입력', owner: 'KBX', version: '1.1.0' },
{ name: 'KbxLookup', category: 'business', purpose: '비동기 race/error 복구와 코드/명칭 기반 업무 엔터티 선택', keyboard: ['F2', 'Enter', 'Esc'], owner: 'KBX', version: '1.4.0' },
{ name: 'KbxLookupDialog', category: 'business', purpose: 'Provider 오류·Empty·Pagination·Keyboard 선택을 표준화한 Lookup Dialog', keyboard: ['ArrowUp', 'ArrowDown', 'Enter', 'Esc'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxSearchPanel', category: 'business', purpose: '조회조건의 고정 배치·상세조건·안전한 사용자별 기본/최근조건 기억', keyboard: ['Enter'], accessibility:['기억옵션 명시','민감 자유검색어 저장 제외 가능'], owner: 'KBX', version: '1.4.0' },
{ name: 'KbxCommandBar', category: 'business', purpose: 'Permission Host·선택·업무상태·Dirty 조건과 표준 Excel 메뉴를 반영해 명령을 고정 배치', keyboard: ['F3', 'F8'], owner: 'KBX', version: '1.4.0' },
{ name: 'KbxDataGrid', category: 'business', purpose: '조회·편집·대량처리용 업무 Grid', keyboard: ['Enter', 'Tab', 'Shift+Tab', 'Ctrl+C', 'Ctrl+V', 'F2'], owner: 'KBX', version: '1.6.0' },
{ name: 'KbxFormSection', category: 'business', purpose: 'Token 기반 Section heading·description·action 영역을 제공하는 Master/Transaction 입력 Section', owner: 'KBX', version: '1.1.0' },
{ name: 'KbxFormGrid', category: 'business', purpose: 'Desktop 2-column·좁은 화면 1-column 전환을 표준화하는 Form layout', owner:'KBX', version:'1.0.0' },
{ name: 'KbxFormSpan', category: 'business', purpose: '주소·비고 등 관계상 넓게 보여야 하는 Field의 명시적 full-span layout', owner:'KBX', version:'1.0.0' },
{ name: 'KbxValidationSummary', category: 'business', purpose: '저장 실패 입력 오류의 요약 및 이동', owner: 'KBX', version: '1.0.1' },
{ name: 'KbxStatus', category: 'business', purpose: 'Domain 상태를 일관된 semantic 상태로 표시', owner: 'KBX', version: '1.1.0' },
{ name: 'KbxHelpPanel', category: 'business', purpose: '화면 목적·사용순서·단축키·주의사항 도움말', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxListPage', category: 'template', purpose: '조회 전·조회·재조회·Empty/Error 복구와 오류별 Retry 가능 여부·Search·Quick Filter·Grid·Summary를 고정한 조회형 표준 화면', owner: 'KBX', version: '1.9.0' },
{ name: 'KbxTransactionPage', category: 'template', purpose: 'Header/Detail·Context·Lifecycle·Summary·Actionable Problem과 오류별 Retry 가능 여부를 결합한 거래형 표준 화면', owner: 'KBX', version: '1.8.0' },
{ name: 'KbxMasterPage', category: 'template', purpose: '조회 전 상태·목록/상세·Tabs·Context·Dirty/Conflict/Audit·Actionable Problem과 오류별 Retry 가능 여부를 결합한 기준정보 표준 화면', owner: 'KBX', version: '1.8.0' },
{ name: 'KbxMasterDetailPage', category: 'template', purpose: '조회 전·재조회 Context와 Actionable Problem을 보존하며 Master·Detail·이력의 제목·건수·영역 Action까지 표준화한 탐색 화면', owner: 'KBX', version: '1.9.0' },
{ name: 'KbxWmsMobilePage', category: 'wms', purpose: 'Template/Permission/Network/Loading·Error Recovery·Retry 가능 여부와 입력 차단 시 Action footer 억제를 포함한 PDA·Scanner 현장 작업 Shell', owner: 'KBX', version: '1.8.0' },
{ name: 'KbxBarcodeCapture', category: 'wms', purpose: 'Keyboard-wedge/Camera/수동 입력과 bounded buffer·짧은 중복 debounce를 표준화', keyboard: ['Enter','Esc'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxNetworkIndicator', category: 'wms', purpose: '현장 네트워크 및 대기 Command 상태 표시', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxWmsActionButton', category: 'wms', purpose: '장갑/터치 환경용 주요 업무 CTA', owner: 'KBX', version: '1.1.0' },
{ name: 'KbxExcelMenu', category: 'business', purpose: 'Arrow/Esc/Focus 복구를 포함한 Excel 다운로드·양식·업로드·붙여넣기·이력 표준 메뉴', keyboard:['ArrowUp','ArrowDown','Home','End','Esc'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxExcelImport', category: 'business', purpose: '파일 preflight·1:1 매핑·검증·미리보기·반영·결과 6단계, 단계 Focus 이동, 오류 탐색·부분실패 복구를 포함한 Excel Import 흐름', keyboard:['Tab','Shift+Tab'], owner: 'KBX', version: '1.3.0' },
{ name: 'KbxJobProgress', category: 'business', purpose: 'Hangfire 장시간 작업 진행상태 표시', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxImportPage', category: 'template', purpose: 'Progress·Context·Import Content·Result·Actionable Problem·오류별 Retry 가능 여부를 고정한 Excel Import 표준 화면', owner: 'KBX', version: '1.6.0' },
{ name: 'KbxExceptionCenter', category: 'business', purpose: '예외 요약·목록·상세·안전한 후속 Action을 결합한 운영 컴포넌트', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxExceptionSummary', category: 'business', purpose: '업무 예외 유형별 건수와 빠른 필터', owner: 'KBX', version: '1.0.1' },
{ name: 'KbxExceptionDetailDrawer', category: 'business', purpose: '표준 Drawer·Permission Host로 예외 원인·대상·후속 Action을 안전하게 처리', keyboard: ['Esc'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxWorkQueuePage', category: 'template', purpose: 'Queue 제목·설명·전체 건수·표준 Action을 손실 없이 전달하고 예외 업무 처리·실패 복구를 우선하는 Queue 호환 화면', owner: 'KBX', version: '1.7.0' },
{ name: 'KbxReconcilePage', category: 'template', purpose: 'Expected/Actual/Difference·Resolution·Audit·Actionable Problem·오류별 Retry 가능 여부 기반 정합성 대사 화면', owner: 'KBX', version: '1.7.0' },
{ name: 'KbxUtilityRail', category: 'business', purpose: '도움말·AI 오류복구·사용자 제안을 동일한 우측 보조영역에 통합', keyboard: ['Esc'], owner: 'KBX', version: '1.2.0' },
{ name: 'KbxAiAssistant', category: 'business', purpose: 'Capability/Permission guard와 오류 재질문을 포함한 현재 화면 기반 AI 보조', owner: 'KBX', version: '1.1.0' },
{ name: 'KbxUserSuggestionPanel', category: 'business', purpose: '현재 화면 맥락을 포함한 저마찰 사용자 개선 제안', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxRuntimeBanner', category: 'business', purpose: '장애·읽기전용·오프라인 등 현재 운영모드를 화면 상단에 명확히 표시', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxProblemFeedback', category: 'business', purpose: '업무규칙·권한·검증·외부연계·시스템 Problem을 다음 행동과 함께 인라인 표시', accessibility:['색상 외 문제 유형 텍스트','검증 오류 요약','참조번호','재시도/닫기 명시적 Action'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxFreshnessIndicator', category: 'business', purpose: '조회 데이터의 관측시각과 stale 여부를 표시하고 재조회를 제공', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxConflictResolver', category: 'business', purpose: '낙관적 동시성 충돌 시 내 화면과 최신 값을 비교하고 안전하게 다시 읽기', owner: 'KBX', version: '1.0.0' },
{ name: 'KbxOperationCenter', category: 'business', purpose: 'Excel·대량처리·연계 등 장시간 작업의 진행률·결과와 Home에서 지정한 대상 작업 Focus를 지속적으로 표시', accessibility:['active operation focus','aria-current'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxNotificationCenter', category: 'business', purpose: '완료·부분실패·운영 알림을 비차단 방식으로 제공하고 Home 대상 알림을 직접 Focus', accessibility:['active notification focus','aria-current'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxRecordLifecycle', category: 'business', purpose: 'Version·Workflow·Conflict·Audit를 하나의 재사용 가능한 레코드 생명주기 영역으로 통합', owner:'KBX', version:'1.0.0' },
{ name: 'KbxRecordNavigator', category: 'business', purpose: 'T02 목록-상세 화면에서 현재 위치와 이전·다음 레코드 이동을 표준화', keyboard:['Tab','Shift+Tab'], accessibility:['현재 위치 텍스트','disabled 이동경계','focus-visible'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxWorkflowBar', category: 'business', purpose: 'Permission Host를 반영해 현재 업무상태·표준 상태흐름·다음 가능 작업·허용 전이를 한 위치에서 표현', owner: 'KBX', version: '1.2.0' },
{ name: 'KbxGlobalHeader', category: 'shell', purpose: '제품·실제 Module Selector·메뉴검색·운영알림·사용자 Action을 고정 배치하는 전역 Header', keyboard: ['Ctrl+K'], owner: 'KBX', version: '1.4.0' },
{ name: 'KbxSideNavigation', category: 'shell', purpose: 'Header와 동기화된 모듈 전환·검색·즐겨찾기·최근메뉴·2단계 업무메뉴 탐색', owner: 'KBX', version: '1.3.1' },
{ name: 'KbxWorkspaceTabs', category: 'shell', purpose: '키보드 roving focus·Dirty·Pin·안전한 세션 복원 표시·Overflow를 가진 다중 업무 Workspace Tab', keyboard:['ArrowLeft','ArrowRight','Home','End'], owner: 'KBX', version: '1.3.0' },
{ name: 'KbxMenuSearch', category: 'shell', purpose: '즐겨찾기·최근업무 우선순위와 메뉴명·화면코드·업무 키워드를 결합하고 Focus를 복원하는 메뉴검색', keyboard: ['ArrowUp', 'ArrowDown', 'Enter', 'Esc'], owner: 'KBX', version: '1.3.0' },
{ name: 'KbxApplicationShell', category: 'shell', purpose: 'Global Header·Module Navigation·Workspace Tabs·Skip Navigation·업무영역과 사용자 Action 전달을 통합하는 Application Shell', owner: 'KBX', version: '1.6.0' },
{ name: 'KbxUnsavedChangesDialog', category: 'shell', purpose: 'Workspace 이동·종료 시 미저장 변경의 유지·폐기·저장후이동을 표준화', keyboard: ['Esc', 'Tab', 'Shift+Tab'], owner: 'KBX', version: '1.1.0' },
{ name: 'KbxInput', category: 'primitive', purpose: '표준 문자열 입력의 canonical API', allowedUse:['업무 문자열 입력'], forbiddenUse:['숫자·금액·수량 입력'], accessibility:['명시적 label 연결','error aria-describedby','focus-visible'], owner:'KBX', version:'1.2.0' },
{ name: 'KbxNumberField', category: 'primitive', purpose: '숫자 입력·표시 형식을 분리한 공통 숫자 입력', allowedUse:['integer','decimal'], forbiddenUse:['금액 의미를 직접 표현'], accessibility:['label','aria-invalid'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxMoneyField', category: 'business', purpose: '통화·정밀도·음수정책을 포함한 금액 입력', owner:'KBX', version:'1.1.0' },
{ name: 'KbxQuantityField', category: 'business', purpose: '단위·가용수량을 포함한 업무 수량 입력', owner:'KBX', version:'1.1.0' },
{ name: 'KbxDateRange', category: 'business', purpose: 'ERP 조회용 시작일·종료일 범위 입력', keyboard:['Tab','Shift+Tab'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxSelect', category: 'primitive', purpose: '짧고 고정된 Enum 선택', forbiddenUse:['대량 품목·거래처 선택'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxPageHeader', category: 'business', purpose: '화면명·경로·Utility 진입점의 고정 배치', owner:'KBX', version:'1.1.0' },
{ name: 'KbxBulkActionBar', category: 'business', purpose: 'Permission Host와 선택 건수를 반영한 대량 업무 Action의 공통 표현', owner:'KBX', version:'1.1.0' },
{ name: 'KbxDialog', category: 'primitive', purpose: '위험확정·짧은 Lookup·사유입력용 제한적 Modal · 닫힘 후 호출 지점 Focus 복원', keyboard:['Esc'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxDrawer', category: 'primitive', purpose: '조회맥락을 유지하는 상세·Audit·Help 보조영역 · 닫힘 후 호출 지점 Focus 복원', keyboard:['Esc'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxToast', category: 'business', purpose: '시간이 지나도 해결이 필요하지 않은 성공·정보 Feedback', accessibility:['aria-live'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxConfirm', category: 'business', purpose: '위험 수준과 업무 결과를 설명하는 확인 UX', keyboard:['Esc'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxAuditTrail', category: 'business', purpose: '사용자 관점의 변경 전·후·행위자·사유 이력 표시', owner:'KBX', version:'1.0.0' },
{ name: 'KbxProposalPanel', category: 'business', purpose: 'Permission·Server validation 상태를 확인한 뒤 AI 변경안을 승인하는 공통 패턴', owner:'KBX', version:'1.1.0' },
{ name: 'KbxAiPanel', category: 'business', purpose: 'KbxAiAssistant 오류·화면명 계약을 포함하는 표준 명칭 호환 API', owner:'KBX', version:'1.1.0' },
{ name: 'KbxFastEntryPage', category: 'template', purpose: 'Keyboard Guide·Grid 제목/건수/영역 Action·Editable Grid·Validation·Sticky Summary를 고정한 대량 행 입력 화면', keyboard:['Enter','Tab','Shift+Tab','F2','Ctrl+V','Ctrl+D'], owner:'KBX', version:'1.10.0' },
{ name: 'KbxQueuePage', category: 'template', purpose: '예외 우선 Work Summary·Context·Queue·Quick Action과 업무별 Empty/Error·Retry 가능 여부를 통제하는 표준 Template', owner:'KBX', version:'1.9.0' },
{ name: 'KbxMaskedValue', category: 'business', purpose: '민감정보의 기본 마스킹·권한 기반 전체보기 진입점을 표준화', allowedUse:['개인정보·민감 업무값 표시'], forbiddenUse:['권한검증 없이 원문 노출'], accessibility:['전체보기/가리기 명시적 텍스트 Action'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxIntegrationState', category: 'business', purpose: 'Business State와 분리된 외부연계 대기·재시도·완료·실패 상태를 사용자에게 설명', allowedUse:['Outbox/외부 API 연계 상태'], forbiddenUse:['Domain 업무상태 대체'], accessibility:['색상 외 상태 텍스트','상세/재처리 명시적 Action'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxDataProvenance', category: 'business', purpose: '외부 데이터의 출처·기준시각·수신시각·정규화 버전·stale 상태를 재현 가능하게 표시', allowedUse:['KRX/OPENDART/KIS 등 외부 Read Model'], forbiddenUse:['외부 데이터를 Domain Truth로 표현'], accessibility:['색상 외 freshness 상태 텍스트','재조회 명시적 Action'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxCheckbox', category: 'primitive', purpose: 'Boolean 업무값의 키보드·마우스 선택', accessibility:['명시적 label','focus-visible'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxRadio', category: 'primitive', purpose: '소수의 상호배타 선택지 입력', accessibility:['radio label','keyboard native'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxTextarea', category: 'primitive', purpose: '메모·사유 등 다중행 문자열 입력', accessibility:['label','aria-invalid'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxTabs', category: 'primitive', purpose: '상세정보를 동일 화면 맥락에서 분리하는 표준 Tabs', keyboard:['Tab','ArrowLeft','ArrowRight','Home','End'], owner:'KBX', version:'1.1.0' },
{ name: 'KbxBadge', category: 'primitive', purpose: '보조 상태·건수의 짧은 텍스트 표시', accessibility:['색상 외 텍스트'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxTooltip', category: 'primitive', purpose: '짧은 Field·Action 도움말을 Hover와 Focus 모두에서 표시', keyboard:['Tab'], owner:'KBX', version:'1.0.0' },
{ name: 'KbxBarcodeField', category: 'business', purpose: 'Desktop 업무 Form의 바코드 문자열 입력과 정규화', owner:'KBX', version:'1.1.0' },
{ name: 'KbxSectionHeader', category: 'business', purpose: 'Form·Detail Grid Section의 제목·건수·보조 Action 위치 표준화', owner:'KBX', version:'1.0.0' },
{ name: 'KbxQuickFilterBar', category: 'business', purpose: '현재 조회결과 KPI를 즉시 필터로 전환하는 Actionable Summary', owner:'KBX', version:'1.0.0' },
{ name: 'KbxDataState', category: 'business', purpose: 'Idle·Loading·Empty·Error 상태와 복구 Action을 공통 표현', allowedUse:['조회·Grid·비동기 업무 상태'], forbiddenUse:['업무 오류를 Toast로 대체'], accessibility:['aria-busy','error role alert','명시적 복구 Action'], owner:'KBX', version:'1.1.1' },
{ name: 'KbxTemplateStateBoundary', category: 'business', purpose: '표준 Template의 Idle·Loading·Empty·Error·Refreshing 상태와 오류별 Retry 가능 여부를 Context 손실 없이 통합', allowedUse:['T01~T09 주요 업무 Surface'], forbiddenUse:['Domain 업무 오류를 단순 Empty/Error로 축약'], accessibility:['aria-busy','live refresh status','explicit retry','non-retryable error'], owner:'KBX', version:'1.3.0' },
{ name: 'KbxSummaryBar', category: 'business', purpose: '조회건수·선택건수·수량·금액 등 화면 하단 요약의 고정 표현', owner:'KBX', version:'1.0.0' },
{ name: 'KbxHomePage', category: 'shell', purpose: '긴급·미저장·진행·알림 Triage와 복원·즐겨찾기·모듈 업무탐색을 결합한 운영 Home Workbench', keyboard:['Ctrl+K','ArrowLeft','ArrowRight','Home','End'], owner:'KBX', version:'1.12.0' },
{ name: 'KbxAccessDenied', category: 'shell', purpose: '직접 URL 접근을 포함한 Frontend 권한 거부 상태와 화면 정보 비노출 secure-default 복구', owner:'KBX', version:'1.2.0' },
{ name: 'KbxRouteNotFound', category: 'shell', purpose: '등록되지 않은 딥링크를 안전한 메뉴검색/Home 흐름으로 복구', owner:'KBX', version:'1.0.0' },
{ name: 'KbxTemplateContextBar', category: 'template', purpose: 'T01~T08의 조회건수·선택·오류·기준시각 등 업무 문맥을 동일 위치에 표현', owner:'KBX', version:'1.0.0' },
{ name: 'KbxProgressSteps', category: 'business', purpose: 'Import 등 단계형 업무의 현재/완료 단계를 접근성 있게 표현', owner:'KBX', version:'1.0.0' },
]
@@ -0,0 +1,34 @@
import type { KbxScreenDefinition, KbxScreenManifestEntry } from '@kbx/contracts'
const screens = new Map<string, KbxScreenDefinition>()
export function registerKbxScreens(definitions: readonly KbxScreenDefinition[]) {
for (const definition of definitions) {
if (screens.has(definition.id)) {
throw new Error(`Duplicate KBX screen id: ${definition.id}`)
}
screens.set(definition.id, definition)
}
}
export function getKbxScreen(id: string) {
return screens.get(id)
}
export function listKbxScreens(): KbxScreenDefinition[] {
return [...screens.values()].sort((a, b) => a.id.localeCompare(b.id))
}
export function toKbxScreenManifest(routeById: Record<string, string> = {}): KbxScreenManifestEntry[] {
return listKbxScreens().map(screen => ({
id: screen.id,
version: screen.version,
module: screen.module,
type: screen.type,
templateCode: screen.templateCode,
title: screen.title,
route: routeById[screen.id],
helpKey: screen.helpKey,
requiredPermissions: screen.permissions ?? [],
}))
}
@@ -0,0 +1,19 @@
import type { KbxTemplateManifestEntry } from '@kbx/contracts'
const commonA11y=['keyboard','focus-visible','color-independent-state','labelled-regions']
const commonStates=['idle','loading','empty','error','ready'] as const
const desktopUtilities=['help','ai','suggestion'] as const
export const kbxTemplateManifest:KbxTemplateManifestEntry[]=[
{code:'T01',type:'list',component:'KbxListPage',purpose:'조회·선택·대량처리',requiredSurfaces:['page-header','command-bar','search','content/grid','summary'],optionalSurfaces:['quick-filter','context','bulk-action','detail-drawer'],keyboard:['F3','Ctrl+F'],referenceScreens:['OMS-ORD-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['idle','loading','refreshing','empty','error','permission'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxSearchPanel','KbxDataGrid','KbxSummaryBar','KbxBulkActionBar'],completionChecks:['조회조건 4~6개 우선 노출','재조회 Context 유지','대량선택 의미 명시','Empty/Error 복구 Action','Drawer 상세로 목록 Context 유지']},
{code:'T02',type:'master',component:'KbxMasterPage',purpose:'기준정보 목록·상세 CRUD',requiredSurfaces:['page-header','command-bar','detail','record-lifecycle'],optionalSurfaces:['master-list','context','tabs','audit','drawer'],keyboard:['F2','F8','Ctrl+S'],referenceScreens:['ERP-MST-ITEM-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['idle','loading','refreshing','empty','error','permission','dirty','conflict'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxFormSection','KbxFormGrid','KbxRecordLifecycle','KbxAuditTrail'],completionChecks:['Desktop 기본 2-column Form','신규/수정 권한 분리','Readonly/Disabled 구분','Version 충돌 복구','변경이력 연결']},
{code:'T03',type:'transaction',component:'KbxTransactionPage',purpose:'Header+Detail 거래 등록·수정',requiredSurfaces:['page-header','command-bar','header-form','detail-grid','summary','record-lifecycle'],optionalSurfaces:['context','workflow','audit','drawer'],keyboard:['F2','F8','Ctrl+S','Enter'],referenceScreens:['OMS-ORD-002','ERP-PUR-001','ERP-INV-MOVE-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['loading','refreshing','error','permission','dirty','conflict','validation'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxFormSection','KbxFormGrid','KbxDataGrid','KbxSummaryBar','KbxRecordLifecycle'],completionChecks:['Header 2-column Form','Header→Detail Focus 흐름','Dirty 상태에서 위험 Workflow 차단','서버 재검증','Optimistic Concurrency 복구']},
{code:'T04',type:'fast-entry',component:'KbxFastEntryPage',purpose:'대량 행 입력·붙여넣기',requiredSurfaces:['page-header','command-bar','keyboard-guide','editable-grid','validation','summary'],optionalSurfaces:['context','bulk-action'],keyboard:['Enter','Tab','F2','Ctrl+V','Ctrl+D'],referenceScreens:['ERP-PRICE-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['loading','refreshing','error','permission','dirty','validation'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxDataGrid','KbxValidationSummary','KbxSummaryBar','KbxLookupDialog'],completionChecks:['다중 Cell Paste 정규화','Fill Down/행 복제','오류 셀 이동','Idempotent Bulk Save','서버 대량 Validation','저장 Command 실패 시 Context 유지·재시도']},
{code:'T05',type:'master-detail',component:'KbxMasterDetailPage',purpose:'Master 선택 Context 유지 Detail 탐색',requiredSurfaces:['page-header','search','master','detail'],optionalSurfaces:['context','bottom/history','summary','drawer'],keyboard:['F3','Enter'],referenceScreens:['ERP-INV-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['idle','loading','refreshing','empty','error','permission'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxSearchPanel','KbxDataGrid','KbxTemplateContextBar','KbxDrawer'],completionChecks:['Master 선택 Context 유지','재조회 후 선택 복원','Detail N+1 방지','Drill-down 근거 제공','Drawer로 조회 Context 유지','업무 Action 실패 시 인라인 Problem 복구']},
{code:'T06',type:'queue',component:'KbxQueuePage',purpose:'지금 처리할 업무·예외 우선 Queue',requiredSurfaces:['page-header','command-bar','work-summary','queue/content'],optionalSurfaces:['search','exceptions','context','bulk-action','detail'],keyboard:['F3','Enter'],referenceScreens:['WMS-WORK-001','COMMON-OPS-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['idle','loading','refreshing','empty','error','permission'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxExceptionSummary','KbxDataGrid','KbxBulkActionBar','KbxExceptionDetailDrawer'],completionChecks:['정상건보다 예외 우선','SLA/지연 식별','Queue 제목·전체건수·표시건수 구분','긴급/미지정 업무 빠른 이동','부분성공 결과','재처리/해결 Action','예외 처리 Audit','배정/해결 실패 시 현재 Queue Context 유지']},
{code:'T07',type:'reconcile',component:'KbxReconcilePage',purpose:'Expected/Actual/Difference 정합성 비교·해결',requiredSurfaces:['page-header','criteria/search','summary','comparison-grid'],optionalSurfaces:['filters','context','resolution-action','audit','detail'],keyboard:['F3','Enter'],referenceScreens:['COMMON-REC-001'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['idle','loading','refreshing','empty','error','permission'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxSearchPanel','KbxDataGrid','KbxSummaryBar','KbxAuditTrail'],completionChecks:['Expected/Actual/Difference 동시 제공','전체/불일치/확인중/해결 빠른 필터','행 단위 근거 Detail로 비교 Context 유지','원인/해결상태 제공','해결 Action 권한 검증','Audit 연결','해결 Command 실패 시 선택/대사 Context 유지']},
{code:'T08',type:'import',component:'KbxImportPage',purpose:'파일→매핑→검증→반영 Import',requiredSurfaces:['page-header','progress-steps','import-content','result'],optionalSurfaces:['context','job-progress','footer'],keyboard:['Enter','Esc'],referenceScreens:['OMS-ORD-003'],defaultDensity:'compact',runtimeStates:[...commonStates],stateCapabilities:['loading','refreshing','error','permission','validation','job'],utilitySurfaces:[...desktopUtilities],accessibility:[...commonA11y],coreComponents:['KbxProgressSteps','KbxExcelImport','KbxValidationSummary','KbxJobProgress'],completionChecks:['파일→매핑→검증→미리보기→반영→결과 6단계 고정','Staging 후 Commit','Preview에서 정상/오류/경고·신규/수정 근거 확인','첫/다음 오류 Focus 이동·오류행 다운로드','부분성공 정책 명시','대량 작업 Job 복구','Upload/Mapping/Commit 실패 인라인 복구']},
{code:'T09',type:'wms-mobile',component:'KbxWmsMobilePage',purpose:'Scanner/PDA 한 손 현장 작업',requiredSurfaces:['mobile-header','network-state','instruction/content','sticky-actions'],optionalSurfaces:['progress','notice','task-context'],keyboard:['Scanner Enter','Esc'],referenceScreens:['WMS-PICK-001','WMS-REC-001','WMS-PUT-001','WMS-COUNT-001'],defaultDensity:'touch',runtimeStates:[...commonStates],stateCapabilities:['loading','refreshing','error','permission','network'],utilitySurfaces:['help'],accessibility:[...commonA11y],coreComponents:['KbxBarcodeCapture','KbxNetworkIndicator','KbxWmsActionButton'],completionChecks:['Touch Density 최소 Target 준수','스캔 가능/차단/서버확인 상태 명시','최근 서버 확인 Scan과 로컬 입력 구분','서버 응답 전 성공 Feedback 금지','중복 Scan Idempotency','오프라인 정책 명시','오류 시 다음 행동 우선']},
]
export function getKbxTemplate(type:KbxTemplateManifestEntry['type']){return kbxTemplateManifest.find(entry=>entry.type===type)}