Compare commits

...

4 Commits

Author SHA1 Message Date
Jonah Schulte 2ef2c5d30d
Merge 98a24fe4a7 into c8ca083316 2026-02-12 23:49:03 +05:30
Davor Racic 98a24fe4a7
Merge branch 'main' into fix/cli-custom-content-config 2026-02-11 18:39:58 +01:00
Jonah Schulte b9b51cd3fe fix: address PR review feedback for CLI --custom-content config
- Use module display name in sources (name: moduleMeta.name || code)
- Add null guard for empty module.yaml (yaml.parse returns null)
- Remove unused paths property to match promptCustomContentSource shape
2026-02-11 10:17:20 -05:00
Jonah Schulte eeeea6f204 fix: add missing sources/selectedFiles to CLI --custom-content config
The non-interactive --custom-content CLI flag builds a customContentConfig
object missing the `sources`, `selected`, and `selectedFiles` properties
that the installer expects. This causes findModuleSource() to fail with
"Source for module X is not available" because customModulePaths is never
populated.

Align both CLI code paths (modify and fresh install flows) with the config
shape produced by the interactive promptCustomContentSource() method.

Fixes #1623
2026-02-10 22:03:36 -05:00
1 changed files with 30 additions and 2 deletions

View File

@ -305,6 +305,7 @@ class UI {
// Build custom content config similar to promptCustomContentSource
const customPaths = [];
const selectedModuleIds = [];
const selectedModuleMetas = [];
for (const customPath of paths) {
const expandedPath = this.expandUserPath(customPath);
@ -326,6 +327,11 @@ class UI {
continue;
}
if (!moduleMeta) {
await prompts.log.warn(`Skipping custom content path: ${customPath} - module.yaml is empty`);
continue;
}
if (!moduleMeta.code) {
await prompts.log.warn(`Skipping custom content path: ${customPath} - module.yaml missing 'code' field`);
continue;
@ -333,14 +339,22 @@ class UI {
customPaths.push(expandedPath);
selectedModuleIds.push(moduleMeta.code);
selectedModuleMetas.push(moduleMeta);
}
if (customPaths.length > 0) {
const sources = customPaths.map((p, i) => ({
path: p,
id: selectedModuleIds[i],
name: selectedModuleMetas[i].name || selectedModuleIds[i],
}));
customModuleResult = {
selectedCustomModules: selectedModuleIds,
customContentConfig: {
hasCustomContent: true,
paths: customPaths,
selected: true,
sources: sources,
selectedFiles: customPaths.map((p) => path.join(p, 'module.yaml')),
selectedModuleIds: selectedModuleIds,
},
};
@ -446,6 +460,7 @@ class UI {
// Build custom content config similar to promptCustomContentSource
const customPaths = [];
const selectedModuleIds = [];
const selectedModuleMetas = [];
for (const customPath of paths) {
const expandedPath = this.expandUserPath(customPath);
@ -467,6 +482,11 @@ class UI {
continue;
}
if (!moduleMeta) {
await prompts.log.warn(`Skipping custom content path: ${customPath} - module.yaml is empty`);
continue;
}
if (!moduleMeta.code) {
await prompts.log.warn(`Skipping custom content path: ${customPath} - module.yaml missing 'code' field`);
continue;
@ -474,12 +494,20 @@ class UI {
customPaths.push(expandedPath);
selectedModuleIds.push(moduleMeta.code);
selectedModuleMetas.push(moduleMeta);
}
if (customPaths.length > 0) {
const sources = customPaths.map((p, i) => ({
path: p,
id: selectedModuleIds[i],
name: selectedModuleMetas[i].name || selectedModuleIds[i],
}));
customContentConfig = {
hasCustomContent: true,
paths: customPaths,
selected: true,
sources: sources,
selectedFiles: customPaths.map((p) => path.join(p, 'module.yaml')),
selectedModuleIds: selectedModuleIds,
};
}