diff --git a/src/bmm-skills/module-help.csv b/src/bmm-skills/module-help.csv index 816061e90..8b824795f 100644 --- a/src/bmm-skills/module-help.csv +++ b/src/bmm-skills/module-help.csv @@ -1,4 +1,5 @@ module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs +BMad Method,_meta,,,,,,,,,false,https://docs.bmad-method.org/llms.txt, BMad Method,bmad-document-project,Document Project,DP,Analyze an existing project to produce useful documentation.,,anytime,,,false,project-knowledge,* BMad Method,bmad-generate-project-context,Generate Project Context,GPC,Scan existing codebase to generate a lean LLM-optimized project-context.md. Essential for brownfield projects.,,anytime,,,false,output_folder,project context BMad Method,bmad-quick-dev,Quick Dev,QQ,Unified intent-in code-out workflow: clarify plan implement review and present.,,anytime,,,false,implementation_artifacts,spec and project implementation diff --git a/src/core-skills/bmad-help/SKILL.md b/src/core-skills/bmad-help/SKILL.md index cecb50fae..25f91a5ce 100644 --- a/src/core-skills/bmad-help/SKILL.md +++ b/src/core-skills/bmad-help/SKILL.md @@ -65,6 +65,21 @@ For each recommended item, present: **Ordering**: Show optional items first, then the next required item. Make it clear which is which. +## General Questions via llms.txt + +When a user's question does not match any specific skill in the catalog, check for `_meta` rows. These rows have `_meta` in the `skill` column (or `phase` column in the merged CSV) and carry a module's documentation URL in `output-location`. + +**Detection**: Scan the catalog for rows where the second column equals `_meta`. Extract the URL from the `output-location` column. + +**When to use**: If the user asks a general question about BMad or a specific module (e.g., "what phases does BMad have?", "how does the workflow map work?", "what is party mode?") and no single skill is the clear answer, fetch the module's llms.txt URL and use it to ground your response. + +**Behavior**: +1. Identify which module(s) the question relates to. If ambiguous, prefer the active module or ask. +2. Fetch the llms.txt URL for that module using WebFetch or equivalent. +3. Use the fetched content to answer the user's question accurately. If the llms.txt is an index with links to deeper content, follow the most relevant link(s) to find the answer. +4. Cite the source naturally (e.g., "According to the BMad Method docs..."). +5. If no `_meta` row exists for the relevant module, fall back to your existing knowledge of that module. + ## Constraints - Present all output in `{communication_language}` diff --git a/src/core-skills/module-help.csv b/src/core-skills/module-help.csv index 4a70c1bad..efa081372 100644 --- a/src/core-skills/module-help.csv +++ b/src/core-skills/module-help.csv @@ -1,4 +1,5 @@ module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs +Core,_meta,,,,,,,,,false,https://docs.bmad-method.org/llms.txt, Core,bmad-brainstorming,Brainstorming,BSP,Use early in ideation or when stuck generating ideas.,,anytime,,,false,{output_folder}/brainstorming,brainstorming session Core,bmad-party-mode,Party Mode,PM,Orchestrate multi-agent discussions when you need multiple perspectives or want agents to collaborate.,,anytime,,,false,, Core,bmad-help,BMad Help,BH,,,anytime,,,false,, diff --git a/tools/installer/core/installer.js b/tools/installer/core/installer.js index 60245ce1d..24a86c3e7 100644 --- a/tools/installer/core/installer.js +++ b/tools/installer/core/installer.js @@ -969,6 +969,14 @@ class Installer { outputs, ] = columns; + // Pass through _meta rows as-is (module metadata, not a skill) + if (phase === '_meta') { + const finalModule = (!module || module.trim() === '') && moduleName !== 'core' ? moduleName : module || ''; + const metaRow = [finalModule, '_meta', '', '', '', '', '', 'false', '', '', '', '', '', '', outputLocation || '', '']; + allRows.push(metaRow.map((c) => this.escapeCSVField(c)).join(',')); + continue; + } + // If module column is empty, set it to this module's name (except for core which stays empty for universal tools) const finalModule = (!module || module.trim() === '') && moduleName !== 'core' ? moduleName : module || '';