# Pre-release checklist Things that must change before this tool is shared with anyone outside your own machine. Track these like blockers — at minimum, the auth and manifest items are non-negotiable. ## 1. Entra app registration — no longer required An earlier version of this checklist opened with an app-registration blocker, on the reasoning that a browser auth-code flow needs an `spa` redirect URI that a Microsoft-owned app can't have, so the pane had to ship its own registration. It ended by noting the one alternative: *stop authenticating in the browser entirely and broker tokens through a local dvload process.* That is now what happens. `dvload serve` holds the auth and the UI fetches tokens from it same-origin, so there is no client id in the UI bundle and nothing to register. Both front ends use the CLI's client-id chain: shared Microsoft client first, dvload's own app as fallback. See [docs/AUTH-NOTES.md](./docs/AUTH-NOTES.md). **Nothing here is a release blocker any more.** Optional, if you want your own identity on the consent screen for branding, Conditional Access targeting, or auditability: - Register a **public client** (Entra admin center → App registrations → New registration), multi-tenant, redirect URI `http://localhost` under *Public client / native*. No `spa` redirect URI is needed — nothing authenticates from a browser. - Authentication → Allow public client flows: **Yes** - API permissions → Add → Dynamics CRM → user_impersonation (delegated) - Branding & properties → publisher name, support URL, privacy statement, terms of service. These show on the consent screen. - Point dvload at it with `DATAVERSE_LOAD_CLIENT_ID`, or change `DVLOAD_CLIENT_ID` in `packages/cli/src/auth.ts` to change only the fallback. Note that pinning a client id **disables the shared-client chain**, so your app must have `http://localhost` registered or sign-in fails with `AADSTS900971`. **Confidential client (app-only flow) — optional.** Only needed if you want `app-login` to work without users having to register their own Entra app first. Most tools omit this from the default install and have power users register their own; that's fine. ## How to know you're not ready yet - `dvload serve` fails with "could not find the built add-in UI" — the release bundle is missing `build/web`. Run the add-in build before `npm run bundle`; the bundle step warns loudly about this. - `npm --workspace=@dvload/addin run validate` rejects the manifest. - The pane shows an informational note naming *Microsoft Dynamics CRM*. That one is **not** a blocker — it is the shared-client default doing its job, and it's shown so the attribution isn't a surprise. ## 2. Office add-in manifest `packages/addin/manifest.xml` is currently a dev manifest. Before sideloading anywhere outside your machine, and definitely before AppSource submission: - Replace `00000000-0000-0000-0000-000000000000` with a real GUID. Generate with `[guid]::NewGuid()` in PowerShell or `uuidgen`. (`manifest.prod.xml` already has one — ship that.) - Leave the `https://localhost:44321/...` URLs alone. The pane is served by `dvload serve` on loopback, so there is no production host to point at; that's deliberate, and it's what keeps the install admin-free. If you change the port, change it in both manifests and pass `--port` to `serve`. - Update ``, ``, ``, ``, and the resources at the bottom (`GetStarted.Title`, `GetStarted.Description`, `GetStarted.LearnMoreUrl`, etc.). - Add real 16x16, 32x32, and 80x80 icons under `packages/addin/assets/` and verify they load. - Validate the manifest: `npm --workspace=@dvload/addin run validate`. ## 3. AppSource submission (only if listing publicly) > **Read this before starting.** AppSource is a poor fit for the current > design: a listed add-in must load from a public HTTPS host, and this one > loads from the user's own machine and requires a companion CLI to be > running. Centralized Deployment for known orgs, or plain sideloading, > both work fine. Listing publicly would mean reintroducing a hosted pane > and therefore its own app registration and admin consent — the thing the > sidecar exists to avoid. Excel for the web and iPad are out for the same > reason: no loopback. - Add a privacy policy and terms of service hosted somewhere durable. - Test the add-in in Excel desktop (Win + Mac). - Submit through Partner Center → Office Add-ins. - Expect 5–10 business days for review; reviewers do test data ops, so make sure a tester Dataverse environment is reachable. ## 4. CLI distribution Mechanics are automated — `.github/workflows/release.yml` verifies, builds the SEA exe with the UI embedded, signs it, smoke-tests it, and attaches it plus a SHA-256 to the release. Full detail in [packaging/README.md](./packaging/README.md). What still needs a human: - **Set up code signing before the first public tag.** The `Sign` step is wired for Azure Trusted Signing but skips itself until the `AZURE_*` secrets and variables exist, and an unsigned exe means SmartScreen for every user. Check the workflow log said `Signature status: Valid`. - Push the tag (`v`) — nothing releases without one. - After the release exists: `npm run stamp-release -- `, then submit the winget PR and update the Scoop bucket. Neither hash can be filled in beforehand. - `npm publish --workspace=dvload` if the npm path is being kept in sync. - Confirm the README's install instructions still match reality — they say `winget install dvload`, which is only true once the manifest lands. ## 5. Reproducible builds - Pin `engines.node` in `package.json` (already done). - Commit a `package-lock.json`. Don't .gitignore it. - Add a CI build (GitHub Actions: `npm ci && npm run build`) to keep the scaffold honest as you change things. ## 6. Documentation - Check that README's "Quick start (delegated)" section still matches reality: shared Microsoft client by default, own-app fallback, `DVLOAD_NO_SHARED_CLIENT=1` to opt out. - Add a CHANGELOG.md with at least the v0.1.0 entry. - Add a LICENSE file. MIT is the path of least resistance. ## 6b. Power Platform ToolBox tool (only if shipping it this release) - Decide the npm scope: `packages/pptb/tool.package.json` publishes as `@dvload/pptb` — the scope must exist and be yours, or rename first. - Version in `tool.package.json` bumped in step with the release. - `npm run build --workspace=@dvload/pptb`, load `dist/` through the ToolBox Debug menu, and run TEST-PROTOCOL §19b against a sandbox. - Publish from `packages/pptb/dist` (NOT the workspace root — the workspace package.json is the private build harness), then submit/refresh the entry on the powerplatformtoolbox.com Tool Submission Form. ## 7. Sanity checks before tagging v1 - `dvload whoami --env ` names a client id you recognise. - `DVLOAD_NO_SHARED_CLIENT=1 dvload login` succeeds against a real tenant, proving the own-app fallback path actually works and isn't just dead code. - Add-in does NOT show the yellow `Dev mode` banner. - Browser console on add-in load does NOT log `[dvload dev mode]`. - Manifest GUID is not all zeros. - Manifest URLs do not contain `localhost`. - `dvload run-all .dvplan.json` validates alternate-key links and executes staged dependencies as expected. - `dvload addin start` successfully launches the local add-in workflow in a dev clone. If all of the above are true, you're shippable.