Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions windows/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
- 记录中的 injector PID 若仍存活但身份不匹配,启动与恢复会保留 state 并中止,不再归档后继续操作未知进程。
- Windows PowerShell 5.1 现在使用同目录临时备份调用 `File.Replace`,避免空备份参数被绑定为非法路径而导致现有 `config.toml` 无法更新。
- 修复 Windows PowerShell 5.1 下注入器/Node 一旦向 stderr 输出(崩溃堆栈、超时报错、Node 警告)就把启动脚本炸成 `NativeCommandError` 的问题:现在原生命令统一经 `Invoke-DreamSkinNative` 执行,verify 失败时 `verify.log` 能真正写出本次输出与退出码,回滚清除注入的路径也不再被 stderr 干扰误判。
- 图片元数据校验也统一经 `Invoke-DreamSkinNative` 执行并隔离 stderr;PowerShell 5.1 下的 Node 警告不再中断主题导入或污染 JSON,非法图片仍显示稳定的尺寸安全提示。
- 带引号键名和 CRLF 的 `[desktop]` 配置现在可以逐字节往返恢复;新版 Codex 写入的非冲突 `[desktop.*]` 子表会原样保留,仅在子表与 Dream Skin 必须管理的标量键冲突时拒绝修改。
- Codex 的启动、失败回滚和恢复重开统一通过已注册 Store 包清单中的 AppUserModelId 激活,不再直接执行可能被 WindowsApps 权限拒绝的 `ChatGPT.exe`;CDP 和自定义 profile 参数仍通过系统包激活接口传递。
- 安装与 `-RestoreBaseTheme` 现在严格按 UTF-8 读取,保留原换行风格,并以无 BOM、同目录原子替换方式写回 `config.toml`,避免中文项目名称乱码或导致 Codex 无法启动。
Expand Down
10 changes: 6 additions & 4 deletions windows/scripts/theme-windows.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,18 @@ function Ensure-DreamSkinManagedDirectory {

function Get-DreamSkinValidatedImageMetadata {
param([Parameter(Mandatory = $true)][string]$Path)
if (-not (Get-Command Get-DreamSkinNodeRuntime -ErrorAction SilentlyContinue)) {
if (-not (Get-Command Get-DreamSkinNodeRuntime -ErrorAction SilentlyContinue) -or
-not (Get-Command Invoke-DreamSkinNative -ErrorAction SilentlyContinue)) {
throw 'Node.js runtime validation is unavailable for image metadata checks.'
}
$node = Get-DreamSkinNodeRuntime
$metadataScript = Join-Path $PSScriptRoot 'image-metadata.mjs'
$output = @(& $node.Path $metadataScript '--check' ([System.IO.Path]::GetFullPath($Path)) 2>&1)
if ($LASTEXITCODE -ne 0) {
$probe = Invoke-DreamSkinNative -FilePath $node.Path -ArgumentList @(
$metadataScript, '--check', ([System.IO.Path]::GetFullPath($Path))) -DiscardStderr
if ($probe.ExitCode -ne 0) {
throw "Image metadata is invalid or exceeds the 16384px / 50MP safety limit: $Path"
}
try { $metadata = ($output -join "`n") | ConvertFrom-Json -ErrorAction Stop } catch {
try { $metadata = ($probe.Output -join "`n") | ConvertFrom-Json -ErrorAction Stop } catch {
throw "Image metadata helper returned invalid output: $Path"
}
if ($null -eq $metadata -or $null -eq $metadata.width -or $null -eq $metadata.height) {
Expand Down
25 changes: 25 additions & 0 deletions windows/tests/run-tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,8 @@ try {
'[System.IO.FileAttributes]::ReparsePoint',
'Ensure-DreamSkinManagedDirectory',
'Get-DreamSkinValidatedImageMetadata',
'Invoke-DreamSkinNative',
'-DiscardStderr',
'16384px / 50MP safety limit',
'Assert-DreamSkinImageFile -Path $temporary',
'Assert-DreamSkinImageFile -Path $imageArchive'
Expand All @@ -808,6 +810,29 @@ try {
throw 'Native stderr discard changed stdout or the real exit code.'
}

$previousNodeOptions = $env:NODE_OPTIONS
try {
$env:NODE_OPTIONS = '--import=data:text/javascript,process.stderr.write(%22dream-skin-metadata-warning%5Cn%22)'
Get-DreamSkinValidatedImageMetadata -Path (Join-Path $Root 'assets\dream-reference.jpg')
$friendlyMetadataFailure = $null
try {
Get-DreamSkinValidatedImageMetadata -Path (Join-Path $temporaryRoot 'invalid-metadata.png')
} catch {
$friendlyMetadataFailure = $_
}
if ($null -eq $friendlyMetadataFailure -or
$friendlyMetadataFailure.Exception.Message -notlike 'Image metadata is invalid or exceeds*' -or
$friendlyMetadataFailure.FullyQualifiedErrorId -like '*NativeCommandError*') {
throw 'Image metadata stderr did not preserve success output and the friendly validation error under Stop preference.'
}
} finally {
if ($null -eq $previousNodeOptions) {
Remove-Item Env:\NODE_OPTIONS -ErrorAction SilentlyContinue
} else {
$env:NODE_OPTIONS = $previousNodeOptions
}
}

$selfTest = Invoke-DreamSkinNative -FilePath $node.Path -ArgumentList @(
(Join-Path $Root 'scripts\injector.mjs'), '--self-test')
if ($selfTest.ExitCode -ne 0) { throw 'Injector CDP self-test failed.' }
Expand Down
Loading