psadt-deploy-skill 0.48.0 → 0.49.1

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
@@ -63,6 +63,13 @@ upload confirmation). Everything else it researches and states as an assumption
63
63
 
64
64
  Details, flags, version pinning and requirements: [`docs/installation.md`](docs/installation.md).
65
65
 
66
+ **Uploading to Intune** needs an Entra app with the Microsoft Graph application permission
67
+ `DeviceManagementApps.ReadWrite.All`, admin-consented. `scripts/New-PsadtEntraApp.ps1` creates it in one
68
+ run; a Global Administrator or Privileged Role Administrator signs in once. Group management and
69
+ configuration policies are separate opt-in permissions. Everything before the upload, the Windows Sandbox
70
+ test included, needs no Entra permission. What each permission is for and what the script does:
71
+ [`SECURITY.md`](SECURITY.md#entra-permissions).
72
+
66
73
  ## How it works
67
74
 
68
75
  Thirteen phases, each owned by a script rather than by prose, so a step either passed or did not:
@@ -103,7 +110,7 @@ the same app from disagreeing about their own version.
103
110
  - **A dossier is produced every time**, uploaded or not: one self-contained bilingual HTML file with the
104
111
  return-code map, the detection rule, the hooks, the test results - and a ready-to-paste Company-Portal
105
112
  description.
106
- - **928 Pester tests**, including drift guards that fail when the documentation and the code disagree -
113
+ - **987 Pester tests**, including drift guards that fail when the documentation and the code disagree -
107
114
  one of them reads the published landing page and compares its figures against this repository.
108
115
 
109
116
  ## Go deeper
@@ -121,7 +128,7 @@ the same app from disagreeing about their own version.
121
128
  ## Status
122
129
 
123
130
  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 928 Pester tests.
131
+ verified against a live tenant. The helper scripts are covered by 987 Pester tests.
125
132
 
126
133
  One open point, honestly: **the driver `pnputil` exit-code semantics are documented, not verified here.**
127
134
  `0` / `259` / `3010` and the two `0xE...` failures come from Microsoft's documentation; confirming them
@@ -133,7 +140,9 @@ still open.
133
140
  This skill installs software as SYSTEM, researches on the open web, and writes to an Intune tenant
134
141
  through an Entra app with admin consent. [`SECURITY.md`](SECURITY.md) states that risk surface next to
135
142
  the control that already covers each part of it, and each control names the file that implements it and
136
- the test that enforces it - so a review can check the claims rather than take them.
143
+ the test that enforces it - so a review can check the claims rather than take them. The Entra
144
+ permissions the skill holds, and exactly what its setup script creates, are listed under
145
+ [Entra permissions](SECURITY.md#entra-permissions).
137
146
 
138
147
  Two deliberate non-features: the skill does **not** declare `allowed-tools` (that field pre-approves
139
148
  tools, it does not restrict them), and content fetched during research is treated as data, never as
@@ -141,9 +150,10 @@ instructions - see [`references/research-trust.md`](references/research-trust.md
141
150
 
142
151
  ## Roadmap
143
152
 
144
- **Sync finished packages to a GitHub repo** - a setup option (`output.target` = `local` / `git` / `both`)
145
- to push the per-app artifacts to a Git repo instead of, or in addition to, a local folder. Will need
146
- **Git LFS** for large `.intunewin` files. Have a request? Open an issue.
153
+ **Publish finished packages to a private GitHub repository** - per version, the package folder and the
154
+ output folder as two zipped release assets. The `.intunewin` stays out, because it is rebuilt from the
155
+ package folder. Private repositories only, credentials from the GitHub CLI, and a secret scan before
156
+ anything leaves the machine. Have a request? Open an issue.
147
157
 
148
158
  ## Contributing
149
159
 
@@ -170,7 +180,23 @@ installed.
170
180
  **[CHANGELOG.md](CHANGELOG.md)** carries the complete history, every release since 0.1.0, and nothing is
171
181
  ever removed from it.
172
182
 
173
- Latest: **0.48.0 - The figure guards only ever read the figures.** The landing page described a skill two
183
+ Latest: **0.49.1 - The permissions it asks for were written down nowhere a reader looks.** `SECURITY.md`
184
+ now lists every Entra permission the skill can use - with its flag, its purpose and the script behind it -
185
+ says who has to sign in, what `New-PsadtEntraApp.ps1` does step by step and how to revoke access, and the
186
+ README names what an upload needs. A sweep for other stale statements fixed the upload's supersedence
187
+ hint, which pointed at the portal instead of the script that records the change, and the dossier's English
188
+ view, which still showed German detection values and called the SYSTEM test "Phase 5.5". The JSON store
189
+ writer no longer loses an update silently when the file is held open, and runs under Windows PowerShell
190
+ 5.1 again.
191
+
192
+ Previously: **0.49.0 - The second version of an app started from a blank sheet.** Everything learned while
193
+ packaging an application - the switches that took an afternoon, the uninstaller that has to be renamed
194
+ first, the app mutex, the leftovers, both decision gates - was recorded in the manifest and then never
195
+ read again, because every store is keyed by the installer hash and a new version has a new hash.
196
+ `Get-PsadtPriorPackage.ps1` finds the previous package by application identity instead and offers what it
197
+ learned for confirmation. Purely additive: nothing that passes today starts failing.
198
+
199
+ Previously: **0.48.0 - The figure guards only ever read the figures.** The landing page described a skill two
174
200
  releases old, and the guards could not see it: every site assertion checked a number, never whether the
175
201
  list behind it was complete. The engine tile correctly said 19 while the table under it showed 14 rows.
176
202
  The pre-flight gate was described as ten checks and runs fourteen. Phase 9 still told the reader to wire
@@ -186,11 +212,3 @@ no longer hardcoded to `replace`, which uninstalled the previous version from ev
186
212
  is the default and the MSI's own Upgrade table decides. Two new scripts make the predecessor's id
187
213
  something you can read rather than retype, and Appendix R covers the lifecycle - including that Intune has
188
214
  no retire state at all.
189
-
190
- Previously: **0.46.0 - Sixteen findings, and the two the live run had already proved.** The last sixteen
191
- findings from the deep analysis. A full run on 0.45.0 had shown two of them for real: the dossier
192
- existed on disk while the manifest said nothing about it, and the package finished with no logo and no
193
- warning. The manifest now records what was produced, the three JSON stores are replaced atomically, the
194
- packaging tool and the four MSAL packages are verified before anything executes, the host re-checks the
195
- verdict the sandbox hands it, a generator no longer discards a hand-filled package without -Force, and
196
- an ampersand in a path no longer produces a sandbox that silently starts without its mapped folders.
package/bin/install.mjs CHANGED
@@ -95,8 +95,9 @@ async function main() {
95
95
  }
96
96
 
97
97
  // --- which ref ----------------------------------------------------------------------------------
98
- // Without --ref this installs the newest RELEASE TAG. The tag list is the only source: this repository
99
- // publishes tags rather than GitHub Releases, so /releases/latest answers 404 here.
98
+ // Without --ref this installs the newest RELEASE TAG. The tag list is the only source: GitHub Releases
99
+ // exist only from v0.46.0 on and are published on top of the tag, so /releases/latest would not see the
100
+ // tags before them and is deliberately not read.
100
101
  async function newestReleaseTag() {
101
102
  try {
102
103
  const res = await fetch(`https://api.github.com/repos/${REPO}/tags?per_page=100`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psadt-deploy-skill",
3
- "version": "0.48.0",
3
+ "version": "0.49.1",
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",