DF0066: Service Already Installed
Message
Service "
{package}" is already installed — keeping the first installation and ignoring this one's options.
Cause
Wire services are deduplicated by npm package name: the first installation wins, and later installs of the same package return the existing node API. Option sets from multiple installers only merge before the ctx.services.ready() barrier fires — an install that arrives after the service was constructed can no longer influence its configuration, so any options it carried are dropped with this warning.
Example
ts
await ctx.services.ready()
// ✗ The service is already constructed; { themes } is ignored.
await ctx.services.install(createShikiService({ themes }))Fix
Install the service (or declare it in DevframeDefinition.services) before the barrier — a host's explicit installs during setup/configure naturally run before the adapter fires ready(), so its options join the merge:
ts
await initHub({
async configure(ctx) {
ctx.services.install(createShikiService({ themes })) // ✓ merges
},
})Source
packages/devframe/src/node/host-services.ts—install()/the barrier flush warn when an already-installed package is installed again.