Add or remove a module
Modules can be composed into a generated application at create time (via --with) or after generation using the add-module and remove-module scripts.
List available modules
npx tsx adapters/acme-vue-encore/scripts/add-module.ts --list
This prints the module catalog with names, versions, statuses, and descriptions.
Add a module to an existing app
Navigate to the factory-encore repository and run:
npx tsx adapters/acme-vue-encore/scripts/add-module.ts \
user-management \
--root ../my-app
The composition engine:
- Validates the module manifest and checks for conflicts.
- Auto-installs dependencies (e.g.,
api-gatewayrequiressecurity-core). - Copies service directories from the module's
files/into the application. - Merges database migrations into
apps/api/db/migrations/. - Binds secrets into
apps/api/lib/secrets.tsandinfra.config.json. - Merges CORS entries into
encore.app. - Updates
template.jsonto track the installed module set. - Regenerates
apps/web/src/modules.tsfor frontend navigation. - Merges environment variables into
.env.example. - Runs
npm install(unless--no-install).
Preview changes with dry-run
npx tsx adapters/acme-vue-encore/scripts/add-module.ts \
api-gateway \
--root ../my-app \
--dry-run
This shows exactly what files would be created, modified, or merged without making changes.
Remove a module
npx tsx adapters/acme-vue-encore/scripts/remove-module.ts \
user-management \
--root ../my-app
The decomposition engine:
- Checks reverse dependencies (refuses removal if other modules depend on it).
- Refuses removal of always-on modules.
- Deletes owned files and cleans empty directories.
- Decomposes Encore services, migrations, secrets, and CORS using recorded
composedMigrations. - Updates
template.json. - Comments out (does not delete) environment variables.
If the installation lacks a composedMigrations record (legacy install), the engine emits a visible warning and skips migration deletion rather than silently omitting it.
Handling conflicts
Modules declare conflicts in their manifest. When you add a module that conflicts with an already-installed module:
- The conflicting module is auto-removed before the new module is composed.
- A warning is printed showing what was removed.
Dependency resolution
Modules declare requires (hard dependencies) and requiresOneOf (at least one must be present):
- Hard dependencies are auto-installed recursively.
requiresOneOfis validated but not auto-resolved (you must install one manually).
Validate module state
After adding or removing modules, validate the project's module state:
npx tsx adapters/acme-vue-encore/scripts/validate-modules.ts \
--root ../my-app
This checks that template.json is consistent, all referenced files exist, and dependency/conflict rules are satisfied.