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.
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.
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.
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.
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.