/** * `dench apps validate` — static checks for a `.dench.app` folder. * * Pure: takes the manifest text and the app's text files, returns findings. * The CLI (`cli/apps.ts`) reads the folder (disk or workspace) and prints. * * What it catches — every one of these has shipped as a broken app before: * • a `dench..(` call that does not exist on `window.dench` * (with the namespace's real methods as the hint), * • a call whose permission the manifest does not declare, * • `dench.api.call("")` / `dench.api.a.b.c(` for an id that is not a * public `/api/v1` operation (or is CLI-local), * • removed APIs (`dench.db.*`), deprecated aliases (`dench.apps.send`), * • unknown permission scopes in the manifest, * • same-origin `fetch("/api/…")` (bypasses the bridge) and external * `