Give CustomModules its own install() method with independent
file-copy-with-filtering logic. Route _installCustomModules
through CustomModules.install() instead of OfficialModules.
Remove custom.yaml reading and sourcePath/isCustom options from
OfficialModules.install(). Eliminate _buildModuleLists — compute
official vs custom module IDs inline from discoverPaths results.
Remove all legacy/v4 detection and migration code. Replace stateless
Detector class with immutable ExistingInstall that exposes a static
detect() factory and precomputed query properties (moduleIds, ides).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
discoverPaths now sets this.paths internally instead of returning
a Map that the caller feeds back via setPaths. Remove setPaths
and all 5 no-op setPaths calls in installer.js.