chore: prepare v0.6.0 release
This commit is contained in:
1 parent
9029b5b5c1
commit
6ca0f8b8aa
15 files changed
+420
-32
No files matched your search
+5
-1
@@ -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
@@ -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",
|
||||
|
||||
@@ -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/`。
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
[package]
|
||||
name = "nebula-completions"
|
||||
version = "0.5.0"
|
||||
version = "0.6.0"
|
||||
edition.workspace = true
|
||||
|
||||
[features]
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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"] }
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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'
|
||||
|
||||
@@ -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)"
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user