psadt-deploy-skill 0.29.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +41 -35
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -93,6 +93,10 @@ control plane.
93
93
 
94
94
  - **Guided intake** — the blocker questions up front as clickable options, pre-filled with researched
95
95
  defaults (app, latest version, installer type, package type).
96
+ - **Switch catalog before the web** — identifies the installer engine from the *binary* (byte signatures in
97
+ the PE overlay, resources and section table, not a filename guess) and serves that engine's documented
98
+ silent / uninstall / log / no-reboot switches from a catalog that ships with the skill. Offline, and it
99
+ reports every stage it checked including the misses. A candidate is still a claim until a run proves it.
96
100
  - **Autonomous research** — checks the installed PSADT version against the latest release *and* whether
97
101
  commands changed; researches silent install / uninstall / repair switches and known Intune pitfalls.
98
102
  - **All three deployment types from the start** — Install, Uninstall *and* Repair, acid-tested, so
@@ -172,7 +176,7 @@ The app's **native installer is always the default**. Everything else is opt-in
172
176
  - **Self-update** — `scripts/Update-PsadtSkill.ps1` compares against GitHub, shows what changed, and
173
177
  updates in place on your confirmation (`git pull --ff-only` for a clone, otherwise a branch-zip overwrite
174
178
  of tracked files only). Machine-local state is never touched. Say *"psadt update"*.
175
- - **441 Pester tests** over the helper scripts, including drift guards that fail when the docs and the code
179
+ - **503 Pester tests** over the helper scripts, including drift guards that fail when the docs and the code
176
180
  disagree.
177
181
 
178
182
  ## Requirements
@@ -345,9 +349,10 @@ psadt-deploy/
345
349
  │ ├─ README.md the reference map (label -> file)
346
350
  │ ├─ phases-0-6.md · phases-7-12.md the twelve phases
347
351
  │ ├─ appendix-a-errors.md … -q-drivers.md one file per appendix
352
+ │ ├─ switch-catalog/ engine defaults + JSON schema (App. L.0)
348
353
  │ ├─ Report-Template.html the fixed dossier template
349
354
  │ └─ app-registration.md THE Graph permission matrix + manual portal route
350
- └─ tests/ Pester suite, 441 tests
355
+ └─ tests/ Pester suite, 551 tests
351
356
  ```
352
357
 
353
358
  Machine-local state lives outside the skill folder:
@@ -368,7 +373,7 @@ psadt-package.json identity · gate decisions · research
368
373
  ## Status
369
374
 
370
375
  In active use for the full build → package → test → dossier workflow, with the direct Graph upload
371
- verified against a live tenant. The helper scripts are covered by 441 Pester tests.
376
+ verified against a live tenant. The helper scripts are covered by 503 Pester tests.
372
377
 
373
378
  One open point, honestly: **the driver `pnputil` exit-code semantics are documented, not verified here.**
374
379
  `0` / `259` / `3010` and the two `0xE...` failures come from Microsoft's documentation; confirming them
@@ -429,35 +434,36 @@ The two most recent releases are below. **[CHANGELOG.md](CHANGELOG.md)** carries
429
434
  every release since 0.1.0, and nothing is ever removed from it - this section is a window onto it, not a
430
435
  second copy to keep in sync.
431
436
 
432
- ### 0.29.0 - 2026-09-11
433
- - **Fixed: the 0.28.0 Startup-folder trigger could not run a single task as SYSTEM.** The runner passed
434
- the elevation check, yet `schtasks /Create` and `/Run` returned 0 while the task never executed - every
435
- action timed out blaming the package. `<LogonCommand>` is back; #125 is left to the host's DONE.txt timeout.
436
- - **Fixed: `schtasks`' stderr notice ended the run before the first action** - in WinPS 5.1 a `2>file`
437
- redirect does not stop the terminating `NativeCommandError`; the preference is lowered around the call.
438
- - **Fixed: the sandbox image lacked `de-DE\ArchiveResources.psd1`**, which PSADT needs just to import,
439
- and **WMI refused SYSTEM** (`Win32_ComputerSystem` -> `0x80070005`), which `Open-ADTSession` needs.
440
- Both surfaced as 60008 on every action with no log. `GuestPrepare` ships the host's module resources
441
- into the guest and repairs the WMI repository.
442
- - **Added: three canaries before the loop** (SYSTEM task, toolkit import, toolkit session), **a 60008
443
- action is re-run once via `powershell.exe -File` to capture the stderr the `.exe` discards**, and a
444
- **heartbeat in the guest console** so a healthy install no longer looks like a hang. Suite 493 -> 501.
445
- ### 0.28.0 - 2026-09-11
446
- - **Fixed: a space in the `.wsb` path silently disabled every custom mapped folder.** `Start-Process
447
- -ArgumentList` does not quote its elements, so Windows Sandbox booted with the built-in shares only -
448
- no error, no warning. A username with a space in it is enough, and it reads exactly like an upstream
449
- Sandbox bug.
450
- - **Fixed: `<LogonCommand>` never ran** on the affected Sandbox app version
451
- ([#125](https://github.com/microsoft/Windows-Sandbox/issues/125)). The work folder is now mapped onto
452
- the guest's Startup folder and a trigger `.cmd` starts the runner, which lives one level down because
453
- Startup auto-executes only `.exe/.bat/.cmd/.lnk/.vbs`.
454
- - **Fixed: a transient read reported a real result as empty** - a detection step captured `stdout: ""`
455
- while the same file, re-read at the end of the run, held the right answer. The read now retries.
456
- - **Changed: `schtasks` failures are checked** instead of surfacing as a 900-second timeout, and the
457
- runner verifies it is elevated before the first action - a Startup item does not carry the full admin
458
- token by construction the way `<LogonCommand>` did.
459
- - **Added: NSIS MultiUser needs an explicit `/allusers` or `/currentuser`** (App. L.7). A bare `/S`
460
- exits in under a second with no output and nothing installed. Now a Gate 2 decision.
461
- - **Added: an unbundled runtime prerequisite is researched in Phase 2 and decided at Gate 1**, and a
462
- manual interactive test is offered after a GREEN Phase 6 - the loop proves the package works, never
463
- that the app does. Suite 484 -> 493.
437
+ ### 0.30.0 - 2026-09-14
438
+ - **Fixed: the sandbox could not test a heavy package - and it was never the package.** Smart App Control
439
+ is enabled in the Windows Sandbox base image while Defender is disabled, so `wintrust` asks the disabled
440
+ Defender to rate every signed file and waits ~2 minutes per package. A bootstrapper chaining a dozen MSIs
441
+ took 30+ minutes and looked like a hang, three times. Two lines in the guest remove it: the same run then
442
+ finished in **5.7 minutes with exit 0**. This also corrects the ADK lesson in Appendix G, which blamed
443
+ Defender scanning - Defender was switched off the whole time.
444
+ - **Fixed: nothing was visible inside the sandbox.** On this Sandbox build the `LogonCommand` process gets
445
+ no console window, so the 0.29.0 heartbeat went to a file nobody could see. There is now a top-most
446
+ progress window in the guest, the host mirrors it, and the runner measures whether a console exists at
447
+ all. Runs are cancellable with `STOP.txt` (guest shuts itself down in 5 s, no orphaned VM worker), a
448
+ failed VM start is no longer reported as "the VM was closed", and a timed-out action captures the guest's
449
+ process table and vendor logs before the VM is discarded.
450
+ - **Added: `Get-PsadtInstallerEngine.ps1`** - identifies the installer engine from the binary. A definitive
451
+ marker always beats a hint, so an install4j installer carrying NSIS branding no longer gets `/S`, which
452
+ hangs on its language dialog forever. Reports marker, byte offset and region; an unrecognised file
453
+ returns `unknown`, never a guess.
454
+ - **Added: `Get-PsadtSwitchCandidates.ps1` + `references/switch-catalog/`** - ranked switch candidates from
455
+ 19 engine defaults, offline, before the first web query, with a reason for every miss. It is an ENGINE
456
+ catalog, not an application catalog, and **winget stays opt-in** including as a research source.
457
+ - **Faster:** staging 481 MB into the guest via `robocopy /MT` (3.6 s to 0.6 s), `-Scenarios` for partial
458
+ iteration runs, per-action timeout default 900 s to 600 s. Suite 503 -> 551.
459
+ ### 0.29.1 - 2026-09-14
460
+ - **Fixed: Phase 5.5 mapped `Remove-MSIApplications` to `Remove-ADTApplication`**, which v4 does not
461
+ have - the v4 name is `Uninstall-ADTApplication`. The table's right column is now checked against the
462
+ installed toolkit's `FunctionsToExport`.
463
+ - **Fixed: Appendix A named 60012 as the v4 deferral code.** 4.1.x exits a deferral with
464
+ `UI.DeferExitCode`, default 1602. Deliberately NOT added to the mandatory Intune table - every install
465
+ command this skill writes runs `-DeployMode Silent`, where a deferral cannot happen.
466
+ - **Fixed: the Phase 4.3 MSI sample** put the `.mst` in `SupportFiles\` and passed an `-ArgumentList`
467
+ identical to the config defaults. The `.mst` belongs in `Files\` next to the MSI (`TRANSFORMSSECURE=1`);
468
+ extra properties go into `-AdditionalArgumentList`, because `-ArgumentList` REPLACES the defaults.
469
+ - **Fixed: README claimed 441 Pester tests** in three places. Suite 501 -> 503.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psadt-deploy-skill",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "description": "Installer for the psadt-deploy Claude Code skill: build, test and deploy PSADT v4.x Intune Win32 packages.",
5
5
  "keywords": [
6
6
  "psadt",