fix: use module-specific config.yaml paths in GitHub Copilot installer
Replace hardcoded bmm/config.yaml references with dynamic module-based paths so custom modules load their own config.yaml instead of the non-existent bmm config. - createWorkflowPromptContent(): use entry.module from bmad-help.csv - createAgentActivatorPromptContent(): use artifact.module - createTechWriterPromptContent(): use entry.module for config and agent paths - generateCopilotInstructions(): dynamically list installed module paths Fixes #1708
This commit is contained in:
parent
3dd37bc94d
commit
c017a5fdba
|
|
@ -248,9 +248,9 @@ You must fully embody this agent's persona and follow all activation instruction
|
||||||
*/
|
*/
|
||||||
createWorkflowPromptContent(entry, workflowFile, toolsStr) {
|
createWorkflowPromptContent(entry, workflowFile, toolsStr) {
|
||||||
const description = this.escapeYamlSingleQuote(this.createPromptDescription(entry.name));
|
const description = this.escapeYamlSingleQuote(this.createPromptDescription(entry.name));
|
||||||
// bmm/config.yaml is safe to hardcode here: these prompts are only generated when
|
// Use the module from the bmad-help.csv entry to reference the correct config.yaml
|
||||||
// bmad-help.csv exists (bmm module data), so bmm is guaranteed to be installed.
|
const configModule = entry.module || 'core';
|
||||||
const configLine = `1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables`;
|
const configLine = `1. Load {project-root}/${this.bmadFolderName}/${configModule}/config.yaml and store ALL fields as session variables`;
|
||||||
|
|
||||||
let body;
|
let body;
|
||||||
if (workflowFile.endsWith('.yaml')) {
|
if (workflowFile.endsWith('.yaml')) {
|
||||||
|
|
@ -345,14 +345,16 @@ ${body}
|
||||||
const safeDescription = this.escapeYamlSingleQuote(cmd.description);
|
const safeDescription = this.escapeYamlSingleQuote(cmd.description);
|
||||||
const toolsStr = this.getToolsForFile(`${cmd.file}.prompt.md`);
|
const toolsStr = this.getToolsForFile(`${cmd.file}.prompt.md`);
|
||||||
|
|
||||||
|
// Use the module from the bmad-help.csv entry to reference the correct paths
|
||||||
|
const configModule = entry.module || 'core';
|
||||||
const content = `---
|
const content = `---
|
||||||
description: '${safeDescription}'
|
description: '${safeDescription}'
|
||||||
agent: 'agent'
|
agent: 'agent'
|
||||||
tools: ${toolsStr}
|
tools: ${toolsStr}
|
||||||
---
|
---
|
||||||
|
|
||||||
1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables
|
1. Load {project-root}/${this.bmadFolderName}/${configModule}/config.yaml and store ALL fields as session variables
|
||||||
2. Load the full agent file from {project-root}/${this.bmadFolderName}/bmm/agents/tech-writer/tech-writer.md and activate the Paige (Technical Writer) persona
|
2. Load the full agent file from {project-root}/${this.bmadFolderName}/${configModule}/agents/tech-writer/tech-writer.md and activate the Paige (Technical Writer) persona
|
||||||
3. Execute the ${entry.name} menu command (${cmd.code})
|
3. Execute the ${entry.name} menu command (${cmd.code})
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
@ -377,15 +379,15 @@ tools: ${toolsStr}
|
||||||
const agentPath = artifact.agentPath || artifact.relativePath;
|
const agentPath = artifact.agentPath || artifact.relativePath;
|
||||||
const agentFilePath = `{project-root}/${this.bmadFolderName}/${agentPath}`;
|
const agentFilePath = `{project-root}/${this.bmadFolderName}/${agentPath}`;
|
||||||
|
|
||||||
// bmm/config.yaml is safe to hardcode: agent activators are only generated from
|
// Use the agent's module to reference the correct config.yaml
|
||||||
// bmm agent artifacts, so bmm is guaranteed to be installed.
|
const configModule = artifact.module || 'core';
|
||||||
return `---
|
return `---
|
||||||
description: '${safeDescription}'
|
description: '${safeDescription}'
|
||||||
agent: 'agent'
|
agent: 'agent'
|
||||||
tools: ${toolsStr}
|
tools: ${toolsStr}
|
||||||
---
|
---
|
||||||
|
|
||||||
1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables
|
1. Load {project-root}/${this.bmadFolderName}/${configModule}/config.yaml and store ALL fields as session variables
|
||||||
2. Load the full agent file from ${agentFilePath}
|
2. Load the full agent file from ${agentFilePath}
|
||||||
3. Follow ALL activation instructions in the agent file
|
3. Follow ALL activation instructions in the agent file
|
||||||
4. Display the welcome/greeting as instructed
|
4. Display the welcome/greeting as instructed
|
||||||
|
|
@ -403,6 +405,12 @@ tools: ${toolsStr}
|
||||||
async generateCopilotInstructions(projectDir, bmadDir, agentManifest, options = {}) {
|
async generateCopilotInstructions(projectDir, bmadDir, agentManifest, options = {}) {
|
||||||
const configVars = await this.loadModuleConfig(bmadDir);
|
const configVars = await this.loadModuleConfig(bmadDir);
|
||||||
|
|
||||||
|
// Determine installed modules (excluding internal directories)
|
||||||
|
const selectedModules = options.selectedModules || [];
|
||||||
|
const installedModules = selectedModules.length > 0 ? selectedModules : ['core'];
|
||||||
|
// Filter to only non-core modules for display (core is always listed separately)
|
||||||
|
const nonCoreModules = installedModules.filter((m) => m !== 'core');
|
||||||
|
|
||||||
// Build the agents table from the manifest
|
// Build the agents table from the manifest
|
||||||
let agentsTable = '| Agent | Persona | Title | Capabilities |\n|---|---|---|---|\n';
|
let agentsTable = '| Agent | Persona | Title | Capabilities |\n|---|---|---|---|\n';
|
||||||
const agentOrder = [
|
const agentOrder = [
|
||||||
|
|
@ -428,6 +436,39 @@ tools: ${toolsStr}
|
||||||
}
|
}
|
||||||
|
|
||||||
const bmad = this.bmadFolderName;
|
const bmad = this.bmadFolderName;
|
||||||
|
|
||||||
|
// Build dynamic module paths based on installed modules
|
||||||
|
const moduleAgentPaths = nonCoreModules.map((m) => `\`${bmad}/${m}/agents/\``).join(', ');
|
||||||
|
const moduleWorkflowPaths = nonCoreModules.map((m) => `\`${bmad}/${m}/workflows/\``).join(', ');
|
||||||
|
const moduleConfigPaths = nonCoreModules.map((m) => `\`${bmad}/${m}/config.yaml\``).join(', ');
|
||||||
|
|
||||||
|
// Build agent definitions line
|
||||||
|
let agentDefsLine;
|
||||||
|
if (nonCoreModules.length > 0) {
|
||||||
|
agentDefsLine = `- **Agent definitions**: ${moduleAgentPaths} and \`${bmad}/core/agents/\` (core)`;
|
||||||
|
} else {
|
||||||
|
agentDefsLine = `- **Agent definitions**: \`${bmad}/core/agents/\``;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build workflow definitions line
|
||||||
|
let workflowDefsLine;
|
||||||
|
if (nonCoreModules.length > 0) {
|
||||||
|
workflowDefsLine = `- **Workflow definitions**: ${moduleWorkflowPaths} (organized by phase)`;
|
||||||
|
} else {
|
||||||
|
workflowDefsLine = `- **Workflow definitions**: \`${bmad}/core/workflows/\``;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build module configuration line
|
||||||
|
let moduleConfigLine;
|
||||||
|
if (nonCoreModules.length > 0) {
|
||||||
|
moduleConfigLine = `- **Module configuration**: ${moduleConfigPaths}`;
|
||||||
|
} else {
|
||||||
|
moduleConfigLine = `- **Module configuration**: (no non-core modules installed)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine primary module for config loading instruction
|
||||||
|
const primaryModule = nonCoreModules.length > 0 ? nonCoreModules[0] : 'core';
|
||||||
|
|
||||||
const bmadSection = `# BMAD Method — Project Instructions
|
const bmadSection = `# BMAD Method — Project Instructions
|
||||||
|
|
||||||
## Project Configuration
|
## Project Configuration
|
||||||
|
|
@ -444,12 +485,12 @@ tools: ${toolsStr}
|
||||||
|
|
||||||
## BMAD Runtime Structure
|
## BMAD Runtime Structure
|
||||||
|
|
||||||
- **Agent definitions**: \`${bmad}/bmm/agents/\` (BMM module) and \`${bmad}/core/agents/\` (core)
|
${agentDefsLine}
|
||||||
- **Workflow definitions**: \`${bmad}/bmm/workflows/\` (organized by phase)
|
${workflowDefsLine}
|
||||||
- **Core tasks**: \`${bmad}/core/tasks/\` (help, editorial review, indexing, sharding, adversarial review)
|
- **Core tasks**: \`${bmad}/core/tasks/\` (help, editorial review, indexing, sharding, adversarial review)
|
||||||
- **Core workflows**: \`${bmad}/core/workflows/\` (brainstorming, party-mode, advanced-elicitation)
|
- **Core workflows**: \`${bmad}/core/workflows/\` (brainstorming, party-mode, advanced-elicitation)
|
||||||
- **Workflow engine**: \`${bmad}/core/tasks/workflow.xml\` (executes YAML-based workflows)
|
- **Workflow engine**: \`${bmad}/core/tasks/workflow.xml\` (executes YAML-based workflows)
|
||||||
- **Module configuration**: \`${bmad}/bmm/config.yaml\`
|
${moduleConfigLine}
|
||||||
- **Core configuration**: \`${bmad}/core/config.yaml\`
|
- **Core configuration**: \`${bmad}/core/config.yaml\`
|
||||||
- **Agent manifest**: \`${bmad}/_config/agent-manifest.csv\`
|
- **Agent manifest**: \`${bmad}/_config/agent-manifest.csv\`
|
||||||
- **Workflow manifest**: \`${bmad}/_config/workflow-manifest.csv\`
|
- **Workflow manifest**: \`${bmad}/_config/workflow-manifest.csv\`
|
||||||
|
|
@ -458,7 +499,7 @@ tools: ${toolsStr}
|
||||||
|
|
||||||
## Key Conventions
|
## Key Conventions
|
||||||
|
|
||||||
- Always load \`${bmad}/bmm/config.yaml\` before any agent activation or workflow execution
|
- Always load the agent/workflow's module \`config.yaml\` before activation or execution (each prompt file specifies which config to load)
|
||||||
- Store all config fields as session variables: \`{user_name}\`, \`{communication_language}\`, \`{output_folder}\`, \`{planning_artifacts}\`, \`{implementation_artifacts}\`, \`{project_knowledge}\`
|
- Store all config fields as session variables: \`{user_name}\`, \`{communication_language}\`, \`{output_folder}\`, \`{planning_artifacts}\`, \`{implementation_artifacts}\`, \`{project_knowledge}\`
|
||||||
- MD-based workflows execute directly — load and follow the \`.md\` file
|
- MD-based workflows execute directly — load and follow the \`.md\` file
|
||||||
- YAML-based workflows require the workflow engine — load \`workflow.xml\` first, then pass the \`.yaml\` config
|
- YAML-based workflows require the workflow engine — load \`workflow.xml\` first, then pass the \`.yaml\` config
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue