Compare commits

...

5 Commits

Author SHA1 Message Date
Phil 72bc56af4f
Merge c46453259f into 79959e75ac 2026-01-24 22:24:30 -05:00
Alex Verkhovsky 79959e75ac
fix(quick-flow): standardize menu shortcuts for intuitive UX (#1401)
* fix(quick-spec): change menu shortcuts to avoid Approve/Advanced confusion

Users were typing 'a' expecting to Approve (since it starts with A) but
triggering Advanced Elicitation instead. Changed shortcuts to:
- [C] Continue (was [Y] Approve)
- [E] Edit (was [C] Changes)

This keeps [A] for Advanced Elicitation consistent with other workflows.

Fixes user-reported UX issue with confusing menu shortcuts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(quick-dev): standardize menu shortcuts to use intuitive letters

- Change [T] to [P] for "Plan first" (P matches the label)
- Change [1][2][3] to [W][F][S] for findings resolution:
  - [W] Walk through
  - [F] Fix automatically
  - [S] Skip

Consistent with letter-based menu pattern used elsewhere.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:15:01 -06:00
Brian c46453259f
Merge branch 'main' into dir-install-flag 2026-01-24 19:46:50 -06:00
Phil 83ed3a978d
Merge branch 'main' into dir-install-flag 2026-01-23 13:09:19 -05:00
Phil Mahncke 3dd05b0584 feat: enhance install command with directory option and update prompt logic
Added a new CLI option for specifying the target project directory, allowing users to skip the interactive prompt. Updated the installation prompt method to accept options and handle directory validation accordingly.
2026-01-22 22:31:13 -05:00
5 changed files with 43 additions and 25 deletions

View File

@ -88,11 +88,11 @@ Use holistic judgment, not mechanical keyword matching.
### No Escalation (simple request) ### No Escalation (simple request)
Display: "**Select:** [T] Plan first (tech-spec) [E] Execute directly" Display: "**Select:** [P] Plan first (tech-spec) [E] Execute directly"
#### Menu Handling Logic: #### Menu Handling Logic:
- IF T: Direct user to `{quick_spec_workflow}`. **EXIT Quick Dev.** - IF P: Direct user to `{quick_spec_workflow}`. **EXIT Quick Dev.**
- IF E: Ask for any additional guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md` - IF E: Ask for any additional guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
#### EXECUTION RULES: #### EXECUTION RULES:
@ -108,13 +108,13 @@ Present: "This looks like a focused feature with multiple components."
Display: Display:
**[T] Create tech-spec first** (recommended) **[P] Plan first (tech-spec)** (recommended)
**[W] Seems bigger than quick-dev** - Recommend the Full BMad Flow PRD Process **[W] Seems bigger than quick-dev** - Recommend the Full BMad Flow PRD Process
**[E] Execute directly** **[E] Execute directly**
#### Menu Handling Logic: #### Menu Handling Logic:
- IF T: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.** - IF P: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
- IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.** - IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
- IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md` - IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
@ -132,12 +132,12 @@ Present: "This sounds like platform/system work."
Display: Display:
**[W] Start BMad Method** (recommended) **[W] Start BMad Method** (recommended)
**[T] Create tech-spec** (lighter planning) **[P] Plan first (tech-spec)** (lighter planning)
**[E] Execute directly** - feeling lucky **[E] Execute directly** - feeling lucky
#### Menu Handling Logic: #### Menu Handling Logic:
- IF T: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.** - IF P: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
- IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.** - IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
- IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md` - IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
@ -154,7 +154,7 @@ Display:
- Mode A (tech-spec): "**NEXT:** read fully and follow: `step-03-execute.md`" - Mode A (tech-spec): "**NEXT:** read fully and follow: `step-03-execute.md`"
- Mode B (direct, [E] selected): "**NEXT:** Read fully and follow: `step-02-context-gathering.md`" - Mode B (direct, [E] selected): "**NEXT:** Read fully and follow: `step-02-context-gathering.md`"
- Escalation ([T] or [W]): "**EXITING Quick Dev.** Follow the directed workflow." - Escalation ([P] or [W]): "**EXITING Quick Dev.** Follow the directed workflow."
--- ---

View File

@ -29,15 +29,15 @@ Present: "How would you like to handle these findings?"
Display: Display:
**[1] Walk through** - Discuss each finding individually **[W] Walk through** - Discuss each finding individually
**[2] Auto-fix** - Automatically fix issues classified as "real" **[F] Fix automatically** - Automatically fix issues classified as "real"
**[3] Skip** - Acknowledge and proceed to commit **[S] Skip** - Acknowledge and proceed to commit
### Menu Handling Logic: ### Menu Handling Logic:
- IF 1: Execute OPTION 1 (Walk Through) below - IF W: Execute WALK THROUGH section below
- IF 2: Execute OPTION 2 (Auto-fix) below - IF F: Execute FIX AUTOMATICALLY section below
- IF 3: Execute OPTION 3 (Skip) below - IF S: Execute SKIP section below
### EXECUTION RULES: ### EXECUTION RULES:
@ -46,7 +46,7 @@ Display:
--- ---
## OPTION 1: WALK THROUGH ## WALK THROUGH [W]
For each finding in order: For each finding in order:
@ -61,7 +61,7 @@ After all findings processed, summarize what was fixed/skipped.
--- ---
## OPTION 2: AUTO-FIX ## FIX AUTOMATICALLY [F]
1. Filter findings to only those classified as "real" 1. Filter findings to only those classified as "real"
2. Apply fixes for each real finding 2. Apply fixes for each real finding
@ -78,7 +78,7 @@ Skipped (noise/uncertain): F2, F4
--- ---
## OPTION 3: SKIP ## SKIP [S]
1. Acknowledge all findings were reviewed 1. Acknowledge all findings were reviewed
2. Note that user chose to proceed without fixes 2. Note that user chose to proceed without fixes

View File

@ -43,14 +43,14 @@ wipFile: '{implementation_artifacts}/tech-spec-wip.md'
**Present review menu:** **Present review menu:**
Display: "**Select:** [Y] Approve [C] Changes [Q] Questions [A] Advanced Elicitation [P] Party Mode" Display: "**Select:** [C] Continue [E] Edit [Q] Questions [A] Advanced Elicitation [P] Party Mode"
**HALT and wait for user selection.** **HALT and wait for user selection.**
#### Menu Handling Logic: #### Menu Handling Logic:
- IF Y: Proceed to Section 3 (Finalize the Spec) - IF C: Proceed to Section 3 (Finalize the Spec)
- IF C: Proceed to Section 2 (Handle Review Feedback), then return here and redisplay menu - IF E: Proceed to Section 2 (Handle Review Feedback), then return here and redisplay menu
- IF Q: Answer questions, then redisplay this menu - IF Q: Answer questions, then redisplay this menu
- IF A: Read fully and follow: `{advanced_elicitation}` with current spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu - IF A: Read fully and follow: `{advanced_elicitation}` with current spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
- IF P: Read fully and follow: `{party_mode_exec}` with current spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu - IF P: Read fully and follow: `{party_mode_exec}` with current spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
@ -59,7 +59,7 @@ Display: "**Select:** [Y] Approve [C] Changes [Q] Questions [A] Advanced Elicita
#### EXECUTION RULES: #### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu - ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to finalize when user selects 'Y' - ONLY proceed to finalize when user selects 'C'
- After other menu items execution, return to this menu - After other menu items execution, return to this menu
### 2. Handle Review Feedback ### 2. Handle Review Feedback

View File

@ -9,7 +9,10 @@ const ui = new UI();
module.exports = { module.exports = {
command: 'install', command: 'install',
description: 'Install BMAD Core agents and tools', description: 'Install BMAD Core agents and tools',
options: [['-d, --debug', 'Enable debug output for manifest generation']], options: [
['-d, --debug', 'Enable debug output for manifest generation'],
['-D, --directory <path>', 'Target project directory (skips interactive prompt)'],
],
action: async (options) => { action: async (options) => {
try { try {
// Set debug flag as environment variable for all components // Set debug flag as environment variable for all components
@ -18,7 +21,7 @@ module.exports = {
console.log(chalk.cyan('Debug mode enabled\n')); console.log(chalk.cyan('Debug mode enabled\n'));
} }
const config = await ui.promptInstall(); const config = await ui.promptInstall(options);
// Handle cancel // Handle cancel
if (config.actionType === 'cancel') { if (config.actionType === 'cancel') {

View File

@ -26,9 +26,10 @@ const choiceUtils = { Separator };
class UI { class UI {
/** /**
* Prompt for installation configuration * Prompt for installation configuration
* @param {Object} options - CLI options object (may contain directory property)
* @returns {Object} Installation configuration * @returns {Object} Installation configuration
*/ */
async promptInstall() { async promptInstall(options = {}) {
CLIUtils.displayLogo(); CLIUtils.displayLogo();
// Display version-specific start message from install-messages.yaml // Display version-specific start message from install-messages.yaml
@ -36,7 +37,7 @@ class UI {
const messageLoader = new MessageLoader(); const messageLoader = new MessageLoader();
messageLoader.displayStartMessage(); messageLoader.displayStartMessage();
const confirmedDirectory = await this.getConfirmedDirectory(); const confirmedDirectory = await this.getConfirmedDirectory(options);
// Preflight: Check for legacy BMAD v4 footprints immediately after getting directory // Preflight: Check for legacy BMAD v4 footprints immediately after getting directory
const { Detector } = require('../installers/lib/core/detector'); const { Detector } = require('../installers/lib/core/detector');
@ -506,9 +507,23 @@ class UI {
/** /**
* Get confirmed directory from user * Get confirmed directory from user
* @param {Object} options - CLI options object (may contain directory property)
* @returns {string} Confirmed directory path * @returns {string} Confirmed directory path
*/ */
async getConfirmedDirectory() { async getConfirmedDirectory(options = {}) {
// If directory provided via CLI, validate and return it
if (options.directory) {
const expandedPath = this.expandUserPath(options.directory);
const validationError = this.validateDirectorySync(expandedPath);
if (validationError) {
throw new Error(`Invalid directory: ${validationError}`);
}
await this.displayDirectoryInfo(expandedPath);
// Skip confirmation for CLI-provided directories
return expandedPath;
}
// Existing interactive prompt logic
let confirmedDirectory = null; let confirmedDirectory = null;
while (!confirmedDirectory) { while (!confirmedDirectory) {
const directoryAnswer = await this.promptForDirectory(); const directoryAnswer = await this.promptForDirectory();