psadt-deploy-skill 0.43.0 → 0.46.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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- <h1 align="center">PSADT v4 → Intune Deployment Skill</h1>
1
+ <h1 align="center">PSADT v4 → Intune Deployment Skill</h1>
2
2
 
3
3
  <p align="center">
4
4
  <em>A Claude Code skill that drives the full lifecycle of a PowerShell App Deployment Toolkit (PSADT) v4.x Intune Win32 package - from first conversation to a tested, upload-ready <code>.intunewin</code>.</em>
@@ -73,7 +73,7 @@ Thirteen phases, each owned by a script rather than by prose, so a step either p
73
73
  | **1-2** Intake + research | blocker questions as clickable options; a local-evidence ladder (installed here? binary here? already written down?) answers what it can, and a research agent is dispatched only per question it leaves open | agent (gates 1-2) |
74
74
  | **3** Scaffold | a generator writes launcher + detection + per-run log name + manifest | `New-MsiPackage` · `New-ExePackage` · `New-BrowserExtensionPackage` · `New-WindowsFeaturePackage` · `New-DriverPackage` |
75
75
  | **4** Customize | all three hooks filled from the research, helpers in the Extensions module | agent |
76
- | **5** Pre-flight | 11 checks (encoding, AST parse, v3 cmdlets, structure, detection contract, manifest, log name, driver trust …) → GREEN/RED | `Invoke-PsadtPreflight.ps1` |
76
+ | **5** Pre-flight | 14 checks (encoding, AST parse, v3 cmdlets, structure, detection contract, manifest, log name, driver trust …) → GREEN/RED | `Invoke-PsadtPreflight.ps1` |
77
77
  | **6** SYSTEM test | the whole loop in a throwaway Windows Sandbox, every action as **SYSTEM** like the IME does - no elevation, host untouched. **Binding before any upload** | `Invoke-PsadtSandboxTest.ps1` |
78
78
  | **7** Package | one command → verified `.intunewin`, named after the app | `Invoke-PsadtPackage.ps1` |
79
79
  | **8** Dossier | always, uploaded or not: bilingual self-contained HTML | `New-PsadtReport.ps1` |
@@ -103,7 +103,7 @@ the same app from disagreeing about their own version.
103
103
  - **A dossier is produced every time**, uploaded or not: one self-contained bilingual HTML file with the
104
104
  return-code map, the detection rule, the hooks, the test results - and a ready-to-paste Company-Portal
105
105
  description.
106
- - **757 Pester tests**, including drift guards that fail when the documentation and the code disagree -
106
+ - **859 Pester tests**, including drift guards that fail when the documentation and the code disagree -
107
107
  one of them reads the published landing page and compares its figures against this repository.
108
108
 
109
109
  ## Go deeper
@@ -121,7 +121,7 @@ the same app from disagreeing about their own version.
121
121
  ## Status
122
122
 
123
123
  In active use for the full build → package → test → dossier workflow, with the direct Graph upload
124
- verified against a live tenant. The helper scripts are covered by 757 Pester tests.
124
+ verified against a live tenant. The helper scripts are covered by 859 Pester tests.
125
125
 
126
126
  One open point, honestly: **the driver `pnputil` exit-code semantics are documented, not verified here.**
127
127
  `0` / `259` / `3010` and the two `0xE...` failures come from Microsoft's documentation; confirming them
@@ -170,12 +170,10 @@ installed.
170
170
  **[CHANGELOG.md](CHANGELOG.md)** carries the complete history, every release since 0.1.0, and nothing is
171
171
  ever removed from it.
172
172
 
173
- Latest: **0.43.0 - The command that writes to the tenant could not bind.** A deep analysis of 0.42.0 read
174
- every control `SECURITY.md` claims, packaged an app end to end and ran the suite; its five stop-ship
175
- findings are fixed here. The Phase 9 upload command shown in `SKILL.md` could not bind, because
176
- `-IntuneWinPath` was mandatory while the artifact had been in the manifest since Phase 7 - and a new guard
177
- now binds every invocation the control plane shows against the real parameter sets. The third-party WinGet
178
- module that ships inside the `.intunewin` is pinned by SHA256 instead of a two-byte header. Three operator
179
- values that reached scripts running as SYSTEM are escaped or validated. A legacy config can no longer be
180
- written to, so the secret cannot be created inside the skill folder. The dossier template no longer names a
181
- customer.
173
+ Latest: **0.46.0 - Sixteen findings, and the two the live run had already proved.** The last sixteen
174
+ findings from the deep analysis. A full run on 0.45.0 had shown two of them for real: the dossier
175
+ existed on disk while the manifest said nothing about it, and the package finished with no logo and no
176
+ warning. The manifest now records what was produced, the three JSON stores are replaced atomically, the
177
+ packaging tool and the four MSAL packages are verified before anything executes, the host re-checks the
178
+ verdict the sandbox hands it, a generator no longer discards a hand-filled package without -Force, and
179
+ an ampersand in a path no longer produces a sandbox that silently starts without its mapped folders.
package/bin/install.mjs CHANGED
@@ -222,8 +222,12 @@ async function main() {
222
222
  // The ref is recorded next to the sha because Update-PsadtSkill.ps1 cannot otherwise tell a
223
223
  // release-pinned installation from one tracking main, and would report a pinned machine as
224
224
  // permanently "behind" every time main moved.
225
- // -Command, not -File: -File passes every argument as a string and -Updates wants a hashtable.
226
- run(psExe, [...psBase, '-Command', `& '${setCfg}' -Updates @{'tooling.skillCommit'='${sha}'; 'tooling.skillRef'='${ref}'}`]);
225
+ // -Command, not -File: -File stringifies every argument and -Updates wants a hashtable. The
226
+ // VALUES travel as environment variables, never interpolated into the source: a ref or a home
227
+ // directory containing an apostrophe would otherwise close the literal and run what follows.
228
+ run(psExe, [...psBase, '-Command',
229
+ "& $env:PSADT_SETCFG -Updates @{'tooling.skillCommit'=$env:PSADT_SHA; 'tooling.skillRef'=$env:PSADT_REF}"],
230
+ { env: { ...process.env, PSADT_SETCFG: setCfg, PSADT_SHA: sha, PSADT_REF: ref } });
227
231
  console.log(` OK recorded commit ${sha.slice(0, 7)} at ref ${ref}`);
228
232
  }
229
233
  } else if (res.status === 404) {
@@ -254,7 +258,8 @@ async function main() {
254
258
  // -Command with Out-Null rather than -File: the doctor also RETURNS its result object, and with inherited
255
259
  // stdout that object gets dumped underneath its own table. Out-Null drops the object; Write-Host output
256
260
  // (the table) is unaffected.
257
- const d = run(psExe, [...psBase, '-Command', `& '${doctor}' -Fix -JsonPath '${jsonPath}' | Out-Null`]);
261
+ const d = run(psExe, [...psBase, '-Command', '& $env:PSADT_DOCTOR -Fix -JsonPath $env:PSADT_JSON | Out-Null'],
262
+ { env: { ...process.env, PSADT_DOCTOR: doctor, PSADT_JSON: jsonPath } });
258
263
 
259
264
  let verdict = null;
260
265
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psadt-deploy-skill",
3
- "version": "0.43.0",
3
+ "version": "0.46.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",