psadt-deploy-skill 0.49.0 → 0.49.2

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
- - **968 Pester tests**, including drift guards that fail when the documentation and the code disagree -
113
+ - **1088 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 968 Pester tests.
131
+ verified against a live tenant. The helper scripts are covered by 1088 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,27 @@ 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.49.0 - The second version of an app started from a blank sheet.** Everything learned while
183
+ Latest: **0.49.2 - A live two-version run found the skill contradicting itself.** Packaging one app
184
+ twice, end to end, exposed four places where the skill said one thing and did another. The Windows
185
+ Sandbox kept the package folder
186
+ mapped for the whole run, so the manifest writes of Phases 7 and 8 - done in that same window by design -
187
+ failed; the VM now tests a snapshot, and an edit made meanwhile is named instead of tested around. The
188
+ research ladder never read what the previous version had answered; it now carries those answers for
189
+ confirmation, and the agent budget of the real second version dropped from 2 to 0. The Gate 2 close
190
+ prompt never reached the command line; the generators record it, and the upload, the dossier and the
191
+ sandbox all read it. The logo lookup now waits for the render, repairs a missing `viewBox` and measures
192
+ what the picture holds.
193
+
194
+ Previously: **0.49.1 - The permissions it asks for were written down nowhere a reader looks.** `SECURITY.md`
195
+ now lists every Entra permission the skill can use - with its flag, its purpose and the script behind it -
196
+ says who has to sign in, what `New-PsadtEntraApp.ps1` does step by step and how to revoke access, and the
197
+ README names what an upload needs. A sweep for other stale statements fixed the upload's supersedence
198
+ hint, which pointed at the portal instead of the script that records the change, and the dossier's English
199
+ view, which still showed German detection values and called the SYSTEM test "Phase 5.5". The JSON store
200
+ writer no longer loses an update silently when the file is held open, and runs under Windows PowerShell
201
+ 5.1 again.
202
+
203
+ Previously: **0.49.0 - The second version of an app started from a blank sheet.** Everything learned while
174
204
  packaging an application - the switches that took an afternoon, the uninstaller that has to be renamed
175
205
  first, the app mutex, the leftovers, both decision gates - was recorded in the manifest and then never
176
206
  read again, because every store is keyed by the installer hash and a new version has a new hash.
@@ -183,21 +213,3 @@ list behind it was complete. The engine tile correctly said 19 while the table u
183
213
  The pre-flight gate was described as ten checks and runs fourteen. Phase 9 still told the reader to wire
184
214
  supersedence themselves. The page is corrected, three wrong statements in the repo with it, and the
185
215
  guards now compare lists name-by-name instead of counting.
186
-
187
- Previously: **0.47.0 - The supersedence this skill has been wiring may never have been wired.** The upload has
188
- POSTed a supersedence relationship since 0.8.x, on a route that is reported not to exist, catching the
189
- failure and printing a yellow line - so a chain that never took looked like a normal run. No test touched
190
- any of it. The write now uses the `updateRelationships` action the admin center uses, merges onto the
191
- existing relationships instead of replacing them, and reads the chain back before claiming it. The mode is
192
- no longer hardcoded to `replace`, which uninstalled the previous version from every device first; `update`
193
- is the default and the MSI's own Upgrade table decides. Two new scripts make the predecessor's id
194
- something you can read rather than retype, and Appendix R covers the lifecycle - including that Intune has
195
- no retire state at all.
196
-
197
- Previously: **0.46.0 - Sixteen findings, and the two the live run had already proved.** The last sixteen
198
- findings from the deep analysis. A full run on 0.45.0 had shown two of them for real: the dossier
199
- existed on disk while the manifest said nothing about it, and the package finished with no logo and no
200
- warning. The manifest now records what was produced, the three JSON stores are replaced atomically, the
201
- packaging tool and the four MSAL packages are verified before anything executes, the host re-checks the
202
- verdict the sandbox hands it, a generator no longer discards a hand-filled package without -Force, and
203
- 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.49.0",
3
+ "version": "0.49.2",
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",