chore: prepare v0.6.0 release

This commit is contained in:
kuddev committed 2026-07-19 18:55:42 +08:00
1 parent 9029b5b5c1
commit 6ca0f8b8aa
15 files changed
+420 -32

No files matched your search

+5 -1
View File
@@ -4,7 +4,9 @@ Every release entry is provided in English and Simplified Chinese.
每个版本条目均同时提供英文和简体中文说明。
## 0.6.0 - Unreleased / 未发布
## Unreleased / 未发布
## 0.6.0 - 2026-07-19
### English
@@ -12,6 +14,7 @@ Every release entry is provided in English and Simplified Chinese.
- **Native math formula support** — Nebula can now display inline $...$ and display $$...$$ formulas directly in Markdown. Fractions, roots, scripts, limits, matrices, scalable brackets, Greek letters, common operators, and Unicode text are supported. Formulas are rendered locally in Rust with the bundled math font, without a web component, formula images, or an external TeX program.
- **Math formula test document** — the README now includes a verified screenshot, and `docs/math-rendering-test.md` provides a reusable test page covering common symbols, complex formulas, long formulas, blank rows, Unicode text, and dollar-fence boundaries.
- **Windows installer support** — Nebula now provides a guided per-user installer with English and Simplified Chinese interfaces, optional font installation, desktop and startup shortcuts, and structured cleanup during uninstall.
- **File-drawer directory actions** — the Files drawer can move to its parent directory, open a new terminal at the displayed directory, and drag a file or folder into the terminal to insert its safely quoted full path without executing it.
- **Frequent-directory workflows** — Nebula remembers directories that the shell actually entered. Frequently used locations are promoted in path completion and inline suggestions, and the command palette can open a new terminal directly in a visited directory.
@@ -41,6 +44,7 @@ Every release entry is provided in English and Simplified Chinese.
- **Markdown 数学公式支持** — Nebula 现在能够直接显示行内 $...$ 和块级 $$...$$ 公式,支持分数、根式、上下标、极限、矩阵、伸缩括号、希腊字母、常用运算符和 Unicode 文字。公式由 Rust 和内置数学字体在本地完成显示,不需要网页组件、公式图片或外部 TeX 程序。
- **数学公式测试文档** — README 已加入经过验证的效果截图,`docs/math-rendering-test.md` 提供可重复使用的测试页面,覆盖常用符号、复杂公式、长公式、空行、Unicode 文字和美元围栏边界。
- **Windows 安装程序支持** — Nebula 现在提供中英文安装向导,支持按当前用户安装、可选字体安装、桌面与开机启动快捷方式,并在卸载时完成应用配置清理。
- **文件目录快捷操作支持** — 文件抽屉可以返回上级目录、在当前显示目录中新建终端,也可以把文件或目录拖入终端,插入经过安全引用的完整路径而不会自动执行。
- **常用目录支持** — Nebula 会记录 Shell 实际进入过的目录,让常用位置优先出现在路径补全和行内建议中;也可以从命令面板直接在访问过的目录中新建终端。
Generated
+6 -6
View File
@@ -2140,7 +2140,7 @@ dependencies = [
[[package]]
name = "nebula"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"ab_glyph_rasterizer",
"ahash",
@@ -2200,7 +2200,7 @@ dependencies = [
[[package]]
name = "nebula-completions"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"lscolors",
"nu-ansi-term",
@@ -2211,7 +2211,7 @@ dependencies = [
[[package]]
name = "nebula_config"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"log",
"nebula_config_derive",
@@ -2221,7 +2221,7 @@ dependencies = [
[[package]]
name = "nebula_config_derive"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"log",
"nebula_config",
@@ -2234,11 +2234,11 @@ dependencies = [
[[package]]
name = "nebula_hook"
version = "0.5.0"
version = "0.6.0"
[[package]]
name = "nebula_terminal"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"base64",
"bitflags 2.13.0",
+2 -2
View File
@@ -196,7 +196,7 @@ experience that works without extra setup.
> icon set. (Licensed under SIL OFL 1.1.)
**Release build (recommended)** — download
`NebulaTerminal-v0.5.0-windows-x64.zip` from
`NebulaTerminal-v0.6.0-windows-x64.zip` from
[Releases](https://github.com/Kuddev/nebula/releases), unzip
anywhere, install `fonts/MapleMonoNormal-NF-CN-Regular.ttf`, then run
`nebula.exe`. Keep the extracted folders in place: AI and ConPTY helpers live
@@ -378,7 +378,7 @@ Nebula 是一款 Windows 上的终端模拟器,以 Rust 编写,构建在 GPU
**Release 包(推荐)** — 从
[Releases](https://github.com/Kuddev/nebula/releases) 下载
`NebulaTerminal-v0.5.0-windows-x64.zip`,解压到任意目录,先安装
`NebulaTerminal-v0.6.0-windows-x64.zip`,解压到任意目录,先安装
`fonts/MapleMonoNormal-NF-CN-Regular.ttf`,再运行 `nebula.exe`。请保持解压后的
目录结构不变:AI 通知与 ConPTY 组件位于 `runtime/`,字体、文档和许可说明分别
位于 `fonts/`、`docs/` 与 `licenses/`。
+65
View File
@@ -0,0 +1,65 @@
# Nebula Terminal 0.6.0
## English
Nebula Terminal 0.6.0 adds native Markdown mathematics, faster directory workflows, a guided Windows installer, and important split-pane input fixes.
### Added
- Added native `$...$` and `$$...$$` mathematics to Markdown documents, including fractions, roots, scripts, limits, matrices, scalable brackets, Greek letters, common operators, and Unicode text.
- Added a reusable math test document and a verified README screenshot for checking common symbols, complex formulas, long formulas, blank rows, and dollar-fence boundaries.
- Added a guided Windows installer with English and Simplified Chinese interfaces, optional font installation, desktop and startup shortcuts, and structured cleanup during uninstall.
- Added parent navigation and "new terminal here" actions to the Files drawer. Files and folders can also be dragged into a terminal to insert their safely quoted full path.
- Added frequent-directory history. Visited locations are promoted in completion and inline suggestions, and can be opened directly from the command palette.
### Fixed
- Fixed Markdown paragraphs, Chinese text, long unbroken content, failed formula source, and oversized formulas extending beyond the reading column.
- Fixed display formulas containing blank rows, and limited formula recognition to paired `$...$` and `$$...$$` ranges so bare TeX and quoted code remain ordinary text.
- Fixed disconnected radical bars, incorrect arrow conversion, uneven Markdown heading weight, and unclear edges on small mathematical symbols.
- Fixed right-click paste and `Ctrl+V` sending text to the wrong split pane after focus or pointer movement.
- Fixed Enter passing through the multiline-paste confirmation into the terminal behind it or a neighboring split.
- Fixed keyboard, pointer, and scrolling input from a split Markdown document reaching another terminal pane.
- Fixed numeric keypad Enter triggering paste behavior instead of submitting a command.
- Fixed SFTP opening against the wrong SSH session from a split pane.
- Fixed Nebula replacing existing PowerShell or Bash prompt hooks and disturbing command or pipeline status.
- Fixed the default-shell picker opening a terminal instead of saving the selected default.
- Fixed automatic appearance following reusing a stale light window theme when the system was already dark.
- Fixed integration removal stopping early when one user configuration was damaged.
### Improved
- Improved large Markdown math document loading and scrolling by processing visible content, reusing formulas, and placing limits on unusually complex input so memory use remains stable.
- Improved SFTP navigation and upload workflows with parent navigation, drag-and-drop upload, background actions, and grouped multi-file transfers.
## 中文
Nebula Terminal 0.6.0 新增原生 Markdown 数学公式、更快捷的目录操作和 Windows 安装向导,并集中修复分屏输入路由问题。
### 新增
- 新增 Markdown 原生数学公式支持,可以显示 `$...$` 和 `$$...$$` 公式,并支持分数、根式、上下标、极限、矩阵、伸缩括号、希腊字母、常用运算符和 Unicode 文字。
- 新增可重复使用的数学公式测试文档和 README 效果截图,方便检查常用符号、复杂公式、长公式、空行与美元围栏边界。
- 新增 Windows 安装程序,提供中英文安装向导、可选字体安装、桌面与开机启动快捷方式,并在卸载时完成应用配置清理。
- 新增文件抽屉返回上级目录和“在此处新建终端”操作;文件与目录也可以拖入终端并插入经过安全引用的完整路径。
- 新增常用目录记录,让访问过的位置优先出现在补全和行内建议中,也可以从命令面板直接打开。
### 修复
- 修复 Markdown 段落、中文、连续长文本、解析失败的公式源码和过宽公式超出阅读区域的问题。
- 修复块级公式空行问题,并把公式识别限定为成对的 `$...$` 和 `$$...$$`,裸露 TeX 和引用代码继续按普通文本显示。
- 修复根号横线断开、箭头转换错误、Markdown 标题粗细不一和小字号数学符号不清晰的问题。
- 修复右键粘贴和 `Ctrl+V` 在焦点或鼠标移动后把内容发送到错误分屏的问题。
- 修复多行粘贴确认框显示时 Enter 穿透到后方终端或相邻分屏的问题。
- 修复分屏 Markdown 文档的键盘、鼠标和滚动操作穿透到其他终端的问题。
- 修复数字小键盘 Enter 触发粘贴而不是提交命令的问题。
- 修复从 SSH 分屏打开 SFTP 时连接到错误会话的问题。
- 修复 Nebula 覆盖已有 PowerShell 或 Bash 提示符 Hook,并影响命令退出状态或管道状态的问题。
- 修复默认 Shell 选择器把所选 Shell 直接打开而不是保存的问题。
- 修复系统已经处于深色时,自动跟随仍沿用旧浅色窗口主题的问题。
- 修复移除集成时因某一项用户配置损坏而提前停止的问题。
### 改进
- 大型 Markdown 数学文档加载改进:只处理可见内容、复用重复公式并限制异常复杂输入,让文档打开和滚动保持流畅,内存占用保持稳定。
- SFTP 操作改进:支持返回上级目录、拖放上传、空白区域快捷操作和多文件合并传输。
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "nebula-completions"
version = "0.5.0"
version = "0.6.0"
edition.workspace = true
[features]
+7 -7
View File
@@ -1,11 +1,11 @@
[package]
name = "nebula"
version = "0.5.0"
version = "0.6.0"
license = "GPL-3.0-or-later"
description = "Nebula Terminal — a premium GPU-accelerated terminal emulator"
readme = "README.md"
homepage = "https://github.com/Kuddev/nebulaTerminal"
repository = "https://github.com/Kuddev/nebulaTerminal"
homepage = "https://github.com/Kuddev/nebula"
repository = "https://github.com/Kuddev/nebula"
edition.workspace = true
rust-version.workspace = true
@@ -15,19 +15,19 @@ path = "src/main.rs"
[dependencies.nebula_terminal]
path = "../nebula_terminal"
version = "0.5.0"
version = "0.6.0"
[dependencies.nebula_config_derive]
path = "../nebula_config_derive"
version = "0.5.0"
version = "0.6.0"
[dependencies.nebula_config]
path = "../nebula_config"
version = "0.5.0"
version = "0.6.0"
[dependencies.nebula-completions]
path = "../nebula-completions"
version = "0.5.0"
version = "0.6.0"
[dependencies]
ahash = { version = "0.8.6", features = ["no-rng"] }
+4 -4
View File
@@ -1,10 +1,10 @@
[package]
name = "nebula_config"
version = "0.5.0"
version = "0.6.0"
license = "GPL-3.0-or-later"
description = "Nebula configuration abstractions"
homepage = "https://github.com/Kuddev/nebulaTerminal"
repository = "https://github.com/Kuddev/nebulaTerminal"
homepage = "https://github.com/Kuddev/nebula"
repository = "https://github.com/Kuddev/nebula"
edition.workspace = true
rust-version.workspace = true
@@ -14,5 +14,5 @@ serde = "1.0.163"
toml.workspace = true
[dev-dependencies]
nebula_config_derive = { version = "0.5.0", path = "../nebula_config_derive" }
nebula_config_derive = { version = "0.6.0", path = "../nebula_config_derive" }
serde = { version = "1.0.163", features = ["derive"] }
+4 -4
View File
@@ -1,10 +1,10 @@
[package]
name = "nebula_config_derive"
version = "0.5.0"
version = "0.6.0"
license = "GPL-3.0-or-later"
description = "Failure resistant deserialization derive"
homepage = "https://github.com/Kuddev/nebulaTerminal"
repository = "https://github.com/Kuddev/nebulaTerminal"
homepage = "https://github.com/Kuddev/nebula"
repository = "https://github.com/Kuddev/nebula"
edition.workspace = true
rust-version.workspace = true
@@ -18,7 +18,7 @@ syn = { version = "2.0.16", features = ["derive", "parsing", "proc-macro", "prin
[dev-dependencies.nebula_config]
path = "../nebula_config"
version = "0.5.0"
version = "0.6.0"
[dev-dependencies]
log = "0.4.11"
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "nebula_hook"
version = "0.5.0"
version = "0.6.0"
license = "GPL-3.0-or-later"
description = "Tiny bridge: AI-CLI lifecycle hooks -> Nebula named pipe"
publish = false
+3 -3
View File
@@ -1,11 +1,11 @@
[package]
name = "nebula_terminal"
version = "0.5.0"
version = "0.6.0"
license = "GPL-3.0-or-later"
description = "Nebula terminal emulation core"
readme = "../README.md"
homepage = "https://github.com/Kuddev/nebulaTerminal"
repository = "https://github.com/Kuddev/nebulaTerminal"
homepage = "https://github.com/Kuddev/nebula"
repository = "https://github.com/Kuddev/nebula"
edition.workspace = true
rust-version.workspace = true
+169
View File
@@ -0,0 +1,169 @@
[CmdletBinding()]
param(
[ValidatePattern('^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$')]
[string] $Version,
[ValidateSet('debug', 'release')]
[string] $Configuration = 'release',
[switch] $SkipBuild,
[switch] $Force,
[switch] $ValidateOnly,
[string] $OutputDirectory,
[string] $InnoCompiler
)
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
$repo = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path
$manifestPath = Join-Path $repo 'nebula_app\Cargo.toml'
$installerScript = Join-Path $PSScriptRoot 'installer.iss'
$translationPath = Join-Path $repo 'target\installer-tools\ChineseSimplified.isl'
$translationUrl = 'https://raw.githubusercontent.com/jrsoftware/issrc/c495623a97376d524f298b1b160e8fd612375c62/Files/Languages/ChineseSimplified.isl'
$translationSha256 = '6753BE2C5E2740D859900FD902824DB2EC568DA5C5B52486524C9762D778B0B0'
if ([string]::IsNullOrWhiteSpace($Version)) {
$cargoManifest = Get-Content -LiteralPath $manifestPath -Raw -Encoding UTF8
$match = [regex]::Match($cargoManifest, '(?m)^version\s*=\s*"(?<version>[^"]+)"\s*$')
if (-not $match.Success) {
throw "Unable to read the package version from $manifestPath"
}
$Version = $match.Groups['version'].Value
}
if ($Version -notmatch '^(?<major>[0-9]+)\.(?<minor>[0-9]+)\.(?<patch>[0-9]+)') {
throw "Version must begin with three numeric components: $Version"
}
$numericVersion = "$($Matches.major).$($Matches.minor).$($Matches.patch).0"
if ([string]::IsNullOrWhiteSpace($OutputDirectory)) {
$OutputDirectory = Join-Path $repo 'dist'
} elseif (-not [System.IO.Path]::IsPathRooted($OutputDirectory)) {
$OutputDirectory = Join-Path $repo $OutputDirectory
}
$outputRoot = [System.IO.Path]::GetFullPath($OutputDirectory)
$targetRoot = Join-Path $repo "target\$Configuration"
$setupPath = Join-Path $outputRoot "NebulaTerminal-$Version-windows-x64-setup.exe"
$requiredFiles = @(
(Join-Path $targetRoot 'nebula.exe'),
(Join-Path $targetRoot 'nebula-hook.exe'),
(Join-Path $targetRoot 'conpty.dll'),
(Join-Path $targetRoot 'OpenConsole.exe'),
(Join-Path $repo 'README.md'),
(Join-Path $repo 'CHANGELOG.md'),
(Join-Path $repo 'INSTALL.md'),
(Join-Path $repo 'docs\lua-configuration.md'),
(Join-Path $repo 'assets\fonts\MapleMonoNormal-NF-CN-Regular.ttf'),
(Join-Path $repo 'LICENSE'),
(Join-Path $repo 'licenses\LICENSE-LUA'),
(Join-Path $repo 'licenses\LICENSE-MLUA'),
(Join-Path $repo 'THIRD-PARTY-NOTICES')
)
if (-not (Test-Path -LiteralPath $installerScript -PathType Leaf)) {
throw "Installer definition is missing: $installerScript"
}
if (-not $SkipBuild) {
Push-Location $repo
try {
$cargoArgs = @('build', '--workspace')
if ($Configuration -eq 'release') {
$cargoArgs += '--release'
}
& cargo @cargoArgs
if ($LASTEXITCODE -ne 0) {
throw "Cargo build failed with exit code $LASTEXITCODE"
}
} finally {
Pop-Location
}
}
$missing = @($requiredFiles | Where-Object { -not (Test-Path -LiteralPath $_ -PathType Leaf) })
if ($missing.Count -ne 0) {
throw "Required installer files are missing:`n$($missing -join "`n")"
}
if ($ValidateOnly) {
[PSCustomObject]@{
InstallerScript = $installerScript
Version = $Version
Configuration = $Configuration
Files = $requiredFiles.Count
} | Format-List
return
}
if (Test-Path -LiteralPath $setupPath) {
if (-not $Force) {
throw "Installer already exists: $setupPath (pass -Force to replace it)"
}
Remove-Item -LiteralPath $setupPath -Force
}
New-Item -ItemType Directory -Path $outputRoot -Force | Out-Null
if ([string]::IsNullOrWhiteSpace($InnoCompiler)) {
$candidates = @(
$env:ISCC_PATH,
(Join-Path $env:LOCALAPPDATA 'Programs\Inno Setup 6\ISCC.exe'),
(Join-Path $env:ProgramFiles 'Inno Setup 6\ISCC.exe'),
(Join-Path ${env:ProgramFiles(x86)} 'Inno Setup 6\ISCC.exe')
) | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
$InnoCompiler = $candidates | Where-Object {
Test-Path -LiteralPath $_ -PathType Leaf
} | Select-Object -First 1
}
if ([string]::IsNullOrWhiteSpace($InnoCompiler) -or
-not (Test-Path -LiteralPath $InnoCompiler -PathType Leaf)) {
throw 'ISCC.exe was not found. Install Inno Setup 6 or pass -InnoCompiler / set ISCC_PATH.'
}
# Inno 的基础安装不内置第三方翻译。固定提交与哈希可以保留中文向导,
# 同时避免发布构建悄悄接受上游后来被替换的内容。
$translationValid = $false
if (Test-Path -LiteralPath $translationPath -PathType Leaf) {
$actualTranslationHash =
(Get-FileHash -LiteralPath $translationPath -Algorithm SHA256).Hash
$translationValid = $actualTranslationHash -eq $translationSha256
}
if (-not $translationValid) {
$translationDirectory = Split-Path -Parent $translationPath
New-Item -ItemType Directory -Path $translationDirectory -Force | Out-Null
$temporaryTranslation = "$translationPath.$PID.tmp"
try {
Invoke-WebRequest -UseBasicParsing -Uri $translationUrl -OutFile $temporaryTranslation
$actualHash = (Get-FileHash -LiteralPath $temporaryTranslation -Algorithm SHA256).Hash
if ($actualHash -ne $translationSha256) {
throw "Chinese translation hash mismatch: expected $translationSha256, got $actualHash"
}
Move-Item -LiteralPath $temporaryTranslation -Destination $translationPath -Force
} finally {
if (Test-Path -LiteralPath $temporaryTranslation) {
Remove-Item -LiteralPath $temporaryTranslation -Force
}
}
}
Push-Location $PSScriptRoot
try {
& $InnoCompiler "/DAppVersion=$Version" "/DNumericVersion=$numericVersion" "/DConfiguration=$Configuration" "/O$outputRoot" $installerScript
if ($LASTEXITCODE -ne 0) {
throw "Inno Setup compilation failed with exit code $LASTEXITCODE"
}
} finally {
Pop-Location
}
if (-not (Test-Path -LiteralPath $setupPath -PathType Leaf)) {
throw "Inno Setup did not create the expected installer: $setupPath"
}
$setup = Get-Item -LiteralPath $setupPath
[PSCustomObject]@{
Path = $setup.FullName
Size = $setup.Length
SHA256 = (Get-FileHash -LiteralPath $setupPath -Algorithm SHA256).Hash
} | Format-List
+103
View File
@@ -0,0 +1,103 @@
#ifndef AppVersion
#define AppVersion "0.6.0"
#endif
#ifndef NumericVersion
#define NumericVersion "0.6.0.0"
#endif
#ifndef Configuration
#define Configuration "release"
#endif
#define RepoRoot ".."
#define BuildRoot RepoRoot + "\target\" + Configuration
[Setup]
AppId={{61022144-7D0A-4E54-94F2-C329A8F58656}
AppName=Nebula Terminal
AppVersion={#AppVersion}
AppVerName=Nebula Terminal {#AppVersion}
AppPublisher=Kuddev
AppPublisherURL=https://github.com/Kuddev/nebula
AppSupportURL=https://github.com/Kuddev/nebula/issues
AppUpdatesURL=https://github.com/Kuddev/nebula/releases
VersionInfoVersion={#NumericVersion}
VersionInfoTextVersion={#AppVersion}
VersionInfoCompany=Kuddev
VersionInfoDescription=Nebula Terminal Installer
VersionInfoProductName=Nebula Terminal
VersionInfoProductVersion={#NumericVersion}
VersionInfoProductTextVersion={#AppVersion}
DefaultDirName={localappdata}\Programs\Nebula Terminal
DefaultGroupName=Nebula Terminal
DisableProgramGroupPage=yes
DisableWelcomePage=no
DisableDirPage=no
DisableReadyPage=no
PrivilegesRequired=lowest
ArchitecturesAllowed=x64compatible
MinVersion=10.0.17763
LicenseFile={#RepoRoot}\LICENSE
SetupIconFile={#RepoRoot}\nebula_app\windows\nebula.ico
UninstallDisplayIcon={app}\nebula.exe
OutputDir={#RepoRoot}\dist
OutputBaseFilename=NebulaTerminal-{#AppVersion}-windows-x64-setup
Compression=lzma2/max
SolidCompression=yes
WizardStyle=modern
CloseApplications=yes
RestartApplications=no
RestartIfNeededByRun=no
SetupLogging=yes
ShowLanguageDialog=auto
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "chinesesimplified"; MessagesFile: "{#RepoRoot}\target\installer-tools\ChineseSimplified.isl"
[CustomMessages]
english.DesktopIcon=Create a desktop shortcut
english.AutoStart=Start Nebula Terminal when I sign in to Windows
english.InstallFont=Install Maple Mono font for the current user
english.LaunchProgram=Launch Nebula Terminal
english.UninstallProgram=Uninstall Nebula Terminal
chinesesimplified.DesktopIcon=创建桌面快捷方式
chinesesimplified.AutoStart=登录 Windows 后启动 Nebula Terminal
chinesesimplified.InstallFont=为当前用户安装 Maple Mono 字体
chinesesimplified.LaunchProgram=启动 Nebula Terminal
chinesesimplified.UninstallProgram=卸载 Nebula Terminal
[Tasks]
Name: "installfont"; Description: "{cm:InstallFont}"
Name: "desktopicon"; Description: "{cm:DesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "autostart"; Description: "{cm:AutoStart}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "{#BuildRoot}\nebula.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#RepoRoot}\README.md"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BuildRoot}\nebula-hook.exe"; DestDir: "{app}\runtime"; Flags: ignoreversion
Source: "{#BuildRoot}\conpty.dll"; DestDir: "{app}\runtime"; Flags: ignoreversion
Source: "{#BuildRoot}\OpenConsole.exe"; DestDir: "{app}\runtime"; Flags: ignoreversion
Source: "{#RepoRoot}\assets\fonts\MapleMonoNormal-NF-CN-Regular.ttf"; DestDir: "{app}\fonts"; Flags: ignoreversion
Source: "{#RepoRoot}\assets\fonts\MapleMonoNormal-NF-CN-Regular.ttf"; DestDir: "{autofonts}"; FontInstall: "Maple Mono Normal NF CN"; Tasks: installfont; Flags: onlyifdoesntexist uninsneveruninstall
Source: "{#RepoRoot}\CHANGELOG.md"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{#RepoRoot}\INSTALL.md"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{#RepoRoot}\docs\lua-configuration.md"; DestDir: "{app}\docs"; Flags: ignoreversion
Source: "{#RepoRoot}\LICENSE"; DestDir: "{app}\licenses"; Flags: ignoreversion
Source: "{#RepoRoot}\licenses\LICENSE-LUA"; DestDir: "{app}\licenses"; Flags: ignoreversion
Source: "{#RepoRoot}\licenses\LICENSE-MLUA"; DestDir: "{app}\licenses"; Flags: ignoreversion
Source: "{#RepoRoot}\THIRD-PARTY-NOTICES"; DestDir: "{app}\licenses"; Flags: ignoreversion
[Icons]
Name: "{group}\Nebula Terminal"; Filename: "{app}\nebula.exe"; WorkingDir: "{%USERPROFILE}"
Name: "{group}\{cm:UninstallProgram}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\Nebula Terminal"; Filename: "{app}\nebula.exe"; WorkingDir: "{%USERPROFILE}"; Tasks: desktopicon
Name: "{userstartup}\Nebula Terminal"; Filename: "{app}\nebula.exe"; WorkingDir: "{%USERPROFILE}"; Tasks: autostart
[Run]
Filename: "{app}\nebula.exe"; Description: "{cm:LaunchProgram}"; WorkingDir: "{%USERPROFILE}"; Flags: nowait postinstall skipifsilent
[UninstallRun]
; 必须在 Inno 删除 nebula.exe 前调用应用自己的结构化清理逻辑,避免直接改写用户配置。
Filename: "{app}\nebula.exe"; Parameters: "setup-ai --remove"; WorkingDir: "{app}"; RunOnceId: "RemoveNebulaAiHooks"; Flags: runhidden skipifdoesntexist
+2 -2
View File
@@ -23,8 +23,8 @@ if ([string]::IsNullOrWhiteSpace($OutputDirectory)) {
$outputRoot = [System.IO.Path]::GetFullPath($OutputDirectory)
$targetRoot = Join-Path $repo "target\$Configuration"
$stage = Join-Path $outputRoot ".stage-$Version-$PID"
$zipPath = Join-Path $outputRoot "NebulaTerminal-$Version-windows-x64.zip"
$temporaryZip = Join-Path $outputRoot ".NebulaTerminal-$Version-windows-x64-$PID.tmp.zip"
$zipPath = Join-Path $outputRoot "NebulaTerminal-v$Version-windows-x64.zip"
$temporaryZip = Join-Path $outputRoot ".NebulaTerminal-v$Version-windows-x64-$PID.tmp.zip"
$manifest = [ordered]@{
'nebula.exe' = Join-Path $targetRoot 'nebula.exe'
+47
View File
@@ -0,0 +1,47 @@
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
$repo = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path
$installerPath = Join-Path $repo 'scripts\installer.iss'
$builderPath = Join-Path $repo 'scripts\build-installer.ps1'
$installer = Get-Content -LiteralPath $installerPath -Raw -Encoding UTF8
$requiredPatterns = [ordered]@{
'per-user installation' = 'DefaultDirName=\{localappdata\}\\Programs\\Nebula Terminal'
'non-admin installation' = 'PrivilegesRequired=lowest'
'Windows 10 1809 floor' = 'MinVersion=10\.0\.17763'
'application closing' = 'CloseApplications=yes'
'no application restart during uninstall' = 'RestartApplications=no'
'desktop shortcut task' = 'Tasks: desktopicon'
'login startup task' = '\{userstartup\}\\Nebula Terminal'
'hook cleanup command' = 'Parameters: "setup-ai --remove"'
'idempotent cleanup entry' = 'RunOnceId: "RemoveNebulaAiHooks"'
'hook helper payload' = 'nebula-hook\.exe'
'ConPTY payload' = 'conpty\.dll'
'ConPTY host payload' = 'OpenConsole\.exe'
'font payload' = 'MapleMonoNormal-NF-CN-Regular\.ttf'
'optional font installation task' = 'Tasks: installfont'
'pinned Chinese language file' = 'target\\installer-tools\\ChineseSimplified\.isl'
}
foreach ($entry in $requiredPatterns.GetEnumerator()) {
if ($installer -notmatch $entry.Value) {
throw "Installer is missing $($entry.Key): $($entry.Value)"
}
}
$uninstallRun = $installer.IndexOf('[UninstallRun]', [System.StringComparison]::Ordinal)
$cleanup = $installer.IndexOf('setup-ai --remove', [System.StringComparison]::Ordinal)
if ($uninstallRun -lt 0 -or $cleanup -lt $uninstallRun) {
throw 'Hook cleanup must be an [UninstallRun] action so it executes before installed files are deleted.'
}
& $builderPath -SkipBuild -ValidateOnly
$builder = Get-Content -LiteralPath $builderPath -Raw -Encoding UTF8
if ($builder -notmatch 'c495623a97376d524f298b1b160e8fd612375c62' -or
$builder -notmatch '6753BE2C5E2740D859900FD902824DB2EC568DA5C5B52486524C9762D778B0B0') {
throw 'The Chinese installer translation must use a pinned source commit and SHA-256.'
}
Write-Output "installer.tests.ps1: PASS ($($requiredPatterns.Count) invariants)"
+1 -1
View File
@@ -37,7 +37,7 @@ try {
}
& $packageScript -Version 'unreleased' -SkipBuild -OutputDirectory $resolvedOutput
$zipPath = Join-Path $resolvedOutput 'NebulaTerminal-unreleased-windows-x64.zip'
$zipPath = Join-Path $resolvedOutput 'NebulaTerminal-vunreleased-windows-x64.zip'
if (-not (Test-Path -LiteralPath $zipPath -PathType Leaf)) {
throw "Packaging script did not create $zipPath"
}