Commit Graph
62 Commits
Author SHA1 Message Date
winewill bed4a2b565 fix(desktop): address review of the extraction failure report
- Headline skips the archive path 7-Zip echoes before an open failure
  (also when the path contains spaces) and prefers the operation line.
- Raw process statuses such as 0xC0000005 are kept and printed in hex
  instead of being clamped to INT_MAX.
- The expanded panel excerpts the result and 7-Zip's own lines rather
  than the report header.
- The saved report keeps up to 16 MiB of output, records any cut, and
  trims a partial UTF-8 sequence before decoding.
- The details view no longer reads the UTF-8 log as ANSI; the test seam
  define and the zero-padded GetTime order are documented; the smoke
  asserts a year-first report name and normalizes -FrameLibrary.
- README names the real updater cache directory.
2026-09-22 14:30:56 +08:00
winewill 4544874d62 Merge branch 'master' into fix/windows-installer-extract-diagnostics 2026-09-22 13:46:04 +08:00
winewill ab62f09c22 fix(desktop): report Windows extraction failures with 7-Zip evidence
The installer showed "Failed to decompress files" and discarded 7-Zip's
error output, so a failure such as security software quarantining an
extracted file could not be told apart from a full disk or a broken
download.

- InstallerExtract returns negated Win32 errors for launch failures so
  they no longer collide with 7-Zip exit codes; 7-Zip writes UTF-8 errors.
- window-frame.dll composes a report (result, archive, destination,
  Windows version, full 7-Zip output), saves it under the updater cache
  directory, and presents a task dialog with the first error line, a
  collapsible bounded excerpt, and a Copy error details button. Silent
  installs keep only the report; a missing task dialog falls back to a
  message box.
- Unsigned Windows builds name their installer *-unsigned.exe so a
  shared file cannot pass for a release artifact; version discovery
  still counts them.
- The directory smoke asserts the saved report on a broken archive and
  smoke-windows.ps1 accepts the prepared DLL.

Refs #4893
2026-09-22 12:38:05 +08:00
winewill 5fdad8d838 Merge branch 'master' into build/windows-release-scripts 2026-09-21 17:21:48 +08:00
winewill d54b000bdb fix(desktop): keep the new specs off the built tree and off unknown casts
The afterPack spec mocked the built runtime tree through a path relative
to the spec, which only resolves once `lib/` exists; on a clean checkout
the hook imported the real module and every case failed. It now mocks
the path the hook actually resolves, as the asar-unpack spec does, and
passes with `lib/` absent.

The toolchain probe assertion reached its matcher through an assertion
to unknown, which `verify-no-unknown-casts` forbids. It compares the
reported tools and detail directly instead.
2026-09-21 17:05:33 +08:00
winewill b8050f0251 fix(desktop): finish the review items the first pass missed
Three comments in the same review round went unread and still applied.

A failed tag push left the local tag in place, so the printed recovery
`git tag … && git push …` short-circuited on "already exists" and never
pushed. The result now carries the commands still outstanding, and the
tests cover a failed push and a failed tag separately.

Automatic numbering caught every error from resolving the upload
destination, which turned a misconfigured destination into silent local
numbering that can reuse a published index. It now checks whether a
destination is configured at all and lets an invalid one fail, and the
remaining catch names the error it reports.

`pnpmCommand` fell back to a bare `pnpm`, which on Windows is the batch
shim spawnSync cannot start — the failure this branch exists to fix. It
says so instead, and keeps the fallback where a shim is executable.

The afterPack regression this branch introduced earlier reached review
because nothing exercised that hook: one spec calls it directly for an
ordinary build, a prepared qualification runtime, and a build version,
and it fails when the expected version collapses back to one value.
2026-09-21 16:37:50 +08:00
winewill 0181baae5b Merge branch 'master' into build/windows-release-scripts
Adopt the `unsignedArtifacts` build path master introduced, in place of
the directory this branch was joining by hand for automatic numbering.
2026-09-21 16:14:26 +08:00
winewill 1b6451a647 fix(desktop): follow the documented release version rules
Review found that `apps/desktop/README.md#release-versions` and the
2026-09-16 version-derivation note already specify this convention, and
that three of their requirements were reversed without saying so. The
rules themselves are right; what was wrong was leaving them undocumented
and rejecting one of the forms they prescribe.

A stable base takes `-test.YYYYMMDD.index`, which validation refused
because such a version ranks below its base. That ordering is the point:
the form belongs to a test feed that never serves the production
release. Both READMEs, the older note, and a new note now record which
requirements this change reverses and why.

Three defects the review found, each reproducible:

- `afterPack` compared the bundled runtime against the product version,
  which broke installed-update qualification: that flow passes a runtime
  whose version was deliberately rewritten. The expected version is now
  a parameter the preparer supplies, and `verifyDesktopRuntime` says
  "bundled X is not the expected Y" rather than naming Electron.
- Upload could only learn the published version from a shell variable,
  conflicting with "release fields come only from the target file". It
  reads the completion record packaging wrote, and a mismatch now prints
  the version that record holds.
- Automatic numbering read one listing page and one fixed directory. It
  now follows every page, discards a listing it could not finish rather
  than reusing an index that would overwrite a published installer,
  bounds the request through the client's own timeout, and reads the
  directory an unsigned build actually writes.

Also: `npm run` and `yarn run` set `npm_execpath` too, so the pnpm
resolution checks the path names pnpm; the argument separator can arrive
after a run script's preset arguments, not only first; and the toolchain
probe, parser, build commit, and tarball readers now have specs.
2026-09-21 16:04:08 +08:00
winewill 4ab8fbfacc fix(desktop): name the commit a build records instead of its provenance
The concrete-terms gate forbids "provenance": the repository asks for the
exact source, field, or identity a value holds. The module records one
commit and whether its tree was dirty, so it and its callers say that.

The toolchain step also has to stay out of the way of the packaging
entry's error-recording test, which fakes the host platform and would
otherwise report the absent Windows compilers rather than the failure it
exercises. The test mocks the probe, as it already does for the release
environment and the signing keychain, and expects the new stage.
2026-09-21 15:26:29 +08:00
winewill ee0fc82267 fix(desktop): check the bundled runtime against the product version
Injecting a build version renamed the Electron shell but not the dsh
runtime packed into it, and afterPack required the two to be equal, so
every build carrying a build version failed after packaging finished.
The bundled runtime is the dsh package at the product version, which is
what the check now compares against; the app already reports the shell
version and the bundled runtime version separately to the update policy.

Rename the flag to --build-version. The repository already has
DOWNLOAD_TEST_RELEASE_ID for the opaque test feed directory, so calling
a version a release id invited a reader to confuse the two. Accept a
forwarded `--` as well, because `pnpm run <script> -- --build-version x`
passes the separator through as an argument and every following option
would otherwise parse as a second target.
2026-09-21 14:45:35 +08:00
winewill 950ed3f6df feat(desktop): publish a build version without rewriting the manifests
Packaging a build for a test feed or a colleague required bumping the
version in 295 manifests plus the lockfile first, because the version a
build publishes was only ever read from the checkout. Those edits cannot
be committed, so every such build left the working tree dirty, and the
`<version>.<date>.<sequence>` convention behind them lived only in the
operator's memory.

The version a build publishes is now an input. `--release-id` names it,
`--release-id auto` numbers it after the builds already published to the
destination bucket (falling back to local artifacts, since a fresh CI
checkout has none), and it reaches electron-builder through
extraMetadata, the update feed, and the upload validation as one value.
The manifests keep the product version, aligned with the dsh npm
package, and a release still publishes exactly that.

Validation goes through `semver` itself, because `electron-updater`
compares feed versions with `semver.gt` against the installed
`app.getVersion()`: a build version must outrank the product version it
extends, which holds for `0.1.6-alpha.2.20260921.1` over
`0.1.6-alpha.2` and cannot hold on a stable version, where a fourth
release number is not a version at all.

Two things a build could not previously answer for itself:

- Artifacts now carry the commit they were packaged from and whether
  that checkout was dirty, so a build handed to a colleague is traceable
  without a tag.
- A production upload tags that commit as `desktop-v<version>` once the
  artifacts are public, and reports what to run by hand rather than
  failing an upload that already completed. Test and local builds are
  deliberately left untagged.

A toolchain step now probes tar and the Windows installer compiler
before the first build step, so a host that cannot finish the sequence
says so in seconds rather than minutes.
2026-09-21 14:23:48 +08:00
winewill 766eee63eb fix(release): run pnpm and tar portably on Windows
spawnSync cannot start the pnpm .cmd shim without a shell, so the bump
step's lockfile refresh failed with ENOENT on Windows after rewriting
every manifest. Resolve pnpm to a JavaScript entry executed by the
current Node: the run-script's npm_execpath when present, otherwise the
workspace's own pnpm dependency (located on disk because pnpm's manifest
does not export its bin entry).

GNU tar parses the colon in an absolute Windows path as a remote-host
separator and aborts, so the tarball readers now run tar in the
tarball's directory and pass only its file name.
2026-09-21 13:30:12 +08:00
winewill 032394fc48 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 17:01:23 +08:00
winewill 1e20aecef5 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 15:59:42 +08:00
winewill f3e8021eaa Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-20 15:48:35 +08:00
winewill d4c5a1723f test(desktop): isolate update UI in directory-picker preload integration 2026-09-20 15:36:49 +08:00
winewill 015e60ff40 test(desktop): satisfy strict lint in mandatory update regressions 2026-09-20 15:23:36 +08:00
winewill 69ac149090 fix(desktop): isolate mandatory update actions and handle main-window lifecycle 2026-09-20 15:20:04 +08:00
winewill 12f0608cad Merge master into fix/windows-mandatory-update-overlay 2026-09-20 15:07:10 +08:00
winewill 925f609092 Merge remote-tracking branch 'origin/master' into fix/windows-mandatory-update-overlay 2026-09-18 18:47:20 +08:00
winewill d7fd452e96 test(desktop): exercise embedded mandatory update recovery on Windows 2026-09-18 18:40:31 +08:00
winewill fdc4887c38 fix(desktop): embed Windows mandatory updates in the main window 2026-09-18 18:26:40 +08:00
winewill 750bf4988e fix(desktop): initialize Windows cache under stage ownership 2026-09-18 15:37:05 +08:00
winewill 1a7308fbaa test(shell): synchronize background process completion 2026-09-18 15:37:05 +08:00
winewill 7754a6fd49 test(desktop): isolate Windows cache path from host platform 2026-09-18 15:37:05 +08:00
winewill d4ed1d93d8 feat(desktop): share Windows runtime signature cache across worktrees 2026-09-18 15:37:05 +08:00
winewill aa181c66e5 fix(desktop): preserve unpacked PE files and target runtime descriptors 2026-09-17 21:31:34 +08:00
winewill 702f9e4ff1 Restore desktop shell dialogs and guard destroyed windows on exit 2026-09-17 21:31:33 +08:00
winewill 3d2876f046 Run packaged smoke with production profile resolution 2026-09-17 21:31:32 +08:00
winewill 4d46bff152 Normalize dependency metadata before sealing desktop runtime 2026-09-17 21:31:32 +08:00
winewill 5a409fc771 fix(desktop): sign all Windows native dependencies before packaging 2026-09-17 21:31:31 +08:00
winewill 3cbb9442fa Fix Desktop async window-state lint 2026-09-17 16:19:02 +08:00
winewill 064d8f8670 Merge origin/master into feat/desktop-update 2026-09-17 16:11:00 +08:00
winewill 954184934a Remove obsolete Desktop lint suppressions 2026-09-17 16:08:05 +08:00
winewill 721e2e13c7 Merge origin/master into feat/desktop-update 2026-09-17 16:07:27 +08:00
winewill e03f58c6e9 fix(desktop): close update review copy and documentation gaps 2026-09-17 15:52:57 +08:00
winewill 72f5fcc905 Merge remote-tracking branch 'origin/master' into feat/desktop-update 2026-09-17 15:38:13 +08:00
winewill 21887adc00 Merge origin/master into feat/desktop-update 2026-09-17 15:33:25 +08:00
winewill 25b6f868ca fix(desktop): classify update failures and refresh recovered Host 2026-09-17 15:18:02 +08:00
winewill e8a3bc701a fix(desktop): verify installed update ASAR runtime layout 2026-09-17 14:28:23 +08:00
winewill d1585abdd9 fix(desktop): release mandatory modal on install quit and bind DPAPI upload target 2026-09-17 14:04:15 +08:00
winewill eb10557199 test(desktop): pin supported platform in startup tests 2026-09-17 13:01:32 +08:00
winewill 38d375070f test(desktop): use native file URL for login placeholder 2026-09-17 12:32:06 +08:00
winewill fed28b6245 test(desktop): keep publisher test source-plane only 2026-09-17 12:19:48 +08:00
winewill ddc1e28e17 test(desktop): cover update indicator fallback states 2026-09-17 12:05:43 +08:00
winewill 6f79f40892 Merge remote-tracking branch 'origin/master' into feat/desktop-update 2026-09-17 11:36:18 +08:00
winewill 593db4e0b7 test(desktop): stub update listeners in host disconnect fixture 2026-09-17 11:36:05 +08:00
winewill 371054b072 chore(release): restore merge-target prerelease version 2026-09-17 11:27:24 +08:00
winewill a5528b02a3 Merge remote-tracking branch 'origin/master' into feat/desktop-update
# Conflicts:
#	apps/desktop/src/main.ts
#	apps/desktop/tests/main-startup.spec.ts
2026-09-17 11:16:45 +08:00
winewill a11b0a218c Merge branch 'codex/desktop-test-package-20260916' into feat/desktop-update
# Conflicts:
#	packages/client/ui-deliverables/package.json
#	packages/client/ui-directory-picker-native/package.json
#	packages/extensions/tool-cordis/package.json
2026-09-17 11:05:11 +08:00
winewill b3795cb99f fix(desktop): make Windows mandatory update window movable 2026-09-16 20:25:24 +08:00
winewill 6d05e76b89 feat(desktop): open Feishu login DevTools with F12 2026-09-16 19:38:47 +08:00
winewill c624c2eff0 fix(desktop): present installer welcome and package 0.1.6-alpha.1.20260916.2 2026-09-16 19:37:48 +08:00
winewill a609246a35 docs(desktop): confirm release version before packaging 2026-09-16 18:05:05 +08:00
winewill 69bf9f9054 release(dsh): 0.1.6-alpha.1.20260916.1 2026-09-16 18:04:50 +08:00
winewill bfe6beb517 fix(desktop): preflight Windows signing before builds 2026-09-16 12:32:11 +08:00
winewill 011dbc9fb8 Merge remote-tracking branch 'origin/feat/desktop-update' into feat/desktop-update 2026-09-16 11:51:15 +08:00
winewill c781e85e92 fix(desktop): isolate Windows signature inspection modules 2026-09-16 11:49:36 +08:00
winewill b06ea72226 fix(desktop): preserve verified runtime signatures during packaging 2026-09-16 11:43:04 +08:00
winewill b37687c141 fix(desktop): sign bundled Windows runtime before validation 2026-09-16 11:31:41 +08:00
winewill 63dd8fb80d feat(desktop): add ordinary and mandatory update flows 2026-09-16 10:48:23 +08:00
winewill 541dc51e9e fix(desktop): allow fs-ext in generated projects 2026-09-07 12:11:34 +08:00