diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dc3193b8..7e05880ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.3.4 (unreleased) + +### Fixes +- **Pitch deck question removed from installer** - The "start with pitch or Product Brief?" prompt was a config-time decision that should be runtime. Removed from installer; Saga now asks at activation when relevant. Supports monorepo workflows where multiple products have different starting points. +- **Skills file format** - Skills were installed to `.claude/skills/wds/saga.md` but Claude Code expects `.claude/skills/{name}/SKILL.md`. Fixed paths to `.claude/skills/saga/SKILL.md` and `.claude/skills/freya/SKILL.md`. +- **Learning material location** - `_wds-learn/` moved from project root into `_bmad/wds/learn/` to reduce root-level noise, especially in monorepos. + ## 0.3.0 (2026-03-01) ### Breaking Changes diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 000000000..299cf4a26 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,15 @@ +# WDS Roadmap + +## 0.3.4 — Installer Fixes + +- [x] Remove pitch deck question from installer (runtime Saga prompt instead) +- [x] Fix skills path to `.claude/skills/{name}/SKILL.md` +- [x] Move `_wds-learn/` into `_bmad/wds/learn/` + +## 0.4.0 — Agent Space + +Active development on `feature/design-space-agent-messaging`. + +- Agent Space (formerly Design Space) — shared semantic knowledge database with agent messaging +- Headless Excalidraw export — local Node script in `tools/` using `@excalidraw/utils` to render `.excalidraw` JSON to PNG. Agent uses it for wireframe previews during Design Loop iteration. Approval gate unchanged — user still exports manually to approve. +- Details TBD as feature branch stabilizes diff --git a/tools/cli/installers/lib/ide/claude-code.js b/tools/cli/installers/lib/ide/claude-code.js index 43641ef5f..ae10409c5 100644 --- a/tools/cli/installers/lib/ide/claude-code.js +++ b/tools/cli/installers/lib/ide/claude-code.js @@ -8,7 +8,7 @@ const chalk = require('chalk'); class ClaudeCodeSetup extends BaseIdeSetup { constructor() { super('claude-code', 'Claude Code', true); // preferred IDE - this.configDir = '.claude/skills/wds'; + this.configDir = '.claude/skills'; } /** @@ -18,10 +18,6 @@ class ClaudeCodeSetup extends BaseIdeSetup { * @param {Object} options - Setup options */ async setup(projectDir, wdsDir, options = {}) { - // Create .claude/skills/wds directory - const targetDir = path.join(projectDir, this.configDir); - await this.ensureDir(targetDir); - // Get all WDS agents const agents = await this.getAgents(wdsDir); @@ -29,7 +25,8 @@ class ClaudeCodeSetup extends BaseIdeSetup { throw new Error('No agents found in WDS installation'); } - // Create launcher file for each agent + // Create launcher file for each agent in .claude/skills/{slug}/SKILL.md + const skillsDir = path.join(projectDir, this.configDir); let agentCount = 0; for (const agent of agents) { // Create launcher content that references the compiled agent @@ -38,8 +35,10 @@ class ClaudeCodeSetup extends BaseIdeSetup { // Add Claude Code-specific YAML frontmatter const content = this.processContent(launcher, agent.metadata); - // Write launcher file - const filePath = path.join(targetDir, `${agent.slug}.md`); + // Write launcher file as .claude/skills/{slug}/SKILL.md + const agentDir = path.join(skillsDir, agent.slug); + await this.ensureDir(agentDir); + const filePath = path.join(agentDir, 'SKILL.md'); await this.writeFile(filePath, content); agentCount++; } @@ -84,11 +83,20 @@ description: ${description} * @param {string} projectDir - Project directory */ async cleanup(projectDir) { - const wdsPath = path.join(projectDir, this.configDir); + // Remove per-agent skill directories + const agents = ['saga', 'freya']; + for (const slug of agents) { + const skillPath = path.join(projectDir, this.configDir, slug); + if (await this.exists(skillPath)) { + await this.remove(skillPath); + } + } - if (await this.exists(wdsPath)) { - await this.remove(wdsPath); - console.log(chalk.dim(`Removed Claude Code WDS configuration`)); + // Also clean up legacy .claude/skills/wds/ if present + const legacyPath = path.join(projectDir, '.claude/skills/wds'); + if (await this.exists(legacyPath)) { + await this.remove(legacyPath); + console.log(chalk.dim(`Removed legacy Claude Code WDS configuration`)); } } diff --git a/tools/cli/lib/installer.js b/tools/cli/lib/installer.js index 4bcf4fd56..4a636491f 100644 --- a/tools/cli/lib/installer.js +++ b/tools/cli/lib/installer.js @@ -166,7 +166,7 @@ class Installer { const learnSpinner = ora('Copying learning & reference material...').start(); try { await this.copyLearningMaterial(projectDir); - learnSpinner.succeed('Learning material added to _wds-learn/ (safe to remove when no longer needed)'); + learnSpinner.succeed('Learning material added to _bmad/wds/learn/ (safe to remove when no longer needed)'); } catch (error) { learnSpinner.fail('Failed to copy learning material'); throw error; @@ -225,7 +225,6 @@ class Installer { const configData = { user_name: getUserName(), project_name: config.project_name || 'Untitled Project', - starting_point: config.starting_point || 'brief', communication_language: 'en', document_output_language: 'en', output_folder: config.root_folder || 'design-process', @@ -260,7 +259,7 @@ class Installer { * Users can safely delete this folder without affecting agents or workflows. */ async copyLearningMaterial(projectDir) { - const learnDir = path.join(projectDir, '_wds-learn'); + const learnDir = path.join(projectDir, '_bmad/wds/learn'); const learningDirs = ['getting-started', 'learn', 'method', 'models', 'tools']; const excludeDirs = new Set(['course-explainers', 'Webinars']); diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index f8448dbbf..458095027 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -140,16 +140,6 @@ class UI { message: 'Output folder name:', default: 'design-process', }, - { - type: 'list', - name: 'starting_point', - message: 'Do you need to create a pitch deck & project contract before starting the project?', - choices: [ - { name: 'No, start directly with the Product Brief', value: 'brief' }, - { name: 'Yes, start with a project pitch', value: 'pitch' }, - ], - default: 'brief', - }, { type: 'checkbox', name: 'ides',