diff --git a/src/bmm/workflows/document-project/workflows/deep-dive.yaml b/src/bmm/workflows/document-project/workflows/deep-dive.yaml index d91105112..4a7867c20 100644 --- a/src/bmm/workflows/document-project/workflows/deep-dive.yaml +++ b/src/bmm/workflows/document-project/workflows/deep-dive.yaml @@ -7,7 +7,7 @@ author: "BMad" parent_workflow: "{project-root}/_bmad/bmm/workflows/document-project/workflow.md" # Critical variables inherited from parent -config_source: "{project-root}/_bmad/bmb/config.yaml" +config_source: "{project-root}/_bmad/bmm/config.yaml" output_folder: "{config_source}:output_folder" user_name: "{config_source}:user_name" date: system-generated diff --git a/src/bmm/workflows/document-project/workflows/full-scan.yaml b/src/bmm/workflows/document-project/workflows/full-scan.yaml index c131bb00d..e2e73824e 100644 --- a/src/bmm/workflows/document-project/workflows/full-scan.yaml +++ b/src/bmm/workflows/document-project/workflows/full-scan.yaml @@ -7,7 +7,7 @@ author: "BMad" parent_workflow: "{project-root}/_bmad/bmm/workflows/document-project/workflow.md" # Critical variables inherited from parent -config_source: "{project-root}/_bmad/bmb/config.yaml" +config_source: "{project-root}/_bmad/bmm/config.yaml" output_folder: "{config_source}:output_folder" user_name: "{config_source}:user_name" date: system-generated diff --git a/test/test-installation-components.js b/test/test-installation-components.js index b0bded006..47410e9b4 100644 --- a/test/test-installation-components.js +++ b/test/test-installation-components.js @@ -15,6 +15,8 @@ const path = require('node:path'); const fs = require('fs-extra'); const { YamlXmlBuilder } = require('../tools/cli/lib/yaml-xml-builder'); const { ManifestGenerator } = require('../tools/cli/installers/lib/core/manifest-generator'); +const { WorkflowCommandGenerator } = require('../tools/cli/installers/lib/ide/shared/workflow-command-generator'); +const { BMAD_FOLDER_NAME } = require('../tools/cli/installers/lib/ide/shared/path-utils'); // ANSI colors const colors = { @@ -207,6 +209,24 @@ async function runTests() { console.log(''); + // ============================================================ + // Test 4: Workflow Command Generator Defaults + // ============================================================ + console.log(`${colors.yellow}Test Suite 4: Workflow Generator Defaults${colors.reset}\n`); + + try { + const workflowGenerator = new WorkflowCommandGenerator(); + assert( + workflowGenerator.bmadFolderName === BMAD_FOLDER_NAME, + 'Workflow generator default BMAD folder matches shared constant', + `Expected "${BMAD_FOLDER_NAME}", got "${workflowGenerator.bmadFolderName}"`, + ); + } catch (error) { + assert(false, 'Workflow generator default path is valid', error.message); + } + + console.log(''); + // ============================================================ // Test 5: QA Agent Compilation // ============================================================ @@ -236,6 +256,36 @@ async function runTests() { console.log(''); + // ============================================================ + // Test 9: Guard against incorrect module config references + // ============================================================ + console.log(`${colors.yellow}Test Suite 9: BMM Config Reference Guard${colors.reset}\n`); + + try { + const searchTargets = [path.join(projectRoot, 'src', 'bmm', 'workflows', 'document-project', 'workflows')]; + const allowedExtensions = new Set(['.yaml', '.yml']); + const forbiddenRef = '{project-root}/_bmad/bmb/config.yaml'; + const offenders = []; + + const files = await collectFiles(searchTargets, allowedExtensions); + for (const fullPath of files) { + const content = await fs.readFile(fullPath, 'utf8'); + if (content.includes(forbiddenRef)) { + offenders.push(path.relative(projectRoot, fullPath)); + } + } + + assert( + offenders.length === 0, + 'No bmm workflow configs should reference _bmad/bmb/config.yaml', + offenders.length > 0 ? offenders.join(', ') : '', + ); + } catch (error) { + assert(false, 'BMM config reference guard runs', error.message); + } + + console.log(''); + // ============================================================ // Test 6: Guard against advanced-elicitation XML references // ============================================================ diff --git a/tools/cli/installers/lib/ide/shared/workflow-command-generator.js b/tools/cli/installers/lib/ide/shared/workflow-command-generator.js index 91231434a..d368ac7f5 100644 --- a/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +++ b/tools/cli/installers/lib/ide/shared/workflow-command-generator.js @@ -2,13 +2,13 @@ const path = require('node:path'); const fs = require('fs-extra'); const csv = require('csv-parse/sync'); const chalk = require('chalk'); -const { toColonPath, toDashPath, customAgentColonName, customAgentDashName } = require('./path-utils'); +const { toColonPath, toDashPath, customAgentColonName, customAgentDashName, BMAD_FOLDER_NAME } = require('./path-utils'); /** * Generates command files for each workflow in the manifest */ class WorkflowCommandGenerator { - constructor(bmadFolderName = 'bmad') { + constructor(bmadFolderName = BMAD_FOLDER_NAME) { this.templatePath = path.join(__dirname, '../templates/workflow-commander.md'); this.bmadFolderName = bmadFolderName; }