diff --git a/text7.txt b/text7.txt index 1c19b59..99c527f 100644 --- a/text7.txt +++ b/text7.txt @@ -1425,3 +1425,72 @@ machine-file-store 或 session runtime semantics。 ```bash git status --short && git log -5 --oneline && tail -n 120 text7.txt && awk '/^[一二三四五六七八九十百]+、/ {print}' text7.txt | sort | uniq -d ``` + +二十五、2026-06-13 继续执行记录:browser machine text-store staging guard + +1. 本批目标。 + +继续 staged path guard inventory 第二十轮,处理 browser OPFS/machine text store 默认 +OPFS path 对账: + +```text +linuxcnc/machines//machine.ini +linuxcnc/machines//tool.tbl +linuxcnc/machines//linuxcnc.var +``` + +2. 已完成改动。 + +- browser 侧新增 `assertMachineTextStorePaths(...)`; +- `browser-interp` 的 `saveMachineTextFiles(...)` 返回 path map 增加默认 OPFS path + guard; +- `browser-random-toolchanger` 的 `saveMachineTextFiles(...)` 返回 path map 增加默认 + OPFS path guard; +- `browser-ini-file-session` 与 `browser-ini-override-session` 的 machine text-store + path map 增加默认 OPFS path guard; +- invalid parameter/tool INI negative session 的 machine text-store path map 增加默认 + OPFS path guard; +- 未修改 OPFS file-service、machine-file-store、path-model、machine file 内容或 + session runtime semantics。 + +涉及文件: + +```text +wasm-port/tests/browser/interp_smoke.html +``` + +3. 已完成的目标验证。 + +```bash +git diff --check +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh +``` + +4. 本批剩余建议验证。 + +```bash +wasm-port/tools/verify_vendor_sync.sh +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +wasm-port/tests/host/verify_host_smokes.sh +``` + +如果通过,提交建议: + +```text +Guard browser machine text-store staging +``` + +5. 下一步工作建议。 + +继续 staged path guard inventory 第二十一轮,优先扫描 OPFS gcode program storage +边界,例如 `saveGcodeProgram(...)` / `loadGcodeProgram(...)` 与 +`linuxcnc/gcode/` path 对账;仍只加 filesystem/OPFS path guard,不改变 +gcode storage、file-service 或 interpreter runtime semantics。 + +下一轮第一条命令仍保持: + +```bash +git status --short && git log -5 --oneline && tail -n 120 text7.txt && awk '/^[一二三四五六七八九十百]+、/ {print}' text7.txt | sort | uniq -d +``` diff --git a/wasm-port/tests/browser/interp_smoke.html b/wasm-port/tests/browser/interp_smoke.html index 483dba2..72ef090 100644 --- a/wasm-port/tests/browser/interp_smoke.html +++ b/wasm-port/tests/browser/interp_smoke.html @@ -4478,6 +4478,19 @@ } } + function assertMachineTextStorePaths(label, paths, machineId) { + const expectedPaths = { + ini: `linuxcnc/machines/${machineId}/machine.ini`, + toolTable: `linuxcnc/machines/${machineId}/tool.tbl`, + parameters: `linuxcnc/machines/${machineId}/linuxcnc.var`, + }; + for (const [name, expectedPath] of Object.entries(expectedPaths)) { + if (paths[name] !== expectedPath) { + throw new Error(`${label}: unexpected ${name} OPFS path ${paths[name]}`); + } + } + } + function generatedToolTablePath(wasmPath, expectedWasmPath) { if (wasmPath !== expectedWasmPath) { throw new Error(`browser_tool_table_fixture_${expectedWasmPath}: path drift`); @@ -8981,7 +8994,7 @@ ].join("\n"), ); - await saveMachineTextFiles("browser-interp", { + const browserInterpTextPaths = await saveMachineTextFiles("browser-interp", { ini: "[EMC]\nMACHINE = browser-interp\n", toolTable: "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser finish tool\n", parameters: [ @@ -8994,6 +9007,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_machine_text_files_staging", + browserInterpTextPaths, + "browser-interp", + ); const loadedSession = await loadMachineSessionFromOpfs( interp, "browser-interp", @@ -9137,7 +9155,7 @@ ].join("\n"), ); - await saveMachineTextFiles("browser-random-toolchanger", { + const browserRandomTextPaths = await saveMachineTextFiles("browser-random-toolchanger", { ini: [ "[EMC]", "MACHINE = browser-random-toolchanger", @@ -9160,6 +9178,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_random_machine_text_files_staging", + browserRandomTextPaths, + "browser-random-toolchanger", + ); const loadedRandomSession = await loadMachineSessionFromOpfs( interp, "browser-random-toolchanger", @@ -9243,7 +9266,7 @@ ].join("\n"), ); - await saveMachineTextFiles("browser-ini-file-session", { + const browserIniFileTextPaths = await saveMachineTextFiles("browser-ini-file-session", { ini: [ "[EMC]", "MACHINE = browser-ini-file-session", @@ -9256,6 +9279,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_ini_named_machine_text_files_staging", + browserIniFileTextPaths, + "browser-ini-file-session", + ); await saveTextFile( "linuxcnc/machines/browser-ini-file-session/browser-custom.var", [ @@ -9410,7 +9438,7 @@ ].join("\n"), ); - await saveMachineTextFiles("browser-ini-override-session", { + const browserIniOverrideTextPaths = await saveMachineTextFiles("browser-ini-override-session", { ini: [ "[EMC]", "MACHINE = browser-ini-override-session", @@ -9423,6 +9451,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_ini_override_machine_text_files_staging", + browserIniOverrideTextPaths, + "browser-ini-override-session", + ); await saveTextFile( "linuxcnc/machines/browser-ini-override-session/browser-explicit.var", [ @@ -9579,7 +9612,7 @@ ].join("\n"), ); - await saveMachineTextFiles("browser-invalid-param-file-session", { + const invalidParamFileTextPaths = await saveMachineTextFiles("browser-invalid-param-file-session", { ini: [ "[EMC]", "MACHINE = browser-invalid-param-file-session", @@ -9589,6 +9622,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_invalid_param_machine_text_files_staging", + invalidParamFileTextPaths, + "browser-invalid-param-file-session", + ); const invalidParamFileSessionOptions = { iniSdk: ini, iniWasmPath: "/work/browser-invalid-param-file-session.ini", @@ -9612,7 +9650,7 @@ /Invalid parameter filename/, ); - await saveMachineTextFiles("browser-invalid-tool-file-session", { + const invalidToolFileTextPaths = await saveMachineTextFiles("browser-invalid-tool-file-session", { ini: [ "[EMC]", "MACHINE = browser-invalid-tool-file-session", @@ -9622,6 +9660,11 @@ "", ].join("\n"), }); + assertMachineTextStorePaths( + "opfs_save_invalid_tool_machine_text_files_staging", + invalidToolFileTextPaths, + "browser-invalid-tool-file-session", + ); const invalidToolFileSessionOptions = { iniSdk: ini, iniWasmPath: "/work/browser-invalid-tool-file-session.ini",