Compare commits

..

3 Commits

Author SHA1 Message Date
Brian a74ad5df1d
Merge 9799d10123 into 397b2a5c87 2026-06-09 10:35:14 +07:00
Aristo Rinjuang 397b2a5c87
feat: add CodeWhale as supported installer platform (#2459)
CodeWhale uses .codewhale/skills/ (project) and
~/.codewhale/skills/ (global) for skill directories,
matching the existing config-driven installer pattern.

- platform-codes.yaml: codewhale entry after codex
- test: Test 12b validates install target and setup
2026-06-08 22:29:35 -05:00
Oneby Wang 072d0a7458
fix(skills): renumber retrospective workflow steps (#2448)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-06-06 20:37:51 -05:00
4 changed files with 57 additions and 15 deletions

View File

@ -225,12 +225,12 @@ Amelia (Developer): "Perfect. Epic {{epic_number}} is complete and ready for ret
</step> </step>
<step n="0.5" goal="Discover and load project documents"> <step n="2" goal="Discover and load project documents">
<action>Load input files according to the Input Files table above. For SELECTIVE_LOAD inputs, load only the epic matching {{epic_number}}. For FULL_LOAD inputs, load the complete document. For INDEX_GUIDED inputs, check the index first and load relevant sections. After discovery, these content variables are available: {epics_content} (selective load for this epic), {architecture_content}, {prd_content}, {document_project_content}</action> <action>Load input files according to the Input Files table above. For SELECTIVE_LOAD inputs, load only the epic matching {{epic_number}}. For FULL_LOAD inputs, load the complete document. For INDEX_GUIDED inputs, check the index first and load relevant sections. After discovery, these content variables are available: {epics_content} (selective load for this epic), {architecture_content}, {prd_content}, {document_project_content}</action>
<note>After discovery, these content variables are available: {epics_content} (selective load for this epic), {architecture_content}, {prd_content}, {document_project_content}</note> <note>After discovery, these content variables are available: {epics_content} (selective load for this epic), {architecture_content}, {prd_content}, {document_project_content}</note>
</step> </step>
<step n="2" goal="Deep Story Analysis - Extract Lessons from Implementation"> <step n="3" goal="Deep Story Analysis - Extract Lessons from Implementation">
<output> <output>
Amelia (Developer): "Before we start the team discussion, let me review all the story records to surface key themes. This'll help us have a richer conversation." Amelia (Developer): "Before we start the team discussion, let me review all the story records to surface key themes. This'll help us have a richer conversation."
@ -324,7 +324,7 @@ Amelia (Developer): "We'll get to all of it. But first, let me load the previous
</step> </step>
<step n="3" goal="Load and Integrate Previous Epic Retrospective"> <step n="4" goal="Load and Integrate Previous Epic Retrospective">
<action>Calculate previous epic number: {{prev_epic_num}} = {{epic_number}} - 1</action> <action>Calculate previous epic number: {{prev_epic_num}} = {{epic_number}} - 1</action>
@ -420,7 +420,7 @@ Charlie (Senior Dev): "First epic, first retro. Let's make it count."
</step> </step>
<step n="4" goal="Preview Next Epic with Change Detection"> <step n="5" goal="Preview Next Epic with Change Detection">
<action>Calculate next epic number: {{next_epic_num}} = {{epic_number}} + 1</action> <action>Calculate next epic number: {{next_epic_num}} = {{epic_number}} + 1</action>
@ -509,7 +509,7 @@ Amelia (Developer): "No problem. We'll still do a thorough retro on Epic {{epic_
</step> </step>
<step n="5" goal="Initialize Retrospective with Rich Context"> <step n="6" goal="Initialize Retrospective with Rich Context">
<action>Load agent roster from {agent_roster}</action> <action>Load agent roster from {agent_roster}</action>
<action>Identify which agents participated in Epic {{epic_number}} based on story records</action> <action>Identify which agents participated in Epic {{epic_number}} based on story records</action>
@ -599,7 +599,7 @@ Amelia (Developer): "Exactly. {user_name}, any questions before we dive in?"
</step> </step>
<step n="6" goal="Epic Review Discussion - What Went Well, What Didn't"> <step n="7" goal="Epic Review Discussion - What Went Well, What Didn't">
<output> <output>
Amelia (Developer): "Let's start with the good stuff. What went well in Epic {{epic_number}}?" Amelia (Developer): "Let's start with the good stuff. What went well in Epic {{epic_number}}?"
@ -673,7 +673,7 @@ Alice (Product Owner): "I appreciate that. I could've been more proactive about
Amelia (Developer): "This is good. We're identifying systemic improvements, not assigning blame." Amelia (Developer): "This is good. We're identifying systemic improvements, not assigning blame."
</output> </output>
<action>Continue the discussion, weaving in patterns discovered from the deep story analysis (Step 2)</action> <action>Continue the discussion, weaving in patterns discovered from the deep story analysis (Step 3)</action>
<output> <output>
Amelia (Developer): "Speaking of patterns, I noticed something when reviewing all the story records..." Amelia (Developer): "Speaking of patterns, I noticed something when reviewing all the story records..."
@ -744,13 +744,13 @@ Amelia (Developer): "Does that capture it? Anyone have something important we mi
</step> </step>
<step n="7" goal="Next Epic Preparation Discussion - Interactive and Collaborative"> <step n="8" goal="Next Epic Preparation Discussion - Interactive and Collaborative">
<check if="{{next_epic_exists}} == false"> <check if="{{next_epic_exists}} == false">
<output> <output>
Amelia (Developer): "Normally we'd discuss preparing for the next epic, but since Epic {{next_epic_num}} isn't defined yet, let's skip to action items." Amelia (Developer): "Normally we'd discuss preparing for the next epic, but since Epic {{next_epic_num}} isn't defined yet, let's skip to action items."
</output> </output>
<action>Skip to Step 8</action> <action>Skip to Step 9</action>
</check> </check>
<output> <output>
@ -868,7 +868,7 @@ Amelia (Developer): "{user_name}, does this preparation plan work for you?"
</step> </step>
<step n="8" goal="Synthesize Action Items with Significant Change Detection"> <step n="9" goal="Synthesize Action Items with Significant Change Detection">
<output> <output>
Amelia (Developer): "Let's capture concrete action items from everything we've discussed." Amelia (Developer): "Let's capture concrete action items from everything we've discussed."
@ -1109,7 +1109,7 @@ Amelia (Developer): "Everyone clear on what they own?"
</step> </step>
<step n="9" goal="Critical Readiness Exploration - Interactive Deep Dive"> <step n="10" goal="Critical Readiness Exploration - Interactive Deep Dive">
<output> <output>
Amelia (Developer): "Before we close, I want to do a final readiness check." Amelia (Developer): "Before we close, I want to do a final readiness check."
@ -1292,7 +1292,7 @@ Charlie (Senior Dev): "Better to catch this now than three stories into the next
</step> </step>
<step n="10" goal="Retrospective Closure with Celebration and Commitment"> <step n="11" goal="Retrospective Closure with Celebration and Commitment">
<output> <output>
Amelia (Developer): "We've covered a lot of ground today. Let me bring this retrospective to a close." Amelia (Developer): "We've covered a lot of ground today. Let me bring this retrospective to a close."
@ -1368,7 +1368,7 @@ Amelia (Developer): "See you all when prep work is done. Meeting adjourned!"
</step> </step>
<step n="11" goal="Save Retrospective and Update Sprint Status"> <step n="12" goal="Save Retrospective and Update Sprint Status">
<action>Ensure retrospectives folder exists: {implementation_artifacts}</action> <action>Ensure retrospectives folder exists: {implementation_artifacts}</action>
<action>Create folder if it doesn't exist</action> <action>Create folder if it doesn't exist</action>
@ -1425,7 +1425,7 @@ Retrospective document was saved successfully, but {sprint_status_file} may need
</step> </step>
<step n="12" goal="Final Summary and Handoff"> <step n="13" goal="Final Summary and Handoff">
<output> <output>
**✅ Retrospective Complete, {user_name}!** **✅ Retrospective Complete, {user_name}!**

View File

@ -34,7 +34,7 @@ persistent_facts = [
"file:{project-root}/**/project-context.md", "file:{project-root}/**/project-context.md",
] ]
# Scalar: executed when the workflow reaches Step 12 (Final Summary and Handoff), # Scalar: executed when the workflow reaches Step 13 (Final Summary and Handoff),
# after the retrospective document is saved and sprint-status is updated. Override wins. # after the retrospective document is saved and sprint-status is updated. Override wins.
# Leave empty for no custom post-completion behavior. # Leave empty for no custom post-completion behavior.

View File

@ -446,6 +446,41 @@ async function runTests() {
// Test 12: Removed — ancestor conflict check no longer applies (no IDE inherits skills from parent dirs) // Test 12: Removed — ancestor conflict check no longer applies (no IDE inherits skills from parent dirs)
// ============================================================
// Test 12b: CodeWhale Native Skills Install
// ============================================================
console.log(`${colors.yellow}Test Suite 12b: CodeWhale Native Skills${colors.reset}\n`);
try {
clearCache();
const platformCodes12b = await loadPlatformCodes();
const codewhaleInstaller = platformCodes12b.platforms.codewhale?.installer;
assert(codewhaleInstaller?.target_dir === '.codewhale/skills', 'CodeWhale target_dir uses native skills path');
const tempProjectDir12b = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-codewhale-test-'));
const installedBmadDir12b = await createTestBmadFixture();
const ideManager12b = new IdeManager();
await ideManager12b.ensureInitialized();
const result12b = await ideManager12b.setup('codewhale', tempProjectDir12b, installedBmadDir12b, {
silent: true,
selectedModules: ['bmm'],
});
assert(result12b.success === true, 'CodeWhale setup succeeds against temp project');
const skillFile12b = path.join(tempProjectDir12b, '.codewhale', 'skills', 'bmad-master', 'SKILL.md');
assert(await fs.pathExists(skillFile12b), 'CodeWhale install writes SKILL.md directory output');
await fs.remove(tempProjectDir12b);
await fs.remove(path.dirname(installedBmadDir12b));
} catch (error) {
assert(false, 'CodeWhale native skills migration test succeeds', error.message);
}
console.log('');
// ============================================================ // ============================================================
// Test 13: Cursor Native Skills Install // Test 13: Cursor Native Skills Install
// ============================================================ // ============================================================

View File

@ -70,6 +70,13 @@ platforms:
target_dir: .agents/skills target_dir: .agents/skills
global_target_dir: ~/.codex/skills global_target_dir: ~/.codex/skills
codewhale:
name: "CodeWhale"
preferred: false
installer:
target_dir: .codewhale/skills
global_target_dir: ~/.codewhale/skills
codebuddy: codebuddy:
name: "CodeBuddy" name: "CodeBuddy"
preferred: false preferred: false