29 Commits
Author SHA1 Message Date
tokisaki galaxy d376b93e03 installer: let the packaging carry a prerelease version string
Two independent obstacles surfaced the first time a version with a hyphen
reached the installer:

- Inno Setup's VersionInfoVersion only accepts digits and dots, so ISCC
  aborted on 0.7.1-dev.20261019.<hash>. AppVersion, the output filename and
  the versioned DLL directory are free text and keep the full string; only
  VersionInfoVersion moves to a separate MyVersionInfo define that
  Prepare-PackageFiles.ps1 fills with the part before the hyphen, failing
  loudly if what remains is not numeric. Releases pass a bare semver, strip
  nothing, and behave exactly as before.
- TsfRoot64 called ApplyPathRedirRulesForCurrentProcess, an Inno Setup 7
  support function the windows-2025 runner's 6.7.1 does not have. #925 added
  it five hours after the last hosted-compiler run, and every release since
  then compiled on the self-hosted Inno 7, so the latent break never fired;
  the dev-build's hosted package job is the first to execute that path. The
  call was a no-op anyway: with
  ArchitecturesInstallIn64BitMode=x64compatible the setup process is 64-bit
  on every supported OS, so {sys} already expands to the real System32 and
  no WOW64 redirection applies. Expand the constant directly, with the #434
  warning in this README updated to name the function explicitly.
2026-10-19 16:01:05 +08:00
Lu Fan(SonnyCalcr) e701cebbe4 feat(server,ui,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤 (#1061)
* feat(ui): CandidateList 支持等宽网格列与关闭选中态

- Appearance::gridColumns:横排时按可用宽度均分成等宽列(列数不超过 gridColumns,每列不窄于
  minItemWidth),放不下一列的项占多列。
- Appearance::selectable:为 false 时不画任何选中态,首项也能正常显示悬停与按下效果。

* feat(server,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤

内置皮肤数据化:
- skins/default/<id>/skin.toml 从只放开关改为完整的出厂清单(配色、圆角、版式、工具栏、名称与说明),
  并新增 canvas 基底的清单。候选窗、悬浮工具栏、光标状态徽标不再在代码里写死任何内置皮肤的参数。
- 出厂清单在构建时编进程序;数据目录里的清单写了的键覆盖出厂值,缺失或写错时退回出厂外观。
  安装包改为每次整份覆盖 skins\default。
- 皮肤清单新增版式键(padding、item_gap、number_inset 等,长度可写 DIP 或 "0.3em"),以及
  [candidate_window.horizontal] / [candidate_window.vertical] 分排列覆盖、page_arrow_divider、
  toolbar.icon_corner_radius_dip。
- test_candidate_skin_tokens 保留改动前的内置分支作参照,逐个皮肤、主题、排列与字号比对清单解析结果。

共用候选窗场景:
- 候选框的场景搭建与套皮肤抽成 CandidateSkinScene,候选窗与设置页的皮肤预览共用;设置页预览改用
  真实的候选窗控件绘制,删除原先移植自网页样式的预览绘制与各皮肤硬编码。

卷轴展开(expand_panel)与微信绿(卷轴):
- 皮肤开关 expand_panel / expand_rows:横排候选行右端的展开按钮,展开后首行与后续候选网格一起滚动,
  右侧细滚动条;展开与收起只认按钮,展开时滚轮上下滚动、不翻页。
- 网格点选按绝对下标上屏并在工作线程核对显示文字;滚到底部时自动再展开一批候选。
- 新增内置皮肤 wechat_scroll「微信绿(卷轴)」。
2026-10-18 20:42:06 +08:00
Lu Fan(SonnyCalcr) 1b875267db refactor: 移除 WebView2,界面只保留 Direct2D (#1013)
* refactor(engine): 语音独立工具改用原生托盘菜单,移除 WebView2

托盘菜单改用 Win32 弹出菜单,设置项改为用关联编辑器打开 config.toml,关于页改为消息框。删除 window_webview2 与两份 HTML 资源,windows-app 特性不再依赖 webview2 端口。

* refactor(server): 移除 WebView2,候选窗、工具栏、托盘菜单与设置窗口只保留 Direct2D

删除 src/webview2 与 webview_utils,小窗口的置顶、皮肤重载和工具栏状态缓存移到 window/small_windows,presenter 成为唯一路径,D2D 下的置顶时序与 cloak 行为保持不变。设置进程去掉 WebView2 宿主、鼠标转发与启动图,只构建原生窗口;旧快捷方式传入的 --d2d / --webview2 被忽略。删除 appearance.ui_backend 与 appearance.settings_ui_backend(读取、写入、设置页下拉框与两份配置模板),升级时由模板合并丢弃旧值。设置窗口的图片资源移到 server/assets/settings,安装到数据目录的 assets\settings。不再链接 WebView2Loader,vcpkg 去掉 webview2 端口。

* build(installer): 打包与 CI 不再处理 WebView2 页面和运行时

Prepare-PackageFiles 去掉 -UiHtmlDirectory 与 html 暂存,改为暂存 server/assets/settings;安装器不再检查 WebView2 Runtime、不再创建 ProgramData 下的 WebView2 用户数据目录,升级和卸载时清理旧版留下的 webview2 / webview2-settings 与数据目录里的 html。CI 删除设置页构建、契约同步检查和候选窗 DOM 测试,release 的打包任务不再依赖网页产物;dependabot 去掉 npm。第三方声明去掉 WebView2Loader。

* refactor(ui-html): 删除 WebView2 页面与设置页前端工程

候选窗、工具栏、托盘菜单、设置页、主题和契约副本都已没有使用者;设置窗口用到的图片资源已移到 server/assets/settings。sync-contracts.py 与 pnpm/Vite/TypeScript 工程一并删除,契约仍以 engine/contracts/webview 为唯一来源。

* docs(server): 文档改为只描述 Direct2D 界面

仓库地图去掉 ui-html,组件边界、uiAccess 与置顶时序、设置窗口和配置读写的说明改写为 Direct2D 唯一界面;安装说明去掉 WebView2 Runtime 检查,打包命令去掉 -UiHtmlDirectory;engine/contracts/webview 的说明改为设置窗口是唯一使用者,名字是历史遗留。

* docs(skins): 皮肤说明不再区分 WebView2 与 D2D 渲染器

v2 字段去掉「仅 WebView2」,改为说明由 Direct2D 原生渲染、部分字段仍在补全;颜色必须带 # 改为清单格式约定。随包的 skins/niya-demo/skin.toml 不改,免得用户机器上的同名皮肤在升级时被当成已修改而改名备份。

* docs(ui): demo 说明文字不再提 WebView2
2026-10-17 02:48:02 +08:00
Jia Suiandfanlusky d414268b5f [Feat] U 模式重构为部件拆字反查 (#973)
* feat(engine,server,windows,ui-html,installer): U 模式重构为部件拆字反查 (#971)

把 U 模式从 Unicode 十六进制码位输入改成部件拆字反查:Shift+U 后输入各
组成部分的拼音连写(晶 = ririri)即可出字,候选上反显注音。

- 引擎:新增 local_modes/radical_query(前缀匹配、字频降序),数据表
  engine/radical/decomposition.txt 与生成脚本;LocalInputMode::Unicode
  改为 Radical;删除 unicode_query。
- Server:g_radical_mode_triggered + IsRadicalCompositionActive + 候选分发,
  用 cpp-pinyin 反显注音;删除 Unicode 码位路径。
- 前端 TSF:删除 U 模式的十六进制/数字特例与影子预判,按普通组合处理。
- 配置:utility.unicode_mode 改为 utility.radical_mode。
- 部署:assets 登记 radical_decomposition,安装器与 CI 拷表。

数据来源 mirtlecn/rime-radical-pinyin (GPL-3.0),授权见 engine/radical/NOTICE.md。

* feat(server): U 模式反显拼音改为带调风格(jīng)

* fix(server,installer): 修复 U 模式 CI(拆字表打包夹具与 clang-format)

* fix(engine,server): 修正 U 模式按键错位、重复候选与配置迁移

- Server 在 U 模式不再吞掉撇号、分号、斜杠、大写字母等键:TSF 已把它们记进按键缓冲,
  吞掉又不重同步会让两侧串和光标错位。照常插入,含非 a-z 的码查不出候选
- 拆字查询全码命中排在仅前缀命中之前,同一个字的几种拆法只出一次
- 升级合并把旧键 utility.unicode_mode 的值带到 utility.radical_mode,读取时也兜底旧键
- 生成脚本只收汉字,重建拆字表去掉 abc 码下的 51 行数字、字母与符号
- 开着 U 模式时在后台预热拆字表与 cpp-pinyin 词典,避开首个按键的冷加载
- Server 按会话的 RuntimePaths 查拆字表,删掉走全局数据目录的便捷重载
- cpp-pinyin 初始化合并到 utils/hanzi_pinyin,设置页导入注音共用;U 模式与快捷短语的收键分支合并

---------

Co-authored-by: fanlusky <1730976608@qq.com>
2026-10-16 01:01:18 +08:00
fanlusky 371d651a40 fix(windows,installer): 输入法语言配置图标改用固定路径,升级后任务栏不再显示「简体」
TSF DLL 每次升级都装进新的 msime_v* 版本目录,语言配置注册的图标指向 DLL 自身,
注册表里的图标路径随之每次变化。任务栏恰好在换目录时取不到图标,就改显示「简体」文字,
并一直沿用到资源管理器重启。

- 安装器把 windows/image/msime.ico 装成 Program Files 与 Program Files (x86) 下
  metasequoiaime\MetasequoiaImeTip.ico,排在 TSF DLL 的 regserver 条目之前
- RegisterProfiles 发现 DLL 上一级目录有这个文件就注册它(索引 0),否则退回 DLL
  内嵌的 IDIS_METASEQUOIAIME,开发时从 build 目录注册不受影响
- 打包脚本收集并断言该图标;打包测试检查两份都装、且先于 DLL 安装
2026-10-12 04:20:17 +08:00
Lu Fan(SonnyCalcr) 649747f8cd feat(server): 神经网络整句效果优先模型改为按需下载 (#838)
效果优先模型(sentence-model-desktop.safetensors,约 25 MB)不再随安装包分发,
改为和八股文模型一样在设置页下载后才能使用。

- engine:SentenceAssociationOptions 新增 neural_desktop_model 路径,留空即模型缺席、
  静默不重排;词典不再从资源目录固定加载效果档。load_file 按 UTF-8 打开路径,
  数据目录在非 ASCII 用户目录下也能读到模型
- server:新增 settings/neural_model,下载到 <数据目录>\models\neural-desktop\,
  下载与导入都按 neural-model/lock.json 的字节数和 SHA256 校验后原子落位;
  会话层只在开关打开时解析模型路径
- ui-html:设置页增加下载 / 导入 / 删除 / 浏览器下载,模型未就绪时开关置灰
- installer:不再打包效果档模型;旧版装进数据目录根下的那份在覆盖安装与卸载时清掉

原有配置项 sentence_neural_desktop 保持不变,用户的开关状态升级后保留。
2026-10-11 18:08:33 +08:00
fanlusky ae36403230 feat(installer): 随包安装 skins 下的外部皮肤,覆盖前把改过的同名皮肤备份为 .bak 2026-09-30 23:58:11 +08:00
fanlusky a94770340d fix(installer): 内置皮肤清单改为单独暂存,不经 app_data
app_data 的顶层条目都要进卸载删除名单 IsShippedAppDataItem,而数据目录的 skins
整个归用户(外部皮肤也在里面),不能进那份名单。清单改为暂存在 installer/default_skins,
仍以 onlyifdoesntexist 装到 skins\default。打包测试夹具补上 skins/default,并断言
清单不经 app_data、安装条目保持 onlyifdoesntexist。
2026-09-30 13:08:11 +08:00
fanlusky dde06afd7f feat(server): 候选框显示翻页箭头并接入设置页预览
- D2D:横排在候选右侧多一窄列,竖排在最后一行下方、「‹」与序号左对齐;开关或排列方式变化时重建场景
- WebView2:页面按 data-page-arrows 显示箭头,点击经 candidatePage 翻页
- 箭头点击走 WM_PAGE_CANDIDATE_ARROW,不受鼠标滚轮翻页开关影响;页面快照带上一页 / 下一页可用状态
- 两个设置窗口宿主下发内置皮肤的 page_arrows,外部皮肤条目带解析后的 pageArrows
- 安装包把 skins/default 以 onlyifdoesntexist 放到数据目录,升级不覆盖用户改过的清单
2026-09-30 12:42:25 +08:00
fanlusky 396bd21715 feat(server,ui-html,installer): 整句联想默认开启词格、Google 和神经速度档
sentence_wordlattice、sentence_google、sentence_neural_keyboard 出厂默认改为 true;
sentence_neural_desktop 与 sentence_show_next_on_duplicate 保持关闭。出厂模板、开发配置、
代码缺键回退和设置页开关初始状态一并改。这几个开关尚未发版,不涉及老用户配置迁移。

Prepare-PackageFiles.ps1 增加断言:这三个开关在出厂模板里未开启时打包失败。
2026-09-27 23:43:13 +08:00
fanlusky 0a1b302b1c feat(server,ui-html,installer): 设置窗口后台驻留默认改为关闭后立即退出
settings_window_linger 的出厂默认值从 "10m" 改为 "off"。出厂模板、开发配置、
缺键/非法值回退、设置进程初始值和设置页下拉框初始文字一并改;该功能尚未发版,
不涉及老用户配置迁移。

Prepare-PackageFiles.ps1 增加断言:出厂模板的驻留值不是 off 时打包失败。
2026-09-27 23:02:34 +08:00
fanlusky 9dfa69c7e5 build(installer): 打包神经整句模型并在发布流程中下载
Prepare-PackageFiles 断言并拷贝两个模型与授权声明;release workflow 在收集产物前
运行 fetch-neural-model.ps1。
2026-09-24 14:03:43 +08:00
fanlusky bc1a1c7a4c fix(installer): 把 Google 解码器的系统词典打进安装包
dict_pinyin.dat 从来没有进过安装包,所以装出来的输入法里
CandidateSource::Fallback 那条整句候选是空转的:im_open_decoder
拿不到系统词典会返回 false,PinyinDecoder::sentence 直接返回空串,
不抛异常也不记日志,表现就是「Google 那份联想没有了」。

这个缺口一直没被测试挡住,是因为测和装走的是两条路:
scripts/ci/test-server.ps1 和 engine/tests 用的是
server/assets/tables/ 这个开发资源目录,那里有一份 dict_pinyin.dat;
而 Prepare-PackageFiles.ps1 只从该目录取 pinyin.txt。两份文件内容
完全相同(sha256 6bf0bbde…62b2),所以本地跑什么都是对的。

打包取 engine/googlepinyinime-rev/data/ 那一份,不取 server 下的
开发副本 —— 前者是 engine/contracts/assets/assets.json 声明的来源,
万一哪天两份不同步,装出来的应当和清单一致。

与之配对的 user_dict.dat 不进包:清单里它是 role=user、profiles 为空
的可写文件,由 UserDict::reset 在用户数据目录下自建。装进资源目录
等于每次升级都把用户自造词顶掉,因此补了一条反向断言。

打包契约测试加了缺 dict_pinyin.dat 必须失败的负例,理由同 sc.lm:
两者都是静默降级,打包是唯一能挡住的地方。
2026-09-19 10:08:39 +08:00
fanlusky d30d2946e4 feat(installer): 打包时生成并安装词格语言模型 sc.lm
sc.lm 此前只能手工投放,重装即失效,发布包里也没有它。这里把它变成一个被钉住、
可复现、自动参与打包的产品输入。

它不走词库那条路:词库 release 由本仓库之外的构建器产出,资产集合和摘要在产品锁
里逐一钉死,加一项要对方先发新版。改为独立钉住上游语料,与 libime 自己的做法一致。

- language-model/lock.json 钉住上游 URL、语料摘要、转换参数和产物摘要。转换是
  确定性的(已在 MSVC 14.44 与 14.50 两套工具链上验证产物摘要一致),所以产物
  摘要可以像下载摘要一样钉死。
- scripts/build-language-model.ps1 下载、校验、转换、再校验,写临时文件后改名,
  中途失败不会留下摘要对不上的 sc.lm。幂等,摘要对得上直接返回。
- 它只 configure engine/ngram 一个目录,不拉 vcpkg 和 SQLite:转换工具只依赖
  kenlm 自己,而打包机上未必装得起引擎的全部依赖。
- Invoke-LocalTest.ps1 打完整包前自动调用它,轻量包本就不带数据文件,不调。
- 打包脚本只断言文件存在,摘要由构建脚本负责,与词库交给 product_lock.py 校验
  的分工一致。缺模型让打包失败而不是跳过:引擎对缺模型是静默降级的,运行期不会
  暴露,打包是唯一拦得住的地方,package-files.ps1 为此加了反向用例。

模型是 LGPL-2.1-or-later 的第三方数据,声明随之安装为 libime-lm-NOTICE.md。
安装脚本无需改动,它已按通配收集资源目录。产物与语料不进仓库,只进锁与声明。
2026-09-19 10:08:39 +08:00
fanlusky 3b6b65020d perf(installer): 本地打包默认不含 PDB,另开带符号入口
本地跑 test-light.ps1 等很久,慢的大头不是编译而是 Inno Setup 在压 PDB:
包里 PDB 约 140 MB,而真正的 EXE/DLL 只有约 20 MB,msime_setup.iss 又是
Compression=lzma2 + SolidCompression=yes,整整一遍压下来轻量包要 58.7 秒。

Prepare-PackageFiles.ps1 新增 -IncludeSymbols,不带它就把 server_exe\ 和
tsf_dll\ 里的 PDB 全部剔除。校验逻辑没有放松:仍然要求 Release 构建产出同名
PDB,缺符号照样打包失败,只是「符号是否随包安装」变成了显式选择。
msime_setup.iss 的两条 *.pdb 加上 skipifsourcedoesntexist,同一份脚本在带
符号和不带符号两种暂存下都能编译。

正式发布行为不变:release.yml 的打包步骤显式传 -IncludeSymbols,发布的安装包
依旧携带与二进制匹配的符号。

test.ps1 和 test-light.ps1 原本是两份几乎逐行相同的拷贝,现在一起收进
Invoke-LocalTest.ps1,三个入口都是它的薄包装:

  test.ps1          含词库,不含 PDB
  test-light.ps1    不含词库,不含 PDB
  test-symbols.ps1  含 PDB,默认轻量,加 -Full 走完整包

轻量包 Inno Setup 耗时 58.7s -> 9.2s,安装包体积 33.4 MB -> 7.7 MB。
2026-09-13 03:56:58 +08:00
fanlusky a7779d2b05 refactor(engine): 将 engine 从 submodule 内嵌为仓内一等组件
`vendor/MetasequoiaImeEngine` submodule 改为 `engine/` 目录,导入的是
product-lock.json 原本钉住的提交 c810d201,逐文件核对过 blob,因此这是一次
搬迁而不是引擎升级。引擎自己的嵌套 submodule(googlepinyinime-rev、utfcpp、
miniaudio)按各自 gitlink 一并展开,来源与提交见 engine/UPSTREAM.md。

Windows 专门化裁掉了不属于本产品的部分:whisper.cpp 与本地推理 provider、
macOS 示例宿主、整个 dictionary/ 建库流水线、上游 CI 与 release-please 配置。
词库仍按 product-lock.json 在构建时取发布产物。

引擎不再进 product-lock.json:没有 gitlink 就没有可比对的东西,锁里写一个上游
commit 等于宣称这棵树仍等于上游,而第一个 Windows 专门化改动落地时这句话就假了。
verify-contracts / verify-checkout 随之移除,verify-published 保留。

CI 与工具链:引擎源码并入根 scripts/format.sh(删掉引擎自己的那份,避免两套排除
列表分叉);引擎 voice.yml 里的 silero_vad.onnx 摘要校验移到本仓 lock job;
engine-bump-triage 工作流与其测试删除;gitsubmodule 的 dependabot 频率由 daily
改为 monthly。

README、README.en、AGENTS.md、CONTRIBUTING、docs/product-release.md 及各子目录
文档同步说明新的位置与边界。
2026-09-12 03:40:48 +08:00
fanlusky 20e62f0a3c fix(installer): 打包写 .iss 用 LF,test/test-light 还原工作目录
Prepare-PackageFiles 回写 MyAppVersion 时把文件末尾换行强制为 CRLF,
与仓库 .gitattributes 的 eol=lf 冲突,导致 msime_setup.iss 在每次打包后
被 git 标记为已修改,但 git diff 看不到文本差异。改为输出 LF。

test.ps1 与 test-light.ps1 顶部 Set-Location $PSScriptRoot 改变进程工作目录
且从不还原,脚本结束后调用者的 shell 被留在 installer\。两者均改为
Push-Location + try/finally Pop-Location,运行中途报错也能还原到调用前目录
(各构建步骤已用绝对路径,不依赖进程 cwd)。
2026-09-11 23:11:47 +08:00
AaGMix e9a2c91214 feat(installer): include release PDB symbols 2026-09-07 02:10:38 +08:00
Evan 4fc16952b3 wip(windows): 补齐隐私与许可交付,修好外部人的构建入口
- 新增 PRIVACY.md:逐项写明每个联网端点、发送内容、默认开关与关闭方式,明确云候选默认开启、
  token 在 config.toml 明文存储、无任何遥测
- 设置页「用户协议」「隐私政策」两个无 handler 的死按钮接上;前者改名为「开源许可协议」指向
  LICENSE,开源产品的用户条款就是许可证本身,不再承诺一份不存在的 EULA
- 安装包随包装入 GPL 正文并在安装向导显示(GPLv3 §4/§6),补上打包测试断言
- release.yml 增加 build provenance attestation,并在发布后向 MSIME-Web 发 repository_dispatch,
  让 msime.app/update.json 不再等两小时一次的 cron
- 所有 CMakePresets 的 vcpkg 路径改用 $env{VCPKG_ROOT},server 的 Boost 回退不再指向个人目录
- ui/README.md 指向本机绝对路径的 markdown 死链改成相对链接
- 新增 check-developer-paths.sh 并接入 required 的 quality 检查,防止路径回潮
- docs/installation.md 不再写死版本号
2026-09-06 12:05:06 +09:00
Evan Hu b2d736cd79 fix(build): finish local tooling migration to the monorepo 2026-09-06 09:02:13 +09:00
Evan Hu 5f8d75d79e fix(installer): use Engine tables in the local monorepo layout 2026-09-06 04:16:19 +09:00
Evan Hu c3fcc4a515 refactor(product): consume the consolidated Engine data and shared voice capture
Ports metasequoiaime/MSIME-Windows#153 onto the consolidated repository. That pull request was written against the six-repository layout: it edited product-ci.yml, which no longer exists, and re-pinned Server, UiHtml and Installer, which are directories now.

Three of its pinned commits had not reached this repository at all. The consolidation took each source repository at its main, and Server, UiHtml and Installer each landed two more commits afterwards, so dropping the pins as merely obsolete would have silently dropped the work the pull request exists to consume. The two substantive ones are ported here: Server drops its vendored miniaudio.h and builds against the engine's MetasequoiaIme::VoiceCapture, and the installer collects helpcodes from the engine. UiHtml's was an engine gitlink bump, which one submodule resolves on its own.

The engine is pinned to d0dc0c2b rather than to the b7c799ef that pull request named. b7c799ef predates 403b4a4d, which is what this repository pins today and is the commit that added pagination to the settings dictionary contract, so taking the pull request's pin verbatim would have reverted a contract main already depends on and stripped offset, limit and hasMore back out of the generated web bindings. d0dc0c2b is the engine's main and is the same commit the dictionary release declares as its source, so the code and the data now name one commit.

The helpcodes moved into the engine, so MSIME-HelpCode stops being a product input: the gitlink that pins the contracts pins the tables too. product-lock.json is down to the engine and the dictionary release, and the dictionary itself now ships from MSIME-Engine. Its manifest states which commit built the data and whether that tree was clean, and the lock verifies both, so matching digests can no longer stand in for a source nobody can rebuild from. The retired MSIME-Dict repository stays valid for the one tag that shipped from it and nothing else.

The release job that packages now checks out submodules, because the helpcodes it collects live in one.
2026-09-06 04:13:04 +09:00
Evan Hu 32e722c176 ci: build every component from the one checkout
The product lock existed because five repositories had to be pinned to reproduce one product. Four of them are directories now, so a commit of this repository already pins them and there is nothing left for the lock to say about them. What it still records is what the product consumes from outside: the engine submodule, the helpcodes and the dictionary release.

CI gains a job per component instead of a reusable workflow that checked out locked commits and rebuilt them. The release workflow no longer stages five sibling checkouts under historical names and no longer carries a second sparse checkout for its own scripts; Prepare-PackageFiles.ps1 already took the source directory names as parameters, so it is told the new ones, plus where the product-wide notice now lives.

Two checks the removed cross-repository pins used to provide are replaced in kind: the pages are verified against the engine submodule's web contract in CI rather than by locking UiHtml and Engine together, and the engine bump triage that Server carried moves here and now also says so when a bump leaves the lock behind.
2026-09-06 02:35:49 +09:00
Evan Hu 448366d9c6 Merge origin/main into architecture/product-contracts
Prepare-PackageFiles.ps1 conflicted because both sides changed the block that builds the source paths. The resolution keeps both: the source directory names stay parameters with the historical defaults, and dictionary-manifest.json is addressed through the dictionary parameter like every other path in that block. Both new assertions are kept, for the shared WebView contracts and for the third-party notices.

tests/package-files.ps1 needed two additions, because main added an input this branch's fixture did not know about. The fixture now writes MetasequoiaImeTsf/THIRD_PARTY_NOTICES.txt, without which the new assertion would fail the test that this branch introduced, and the packaged-output check now also looks for it, so the file being dropped from the payload is caught rather than only its absence from the source tree.
2026-09-06 01:16:43 +09:00
Evan Hu dba951d774 fix(packaging): include shared WebView contracts and dictionary provenance 2026-09-06 00:40:20 +09:00
Evan Hu 5705ff2300 refactor: take the source directory names as parameters and ship the notices
The script addressed its five source checkouts by hardcoded historical directory names, so MSIME-Windows' release workflow had to stage each repository under a name it no longer uses in order to call this script unmodified. The dependency ran backwards: the orchestration bent to fit the script.

The names are now parameters whose defaults are exactly those historical names, so the workflow keeps working with no change at all, and a caller using the current repository names can pass them instead of renaming directories. The relative paths inside each checkout are unchanged and remain a hard contract.

The package also now carries THIRD_PARTY_NOTICES.txt, taken from the TSF repository root and installed into the program directory. rime-ice is GPL-3.0, requires attribution, and its content forms the bulk of msime.db, so that notice has to reach the user's disk rather than only exist in a source repository. It is asserted rather than copied best-effort, so a missing notice fails packaging instead of silently shipping without it.

Requires metasequoiaime/MSIME-Windows#142, which adds the file this now asserts.
2026-09-05 23:41:24 +09:00
fanlusky 3145200331 Add light version of installer test. 2026-09-01 00:10:48 +08:00
fanlusky 217a753a4b Remove some useless scripts. 2026-08-30 17:46:18 +08:00
fanlusky d2a5320ec2 Add installer instructions. 2026-08-30 15:40:11 +08:00