Files
KArtSell.Aegis/docs/Design/kbx-foundation-v52-fe-operational-navigation-screen-anatomy/scripts/validate-fe-anatomy-v52.mjs
T
kjh2064 c41e5063b7 chore: remove kbx-foundation-v36 reference (superseded by v4 implementation)
Removed entire kbx-foundation-v36 directory as it's been replaced by
the new KBX Foundation v4 patterns implemented in this session:
- Registry-driven screen definitions
- Density-aware UI adapter components
- Feature module templates (ShadowRun, Models)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-12 01:39:58 +09:00

61 lines
5.0 KiB
JavaScript

import fs from 'node:fs'
const read = (file) => fs.readFileSync(file, 'utf8')
const expect = (condition, message) => {
if (!condition) {
console.error(`FAIL: ${message}`)
process.exit(1)
}
console.log(`PASS: ${message}`)
}
const home = read('packages/kbx-ui/src/shell/KbxHomePage.vue')
expect(home.includes('moduleSummaries'), 'home derives module-level navigation summary from allowed navigation entries')
expect(home.includes('kbx-home__module-rail'), 'home exposes an explicit module work launcher rail')
expect(home.includes('selectModule(module:string)'), 'home module launcher uses one controlled navigation path')
expect(home.includes('id="kbx-home-explorer"'), 'home work explorer has a stable focus/scroll target')
expect(home.includes('전체 업무 보기'), 'filtered home can return to the full work explorer without hidden navigation')
expect(home.includes('favoriteCount') && home.includes('openCount'), 'home module rail exposes favorite/open work context instead of decorative cards')
const master = read('packages/kbx-ui/src/components/KbxMasterPage.vue')
expect(master.includes("import KbxSectionHeader"), 'T02 master template uses the standard section heading component')
expect(master.includes('listTitle?:string') && master.includes('detailTitle?:string'), 'T02 exposes list/detail anatomy without custom page markup')
expect(master.includes('kbx-master-page__list-body') && master.includes('kbx-master-page__detail-body'), 'T02 separates pane heading from pane work body')
const transaction = read('packages/kbx-ui/src/components/KbxTransactionPage.vue')
expect(transaction.includes('headerTitle?:string') && transaction.includes('detailTitle?:string'), 'T03 exposes explicit header/detail work anatomy')
expect(transaction.includes('detailCount?:number'), 'T03 exposes detail row context in the template contract')
expect(transaction.includes('kbx-transaction-page__header-body') && transaction.includes('kbx-transaction-page__detail-body'), 'T03 preserves distinct transaction work surfaces')
const queue = read('packages/kbx-ui/src/components/KbxQueuePage.vue')
expect(queue.includes('queueTitle?:string') && queue.includes('queueCount?:number'), 'T06 queue template exposes actionable queue anatomy')
expect(queue.includes('kbx-queue-page__content-body'), 'T06 separates queue heading from queue result state')
const reconcile = read('packages/kbx-ui/src/components/KbxReconcilePage.vue')
expect(reconcile.includes('comparisonTitle?:string') && reconcile.includes('comparisonCount?:number'), 'T07 reconcile template exposes comparison anatomy and result count')
expect(reconcile.includes('kbx-reconcile-content__body'), 'T07 separates mismatch context from comparison work body')
const goldenOrder = read('apps/web/src/modules/oms/orders/register/OrderRegisterPage.vue')
const goldenItem = read('apps/web/src/modules/erp/items/ItemMasterPage.vue')
const queuePage = read('apps/web/src/modules/wms/work/WmsWorkPage.vue')
const reconcilePage = read('apps/web/src/modules/common/reconcile/ReconcilePage.vue')
expect(goldenOrder.includes('header-title="주문 정보"') && goldenOrder.includes('detail-title="주문 상품"'), 'OMS order transaction applies the T03 anatomy contract')
expect(goldenItem.includes('list-title="품목 목록"') && goldenItem.includes('detail-title="품목 상세"'), 'ERP item master applies the T02 anatomy contract')
expect(queuePage.includes('queue-title="현재 작업 Queue"'), 'WMS work page names its actionable queue surface')
expect(reconcilePage.includes('comparison-title="OMS ↔ WMS 대사"'), 'reconcile page names its comparison surface')
const referenceHtml = read('apps/web/fe-reference/index.html')
const referenceJs = read('apps/web/fe-reference/kbx-fe.js')
const referenceCss = read('apps/web/fe-reference/kbx-fe.css')
expect(referenceHtml.includes('FE Reference Lab v52'), 'static HTML reference identifies the v52 FE operational navigation build')
expect(referenceHtml.includes("connect-src 'self'"), 'static HTML reference CSP restricts network connections to same origin')
expect(referenceHtml.includes("frame-src 'none'") && referenceHtml.includes("worker-src 'none'"), 'static HTML reference explicitly closes unused frame/worker execution surfaces')
expect(referenceJs.includes('class="home-module-rail"'), 'static JavaScript reference mirrors the module work launcher rail')
expect(referenceJs.includes('data-home-module="ALL"'), 'static JavaScript reference offers an explicit all-work reset target')
expect(referenceJs.includes("scrollIntoView({block:'start',behavior:'smooth'})"), 'static module navigation lands on the work explorer instead of silently filtering')
expect(referenceCss.includes('.home-module-rail'), 'static reference has dedicated module launcher presentation')
expect(referenceCss.includes('.home-module-rail button[aria-pressed="true"]'), 'module launcher exposes its active state accessibly')
expect(referenceCss.includes('@media(forced-colors:active){.home-module-rail'), 'module launcher retains an active cue in forced-colors mode')
console.log('PASS: FE operational navigation and screen anatomy v52 contract')