@hyperdrive.bot/bmad-workflow 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -390,10 +390,11 @@ export declare class WorkflowOrchestrator {
390
390
  /**
391
391
  * Execute QA phase
392
392
  *
393
- * Runs QA workflow on all stories in the QA folder.
393
+ * Runs QA workflow on stories matching the workflow prefix.
394
394
  * Dynamically imports and delegates to StoriesQaCommand.
395
395
  *
396
396
  * @param config - Workflow configuration
397
+ * @param detection - Input detection result for prefix resolution
397
398
  * @returns PhaseResult with success count, failures, and duration
398
399
  * @private
399
400
  */
@@ -402,6 +403,7 @@ export declare class WorkflowOrchestrator {
402
403
  * Execute QA phase if needed
403
404
  *
404
405
  * @param config - Workflow configuration
406
+ * @param detection - Input detection result for prefix resolution
405
407
  * @param devPhase - Dev phase result
406
408
  * @param shouldExecute - Whether to execute QA phase
407
409
  * @returns QA phase result
@@ -112,7 +112,7 @@ export class WorkflowOrchestrator {
112
112
  return this.buildFailureResult(startTime, epicPhase);
113
113
  }
114
114
  const { devPhase, storyPhase } = await this.executeStoryAndDevPhases(config, detection, epicPhase, phaseFlags, startTime);
115
- const qaPhase = await this.executeQaPhaseIfNeeded(config, devPhase, phaseFlags.shouldExecuteQaPhase);
115
+ const qaPhase = await this.executeQaPhaseIfNeeded(config, detection, devPhase, phaseFlags.shouldExecuteQaPhase);
116
116
  return this.buildSuccessResult(startTime, epicPhase, storyPhase, devPhase, qaPhase);
117
117
  }
118
118
  /**
@@ -1126,14 +1126,15 @@ Write output to: ${outputPath}`;
1126
1126
  /**
1127
1127
  * Execute QA phase
1128
1128
  *
1129
- * Runs QA workflow on all stories in the QA folder.
1129
+ * Runs QA workflow on stories matching the workflow prefix.
1130
1130
  * Dynamically imports and delegates to StoriesQaCommand.
1131
1131
  *
1132
1132
  * @param config - Workflow configuration
1133
+ * @param detection - Input detection result for prefix resolution
1133
1134
  * @returns PhaseResult with success count, failures, and duration
1134
1135
  * @private
1135
1136
  */
1136
- async executeQaPhase(config) {
1137
+ async executeQaPhase(config, detection) {
1137
1138
  const startTime = Date.now();
1138
1139
  const failures = [];
1139
1140
  let successCount = 0;
@@ -1143,8 +1144,9 @@ Write output to: ${outputPath}`;
1143
1144
  try {
1144
1145
  // Get QA story directory
1145
1146
  const qaStoryDir = await this.pathResolver.getQaStoryDir();
1146
- // Find all stories in QA folder
1147
- const storyPattern = '*.md';
1147
+ // Find stories matching the workflow prefix
1148
+ const prefix = this.resolvePrefix(config, detection);
1149
+ const storyPattern = `${prefix}-story-*.md`;
1148
1150
  const storyFiles = await this.fileManager.listFiles(qaStoryDir, storyPattern);
1149
1151
  if (storyFiles.length === 0) {
1150
1152
  this.logger.info('No stories found in QA folder, skipping QA phase');
@@ -1159,9 +1161,9 @@ Write output to: ${outputPath}`;
1159
1161
  this.logger.info({ storyCount: storyFiles.length }, 'Found stories for QA phase');
1160
1162
  // Dynamically import QA command to avoid circular dependencies
1161
1163
  const { default: StoriesQaCommand } = await import('../../commands/stories/qa.js');
1162
- // Process each story through QA
1164
+ // Process each story through QA (storyFile is already an absolute path from listFiles)
1163
1165
  for (const storyFile of storyFiles) {
1164
- const storyPath = `${qaStoryDir}/${storyFile}`;
1166
+ const storyPath = storyFile;
1165
1167
  this.logger.info({ storyPath }, 'Running QA workflow for story');
1166
1168
  try {
1167
1169
  // Build args for QA command
@@ -1229,12 +1231,13 @@ Write output to: ${outputPath}`;
1229
1231
  * Execute QA phase if needed
1230
1232
  *
1231
1233
  * @param config - Workflow configuration
1234
+ * @param detection - Input detection result for prefix resolution
1232
1235
  * @param devPhase - Dev phase result
1233
1236
  * @param shouldExecute - Whether to execute QA phase
1234
1237
  * @returns QA phase result
1235
1238
  * @private
1236
1239
  */
1237
- async executeQaPhaseIfNeeded(config, devPhase, shouldExecute) {
1240
+ async executeQaPhaseIfNeeded(config, detection, devPhase, shouldExecute) {
1238
1241
  if (!shouldExecute || !devPhase || devPhase.success === 0) {
1239
1242
  return this.createSkippedPhaseResult('qa');
1240
1243
  }
@@ -1242,7 +1245,7 @@ Write output to: ${outputPath}`;
1242
1245
  this.logger.info('[DRY RUN] Would execute QA phase');
1243
1246
  return this.createSkippedPhaseResult('qa');
1244
1247
  }
1245
- return this.executeQaPhase(config);
1248
+ return this.executeQaPhase(config, detection);
1246
1249
  }
1247
1250
  /**
1248
1251
  * Execute dev phase in sequential mode
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hyperdrive.bot/bmad-workflow",
3
3
  "description": "AI-driven development workflow orchestration CLI for BMAD projects",
4
- "version": "1.0.12",
4
+ "version": "1.0.13",
5
5
  "author": {
6
6
  "name": "DevSquad",
7
7
  "email": "marcelo@devsquad.email",