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 +37 -25
- package/bin/install.mjs +3 -2
- package/package.json +1 -1
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
|
-
- **
|
|
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
|
|
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
|
-
**
|
|
145
|
-
|
|
146
|
-
|
|
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.
|
|
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:
|
|
99
|
-
//
|
|
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`, {
|