check:manifest-covers knows a desktop-only bundle is not in the web tree

rudder-voice targets desktop and widget, so generate-tree skips it through isWebBuilt(); this
check did not, and reported the deliberate absence as a missing plugin. It reads the same rule now.
This commit is contained in:
Doxa Maps 2026-09-28 14:16:21 +00:00
parent f45624915f
commit bd37adacdd

View file

@ -36,6 +36,7 @@ import { resolve, dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { discoverSpaRegistry } from './plugin-gallery/discover.mjs'
import { TREE_NAME } from './_tree-name.mjs'
import { isWebBuilt } from './plugin-targets.mjs'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
const MANIFEST = join(ROOT, 'public', TREE_NAME, 'manifest.json')
@ -84,6 +85,13 @@ try {
gated = Array.isArray(cfg.gatedProfiles) ? cfg.gatedProfiles.map(String) : []
} catch { gated = [] }
// ★ AND A FOURTH: a bundle whose every profile targets something other than the web (Rudder:
// desktop + widget) is built by desktop:build, never into the tree. generate-tree and run-parallel
// skip it through the same isWebBuilt(); read it here too, or its deliberate absence reads as the
// silent-omission bug this gate exists for.
const nonWeb = registry.filter(b => !isWebBuilt(join(ROOT, 'plugin-designs', b.bundle))).map(b => b.bundle)
gated = [...gated, ...nonWeb]
const manifest = JSON.parse(readFileSync(MANIFEST, 'utf8'))
const listed = new Map((manifest.bundles || []).map(b => [b.bundle, (b.profiles || []).length]))
const found = new Map(