/** * 票 102 静态闸门(一):顶栏三个诊断读数下屏,且不留半截改动。 * * 接缝:外壳单文件源码契约 —— 模板节点 / import / 死状态 / CSS 类名必须同时消失。 * 只删模板会留下死样式与死 import,只删样式会留下「有节点没画法」的裸标签。 * 可传源码路径复核历史版本(例如提交时的暂存副本)。 */ import assert from 'node:assert/strict' import fs from 'node:fs' const source = process.argv[2] ? fs.readFileSync(process.argv[2], 'utf8') : fs.readFileSync(new URL('../src/modules/cockpit/CockpitShell.vue', import.meta.url), 'utf8') // ---- 三个读数:模板、样式、数据来源一起下屏 ---- assert.ok(!source.includes('只读视图'), '「只读视图」必须下屏') assert.ok(!source.includes('配置就绪'), '「配置就绪 · 数据源」必须下屏') assert.ok(!source.includes('cockpit-shell__config'), '配置读数容器(模板/样式)不得残留') assert.ok(!source.includes('configStatusView'), '配置读数展示层不得残留') assert.ok(!source.includes('StatusTag'), 'StatusTag 只服务配置读数,必须一并移除') assert.ok(!source.includes('cockpit-shell__meta'), '「当前模式」读数不得残留') // ---- 配置判定本身仍在用,不能顺手删 ---- assert.ok(source.includes('configState.value'), '配置判定仍被地图配置/降级说明使用,不能删') // 反方向也要守:读数的「载入前不闪标签」闸门随读数一起变成死状态。 assert.ok(!source.includes('configLoaded'), '拉取态闸门随读数下屏,不得留下无人读的状态') // ---- 一级模式导航语义不动 ---- assert.ok(source.includes('aria-label="一级模式"'), '一级模式导航保持原样') assert.ok(source.includes('v-for="item in MODES"'), '一级模式导航保持原样') assert.ok(source.includes('@click="uiStore.setMode(item)"'), '一级模式导航保持原样') console.log('t102-topbar-menu: 13/13')